From 100d92cd1648d49541b182d19dfd046450e9e13c Mon Sep 17 00:00:00 2001 From: Tianyu Chen Date: Wed, 18 Dec 2024 18:07:51 +0800 Subject: [PATCH] Update python3.12 to 3.12.8 --- .pre-commit-config.yaml | 14 +- .readthedocs.yml | 5 +- Doc/.ruff.toml | 42 + Doc/Makefile | 124 +- Doc/README.rst | 25 +- Doc/c-api/allocation.rst | 6 +- Doc/c-api/arg.rst | 8 +- Doc/c-api/buffer.rst | 9 +- Doc/c-api/bytearray.rst | 9 +- Doc/c-api/cell.rst | 9 +- Doc/c-api/code.rst | 4 +- Doc/c-api/complex.rst | 24 +- Doc/c-api/datetime.rst | 4 +- Doc/c-api/exceptions.rst | 4 +- Doc/c-api/file.rst | 5 +- Doc/c-api/float.rst | 10 +- Doc/c-api/import.rst | 28 +- Doc/c-api/init.rst | 21 +- Doc/c-api/init_config.rst | 6 +- Doc/c-api/long.rst | 16 + Doc/c-api/marshal.rst | 2 +- Doc/c-api/module.rst | 66 +- Doc/c-api/number.rst | 8 +- Doc/c-api/object.rst | 27 +- Doc/c-api/refcounting.rst | 4 +- Doc/c-api/slice.rst | 8 +- Doc/c-api/stable.rst | 14 +- Doc/c-api/tuple.rst | 27 +- Doc/c-api/type.rst | 47 +- Doc/c-api/typeobj.rst | 56 +- Doc/c-api/unicode.rst | 41 +- Doc/conf.py | 198 +- Doc/constraints.txt | 24 +- Doc/contents.rst | 1 + Doc/data/python3.12.abi | 50190 ++++++++-------- Doc/data/refcounts.dat | 40 +- Doc/data/stable_abi.dat | 1664 +- .../c-api-pending-removal-in-3.14.rst | 72 + .../c-api-pending-removal-in-3.15.rst | 27 + .../c-api-pending-removal-in-future.rst | 51 + Doc/deprecations/index.rst | 21 + Doc/deprecations/pending-removal-in-3.13.rst | 52 + Doc/deprecations/pending-removal-in-3.14.rst | 108 + Doc/deprecations/pending-removal-in-3.15.rst | 68 + Doc/deprecations/pending-removal-in-3.16.rst | 20 + .../pending-removal-in-future.rst | 152 + Doc/extending/newtypes.rst | 2 +- Doc/extending/newtypes_tutorial.rst | 4 +- Doc/faq/design.rst | 8 +- Doc/faq/extending.rst | 7 +- Doc/faq/general.rst | 7 +- Doc/faq/library.rst | 4 +- Doc/faq/programming.rst | 45 +- Doc/glossary.rst | 36 +- Doc/howto/annotations.rst | 8 +- Doc/howto/argparse-optparse.rst | 55 + Doc/howto/argparse.rst | 47 + Doc/howto/descriptor.rst | 108 +- Doc/howto/enum.rst | 123 +- Doc/howto/instrumentation.rst | 2 +- Doc/howto/isolating-extensions.rst | 2 +- Doc/howto/logging-cookbook.rst | 2 +- Doc/howto/logging.rst | 48 +- Doc/howto/logging_flow.png | Bin 21907 -> 39133 bytes Doc/howto/logging_flow.svg | 327 + Doc/howto/mro.rst | 2 +- Doc/library/__main__.rst | 6 +- Doc/library/_thread.rst | 17 +- Doc/library/abc.rst | 4 +- Doc/library/argparse.rst | 699 +- Doc/library/array.rst | 4 +- Doc/library/ast.rst | 31 +- Doc/library/asynchat.rst | 17 + Doc/library/asyncio-eventloop.rst | 21 +- Doc/library/asyncio-future.rst | 6 +- Doc/library/asyncio-llapi-index.rst | 4 +- Doc/library/asyncio-queue.rst | 2 +- Doc/library/asyncio-runner.rst | 2 +- Doc/library/asyncio-sync.rst | 7 +- Doc/library/asyncio-task.rst | 51 +- Doc/library/asyncio.rst | 9 +- Doc/library/asyncore.rst | 17 + Doc/library/builtins.rst | 12 +- Doc/library/calendar.rst | 24 +- Doc/library/cmath.rst | 18 +- Doc/library/collections.abc.rst | 14 + Doc/library/collections.rst | 17 +- Doc/library/colorsys.rst | 2 +- Doc/library/compileall.rst | 2 +- Doc/library/configparser.rst | 65 +- Doc/library/constants.rst | 9 + Doc/library/contextlib.rst | 2 +- Doc/library/contextvars.rst | 14 +- Doc/library/csv.rst | 6 + Doc/library/ctypes.rst | 111 +- Doc/library/dataclasses.rst | 24 +- Doc/library/datetime.rst | 132 +- Doc/library/decimal.rst | 64 +- Doc/library/dis.rst | 24 +- Doc/library/distutils.rst | 17 + Doc/library/email.compat32-message.rst | 5 +- Doc/library/email.contentmanager.rst | 7 +- Doc/library/email.errors.rst | 7 + Doc/library/email.header.rst | 2 +- Doc/library/email.headerregistry.rst | 2 +- Doc/library/email.message.rst | 2 +- Doc/library/email.policy.rst | 18 + Doc/library/email.utils.rst | 21 +- Doc/library/enum.rst | 6 +- Doc/library/exceptions.rst | 4 +- Doc/library/fileinput.rst | 2 +- Doc/library/fractions.rst | 4 +- Doc/library/ftplib.rst | 2 +- Doc/library/functions.rst | 95 +- Doc/library/functools.rst | 43 +- Doc/library/getopt.rst | 12 +- Doc/library/getpass.rst | 2 +- Doc/library/gzip.rst | 4 +- Doc/library/hashlib.rst | 8 +- Doc/library/http.cookiejar.rst | 2 +- Doc/library/http.server.rst | 4 +- Doc/library/imp.rst | 18 + Doc/library/importlib.metadata.rst | 188 +- Doc/library/importlib.resources.abc.rst | 2 +- Doc/library/importlib.rst | 173 +- Doc/library/index.rst | 1 + Doc/library/inspect.rst | 462 +- Doc/library/io.rst | 10 +- Doc/library/ipaddress.rst | 4 +- Doc/library/itertools.rst | 51 +- Doc/library/json.rst | 78 +- Doc/library/locale.rst | 19 +- Doc/library/logging.config.rst | 16 +- Doc/library/logging.rst | 7 +- Doc/library/mailbox.rst | 2 +- Doc/library/marshal.rst | 6 +- Doc/library/math.rst | 22 +- Doc/library/mimetypes.rst | 10 + Doc/library/multiprocessing.rst | 35 +- Doc/library/nntplib.rst | 8 +- Doc/library/optparse.rst | 2 +- Doc/library/os.path.rst | 8 +- Doc/library/os.rst | 20 +- Doc/library/pathlib.rst | 566 +- Doc/library/pdb.rst | 2 +- Doc/library/pkgutil.rst | 9 +- Doc/library/pprint.rst | 182 +- Doc/library/profile.rst | 4 +- Doc/library/pydoc.rst | 7 +- Doc/library/random.rst | 10 +- Doc/library/re.rst | 47 +- Doc/library/readline.rst | 4 + Doc/library/removed.rst | 20 + Doc/library/resource.rst | 2 +- Doc/library/secrets.rst | 2 +- Doc/library/select.rst | 2 +- Doc/library/shutil.rst | 18 +- Doc/library/signal.rst | 2 +- Doc/library/site.rst | 5 +- Doc/library/smtpd.rst | 18 + Doc/library/smtplib.rst | 23 +- Doc/library/socket.rst | 56 +- Doc/library/sqlite3.rst | 32 +- Doc/library/ssl.rst | 61 +- Doc/library/statistics.rst | 8 +- Doc/library/stdtypes.rst | 148 +- Doc/library/string.rst | 49 +- Doc/library/struct.rst | 6 +- Doc/library/subprocess.rst | 8 +- Doc/library/symtable.rst | 35 +- Doc/library/sys.rst | 36 +- Doc/library/sysconfig.rst | 4 +- Doc/library/tarfile.rst | 2 +- Doc/library/test.rst | 4 +- Doc/library/threading.rst | 8 +- Doc/library/time.rst | 25 +- Doc/library/tkinter.rst | 2 +- Doc/library/token.rst | 9 +- Doc/library/tomllib.rst | 2 +- Doc/library/traceback.rst | 141 +- Doc/library/types.rst | 71 +- Doc/library/typing.rst | 245 +- Doc/library/unittest.mock.rst | 119 +- Doc/library/unittest.rst | 6 +- Doc/library/urllib.parse.rst | 11 +- Doc/library/urllib.request.rst | 32 +- Doc/library/venv.rst | 181 +- Doc/library/warnings.rst | 18 +- Doc/library/wave.rst | 4 +- Doc/library/weakref.rst | 2 +- Doc/library/webbrowser.rst | 7 + Doc/library/wsgiref.rst | 16 +- Doc/library/xml.etree.elementtree.rst | 14 +- Doc/library/xmlrpc.client.rst | 2 +- Doc/library/zipapp.rst | 2 +- Doc/reference/compound_stmts.rst | 52 +- Doc/reference/datamodel.rst | 462 +- Doc/reference/executionmodel.rst | 4 +- Doc/reference/expressions.rst | 141 +- Doc/reference/import.rst | 165 +- Doc/reference/introduction.rst | 2 +- Doc/reference/lexical_analysis.rst | 36 +- Doc/reference/simple_stmts.rst | 42 +- Doc/requirements-oldest-sphinx.txt | 34 +- Doc/requirements.txt | 6 +- Doc/tools/.nitignore | 3 - Doc/tools/check-warnings.py | 24 +- Doc/tools/extensions/audit_events.py | 264 + Doc/tools/extensions/availability.py | 123 + Doc/tools/extensions/c_annotations.py | 482 +- Doc/tools/extensions/escape4chm.py | 58 - Doc/tools/extensions/glossary_search.py | 74 +- Doc/tools/extensions/lexers/__init__.py | 15 + .../asdl_lexer.py} | 23 +- .../{peg_highlight.py => lexers/peg_lexer.py} | 7 - Doc/tools/extensions/patchlevel.py | 113 +- Doc/tools/extensions/pyspecific.py | 399 +- Doc/tools/static/glossary_search.js | 47 + Doc/tools/static/rtd_switcher.js | 55 + Doc/tools/static/sidebar-wrap.css | 6 + Doc/tools/templates/download.html | 73 +- Doc/tools/templates/indexcontent.html | 4 +- Doc/tools/templates/layout.html | 90 +- Doc/tools/templates/search.html | 69 +- Doc/tutorial/classes.rst | 11 +- Doc/tutorial/controlflow.rst | 98 +- Doc/tutorial/datastructures.rst | 26 +- Doc/tutorial/errors.rst | 2 +- Doc/tutorial/floatingpoint.rst | 10 +- Doc/tutorial/inputoutput.rst | 19 +- Doc/tutorial/introduction.rst | 28 +- Doc/tutorial/modules.rst | 5 +- Doc/tutorial/stdlib.rst | 2 +- Doc/tutorial/stdlib2.rst | 8 +- Doc/using/cmdline.rst | 11 +- Doc/using/configure.rst | 6 +- Doc/using/mac.rst | 2 +- Doc/using/unix.rst | 8 +- Doc/using/windows.rst | 18 +- Doc/whatsnew/2.1.rst | 8 +- Doc/whatsnew/2.2.rst | 7 +- Doc/whatsnew/2.3.rst | 12 +- Doc/whatsnew/2.4.rst | 6 +- Doc/whatsnew/2.5.rst | 4 +- Doc/whatsnew/2.6.rst | 16 +- Doc/whatsnew/2.7.rst | 12 +- Doc/whatsnew/3.0.rst | 4 +- Doc/whatsnew/3.1.rst | 16 +- Doc/whatsnew/3.10.rst | 8 +- Doc/whatsnew/3.11.rst | 21 +- Doc/whatsnew/3.12.rst | 322 +- Doc/whatsnew/3.2.rst | 22 +- Doc/whatsnew/3.3.rst | 14 +- Doc/whatsnew/3.4.rst | 16 +- Doc/whatsnew/3.5.rst | 20 +- Doc/whatsnew/3.6.rst | 22 +- Doc/whatsnew/3.7.rst | 22 +- Doc/whatsnew/3.8.rst | 50 +- Doc/whatsnew/3.9.rst | 15 +- Include/floatobject.h | 2 +- Include/internal/pycore_dtoa.h | 10 +- Include/internal/pycore_frame.h | 5 +- .../pycore_global_objects_fini_generated.h | 17 +- Include/internal/pycore_global_strings.h | 21 +- Include/internal/pycore_object.h | 7 + Include/internal/pycore_object_state.h | 8 +- Include/internal/pycore_runtime_init.h | 7 - .../internal/pycore_runtime_init_generated.h | 17 +- Include/internal/pycore_typeobject.h | 2 + Include/internal/pycore_unicodeobject.h | 18 +- .../internal/pycore_unicodeobject_generated.h | 2164 +- Include/patchlevel.h | 4 +- Include/pymacro.h | 8 +- InternalDocs/string_interning.md | 122 + Lib/_collections_abc.py | 2 +- Lib/_pydatetime.py | 2 + Lib/_pydecimal.py | 2 +- Lib/_strptime.py | 183 +- Lib/argparse.py | 289 +- Lib/asyncio/__main__.py | 8 +- Lib/asyncio/base_events.py | 23 +- Lib/asyncio/futures.py | 16 +- Lib/asyncio/sslproto.py | 5 +- Lib/asyncio/staggered.py | 31 +- Lib/asyncio/taskgroups.py | 41 +- Lib/bdb.py | 5 +- Lib/calendar.py | 18 +- Lib/code.py | 75 +- Lib/colorsys.py | 2 +- Lib/concurrent/futures/__init__.py | 1 + Lib/concurrent/futures/process.py | 52 +- Lib/concurrent/futures/thread.py | 1 + Lib/dataclasses.py | 2 +- Lib/decimal.py | 4 +- Lib/email/_header_value_parser.py | 13 +- Lib/email/_policybase.py | 12 +- Lib/email/errors.py | 4 + Lib/email/generator.py | 13 +- Lib/email/policy.py | 4 +- Lib/email/utils.py | 153 +- Lib/ensurepip/__init__.py | 2 +- .../_bundled/pip-24.0-py3-none-any.whl | Bin 2110226 -> 0 bytes .../_bundled/pip-24.3.1-py3-none-any.whl | Bin 0 -> 1822182 bytes Lib/enum.py | 18 +- Lib/filecmp.py | 10 +- Lib/fractions.py | 4 +- Lib/functools.py | 30 +- Lib/http/cookies.py | 36 +- Lib/idlelib/HISTORY.txt | 2 +- Lib/idlelib/Icons/README.txt | 52 +- Lib/idlelib/News3.txt | 16 +- Lib/idlelib/TODO.txt | 2 +- Lib/idlelib/config.py | 2 +- Lib/idlelib/configdialog.py | 2 +- Lib/idlelib/editor.py | 2 +- Lib/idlelib/extend.txt | 2 +- Lib/idlelib/grep.py | 2 +- Lib/idlelib/help.html | 21 +- Lib/idlelib/help_about.py | 15 +- Lib/idlelib/idle_test/example_stub.pyi | 2 +- Lib/idlelib/idle_test/test_outwin.py | 5 + Lib/idlelib/outwin.py | 2 +- Lib/idlelib/pyshell.py | 2 +- Lib/idlelib/run.py | 15 +- Lib/idlelib/searchbase.py | 2 +- Lib/idlelib/tooltip.py | 8 +- Lib/idlelib/tree.py | 14 +- Lib/importlib/__init__.py | 2 +- Lib/importlib/_bootstrap_external.py | 6 +- Lib/importlib/metadata/__init__.py | 2 +- Lib/importlib/resources/readers.py | 6 +- Lib/importlib/util.py | 4 +- Lib/inspect.py | 28 +- Lib/ipaddress.py | 19 +- Lib/json/decoder.py | 9 +- Lib/json/scanner.py | 2 +- Lib/linecache.py | 6 +- Lib/logging/config.py | 56 +- Lib/logging/handlers.py | 13 +- Lib/mimetypes.py | 2 + Lib/multiprocessing/connection.py | 2 +- Lib/multiprocessing/forkserver.py | 2 + Lib/multiprocessing/managers.py | 33 +- Lib/multiprocessing/synchronize.py | 4 +- Lib/ntpath.py | 49 +- Lib/nturl2path.py | 54 +- Lib/pathlib.py | 4 +- Lib/pdb.py | 29 +- Lib/pickle.py | 128 +- Lib/pickletools.py | 11 +- Lib/pstats.py | 2 +- Lib/pydoc.py | 8 +- Lib/pydoc_data/topics.py | 1607 +- Lib/re/_casefix.py | 2 +- Lib/re/_compiler.py | 23 +- Lib/reprlib.py | 31 +- Lib/runpy.py | 15 +- Lib/sched.py | 2 +- Lib/shutil.py | 22 +- Lib/site.py | 5 +- Lib/socket.py | 104 +- Lib/ssl.py | 9 +- Lib/statistics.py | 2 +- Lib/symtable.py | 31 +- Lib/sysconfig.py | 18 +- Lib/tabnanny.py | 8 +- Lib/tarfile.py | 103 +- Lib/test/_test_eintr.py | 37 +- Lib/test/_test_multiprocessing.py | 229 + Lib/test/clinic.test.c | 96 +- Lib/test/datetimetester.py | 68 +- Lib/test/decimaltestdata/ddFMA.decTest | 2 +- Lib/test/decimaltestdata/ddQuantize.decTest | 2 +- Lib/test/decimaltestdata/ddRemainder.decTest | 2 +- .../decimaltestdata/ddRemainderNear.decTest | 2 +- Lib/test/decimaltestdata/dqRemainder.decTest | 2 +- .../decimaltestdata/dqRemainderNear.decTest | 2 +- Lib/test/decimaltestdata/exp.decTest | 2 +- Lib/test/decimaltestdata/remainder.decTest | 2 +- .../decimaltestdata/remainderNear.decTest | 2 +- Lib/test/ieee754.txt | 2 +- Lib/test/libregrtest/logger.py | 5 +- Lib/test/libregrtest/main.py | 2 +- Lib/test/libregrtest/refleak.py | 22 +- Lib/test/libregrtest/testresult.py | 12 +- Lib/test/libregrtest/utils.py | 33 + Lib/test/list_tests.py | 8 + Lib/test/lock_tests.py | 4 + Lib/test/pickletester.py | 936 +- Lib/test/pyclbr_input.py | 68 +- Lib/test/support/__init__.py | 194 +- Lib/test/support/i18n_helper.py | 63 + Lib/test/support/import_helper.py | 4 +- Lib/test/support/script_helper.py | 10 +- Lib/test/support/testcase.py | 40 + Lib/test/support/venv.py | 70 + Lib/test/test__locale.py | 102 +- Lib/test/test_argparse.py | 881 +- Lib/test/test_array.py | 2 +- Lib/test/test_ast.py | 3078 - Lib/test/test_ast/__init__.py | 7 + Lib/test/test_ast/snippets.py | 400 + Lib/test/test_ast/test_ast.py | 2781 + Lib/test/test_ast/utils.py | 15 + .../test_asyncio/test_eager_task_factory.py | 62 + Lib/test/test_asyncio/test_events.py | 2 +- Lib/test/test_asyncio/test_futures.py | 191 +- Lib/test/test_asyncio/test_sendfile.py | 11 +- Lib/test/test_asyncio/test_sslproto.py | 48 + Lib/test/test_asyncio/test_staggered.py | 124 + Lib/test/test_asyncio/test_streams.py | 18 + Lib/test/test_asyncio/test_taskgroups.py | 92 +- Lib/test/test_asyncio/test_tasks.py | 22 + Lib/test/test_audit.py | 1 + Lib/test/test_bdb.py | 13 + Lib/test/test_buffer.py | 17 + Lib/test/test_bz2.py | 1 - Lib/test/test_calendar.py | 14 +- Lib/test/test_capi/test_bytes.py | 2 + Lib/test/test_capi/test_getargs.py | 27 +- Lib/test/test_capi/test_list.py | 4 + Lib/test/test_capi/test_long.py | 226 +- Lib/test/test_capi/test_number.py | 335 + Lib/test/test_capi/test_set.py | 4 + Lib/test/test_capi/test_tuple.py | 261 + Lib/test/test_class.py | 50 + Lib/test/test_clinic.py | 28 +- Lib/test/test_cmath.py | 42 +- Lib/test/test_code_module.py | 158 +- Lib/test/test_codecs.py | 9 +- Lib/test/test_compile.py | 66 +- Lib/test/test_compiler_codegen.py | 1 + Lib/test/test_complex.py | 36 +- .../test_concurrent_futures/test_deadlock.py | 4 +- .../test_thread_pool.py | 19 + Lib/test/test_contextlib.py | 2 - Lib/test/test_cprofile.py | 57 +- Lib/test/test_csv.py | 8 + Lib/test/test_ctypes/_support.py | 24 + Lib/test/test_ctypes/test_arrays.py | 4 +- .../test_ctypes/test_c_simple_type_meta.py | 152 + .../test_win32_com_foreign_func.py | 286 + Lib/test/test_curses.py | 16 + Lib/test/test_dataclasses/__init__.py | 94 + Lib/test/test_datetime.py | 36 +- Lib/test/test_decimal.py | 4 +- Lib/test/test_dict.py | 18 + Lib/test/test_dictcomps.py | 38 + Lib/test/test_email/test_email.py | 187 +- Lib/test/test_email/test_generator.py | 75 + Lib/test/test_email/test_message.py | 50 +- Lib/test/test_email/test_policy.py | 26 + Lib/test/test_embed.py | 65 + Lib/test/test_enum.py | 42 +- Lib/test/test_eof.py | 166 +- Lib/test/test_exceptions.py | 253 +- Lib/test/test_faulthandler.py | 2 +- Lib/test/test_filecmp.py | 33 + Lib/test/test_float.py | 24 +- Lib/test/test_format.py | 2 +- Lib/test/test_fractions.py | 12 +- Lib/test/test_fstring.py | 1616 +- Lib/test/test_funcattrs.py | 9 +- Lib/test/test_functools.py | 8 + Lib/test/test_future_stmt/test_future.py | 6 +- Lib/test/test_gdb/__init__.py | 3 + Lib/test/test_generators.py | 36 +- Lib/test/test_genericpath.py | 5 + Lib/test/test_getopt.py | 19 +- Lib/test/test_getpath.py | 4 +- Lib/test/test_http_cookies.py | 38 + Lib/test/test_imaplib.py | 2 +- Lib/test/test_import/__init__.py | 13 + Lib/test/test_importlib/fixtures.py | 38 + .../test_importlib/resources/test_files.py | 36 + Lib/test/test_importlib/test_api.py | 16 + Lib/test/test_importlib/test_metadata_api.py | 1 + Lib/test/test_importlib/test_util.py | 32 + .../inspect_stringized_annotations_pep695.py | 87 + Lib/test/test_inspect/test_inspect.py | 177 + Lib/test/test_io.py | 39 +- Lib/test/test_ipaddress.py | 26 + Lib/test/test_iter.py | 42 + Lib/test/test_itertools.py | 202 +- Lib/test/test_json/test_decode.py | 6 + Lib/test/test_json/test_scanstring.py | 10 + Lib/test/test_largefile.py | 19 + Lib/test/test_linecache.py | 31 + Lib/test/test_list.py | 25 + Lib/test/test_listcomps.py | 64 + Lib/test/test_locale.py | 4 + Lib/test/test_logging.py | 201 +- Lib/test/test_math.py | 28 +- Lib/test/test_memoryview.py | 27 +- Lib/test/test_ntpath.py | 3 + Lib/test/test_optparse.py | 11 +- Lib/test/test_ordered_dict.py | 114 +- Lib/test/test_os.py | 16 +- Lib/test/test_pathlib.py | 8 + Lib/test/test_patma.py | 19 + Lib/test/test_pdb.py | 92 + Lib/test/test_pickle.py | 18 + Lib/test/test_pickletools.py | 392 + Lib/test/test_pkgutil.py | 52 +- Lib/test/test_posix.py | 19 +- Lib/test/test_posixpath.py | 18 +- Lib/test/test_property.py | 36 +- Lib/test/test_pyclbr.py | 24 +- Lib/test/test_pydoc/test_pydoc.py | 165 +- Lib/test/test_re.py | 276 +- Lib/test/test_readline.py | 71 + Lib/test/test_regrtest.py | 59 + Lib/test/test_repl.py | 37 + Lib/test/test_reprlib.py | 44 + Lib/test/test_runpy.py | 6 +- Lib/test/test_scope.py | 24 + Lib/test/test_setcomps.py | 39 + Lib/test/test_shutil.py | 515 +- Lib/test/test_signal.py | 2 + Lib/test/test_socket.py | 154 +- Lib/test/test_sqlite3/test_regression.py | 2 + Lib/test/test_ssl.py | 19 +- Lib/test/test_statistics.py | 2 +- Lib/test/test_string_literals.py | 2 +- Lib/test/test_strptime.py | 232 +- Lib/test/test_struct.py | 12 + Lib/test/test_structseq.py | 13 + Lib/test/test_subprocess.py | 2 +- Lib/test/test_super.py | 35 +- Lib/test/test_symtable.py | 187 +- Lib/test/test_sys.py | 56 +- Lib/test/test_sys_setprofile.py | 18 + Lib/test/test_sys_settrace.py | 6 +- Lib/test/test_sysconfig.py | 75 + Lib/test/test_tabnanny.py | 2 +- Lib/test/test_tarfile.py | 42 + Lib/test/test_tcl.py | 86 +- Lib/test/test_termios.py | 2 +- Lib/test/test_threading.py | 35 + Lib/test/test_threading_local.py | 15 + Lib/test/test_time.py | 56 +- .../test_tkinter/test_geometry_managers.py | 47 +- Lib/test/test_tkinter/test_misc.py | 9 + Lib/test/test_tkinter/test_variables.py | 4 +- Lib/test/test_tkinter/test_widgets.py | 143 +- Lib/test/test_tkinter/widget_tests.py | 170 +- Lib/test/test_tokenize.py | 47 +- Lib/test/test_tools/i18n_data/docstrings.pot | 40 + Lib/test/test_tools/i18n_data/docstrings.py | 41 + Lib/test/test_tools/i18n_data/fileloc.pot | 35 + Lib/test/test_tools/i18n_data/fileloc.py | 26 + Lib/test/test_tools/i18n_data/messages.pot | 67 + Lib/test/test_tools/i18n_data/messages.py | 64 + Lib/test/test_tools/test_i18n.py | 141 +- Lib/test/test_tools/test_makefile.py | 5 +- Lib/test/test_traceback.py | 19 +- Lib/test/test_ttk/test_style.py | 8 +- Lib/test/test_ttk/test_widgets.py | 182 +- Lib/test/test_type_aliases.py | 13 + Lib/test/test_type_params.py | 17 + Lib/test/test_types.py | 57 +- Lib/test/test_typing.py | 104 +- Lib/test/test_unicode.py | 2 +- Lib/test/test_unittest/test_case.py | 10 + Lib/test/test_unittest/test_util.py | 33 + Lib/test/test_unittest/testmock/support.py | 11 + .../test_unittest/testmock/testhelpers.py | 8 + .../testmock/testmagicmethods.py | 39 + Lib/test/test_unittest/testmock/testmock.py | 5 + Lib/test/test_unittest/testmock/testpatch.py | 59 +- Lib/test/test_unpack_ex.py | 6 + Lib/test/test_urllib.py | 200 +- Lib/test/test_urllib2.py | 4 - Lib/test/test_urlparse.py | 37 +- Lib/test/test_venv.py | 89 + Lib/test/test_warnings/__init__.py | 128 +- Lib/test/test_winconsoleio.py | 23 + Lib/test/test_with.py | 50 +- Lib/test/test_xml_etree.py | 34 +- Lib/test/test_zipfile/_path/test_path.py | 97 + Lib/test/test_zipfile/test_core.py | 4 +- Lib/test/test_zipimport.py | 268 +- Lib/test/test_zlib.py | 39 +- Lib/test/translationdata/argparse/msgids.txt | 36 + Lib/test/translationdata/getopt/msgids.txt | 6 + Lib/test/translationdata/optparse/msgids.txt | 14 + Lib/test/typinganndata/ann_module695.py | 50 + Lib/threading.py | 8 +- Lib/tkinter/simpledialog.py | 2 +- Lib/tkinter/ttk.py | 9 +- Lib/token.py | 3 +- Lib/tokenize.py | 2 +- Lib/turtle.py | 6 +- Lib/turtledemo/clock.py | 33 +- Lib/turtledemo/sorting_animate.py | 2 +- Lib/typing.py | 26 +- Lib/unittest/async_case.py | 1 + Lib/unittest/mock.py | 54 +- Lib/urllib/parse.py | 8 +- Lib/urllib/request.py | 19 +- Lib/venv/__init__.py | 42 +- Lib/venv/scripts/common/activate | 15 +- Lib/venv/scripts/nt/activate.bat | 6 +- Lib/venv/scripts/posix/activate.csh | 8 +- Lib/venv/scripts/posix/activate.fish | 8 +- Lib/webbrowser.py | 5 +- Lib/xml/etree/ElementTree.py | 2 +- Lib/zipfile/__init__.py | 6 +- Lib/zipfile/_path/__init__.py | 25 +- Lib/zipfile/_path/glob.py | 13 + Lib/zipimport.py | 12 +- Mac/BuildScript/build-installer.py | 12 +- Mac/BuildScript/resources/ReadMe.rtf | 35 +- .../resources/install_certificates.command | 57 +- Makefile.pre.in | 8 +- Misc/ACKS | 8 + Misc/HISTORY | 6 +- Misc/NEWS | 8973 +-- Misc/coverity_model.c | 2 +- Misc/externals.spdx.json | 24 +- Misc/python.man | 1 + Misc/sbom.spdx.json | 34 +- Misc/valgrind-python.supp | 43 + Modules/_asynciomodule.c | 179 +- Modules/_bisectmodule.c | 4 +- Modules/_csv.c | 2 + Modules/_ctypes/_ctypes.c | 14 +- Modules/_ctypes/_ctypes_test.c | 4 +- Modules/_cursesmodule.c | 16 +- Modules/_datetimemodule.c | 183 +- Modules/_elementtree.c | 14 +- Modules/_functoolsmodule.c | 14 +- Modules/_io/stringio.c | 32 +- Modules/_io/textio.c | 31 +- Modules/_io/winconsoleio.c | 118 +- Modules/_localemodule.c | 56 +- Modules/_lsprof.c | 82 +- Modules/_operator.c | 13 +- Modules/_pickle.c | 100 +- Modules/_sqlite/clinic/connection.c.h | 4 +- Modules/_sre/clinic/sre.c.h | 44 +- Modules/_sre/sre.c | 135 +- Modules/_sre/sre.h | 17 +- Modules/_sre/sre_lib.h | 44 +- Modules/_ssl.c | 84 +- Modules/_struct.c | 26 +- Modules/_testcapi/numbers.c | 161 + Modules/_testcapi/tuple.c | 228 +- Modules/_testcapi/vectorcall.c | 3 + Modules/_testclinic.c | 20 + Modules/_threadmodule.c | 3 +- Modules/_tkinter.c | 122 +- Modules/_winapi.c | 2 +- Modules/_xxtestfuzz/README.rst | 8 +- Modules/_zoneinfo.c | 2 +- Modules/arraymodule.c | 6 +- Modules/clinic/_bisectmodule.c.h | 10 +- Modules/clinic/_cursesmodule.c.h | 98 +- Modules/clinic/_hashopenssl.c.h | 4 +- Modules/clinic/_testclinic.c.h | 114 +- Modules/clinic/_testmultiphase.c.h | 4 +- Modules/clinic/cmathmodule.c.h | 4 +- Modules/clinic/itertoolsmodule.c.h | 10 +- Modules/clinic/mathmodule.c.h | 10 +- Modules/clinic/posixmodule.c.h | 44 +- Modules/clinic/selectmodule.c.h | 4 +- Modules/clinic/signalmodule.c.h | 4 +- Modules/expat/expat.h | 6 +- Modules/expat/expat_external.h | 9 +- Modules/expat/refresh.sh | 57 + Modules/expat/siphash.h | 3 +- Modules/expat/xmlparse.c | 61 +- Modules/faulthandler.c | 2 +- Modules/gcmodule.c | 29 +- Modules/itertoolsmodule.c | 43 +- Modules/main.c | 4 + Modules/mathmodule.c | 23 +- Modules/posixmodule.c | 28 +- Modules/selectmodule.c | 4 +- Modules/signalmodule.c | 6 +- Modules/socketmodule.c | 5 +- Modules/timemodule.c | 264 +- Objects/boolobject.c | 4 +- Objects/clinic/floatobject.c.h | 6 +- Objects/codeobject.c | 6 +- Objects/complexobject.c | 2 +- Objects/descrobject.c | 19 +- Objects/dictobject.c | 28 +- Objects/exceptions.c | 113 +- Objects/floatobject.c | 10 +- Objects/genericaliasobject.c | 4 + Objects/genobject.c | 6 +- Objects/listobject.c | 54 +- Objects/longobject.c | 70 +- Objects/memoryobject.c | 58 +- Objects/object.c | 25 +- Objects/odictobject.c | 33 +- Objects/structseq.c | 28 +- Objects/tupleobject.c | 2 +- Objects/typeobject.c | 124 +- Objects/typevarobject.c | 11 +- Objects/unicodeobject.c | 572 +- PC/_wmimodule.cpp | 22 +- PC/clinic/_testconsole.c.h | 4 +- PC/launcher2.c | 9 +- PC/pyconfig.h | 6 +- PCbuild/find_python.bat | 8 +- PCbuild/get_externals.bat | 10 +- PCbuild/python.props | 4 +- PCbuild/readme.txt | 2 +- PCbuild/tcltk.props | 2 +- Parser/action_helpers.c | 2971 +- Parser/asdl_c.py | 13 +- Parser/myreadline.c | 13 +- Parser/pegen.c | 5 +- Parser/string_parser.c | 5 + Parser/tokenizer.c | 5281 +- Parser/tokenizer.h | 211 +- Programs/_freeze_module.c | 11 + Programs/_testembed.c | 14 +- Programs/test_frozenmain.h | 11 +- Python/Python-ast.c | 13 +- Python/Python-tokenize.c | 13 +- Python/ast_opt.c | 3 +- Python/ast_unparse.c | 10 +- Python/bltinmodule.c | 4 +- Python/bytecodes.c | 9 +- Python/clinic/sysmodule.c.h | 52 +- Python/codecs.c | 6 +- Python/compile.c | 56 +- Python/context.c | 1 + Python/errors.c | 91 +- Python/frame.c | 18 +- Python/future.c | 12 +- Python/generated_cases.c.h | 399 +- Python/getargs.c | 17 +- Python/import.c | 10 +- Python/legacy_tracing.c | 13 + Python/marshal.c | 21 +- Python/pylifecycle.c | 15 + Python/pystate.c | 8 +- Python/stdlib_module_names.h | 1 + Python/symtable.c | 23 +- Python/sysmodule.c | 24 +- Python/traceback.c | 23 +- Python/tracemalloc.c | 2 +- README.rst | 4 +- Tools/build/check_extension_modules.py | 1 + Tools/build/generate_global_objects.py | 25 +- Tools/build/generate_re_casefix.py | 4 +- Tools/build/generate_sbom.py | 50 + Tools/build/generate_token.py | 3 +- Tools/build/regen-configure.sh | 6 +- Tools/build/stable_abi.py | 23 +- Tools/c-analyzer/c_parser/preprocessor/gcc.py | 2 +- Tools/c-analyzer/cpython/globals-to-fix.tsv | 1 - Tools/clinic/clinic.py | 13 +- Tools/i18n/pygettext.py | 6 + Tools/msi/buildrelease.bat | 2 +- Tools/msi/pip/pip.wxs | 4 +- .../peg_extension/peg_extension.c | 6 +- Tools/requirements-hypothesis.txt | 2 +- Tools/ssl/multissltests.py | 11 +- Tools/unicode/makeunicodedata.py | 2 +- aclocal.m4 | 61 +- configure | 99 +- configure.ac | 69 +- debian/PVER-dbg.postinst.in | 2 +- debian/PVER-dbg.prerm.in | 6 +- debian/PVER-tk.postinst.in | 22 + debian/PVER-tk.prerm.in | 35 + debian/PVER-venv.postinst.in | 2 +- debian/PVER-venv.prerm.in | 2 +- debian/PVER.postinst.in | 2 +- debian/PVER.prerm.in | 2 +- debian/changelog | 177 +- debian/control | 41 +- debian/control.in | 19 +- debian/control.stdlib | 12 +- debian/idle-PVER.prerm.in | 2 +- debian/libPVER-dbg.overrides.in | 1 - debian/libPVER-minimal.postrm.in | 2 +- debian/libPVER-minimal.prerm.in | 4 +- debian/libPVER-stdlib.prerm.in | 4 +- debian/libPVER-testsuite.postinst.in | 2 +- debian/libPVER-testsuite.prerm.in | 2 +- debian/libPVER.overrides.in | 2 - debian/libpython.symbols.in | 3 + debian/multiarch.h.in | 8 +- debian/patches/argparse-no-shutil.diff | 2 +- debian/patches/deb-locations.diff | 4 +- debian/patches/destshared-location.diff | 4 +- debian/patches/disable-sem-check.diff | 2 +- debian/patches/distutils-install-layout.diff | 8 +- debian/patches/ensurepip-disabled.diff | 6 +- debian/patches/git-updates.diff | 1368 +- debian/patches/ignore-wheeldata.diff | 39 + debian/patches/issue127330.diff | 18006 ++++++ debian/patches/lib-argparse.diff | 6 +- debian/patches/link-opt.diff | 4 +- debian/patches/local-doc-references.diff | 12 +- debian/patches/makefile-bootstrap.diff | 14 + debian/patches/multiarch.diff | 4 +- debian/patches/patchlevel-noplus.diff | 11 + debian/patches/profiled-build.diff | 2 +- debian/patches/pydoc-use-pager.diff | 2 +- debian/patches/reproducible-buildinfo.diff | 17 - debian/patches/series | 8 +- debian/patches/sphinx3.diff | 6 +- debian/patches/sysconfig-debian-schemes.diff | 14 +- debian/patches/sysconfigdata-name.diff | 6 +- debian/patches/test-freeze-strip-libdir.diff | 25 + debian/rules | 246 +- debian/tests/control | 16 +- debian/tests/test-common.sh | 8 +- debian/tests/testsuite | 2 + debian/tests/testsuite-dbg | 2 + debian/upstream/signing-key.asc | 104 + debian/watch | 6 +- pyconfig.h.in | 4 - 820 files changed, 84158 insertions(+), 49714 deletions(-) create mode 100644 Doc/.ruff.toml create mode 100644 Doc/deprecations/c-api-pending-removal-in-3.14.rst create mode 100644 Doc/deprecations/c-api-pending-removal-in-3.15.rst create mode 100644 Doc/deprecations/c-api-pending-removal-in-future.rst create mode 100644 Doc/deprecations/index.rst create mode 100644 Doc/deprecations/pending-removal-in-3.13.rst create mode 100644 Doc/deprecations/pending-removal-in-3.14.rst create mode 100644 Doc/deprecations/pending-removal-in-3.15.rst create mode 100644 Doc/deprecations/pending-removal-in-3.16.rst create mode 100644 Doc/deprecations/pending-removal-in-future.rst create mode 100644 Doc/howto/argparse-optparse.rst create mode 100644 Doc/howto/logging_flow.svg create mode 100644 Doc/library/asynchat.rst create mode 100644 Doc/library/asyncore.rst create mode 100644 Doc/library/distutils.rst create mode 100644 Doc/library/imp.rst create mode 100644 Doc/library/removed.rst create mode 100644 Doc/library/smtpd.rst create mode 100644 Doc/tools/extensions/audit_events.py create mode 100644 Doc/tools/extensions/availability.py delete mode 100644 Doc/tools/extensions/escape4chm.py create mode 100644 Doc/tools/extensions/lexers/__init__.py rename Doc/tools/extensions/{asdl_highlight.py => lexers/asdl_lexer.py} (62%) rename Doc/tools/extensions/{peg_highlight.py => lexers/peg_lexer.py} (94%) create mode 100644 Doc/tools/static/glossary_search.js create mode 100644 Doc/tools/static/rtd_switcher.js create mode 100644 Doc/tools/static/sidebar-wrap.css create mode 100644 InternalDocs/string_interning.md delete mode 100644 Lib/ensurepip/_bundled/pip-24.0-py3-none-any.whl create mode 100644 Lib/ensurepip/_bundled/pip-24.3.1-py3-none-any.whl create mode 100644 Lib/test/support/i18n_helper.py create mode 100644 Lib/test/support/venv.py delete mode 100644 Lib/test/test_ast.py create mode 100644 Lib/test/test_ast/__init__.py create mode 100644 Lib/test/test_ast/snippets.py create mode 100644 Lib/test/test_ast/test_ast.py create mode 100644 Lib/test/test_ast/utils.py create mode 100644 Lib/test/test_asyncio/test_staggered.py create mode 100644 Lib/test/test_capi/test_number.py create mode 100644 Lib/test/test_capi/test_tuple.py create mode 100644 Lib/test/test_ctypes/_support.py create mode 100644 Lib/test/test_ctypes/test_c_simple_type_meta.py create mode 100644 Lib/test/test_ctypes/test_win32_com_foreign_func.py create mode 100644 Lib/test/test_inspect/inspect_stringized_annotations_pep695.py create mode 100644 Lib/test/test_tools/i18n_data/docstrings.pot create mode 100644 Lib/test/test_tools/i18n_data/docstrings.py create mode 100644 Lib/test/test_tools/i18n_data/fileloc.pot create mode 100644 Lib/test/test_tools/i18n_data/fileloc.py create mode 100644 Lib/test/test_tools/i18n_data/messages.pot create mode 100644 Lib/test/test_tools/i18n_data/messages.py create mode 100644 Lib/test/test_unittest/test_util.py create mode 100644 Lib/test/translationdata/argparse/msgids.txt create mode 100644 Lib/test/translationdata/getopt/msgids.txt create mode 100644 Lib/test/translationdata/optparse/msgids.txt create mode 100755 Modules/expat/refresh.sh create mode 100644 debian/PVER-tk.postinst.in create mode 100644 debian/PVER-tk.prerm.in create mode 100644 debian/patches/ignore-wheeldata.diff create mode 100644 debian/patches/issue127330.diff create mode 100644 debian/patches/makefile-bootstrap.diff create mode 100644 debian/patches/patchlevel-noplus.diff delete mode 100644 debian/patches/reproducible-buildinfo.diff create mode 100644 debian/patches/test-freeze-strip-libdir.diff create mode 100644 debian/upstream/signing-key.asc diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 663a1189..0bc0ebf4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,15 +1,23 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.3.4 + rev: v0.6.7 hooks: - id: ruff - name: Run Ruff on Lib/test/ + name: Run Ruff (lint) on Doc/ + args: [--exit-non-zero-on-fix] + files: ^Doc/ + - id: ruff + name: Run Ruff (lint) on Lib/test/ args: [--exit-non-zero-on-fix] files: ^Lib/test/ - id: ruff - name: Run Ruff on Argument Clinic + name: Run Ruff (lint) on Argument Clinic args: [--exit-non-zero-on-fix, --config=Tools/clinic/.ruff.toml] files: ^Tools/clinic/|Lib/test/test_clinic.py + - id: ruff-format + name: Run Ruff (format) on Doc/ + args: [--check] + files: ^Doc/ - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.5.0 diff --git a/.readthedocs.yml b/.readthedocs.yml index 898a9ae8..250d7ea0 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -8,11 +8,14 @@ sphinx: configuration: Doc/conf.py build: - os: ubuntu-22.04 + os: ubuntu-24.04 tools: python: "3" commands: + - asdf plugin add uv + - asdf install uv latest + - asdf global uv latest - make -C Doc venv html - mkdir _readthedocs - mv Doc/build/html _readthedocs/html diff --git a/Doc/.ruff.toml b/Doc/.ruff.toml new file mode 100644 index 00000000..111ce03b --- /dev/null +++ b/Doc/.ruff.toml @@ -0,0 +1,42 @@ +target-version = "py312" # Align with the version in oldest_supported_sphinx +fix = true +output-format = "full" +line-length = 79 +extend-exclude = [ + "includes/*", + # Temporary exclusions: + "tools/extensions/pyspecific.py", +] + +[lint] +preview = true +select = [ + "C4", # flake8-comprehensions + "B", # flake8-bugbear + "E", # pycodestyle + "F", # pyflakes + "FA", # flake8-future-annotations + "FLY", # flynt + "FURB", # refurb + "G", # flake8-logging-format + "I", # isort + "LOG", # flake8-logging + "N", # pep8-naming + "PERF", # perflint + "PGH", # pygrep-hooks + "PT", # flake8-pytest-style + "TCH", # flake8-type-checking + "UP", # pyupgrade + "W", # pycodestyle +] +ignore = [ + "E501", # Ignore line length errors (we use auto-formatting) +] + +[format] +preview = true +quote-style = "preserve" +docstring-code-format = true +exclude = [ + "tools/extensions/lexers/*", +] diff --git a/Doc/Makefile b/Doc/Makefile index 1cbfc722..4a704ad5 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -6,6 +6,7 @@ # You can set these variables from the command line. PYTHON = python3 VENVDIR = ./venv +UV = uv SPHINXBUILD = PATH=$(VENVDIR)/bin:$$PATH sphinx-build BLURB = PATH=$(VENVDIR)/bin:$$PATH blurb JOBS = auto @@ -143,21 +144,17 @@ pydoc-topics: build .PHONY: gettext gettext: BUILDER = gettext -gettext: SPHINXOPTS += '-d build/doctrees-gettext' +gettext: override SPHINXOPTS := -d build/doctrees-gettext $(SPHINXOPTS) gettext: build .PHONY: htmlview htmlview: html $(PYTHON) -c "import os, webbrowser; webbrowser.open('file://' + os.path.realpath('build/html/index.html'))" -.PHONY: ensure-sphinx-autobuild -ensure-sphinx-autobuild: venv - $(VENVDIR)/bin/sphinx-autobuild --version > /dev/null || $(VENVDIR)/bin/python3 -m pip install sphinx-autobuild - .PHONY: htmllive -htmllive: SPHINXBUILD = $(VENVDIR)/bin/sphinx-autobuild +htmllive: SPHINXBUILD = PATH=$(VENVDIR)/bin:$$PATH sphinx-autobuild htmllive: SPHINXOPTS = --re-ignore="/venv/" --open-browser --delay 0 -htmllive: ensure-sphinx-autobuild html +htmllive: _ensure-sphinx-autobuild html .PHONY: clean clean: clean-venv @@ -174,75 +171,130 @@ venv: echo "To recreate it, remove it first with \`make clean-venv'."; \ else \ echo "Creating venv in $(VENVDIR)"; \ - $(PYTHON) -m venv $(VENVDIR); \ - $(VENVDIR)/bin/python3 -m pip install --upgrade pip; \ - $(VENVDIR)/bin/python3 -m pip install -r $(REQUIREMENTS); \ + if $(UV) --version >/dev/null 2>&1; then \ + $(UV) venv $(VENVDIR); \ + VIRTUAL_ENV=$(VENVDIR) $(UV) pip install -r $(REQUIREMENTS); \ + else \ + $(PYTHON) -m venv $(VENVDIR); \ + $(VENVDIR)/bin/python3 -m pip install --upgrade pip; \ + $(VENVDIR)/bin/python3 -m pip install -r $(REQUIREMENTS); \ + fi; \ echo "The venv has been created in the $(VENVDIR) directory"; \ fi +.PHONY: dist-no-html +dist-no-html: dist-text dist-pdf dist-epub dist-texinfo + .PHONY: dist dist: rm -rf dist mkdir -p dist - + $(MAKE) dist-html + $(MAKE) dist-text + $(MAKE) dist-pdf + $(MAKE) dist-epub + $(MAKE) dist-texinfo + +.PHONY: dist-html +dist-html: # archive the HTML - make html + @echo "Building HTML..." + mkdir -p dist + rm -rf build/html + find dist -name 'python-$(DISTVERSION)-docs-html*' -exec rm -rf {} \; + $(MAKE) html cp -pPR build/html dist/python-$(DISTVERSION)-docs-html tar -C dist -cf dist/python-$(DISTVERSION)-docs-html.tar python-$(DISTVERSION)-docs-html bzip2 -9 -k dist/python-$(DISTVERSION)-docs-html.tar (cd dist; zip -q -r -9 python-$(DISTVERSION)-docs-html.zip python-$(DISTVERSION)-docs-html) rm -r dist/python-$(DISTVERSION)-docs-html rm dist/python-$(DISTVERSION)-docs-html.tar + @echo "Build finished and archived!" +.PHONY: dist-text +dist-text: # archive the text build - make text + @echo "Building text..." + mkdir -p dist + rm -rf build/text + find dist -name 'python-$(DISTVERSION)-docs-text*' -exec rm -rf {} \; + $(MAKE) text cp -pPR build/text dist/python-$(DISTVERSION)-docs-text tar -C dist -cf dist/python-$(DISTVERSION)-docs-text.tar python-$(DISTVERSION)-docs-text bzip2 -9 -k dist/python-$(DISTVERSION)-docs-text.tar (cd dist; zip -q -r -9 python-$(DISTVERSION)-docs-text.zip python-$(DISTVERSION)-docs-text) rm -r dist/python-$(DISTVERSION)-docs-text rm dist/python-$(DISTVERSION)-docs-text.tar + @echo "Build finished and archived!" +.PHONY: dist-pdf +dist-pdf: # archive the A4 latex + @echo "Building LaTeX (A4 paper)..." + mkdir -p dist rm -rf build/latex - make latex PAPER=a4 - -sed -i 's/makeindex/makeindex -q/' build/latex/Makefile - (cd build/latex; make clean && make all-pdf && make FMT=pdf zip bz2) + find dist -name 'python-$(DISTVERSION)-docs-pdf*' -exec rm -rf {} \; + $(MAKE) latex PAPER=a4 + # remove zip & bz2 dependency on all-pdf, + # as otherwise the full latexmk process is run twice. + # ($$ is needed to escape the $; https://www.gnu.org/software/make/manual/make.html#Basics-of-Variable-References) + -sed -i 's/: all-$$(FMT)/:/' build/latex/Makefile + (cd build/latex; $(MAKE) clean && $(MAKE) --jobs=$$((`nproc`+1)) --output-sync LATEXMKOPTS='-quiet' all-pdf && $(MAKE) FMT=pdf zip bz2) cp build/latex/docs-pdf.zip dist/python-$(DISTVERSION)-docs-pdf-a4.zip cp build/latex/docs-pdf.tar.bz2 dist/python-$(DISTVERSION)-docs-pdf-a4.tar.bz2 + @echo "Build finished and archived!" - # archive the letter latex - rm -rf build/latex - make latex PAPER=letter - -sed -i 's/makeindex/makeindex -q/' build/latex/Makefile - (cd build/latex; make clean && make all-pdf && make FMT=pdf zip bz2) - cp build/latex/docs-pdf.zip dist/python-$(DISTVERSION)-docs-pdf-letter.zip - cp build/latex/docs-pdf.tar.bz2 dist/python-$(DISTVERSION)-docs-pdf-letter.tar.bz2 - +.PHONY: dist-epub +dist-epub: # copy the epub build + @echo "Building EPUB..." + mkdir -p dist rm -rf build/epub - make epub + rm -f dist/python-$(DISTVERSION)-docs.epub + $(MAKE) epub cp -pPR build/epub/Python.epub dist/python-$(DISTVERSION)-docs.epub + @echo "Build finished and archived!" +.PHONY: dist-texinfo +dist-texinfo: # archive the texinfo build + @echo "Building Texinfo..." + mkdir -p dist rm -rf build/texinfo - make texinfo - make info --directory=build/texinfo + find dist -name 'python-$(DISTVERSION)-docs-texinfo*' -exec rm -rf {} \; + $(MAKE) texinfo + $(MAKE) info --directory=build/texinfo cp -pPR build/texinfo dist/python-$(DISTVERSION)-docs-texinfo tar -C dist -cf dist/python-$(DISTVERSION)-docs-texinfo.tar python-$(DISTVERSION)-docs-texinfo bzip2 -9 -k dist/python-$(DISTVERSION)-docs-texinfo.tar (cd dist; zip -q -r -9 python-$(DISTVERSION)-docs-texinfo.zip python-$(DISTVERSION)-docs-texinfo) rm -r dist/python-$(DISTVERSION)-docs-texinfo rm dist/python-$(DISTVERSION)-docs-texinfo.tar + @echo "Build finished and archived!" + +.PHONY: _ensure-package +_ensure-package: venv + if $(UV) --version >/dev/null 2>&1; then \ + VIRTUAL_ENV=$(VENVDIR) $(UV) pip install $(PACKAGE); \ + else \ + $(VENVDIR)/bin/python3 -m pip install $(PACKAGE); \ + fi + +.PHONY: _ensure-pre-commit +_ensure-pre-commit: + $(MAKE) _ensure-package PACKAGE=pre-commit + +.PHONY: _ensure-sphinx-autobuild +_ensure-sphinx-autobuild: + $(MAKE) _ensure-package PACKAGE=sphinx-autobuild .PHONY: check -check: venv - $(VENVDIR)/bin/python3 -m pre_commit --version > /dev/null || $(VENVDIR)/bin/python3 -m pip install pre-commit +check: _ensure-pre-commit $(VENVDIR)/bin/python3 -m pre_commit run --all-files .PHONY: serve serve: - @echo "The serve target was removed, use htmlview instead (see bpo-36329)" + @echo "The serve target was removed, use htmllive instead (see gh-80510)" # Targets for daily automated doc build # By default, Sphinx only rebuilds pages where the page content has changed. @@ -253,13 +305,15 @@ serve: # for development releases: always build .PHONY: autobuild-dev +autobuild-dev: DISTVERSION = $(shell $(PYTHON) tools/extensions/patchlevel.py --short) autobuild-dev: - make dist SPHINXOPTS='$(SPHINXOPTS) -Ea -A daily=1' + $(MAKE) dist-no-html SPHINXOPTS='$(SPHINXOPTS) -Ea -A daily=1' DISTVERSION=$(DISTVERSION) -# for quick rebuilds (HTML only) +# for HTML-only rebuilds .PHONY: autobuild-dev-html +autobuild-dev-html: DISTVERSION = $(shell $(PYTHON) tools/extensions/patchlevel.py --short) autobuild-dev-html: - make html SPHINXOPTS='$(SPHINXOPTS) -Ea -A daily=1' + $(MAKE) dist-html SPHINXOPTS='$(SPHINXOPTS) -Ea -A daily=1' DISTVERSION=$(DISTVERSION) # for stable releases: only build if not in pre-release stage (alpha, beta) # release candidate downloads are okay, since the stable tree can be in that stage @@ -269,7 +323,7 @@ autobuild-stable: echo "Not building; $(DISTVERSION) is not a release version."; \ exit 1;; \ esac - @make autobuild-dev + @$(MAKE) autobuild-dev .PHONY: autobuild-stable-html autobuild-stable-html: @@ -277,4 +331,4 @@ autobuild-stable-html: echo "Not building; $(DISTVERSION) is not a release version."; \ exit 1;; \ esac - @make autobuild-dev-html + @$(MAKE) autobuild-dev-html diff --git a/Doc/README.rst b/Doc/README.rst index a3bb5fa5..2d114875 100644 --- a/Doc/README.rst +++ b/Doc/README.rst @@ -28,7 +28,7 @@ install the tools into there. Using make ---------- -To get started on UNIX, you can create a virtual environment and build +To get started on Unix, you can create a virtual environment and build documentation with the commands:: make venv @@ -40,13 +40,13 @@ If you'd like to create the virtual environment in a different location, you can specify it using the ``VENVDIR`` variable. You can also skip creating the virtual environment altogether, in which case -the Makefile will look for instances of ``sphinx-build`` and ``blurb`` +the ``Makefile`` will look for instances of ``sphinx-build`` and ``blurb`` installed on your process ``PATH`` (configurable with the ``SPHINXBUILD`` and ``BLURB`` variables). -On Windows, we try to emulate the Makefile as closely as possible with a +On Windows, we try to emulate the ``Makefile`` as closely as possible with a ``make.bat`` file. If you need to specify the Python interpreter to use, -set the PYTHON environment variable. +set the ``PYTHON`` environment variable. Available make targets are: @@ -62,15 +62,19 @@ Available make targets are: * "htmlview", which re-uses the "html" builder, but then opens the main page in your default web browser. +* "htmllive", which re-uses the "html" builder, rebuilds the docs, + starts a local server, and automatically reloads the page in your browser + when you make changes to reST files (Unix only). + * "htmlhelp", which builds HTML files and a HTML Help project file usable to convert them into a single Compiled HTML (.chm) file -- these are popular under Microsoft Windows, but very handy on every platform. To create the CHM file, you need to run the Microsoft HTML Help Workshop - over the generated project (.hhp) file. The make.bat script does this for + over the generated project (.hhp) file. The ``make.bat`` script does this for you on Windows. -* "latex", which builds LaTeX source files as input to "pdflatex" to produce +* "latex", which builds LaTeX source files as input to ``pdflatex`` to produce PDF documents. * "text", which builds a plain text file for each source file. @@ -95,8 +99,6 @@ Available make targets are: * "check", which checks for frequent markup errors. -* "serve", which serves the build/html directory on port 8000. - * "dist", (Unix only) which creates distributable archives of HTML, text, PDF, and EPUB builds. @@ -131,8 +133,5 @@ Bugs in the content should be reported to the Bugs in the toolset should be reported to the tools themselves. -You can also send a mail to the Python Documentation Team at docs@python.org, -and we will process your request as soon as possible. - -If you want to help the Documentation Team, you are always welcome. Just send -a mail to docs@python.org. +To help with the documentation, or report any problems, please leave a message +on `discuss.python.org `_. diff --git a/Doc/c-api/allocation.rst b/Doc/c-api/allocation.rst index b3609c23..e6ff40ab 100644 --- a/Doc/c-api/allocation.rst +++ b/Doc/c-api/allocation.rst @@ -15,10 +15,8 @@ Allocating Objects on the Heap .. c:function:: PyObject* PyObject_Init(PyObject *op, PyTypeObject *type) Initialize a newly allocated object *op* with its type and initial - reference. Returns the initialized object. If *type* indicates that the - object participates in the cyclic garbage detector, it is added to the - detector's set of observed objects. Other fields of the object are not - affected. + reference. Returns the initialized object. Other fields of the object are + not affected. .. c:function:: PyVarObject* PyObject_InitVar(PyVarObject *op, PyTypeObject *type, Py_ssize_t size) diff --git a/Doc/c-api/arg.rst b/Doc/c-api/arg.rst index 657b10d3..b8af24f5 100644 --- a/Doc/c-api/arg.rst +++ b/Doc/c-api/arg.rst @@ -280,10 +280,10 @@ Numbers length 1, to a C :c:expr:`int`. ``f`` (:class:`float`) [float] - Convert a Python floating point number to a C :c:expr:`float`. + Convert a Python floating-point number to a C :c:expr:`float`. ``d`` (:class:`float`) [double] - Convert a Python floating point number to a C :c:expr:`double`. + Convert a Python floating-point number to a C :c:expr:`double`. ``D`` (:class:`complex`) [Py_complex] Convert a Python complex number to a C :c:type:`Py_complex` structure. @@ -607,10 +607,10 @@ Building values object of length 1. ``d`` (:class:`float`) [double] - Convert a C :c:expr:`double` to a Python floating point number. + Convert a C :c:expr:`double` to a Python floating-point number. ``f`` (:class:`float`) [float] - Convert a C :c:expr:`float` to a Python floating point number. + Convert a C :c:expr:`float` to a Python floating-point number. ``D`` (:class:`complex`) [Py_complex \*] Convert a C :c:type:`Py_complex` structure to a Python complex number. diff --git a/Doc/c-api/buffer.rst b/Doc/c-api/buffer.rst index 9500fe46..dc43a3d5 100644 --- a/Doc/c-api/buffer.rst +++ b/Doc/c-api/buffer.rst @@ -244,7 +244,6 @@ The following fields are not influenced by *flags* and must always be filled in with the correct values: :c:member:`~Py_buffer.obj`, :c:member:`~Py_buffer.buf`, :c:member:`~Py_buffer.len`, :c:member:`~Py_buffer.itemsize`, :c:member:`~Py_buffer.ndim`. - readonly, format ~~~~~~~~~~~~~~~~ @@ -253,7 +252,8 @@ readonly, format Controls the :c:member:`~Py_buffer.readonly` field. If set, the exporter MUST provide a writable buffer or else report failure. Otherwise, the exporter MAY provide either a read-only or writable buffer, but the choice - MUST be consistent for all consumers. + MUST be consistent for all consumers. For example, :c:expr:`PyBUF_SIMPLE | PyBUF_WRITABLE` + can be used to request a simple writable buffer. .. c:macro:: PyBUF_FORMAT @@ -265,8 +265,9 @@ readonly, format Since :c:macro:`PyBUF_SIMPLE` is defined as 0, :c:macro:`PyBUF_WRITABLE` can be used as a stand-alone flag to request a simple writable buffer. -:c:macro:`PyBUF_FORMAT` can be \|'d to any of the flags except :c:macro:`PyBUF_SIMPLE`. -The latter already implies format ``B`` (unsigned bytes). +:c:macro:`PyBUF_FORMAT` must be \|'d to any of the flags except :c:macro:`PyBUF_SIMPLE`, because +the latter already implies format ``B`` (unsigned bytes). :c:macro:`!PyBUF_FORMAT` cannot be +used on its own. shape, strides, suboffsets diff --git a/Doc/c-api/bytearray.rst b/Doc/c-api/bytearray.rst index 456f7d89..9045689a 100644 --- a/Doc/c-api/bytearray.rst +++ b/Doc/c-api/bytearray.rst @@ -42,17 +42,22 @@ Direct API functions Return a new bytearray object from any object, *o*, that implements the :ref:`buffer protocol `. + On failure, return ``NULL`` with an exception set. + .. c:function:: PyObject* PyByteArray_FromStringAndSize(const char *string, Py_ssize_t len) - Create a new bytearray object from *string* and its length, *len*. On - failure, ``NULL`` is returned. + Create a new bytearray object from *string* and its length, *len*. + + On failure, return ``NULL`` with an exception set. .. c:function:: PyObject* PyByteArray_Concat(PyObject *a, PyObject *b) Concat bytearrays *a* and *b* and return a new bytearray with the result. + On failure, return ``NULL`` with an exception set. + .. c:function:: Py_ssize_t PyByteArray_Size(PyObject *bytearray) diff --git a/Doc/c-api/cell.rst b/Doc/c-api/cell.rst index f8cd0344..61eb994c 100644 --- a/Doc/c-api/cell.rst +++ b/Doc/c-api/cell.rst @@ -39,7 +39,8 @@ Cell objects are not likely to be useful elsewhere. .. c:function:: PyObject* PyCell_Get(PyObject *cell) - Return the contents of the cell *cell*. + Return the contents of the cell *cell*, which can be ``NULL``. + If *cell* is not a cell object, returns ``NULL`` with an exception set. .. c:function:: PyObject* PyCell_GET(PyObject *cell) @@ -52,8 +53,10 @@ Cell objects are not likely to be useful elsewhere. Set the contents of the cell object *cell* to *value*. This releases the reference to any current content of the cell. *value* may be ``NULL``. *cell* - must be non-``NULL``; if it is not a cell object, ``-1`` will be returned. On - success, ``0`` will be returned. + must be non-``NULL``. + + On success, return ``0``. + If *cell* is not a cell object, set an exception and return ``-1``. .. c:function:: void PyCell_SET(PyObject *cell, PyObject *value) diff --git a/Doc/c-api/code.rst b/Doc/c-api/code.rst index f6fdd757..d7e89b73 100644 --- a/Doc/c-api/code.rst +++ b/Doc/c-api/code.rst @@ -90,8 +90,8 @@ bound into a function. Return the line number of the instruction that occurs on or before ``byte_offset`` and ends after it. If you just need the line number of a frame, use :c:func:`PyFrame_GetLineNumber` instead. - For efficiently iterating over the line numbers in a code object, use `the API described in PEP 626 - `_. + For efficiently iterating over the line numbers in a code object, use :pep:`the API described in PEP 626 + <0626#out-of-process-debuggers-and-profilers>`. .. c:function:: int PyCode_Addr2Location(PyObject *co, int byte_offset, int *start_line, int *start_column, int *end_line, int *end_column) diff --git a/Doc/c-api/complex.rst b/Doc/c-api/complex.rst index e3fd001c..77cb67d8 100644 --- a/Doc/c-api/complex.rst +++ b/Doc/c-api/complex.rst @@ -25,12 +25,16 @@ pointers. This is consistent throughout the API. The C structure which corresponds to the value portion of a Python complex number object. Most of the functions for dealing with complex number objects - use structures of this type as input or output values, as appropriate. It is - defined as:: + use structures of this type as input or output values, as appropriate. + + .. c:member:: double real + double imag + + The structure is defined as:: typedef struct { - double real; - double imag; + double real; + double imag; } Py_complex; @@ -106,17 +110,22 @@ Complex Numbers as Python Objects .. c:function:: PyObject* PyComplex_FromCComplex(Py_complex v) Create a new Python complex number object from a C :c:type:`Py_complex` value. + Return ``NULL`` with an exception set on error. .. c:function:: PyObject* PyComplex_FromDoubles(double real, double imag) Return a new :c:type:`PyComplexObject` object from *real* and *imag*. + Return ``NULL`` with an exception set on error. .. c:function:: double PyComplex_RealAsDouble(PyObject *op) Return the real part of *op* as a C :c:expr:`double`. + Upon failure, this method returns ``-1.0`` with an exception set, so one + should call :c:func:`PyErr_Occurred` to check for errors. + .. c:function:: double PyComplex_ImagAsDouble(PyObject *op) @@ -131,8 +140,11 @@ Complex Numbers as Python Objects method, this method will first be called to convert *op* to a Python complex number object. If :meth:`!__complex__` is not defined then it falls back to :meth:`~object.__float__`. If :meth:`!__float__` is not defined then it falls back - to :meth:`~object.__index__`. Upon failure, this method returns ``-1.0`` as a real - value. + to :meth:`~object.__index__`. + + Upon failure, this method returns :c:type:`Py_complex` + with :c:member:`~Py_complex.real` set to ``-1.0`` and with an exception set, so one + should call :c:func:`PyErr_Occurred` to check for errors. .. versionchanged:: 3.8 Use :meth:`~object.__index__` if available. diff --git a/Doc/c-api/datetime.rst b/Doc/c-api/datetime.rst index 97522da7..d2d4d530 100644 --- a/Doc/c-api/datetime.rst +++ b/Doc/c-api/datetime.rst @@ -318,10 +318,10 @@ Macros for the convenience of modules implementing the DB API: .. c:function:: PyObject* PyDateTime_FromTimestamp(PyObject *args) Create and return a new :class:`datetime.datetime` object given an argument - tuple suitable for passing to :meth:`datetime.datetime.fromtimestamp()`. + tuple suitable for passing to :meth:`datetime.datetime.fromtimestamp`. .. c:function:: PyObject* PyDate_FromTimestamp(PyObject *args) Create and return a new :class:`datetime.date` object given an argument - tuple suitable for passing to :meth:`datetime.date.fromtimestamp()`. + tuple suitable for passing to :meth:`datetime.date.fromtimestamp`. diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index 7ddecb24..e1fb8c89 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -34,7 +34,7 @@ propagated, additional calls into the Python/C API may not behave as intended and may fail in mysterious ways. .. note:: - The error indicator is **not** the result of :func:`sys.exc_info()`. + The error indicator is **not** the result of :func:`sys.exc_info`. The former corresponds to an exception that is not yet caught (and is therefore still propagating), while the latter returns an exception after it is caught (and has therefore stopped propagating). @@ -720,7 +720,7 @@ Exception Classes This creates a class object derived from :exc:`Exception` (accessible in C as :c:data:`PyExc_Exception`). - The :attr:`!__module__` attribute of the new class is set to the first part (up + The :attr:`~type.__module__` attribute of the new class is set to the first part (up to the last dot) of the *name* argument, and the class name is set to the last part (after the last dot). The *base* argument can be used to specify alternate base classes; it can either be only one class or a tuple of classes. The *dict* diff --git a/Doc/c-api/file.rst b/Doc/c-api/file.rst index c4f53592..e9019a0d 100644 --- a/Doc/c-api/file.rst +++ b/Doc/c-api/file.rst @@ -65,9 +65,10 @@ the :mod:`io` APIs instead. Overrides the normal behavior of :func:`io.open_code` to pass its parameter through the provided handler. - The handler is a function of type: + The *handler* is a function of type: - .. c:type:: Py_OpenCodeHookFunction + .. c:namespace:: NULL + .. c:type:: PyObject * (*Py_OpenCodeHookFunction)(PyObject *, void *) Equivalent of :c:expr:`PyObject *(\*)(PyObject *path, void *userData)`, where *path* is guaranteed to be diff --git a/Doc/c-api/float.rst b/Doc/c-api/float.rst index 4f6ac0d8..1da37a5b 100644 --- a/Doc/c-api/float.rst +++ b/Doc/c-api/float.rst @@ -2,20 +2,20 @@ .. _floatobjects: -Floating Point Objects +Floating-Point Objects ====================== -.. index:: pair: object; floating point +.. index:: pair: object; floating-point .. c:type:: PyFloatObject - This subtype of :c:type:`PyObject` represents a Python floating point object. + This subtype of :c:type:`PyObject` represents a Python floating-point object. .. c:var:: PyTypeObject PyFloat_Type - This instance of :c:type:`PyTypeObject` represents the Python floating point + This instance of :c:type:`PyTypeObject` represents the Python floating-point type. This is the same object as :class:`float` in the Python layer. @@ -45,7 +45,7 @@ Floating Point Objects .. c:function:: double PyFloat_AsDouble(PyObject *pyfloat) Return a C :c:expr:`double` representation of the contents of *pyfloat*. If - *pyfloat* is not a Python floating point object but has a :meth:`~object.__float__` + *pyfloat* is not a Python floating-point object but has a :meth:`~object.__float__` method, this method will first be called to convert *pyfloat* into a float. If :meth:`!__float__` is not defined then it falls back to :meth:`~object.__index__`. This method returns ``-1.0`` upon failure, so one should call diff --git a/Doc/c-api/import.rst b/Doc/c-api/import.rst index 380465b8..d6370bc9 100644 --- a/Doc/c-api/import.rst +++ b/Doc/c-api/import.rst @@ -120,14 +120,14 @@ Importing Modules such modules have no way to know that the module object is an unknown (and probably damaged with respect to the module author's intents) state. - The module's :attr:`__spec__` and :attr:`__loader__` will be set, if - not set already, with the appropriate values. The spec's loader will - be set to the module's ``__loader__`` (if set) and to an instance of - :class:`~importlib.machinery.SourceFileLoader` otherwise. + The module's :attr:`~module.__spec__` and :attr:`~module.__loader__` will be + set, if not set already, with the appropriate values. The spec's loader + will be set to the module's :attr:`!__loader__` (if set) and to an instance + of :class:`~importlib.machinery.SourceFileLoader` otherwise. - The module's :attr:`__file__` attribute will be set to the code object's - :attr:`~codeobject.co_filename`. If applicable, :attr:`__cached__` will also - be set. + The module's :attr:`~module.__file__` attribute will be set to the code + object's :attr:`~codeobject.co_filename`. If applicable, + :attr:`~module.__cached__` will also be set. This function will reload the module if it was already imported. See :c:func:`PyImport_ReloadModule` for the intended way to reload a module. @@ -139,29 +139,29 @@ Importing Modules :c:func:`PyImport_ExecCodeModuleWithPathnames`. .. versionchanged:: 3.12 - The setting of :attr:`__cached__` and :attr:`__loader__` is - deprecated. See :class:`~importlib.machinery.ModuleSpec` for + The setting of :attr:`~module.__cached__` and :attr:`~module.__loader__` + is deprecated. See :class:`~importlib.machinery.ModuleSpec` for alternatives. .. c:function:: PyObject* PyImport_ExecCodeModuleEx(const char *name, PyObject *co, const char *pathname) - Like :c:func:`PyImport_ExecCodeModule`, but the :attr:`__file__` attribute of - the module object is set to *pathname* if it is non-``NULL``. + Like :c:func:`PyImport_ExecCodeModule`, but the :attr:`~module.__file__` + attribute of the module object is set to *pathname* if it is non-``NULL``. See also :c:func:`PyImport_ExecCodeModuleWithPathnames`. .. c:function:: PyObject* PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname, PyObject *cpathname) - Like :c:func:`PyImport_ExecCodeModuleEx`, but the :attr:`__cached__` + Like :c:func:`PyImport_ExecCodeModuleEx`, but the :attr:`~module.__cached__` attribute of the module object is set to *cpathname* if it is non-``NULL``. Of the three functions, this is the preferred one to use. .. versionadded:: 3.3 .. versionchanged:: 3.12 - Setting :attr:`__cached__` is deprecated. See + Setting :attr:`~module.__cached__` is deprecated. See :class:`~importlib.machinery.ModuleSpec` for alternatives. @@ -174,7 +174,7 @@ Importing Modules .. versionadded:: 3.2 .. versionchanged:: 3.3 - Uses :func:`!imp.source_from_cache()` in calculating the source path if + Uses :func:`!imp.source_from_cache` in calculating the source path if only the bytecode path is provided. .. versionchanged:: 3.12 No longer uses the removed :mod:`!imp` module. diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index a51f1da6..aacbab0b 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -388,9 +388,16 @@ Initializing and finalizing the interpreter :c:func:`Py_NewInterpreter` below) that were created and not yet destroyed since the last call to :c:func:`Py_Initialize`. Ideally, this frees all memory allocated by the Python interpreter. This is a no-op when called for a second - time (without calling :c:func:`Py_Initialize` again first). Normally the - return value is ``0``. If there were errors during finalization - (flushing buffered data), ``-1`` is returned. + time (without calling :c:func:`Py_Initialize` again first). + + Since this is the reverse of :c:func:`Py_Initialize`, it should be called + in the same thread with the same interpreter active. That means + the main thread and the main interpreter. + This should never be called while :c:func:`Py_RunMain` is running. + + Normally the return value is ``0``. + If there were errors during finalization (flushing buffered data), + ``-1`` is returned. This function is provided for a number of reasons. An embedding application might want to restart Python without having to restart the application itself. @@ -1262,7 +1269,7 @@ All of the following functions must be called after :c:func:`Py_Initialize`. .. c:function:: void PyThreadState_DeleteCurrent(void) Destroy the current thread state and release the global interpreter lock. - Like :c:func:`PyThreadState_Delete`, the global interpreter lock need not + Like :c:func:`PyThreadState_Delete`, the global interpreter lock must be held. The thread state must have been reset with a previous call to :c:func:`PyThreadState_Clear`. @@ -1637,7 +1644,11 @@ function. You can create and destroy them using the following functions: .check_multi_interp_extensions = 1, .gil = PyInterpreterConfig_OWN_GIL, }; - PyThreadState *tstate = Py_NewInterpreterFromConfig(&config); + PyThreadState *tstate = NULL; + PyStatus status = Py_NewInterpreterFromConfig(&tstate, &config); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); + } Note that the config is used only briefly and does not get modified. During initialization the config's values are converted into various diff --git a/Doc/c-api/init_config.rst b/Doc/c-api/init_config.rst index 7c5465b5..c586cfb3 100644 --- a/Doc/c-api/init_config.rst +++ b/Doc/c-api/init_config.rst @@ -311,7 +311,7 @@ PyPreConfig * Set :c:member:`PyConfig.filesystem_encoding` to ``"mbcs"``, * Set :c:member:`PyConfig.filesystem_errors` to ``"replace"``. - Initialized the from :envvar:`PYTHONLEGACYWINDOWSFSENCODING` environment + Initialized from the :envvar:`PYTHONLEGACYWINDOWSFSENCODING` environment variable value. Only available on Windows. ``#ifdef MS_WINDOWS`` macro can be used for @@ -499,7 +499,7 @@ PyConfig The :c:func:`PyConfig_Read` function only parses :c:member:`PyConfig.argv` arguments once: :c:member:`PyConfig.parse_argv` is set to ``2`` after arguments are parsed. Since Python arguments are - strippped from :c:member:`PyConfig.argv`, parsing arguments twice would + stripped from :c:member:`PyConfig.argv`, parsing arguments twice would parse the application options as Python options. :ref:`Preinitialize Python ` if needed. @@ -1000,7 +1000,7 @@ PyConfig The :c:func:`PyConfig_Read` function only parses :c:member:`PyConfig.argv` arguments once: :c:member:`PyConfig.parse_argv` is set to ``2`` after arguments are parsed. Since Python arguments are - strippped from :c:member:`PyConfig.argv`, parsing arguments twice would + stripped from :c:member:`PyConfig.argv`, parsing arguments twice would parse the application options as Python options. Default: ``1`` in Python mode, ``0`` in isolated mode. diff --git a/Doc/c-api/long.rst b/Doc/c-api/long.rst index 76ac8032..972d69a5 100644 --- a/Doc/c-api/long.rst +++ b/Doc/c-api/long.rst @@ -324,6 +324,17 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. Returns ``NULL`` on error. Use :c:func:`PyErr_Occurred` to disambiguate. +.. c:function:: PyObject* PyLong_GetInfo(void) + + On success, return a read only :term:`named tuple`, that holds + information about Python's internal representation of integers. + See :data:`sys.int_info` for description of individual fields. + + On failure, return ``NULL`` with an exception set. + + .. versionadded:: 3.1 + + .. c:function:: int PyUnstable_Long_IsCompact(const PyLongObject* op) Return 1 if *op* is compact, 0 otherwise. @@ -339,6 +350,9 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. Exactly what values are considered compact is an implementation detail and is subject to change. + .. versionadded:: 3.12 + + .. c:function:: Py_ssize_t PyUnstable_Long_CompactValue(const PyLongObject* op) If *op* is compact, as determined by :c:func:`PyUnstable_Long_IsCompact`, @@ -346,3 +360,5 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. Otherwise, the return value is undefined. + .. versionadded:: 3.12 + diff --git a/Doc/c-api/marshal.rst b/Doc/c-api/marshal.rst index 489f1580..b9085ad3 100644 --- a/Doc/c-api/marshal.rst +++ b/Doc/c-api/marshal.rst @@ -15,7 +15,7 @@ Numeric values are stored with the least significant byte first. The module supports two versions of the data format: version 0 is the historical version, version 1 shares interned strings in the file, and upon -unmarshalling. Version 2 uses a binary format for floating point numbers. +unmarshalling. Version 2 uses a binary format for floating-point numbers. ``Py_MARSHAL_VERSION`` indicates the current file format (currently 2). diff --git a/Doc/c-api/module.rst b/Doc/c-api/module.rst index f941f0c7..cfa6a1a9 100644 --- a/Doc/c-api/module.rst +++ b/Doc/c-api/module.rst @@ -37,16 +37,19 @@ Module Objects single: __package__ (module attribute) single: __loader__ (module attribute) - Return a new module object with the :attr:`__name__` attribute set to *name*. - The module's :attr:`__name__`, :attr:`__doc__`, :attr:`__package__`, and - :attr:`__loader__` attributes are filled in (all but :attr:`__name__` are set - to ``None``); the caller is responsible for providing a :attr:`__file__` - attribute. + Return a new module object with :attr:`module.__name__` set to *name*. + The module's :attr:`!__name__`, :attr:`~module.__doc__`, + :attr:`~module.__package__` and :attr:`~module.__loader__` attributes are + filled in (all but :attr:`!__name__` are set to ``None``). The caller is + responsible for setting a :attr:`~module.__file__` attribute. + + Return ``NULL`` with an exception set on error. .. versionadded:: 3.3 .. versionchanged:: 3.4 - :attr:`__package__` and :attr:`__loader__` are set to ``None``. + :attr:`~module.__package__` and :attr:`~module.__loader__` are now set to + ``None``. .. c:function:: PyObject* PyModule_New(const char *name) @@ -75,8 +78,9 @@ Module Objects single: __name__ (module attribute) single: SystemError (built-in exception) - Return *module*'s :attr:`__name__` value. If the module does not provide one, - or if it is not a string, :exc:`SystemError` is raised and ``NULL`` is returned. + Return *module*'s :attr:`~module.__name__` value. If the module does not + provide one, or if it is not a string, :exc:`SystemError` is raised and + ``NULL`` is returned. .. versionadded:: 3.3 @@ -106,8 +110,8 @@ Module Objects single: SystemError (built-in exception) Return the name of the file from which *module* was loaded using *module*'s - :attr:`__file__` attribute. If this is not defined, or if it is not a - unicode string, raise :exc:`SystemError` and return ``NULL``; otherwise return + :attr:`~module.__file__` attribute. If this is not defined, or if it is not a + string, raise :exc:`SystemError` and return ``NULL``; otherwise return a reference to a Unicode object. .. versionadded:: 3.2 @@ -265,6 +269,8 @@ of the following two module creation functions: API version *module_api_version*. If that version does not match the version of the running interpreter, a :exc:`RuntimeWarning` is emitted. + Return ``NULL`` with an exception set on error. + .. note:: Most uses of this function should be using :c:func:`PyModule_Create` @@ -338,7 +344,8 @@ The available slot types are: The *value* pointer of this slot must point to a function of the signature: .. c:function:: PyObject* create_module(PyObject *spec, PyModuleDef *def) - :noindex: + :no-index-entry: + :no-contents-entry: The function receives a :py:class:`~importlib.machinery.ModuleSpec` instance, as defined in :PEP:`451`, and the module definition. @@ -373,7 +380,8 @@ The available slot types are: The signature of the function is: .. c:function:: int exec_module(PyObject* module) - :noindex: + :no-index-entry: + :no-contents-entry: If multiple ``Py_mod_exec`` slots are specified, they are processed in the order they appear in the *m_slots* array. @@ -436,6 +444,8 @@ objects dynamically. Note that both ``PyModule_FromDefAndSpec`` and If that version does not match the version of the running interpreter, a :exc:`RuntimeWarning` is emitted. + Return ``NULL`` with an exception set on error. + .. note:: Most uses of this function should be using :c:func:`PyModule_FromDefAndSpec` @@ -486,7 +496,7 @@ state: On success, return ``0``. On error, raise an exception and return ``-1``. - Return ``NULL`` if *value* is ``NULL``. It must be called with an exception + Return ``-1`` if *value* is ``NULL``. It must be called with an exception raised in this case. Example usage:: @@ -518,6 +528,14 @@ state: Note that ``Py_XDECREF()`` should be used instead of ``Py_DECREF()`` in this case, since *obj* can be ``NULL``. + The number of different *name* strings passed to this function + should be kept small, usually by only using statically allocated strings + as *name*. + For names that aren't known at compile time, prefer calling + :c:func:`PyUnicode_FromString` and :c:func:`PyObject_SetAttr` directly. + For more details, see :c:func:`PyUnicode_InternFromString`, which may be + used internally to create a key object. + .. versionadded:: 3.10 @@ -579,15 +597,23 @@ state: .. c:function:: int PyModule_AddIntConstant(PyObject *module, const char *name, long value) Add an integer constant to *module* as *name*. This convenience function can be - used from the module's initialization function. Return ``-1`` on error, ``0`` on - success. + used from the module's initialization function. + Return ``-1`` with an exception set on error, ``0`` on success. + + This is a convenience function that calls :c:func:`PyLong_FromLong` and + :c:func:`PyModule_AddObjectRef`; see their documentation for details. .. c:function:: int PyModule_AddStringConstant(PyObject *module, const char *name, const char *value) Add a string constant to *module* as *name*. This convenience function can be used from the module's initialization function. The string *value* must be - ``NULL``-terminated. Return ``-1`` on error, ``0`` on success. + ``NULL``-terminated. + Return ``-1`` with an exception set on error, ``0`` on success. + + This is a convenience function that calls + :c:func:`PyUnicode_InternFromString` and :c:func:`PyModule_AddObjectRef`; + see their documentation for details. .. c:macro:: PyModule_AddIntMacro(module, macro) @@ -595,7 +621,7 @@ state: Add an int constant to *module*. The name and the value are taken from *macro*. For example ``PyModule_AddIntMacro(module, AF_INET)`` adds the int constant *AF_INET* with the value of *AF_INET* to *module*. - Return ``-1`` on error, ``0`` on success. + Return ``-1`` with an exception set on error, ``0`` on success. .. c:macro:: PyModule_AddStringMacro(module, macro) @@ -608,7 +634,7 @@ state: The type object is finalized by calling internally :c:func:`PyType_Ready`. The name of the type object is taken from the last component of :c:member:`~PyTypeObject.tp_name` after dot. - Return ``-1`` on error, ``0`` on success. + Return ``-1`` with an exception set on error, ``0`` on success. .. versionadded:: 3.9 @@ -647,14 +673,14 @@ since multiple such modules can be created from a single definition. The caller must hold the GIL. - Return 0 on success or -1 on failure. + Return ``-1`` with an exception set on error, ``0`` on success. .. versionadded:: 3.3 .. c:function:: int PyState_RemoveModule(PyModuleDef *def) Removes the module object created from *def* from the interpreter state. - Return 0 on success or -1 on failure. + Return ``-1`` with an exception set on error, ``0`` on success. The caller must hold the GIL. diff --git a/Doc/c-api/number.rst b/Doc/c-api/number.rst index 13d3c5af..ad8b5935 100644 --- a/Doc/c-api/number.rst +++ b/Doc/c-api/number.rst @@ -51,8 +51,8 @@ Number Protocol Return a reasonable approximation for the mathematical value of *o1* divided by *o2*, or ``NULL`` on failure. The return value is "approximate" because binary - floating point numbers are approximate; it is not possible to represent all real - numbers in base two. This function can return a floating point value when + floating-point numbers are approximate; it is not possible to represent all real + numbers in base two. This function can return a floating-point value when passed two integers. This is the equivalent of the Python expression ``o1 / o2``. @@ -177,8 +177,8 @@ Number Protocol Return a reasonable approximation for the mathematical value of *o1* divided by *o2*, or ``NULL`` on failure. The return value is "approximate" because binary - floating point numbers are approximate; it is not possible to represent all real - numbers in base two. This function can return a floating point value when + floating-point numbers are approximate; it is not possible to represent all real + numbers in base two. This function can return a floating-point value when passed two integers. The operation is done *in-place* when *o1* supports it. This is the equivalent of the Python statement ``o1 /= o2``. diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst index 3cb65400..2109b12b 100644 --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -107,6 +107,13 @@ Object Protocol If *v* is ``NULL``, the attribute is deleted, but this feature is deprecated in favour of using :c:func:`PyObject_DelAttrString`. + The number of different attribute names passed to this function + should be kept small, usually by using a statically allocated string + as *attr_name*. + For attribute names that aren't known at compile time, prefer calling + :c:func:`PyUnicode_FromString` and :c:func:`PyObject_SetAttr` directly. + For more details, see :c:func:`PyUnicode_InternFromString`, which may be + used internally to create a key object. .. c:function:: int PyObject_GenericSetAttr(PyObject *o, PyObject *name, PyObject *value) @@ -132,6 +139,14 @@ Object Protocol specified as a :c:expr:`const char*` UTF-8 encoded bytes string, rather than a :c:expr:`PyObject*`. + The number of different attribute names passed to this function + should be kept small, usually by using a statically allocated string + as *attr_name*. + For attribute names that aren't known at compile time, prefer calling + :c:func:`PyUnicode_FromString` and :c:func:`PyObject_DelAttr` directly. + For more details, see :c:func:`PyUnicode_InternFromString`, which may be + used internally to create a key object for lookup. + .. c:function:: PyObject* PyObject_GenericGetDict(PyObject *o, void *context) @@ -253,14 +268,14 @@ Object Protocol The result will be ``1`` when at least one of the checks returns ``1``, otherwise it will be ``0``. - If *cls* has a :meth:`~class.__subclasscheck__` method, it will be called to + If *cls* has a :meth:`~type.__subclasscheck__` method, it will be called to determine the subclass status as described in :pep:`3119`. Otherwise, *derived* is a subclass of *cls* if it is a direct or indirect subclass, - i.e. contained in ``cls.__mro__``. + i.e. contained in :attr:`cls.__mro__ `. Normally only class objects, i.e. instances of :class:`type` or a derived class, are considered classes. However, objects can override this by having - a :attr:`~class.__bases__` attribute (which must be a tuple of base classes). + a :attr:`~type.__bases__` attribute (which must be a tuple of base classes). .. c:function:: int PyObject_IsInstance(PyObject *inst, PyObject *cls) @@ -272,15 +287,15 @@ Object Protocol The result will be ``1`` when at least one of the checks returns ``1``, otherwise it will be ``0``. - If *cls* has a :meth:`~class.__instancecheck__` method, it will be called to + If *cls* has a :meth:`~type.__instancecheck__` method, it will be called to determine the subclass status as described in :pep:`3119`. Otherwise, *inst* is an instance of *cls* if its class is a subclass of *cls*. An instance *inst* can override what is considered its class by having a - :attr:`~instance.__class__` attribute. + :attr:`~object.__class__` attribute. An object *cls* can override if it is considered a class, and what its base - classes are, by having a :attr:`~class.__bases__` attribute (which must be a tuple + classes are, by having a :attr:`~type.__bases__` attribute (which must be a tuple of base classes). diff --git a/Doc/c-api/refcounting.rst b/Doc/c-api/refcounting.rst index a484fa44..158aa737 100644 --- a/Doc/c-api/refcounting.rst +++ b/Doc/c-api/refcounting.rst @@ -59,7 +59,7 @@ of Python objects. ``NULL``, use :c:func:`Py_XINCREF`. Do not expect this function to actually modify *o* in any way. - For at least `some objects `_, + For at least :pep:`some objects <0683>`, this function has no effect. .. versionchanged:: 3.12 @@ -125,7 +125,7 @@ of Python objects. use :c:func:`Py_XDECREF`. Do not expect this function to actually modify *o* in any way. - For at least `some objects `_, + For at least :pep:`some objects <683>`, this function has no effect. .. warning:: diff --git a/Doc/c-api/slice.rst b/Doc/c-api/slice.rst index 9e880c6b..819929a0 100644 --- a/Doc/c-api/slice.rst +++ b/Doc/c-api/slice.rst @@ -23,7 +23,9 @@ Slice Objects Return a new slice object with the given values. The *start*, *stop*, and *step* parameters are used as the values of the slice object attributes of the same names. Any of the values may be ``NULL``, in which case the - ``None`` will be used for the corresponding attribute. Return ``NULL`` if + ``None`` will be used for the corresponding attribute. + + Return ``NULL`` with an exception set if the new object could not be allocated. @@ -52,7 +54,7 @@ Slice Objects of bounds indices are clipped in a manner consistent with the handling of normal slices. - Returns ``0`` on success and ``-1`` on error with exception set. + Return ``0`` on success and ``-1`` on error with an exception set. .. note:: This function is considered not safe for resizable sequences. @@ -95,7 +97,7 @@ Slice Objects ``PY_SSIZE_T_MIN`` to ``PY_SSIZE_T_MIN``, and silently boost the step values less than ``-PY_SSIZE_T_MAX`` to ``-PY_SSIZE_T_MAX``. - Return ``-1`` on error, ``0`` on success. + Return ``-1`` with an exception set on error, ``0`` on success. .. versionadded:: 3.6.1 diff --git a/Doc/c-api/stable.rst b/Doc/c-api/stable.rst index 5b9e4387..124e58cf 100644 --- a/Doc/c-api/stable.rst +++ b/Doc/c-api/stable.rst @@ -66,7 +66,7 @@ Limited C API Python 3.2 introduced the *Limited API*, a subset of Python's C API. Extensions that only use the Limited API can be -compiled once and work with multiple versions of Python. +compiled once and be loaded on multiple versions of Python. Contents of the Limited API are :ref:`listed below `. .. c:macro:: Py_LIMITED_API @@ -76,7 +76,7 @@ Contents of the Limited API are :ref:`listed below `. Define ``Py_LIMITED_API`` to the value of :c:macro:`PY_VERSION_HEX` corresponding to the lowest Python version your extension supports. - The extension will work without recompilation with all Python 3 releases + The extension will be ABI-compatible with all Python 3 releases from the specified one onward, and can use Limited API introduced up to that version. @@ -94,7 +94,15 @@ Stable ABI ---------- To enable this, Python provides a *Stable ABI*: a set of symbols that will -remain compatible across Python 3.x versions. +remain ABI-compatible across Python 3.x versions. + +.. note:: + + The Stable ABI prevents ABI issues, like linker errors due to missing + symbols or data corruption due to changes in structure layouts or function + signatures. + However, other changes in Python can change the *behavior* of extensions. + See Python's Backwards Compatibility Policy (:pep:`387`) for details. The Stable ABI contains symbols exposed in the :ref:`Limited API `, but also other ones – for example, functions necessary to diff --git a/Doc/c-api/tuple.rst b/Doc/c-api/tuple.rst index e0186c1f..e20c5a66 100644 --- a/Doc/c-api/tuple.rst +++ b/Doc/c-api/tuple.rst @@ -33,12 +33,14 @@ Tuple Objects .. c:function:: PyObject* PyTuple_New(Py_ssize_t len) - Return a new tuple object of size *len*, or ``NULL`` on failure. + Return a new tuple object of size *len*, + or ``NULL`` with an exception set on failure. .. c:function:: PyObject* PyTuple_Pack(Py_ssize_t n, ...) - Return a new tuple object of size *n*, or ``NULL`` on failure. The tuple values + Return a new tuple object of size *n*, + or ``NULL`` with an exception set on failure. The tuple values are initialized to the subsequent *n* C arguments pointing to Python objects. ``PyTuple_Pack(2, a, b)`` is equivalent to ``Py_BuildValue("(OO)", a, b)``. @@ -46,12 +48,12 @@ Tuple Objects .. c:function:: Py_ssize_t PyTuple_Size(PyObject *p) Take a pointer to a tuple object, and return the size of that tuple. + On error, return ``-1`` and with an exception set. .. c:function:: Py_ssize_t PyTuple_GET_SIZE(PyObject *p) - Return the size of the tuple *p*, which must be non-``NULL`` and point to a tuple; - no error checking is performed. + Like :c:func:`PyTuple_Size`, but without error checking. .. c:function:: PyObject* PyTuple_GetItem(PyObject *p, Py_ssize_t pos) @@ -74,8 +76,10 @@ Tuple Objects .. c:function:: PyObject* PyTuple_GetSlice(PyObject *p, Py_ssize_t low, Py_ssize_t high) Return the slice of the tuple pointed to by *p* between *low* and *high*, - or ``NULL`` on failure. This is the equivalent of the Python expression - ``p[low:high]``. Indexing from the end of the tuple is not supported. + or ``NULL`` with an exception set on failure. + + This is the equivalent of the Python expression ``p[low:high]``. + Indexing from the end of the tuple is not supported. .. c:function:: int PyTuple_SetItem(PyObject *p, Py_ssize_t pos, PyObject *o) @@ -132,6 +136,8 @@ type. Create a new struct sequence type from the data in *desc*, described below. Instances of the resulting type can be created with :c:func:`PyStructSequence_New`. + Return ``NULL`` with an exception set on failure. + .. c:function:: void PyStructSequence_InitType(PyTypeObject *type, PyStructSequence_Desc *desc) @@ -140,8 +146,8 @@ type. .. c:function:: int PyStructSequence_InitType2(PyTypeObject *type, PyStructSequence_Desc *desc) - The same as ``PyStructSequence_InitType``, but returns ``0`` on success and ``-1`` on - failure. + Like :c:func:`PyStructSequence_InitType`, but returns ``0`` on success + and ``-1`` with an exception set on failure. .. versionadded:: 3.4 @@ -152,7 +158,8 @@ type. .. c:member:: const char *name - Name of the struct sequence type. + Fully qualified name of the type; null-terminated UTF-8 encoded. + The name must contain the module name. .. c:member:: const char *doc @@ -198,6 +205,8 @@ type. Creates an instance of *type*, which must have been created with :c:func:`PyStructSequence_NewType`. + Return ``NULL`` with an exception set on failure. + .. c:function:: PyObject* PyStructSequence_GetItem(PyObject *p, Py_ssize_t pos) diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst index 5aaa8147..1564fa94 100644 --- a/Doc/c-api/type.rst +++ b/Doc/c-api/type.rst @@ -53,7 +53,8 @@ Type Objects .. c:function:: PyObject* PyType_GetDict(PyTypeObject* type) Return the type object's internal namespace, which is otherwise only - exposed via a read-only proxy (``cls.__dict__``). This is a + exposed via a read-only proxy (:attr:`cls.__dict__ `). + This is a replacement for accessing :c:member:`~PyTypeObject.tp_dict` directly. The returned dictionary must be treated as read-only. @@ -140,7 +141,7 @@ Type Objects Return true if *a* is a subtype of *b*. This function only checks for actual subtypes, which means that - :meth:`~class.__subclasscheck__` is not called on *b*. Call + :meth:`~type.__subclasscheck__` is not called on *b*. Call :c:func:`PyObject_IsSubclass` to do the same check that :func:`issubclass` would do. @@ -174,14 +175,15 @@ Type Objects .. c:function:: PyObject* PyType_GetName(PyTypeObject *type) - Return the type's name. Equivalent to getting the type's ``__name__`` attribute. + Return the type's name. Equivalent to getting the type's + :attr:`~type.__name__` attribute. .. versionadded:: 3.11 .. c:function:: PyObject* PyType_GetQualName(PyTypeObject *type) Return the type's qualified name. Equivalent to getting the - type's ``__qualname__`` attribute. + type's :attr:`~type.__qualname__` attribute. .. versionadded:: 3.11 @@ -463,19 +465,19 @@ The following functions and structs are used to create The following “offset” fields cannot be set using :c:type:`PyType_Slot`: - * :c:member:`~PyTypeObject.tp_weaklistoffset` - (use :c:macro:`Py_TPFLAGS_MANAGED_WEAKREF` instead if possible) - * :c:member:`~PyTypeObject.tp_dictoffset` - (use :c:macro:`Py_TPFLAGS_MANAGED_DICT` instead if possible) - * :c:member:`~PyTypeObject.tp_vectorcall_offset` - (use ``"__vectorcalloffset__"`` in - :ref:`PyMemberDef `) + * :c:member:`~PyTypeObject.tp_weaklistoffset` + (use :c:macro:`Py_TPFLAGS_MANAGED_WEAKREF` instead if possible) + * :c:member:`~PyTypeObject.tp_dictoffset` + (use :c:macro:`Py_TPFLAGS_MANAGED_DICT` instead if possible) + * :c:member:`~PyTypeObject.tp_vectorcall_offset` + (use ``"__vectorcalloffset__"`` in + :ref:`PyMemberDef `) - If it is not possible to switch to a ``MANAGED`` flag (for example, - for vectorcall or to support Python older than 3.12), specify the - offset in :c:member:`Py_tp_members `. - See :ref:`PyMemberDef documentation ` - for details. + If it is not possible to switch to a ``MANAGED`` flag (for example, + for vectorcall or to support Python older than 3.12), specify the + offset in :c:member:`Py_tp_members `. + See :ref:`PyMemberDef documentation ` + for details. The following fields cannot be set at all when creating a heap type: @@ -495,14 +497,13 @@ The following functions and structs are used to create To avoid issues, use the *bases* argument of :c:func:`PyType_FromSpecWithBases` instead. - .. versionchanged:: 3.9 + .. versionchanged:: 3.9 + Slots in :c:type:`PyBufferProcs` may be set in the unlimited API. - Slots in :c:type:`PyBufferProcs` may be set in the unlimited API. - - .. versionchanged:: 3.11 - :c:member:`~PyBufferProcs.bf_getbuffer` and - :c:member:`~PyBufferProcs.bf_releasebuffer` are now available - under the :ref:`limited API `. + .. versionchanged:: 3.11 + :c:member:`~PyBufferProcs.bf_getbuffer` and + :c:member:`~PyBufferProcs.bf_releasebuffer` are now available + under the :ref:`limited API `. .. c:member:: void *pfunc diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index f6d865f2..9fc3d358 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -589,12 +589,12 @@ and :c:data:`PyType_Type` effectively act as defaults.) For :ref:`statically allocated type objects `, the *tp_name* field should contain a dot. - Everything before the last dot is made accessible as the :attr:`__module__` + Everything before the last dot is made accessible as the :attr:`~type.__module__` attribute, and everything after the last dot is made accessible as the - :attr:`~definition.__name__` attribute. + :attr:`~type.__name__` attribute. If no dot is present, the entire :c:member:`~PyTypeObject.tp_name` field is made accessible as the - :attr:`~definition.__name__` attribute, and the :attr:`__module__` attribute is undefined + :attr:`~type.__name__` attribute, and the :attr:`~type.__module__` attribute is undefined (unless explicitly set in the dictionary, as explained above). This means your type will be impossible to pickle. Additionally, it will not be listed in module documentations created with pydoc. @@ -704,6 +704,19 @@ and :c:data:`PyType_Type` effectively act as defaults.) Py_DECREF(tp); } + .. warning:: + + In a garbage collected Python, :c:member:`!tp_dealloc` may be called from + any Python thread, not just the thread which created the object (if the + object becomes part of a refcount cycle, that cycle might be collected by + a garbage collection on any thread). This is not a problem for Python + API calls, since the thread on which :c:member:`!tp_dealloc` is called + will own the Global Interpreter Lock (GIL). However, if the object being + destroyed in turn destroys objects from some other C or C++ library, care + should be taken to ensure that destroying those objects on the thread + which called :c:member:`!tp_dealloc` will not violate any assumptions of + the library. + **Inheritance:** @@ -1149,7 +1162,7 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:macro:: Py_TPFLAGS_MANAGED_DICT - This bit indicates that instances of the class have a ``__dict__`` + This bit indicates that instances of the class have a `~object.__dict__` attribute, and that the space for the dictionary is managed by the VM. If this flag is set, :c:macro:`Py_TPFLAGS_HAVE_GC` should also be set. @@ -1350,8 +1363,8 @@ and :c:data:`PyType_Type` effectively act as defaults.) .. c:member:: const char* PyTypeObject.tp_doc An optional pointer to a NUL-terminated C string giving the docstring for this - type object. This is exposed as the :attr:`__doc__` attribute on the type and - instances of the type. + type object. This is exposed as the :attr:`~type.__doc__` attribute on the + type and instances of the type. **Inheritance:** @@ -1584,7 +1597,7 @@ and :c:data:`PyType_Type` effectively act as defaults.) weak references to the type object itself. It is an error to set both the :c:macro:`Py_TPFLAGS_MANAGED_WEAKREF` bit and - :c:member:`~PyTypeObject.tp_weaklist`. + :c:member:`~PyTypeObject.tp_weaklistoffset`. **Inheritance:** @@ -1596,7 +1609,7 @@ and :c:data:`PyType_Type` effectively act as defaults.) **Default:** If the :c:macro:`Py_TPFLAGS_MANAGED_WEAKREF` bit is set in the - :c:member:`~PyTypeObject.tp_dict` field, then + :c:member:`~PyTypeObject.tp_flags` field, then :c:member:`~PyTypeObject.tp_weaklistoffset` will be set to a negative value, to indicate that it is unsafe to use this field. @@ -2028,7 +2041,7 @@ and :c:data:`PyType_Type` effectively act as defaults.) A collection of subclasses. Internal use only. May be an invalid pointer. To get a list of subclasses, call the Python method - :py:meth:`~class.__subclasses__`. + :py:meth:`~type.__subclasses__`. .. versionchanged:: 3.12 @@ -2101,17 +2114,6 @@ and :c:data:`PyType_Type` effectively act as defaults.) PyErr_Restore(error_type, error_value, error_traceback); } - Also, note that, in a garbage collected Python, - :c:member:`~PyTypeObject.tp_dealloc` may be called from - any Python thread, not just the thread which created the object (if the object - becomes part of a refcount cycle, that cycle might be collected by a garbage - collection on any thread). This is not a problem for Python API calls, since - the thread on which tp_dealloc is called will own the Global Interpreter Lock - (GIL). However, if the object being destroyed in turn destroys objects from some - other C or C++ library, care should be taken to ensure that destroying those - objects on the thread which called tp_dealloc will not violate any assumptions - of the library. - **Inheritance:** This field is inherited by subtypes. @@ -2191,7 +2193,7 @@ This is done by filling a :c:type:`PyType_Spec` structure and calling .. _number-structs: Number Object Structures -======================== +------------------------ .. sectionauthor:: Amaury Forgeot d'Arc @@ -2305,7 +2307,7 @@ Number Object Structures .. _mapping-structs: Mapping Object Structures -========================= +------------------------- .. sectionauthor:: Amaury Forgeot d'Arc @@ -2342,7 +2344,7 @@ Mapping Object Structures .. _sequence-structs: Sequence Object Structures -========================== +-------------------------- .. sectionauthor:: Amaury Forgeot d'Arc @@ -2422,7 +2424,7 @@ Sequence Object Structures .. _buffer-structs: Buffer Object Structures -======================== +------------------------ .. sectionauthor:: Greg J. Stein .. sectionauthor:: Benjamin Peterson @@ -2517,7 +2519,7 @@ Buffer Object Structures Async Object Structures -======================= +----------------------- .. sectionauthor:: Yury Selivanov @@ -2585,7 +2587,7 @@ Async Object Structures .. _slot-typedefs: Slot Type typedefs -================== +------------------ .. c:type:: PyObject *(*allocfunc)(PyTypeObject *cls, Py_ssize_t nitems) @@ -2694,7 +2696,7 @@ Slot Type typedefs .. _typedef-examples: Examples -======== +-------- The following are simple examples of Python type definitions. They include common usage you may encounter. Some demonstrate tricky corner diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index 54a006c0..4d9f9ce0 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -345,6 +345,8 @@ APIs: This is the recommended way to allocate a new Unicode object. Objects created using this function are not resizable. + On error, set an exception and return ``NULL``. + .. versionadded:: 3.3 @@ -598,6 +600,8 @@ APIs: Return the length of the Unicode object, in code points. + On error, set an exception and return ``-1``. + .. versionadded:: 3.3 @@ -641,6 +645,8 @@ APIs: not out of bounds, and that the object can be modified safely (i.e. that it its reference count is one). + Return ``0`` on success, ``-1`` on error with an exception set. + .. versionadded:: 3.3 @@ -650,6 +656,8 @@ APIs: Unicode object and the index is not out of bounds, in contrast to :c:func:`PyUnicode_READ_CHAR`, which performs no error checking. + Return character on success, ``-1`` on error with an exception set. + .. versionadded:: 3.3 @@ -658,6 +666,7 @@ APIs: Return a substring of *unicode*, from character index *start* (included) to character index *end* (excluded). Negative indices are not supported. + On error, set an exception and return ``NULL``. .. versionadded:: 3.3 @@ -1452,15 +1461,35 @@ They all return ``NULL`` or ``-1`` if an exception occurs. existing interned string that is the same as :c:expr:`*p_unicode`, it sets :c:expr:`*p_unicode` to it (releasing the reference to the old string object and creating a new :term:`strong reference` to the interned string object), otherwise it leaves - :c:expr:`*p_unicode` alone and interns it (creating a new :term:`strong reference`). + :c:expr:`*p_unicode` alone and interns it. + (Clarification: even though there is a lot of talk about references, think - of this function as reference-neutral; you own the object after the call - if and only if you owned it before the call.) + of this function as reference-neutral. You must own the object you pass in; + after the call you no longer own the passed-in reference, but you newly own + the result.) + + This function never raises an exception. + On error, it leaves its argument unchanged without interning it. + + Instances of subclasses of :py:class:`str` may not be interned, that is, + :c:expr:`PyUnicode_CheckExact(*p_unicode)` must be true. If it is not, + then -- as with any other error -- the argument is left unchanged. + + Note that interned strings are not “immortal”. + You must keep a reference to the result to benefit from interning. .. c:function:: PyObject* PyUnicode_InternFromString(const char *str) A combination of :c:func:`PyUnicode_FromString` and - :c:func:`PyUnicode_InternInPlace`, returning either a new Unicode string - object that has been interned, or a new ("owned") reference to an earlier - interned string object with the same value. + :c:func:`PyUnicode_InternInPlace`, meant for statically allocated strings. + + Return a new ("owned") reference to either a new Unicode string object + that has been interned, or an earlier interned string object with the + same value. + + Python may keep a reference to the result, or + prevent it from being garbage-collected promptly. + For interning an unbounded number of different strings, such as ones coming + from user input, prefer calling :c:func:`PyUnicode_FromString` and + :c:func:`PyUnicode_InternInPlace` directly. diff --git a/Doc/conf.py b/Doc/conf.py index e292bdd5..4e76c21f 100644 --- a/Doc/conf.py +++ b/Doc/conf.py @@ -6,23 +6,30 @@ # The contents of this file are pickled, so don't put values in the namespace # that aren't pickleable (module imports are okay, they're removed automatically). +import importlib import os import sys import time + +import sphinx + +# Make our custom extensions available to Sphinx sys.path.append(os.path.abspath('tools/extensions')) sys.path.append(os.path.abspath('includes')) +# Python specific content from Doc/Tools/extensions/pyspecific.py from pyspecific import SOURCE_URI # General configuration # --------------------- +# Our custom Sphinx extensions are found in Doc/Tools/extensions/ extensions = [ - 'asdl_highlight', + 'audit_events', + 'availability', 'c_annotations', - 'escape4chm', 'glossary_search', - 'peg_highlight', + 'lexers', 'pyspecific', 'sphinx.ext.coverage', 'sphinx.ext.doctest', @@ -31,7 +38,7 @@ # Skip if downstream redistributors haven't installed it try: - import sphinxext.opengraph + import sphinxext.opengraph # noqa: F401 except ImportError: pass else: @@ -44,7 +51,7 @@ except ImportError: _tkinter = None # Treat warnings as errors, done here to prevent warnings in Sphinx code from -# causing spurious test failures. +# causing spurious CPython test failures. import warnings warnings.simplefilter('error') del warnings @@ -54,35 +61,40 @@ # General substitutions. project = 'Python' -copyright = f"2001-{time.strftime('%Y')}, Python Software Foundation" +if sphinx.version_info[:2] >= (8, 1): + copyright = "2001-%Y, Python Software Foundation" +else: + copyright = f"2001-{time.strftime('%Y')}, Python Software Foundation" # We look for the Include/patchlevel.h file in the current Python source tree # and replace the values accordingly. -import patchlevel -version, release = patchlevel.get_version_info() +# See Doc/tools/extensions/patchlevel.py +version, release = importlib.import_module('patchlevel').get_version_info() rst_epilog = f""" .. |python_version_literal| replace:: ``Python {version}`` """ -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: +# There are two options for replacing |today|. Either, you set today to some +# non-false value and use it. today = '' -# Else, today_fmt is used as the format for a strftime call. +# Or else, today_fmt is used as the format for a strftime call. today_fmt = '%B %d, %Y' # By default, highlight as Python 3. highlight_language = 'python3' # Minimum version of sphinx required -needs_sphinx = '4.2' +needs_sphinx = '7.2.6' # Create table of contents entries for domain objects (e.g. functions, classes, # attributes, etc.). Default is True. -toc_object_entries = False +toc_object_entries = True +# Hide parents to tidy up long entries in sidebar +toc_object_entries_show_parents = 'hide' # Ignore any .rst files in the includes/ directory; -# they're embedded in pages but not rendered individually. +# they're embedded in pages but not rendered as individual pages. # Ignore any .rst files in the venv/ directory. exclude_patterns = ['includes/*.rst', 'venv/*', 'README.rst'] venvdir = os.getenv('VENVDIR') @@ -166,6 +178,7 @@ ('envvar', 'LC_TIME'), ('envvar', 'LINES'), ('envvar', 'LOGNAME'), + ('envvar', 'MANPAGER'), ('envvar', 'PAGER'), ('envvar', 'PATH'), ('envvar', 'PATHEXT'), @@ -256,6 +269,9 @@ ('c:data', 'PyExc_UnicodeWarning'), ('c:data', 'PyExc_UserWarning'), ('c:data', 'PyExc_Warning'), + # Undocumented public C macros + ('c:macro', 'Py_BUILD_ASSERT'), + ('c:macro', 'Py_BUILD_ASSERT_EXPR'), # Do not error nit-picky mode builds when _SubParsersAction.add_parser cannot # be resolved, as the method is currently undocumented. For context, see # https://github.com/python/cpython/pull/103289. @@ -280,7 +296,8 @@ # Disable Docutils smartquotes for several translations smartquotes_excludes = { - 'languages': ['ja', 'fr', 'zh_TW', 'zh_CN'], 'builders': ['man', 'text'], + 'languages': ['ja', 'fr', 'zh_TW', 'zh_CN'], + 'builders': ['man', 'text'], } # Avoid a warning with Sphinx >= 4.0 @@ -289,23 +306,27 @@ # Allow translation of index directives gettext_additional_targets = [ 'index', + 'literal-block', ] # Options for HTML output # ----------------------- -# Use our custom theme. +# Use our custom theme: https://github.com/python/python-docs-theme html_theme = 'python_docs_theme' +# Location of overrides for theme templates and static files html_theme_path = ['tools'] html_theme_options = { 'collapsiblesidebar': True, 'issues_url': '/bugs.html', 'license_url': '/license.html', - 'root_include_title': False # We use the version switcher instead. + 'root_include_title': False, # We use the version switcher instead. } if os.getenv("READTHEDOCS"): - html_theme_options["hosted_on"] = 'Read the Docs' + html_theme_options["hosted_on"] = ( + 'Read the Docs' + ) # Override stylesheet fingerprinting for Windows CHM htmlhelp to fix GH-91207 # https://github.com/python/cpython/issues/91207 @@ -319,17 +340,27 @@ # Deployment preview information # (See .readthedocs.yml and https://docs.readthedocs.io/en/stable/reference/environment-variables.html) -repository_url = os.getenv("READTHEDOCS_GIT_CLONE_URL") +is_deployment_preview = os.getenv("READTHEDOCS_VERSION_TYPE") == "external" +repository_url = os.getenv("READTHEDOCS_GIT_CLONE_URL", "") +repository_url = repository_url.removesuffix(".git") html_context = { - "is_deployment_preview": os.getenv("READTHEDOCS_VERSION_TYPE") == "external", - "repository_url": repository_url.removesuffix(".git") if repository_url else None, - "pr_id": os.getenv("READTHEDOCS_VERSION") + "is_deployment_preview": is_deployment_preview, + "repository_url": repository_url or None, + "pr_id": os.getenv("READTHEDOCS_VERSION"), + "enable_analytics": os.getenv("PYTHON_DOCS_ENABLE_ANALYTICS"), } # This 'Last updated on:' timestamp is inserted at the bottom of every page. -html_last_updated_fmt = time.strftime('%b %d, %Y (%H:%M UTC)', time.gmtime()) +html_last_updated_fmt = '%b %d, %Y (%H:%M UTC)' +if sphinx.version_info[:2] >= (8, 1): + html_last_updated_use_utc = True +else: + html_time = int(os.environ.get('SOURCE_DATE_EPOCH', time.time())) + html_last_updated_fmt = time.strftime( + html_last_updated_fmt, time.gmtime(html_time) + ) -# Path to find HTML templates. +# Path to find HTML templates to override theme templates_path = ['tools/templates'] # Custom sidebar templates, filenames relative to this file. @@ -377,8 +408,8 @@ \let\endVerbatim=\endOriginalVerbatim \setcounter{tocdepth}{2} ''', - # The paper size ('letter' or 'a4'). - 'papersize': 'a4', + # The paper size ('letterpaper' or 'a4paper'). + 'papersize': 'a4paper', # The font size ('10pt', '11pt' or '12pt'). 'pointsize': '10pt', } @@ -387,30 +418,70 @@ # (source start file, target name, title, author, document class [howto/manual]). _stdauthor = 'Guido van Rossum and the Python development team' latex_documents = [ - ('c-api/index', 'c-api.tex', - 'The Python/C API', _stdauthor, 'manual'), - ('extending/index', 'extending.tex', - 'Extending and Embedding Python', _stdauthor, 'manual'), - ('installing/index', 'installing.tex', - 'Installing Python Modules', _stdauthor, 'manual'), - ('library/index', 'library.tex', - 'The Python Library Reference', _stdauthor, 'manual'), - ('reference/index', 'reference.tex', - 'The Python Language Reference', _stdauthor, 'manual'), - ('tutorial/index', 'tutorial.tex', - 'Python Tutorial', _stdauthor, 'manual'), - ('using/index', 'using.tex', - 'Python Setup and Usage', _stdauthor, 'manual'), - ('faq/index', 'faq.tex', - 'Python Frequently Asked Questions', _stdauthor, 'manual'), - ('whatsnew/' + version, 'whatsnew.tex', - 'What\'s New in Python', 'A. M. Kuchling', 'howto'), + ('c-api/index', 'c-api.tex', 'The Python/C API', _stdauthor, 'manual'), + ( + 'extending/index', + 'extending.tex', + 'Extending and Embedding Python', + _stdauthor, + 'manual', + ), + ( + 'installing/index', + 'installing.tex', + 'Installing Python Modules', + _stdauthor, + 'manual', + ), + ( + 'library/index', + 'library.tex', + 'The Python Library Reference', + _stdauthor, + 'manual', + ), + ( + 'reference/index', + 'reference.tex', + 'The Python Language Reference', + _stdauthor, + 'manual', + ), + ( + 'tutorial/index', + 'tutorial.tex', + 'Python Tutorial', + _stdauthor, + 'manual', + ), + ( + 'using/index', + 'using.tex', + 'Python Setup and Usage', + _stdauthor, + 'manual', + ), + ( + 'faq/index', + 'faq.tex', + 'Python Frequently Asked Questions', + _stdauthor, + 'manual', + ), + ( + 'whatsnew/' + version, + 'whatsnew.tex', + 'What\'s New in Python', + 'A. M. Kuchling', + 'howto', + ), ] # Collect all HOWTOs individually -latex_documents.extend(('howto/' + fn[:-4], 'howto-' + fn[:-4] + '.tex', - '', _stdauthor, 'howto') - for fn in os.listdir('howto') - if fn.endswith('.rst') and fn != 'index.rst') +latex_documents.extend( + ('howto/' + fn[:-4], 'howto-' + fn[:-4] + '.tex', '', _stdauthor, 'howto') + for fn in os.listdir('howto') + if fn.endswith('.rst') and fn != 'index.rst' +) # Documents to append as an appendix to all manuals. latex_appendices = ['glossary', 'about', 'license', 'copyright'] @@ -439,8 +510,7 @@ 'test($|_)', ] -coverage_ignore_classes = [ -] +coverage_ignore_classes = [] # Glob patterns for C source files for C API coverage, relative to this directory. coverage_c_path = [ @@ -457,7 +527,7 @@ # The coverage checker will ignore all C items whose names match these regexes # (using re.match) -- the keys must be the same as in coverage_c_regexes. coverage_ignore_c_items = { -# 'cfunction': [...] + # 'cfunction': [...] } @@ -479,9 +549,15 @@ r'https://msdn.microsoft.com/.*': 'https://learn.microsoft.com/.*', r'https://docs.microsoft.com/.*': 'https://learn.microsoft.com/.*', r'https://go.microsoft.com/fwlink/\?LinkID=\d+': 'https://learn.microsoft.com/.*', + # Debian's man page redirects to its current stable version + r'https://manpages.debian.org/\w+\(\d(\w+)?\)': r'https://manpages.debian.org/\w+/[\w/\-\.]*\.\d(\w+)?\.en\.html', # Language redirects r'https://toml.io': 'https://toml.io/en/', r'https://www.redhat.com': 'https://www.redhat.com/en', + # pypi.org project name normalization (upper to lowercase, underscore to hyphen) + r'https://pypi.org/project/[A-Za-z\d_\-\.]+/': r'https://pypi.org/project/[a-z\d\-\.]+/', + # Discourse title name expansion (text changes when title is edited) + r'https://discuss\.python\.org/t/\d+': r'https://discuss\.python\.org/t/.*/\d+', # Other redirects r'https://www.boost.org/libs/.+': r'https://www.boost.org/doc/libs/\d_\d+_\d/.+', r'https://support.microsoft.com/en-us/help/\d+': 'https://support.microsoft.com/en-us/topic/.+', @@ -515,21 +591,31 @@ # mapping unique short aliases to a base URL and a prefix. # https://www.sphinx-doc.org/en/master/usage/extensions/extlinks.html extlinks = { - "cve": ("https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-%s", "CVE-%s"), - "cwe": ("https://cwe.mitre.org/data/definitions/%s.html", "CWE-%s"), "pypi": ("https://pypi.org/project/%s/", "%s"), "source": (SOURCE_URI, "%s"), } extlinks_detect_hardcoded_links = True -# Options for extensions -# ---------------------- +if sphinx.version_info[:2] < (8, 1): + # Sphinx 8.1 has in-built CVE and CWE roles. + extlinks |= { + "cve": ( + "https://www.cve.org/CVERecord?id=CVE-%s", + "CVE-%s", + ), + "cwe": ("https://cwe.mitre.org/data/definitions/%s.html", "CWE-%s"), + } + +# Options for c_annotations extension +# ----------------------------------- # Relative filename of the data files refcount_file = 'data/refcounts.dat' stable_abi_file = 'data/stable_abi.dat' -# sphinxext-opengraph config +# Options for sphinxext-opengraph +# ------------------------------- + ogp_site_url = 'https://docs.python.org/3/' ogp_site_name = 'Python documentation' ogp_image = '_static/og-image.png' diff --git a/Doc/constraints.txt b/Doc/constraints.txt index 16b735ea..26ac1862 100644 --- a/Doc/constraints.txt +++ b/Doc/constraints.txt @@ -7,18 +7,20 @@ # Direct dependencies of Sphinx babel<3 colorama<0.5 -imagesize<1.5 -Jinja2<3.2 -packaging<24 -Pygments>=2.16.1,<3 +imagesize<2 +Jinja2<4 +packaging<25 +Pygments<3 requests<3 snowballstemmer<3 -sphinxcontrib-applehelp<1.0.5 -sphinxcontrib-devhelp<1.0.6 -sphinxcontrib-htmlhelp<2.0.5 -sphinxcontrib-jsmath<1.1 -sphinxcontrib-qthelp<1.0.7 -sphinxcontrib-serializinghtml<1.1.10 +# keep lower-bounds until Sphinx 8.1 is released +# https://github.com/sphinx-doc/sphinx/pull/12756 +sphinxcontrib-applehelp>=1.0.7,<3 +sphinxcontrib-devhelp>=1.0.6,<3 +sphinxcontrib-htmlhelp>=2.0.6,<3 +sphinxcontrib-jsmath>=1.0.1,<2 +sphinxcontrib-qthelp>=1.0.6,<3 +sphinxcontrib-serializinghtml>=1.1.9,<3 # Direct dependencies of Jinja2 (Jinja is a dependency of Sphinx, see above) -MarkupSafe<2.2 +MarkupSafe<3 diff --git a/Doc/contents.rst b/Doc/contents.rst index 24ceacb0..b57f4b09 100644 --- a/Doc/contents.rst +++ b/Doc/contents.rst @@ -14,6 +14,7 @@ installing/index.rst howto/index.rst faq/index.rst + deprecations/index.rst glossary.rst about.rst diff --git a/Doc/data/python3.12.abi b/Doc/data/python3.12.abi index 95dfe64a..875e875a 100644 --- a/Doc/data/python3.12.abi +++ b/Doc/data/python3.12.abi @@ -1,26571 +1,23619 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Doc/data/refcounts.dat b/Doc/data/refcounts.dat index b5d95324..28532620 100644 --- a/Doc/data/refcounts.dat +++ b/Doc/data/refcounts.dat @@ -180,7 +180,7 @@ PyCapsule_IsValid:const char*:name:: PyCapsule_New:PyObject*::+1: PyCapsule_New:void*:pointer:: PyCapsule_New:const char *:name:: -PyCapsule_New::void (* destructor)(PyObject* ):: +PyCapsule_New:void (*)(PyObject *):destructor:: PyCapsule_SetContext:int::: PyCapsule_SetContext:PyObject*:self:0: @@ -349,11 +349,11 @@ PyComplex_CheckExact:int::: PyComplex_CheckExact:PyObject*:p:0: PyComplex_FromCComplex:PyObject*::+1: -PyComplex_FromCComplex::Py_complex v:: +PyComplex_FromCComplex:Py_complex:v:: PyComplex_FromDoubles:PyObject*::+1: -PyComplex_FromDoubles::double real:: -PyComplex_FromDoubles::double imag:: +PyComplex_FromDoubles:double:real:: +PyComplex_FromDoubles:double:imag:: PyComplex_ImagAsDouble:double::: PyComplex_ImagAsDouble:PyObject*:op:0: @@ -622,7 +622,9 @@ PyErr_GetExcInfo:PyObject**:pvalue:+1: PyErr_GetExcInfo:PyObject**:ptraceback:+1: PyErr_GetRaisedException:PyObject*::+1: -PyErr_SetRaisedException:::: + +PyErr_SetRaisedException:void::: +PyErr_SetRaisedException:PyObject *:exc:0:stolen PyErr_GivenExceptionMatches:int::: PyErr_GivenExceptionMatches:PyObject*:given:0: @@ -642,9 +644,9 @@ PyErr_NewExceptionWithDoc:PyObject*:dict:0: PyErr_NoMemory:PyObject*::null: PyErr_NormalizeException:void::: -PyErr_NormalizeException:PyObject**:exc::??? -PyErr_NormalizeException:PyObject**:val::??? -PyErr_NormalizeException:PyObject**:tb::??? +PyErr_NormalizeException:PyObject**:exc:+1:??? +PyErr_NormalizeException:PyObject**:val:+1:??? +PyErr_NormalizeException:PyObject**:tb:+1:??? PyErr_Occurred:PyObject*::0: @@ -1268,7 +1270,7 @@ PyMapping_GetItemString:const char*:key:: PyMapping_HasKey:int::: PyMapping_HasKey:PyObject*:o:0: -PyMapping_HasKey:PyObject*:key:: +PyMapping_HasKey:PyObject*:key:0: PyMapping_HasKeyString:int::: PyMapping_HasKeyString:PyObject*:o:0: @@ -1428,7 +1430,7 @@ PyModule_GetState:void*::: PyModule_GetState:PyObject*:module:0: PyModule_New:PyObject*::+1: -PyModule_New::char* name:: +PyModule_New:char*:name:: PyModule_NewObject:PyObject*::+1: PyModule_NewObject:PyObject*:name:+1: @@ -1438,7 +1440,7 @@ PyModule_SetDocString:PyObject*:module:0: PyModule_SetDocString:const char*:docstring:: PyModuleDef_Init:PyObject*::0: -PyModuleDef_Init:PyModuleDef*:def:0: +PyModuleDef_Init:PyModuleDef*:def:: PyNumber_Absolute:PyObject*::+1: PyNumber_Absolute:PyObject*:o:0: @@ -1950,10 +1952,10 @@ PyRun_StringFlags:PyObject*:locals:0: PyRun_StringFlags:PyCompilerFlags*:flags:: PySeqIter_Check:int::: -PySeqIter_Check::op:: +PySeqIter_Check:PyObject *:op:0: PySeqIter_New:PyObject*::+1: -PySeqIter_New:PyObject*:seq:: +PySeqIter_New:PyObject*:seq:0: PySequence_Check:int::: PySequence_Check:PyObject*:o:0: @@ -2393,7 +2395,7 @@ PyUnicode_GET_DATA_SIZE:PyObject*:o:0: PyUnicode_KIND:int::: PyUnicode_KIND:PyObject*:o:0: -PyUnicode_MAX_CHAR_VALUE:::: +PyUnicode_MAX_CHAR_VALUE:Py_UCS4::: PyUnicode_MAX_CHAR_VALUE:PyObject*:o:0: PyUnicode_AS_UNICODE:Py_UNICODE*::: @@ -2480,7 +2482,7 @@ PyUnicode_FromWideChar:const wchar_t*:w:: PyUnicode_FromWideChar:Py_ssize_t:size:: PyUnicode_AsWideChar:Py_ssize_t::: -PyUnicode_AsWideChar:PyObject*:*unicode:0: +PyUnicode_AsWideChar:PyObject*:unicode:0: PyUnicode_AsWideChar:wchar_t*:w:: PyUnicode_AsWideChar:Py_ssize_t:size:: @@ -2533,7 +2535,7 @@ PyUnicode_AsUTF8String:PyObject*:unicode:0: PyUnicode_AsUTF8AndSize:const char*::: PyUnicode_AsUTF8AndSize:PyObject*:unicode:0: -PyUnicode_AsUTF8AndSize:Py_ssize_t*:size:0: +PyUnicode_AsUTF8AndSize:Py_ssize_t*:size:: PyUnicode_AsUTF8:const char*::: PyUnicode_AsUTF8:PyObject*:unicode:0: @@ -2856,13 +2858,13 @@ PyUnicodeDecodeError_SetStart:PyObject*:exc:0: PyUnicodeDecodeError_SetStart:Py_ssize_t:start:: PyWeakref_Check:int::: -PyWeakref_Check:PyObject*:ob:: +PyWeakref_Check:PyObject*:ob:0: PyWeakref_CheckProxy:int::: -PyWeakref_CheckProxy:PyObject*:ob:: +PyWeakref_CheckProxy:PyObject*:ob:0: PyWeakref_CheckRef:int::: -PyWeakref_CheckRef:PyObject*:ob:: +PyWeakref_CheckRef:PyObject*:ob:0: PyWeakref_GET_OBJECT:PyObject*::0: PyWeakref_GET_OBJECT:PyObject*:ref:0: diff --git a/Doc/data/stable_abi.dat b/Doc/data/stable_abi.dat index f112d268..4aa2b351 100644 --- a/Doc/data/stable_abi.dat +++ b/Doc/data/stable_abi.dat @@ -1,868 +1,868 @@ role,name,added,ifdef_note,struct_abi_kind macro,PY_VECTORCALL_ARGUMENTS_OFFSET,3.12,, -function,PyAIter_Check,3.10,, -function,PyArg_Parse,3.2,, -function,PyArg_ParseTuple,3.2,, -function,PyArg_ParseTupleAndKeywords,3.2,, -function,PyArg_UnpackTuple,3.2,, -function,PyArg_VaParse,3.2,, -function,PyArg_VaParseTupleAndKeywords,3.2,, -function,PyArg_ValidateKeywordArguments,3.2,, -var,PyBaseObject_Type,3.2,, -function,PyBool_FromLong,3.2,, -var,PyBool_Type,3.2,, -function,PyBuffer_FillContiguousStrides,3.11,, -function,PyBuffer_FillInfo,3.11,, -function,PyBuffer_FromContiguous,3.11,, -function,PyBuffer_GetPointer,3.11,, -function,PyBuffer_IsContiguous,3.11,, -function,PyBuffer_Release,3.11,, -function,PyBuffer_SizeFromFormat,3.11,, -function,PyBuffer_ToContiguous,3.11,, -var,PyByteArrayIter_Type,3.2,, -function,PyByteArray_AsString,3.2,, -function,PyByteArray_Concat,3.2,, -function,PyByteArray_FromObject,3.2,, -function,PyByteArray_FromStringAndSize,3.2,, -function,PyByteArray_Resize,3.2,, -function,PyByteArray_Size,3.2,, -var,PyByteArray_Type,3.2,, -var,PyBytesIter_Type,3.2,, -function,PyBytes_AsString,3.2,, -function,PyBytes_AsStringAndSize,3.2,, -function,PyBytes_Concat,3.2,, -function,PyBytes_ConcatAndDel,3.2,, -function,PyBytes_DecodeEscape,3.2,, -function,PyBytes_FromFormat,3.2,, -function,PyBytes_FromFormatV,3.2,, -function,PyBytes_FromObject,3.2,, -function,PyBytes_FromString,3.2,, -function,PyBytes_FromStringAndSize,3.2,, -function,PyBytes_Repr,3.2,, -function,PyBytes_Size,3.2,, -var,PyBytes_Type,3.2,, +func,PyAIter_Check,3.10,, +func,PyArg_Parse,3.2,, +func,PyArg_ParseTuple,3.2,, +func,PyArg_ParseTupleAndKeywords,3.2,, +func,PyArg_UnpackTuple,3.2,, +func,PyArg_VaParse,3.2,, +func,PyArg_VaParseTupleAndKeywords,3.2,, +func,PyArg_ValidateKeywordArguments,3.2,, +data,PyBaseObject_Type,3.2,, +func,PyBool_FromLong,3.2,, +data,PyBool_Type,3.2,, +func,PyBuffer_FillContiguousStrides,3.11,, +func,PyBuffer_FillInfo,3.11,, +func,PyBuffer_FromContiguous,3.11,, +func,PyBuffer_GetPointer,3.11,, +func,PyBuffer_IsContiguous,3.11,, +func,PyBuffer_Release,3.11,, +func,PyBuffer_SizeFromFormat,3.11,, +func,PyBuffer_ToContiguous,3.11,, +data,PyByteArrayIter_Type,3.2,, +func,PyByteArray_AsString,3.2,, +func,PyByteArray_Concat,3.2,, +func,PyByteArray_FromObject,3.2,, +func,PyByteArray_FromStringAndSize,3.2,, +func,PyByteArray_Resize,3.2,, +func,PyByteArray_Size,3.2,, +data,PyByteArray_Type,3.2,, +data,PyBytesIter_Type,3.2,, +func,PyBytes_AsString,3.2,, +func,PyBytes_AsStringAndSize,3.2,, +func,PyBytes_Concat,3.2,, +func,PyBytes_ConcatAndDel,3.2,, +func,PyBytes_DecodeEscape,3.2,, +func,PyBytes_FromFormat,3.2,, +func,PyBytes_FromFormatV,3.2,, +func,PyBytes_FromObject,3.2,, +func,PyBytes_FromString,3.2,, +func,PyBytes_FromStringAndSize,3.2,, +func,PyBytes_Repr,3.2,, +func,PyBytes_Size,3.2,, +data,PyBytes_Type,3.2,, type,PyCFunction,3.2,, type,PyCFunctionWithKeywords,3.2,, -function,PyCFunction_Call,3.2,, -function,PyCFunction_GetFlags,3.2,, -function,PyCFunction_GetFunction,3.2,, -function,PyCFunction_GetSelf,3.2,, -function,PyCFunction_New,3.4,, -function,PyCFunction_NewEx,3.2,, -var,PyCFunction_Type,3.2,, -function,PyCMethod_New,3.9,, -function,PyCallIter_New,3.2,, -var,PyCallIter_Type,3.2,, -function,PyCallable_Check,3.2,, +func,PyCFunction_Call,3.2,, +func,PyCFunction_GetFlags,3.2,, +func,PyCFunction_GetFunction,3.2,, +func,PyCFunction_GetSelf,3.2,, +func,PyCFunction_New,3.4,, +func,PyCFunction_NewEx,3.2,, +data,PyCFunction_Type,3.2,, +func,PyCMethod_New,3.9,, +func,PyCallIter_New,3.2,, +data,PyCallIter_Type,3.2,, +func,PyCallable_Check,3.2,, type,PyCapsule_Destructor,3.2,, -function,PyCapsule_GetContext,3.2,, -function,PyCapsule_GetDestructor,3.2,, -function,PyCapsule_GetName,3.2,, -function,PyCapsule_GetPointer,3.2,, -function,PyCapsule_Import,3.2,, -function,PyCapsule_IsValid,3.2,, -function,PyCapsule_New,3.2,, -function,PyCapsule_SetContext,3.2,, -function,PyCapsule_SetDestructor,3.2,, -function,PyCapsule_SetName,3.2,, -function,PyCapsule_SetPointer,3.2,, -var,PyCapsule_Type,3.2,, -var,PyClassMethodDescr_Type,3.2,, -function,PyCodec_BackslashReplaceErrors,3.2,, -function,PyCodec_Decode,3.2,, -function,PyCodec_Decoder,3.2,, -function,PyCodec_Encode,3.2,, -function,PyCodec_Encoder,3.2,, -function,PyCodec_IgnoreErrors,3.2,, -function,PyCodec_IncrementalDecoder,3.2,, -function,PyCodec_IncrementalEncoder,3.2,, -function,PyCodec_KnownEncoding,3.2,, -function,PyCodec_LookupError,3.2,, -function,PyCodec_NameReplaceErrors,3.7,, -function,PyCodec_Register,3.2,, -function,PyCodec_RegisterError,3.2,, -function,PyCodec_ReplaceErrors,3.2,, -function,PyCodec_StreamReader,3.2,, -function,PyCodec_StreamWriter,3.2,, -function,PyCodec_StrictErrors,3.2,, -function,PyCodec_Unregister,3.10,, -function,PyCodec_XMLCharRefReplaceErrors,3.2,, -function,PyComplex_FromDoubles,3.2,, -function,PyComplex_ImagAsDouble,3.2,, -function,PyComplex_RealAsDouble,3.2,, -var,PyComplex_Type,3.2,, -function,PyDescr_NewClassMethod,3.2,, -function,PyDescr_NewGetSet,3.2,, -function,PyDescr_NewMember,3.2,, -function,PyDescr_NewMethod,3.2,, -var,PyDictItems_Type,3.2,, -var,PyDictIterItem_Type,3.2,, -var,PyDictIterKey_Type,3.2,, -var,PyDictIterValue_Type,3.2,, -var,PyDictKeys_Type,3.2,, -function,PyDictProxy_New,3.2,, -var,PyDictProxy_Type,3.2,, -var,PyDictRevIterItem_Type,3.8,, -var,PyDictRevIterKey_Type,3.8,, -var,PyDictRevIterValue_Type,3.8,, -var,PyDictValues_Type,3.2,, -function,PyDict_Clear,3.2,, -function,PyDict_Contains,3.2,, -function,PyDict_Copy,3.2,, -function,PyDict_DelItem,3.2,, -function,PyDict_DelItemString,3.2,, -function,PyDict_GetItem,3.2,, -function,PyDict_GetItemString,3.2,, -function,PyDict_GetItemWithError,3.2,, -function,PyDict_Items,3.2,, -function,PyDict_Keys,3.2,, -function,PyDict_Merge,3.2,, -function,PyDict_MergeFromSeq2,3.2,, -function,PyDict_New,3.2,, -function,PyDict_Next,3.2,, -function,PyDict_SetItem,3.2,, -function,PyDict_SetItemString,3.2,, -function,PyDict_Size,3.2,, -var,PyDict_Type,3.2,, -function,PyDict_Update,3.2,, -function,PyDict_Values,3.2,, -var,PyEllipsis_Type,3.2,, -var,PyEnum_Type,3.2,, -function,PyErr_BadArgument,3.2,, -function,PyErr_BadInternalCall,3.2,, -function,PyErr_CheckSignals,3.2,, -function,PyErr_Clear,3.2,, -function,PyErr_Display,3.2,, -function,PyErr_DisplayException,3.12,, -function,PyErr_ExceptionMatches,3.2,, -function,PyErr_Fetch,3.2,, -function,PyErr_Format,3.2,, -function,PyErr_FormatV,3.5,, -function,PyErr_GetExcInfo,3.7,, -function,PyErr_GetHandledException,3.11,, -function,PyErr_GetRaisedException,3.12,, -function,PyErr_GivenExceptionMatches,3.2,, -function,PyErr_NewException,3.2,, -function,PyErr_NewExceptionWithDoc,3.2,, -function,PyErr_NoMemory,3.2,, -function,PyErr_NormalizeException,3.2,, -function,PyErr_Occurred,3.2,, -function,PyErr_Print,3.2,, -function,PyErr_PrintEx,3.2,, -function,PyErr_ProgramText,3.2,, -function,PyErr_ResourceWarning,3.6,, -function,PyErr_Restore,3.2,, -function,PyErr_SetExcFromWindowsErr,3.7,on Windows, -function,PyErr_SetExcFromWindowsErrWithFilename,3.7,on Windows, -function,PyErr_SetExcFromWindowsErrWithFilenameObject,3.7,on Windows, -function,PyErr_SetExcFromWindowsErrWithFilenameObjects,3.7,on Windows, -function,PyErr_SetExcInfo,3.7,, -function,PyErr_SetFromErrno,3.2,, -function,PyErr_SetFromErrnoWithFilename,3.2,, -function,PyErr_SetFromErrnoWithFilenameObject,3.2,, -function,PyErr_SetFromErrnoWithFilenameObjects,3.7,, -function,PyErr_SetFromWindowsErr,3.7,on Windows, -function,PyErr_SetFromWindowsErrWithFilename,3.7,on Windows, -function,PyErr_SetHandledException,3.11,, -function,PyErr_SetImportError,3.7,, -function,PyErr_SetImportErrorSubclass,3.6,, -function,PyErr_SetInterrupt,3.2,, -function,PyErr_SetInterruptEx,3.10,, -function,PyErr_SetNone,3.2,, -function,PyErr_SetObject,3.2,, -function,PyErr_SetRaisedException,3.12,, -function,PyErr_SetString,3.2,, -function,PyErr_SyntaxLocation,3.2,, -function,PyErr_SyntaxLocationEx,3.7,, -function,PyErr_WarnEx,3.2,, -function,PyErr_WarnExplicit,3.2,, -function,PyErr_WarnFormat,3.2,, -function,PyErr_WriteUnraisable,3.2,, -function,PyEval_AcquireLock,3.2,, -function,PyEval_AcquireThread,3.2,, -function,PyEval_CallFunction,3.2,, -function,PyEval_CallMethod,3.2,, -function,PyEval_CallObjectWithKeywords,3.2,, -function,PyEval_EvalCode,3.2,, -function,PyEval_EvalCodeEx,3.2,, -function,PyEval_EvalFrame,3.2,, -function,PyEval_EvalFrameEx,3.2,, -function,PyEval_GetBuiltins,3.2,, -function,PyEval_GetFrame,3.2,, -function,PyEval_GetFuncDesc,3.2,, -function,PyEval_GetFuncName,3.2,, -function,PyEval_GetGlobals,3.2,, -function,PyEval_GetLocals,3.2,, -function,PyEval_InitThreads,3.2,, -function,PyEval_ReleaseLock,3.2,, -function,PyEval_ReleaseThread,3.2,, -function,PyEval_RestoreThread,3.2,, -function,PyEval_SaveThread,3.2,, -function,PyEval_ThreadsInitialized,3.2,, -var,PyExc_ArithmeticError,3.2,, -var,PyExc_AssertionError,3.2,, -var,PyExc_AttributeError,3.2,, -var,PyExc_BaseException,3.2,, -var,PyExc_BaseExceptionGroup,3.11,, -var,PyExc_BlockingIOError,3.7,, -var,PyExc_BrokenPipeError,3.7,, -var,PyExc_BufferError,3.2,, -var,PyExc_BytesWarning,3.2,, -var,PyExc_ChildProcessError,3.7,, -var,PyExc_ConnectionAbortedError,3.7,, -var,PyExc_ConnectionError,3.7,, -var,PyExc_ConnectionRefusedError,3.7,, -var,PyExc_ConnectionResetError,3.7,, -var,PyExc_DeprecationWarning,3.2,, -var,PyExc_EOFError,3.2,, -var,PyExc_EncodingWarning,3.10,, -var,PyExc_EnvironmentError,3.2,, -var,PyExc_Exception,3.2,, -var,PyExc_FileExistsError,3.7,, -var,PyExc_FileNotFoundError,3.7,, -var,PyExc_FloatingPointError,3.2,, -var,PyExc_FutureWarning,3.2,, -var,PyExc_GeneratorExit,3.2,, -var,PyExc_IOError,3.2,, -var,PyExc_ImportError,3.2,, -var,PyExc_ImportWarning,3.2,, -var,PyExc_IndentationError,3.2,, -var,PyExc_IndexError,3.2,, -var,PyExc_InterruptedError,3.7,, -var,PyExc_IsADirectoryError,3.7,, -var,PyExc_KeyError,3.2,, -var,PyExc_KeyboardInterrupt,3.2,, -var,PyExc_LookupError,3.2,, -var,PyExc_MemoryError,3.2,, -var,PyExc_ModuleNotFoundError,3.6,, -var,PyExc_NameError,3.2,, -var,PyExc_NotADirectoryError,3.7,, -var,PyExc_NotImplementedError,3.2,, -var,PyExc_OSError,3.2,, -var,PyExc_OverflowError,3.2,, -var,PyExc_PendingDeprecationWarning,3.2,, -var,PyExc_PermissionError,3.7,, -var,PyExc_ProcessLookupError,3.7,, -var,PyExc_RecursionError,3.7,, -var,PyExc_ReferenceError,3.2,, -var,PyExc_ResourceWarning,3.7,, -var,PyExc_RuntimeError,3.2,, -var,PyExc_RuntimeWarning,3.2,, -var,PyExc_StopAsyncIteration,3.7,, -var,PyExc_StopIteration,3.2,, -var,PyExc_SyntaxError,3.2,, -var,PyExc_SyntaxWarning,3.2,, -var,PyExc_SystemError,3.2,, -var,PyExc_SystemExit,3.2,, -var,PyExc_TabError,3.2,, -var,PyExc_TimeoutError,3.7,, -var,PyExc_TypeError,3.2,, -var,PyExc_UnboundLocalError,3.2,, -var,PyExc_UnicodeDecodeError,3.2,, -var,PyExc_UnicodeEncodeError,3.2,, -var,PyExc_UnicodeError,3.2,, -var,PyExc_UnicodeTranslateError,3.2,, -var,PyExc_UnicodeWarning,3.2,, -var,PyExc_UserWarning,3.2,, -var,PyExc_ValueError,3.2,, -var,PyExc_Warning,3.2,, -var,PyExc_WindowsError,3.7,on Windows, -var,PyExc_ZeroDivisionError,3.2,, -function,PyExceptionClass_Name,3.8,, -function,PyException_GetArgs,3.12,, -function,PyException_GetCause,3.2,, -function,PyException_GetContext,3.2,, -function,PyException_GetTraceback,3.2,, -function,PyException_SetArgs,3.12,, -function,PyException_SetCause,3.2,, -function,PyException_SetContext,3.2,, -function,PyException_SetTraceback,3.2,, -function,PyFile_FromFd,3.2,, -function,PyFile_GetLine,3.2,, -function,PyFile_WriteObject,3.2,, -function,PyFile_WriteString,3.2,, -var,PyFilter_Type,3.2,, -function,PyFloat_AsDouble,3.2,, -function,PyFloat_FromDouble,3.2,, -function,PyFloat_FromString,3.2,, -function,PyFloat_GetInfo,3.2,, -function,PyFloat_GetMax,3.2,, -function,PyFloat_GetMin,3.2,, -var,PyFloat_Type,3.2,, +func,PyCapsule_GetContext,3.2,, +func,PyCapsule_GetDestructor,3.2,, +func,PyCapsule_GetName,3.2,, +func,PyCapsule_GetPointer,3.2,, +func,PyCapsule_Import,3.2,, +func,PyCapsule_IsValid,3.2,, +func,PyCapsule_New,3.2,, +func,PyCapsule_SetContext,3.2,, +func,PyCapsule_SetDestructor,3.2,, +func,PyCapsule_SetName,3.2,, +func,PyCapsule_SetPointer,3.2,, +data,PyCapsule_Type,3.2,, +data,PyClassMethodDescr_Type,3.2,, +func,PyCodec_BackslashReplaceErrors,3.2,, +func,PyCodec_Decode,3.2,, +func,PyCodec_Decoder,3.2,, +func,PyCodec_Encode,3.2,, +func,PyCodec_Encoder,3.2,, +func,PyCodec_IgnoreErrors,3.2,, +func,PyCodec_IncrementalDecoder,3.2,, +func,PyCodec_IncrementalEncoder,3.2,, +func,PyCodec_KnownEncoding,3.2,, +func,PyCodec_LookupError,3.2,, +func,PyCodec_NameReplaceErrors,3.7,, +func,PyCodec_Register,3.2,, +func,PyCodec_RegisterError,3.2,, +func,PyCodec_ReplaceErrors,3.2,, +func,PyCodec_StreamReader,3.2,, +func,PyCodec_StreamWriter,3.2,, +func,PyCodec_StrictErrors,3.2,, +func,PyCodec_Unregister,3.10,, +func,PyCodec_XMLCharRefReplaceErrors,3.2,, +func,PyComplex_FromDoubles,3.2,, +func,PyComplex_ImagAsDouble,3.2,, +func,PyComplex_RealAsDouble,3.2,, +data,PyComplex_Type,3.2,, +func,PyDescr_NewClassMethod,3.2,, +func,PyDescr_NewGetSet,3.2,, +func,PyDescr_NewMember,3.2,, +func,PyDescr_NewMethod,3.2,, +data,PyDictItems_Type,3.2,, +data,PyDictIterItem_Type,3.2,, +data,PyDictIterKey_Type,3.2,, +data,PyDictIterValue_Type,3.2,, +data,PyDictKeys_Type,3.2,, +func,PyDictProxy_New,3.2,, +data,PyDictProxy_Type,3.2,, +data,PyDictRevIterItem_Type,3.8,, +data,PyDictRevIterKey_Type,3.8,, +data,PyDictRevIterValue_Type,3.8,, +data,PyDictValues_Type,3.2,, +func,PyDict_Clear,3.2,, +func,PyDict_Contains,3.2,, +func,PyDict_Copy,3.2,, +func,PyDict_DelItem,3.2,, +func,PyDict_DelItemString,3.2,, +func,PyDict_GetItem,3.2,, +func,PyDict_GetItemString,3.2,, +func,PyDict_GetItemWithError,3.2,, +func,PyDict_Items,3.2,, +func,PyDict_Keys,3.2,, +func,PyDict_Merge,3.2,, +func,PyDict_MergeFromSeq2,3.2,, +func,PyDict_New,3.2,, +func,PyDict_Next,3.2,, +func,PyDict_SetItem,3.2,, +func,PyDict_SetItemString,3.2,, +func,PyDict_Size,3.2,, +data,PyDict_Type,3.2,, +func,PyDict_Update,3.2,, +func,PyDict_Values,3.2,, +data,PyEllipsis_Type,3.2,, +data,PyEnum_Type,3.2,, +func,PyErr_BadArgument,3.2,, +func,PyErr_BadInternalCall,3.2,, +func,PyErr_CheckSignals,3.2,, +func,PyErr_Clear,3.2,, +func,PyErr_Display,3.2,, +func,PyErr_DisplayException,3.12,, +func,PyErr_ExceptionMatches,3.2,, +func,PyErr_Fetch,3.2,, +func,PyErr_Format,3.2,, +func,PyErr_FormatV,3.5,, +func,PyErr_GetExcInfo,3.7,, +func,PyErr_GetHandledException,3.11,, +func,PyErr_GetRaisedException,3.12,, +func,PyErr_GivenExceptionMatches,3.2,, +func,PyErr_NewException,3.2,, +func,PyErr_NewExceptionWithDoc,3.2,, +func,PyErr_NoMemory,3.2,, +func,PyErr_NormalizeException,3.2,, +func,PyErr_Occurred,3.2,, +func,PyErr_Print,3.2,, +func,PyErr_PrintEx,3.2,, +func,PyErr_ProgramText,3.2,, +func,PyErr_ResourceWarning,3.6,, +func,PyErr_Restore,3.2,, +func,PyErr_SetExcFromWindowsErr,3.7,on Windows, +func,PyErr_SetExcFromWindowsErrWithFilename,3.7,on Windows, +func,PyErr_SetExcFromWindowsErrWithFilenameObject,3.7,on Windows, +func,PyErr_SetExcFromWindowsErrWithFilenameObjects,3.7,on Windows, +func,PyErr_SetExcInfo,3.7,, +func,PyErr_SetFromErrno,3.2,, +func,PyErr_SetFromErrnoWithFilename,3.2,, +func,PyErr_SetFromErrnoWithFilenameObject,3.2,, +func,PyErr_SetFromErrnoWithFilenameObjects,3.7,, +func,PyErr_SetFromWindowsErr,3.7,on Windows, +func,PyErr_SetFromWindowsErrWithFilename,3.7,on Windows, +func,PyErr_SetHandledException,3.11,, +func,PyErr_SetImportError,3.7,, +func,PyErr_SetImportErrorSubclass,3.6,, +func,PyErr_SetInterrupt,3.2,, +func,PyErr_SetInterruptEx,3.10,, +func,PyErr_SetNone,3.2,, +func,PyErr_SetObject,3.2,, +func,PyErr_SetRaisedException,3.12,, +func,PyErr_SetString,3.2,, +func,PyErr_SyntaxLocation,3.2,, +func,PyErr_SyntaxLocationEx,3.7,, +func,PyErr_WarnEx,3.2,, +func,PyErr_WarnExplicit,3.2,, +func,PyErr_WarnFormat,3.2,, +func,PyErr_WriteUnraisable,3.2,, +func,PyEval_AcquireLock,3.2,, +func,PyEval_AcquireThread,3.2,, +func,PyEval_CallFunction,3.2,, +func,PyEval_CallMethod,3.2,, +func,PyEval_CallObjectWithKeywords,3.2,, +func,PyEval_EvalCode,3.2,, +func,PyEval_EvalCodeEx,3.2,, +func,PyEval_EvalFrame,3.2,, +func,PyEval_EvalFrameEx,3.2,, +func,PyEval_GetBuiltins,3.2,, +func,PyEval_GetFrame,3.2,, +func,PyEval_GetFuncDesc,3.2,, +func,PyEval_GetFuncName,3.2,, +func,PyEval_GetGlobals,3.2,, +func,PyEval_GetLocals,3.2,, +func,PyEval_InitThreads,3.2,, +func,PyEval_ReleaseLock,3.2,, +func,PyEval_ReleaseThread,3.2,, +func,PyEval_RestoreThread,3.2,, +func,PyEval_SaveThread,3.2,, +func,PyEval_ThreadsInitialized,3.2,, +data,PyExc_ArithmeticError,3.2,, +data,PyExc_AssertionError,3.2,, +data,PyExc_AttributeError,3.2,, +data,PyExc_BaseException,3.2,, +data,PyExc_BaseExceptionGroup,3.11,, +data,PyExc_BlockingIOError,3.7,, +data,PyExc_BrokenPipeError,3.7,, +data,PyExc_BufferError,3.2,, +data,PyExc_BytesWarning,3.2,, +data,PyExc_ChildProcessError,3.7,, +data,PyExc_ConnectionAbortedError,3.7,, +data,PyExc_ConnectionError,3.7,, +data,PyExc_ConnectionRefusedError,3.7,, +data,PyExc_ConnectionResetError,3.7,, +data,PyExc_DeprecationWarning,3.2,, +data,PyExc_EOFError,3.2,, +data,PyExc_EncodingWarning,3.10,, +data,PyExc_EnvironmentError,3.2,, +data,PyExc_Exception,3.2,, +data,PyExc_FileExistsError,3.7,, +data,PyExc_FileNotFoundError,3.7,, +data,PyExc_FloatingPointError,3.2,, +data,PyExc_FutureWarning,3.2,, +data,PyExc_GeneratorExit,3.2,, +data,PyExc_IOError,3.2,, +data,PyExc_ImportError,3.2,, +data,PyExc_ImportWarning,3.2,, +data,PyExc_IndentationError,3.2,, +data,PyExc_IndexError,3.2,, +data,PyExc_InterruptedError,3.7,, +data,PyExc_IsADirectoryError,3.7,, +data,PyExc_KeyError,3.2,, +data,PyExc_KeyboardInterrupt,3.2,, +data,PyExc_LookupError,3.2,, +data,PyExc_MemoryError,3.2,, +data,PyExc_ModuleNotFoundError,3.6,, +data,PyExc_NameError,3.2,, +data,PyExc_NotADirectoryError,3.7,, +data,PyExc_NotImplementedError,3.2,, +data,PyExc_OSError,3.2,, +data,PyExc_OverflowError,3.2,, +data,PyExc_PendingDeprecationWarning,3.2,, +data,PyExc_PermissionError,3.7,, +data,PyExc_ProcessLookupError,3.7,, +data,PyExc_RecursionError,3.7,, +data,PyExc_ReferenceError,3.2,, +data,PyExc_ResourceWarning,3.7,, +data,PyExc_RuntimeError,3.2,, +data,PyExc_RuntimeWarning,3.2,, +data,PyExc_StopAsyncIteration,3.7,, +data,PyExc_StopIteration,3.2,, +data,PyExc_SyntaxError,3.2,, +data,PyExc_SyntaxWarning,3.2,, +data,PyExc_SystemError,3.2,, +data,PyExc_SystemExit,3.2,, +data,PyExc_TabError,3.2,, +data,PyExc_TimeoutError,3.7,, +data,PyExc_TypeError,3.2,, +data,PyExc_UnboundLocalError,3.2,, +data,PyExc_UnicodeDecodeError,3.2,, +data,PyExc_UnicodeEncodeError,3.2,, +data,PyExc_UnicodeError,3.2,, +data,PyExc_UnicodeTranslateError,3.2,, +data,PyExc_UnicodeWarning,3.2,, +data,PyExc_UserWarning,3.2,, +data,PyExc_ValueError,3.2,, +data,PyExc_Warning,3.2,, +data,PyExc_WindowsError,3.7,on Windows, +data,PyExc_ZeroDivisionError,3.2,, +func,PyExceptionClass_Name,3.8,, +func,PyException_GetArgs,3.12,, +func,PyException_GetCause,3.2,, +func,PyException_GetContext,3.2,, +func,PyException_GetTraceback,3.2,, +func,PyException_SetArgs,3.12,, +func,PyException_SetCause,3.2,, +func,PyException_SetContext,3.2,, +func,PyException_SetTraceback,3.2,, +func,PyFile_FromFd,3.2,, +func,PyFile_GetLine,3.2,, +func,PyFile_WriteObject,3.2,, +func,PyFile_WriteString,3.2,, +data,PyFilter_Type,3.2,, +func,PyFloat_AsDouble,3.2,, +func,PyFloat_FromDouble,3.2,, +func,PyFloat_FromString,3.2,, +func,PyFloat_GetInfo,3.2,, +func,PyFloat_GetMax,3.2,, +func,PyFloat_GetMin,3.2,, +data,PyFloat_Type,3.2,, type,PyFrameObject,3.2,,opaque -function,PyFrame_GetCode,3.10,, -function,PyFrame_GetLineNumber,3.10,, -function,PyFrozenSet_New,3.2,, -var,PyFrozenSet_Type,3.2,, -function,PyGC_Collect,3.2,, -function,PyGC_Disable,3.10,, -function,PyGC_Enable,3.10,, -function,PyGC_IsEnabled,3.10,, -function,PyGILState_Ensure,3.2,, -function,PyGILState_GetThisThreadState,3.2,, -function,PyGILState_Release,3.2,, +func,PyFrame_GetCode,3.10,, +func,PyFrame_GetLineNumber,3.10,, +func,PyFrozenSet_New,3.2,, +data,PyFrozenSet_Type,3.2,, +func,PyGC_Collect,3.2,, +func,PyGC_Disable,3.10,, +func,PyGC_Enable,3.10,, +func,PyGC_IsEnabled,3.10,, +func,PyGILState_Ensure,3.2,, +func,PyGILState_GetThisThreadState,3.2,, +func,PyGILState_Release,3.2,, type,PyGILState_STATE,3.2,, type,PyGetSetDef,3.2,,full-abi -var,PyGetSetDescr_Type,3.2,, -function,PyImport_AddModule,3.2,, -function,PyImport_AddModuleObject,3.7,, -function,PyImport_AppendInittab,3.2,, -function,PyImport_ExecCodeModule,3.2,, -function,PyImport_ExecCodeModuleEx,3.2,, -function,PyImport_ExecCodeModuleObject,3.7,, -function,PyImport_ExecCodeModuleWithPathnames,3.2,, -function,PyImport_GetImporter,3.2,, -function,PyImport_GetMagicNumber,3.2,, -function,PyImport_GetMagicTag,3.2,, -function,PyImport_GetModule,3.8,, -function,PyImport_GetModuleDict,3.2,, -function,PyImport_Import,3.2,, -function,PyImport_ImportFrozenModule,3.2,, -function,PyImport_ImportFrozenModuleObject,3.7,, -function,PyImport_ImportModule,3.2,, -function,PyImport_ImportModuleLevel,3.2,, -function,PyImport_ImportModuleLevelObject,3.7,, -function,PyImport_ImportModuleNoBlock,3.2,, -function,PyImport_ReloadModule,3.2,, -function,PyIndex_Check,3.8,, +data,PyGetSetDescr_Type,3.2,, +func,PyImport_AddModule,3.2,, +func,PyImport_AddModuleObject,3.7,, +func,PyImport_AppendInittab,3.2,, +func,PyImport_ExecCodeModule,3.2,, +func,PyImport_ExecCodeModuleEx,3.2,, +func,PyImport_ExecCodeModuleObject,3.7,, +func,PyImport_ExecCodeModuleWithPathnames,3.2,, +func,PyImport_GetImporter,3.2,, +func,PyImport_GetMagicNumber,3.2,, +func,PyImport_GetMagicTag,3.2,, +func,PyImport_GetModule,3.8,, +func,PyImport_GetModuleDict,3.2,, +func,PyImport_Import,3.2,, +func,PyImport_ImportFrozenModule,3.2,, +func,PyImport_ImportFrozenModuleObject,3.7,, +func,PyImport_ImportModule,3.2,, +func,PyImport_ImportModuleLevel,3.2,, +func,PyImport_ImportModuleLevelObject,3.7,, +func,PyImport_ImportModuleNoBlock,3.2,, +func,PyImport_ReloadModule,3.2,, +func,PyIndex_Check,3.8,, type,PyInterpreterState,3.2,,opaque -function,PyInterpreterState_Clear,3.2,, -function,PyInterpreterState_Delete,3.2,, -function,PyInterpreterState_Get,3.9,, -function,PyInterpreterState_GetDict,3.8,, -function,PyInterpreterState_GetID,3.7,, -function,PyInterpreterState_New,3.2,, -function,PyIter_Check,3.8,, -function,PyIter_Next,3.2,, -function,PyIter_Send,3.10,, -var,PyListIter_Type,3.2,, -var,PyListRevIter_Type,3.2,, -function,PyList_Append,3.2,, -function,PyList_AsTuple,3.2,, -function,PyList_GetItem,3.2,, -function,PyList_GetSlice,3.2,, -function,PyList_Insert,3.2,, -function,PyList_New,3.2,, -function,PyList_Reverse,3.2,, -function,PyList_SetItem,3.2,, -function,PyList_SetSlice,3.2,, -function,PyList_Size,3.2,, -function,PyList_Sort,3.2,, -var,PyList_Type,3.2,, +func,PyInterpreterState_Clear,3.2,, +func,PyInterpreterState_Delete,3.2,, +func,PyInterpreterState_Get,3.9,, +func,PyInterpreterState_GetDict,3.8,, +func,PyInterpreterState_GetID,3.7,, +func,PyInterpreterState_New,3.2,, +func,PyIter_Check,3.8,, +func,PyIter_Next,3.2,, +func,PyIter_Send,3.10,, +data,PyListIter_Type,3.2,, +data,PyListRevIter_Type,3.2,, +func,PyList_Append,3.2,, +func,PyList_AsTuple,3.2,, +func,PyList_GetItem,3.2,, +func,PyList_GetSlice,3.2,, +func,PyList_Insert,3.2,, +func,PyList_New,3.2,, +func,PyList_Reverse,3.2,, +func,PyList_SetItem,3.2,, +func,PyList_SetSlice,3.2,, +func,PyList_Size,3.2,, +func,PyList_Sort,3.2,, +data,PyList_Type,3.2,, type,PyLongObject,3.2,,opaque -var,PyLongRangeIter_Type,3.2,, -function,PyLong_AsDouble,3.2,, -function,PyLong_AsLong,3.2,, -function,PyLong_AsLongAndOverflow,3.2,, -function,PyLong_AsLongLong,3.2,, -function,PyLong_AsLongLongAndOverflow,3.2,, -function,PyLong_AsSize_t,3.2,, -function,PyLong_AsSsize_t,3.2,, -function,PyLong_AsUnsignedLong,3.2,, -function,PyLong_AsUnsignedLongLong,3.2,, -function,PyLong_AsUnsignedLongLongMask,3.2,, -function,PyLong_AsUnsignedLongMask,3.2,, -function,PyLong_AsVoidPtr,3.2,, -function,PyLong_FromDouble,3.2,, -function,PyLong_FromLong,3.2,, -function,PyLong_FromLongLong,3.2,, -function,PyLong_FromSize_t,3.2,, -function,PyLong_FromSsize_t,3.2,, -function,PyLong_FromString,3.2,, -function,PyLong_FromUnsignedLong,3.2,, -function,PyLong_FromUnsignedLongLong,3.2,, -function,PyLong_FromVoidPtr,3.2,, -function,PyLong_GetInfo,3.2,, -var,PyLong_Type,3.2,, -var,PyMap_Type,3.2,, -function,PyMapping_Check,3.2,, -function,PyMapping_GetItemString,3.2,, -function,PyMapping_HasKey,3.2,, -function,PyMapping_HasKeyString,3.2,, -function,PyMapping_Items,3.2,, -function,PyMapping_Keys,3.2,, -function,PyMapping_Length,3.2,, -function,PyMapping_SetItemString,3.2,, -function,PyMapping_Size,3.2,, -function,PyMapping_Values,3.2,, -function,PyMem_Calloc,3.7,, -function,PyMem_Free,3.2,, -function,PyMem_Malloc,3.2,, -function,PyMem_Realloc,3.2,, +data,PyLongRangeIter_Type,3.2,, +func,PyLong_AsDouble,3.2,, +func,PyLong_AsLong,3.2,, +func,PyLong_AsLongAndOverflow,3.2,, +func,PyLong_AsLongLong,3.2,, +func,PyLong_AsLongLongAndOverflow,3.2,, +func,PyLong_AsSize_t,3.2,, +func,PyLong_AsSsize_t,3.2,, +func,PyLong_AsUnsignedLong,3.2,, +func,PyLong_AsUnsignedLongLong,3.2,, +func,PyLong_AsUnsignedLongLongMask,3.2,, +func,PyLong_AsUnsignedLongMask,3.2,, +func,PyLong_AsVoidPtr,3.2,, +func,PyLong_FromDouble,3.2,, +func,PyLong_FromLong,3.2,, +func,PyLong_FromLongLong,3.2,, +func,PyLong_FromSize_t,3.2,, +func,PyLong_FromSsize_t,3.2,, +func,PyLong_FromString,3.2,, +func,PyLong_FromUnsignedLong,3.2,, +func,PyLong_FromUnsignedLongLong,3.2,, +func,PyLong_FromVoidPtr,3.2,, +func,PyLong_GetInfo,3.2,, +data,PyLong_Type,3.2,, +data,PyMap_Type,3.2,, +func,PyMapping_Check,3.2,, +func,PyMapping_GetItemString,3.2,, +func,PyMapping_HasKey,3.2,, +func,PyMapping_HasKeyString,3.2,, +func,PyMapping_Items,3.2,, +func,PyMapping_Keys,3.2,, +func,PyMapping_Length,3.2,, +func,PyMapping_SetItemString,3.2,, +func,PyMapping_Size,3.2,, +func,PyMapping_Values,3.2,, +func,PyMem_Calloc,3.7,, +func,PyMem_Free,3.2,, +func,PyMem_Malloc,3.2,, +func,PyMem_Realloc,3.2,, type,PyMemberDef,3.2,,full-abi -var,PyMemberDescr_Type,3.2,, -function,PyMember_GetOne,3.2,, -function,PyMember_SetOne,3.2,, -function,PyMemoryView_FromBuffer,3.11,, -function,PyMemoryView_FromMemory,3.7,, -function,PyMemoryView_FromObject,3.2,, -function,PyMemoryView_GetContiguous,3.2,, -var,PyMemoryView_Type,3.2,, +data,PyMemberDescr_Type,3.2,, +func,PyMember_GetOne,3.2,, +func,PyMember_SetOne,3.2,, +func,PyMemoryView_FromBuffer,3.11,, +func,PyMemoryView_FromMemory,3.7,, +func,PyMemoryView_FromObject,3.2,, +func,PyMemoryView_GetContiguous,3.2,, +data,PyMemoryView_Type,3.2,, type,PyMethodDef,3.2,,full-abi -var,PyMethodDescr_Type,3.2,, +data,PyMethodDescr_Type,3.2,, type,PyModuleDef,3.2,,full-abi type,PyModuleDef_Base,3.2,,full-abi -function,PyModuleDef_Init,3.5,, -var,PyModuleDef_Type,3.5,, -function,PyModule_AddFunctions,3.7,, -function,PyModule_AddIntConstant,3.2,, -function,PyModule_AddObject,3.2,, -function,PyModule_AddObjectRef,3.10,, -function,PyModule_AddStringConstant,3.2,, -function,PyModule_AddType,3.10,, -function,PyModule_Create2,3.2,, -function,PyModule_ExecDef,3.7,, -function,PyModule_FromDefAndSpec2,3.7,, -function,PyModule_GetDef,3.2,, -function,PyModule_GetDict,3.2,, -function,PyModule_GetFilename,3.2,, -function,PyModule_GetFilenameObject,3.2,, -function,PyModule_GetName,3.2,, -function,PyModule_GetNameObject,3.7,, -function,PyModule_GetState,3.2,, -function,PyModule_New,3.2,, -function,PyModule_NewObject,3.7,, -function,PyModule_SetDocString,3.7,, -var,PyModule_Type,3.2,, -function,PyNumber_Absolute,3.2,, -function,PyNumber_Add,3.2,, -function,PyNumber_And,3.2,, -function,PyNumber_AsSsize_t,3.2,, -function,PyNumber_Check,3.2,, -function,PyNumber_Divmod,3.2,, -function,PyNumber_Float,3.2,, -function,PyNumber_FloorDivide,3.2,, -function,PyNumber_InPlaceAdd,3.2,, -function,PyNumber_InPlaceAnd,3.2,, -function,PyNumber_InPlaceFloorDivide,3.2,, -function,PyNumber_InPlaceLshift,3.2,, -function,PyNumber_InPlaceMatrixMultiply,3.7,, -function,PyNumber_InPlaceMultiply,3.2,, -function,PyNumber_InPlaceOr,3.2,, -function,PyNumber_InPlacePower,3.2,, -function,PyNumber_InPlaceRemainder,3.2,, -function,PyNumber_InPlaceRshift,3.2,, -function,PyNumber_InPlaceSubtract,3.2,, -function,PyNumber_InPlaceTrueDivide,3.2,, -function,PyNumber_InPlaceXor,3.2,, -function,PyNumber_Index,3.2,, -function,PyNumber_Invert,3.2,, -function,PyNumber_Long,3.2,, -function,PyNumber_Lshift,3.2,, -function,PyNumber_MatrixMultiply,3.7,, -function,PyNumber_Multiply,3.2,, -function,PyNumber_Negative,3.2,, -function,PyNumber_Or,3.2,, -function,PyNumber_Positive,3.2,, -function,PyNumber_Power,3.2,, -function,PyNumber_Remainder,3.2,, -function,PyNumber_Rshift,3.2,, -function,PyNumber_Subtract,3.2,, -function,PyNumber_ToBase,3.2,, -function,PyNumber_TrueDivide,3.2,, -function,PyNumber_Xor,3.2,, -function,PyOS_AfterFork,3.2,on platforms with fork(), -function,PyOS_AfterFork_Child,3.7,on platforms with fork(), -function,PyOS_AfterFork_Parent,3.7,on platforms with fork(), -function,PyOS_BeforeFork,3.7,on platforms with fork(), -function,PyOS_CheckStack,3.7,on platforms with USE_STACKCHECK, -function,PyOS_FSPath,3.6,, -var,PyOS_InputHook,3.2,, -function,PyOS_InterruptOccurred,3.2,, -function,PyOS_double_to_string,3.2,, -function,PyOS_getsig,3.2,, -function,PyOS_mystricmp,3.2,, -function,PyOS_mystrnicmp,3.2,, -function,PyOS_setsig,3.2,, +func,PyModuleDef_Init,3.5,, +data,PyModuleDef_Type,3.5,, +func,PyModule_AddFunctions,3.7,, +func,PyModule_AddIntConstant,3.2,, +func,PyModule_AddObject,3.2,, +func,PyModule_AddObjectRef,3.10,, +func,PyModule_AddStringConstant,3.2,, +func,PyModule_AddType,3.10,, +func,PyModule_Create2,3.2,, +func,PyModule_ExecDef,3.7,, +func,PyModule_FromDefAndSpec2,3.7,, +func,PyModule_GetDef,3.2,, +func,PyModule_GetDict,3.2,, +func,PyModule_GetFilename,3.2,, +func,PyModule_GetFilenameObject,3.2,, +func,PyModule_GetName,3.2,, +func,PyModule_GetNameObject,3.7,, +func,PyModule_GetState,3.2,, +func,PyModule_New,3.2,, +func,PyModule_NewObject,3.7,, +func,PyModule_SetDocString,3.7,, +data,PyModule_Type,3.2,, +func,PyNumber_Absolute,3.2,, +func,PyNumber_Add,3.2,, +func,PyNumber_And,3.2,, +func,PyNumber_AsSsize_t,3.2,, +func,PyNumber_Check,3.2,, +func,PyNumber_Divmod,3.2,, +func,PyNumber_Float,3.2,, +func,PyNumber_FloorDivide,3.2,, +func,PyNumber_InPlaceAdd,3.2,, +func,PyNumber_InPlaceAnd,3.2,, +func,PyNumber_InPlaceFloorDivide,3.2,, +func,PyNumber_InPlaceLshift,3.2,, +func,PyNumber_InPlaceMatrixMultiply,3.7,, +func,PyNumber_InPlaceMultiply,3.2,, +func,PyNumber_InPlaceOr,3.2,, +func,PyNumber_InPlacePower,3.2,, +func,PyNumber_InPlaceRemainder,3.2,, +func,PyNumber_InPlaceRshift,3.2,, +func,PyNumber_InPlaceSubtract,3.2,, +func,PyNumber_InPlaceTrueDivide,3.2,, +func,PyNumber_InPlaceXor,3.2,, +func,PyNumber_Index,3.2,, +func,PyNumber_Invert,3.2,, +func,PyNumber_Long,3.2,, +func,PyNumber_Lshift,3.2,, +func,PyNumber_MatrixMultiply,3.7,, +func,PyNumber_Multiply,3.2,, +func,PyNumber_Negative,3.2,, +func,PyNumber_Or,3.2,, +func,PyNumber_Positive,3.2,, +func,PyNumber_Power,3.2,, +func,PyNumber_Remainder,3.2,, +func,PyNumber_Rshift,3.2,, +func,PyNumber_Subtract,3.2,, +func,PyNumber_ToBase,3.2,, +func,PyNumber_TrueDivide,3.2,, +func,PyNumber_Xor,3.2,, +func,PyOS_AfterFork,3.2,on platforms with fork(), +func,PyOS_AfterFork_Child,3.7,on platforms with fork(), +func,PyOS_AfterFork_Parent,3.7,on platforms with fork(), +func,PyOS_BeforeFork,3.7,on platforms with fork(), +func,PyOS_CheckStack,3.7,on platforms with USE_STACKCHECK, +func,PyOS_FSPath,3.6,, +data,PyOS_InputHook,3.2,, +func,PyOS_InterruptOccurred,3.2,, +func,PyOS_double_to_string,3.2,, +func,PyOS_getsig,3.2,, +func,PyOS_mystricmp,3.2,, +func,PyOS_mystrnicmp,3.2,, +func,PyOS_setsig,3.2,, type,PyOS_sighandler_t,3.2,, -function,PyOS_snprintf,3.2,, -function,PyOS_string_to_double,3.2,, -function,PyOS_strtol,3.2,, -function,PyOS_strtoul,3.2,, -function,PyOS_vsnprintf,3.2,, +func,PyOS_snprintf,3.2,, +func,PyOS_string_to_double,3.2,, +func,PyOS_strtol,3.2,, +func,PyOS_strtoul,3.2,, +func,PyOS_vsnprintf,3.2,, type,PyObject,3.2,,members member,PyObject.ob_refcnt,3.2,, member,PyObject.ob_type,3.2,, -function,PyObject_ASCII,3.2,, -function,PyObject_AsCharBuffer,3.2,, -function,PyObject_AsFileDescriptor,3.2,, -function,PyObject_AsReadBuffer,3.2,, -function,PyObject_AsWriteBuffer,3.2,, -function,PyObject_Bytes,3.2,, -function,PyObject_Call,3.2,, -function,PyObject_CallFunction,3.2,, -function,PyObject_CallFunctionObjArgs,3.2,, -function,PyObject_CallMethod,3.2,, -function,PyObject_CallMethodObjArgs,3.2,, -function,PyObject_CallNoArgs,3.10,, -function,PyObject_CallObject,3.2,, -function,PyObject_Calloc,3.7,, -function,PyObject_CheckBuffer,3.11,, -function,PyObject_CheckReadBuffer,3.2,, -function,PyObject_ClearWeakRefs,3.2,, -function,PyObject_CopyData,3.11,, -function,PyObject_DelItem,3.2,, -function,PyObject_DelItemString,3.2,, -function,PyObject_Dir,3.2,, -function,PyObject_Format,3.2,, -function,PyObject_Free,3.2,, -function,PyObject_GC_Del,3.2,, -function,PyObject_GC_IsFinalized,3.9,, -function,PyObject_GC_IsTracked,3.9,, -function,PyObject_GC_Track,3.2,, -function,PyObject_GC_UnTrack,3.2,, -function,PyObject_GenericGetAttr,3.2,, -function,PyObject_GenericGetDict,3.10,, -function,PyObject_GenericSetAttr,3.2,, -function,PyObject_GenericSetDict,3.7,, -function,PyObject_GetAIter,3.10,, -function,PyObject_GetAttr,3.2,, -function,PyObject_GetAttrString,3.2,, -function,PyObject_GetBuffer,3.11,, -function,PyObject_GetItem,3.2,, -function,PyObject_GetIter,3.2,, -function,PyObject_GetTypeData,3.12,, -function,PyObject_HasAttr,3.2,, -function,PyObject_HasAttrString,3.2,, -function,PyObject_Hash,3.2,, -function,PyObject_HashNotImplemented,3.2,, -function,PyObject_Init,3.2,, -function,PyObject_InitVar,3.2,, -function,PyObject_IsInstance,3.2,, -function,PyObject_IsSubclass,3.2,, -function,PyObject_IsTrue,3.2,, -function,PyObject_Length,3.2,, -function,PyObject_Malloc,3.2,, -function,PyObject_Not,3.2,, -function,PyObject_Realloc,3.2,, -function,PyObject_Repr,3.2,, -function,PyObject_RichCompare,3.2,, -function,PyObject_RichCompareBool,3.2,, -function,PyObject_SelfIter,3.2,, -function,PyObject_SetAttr,3.2,, -function,PyObject_SetAttrString,3.2,, -function,PyObject_SetItem,3.2,, -function,PyObject_Size,3.2,, -function,PyObject_Str,3.2,, -function,PyObject_Type,3.2,, -function,PyObject_Vectorcall,3.12,, -function,PyObject_VectorcallMethod,3.12,, -var,PyProperty_Type,3.2,, -var,PyRangeIter_Type,3.2,, -var,PyRange_Type,3.2,, -var,PyReversed_Type,3.2,, -function,PySeqIter_New,3.2,, -var,PySeqIter_Type,3.2,, -function,PySequence_Check,3.2,, -function,PySequence_Concat,3.2,, -function,PySequence_Contains,3.2,, -function,PySequence_Count,3.2,, -function,PySequence_DelItem,3.2,, -function,PySequence_DelSlice,3.2,, -function,PySequence_Fast,3.2,, -function,PySequence_GetItem,3.2,, -function,PySequence_GetSlice,3.2,, -function,PySequence_In,3.2,, -function,PySequence_InPlaceConcat,3.2,, -function,PySequence_InPlaceRepeat,3.2,, -function,PySequence_Index,3.2,, -function,PySequence_Length,3.2,, -function,PySequence_List,3.2,, -function,PySequence_Repeat,3.2,, -function,PySequence_SetItem,3.2,, -function,PySequence_SetSlice,3.2,, -function,PySequence_Size,3.2,, -function,PySequence_Tuple,3.2,, -var,PySetIter_Type,3.2,, -function,PySet_Add,3.2,, -function,PySet_Clear,3.2,, -function,PySet_Contains,3.2,, -function,PySet_Discard,3.2,, -function,PySet_New,3.2,, -function,PySet_Pop,3.2,, -function,PySet_Size,3.2,, -var,PySet_Type,3.2,, -function,PySlice_AdjustIndices,3.7,, -function,PySlice_GetIndices,3.2,, -function,PySlice_GetIndicesEx,3.2,, -function,PySlice_New,3.2,, -var,PySlice_Type,3.2,, -function,PySlice_Unpack,3.7,, -function,PyState_AddModule,3.3,, -function,PyState_FindModule,3.2,, -function,PyState_RemoveModule,3.3,, +func,PyObject_ASCII,3.2,, +func,PyObject_AsCharBuffer,3.2,, +func,PyObject_AsFileDescriptor,3.2,, +func,PyObject_AsReadBuffer,3.2,, +func,PyObject_AsWriteBuffer,3.2,, +func,PyObject_Bytes,3.2,, +func,PyObject_Call,3.2,, +func,PyObject_CallFunction,3.2,, +func,PyObject_CallFunctionObjArgs,3.2,, +func,PyObject_CallMethod,3.2,, +func,PyObject_CallMethodObjArgs,3.2,, +func,PyObject_CallNoArgs,3.10,, +func,PyObject_CallObject,3.2,, +func,PyObject_Calloc,3.7,, +func,PyObject_CheckBuffer,3.11,, +func,PyObject_CheckReadBuffer,3.2,, +func,PyObject_ClearWeakRefs,3.2,, +func,PyObject_CopyData,3.11,, +func,PyObject_DelItem,3.2,, +func,PyObject_DelItemString,3.2,, +func,PyObject_Dir,3.2,, +func,PyObject_Format,3.2,, +func,PyObject_Free,3.2,, +func,PyObject_GC_Del,3.2,, +func,PyObject_GC_IsFinalized,3.9,, +func,PyObject_GC_IsTracked,3.9,, +func,PyObject_GC_Track,3.2,, +func,PyObject_GC_UnTrack,3.2,, +func,PyObject_GenericGetAttr,3.2,, +func,PyObject_GenericGetDict,3.10,, +func,PyObject_GenericSetAttr,3.2,, +func,PyObject_GenericSetDict,3.7,, +func,PyObject_GetAIter,3.10,, +func,PyObject_GetAttr,3.2,, +func,PyObject_GetAttrString,3.2,, +func,PyObject_GetBuffer,3.11,, +func,PyObject_GetItem,3.2,, +func,PyObject_GetIter,3.2,, +func,PyObject_GetTypeData,3.12,, +func,PyObject_HasAttr,3.2,, +func,PyObject_HasAttrString,3.2,, +func,PyObject_Hash,3.2,, +func,PyObject_HashNotImplemented,3.2,, +func,PyObject_Init,3.2,, +func,PyObject_InitVar,3.2,, +func,PyObject_IsInstance,3.2,, +func,PyObject_IsSubclass,3.2,, +func,PyObject_IsTrue,3.2,, +func,PyObject_Length,3.2,, +func,PyObject_Malloc,3.2,, +func,PyObject_Not,3.2,, +func,PyObject_Realloc,3.2,, +func,PyObject_Repr,3.2,, +func,PyObject_RichCompare,3.2,, +func,PyObject_RichCompareBool,3.2,, +func,PyObject_SelfIter,3.2,, +func,PyObject_SetAttr,3.2,, +func,PyObject_SetAttrString,3.2,, +func,PyObject_SetItem,3.2,, +func,PyObject_Size,3.2,, +func,PyObject_Str,3.2,, +func,PyObject_Type,3.2,, +func,PyObject_Vectorcall,3.12,, +func,PyObject_VectorcallMethod,3.12,, +data,PyProperty_Type,3.2,, +data,PyRangeIter_Type,3.2,, +data,PyRange_Type,3.2,, +data,PyReversed_Type,3.2,, +func,PySeqIter_New,3.2,, +data,PySeqIter_Type,3.2,, +func,PySequence_Check,3.2,, +func,PySequence_Concat,3.2,, +func,PySequence_Contains,3.2,, +func,PySequence_Count,3.2,, +func,PySequence_DelItem,3.2,, +func,PySequence_DelSlice,3.2,, +func,PySequence_Fast,3.2,, +func,PySequence_GetItem,3.2,, +func,PySequence_GetSlice,3.2,, +func,PySequence_In,3.2,, +func,PySequence_InPlaceConcat,3.2,, +func,PySequence_InPlaceRepeat,3.2,, +func,PySequence_Index,3.2,, +func,PySequence_Length,3.2,, +func,PySequence_List,3.2,, +func,PySequence_Repeat,3.2,, +func,PySequence_SetItem,3.2,, +func,PySequence_SetSlice,3.2,, +func,PySequence_Size,3.2,, +func,PySequence_Tuple,3.2,, +data,PySetIter_Type,3.2,, +func,PySet_Add,3.2,, +func,PySet_Clear,3.2,, +func,PySet_Contains,3.2,, +func,PySet_Discard,3.2,, +func,PySet_New,3.2,, +func,PySet_Pop,3.2,, +func,PySet_Size,3.2,, +data,PySet_Type,3.2,, +func,PySlice_AdjustIndices,3.7,, +func,PySlice_GetIndices,3.2,, +func,PySlice_GetIndicesEx,3.2,, +func,PySlice_New,3.2,, +data,PySlice_Type,3.2,, +func,PySlice_Unpack,3.7,, +func,PyState_AddModule,3.3,, +func,PyState_FindModule,3.2,, +func,PyState_RemoveModule,3.3,, type,PyStructSequence_Desc,3.2,,full-abi type,PyStructSequence_Field,3.2,,full-abi -function,PyStructSequence_GetItem,3.2,, -function,PyStructSequence_New,3.2,, -function,PyStructSequence_NewType,3.2,, -function,PyStructSequence_SetItem,3.2,, -var,PyStructSequence_UnnamedField,3.11,, -var,PySuper_Type,3.2,, -function,PySys_AddWarnOption,3.2,, -function,PySys_AddWarnOptionUnicode,3.2,, -function,PySys_AddXOption,3.7,, -function,PySys_FormatStderr,3.2,, -function,PySys_FormatStdout,3.2,, -function,PySys_GetObject,3.2,, -function,PySys_GetXOptions,3.7,, -function,PySys_HasWarnOptions,3.2,, -function,PySys_ResetWarnOptions,3.2,, -function,PySys_SetArgv,3.2,, -function,PySys_SetArgvEx,3.2,, -function,PySys_SetObject,3.2,, -function,PySys_SetPath,3.2,, -function,PySys_WriteStderr,3.2,, -function,PySys_WriteStdout,3.2,, +func,PyStructSequence_GetItem,3.2,, +func,PyStructSequence_New,3.2,, +func,PyStructSequence_NewType,3.2,, +func,PyStructSequence_SetItem,3.2,, +data,PyStructSequence_UnnamedField,3.11,, +data,PySuper_Type,3.2,, +func,PySys_AddWarnOption,3.2,, +func,PySys_AddWarnOptionUnicode,3.2,, +func,PySys_AddXOption,3.7,, +func,PySys_FormatStderr,3.2,, +func,PySys_FormatStdout,3.2,, +func,PySys_GetObject,3.2,, +func,PySys_GetXOptions,3.7,, +func,PySys_HasWarnOptions,3.2,, +func,PySys_ResetWarnOptions,3.2,, +func,PySys_SetArgv,3.2,, +func,PySys_SetArgvEx,3.2,, +func,PySys_SetObject,3.2,, +func,PySys_SetPath,3.2,, +func,PySys_WriteStderr,3.2,, +func,PySys_WriteStdout,3.2,, type,PyThreadState,3.2,,opaque -function,PyThreadState_Clear,3.2,, -function,PyThreadState_Delete,3.2,, -function,PyThreadState_Get,3.2,, -function,PyThreadState_GetDict,3.2,, -function,PyThreadState_GetFrame,3.10,, -function,PyThreadState_GetID,3.10,, -function,PyThreadState_GetInterpreter,3.10,, -function,PyThreadState_New,3.2,, -function,PyThreadState_SetAsyncExc,3.2,, -function,PyThreadState_Swap,3.2,, -function,PyThread_GetInfo,3.3,, -function,PyThread_ReInitTLS,3.2,, -function,PyThread_acquire_lock,3.2,, -function,PyThread_acquire_lock_timed,3.2,, -function,PyThread_allocate_lock,3.2,, -function,PyThread_create_key,3.2,, -function,PyThread_delete_key,3.2,, -function,PyThread_delete_key_value,3.2,, -function,PyThread_exit_thread,3.2,, -function,PyThread_free_lock,3.2,, -function,PyThread_get_key_value,3.2,, -function,PyThread_get_stacksize,3.2,, -function,PyThread_get_thread_ident,3.2,, -function,PyThread_get_thread_native_id,3.2,on platforms with native thread IDs, -function,PyThread_init_thread,3.2,, -function,PyThread_release_lock,3.2,, -function,PyThread_set_key_value,3.2,, -function,PyThread_set_stacksize,3.2,, -function,PyThread_start_new_thread,3.2,, -function,PyThread_tss_alloc,3.7,, -function,PyThread_tss_create,3.7,, -function,PyThread_tss_delete,3.7,, -function,PyThread_tss_free,3.7,, -function,PyThread_tss_get,3.7,, -function,PyThread_tss_is_created,3.7,, -function,PyThread_tss_set,3.7,, -function,PyTraceBack_Here,3.2,, -function,PyTraceBack_Print,3.2,, -var,PyTraceBack_Type,3.2,, -var,PyTupleIter_Type,3.2,, -function,PyTuple_GetItem,3.2,, -function,PyTuple_GetSlice,3.2,, -function,PyTuple_New,3.2,, -function,PyTuple_Pack,3.2,, -function,PyTuple_SetItem,3.2,, -function,PyTuple_Size,3.2,, -var,PyTuple_Type,3.2,, +func,PyThreadState_Clear,3.2,, +func,PyThreadState_Delete,3.2,, +func,PyThreadState_Get,3.2,, +func,PyThreadState_GetDict,3.2,, +func,PyThreadState_GetFrame,3.10,, +func,PyThreadState_GetID,3.10,, +func,PyThreadState_GetInterpreter,3.10,, +func,PyThreadState_New,3.2,, +func,PyThreadState_SetAsyncExc,3.2,, +func,PyThreadState_Swap,3.2,, +func,PyThread_GetInfo,3.3,, +func,PyThread_ReInitTLS,3.2,, +func,PyThread_acquire_lock,3.2,, +func,PyThread_acquire_lock_timed,3.2,, +func,PyThread_allocate_lock,3.2,, +func,PyThread_create_key,3.2,, +func,PyThread_delete_key,3.2,, +func,PyThread_delete_key_value,3.2,, +func,PyThread_exit_thread,3.2,, +func,PyThread_free_lock,3.2,, +func,PyThread_get_key_value,3.2,, +func,PyThread_get_stacksize,3.2,, +func,PyThread_get_thread_ident,3.2,, +func,PyThread_get_thread_native_id,3.2,on platforms with native thread IDs, +func,PyThread_init_thread,3.2,, +func,PyThread_release_lock,3.2,, +func,PyThread_set_key_value,3.2,, +func,PyThread_set_stacksize,3.2,, +func,PyThread_start_new_thread,3.2,, +func,PyThread_tss_alloc,3.7,, +func,PyThread_tss_create,3.7,, +func,PyThread_tss_delete,3.7,, +func,PyThread_tss_free,3.7,, +func,PyThread_tss_get,3.7,, +func,PyThread_tss_is_created,3.7,, +func,PyThread_tss_set,3.7,, +func,PyTraceBack_Here,3.2,, +func,PyTraceBack_Print,3.2,, +data,PyTraceBack_Type,3.2,, +data,PyTupleIter_Type,3.2,, +func,PyTuple_GetItem,3.2,, +func,PyTuple_GetSlice,3.2,, +func,PyTuple_New,3.2,, +func,PyTuple_Pack,3.2,, +func,PyTuple_SetItem,3.2,, +func,PyTuple_Size,3.2,, +data,PyTuple_Type,3.2,, type,PyTypeObject,3.2,,opaque -function,PyType_ClearCache,3.2,, -function,PyType_FromMetaclass,3.12,, -function,PyType_FromModuleAndSpec,3.10,, -function,PyType_FromSpec,3.2,, -function,PyType_FromSpecWithBases,3.3,, -function,PyType_GenericAlloc,3.2,, -function,PyType_GenericNew,3.2,, -function,PyType_GetFlags,3.2,, -function,PyType_GetModule,3.10,, -function,PyType_GetModuleState,3.10,, -function,PyType_GetName,3.11,, -function,PyType_GetQualName,3.11,, -function,PyType_GetSlot,3.4,, -function,PyType_GetTypeDataSize,3.12,, -function,PyType_IsSubtype,3.2,, -function,PyType_Modified,3.2,, -function,PyType_Ready,3.2,, +func,PyType_ClearCache,3.2,, +func,PyType_FromMetaclass,3.12,, +func,PyType_FromModuleAndSpec,3.10,, +func,PyType_FromSpec,3.2,, +func,PyType_FromSpecWithBases,3.3,, +func,PyType_GenericAlloc,3.2,, +func,PyType_GenericNew,3.2,, +func,PyType_GetFlags,3.2,, +func,PyType_GetModule,3.10,, +func,PyType_GetModuleState,3.10,, +func,PyType_GetName,3.11,, +func,PyType_GetQualName,3.11,, +func,PyType_GetSlot,3.4,, +func,PyType_GetTypeDataSize,3.12,, +func,PyType_IsSubtype,3.2,, +func,PyType_Modified,3.2,, +func,PyType_Ready,3.2,, type,PyType_Slot,3.2,,full-abi type,PyType_Spec,3.2,,full-abi -var,PyType_Type,3.2,, -function,PyUnicodeDecodeError_Create,3.2,, -function,PyUnicodeDecodeError_GetEncoding,3.2,, -function,PyUnicodeDecodeError_GetEnd,3.2,, -function,PyUnicodeDecodeError_GetObject,3.2,, -function,PyUnicodeDecodeError_GetReason,3.2,, -function,PyUnicodeDecodeError_GetStart,3.2,, -function,PyUnicodeDecodeError_SetEnd,3.2,, -function,PyUnicodeDecodeError_SetReason,3.2,, -function,PyUnicodeDecodeError_SetStart,3.2,, -function,PyUnicodeEncodeError_GetEncoding,3.2,, -function,PyUnicodeEncodeError_GetEnd,3.2,, -function,PyUnicodeEncodeError_GetObject,3.2,, -function,PyUnicodeEncodeError_GetReason,3.2,, -function,PyUnicodeEncodeError_GetStart,3.2,, -function,PyUnicodeEncodeError_SetEnd,3.2,, -function,PyUnicodeEncodeError_SetReason,3.2,, -function,PyUnicodeEncodeError_SetStart,3.2,, -var,PyUnicodeIter_Type,3.2,, -function,PyUnicodeTranslateError_GetEnd,3.2,, -function,PyUnicodeTranslateError_GetObject,3.2,, -function,PyUnicodeTranslateError_GetReason,3.2,, -function,PyUnicodeTranslateError_GetStart,3.2,, -function,PyUnicodeTranslateError_SetEnd,3.2,, -function,PyUnicodeTranslateError_SetReason,3.2,, -function,PyUnicodeTranslateError_SetStart,3.2,, -function,PyUnicode_Append,3.2,, -function,PyUnicode_AppendAndDel,3.2,, -function,PyUnicode_AsASCIIString,3.2,, -function,PyUnicode_AsCharmapString,3.2,, -function,PyUnicode_AsDecodedObject,3.2,, -function,PyUnicode_AsDecodedUnicode,3.2,, -function,PyUnicode_AsEncodedObject,3.2,, -function,PyUnicode_AsEncodedString,3.2,, -function,PyUnicode_AsEncodedUnicode,3.2,, -function,PyUnicode_AsLatin1String,3.2,, -function,PyUnicode_AsMBCSString,3.7,on Windows, -function,PyUnicode_AsRawUnicodeEscapeString,3.2,, -function,PyUnicode_AsUCS4,3.7,, -function,PyUnicode_AsUCS4Copy,3.7,, -function,PyUnicode_AsUTF16String,3.2,, -function,PyUnicode_AsUTF32String,3.2,, -function,PyUnicode_AsUTF8AndSize,3.10,, -function,PyUnicode_AsUTF8String,3.2,, -function,PyUnicode_AsUnicodeEscapeString,3.2,, -function,PyUnicode_AsWideChar,3.2,, -function,PyUnicode_AsWideCharString,3.7,, -function,PyUnicode_BuildEncodingMap,3.2,, -function,PyUnicode_Compare,3.2,, -function,PyUnicode_CompareWithASCIIString,3.2,, -function,PyUnicode_Concat,3.2,, -function,PyUnicode_Contains,3.2,, -function,PyUnicode_Count,3.2,, -function,PyUnicode_Decode,3.2,, -function,PyUnicode_DecodeASCII,3.2,, -function,PyUnicode_DecodeCharmap,3.2,, -function,PyUnicode_DecodeCodePageStateful,3.7,on Windows, -function,PyUnicode_DecodeFSDefault,3.2,, -function,PyUnicode_DecodeFSDefaultAndSize,3.2,, -function,PyUnicode_DecodeLatin1,3.2,, -function,PyUnicode_DecodeLocale,3.7,, -function,PyUnicode_DecodeLocaleAndSize,3.7,, -function,PyUnicode_DecodeMBCS,3.7,on Windows, -function,PyUnicode_DecodeMBCSStateful,3.7,on Windows, -function,PyUnicode_DecodeRawUnicodeEscape,3.2,, -function,PyUnicode_DecodeUTF16,3.2,, -function,PyUnicode_DecodeUTF16Stateful,3.2,, -function,PyUnicode_DecodeUTF32,3.2,, -function,PyUnicode_DecodeUTF32Stateful,3.2,, -function,PyUnicode_DecodeUTF7,3.2,, -function,PyUnicode_DecodeUTF7Stateful,3.2,, -function,PyUnicode_DecodeUTF8,3.2,, -function,PyUnicode_DecodeUTF8Stateful,3.2,, -function,PyUnicode_DecodeUnicodeEscape,3.2,, -function,PyUnicode_EncodeCodePage,3.7,on Windows, -function,PyUnicode_EncodeFSDefault,3.2,, -function,PyUnicode_EncodeLocale,3.7,, -function,PyUnicode_FSConverter,3.2,, -function,PyUnicode_FSDecoder,3.2,, -function,PyUnicode_Find,3.2,, -function,PyUnicode_FindChar,3.7,, -function,PyUnicode_Format,3.2,, -function,PyUnicode_FromEncodedObject,3.2,, -function,PyUnicode_FromFormat,3.2,, -function,PyUnicode_FromFormatV,3.2,, -function,PyUnicode_FromObject,3.2,, -function,PyUnicode_FromOrdinal,3.2,, -function,PyUnicode_FromString,3.2,, -function,PyUnicode_FromStringAndSize,3.2,, -function,PyUnicode_FromWideChar,3.2,, -function,PyUnicode_GetDefaultEncoding,3.2,, -function,PyUnicode_GetLength,3.7,, -function,PyUnicode_InternFromString,3.2,, -function,PyUnicode_InternInPlace,3.2,, -function,PyUnicode_IsIdentifier,3.2,, -function,PyUnicode_Join,3.2,, -function,PyUnicode_Partition,3.2,, -function,PyUnicode_RPartition,3.2,, -function,PyUnicode_RSplit,3.2,, -function,PyUnicode_ReadChar,3.7,, -function,PyUnicode_Replace,3.2,, -function,PyUnicode_Resize,3.2,, -function,PyUnicode_RichCompare,3.2,, -function,PyUnicode_Split,3.2,, -function,PyUnicode_Splitlines,3.2,, -function,PyUnicode_Substring,3.7,, -function,PyUnicode_Tailmatch,3.2,, -function,PyUnicode_Translate,3.2,, -var,PyUnicode_Type,3.2,, -function,PyUnicode_WriteChar,3.7,, +data,PyType_Type,3.2,, +func,PyUnicodeDecodeError_Create,3.2,, +func,PyUnicodeDecodeError_GetEncoding,3.2,, +func,PyUnicodeDecodeError_GetEnd,3.2,, +func,PyUnicodeDecodeError_GetObject,3.2,, +func,PyUnicodeDecodeError_GetReason,3.2,, +func,PyUnicodeDecodeError_GetStart,3.2,, +func,PyUnicodeDecodeError_SetEnd,3.2,, +func,PyUnicodeDecodeError_SetReason,3.2,, +func,PyUnicodeDecodeError_SetStart,3.2,, +func,PyUnicodeEncodeError_GetEncoding,3.2,, +func,PyUnicodeEncodeError_GetEnd,3.2,, +func,PyUnicodeEncodeError_GetObject,3.2,, +func,PyUnicodeEncodeError_GetReason,3.2,, +func,PyUnicodeEncodeError_GetStart,3.2,, +func,PyUnicodeEncodeError_SetEnd,3.2,, +func,PyUnicodeEncodeError_SetReason,3.2,, +func,PyUnicodeEncodeError_SetStart,3.2,, +data,PyUnicodeIter_Type,3.2,, +func,PyUnicodeTranslateError_GetEnd,3.2,, +func,PyUnicodeTranslateError_GetObject,3.2,, +func,PyUnicodeTranslateError_GetReason,3.2,, +func,PyUnicodeTranslateError_GetStart,3.2,, +func,PyUnicodeTranslateError_SetEnd,3.2,, +func,PyUnicodeTranslateError_SetReason,3.2,, +func,PyUnicodeTranslateError_SetStart,3.2,, +func,PyUnicode_Append,3.2,, +func,PyUnicode_AppendAndDel,3.2,, +func,PyUnicode_AsASCIIString,3.2,, +func,PyUnicode_AsCharmapString,3.2,, +func,PyUnicode_AsDecodedObject,3.2,, +func,PyUnicode_AsDecodedUnicode,3.2,, +func,PyUnicode_AsEncodedObject,3.2,, +func,PyUnicode_AsEncodedString,3.2,, +func,PyUnicode_AsEncodedUnicode,3.2,, +func,PyUnicode_AsLatin1String,3.2,, +func,PyUnicode_AsMBCSString,3.7,on Windows, +func,PyUnicode_AsRawUnicodeEscapeString,3.2,, +func,PyUnicode_AsUCS4,3.7,, +func,PyUnicode_AsUCS4Copy,3.7,, +func,PyUnicode_AsUTF16String,3.2,, +func,PyUnicode_AsUTF32String,3.2,, +func,PyUnicode_AsUTF8AndSize,3.10,, +func,PyUnicode_AsUTF8String,3.2,, +func,PyUnicode_AsUnicodeEscapeString,3.2,, +func,PyUnicode_AsWideChar,3.2,, +func,PyUnicode_AsWideCharString,3.7,, +func,PyUnicode_BuildEncodingMap,3.2,, +func,PyUnicode_Compare,3.2,, +func,PyUnicode_CompareWithASCIIString,3.2,, +func,PyUnicode_Concat,3.2,, +func,PyUnicode_Contains,3.2,, +func,PyUnicode_Count,3.2,, +func,PyUnicode_Decode,3.2,, +func,PyUnicode_DecodeASCII,3.2,, +func,PyUnicode_DecodeCharmap,3.2,, +func,PyUnicode_DecodeCodePageStateful,3.7,on Windows, +func,PyUnicode_DecodeFSDefault,3.2,, +func,PyUnicode_DecodeFSDefaultAndSize,3.2,, +func,PyUnicode_DecodeLatin1,3.2,, +func,PyUnicode_DecodeLocale,3.7,, +func,PyUnicode_DecodeLocaleAndSize,3.7,, +func,PyUnicode_DecodeMBCS,3.7,on Windows, +func,PyUnicode_DecodeMBCSStateful,3.7,on Windows, +func,PyUnicode_DecodeRawUnicodeEscape,3.2,, +func,PyUnicode_DecodeUTF16,3.2,, +func,PyUnicode_DecodeUTF16Stateful,3.2,, +func,PyUnicode_DecodeUTF32,3.2,, +func,PyUnicode_DecodeUTF32Stateful,3.2,, +func,PyUnicode_DecodeUTF7,3.2,, +func,PyUnicode_DecodeUTF7Stateful,3.2,, +func,PyUnicode_DecodeUTF8,3.2,, +func,PyUnicode_DecodeUTF8Stateful,3.2,, +func,PyUnicode_DecodeUnicodeEscape,3.2,, +func,PyUnicode_EncodeCodePage,3.7,on Windows, +func,PyUnicode_EncodeFSDefault,3.2,, +func,PyUnicode_EncodeLocale,3.7,, +func,PyUnicode_FSConverter,3.2,, +func,PyUnicode_FSDecoder,3.2,, +func,PyUnicode_Find,3.2,, +func,PyUnicode_FindChar,3.7,, +func,PyUnicode_Format,3.2,, +func,PyUnicode_FromEncodedObject,3.2,, +func,PyUnicode_FromFormat,3.2,, +func,PyUnicode_FromFormatV,3.2,, +func,PyUnicode_FromObject,3.2,, +func,PyUnicode_FromOrdinal,3.2,, +func,PyUnicode_FromString,3.2,, +func,PyUnicode_FromStringAndSize,3.2,, +func,PyUnicode_FromWideChar,3.2,, +func,PyUnicode_GetDefaultEncoding,3.2,, +func,PyUnicode_GetLength,3.7,, +func,PyUnicode_InternFromString,3.2,, +func,PyUnicode_InternInPlace,3.2,, +func,PyUnicode_IsIdentifier,3.2,, +func,PyUnicode_Join,3.2,, +func,PyUnicode_Partition,3.2,, +func,PyUnicode_RPartition,3.2,, +func,PyUnicode_RSplit,3.2,, +func,PyUnicode_ReadChar,3.7,, +func,PyUnicode_Replace,3.2,, +func,PyUnicode_Resize,3.2,, +func,PyUnicode_RichCompare,3.2,, +func,PyUnicode_Split,3.2,, +func,PyUnicode_Splitlines,3.2,, +func,PyUnicode_Substring,3.7,, +func,PyUnicode_Tailmatch,3.2,, +func,PyUnicode_Translate,3.2,, +data,PyUnicode_Type,3.2,, +func,PyUnicode_WriteChar,3.7,, type,PyVarObject,3.2,,members member,PyVarObject.ob_base,3.2,, member,PyVarObject.ob_size,3.2,, -function,PyVectorcall_Call,3.12,, -function,PyVectorcall_NARGS,3.12,, +func,PyVectorcall_Call,3.12,, +func,PyVectorcall_NARGS,3.12,, type,PyWeakReference,3.2,,opaque -function,PyWeakref_GetObject,3.2,, -function,PyWeakref_NewProxy,3.2,, -function,PyWeakref_NewRef,3.2,, -var,PyWrapperDescr_Type,3.2,, -function,PyWrapper_New,3.2,, -var,PyZip_Type,3.2,, -function,Py_AddPendingCall,3.2,, -function,Py_AtExit,3.2,, +func,PyWeakref_GetObject,3.2,, +func,PyWeakref_NewProxy,3.2,, +func,PyWeakref_NewRef,3.2,, +data,PyWrapperDescr_Type,3.2,, +func,PyWrapper_New,3.2,, +data,PyZip_Type,3.2,, +func,Py_AddPendingCall,3.2,, +func,Py_AtExit,3.2,, macro,Py_BEGIN_ALLOW_THREADS,3.2,, macro,Py_BLOCK_THREADS,3.2,, -function,Py_BuildValue,3.2,, -function,Py_BytesMain,3.8,, -function,Py_CompileString,3.2,, -function,Py_DecRef,3.2,, -function,Py_DecodeLocale,3.7,, +func,Py_BuildValue,3.2,, +func,Py_BytesMain,3.8,, +func,Py_CompileString,3.2,, +func,Py_DecRef,3.2,, +func,Py_DecodeLocale,3.7,, macro,Py_END_ALLOW_THREADS,3.2,, -function,Py_EncodeLocale,3.7,, -function,Py_EndInterpreter,3.2,, -function,Py_EnterRecursiveCall,3.9,, -function,Py_Exit,3.2,, -function,Py_FatalError,3.2,, -var,Py_FileSystemDefaultEncodeErrors,3.10,, -var,Py_FileSystemDefaultEncoding,3.2,, -function,Py_Finalize,3.2,, -function,Py_FinalizeEx,3.6,, -function,Py_GenericAlias,3.9,, -var,Py_GenericAliasType,3.9,, -function,Py_GetBuildInfo,3.2,, -function,Py_GetCompiler,3.2,, -function,Py_GetCopyright,3.2,, -function,Py_GetExecPrefix,3.2,, -function,Py_GetPath,3.2,, -function,Py_GetPlatform,3.2,, -function,Py_GetPrefix,3.2,, -function,Py_GetProgramFullPath,3.2,, -function,Py_GetProgramName,3.2,, -function,Py_GetPythonHome,3.2,, -function,Py_GetRecursionLimit,3.2,, -function,Py_GetVersion,3.2,, -var,Py_HasFileSystemDefaultEncoding,3.2,, -function,Py_IncRef,3.2,, -function,Py_Initialize,3.2,, -function,Py_InitializeEx,3.2,, -function,Py_Is,3.10,, -function,Py_IsFalse,3.10,, -function,Py_IsInitialized,3.2,, -function,Py_IsNone,3.10,, -function,Py_IsTrue,3.10,, -function,Py_LeaveRecursiveCall,3.9,, -function,Py_Main,3.2,, -function,Py_MakePendingCalls,3.2,, -function,Py_NewInterpreter,3.2,, -function,Py_NewRef,3.10,, -function,Py_ReprEnter,3.2,, -function,Py_ReprLeave,3.2,, -function,Py_SetPath,3.7,, -function,Py_SetProgramName,3.2,, -function,Py_SetPythonHome,3.2,, -function,Py_SetRecursionLimit,3.2,, +func,Py_EncodeLocale,3.7,, +func,Py_EndInterpreter,3.2,, +func,Py_EnterRecursiveCall,3.9,, +func,Py_Exit,3.2,, +func,Py_FatalError,3.2,, +data,Py_FileSystemDefaultEncodeErrors,3.10,, +data,Py_FileSystemDefaultEncoding,3.2,, +func,Py_Finalize,3.2,, +func,Py_FinalizeEx,3.6,, +func,Py_GenericAlias,3.9,, +data,Py_GenericAliasType,3.9,, +func,Py_GetBuildInfo,3.2,, +func,Py_GetCompiler,3.2,, +func,Py_GetCopyright,3.2,, +func,Py_GetExecPrefix,3.2,, +func,Py_GetPath,3.2,, +func,Py_GetPlatform,3.2,, +func,Py_GetPrefix,3.2,, +func,Py_GetProgramFullPath,3.2,, +func,Py_GetProgramName,3.2,, +func,Py_GetPythonHome,3.2,, +func,Py_GetRecursionLimit,3.2,, +func,Py_GetVersion,3.2,, +data,Py_HasFileSystemDefaultEncoding,3.2,, +func,Py_IncRef,3.2,, +func,Py_Initialize,3.2,, +func,Py_InitializeEx,3.2,, +func,Py_Is,3.10,, +func,Py_IsFalse,3.10,, +func,Py_IsInitialized,3.2,, +func,Py_IsNone,3.10,, +func,Py_IsTrue,3.10,, +func,Py_LeaveRecursiveCall,3.9,, +func,Py_Main,3.2,, +func,Py_MakePendingCalls,3.2,, +func,Py_NewInterpreter,3.2,, +func,Py_NewRef,3.10,, +func,Py_ReprEnter,3.2,, +func,Py_ReprLeave,3.2,, +func,Py_SetPath,3.7,, +func,Py_SetProgramName,3.2,, +func,Py_SetPythonHome,3.2,, +func,Py_SetRecursionLimit,3.2,, type,Py_UCS4,3.2,, macro,Py_UNBLOCK_THREADS,3.2,, -var,Py_UTF8Mode,3.8,, -function,Py_VaBuildValue,3.2,, -var,Py_Version,3.11,, -function,Py_XNewRef,3.10,, +data,Py_UTF8Mode,3.8,, +func,Py_VaBuildValue,3.2,, +data,Py_Version,3.11,, +func,Py_XNewRef,3.10,, type,Py_buffer,3.11,,full-abi type,Py_intptr_t,3.2,, type,Py_ssize_t,3.2,, diff --git a/Doc/deprecations/c-api-pending-removal-in-3.14.rst b/Doc/deprecations/c-api-pending-removal-in-3.14.rst new file mode 100644 index 00000000..d16da66c --- /dev/null +++ b/Doc/deprecations/c-api-pending-removal-in-3.14.rst @@ -0,0 +1,72 @@ +Pending Removal in Python 3.14 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +* The ``ma_version_tag`` field in :c:type:`PyDictObject` for extension modules + (:pep:`699`; :gh:`101193`). + +* Creating :c:data:`immutable types ` with mutable + bases (:gh:`95388`). + +* Functions to configure Python's initialization, deprecated in Python 3.11: + + * :c:func:`!PySys_SetArgvEx()`: + Set :c:member:`PyConfig.argv` instead. + * :c:func:`!PySys_SetArgv()`: + Set :c:member:`PyConfig.argv` instead. + * :c:func:`!Py_SetProgramName()`: + Set :c:member:`PyConfig.program_name` instead. + * :c:func:`!Py_SetPythonHome()`: + Set :c:member:`PyConfig.home` instead. + + The :c:func:`Py_InitializeFromConfig` API should be used with + :c:type:`PyConfig` instead. + +* Global configuration variables: + + * :c:var:`Py_DebugFlag`: + Use :c:member:`PyConfig.parser_debug` instead. + * :c:var:`Py_VerboseFlag`: + Use :c:member:`PyConfig.verbose` instead. + * :c:var:`Py_QuietFlag`: + Use :c:member:`PyConfig.quiet` instead. + * :c:var:`Py_InteractiveFlag`: + Use :c:member:`PyConfig.interactive` instead. + * :c:var:`Py_InspectFlag`: + Use :c:member:`PyConfig.inspect` instead. + * :c:var:`Py_OptimizeFlag`: + Use :c:member:`PyConfig.optimization_level` instead. + * :c:var:`Py_NoSiteFlag`: + Use :c:member:`PyConfig.site_import` instead. + * :c:var:`Py_BytesWarningFlag`: + Use :c:member:`PyConfig.bytes_warning` instead. + * :c:var:`Py_FrozenFlag`: + Use :c:member:`PyConfig.pathconfig_warnings` instead. + * :c:var:`Py_IgnoreEnvironmentFlag`: + Use :c:member:`PyConfig.use_environment` instead. + * :c:var:`Py_DontWriteBytecodeFlag`: + Use :c:member:`PyConfig.write_bytecode` instead. + * :c:var:`Py_NoUserSiteDirectory`: + Use :c:member:`PyConfig.user_site_directory` instead. + * :c:var:`Py_UnbufferedStdioFlag`: + Use :c:member:`PyConfig.buffered_stdio` instead. + * :c:var:`Py_HashRandomizationFlag`: + Use :c:member:`PyConfig.use_hash_seed` + and :c:member:`PyConfig.hash_seed` instead. + * :c:var:`Py_IsolatedFlag`: + Use :c:member:`PyConfig.isolated` instead. + * :c:var:`Py_LegacyWindowsFSEncodingFlag`: + Use :c:member:`PyPreConfig.legacy_windows_fs_encoding` instead. + * :c:var:`Py_LegacyWindowsStdioFlag`: + Use :c:member:`PyConfig.legacy_windows_stdio` instead. + * :c:var:`!Py_FileSystemDefaultEncoding`: + Use :c:member:`PyConfig.filesystem_encoding` instead. + * :c:var:`!Py_HasFileSystemDefaultEncoding`: + Use :c:member:`PyConfig.filesystem_encoding` instead. + * :c:var:`!Py_FileSystemDefaultEncodeErrors`: + Use :c:member:`PyConfig.filesystem_errors` instead. + * :c:var:`!Py_UTF8Mode`: + Use :c:member:`PyPreConfig.utf8_mode` instead. + (see :c:func:`Py_PreInitialize`) + + The :c:func:`Py_InitializeFromConfig` API should be used with + :c:type:`PyConfig` instead. diff --git a/Doc/deprecations/c-api-pending-removal-in-3.15.rst b/Doc/deprecations/c-api-pending-removal-in-3.15.rst new file mode 100644 index 00000000..cdfcb2f9 --- /dev/null +++ b/Doc/deprecations/c-api-pending-removal-in-3.15.rst @@ -0,0 +1,27 @@ +Pending Removal in Python 3.15 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +* The bundled copy of ``libmpdecimal``. +* The :c:func:`PyImport_ImportModuleNoBlock`: + Use :c:func:`PyImport_ImportModule` instead. +* :c:func:`PyWeakref_GetObject` and :c:func:`PyWeakref_GET_OBJECT`: + Use :c:func:`!PyWeakref_GetRef` instead. +* :c:type:`Py_UNICODE` type and the :c:macro:`!Py_UNICODE_WIDE` macro: + Use :c:type:`wchar_t` instead. +* Python initialization functions: + + * :c:func:`PySys_ResetWarnOptions`: + Clear :data:`sys.warnoptions` and :data:`!warnings.filters` instead. + * :c:func:`Py_GetExecPrefix`: + Get :data:`sys.exec_prefix` instead. + * :c:func:`Py_GetPath`: + Get :data:`sys.path` instead. + * :c:func:`Py_GetPrefix`: + Get :data:`sys.prefix` instead. + * :c:func:`Py_GetProgramFullPath`: + Get :data:`sys.executable` instead. + * :c:func:`Py_GetProgramName`: + Get :data:`sys.executable` instead. + * :c:func:`Py_GetPythonHome`: + Get :c:member:`PyConfig.home` + or the :envvar:`PYTHONHOME` environment variable instead. diff --git a/Doc/deprecations/c-api-pending-removal-in-future.rst b/Doc/deprecations/c-api-pending-removal-in-future.rst new file mode 100644 index 00000000..0c3ae52b --- /dev/null +++ b/Doc/deprecations/c-api-pending-removal-in-future.rst @@ -0,0 +1,51 @@ +Pending Removal in Future Versions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The following APIs are deprecated and will be removed, +although there is currently no date scheduled for their removal. + +* :c:macro:`Py_TPFLAGS_HAVE_FINALIZE`: + Unneeded since Python 3.8. +* :c:func:`PyErr_Fetch`: + Use :c:func:`PyErr_GetRaisedException` instead. +* :c:func:`PyErr_NormalizeException`: + Use :c:func:`PyErr_GetRaisedException` instead. +* :c:func:`PyErr_Restore`: + Use :c:func:`PyErr_SetRaisedException` instead. +* :c:func:`PyModule_GetFilename`: + Use :c:func:`PyModule_GetFilenameObject` instead. +* :c:func:`PyOS_AfterFork`: + Use :c:func:`PyOS_AfterFork_Child` instead. +* :c:func:`PySlice_GetIndicesEx`: + Use :c:func:`PySlice_Unpack` and :c:func:`PySlice_AdjustIndices` instead. +* :c:func:`!PyUnicode_AsDecodedObject`: + Use :c:func:`PyCodec_Decode` instead. +* :c:func:`!PyUnicode_AsDecodedUnicode`: + Use :c:func:`PyCodec_Decode` instead. +* :c:func:`!PyUnicode_AsEncodedObject`: + Use :c:func:`PyCodec_Encode` instead. +* :c:func:`!PyUnicode_AsEncodedUnicode`: + Use :c:func:`PyCodec_Encode` instead. +* :c:func:`PyUnicode_READY`: + Unneeded since Python 3.12 +* :c:func:`!PyErr_Display`: + Use :c:func:`PyErr_DisplayException` instead. +* :c:func:`!_PyErr_ChainExceptions`: + Use :c:func:`!_PyErr_ChainExceptions1` instead. +* :c:member:`!PyBytesObject.ob_shash` member: + call :c:func:`PyObject_Hash` instead. +* :c:member:`!PyDictObject.ma_version_tag` member. +* Thread Local Storage (TLS) API: + + * :c:func:`PyThread_create_key`: + Use :c:func:`PyThread_tss_alloc` instead. + * :c:func:`PyThread_delete_key`: + Use :c:func:`PyThread_tss_free` instead. + * :c:func:`PyThread_set_key_value`: + Use :c:func:`PyThread_tss_set` instead. + * :c:func:`PyThread_get_key_value`: + Use :c:func:`PyThread_tss_get` instead. + * :c:func:`PyThread_delete_key_value`: + Use :c:func:`PyThread_tss_delete` instead. + * :c:func:`PyThread_ReInitTLS`: + Unneeded since Python 3.7. diff --git a/Doc/deprecations/index.rst b/Doc/deprecations/index.rst new file mode 100644 index 00000000..aedea375 --- /dev/null +++ b/Doc/deprecations/index.rst @@ -0,0 +1,21 @@ +Deprecations +============ + +.. include:: pending-removal-in-3.13.rst + +.. include:: pending-removal-in-3.14.rst + +.. include:: pending-removal-in-3.15.rst + +.. include:: pending-removal-in-3.16.rst + +.. include:: pending-removal-in-future.rst + +C API Deprecations +------------------ + +.. include:: c-api-pending-removal-in-3.14.rst + +.. include:: c-api-pending-removal-in-3.15.rst + +.. include:: c-api-pending-removal-in-future.rst diff --git a/Doc/deprecations/pending-removal-in-3.13.rst b/Doc/deprecations/pending-removal-in-3.13.rst new file mode 100644 index 00000000..1c24b5b6 --- /dev/null +++ b/Doc/deprecations/pending-removal-in-3.13.rst @@ -0,0 +1,52 @@ +Pending Removal in Python 3.13 +------------------------------ + +Modules (see :pep:`594`): + +* :mod:`aifc` +* :mod:`audioop` +* :mod:`cgi` +* :mod:`cgitb` +* :mod:`chunk` +* :mod:`crypt` +* :mod:`imghdr` +* :mod:`mailcap` +* :mod:`msilib` +* :mod:`nis` +* :mod:`nntplib` +* :mod:`ossaudiodev` +* :mod:`pipes` +* :mod:`sndhdr` +* :mod:`spwd` +* :mod:`sunau` +* :mod:`telnetlib` +* :mod:`uu` +* :mod:`xdrlib` + +Other modules: + +* :mod:`!lib2to3`, and the :program:`2to3` program (:gh:`84540`) + +APIs: + +* :class:`!configparser.LegacyInterpolation` (:gh:`90765`) +* ``locale.resetlocale()`` (:gh:`90817`) +* :meth:`!turtle.RawTurtle.settiltangle` (:gh:`50096`) +* :func:`!unittest.findTestCases` (:gh:`50096`) +* :func:`!unittest.getTestCaseNames` (:gh:`50096`) +* :func:`!unittest.makeSuite` (:gh:`50096`) +* :meth:`!unittest.TestProgram.usageExit` (:gh:`67048`) +* :class:`!webbrowser.MacOSX` (:gh:`86421`) +* :class:`classmethod` descriptor chaining (:gh:`89519`) +* :mod:`importlib.resources` deprecated methods: + + * ``contents()`` + * ``is_resource()`` + * ``open_binary()`` + * ``open_text()`` + * ``path()`` + * ``read_binary()`` + * ``read_text()`` + + Use :func:`importlib.resources.files` instead. Refer to `importlib-resources: Migrating from Legacy + `_ (:gh:`106531`) diff --git a/Doc/deprecations/pending-removal-in-3.14.rst b/Doc/deprecations/pending-removal-in-3.14.rst new file mode 100644 index 00000000..b506b0f0 --- /dev/null +++ b/Doc/deprecations/pending-removal-in-3.14.rst @@ -0,0 +1,108 @@ +Pending Removal in Python 3.14 +------------------------------ + +* :mod:`argparse`: The *type*, *choices*, and *metavar* parameters + of :class:`!argparse.BooleanOptionalAction` are deprecated + and will be removed in 3.14. + (Contributed by Nikita Sobolev in :gh:`92248`.) + +* :mod:`ast`: The following features have been deprecated in documentation + since Python 3.8, now cause a :exc:`DeprecationWarning` to be emitted at + runtime when they are accessed or used, and will be removed in Python 3.14: + + * :class:`!ast.Num` + * :class:`!ast.Str` + * :class:`!ast.Bytes` + * :class:`!ast.NameConstant` + * :class:`!ast.Ellipsis` + + Use :class:`ast.Constant` instead. + (Contributed by Serhiy Storchaka in :gh:`90953`.) + +* :mod:`asyncio`: + + * The child watcher classes :class:`~asyncio.MultiLoopChildWatcher`, + :class:`~asyncio.FastChildWatcher`, :class:`~asyncio.AbstractChildWatcher` + and :class:`~asyncio.SafeChildWatcher` are deprecated and + will be removed in Python 3.14. + (Contributed by Kumar Aditya in :gh:`94597`.) + + * :func:`asyncio.set_child_watcher`, :func:`asyncio.get_child_watcher`, + :meth:`asyncio.AbstractEventLoopPolicy.set_child_watcher` and + :meth:`asyncio.AbstractEventLoopPolicy.get_child_watcher` are deprecated + and will be removed in Python 3.14. + (Contributed by Kumar Aditya in :gh:`94597`.) + + * The :meth:`~asyncio.get_event_loop` method of the + default event loop policy now emits a :exc:`DeprecationWarning` if there + is no current event loop set and it decides to create one. + (Contributed by Serhiy Storchaka and Guido van Rossum in :gh:`100160`.) + +* :mod:`collections.abc`: Deprecated :class:`~collections.abc.ByteString`. + Prefer :class:`!Sequence` or :class:`~collections.abc.Buffer`. + For use in typing, prefer a union, like ``bytes | bytearray``, + or :class:`collections.abc.Buffer`. + (Contributed by Shantanu Jain in :gh:`91896`.) + +* :mod:`email`: Deprecated the *isdst* parameter in :func:`email.utils.localtime`. + (Contributed by Alan Williams in :gh:`72346`.) + +* :mod:`importlib`: ``__package__`` and ``__cached__`` will cease to be set or + taken into consideration by the import system (:gh:`97879`). + +* :mod:`importlib.abc` deprecated classes: + + * :class:`!importlib.abc.ResourceReader` + * :class:`!importlib.abc.Traversable` + * :class:`!importlib.abc.TraversableResources` + + Use :mod:`importlib.resources.abc` classes instead: + + * :class:`importlib.resources.abc.Traversable` + * :class:`importlib.resources.abc.TraversableResources` + + (Contributed by Jason R. Coombs and Hugo van Kemenade in :gh:`93963`.) + +* :mod:`itertools` had undocumented, inefficient, historically buggy, + and inconsistent support for copy, deepcopy, and pickle operations. + This will be removed in 3.14 for a significant reduction in code + volume and maintenance burden. + (Contributed by Raymond Hettinger in :gh:`101588`.) + +* :mod:`multiprocessing`: The default start method will change to a safer one on + Linux, BSDs, and other non-macOS POSIX platforms where ``'fork'`` is currently + the default (:gh:`84559`). Adding a runtime warning about this was deemed too + disruptive as the majority of code is not expected to care. Use the + :func:`~multiprocessing.get_context` or + :func:`~multiprocessing.set_start_method` APIs to explicitly specify when + your code *requires* ``'fork'``. See :ref:`multiprocessing-start-methods`. + +* :mod:`pathlib`: :meth:`~pathlib.PurePath.is_relative_to` and + :meth:`~pathlib.PurePath.relative_to`: passing additional arguments is + deprecated. + +* :mod:`pkgutil`: :func:`~pkgutil.find_loader` and :func:`~pkgutil.get_loader` + now raise :exc:`DeprecationWarning`; + use :func:`importlib.util.find_spec` instead. + (Contributed by Nikita Sobolev in :gh:`97850`.) + +* :mod:`pty`: + + * ``master_open()``: use :func:`pty.openpty`. + * ``slave_open()``: use :func:`pty.openpty`. + +* :mod:`sqlite3`: + + * :data:`~sqlite3.version` and :data:`~sqlite3.version_info`. + + * :meth:`~sqlite3.Cursor.execute` and :meth:`~sqlite3.Cursor.executemany` + if :ref:`named placeholders ` are used and + *parameters* is a sequence instead of a :class:`dict`. + +* :mod:`typing`: :class:`~typing.ByteString`, deprecated since Python 3.9, + now causes a :exc:`DeprecationWarning` to be emitted when it is used. + +* :mod:`urllib`: + :class:`!urllib.parse.Quoter` is deprecated: it was not intended to be a + public API. + (Contributed by Gregory P. Smith in :gh:`88168`.) diff --git a/Doc/deprecations/pending-removal-in-3.15.rst b/Doc/deprecations/pending-removal-in-3.15.rst new file mode 100644 index 00000000..182a72b2 --- /dev/null +++ b/Doc/deprecations/pending-removal-in-3.15.rst @@ -0,0 +1,68 @@ +Pending Removal in Python 3.15 +------------------------------ + +* :class:`http.server.CGIHTTPRequestHandler` will be removed along with its + related ``--cgi`` flag to ``python -m http.server``. It was obsolete and + rarely used. No direct replacement exists. *Anything* is better than CGI + to interface a web server with a request handler. + +* :class:`locale`: :func:`locale.getdefaultlocale` was deprecated in Python 3.11 + and originally planned for removal in Python 3.13 (:gh:`90817`), + but removal has been postponed to Python 3.15. + Use :func:`locale.setlocale`, :func:`locale.getencoding` and + :func:`locale.getlocale` instead. + (Contributed by Hugo van Kemenade in :gh:`111187`.) + +* :mod:`pathlib`: + :meth:`pathlib.PurePath.is_reserved` is deprecated and scheduled for + removal in Python 3.15. From Python 3.13 onwards, use ``os.path.isreserved`` + to detect reserved paths on Windows. + +* :mod:`platform`: + :func:`~platform.java_ver` is deprecated and will be removed in 3.15. + It was largely untested, had a confusing API, + and was only useful for Jython support. + (Contributed by Nikita Sobolev in :gh:`116349`.) + +* :mod:`threading`: + Passing any arguments to :func:`threading.RLock` is now deprecated. + C version allows any numbers of args and kwargs, + but they are just ignored. Python version does not allow any arguments. + All arguments will be removed from :func:`threading.RLock` in Python 3.15. + (Contributed by Nikita Sobolev in :gh:`102029`.) + +* :class:`typing.NamedTuple`: + + * The undocumented keyword argument syntax for creating :class:`!NamedTuple` classes + (``NT = NamedTuple("NT", x=int)``) is deprecated, and will be disallowed in + 3.15. Use the class-based syntax or the functional syntax instead. + +* :mod:`types`: + + * :class:`types.CodeType`: Accessing :attr:`~codeobject.co_lnotab` was + deprecated in :pep:`626` + since 3.10 and was planned to be removed in 3.12, + but it only got a proper :exc:`DeprecationWarning` in 3.12. + May be removed in 3.15. + (Contributed by Nikita Sobolev in :gh:`101866`.) + +* :mod:`typing`: + + * When using the functional syntax to create a :class:`!NamedTuple` class, failing to + pass a value to the *fields* parameter (``NT = NamedTuple("NT")``) is + deprecated. Passing ``None`` to the *fields* parameter + (``NT = NamedTuple("NT", None)``) is also deprecated. Both will be + disallowed in Python 3.15. To create a :class:`!NamedTuple` class with 0 fields, use + ``class NT(NamedTuple): pass`` or ``NT = NamedTuple("NT", [])``. + +* :class:`typing.TypedDict`: When using the functional syntax to create a + :class:`!TypedDict` class, failing to pass a value to the *fields* parameter (``TD = + TypedDict("TD")``) is deprecated. Passing ``None`` to the *fields* parameter + (``TD = TypedDict("TD", None)``) is also deprecated. Both will be disallowed + in Python 3.15. To create a :class:`!TypedDict` class with 0 fields, use ``class + TD(TypedDict): pass`` or ``TD = TypedDict("TD", {})``. + +* :mod:`wave`: Deprecate the ``getmark()``, ``setmark()`` and ``getmarkers()`` + methods of the :class:`wave.Wave_read` and :class:`wave.Wave_write` classes. + They will be removed in Python 3.15. + (Contributed by Victor Stinner in :gh:`105096`.) diff --git a/Doc/deprecations/pending-removal-in-3.16.rst b/Doc/deprecations/pending-removal-in-3.16.rst new file mode 100644 index 00000000..f59a4037 --- /dev/null +++ b/Doc/deprecations/pending-removal-in-3.16.rst @@ -0,0 +1,20 @@ +Pending Removal in Python 3.16 +------------------------------ + +* The import system: + + * Setting :attr:`~module.__loader__` on a module while + failing to set :attr:`__spec__.loader ` + is deprecated. In Python 3.16, :attr:`!__loader__` will cease to be set or + taken into consideration by the import system or the standard library. + +* :mod:`array`: + :class:`array.array` ``'u'`` type (:c:type:`wchar_t`): + use the ``'w'`` type instead (``Py_UCS4``). + +* :mod:`builtins`: + ``~bool``, bitwise inversion on bool. + +* :mod:`symtable`: + Deprecate :meth:`symtable.Class.get_methods` due to the lack of interest. + (Contributed by Bénédikt Tran in :gh:`119698`.) diff --git a/Doc/deprecations/pending-removal-in-future.rst b/Doc/deprecations/pending-removal-in-future.rst new file mode 100644 index 00000000..c5981593 --- /dev/null +++ b/Doc/deprecations/pending-removal-in-future.rst @@ -0,0 +1,152 @@ +Pending Removal in Future Versions +---------------------------------- + +The following APIs will be removed in the future, +although there is currently no date scheduled for their removal. + +* :mod:`argparse`: Nesting argument groups and nesting mutually exclusive + groups are deprecated. + +* :mod:`array`'s ``'u'`` format code (:gh:`57281`) + +* :mod:`builtins`: + + * ``bool(NotImplemented)``. + * Generators: ``throw(type, exc, tb)`` and ``athrow(type, exc, tb)`` + signature is deprecated: use ``throw(exc)`` and ``athrow(exc)`` instead, + the single argument signature. + * Currently Python accepts numeric literals immediately followed by keywords, + for example ``0in x``, ``1or x``, ``0if 1else 2``. It allows confusing and + ambiguous expressions like ``[0x1for x in y]`` (which can be interpreted as + ``[0x1 for x in y]`` or ``[0x1f or x in y]``). A syntax warning is raised + if the numeric literal is immediately followed by one of keywords + :keyword:`and`, :keyword:`else`, :keyword:`for`, :keyword:`if`, + :keyword:`in`, :keyword:`is` and :keyword:`or`. In a future release it + will be changed to a syntax error. (:gh:`87999`) + * Support for ``__index__()`` and ``__int__()`` method returning non-int type: + these methods will be required to return an instance of a strict subclass of + :class:`int`. + * Support for ``__float__()`` method returning a strict subclass of + :class:`float`: these methods will be required to return an instance of + :class:`float`. + * Support for ``__complex__()`` method returning a strict subclass of + :class:`complex`: these methods will be required to return an instance of + :class:`complex`. + * Delegation of ``int()`` to ``__trunc__()`` method. + * Passing a complex number as the *real* or *imag* argument in the + :func:`complex` constructor is now deprecated; it should only be passed + as a single positional argument. + (Contributed by Serhiy Storchaka in :gh:`109218`.) + +* :mod:`calendar`: ``calendar.January`` and ``calendar.February`` constants are + deprecated and replaced by :data:`calendar.JANUARY` and + :data:`calendar.FEBRUARY`. + (Contributed by Prince Roshan in :gh:`103636`.) + +* :attr:`codeobject.co_lnotab`: use the :meth:`codeobject.co_lines` method + instead. + +* :mod:`datetime`: + + * :meth:`~datetime.datetime.utcnow`: + use ``datetime.datetime.now(tz=datetime.UTC)``. + * :meth:`~datetime.datetime.utcfromtimestamp`: + use ``datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)``. + +* :mod:`gettext`: Plural value must be an integer. + +* :mod:`importlib`: + + * ``load_module()`` method: use ``exec_module()`` instead. + * :func:`~importlib.util.cache_from_source` *debug_override* parameter is + deprecated: use the *optimization* parameter instead. + +* :mod:`importlib.metadata`: + + * ``EntryPoints`` tuple interface. + * Implicit ``None`` on return values. + +* :mod:`mailbox`: Use of StringIO input and text mode is deprecated, use + BytesIO and binary mode instead. + +* :mod:`os`: Calling :func:`os.register_at_fork` in multi-threaded process. + +* :class:`!pydoc.ErrorDuringImport`: A tuple value for *exc_info* parameter is + deprecated, use an exception instance. + +* :mod:`re`: More strict rules are now applied for numerical group references + and group names in regular expressions. Only sequence of ASCII digits is now + accepted as a numerical reference. The group name in bytes patterns and + replacement strings can now only contain ASCII letters and digits and + underscore. + (Contributed by Serhiy Storchaka in :gh:`91760`.) + +* :mod:`!sre_compile`, :mod:`!sre_constants` and :mod:`!sre_parse` modules. + +* :mod:`shutil`: :func:`~shutil.rmtree`'s *onerror* parameter is deprecated in + Python 3.12; use the *onexc* parameter instead. + +* :mod:`ssl` options and protocols: + + * :class:`ssl.SSLContext` without protocol argument is deprecated. + * :class:`ssl.SSLContext`: :meth:`~ssl.SSLContext.set_npn_protocols` and + :meth:`!selected_npn_protocol` are deprecated: use ALPN + instead. + * ``ssl.OP_NO_SSL*`` options + * ``ssl.OP_NO_TLS*`` options + * ``ssl.PROTOCOL_SSLv3`` + * ``ssl.PROTOCOL_TLS`` + * ``ssl.PROTOCOL_TLSv1`` + * ``ssl.PROTOCOL_TLSv1_1`` + * ``ssl.PROTOCOL_TLSv1_2`` + * ``ssl.TLSVersion.SSLv3`` + * ``ssl.TLSVersion.TLSv1`` + * ``ssl.TLSVersion.TLSv1_1`` + +* :func:`sysconfig.is_python_build` *check_home* parameter is deprecated and + ignored. + +* :mod:`threading` methods: + + * :meth:`!threading.Condition.notifyAll`: use :meth:`~threading.Condition.notify_all`. + * :meth:`!threading.Event.isSet`: use :meth:`~threading.Event.is_set`. + * :meth:`!threading.Thread.isDaemon`, :meth:`threading.Thread.setDaemon`: + use :attr:`threading.Thread.daemon` attribute. + * :meth:`!threading.Thread.getName`, :meth:`threading.Thread.setName`: + use :attr:`threading.Thread.name` attribute. + * :meth:`!threading.currentThread`: use :meth:`threading.current_thread`. + * :meth:`!threading.activeCount`: use :meth:`threading.active_count`. + +* :class:`typing.Text` (:gh:`92332`). + +* :class:`unittest.IsolatedAsyncioTestCase`: it is deprecated to return a value + that is not ``None`` from a test case. + +* :mod:`urllib.parse` deprecated functions: :func:`~urllib.parse.urlparse` instead + + * ``splitattr()`` + * ``splithost()`` + * ``splitnport()`` + * ``splitpasswd()`` + * ``splitport()`` + * ``splitquery()`` + * ``splittag()`` + * ``splittype()`` + * ``splituser()`` + * ``splitvalue()`` + * ``to_bytes()`` + +* :mod:`urllib.request`: :class:`~urllib.request.URLopener` and + :class:`~urllib.request.FancyURLopener` style of invoking requests is + deprecated. Use newer :func:`~urllib.request.urlopen` functions and methods. + +* :mod:`wsgiref`: ``SimpleHandler.stdout.write()`` should not do partial + writes. + +* :mod:`xml.etree.ElementTree`: Testing the truth value of an + :class:`~xml.etree.ElementTree.Element` is deprecated. In a future release it + will always return ``True``. Prefer explicit ``len(elem)`` or + ``elem is not None`` tests instead. + +* :meth:`zipimport.zipimporter.load_module` is deprecated: + use :meth:`~zipimport.zipimporter.exec_module` instead. diff --git a/Doc/extending/newtypes.rst b/Doc/extending/newtypes.rst index cb553cc2..4ee78d28 100644 --- a/Doc/extending/newtypes.rst +++ b/Doc/extending/newtypes.rst @@ -296,7 +296,7 @@ An interesting advantage of using the :c:member:`~PyTypeObject.tp_members` table descriptors that are used at runtime is that any attribute defined this way can have an associated doc string simply by providing the text in the table. An application can use the introspection API to retrieve the descriptor from the -class object, and get the doc string using its :attr:`!__doc__` attribute. +class object, and get the doc string using its :attr:`~type.__doc__` attribute. As with the :c:member:`~PyTypeObject.tp_methods` table, a sentinel entry with a :c:member:`~PyMethodDef.ml_name` value of ``NULL`` is required. diff --git a/Doc/extending/newtypes_tutorial.rst b/Doc/extending/newtypes_tutorial.rst index c2bc5f69..c5ef1e55 100644 --- a/Doc/extending/newtypes_tutorial.rst +++ b/Doc/extending/newtypes_tutorial.rst @@ -144,7 +144,7 @@ only used for variable-sized objects and should otherwise be zero. If you want your type to be subclassable from Python, and your type has the same :c:member:`~PyTypeObject.tp_basicsize` as its base type, you may have problems with multiple inheritance. A Python subclass of your type will have to list your type first - in its :attr:`~class.__bases__`, or else it will not be able to call your type's + in its :attr:`~type.__bases__`, or else it will not be able to call your type's :meth:`~object.__new__` method without getting an error. You can avoid this problem by ensuring that your type has a larger value for :c:member:`~PyTypeObject.tp_basicsize` than its base type does. Most of the time, this will be true anyway, because either your @@ -449,7 +449,7 @@ Further, the attributes can be deleted, setting the C pointers to ``NULL``. Eve though we can make sure the members are initialized to non-``NULL`` values, the members can be set to ``NULL`` if the attributes are deleted. -We define a single method, :meth:`!Custom.name()`, that outputs the objects name as the +We define a single method, :meth:`!Custom.name`, that outputs the objects name as the concatenation of the first and last names. :: static PyObject * diff --git a/Doc/faq/design.rst b/Doc/faq/design.rst index c8beb64e..e2710fab 100644 --- a/Doc/faq/design.rst +++ b/Doc/faq/design.rst @@ -70,7 +70,7 @@ operations. This means that as far as floating-point operations are concerned, Python behaves like many popular languages including C and Java. Many numbers that can be written easily in decimal notation cannot be expressed -exactly in binary floating-point. For example, after:: +exactly in binary floating point. For example, after:: >>> x = 1.2 @@ -87,7 +87,7 @@ which is exactly:: The typical precision of 53 bits provides Python floats with 15--16 decimal digits of accuracy. -For a fuller explanation, please see the :ref:`floating point arithmetic +For a fuller explanation, please see the :ref:`floating-point arithmetic ` chapter in the Python tutorial. @@ -328,7 +328,7 @@ Can Python be compiled to machine code, C or some other language? ----------------------------------------------------------------- `Cython `_ compiles a modified version of Python with -optional annotations into C extensions. `Nuitka `_ is +optional annotations into C extensions. `Nuitka `_ is an up-and-coming compiler of Python into C++ code, aiming to support the full Python language. @@ -345,7 +345,7 @@ to perform a garbage collection, obtain debugging statistics, and tune the collector's parameters. Other implementations (such as `Jython `_ or -`PyPy `_), however, can rely on a different mechanism +`PyPy `_), however, can rely on a different mechanism such as a full-blown garbage collector. This difference can cause some subtle porting problems if your Python code depends on the behavior of the reference counting implementation. diff --git a/Doc/faq/extending.rst b/Doc/faq/extending.rst index 1cff2c40..3147fda7 100644 --- a/Doc/faq/extending.rst +++ b/Doc/faq/extending.rst @@ -246,13 +246,12 @@ Then, when you run GDB: I want to compile a Python module on my Linux system, but some files are missing. Why? -------------------------------------------------------------------------------------- -Most packaged versions of Python don't include the -:file:`/usr/lib/python2.{x}/config/` directory, which contains various files +Most packaged versions of Python omit some files required for compiling Python extensions. -For Red Hat, install the python-devel RPM to get the necessary files. +For Red Hat, install the python3-devel RPM to get the necessary files. -For Debian, run ``apt-get install python-dev``. +For Debian, run ``apt-get install python3-dev``. How do I tell "incomplete input" from "invalid input"? ------------------------------------------------------ diff --git a/Doc/faq/general.rst b/Doc/faq/general.rst index eb859c5d..578777d7 100644 --- a/Doc/faq/general.rst +++ b/Doc/faq/general.rst @@ -309,10 +309,9 @@ 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 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 is not -maintained anymore `_. +`_. +Python 3.x is the recommended version and supported by most widely used libraries. +Python 2.x :pep:`is not maintained anymore <373>`. How many people are using Python? --------------------------------- diff --git a/Doc/faq/library.rst b/Doc/faq/library.rst index ac10a04d..45fd7eb1 100644 --- a/Doc/faq/library.rst +++ b/Doc/faq/library.rst @@ -825,12 +825,12 @@ is simple:: import random random.random() -This returns a random floating point number in the range [0, 1). +This returns a random floating-point number in the range [0, 1). There are also many other specialized generators in this module, such as: * ``randrange(a, b)`` chooses an integer in the range [a, b). -* ``uniform(a, b)`` chooses a floating point number in the range [a, b). +* ``uniform(a, b)`` chooses a floating-point number in the range [a, b). * ``normalvariate(mean, sdev)`` samples the normal (Gaussian) distribution. Some higher-level functions operate on sequences directly, such as: diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst index f43f69b8..7a867011 100644 --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -869,7 +869,7 @@ How do I convert a string to a number? -------------------------------------- For integers, use the built-in :func:`int` type constructor, e.g. ``int('144') -== 144``. Similarly, :func:`float` converts to floating-point, +== 144``. Similarly, :func:`float` converts to a floating-point number, e.g. ``float('144') == 144.0``. By default, these interpret the number as decimal, so that ``int('0144') == @@ -1013,7 +1013,7 @@ Not as such. For simple input parsing, the easiest approach is usually to split the line into whitespace-delimited words using the :meth:`~str.split` method of string objects and then convert decimal strings to numeric values using :func:`int` or -:func:`float`. :meth:`!split()` supports an optional "sep" parameter which is useful +:func:`float`. :meth:`!split` supports an optional "sep" parameter which is useful if the line uses something other than whitespace as a separator. For more complicated input parsing, regular expressions are more powerful @@ -1613,9 +1613,16 @@ method too, and it must do so carefully. The basic implementation of self.__dict__[name] = value ... -Most :meth:`!__setattr__` implementations must modify -:meth:`self.__dict__ ` to store -local state for self without causing an infinite recursion. +Many :meth:`~object.__setattr__` implementations call :meth:`!object.__setattr__` to set +an attribute on self without causing infinite recursion:: + + class X: + def __setattr__(self, name, value): + # Custom logic here... + object.__setattr__(self, name, value) + +Alternatively, it is possible to set attributes by inserting +entries into :attr:`self.__dict__ ` directly. How do I call a method defined in a base class from a derived class that extends it? @@ -1741,11 +1748,31 @@ but effective way to define class private variables. Any identifier of the form is textually replaced with ``_classname__spam``, where ``classname`` is the current class name with any leading underscores stripped. -This doesn't guarantee privacy: an outside user can still deliberately access -the "_classname__spam" attribute, and private values are visible in the object's -``__dict__``. Many Python programmers never bother to use private variable -names at all. +The identifier can be used unchanged within the class, but to access it outside +the class, the mangled name must be used: + +.. code-block:: python + + class A: + def __one(self): + return 1 + def two(self): + return 2 * self.__one() + + class B(A): + def three(self): + return 3 * self._A__one() + + four = 4 * A()._A__one() + +In particular, this does not guarantee privacy since an outside user can still +deliberately access the private attribute; many Python programmers never bother +to use private variable names at all. + +.. seealso:: + The :ref:`private name mangling specifications ` + for details and special cases. My class defines __del__ but it is not called when I delete the object. ----------------------------------------------------------------------- diff --git a/Doc/glossary.rst b/Doc/glossary.rst index d1745bf5..9b29699e 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -350,7 +350,7 @@ Glossary docstring A string literal which appears as the first expression in a class, function or module. While ignored when the suite is executed, it is - recognized by the compiler and put into the :attr:`!__doc__` attribute + recognized by the compiler and put into the :attr:`~definition.__doc__` attribute of the enclosing class, function or module. Since it is available via introspection, it is the canonical place for documentation of the object. @@ -437,7 +437,7 @@ Glossary ` for use with :data:`sys.meta_path`, and :term:`path entry finders ` for use with :data:`sys.path_hooks`. - See :ref:`importsystem` and :mod:`importlib` for much more detail. + See :ref:`finders-and-loaders` and :mod:`importlib` for much more detail. floor division Mathematical division that rounds down to nearest integer. The floor @@ -591,6 +591,14 @@ Glossary :ref:`idle` is a basic editor and interpreter environment which ships with the standard distribution of Python. + immortal + *Immortal objects* are a CPython implementation detail introduced + in :pep:`683`. + + If an object is immortal, its :term:`reference count` is never modified, + and therefore it is never deallocated while the interpreter is running. + For example, :const:`True` and :const:`None` are immortal in CPython. + immutable An object with a fixed value. Immutable objects include numbers, strings and tuples. Such an object cannot be altered. A new object has to @@ -742,8 +750,11 @@ Glossary loader An object that loads a module. It must define a method named :meth:`load_module`. A loader is typically returned by a - :term:`finder`. See :pep:`302` for details and - :class:`importlib.abc.Loader` for an :term:`abstract base class`. + :term:`finder`. See also: + + * :ref:`finders-and-loaders` + * :class:`importlib.abc.Loader` + * :pep:`302` locale encoding On Unix, it is the encoding of the LC_CTYPE locale. It can be set with @@ -813,6 +824,8 @@ Glossary A namespace containing the import-related information used to load a module. An instance of :class:`importlib.machinery.ModuleSpec`. + See also :ref:`module-specs`. + MRO See :term:`method resolution order`. @@ -1098,7 +1111,7 @@ Glossary :class:`tuple`, and :class:`bytes`. Note that :class:`dict` also supports :meth:`~object.__getitem__` and :meth:`!__len__`, but is considered a mapping rather than a sequence because the lookups use arbitrary - :term:`immutable` keys rather than integers. + :term:`hashable` keys rather than integers. The :class:`collections.abc.Sequence` abstract base class defines a much richer interface that goes beyond just @@ -1126,6 +1139,17 @@ Glossary when several are given, such as in ``variable_name[1:3:5]``. The bracket (subscript) notation uses :class:`slice` objects internally. + soft deprecated + A soft deprecated API should not be used in new code, + but it is safe for already existing code to use it. + The API remains documented and tested, but will not be enhanced further. + + Soft deprecation, unlike normal deprecation, does not plan on removing the API + and will not emit warnings. + + See `PEP 387: Soft Deprecation + `_. + special method .. index:: pair: special; method @@ -1193,7 +1217,7 @@ Glossary type The type of a Python object determines what kind of object it is; every object has a type. An object's type is accessible as its - :attr:`~instance.__class__` attribute or can be retrieved with + :attr:`~object.__class__` attribute or can be retrieved with ``type(obj)``. type alias diff --git a/Doc/howto/annotations.rst b/Doc/howto/annotations.rst index be8c7e6c..174078b8 100644 --- a/Doc/howto/annotations.rst +++ b/Doc/howto/annotations.rst @@ -102,9 +102,9 @@ Your code will have to have a separate code path if the object you're examining is a class (``isinstance(o, type)``). In that case, best practice relies on an implementation detail of Python 3.9 and before: if a class has annotations defined, -they are stored in the class's ``__dict__`` dictionary. Since +they are stored in the class's :attr:`~type.__dict__` dictionary. Since the class may or may not have annotations defined, best practice -is to call the ``get`` method on the class dict. +is to call the :meth:`~dict.get` method on the class dict. To put it all together, here is some sample code that safely accesses the ``__annotations__`` attribute on an arbitrary @@ -121,8 +121,8 @@ the type of ``ann`` using :func:`isinstance` before further examination. Note that some exotic or malformed type objects may not have -a ``__dict__`` attribute, so for extra safety you may also wish -to use :func:`getattr` to access ``__dict__``. +a :attr:`~type.__dict__` attribute, so for extra safety you may also wish +to use :func:`getattr` to access :attr:`!__dict__`. Manually Un-Stringizing Stringized Annotations diff --git a/Doc/howto/argparse-optparse.rst b/Doc/howto/argparse-optparse.rst new file mode 100644 index 00000000..cef2d893 --- /dev/null +++ b/Doc/howto/argparse-optparse.rst @@ -0,0 +1,55 @@ +.. currentmodule:: argparse + +.. _upgrading-optparse-code: + +========================== +Upgrading optparse code +========================== + +Originally, the :mod:`argparse` module had attempted to maintain compatibility +with :mod:`optparse`. However, :mod:`optparse` was difficult to extend +transparently, particularly with the changes required to support +``nargs=`` specifiers and better usage messages. When most everything in +:mod:`optparse` had either been copy-pasted over or monkey-patched, it no +longer seemed practical to try to maintain the backwards compatibility. + +The :mod:`argparse` module improves on the :mod:`optparse` +module in a number of ways including: + +* Handling positional arguments. +* Supporting subcommands. +* Allowing alternative option prefixes like ``+`` and ``/``. +* Handling zero-or-more and one-or-more style arguments. +* Producing more informative usage messages. +* Providing a much simpler interface for custom ``type`` and ``action``. + +A partial upgrade path from :mod:`optparse` to :mod:`argparse`: + +* Replace all :meth:`optparse.OptionParser.add_option` calls with + :meth:`ArgumentParser.add_argument` calls. + +* Replace ``(options, args) = parser.parse_args()`` with ``args = + parser.parse_args()`` and add additional :meth:`ArgumentParser.add_argument` + calls for the positional arguments. Keep in mind that what was previously + called ``options``, now in the :mod:`argparse` context is called ``args``. + +* Replace :meth:`optparse.OptionParser.disable_interspersed_args` + by using :meth:`~ArgumentParser.parse_intermixed_args` instead of + :meth:`~ArgumentParser.parse_args`. + +* Replace callback actions and the ``callback_*`` keyword arguments with + ``type`` or ``action`` arguments. + +* Replace string names for ``type`` keyword arguments with the corresponding + type objects (e.g. int, float, complex, etc). + +* Replace :class:`optparse.Values` with :class:`Namespace` and + :exc:`optparse.OptionError` and :exc:`optparse.OptionValueError` with + :exc:`ArgumentError`. + +* Replace strings with implicit arguments such as ``%default`` or ``%prog`` with + the standard Python syntax to use dictionaries to format strings, that is, + ``%(default)s`` and ``%(prog)s``. + +* Replace the OptionParser constructor ``version`` argument with a call to + ``parser.add_argument('--version', action='version', version='')``. diff --git a/Doc/howto/argparse.rst b/Doc/howto/argparse.rst index ae5bab90..ac2a0465 100644 --- a/Doc/howto/argparse.rst +++ b/Doc/howto/argparse.rst @@ -841,6 +841,53 @@ translated messages. To translate your own strings in the :mod:`argparse` output, use :mod:`gettext`. +Custom type converters +====================== + +The :mod:`argparse` module allows you to specify custom type converters for +your command-line arguments. This allows you to modify user input before it's +stored in the :class:`argparse.Namespace`. This can be useful when you need to +pre-process the input before it is used in your program. + +When using a custom type converter, you can use any callable that takes a +single string argument (the argument value) and returns the converted value. +However, if you need to handle more complex scenarios, you can use a custom +action class with the **action** parameter instead. + +For example, let's say you want to handle arguments with different prefixes and +process them accordingly:: + + import argparse + + parser = argparse.ArgumentParser(prefix_chars='-+') + + parser.add_argument('-a', metavar='', action='append', + type=lambda x: ('-', x)) + parser.add_argument('+a', metavar='', action='append', + type=lambda x: ('+', x)) + + args = parser.parse_args() + print(args) + +Output: + +.. code-block:: shell-session + + $ python prog.py -a value1 +a value2 + Namespace(a=[('-', 'value1'), ('+', 'value2')]) + +In this example, we: + +* Created a parser with custom prefix characters using the ``prefix_chars`` + parameter. + +* Defined two arguments, ``-a`` and ``+a``, which used the ``type`` parameter to + create custom type converters to store the value in a tuple with the prefix. + +Without the custom type converters, the arguments would have treated the ``-a`` +and ``+a`` as the same argument, which would have been undesirable. By using custom +type converters, we were able to differentiate between the two arguments. + Conclusion ========== diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index 330402d1..ac73fcb3 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -42,7 +42,7 @@ add new capabilities one by one. Simple example: A descriptor that returns a constant ---------------------------------------------------- -The :class:`Ten` class is a descriptor whose :meth:`__get__` method always +The :class:`!Ten` class is a descriptor whose :meth:`~object.__get__` method always returns the constant ``10``: .. testcode:: @@ -120,10 +120,10 @@ different, updated answers each time:: 2 Besides showing how descriptors can run computations, this example also -reveals the purpose of the parameters to :meth:`__get__`. The *self* +reveals the purpose of the parameters to :meth:`~object.__get__`. The *self* parameter is *size*, an instance of *DirectorySize*. The *obj* parameter is either *g* or *s*, an instance of *Directory*. It is the *obj* parameter that -lets the :meth:`__get__` method learn the target directory. The *objtype* +lets the :meth:`~object.__get__` method learn the target directory. The *objtype* parameter is the class *Directory*. @@ -133,7 +133,7 @@ Managed attributes A popular use for descriptors is managing access to instance data. The descriptor is assigned to a public attribute in the class dictionary while the actual data is stored as a private attribute in the instance dictionary. The -descriptor's :meth:`__get__` and :meth:`__set__` methods are triggered when +descriptor's :meth:`~object.__get__` and :meth:`~object.__set__` methods are triggered when the public attribute is accessed. In the following example, *age* is the public attribute and *_age* is the @@ -215,9 +215,9 @@ Customized names When a class uses descriptors, it can inform each descriptor about which variable name was used. -In this example, the :class:`Person` class has two descriptor instances, -*name* and *age*. When the :class:`Person` class is defined, it makes a -callback to :meth:`__set_name__` in *LoggedAccess* so that the field names can +In this example, the :class:`!Person` class has two descriptor instances, +*name* and *age*. When the :class:`!Person` class is defined, it makes a +callback to :meth:`~object.__set_name__` in *LoggedAccess* so that the field names can be recorded, giving each descriptor its own *public_name* and *private_name*: .. testcode:: @@ -253,8 +253,8 @@ be recorded, giving each descriptor its own *public_name* and *private_name*: def birthday(self): self.age += 1 -An interactive session shows that the :class:`Person` class has called -:meth:`__set_name__` so that the field names would be recorded. Here +An interactive session shows that the :class:`!Person` class has called +:meth:`~object.__set_name__` so that the field names would be recorded. Here we call :func:`vars` to look up the descriptor without triggering it: .. doctest:: @@ -294,10 +294,10 @@ The two *Person* instances contain only the private names: Closing thoughts ---------------- -A :term:`descriptor` is what we call any object that defines :meth:`__get__`, -:meth:`__set__`, or :meth:`__delete__`. +A :term:`descriptor` is what we call any object that defines :meth:`~object.__get__`, +:meth:`~object.__set__`, or :meth:`~object.__delete__`. -Optionally, descriptors can have a :meth:`__set_name__` method. This is only +Optionally, descriptors can have a :meth:`~object.__set_name__` method. This is only used in cases where a descriptor needs to know either the class where it was created or the name of class variable it was assigned to. (This method, if present, is called even if the class is not a descriptor.) @@ -337,7 +337,7 @@ any data, it verifies that the new value meets various type and range restrictions. If those restrictions aren't met, it raises an exception to prevent data corruption at its source. -This :class:`Validator` class is both an :term:`abstract base class` and a +This :class:`!Validator` class is both an :term:`abstract base class` and a managed attribute descriptor: .. testcode:: @@ -360,8 +360,8 @@ managed attribute descriptor: def validate(self, value): pass -Custom validators need to inherit from :class:`Validator` and must supply a -:meth:`validate` method to test various restrictions as needed. +Custom validators need to inherit from :class:`!Validator` and must supply a +:meth:`!validate` method to test various restrictions as needed. Custom validators @@ -369,13 +369,13 @@ Custom validators Here are three practical data validation utilities: -1) :class:`OneOf` verifies that a value is one of a restricted set of options. +1) :class:`!OneOf` verifies that a value is one of a restricted set of options. -2) :class:`Number` verifies that a value is either an :class:`int` or +2) :class:`!Number` verifies that a value is either an :class:`int` or :class:`float`. Optionally, it verifies that a value is between a given minimum or maximum. -3) :class:`String` verifies that a value is a :class:`str`. Optionally, it +3) :class:`!String` verifies that a value is a :class:`str`. Optionally, it validates a given minimum or maximum length. It can validate a user-defined `predicate `_ as well. @@ -498,8 +498,8 @@ Definition and introduction --------------------------- In general, a descriptor is an attribute value that has one of the methods in -the descriptor protocol. Those methods are :meth:`__get__`, :meth:`__set__`, -and :meth:`__delete__`. If any of those methods are defined for an +the descriptor protocol. Those methods are :meth:`~object.__get__`, :meth:`~object.__set__`, +and :meth:`~object.__delete__`. If any of those methods are defined for an attribute, it is said to be a :term:`descriptor`. The default behavior for attribute access is to get, set, or delete the @@ -513,7 +513,7 @@ were defined. Descriptors are a powerful, general purpose protocol. They are the mechanism behind properties, methods, static methods, class methods, and -:func:`super()`. They are used throughout Python itself. Descriptors +:func:`super`. They are used throughout Python itself. Descriptors simplify the underlying C code and offer a flexible set of new tools for everyday Python programs. @@ -531,8 +531,8 @@ That is all there is to it. Define any of these methods and an object is considered a descriptor and can override default behavior upon being looked up as an attribute. -If an object defines :meth:`__set__` or :meth:`__delete__`, it is considered -a data descriptor. Descriptors that only define :meth:`__get__` are called +If an object defines :meth:`~object.__set__` or :meth:`~object.__delete__`, it is considered +a data descriptor. Descriptors that only define :meth:`~object.__get__` are called non-data descriptors (they are often used for methods but other uses are possible). @@ -542,9 +542,9 @@ has an entry with the same name as a data descriptor, the data descriptor takes precedence. If an instance's dictionary has an entry with the same name as a non-data descriptor, the dictionary entry takes precedence. -To make a read-only data descriptor, define both :meth:`__get__` and -:meth:`__set__` with the :meth:`__set__` raising an :exc:`AttributeError` when -called. Defining the :meth:`__set__` method with an exception raising +To make a read-only data descriptor, define both :meth:`~object.__get__` and +:meth:`~object.__set__` with the :meth:`~object.__set__` raising an :exc:`AttributeError` when +called. Defining the :meth:`~object.__set__` method with an exception raising placeholder is enough to make it a data descriptor. @@ -559,8 +559,8 @@ attribute access. The expression ``obj.x`` looks up the attribute ``x`` in the chain of namespaces for ``obj``. If the search finds a descriptor outside of the -instance ``__dict__``, its :meth:`__get__` method is invoked according to the -precedence rules listed below. +instance :attr:`~object.__dict__`, its :meth:`~object.__get__` method is +invoked according to the precedence rules listed below. The details of invocation depend on whether ``obj`` is an object, class, or instance of super. @@ -571,7 +571,7 @@ Invocation from an instance Instance lookup scans through a chain of namespaces giving data descriptors the highest priority, followed by instance variables, then non-data -descriptors, then class variables, and lastly :meth:`__getattr__` if it is +descriptors, then class variables, and lastly :meth:`~object.__getattr__` if it is provided. If a descriptor is found for ``a.x``, then it is invoked with: @@ -716,12 +716,12 @@ a pure Python equivalent: >>> object_getattribute(u2, 'x') == u2.x == (D1, u2, U2) True -Note, there is no :meth:`__getattr__` hook in the :meth:`__getattribute__` -code. That is why calling :meth:`__getattribute__` directly or with -``super().__getattribute__`` will bypass :meth:`__getattr__` entirely. +Note, there is no :meth:`~object.__getattr__` hook in the :meth:`~object.__getattribute__` +code. That is why calling :meth:`~object.__getattribute__` directly or with +``super().__getattribute__`` will bypass :meth:`~object.__getattr__` entirely. Instead, it is the dot operator and the :func:`getattr` function that are -responsible for invoking :meth:`__getattr__` whenever :meth:`__getattribute__` +responsible for invoking :meth:`~object.__getattr__` whenever :meth:`~object.__getattribute__` raises an :exc:`AttributeError`. Their logic is encapsulated in a helper function: @@ -773,8 +773,8 @@ Invocation from a class ----------------------- The logic for a dotted lookup such as ``A.x`` is in -:meth:`type.__getattribute__`. The steps are similar to those for -:meth:`object.__getattribute__` but the instance dictionary lookup is replaced +:meth:`!type.__getattribute__`. The steps are similar to those for +:meth:`!object.__getattribute__` but the instance dictionary lookup is replaced by a search through the class's :term:`method resolution order`. If a descriptor is found, it is invoked with ``desc.__get__(None, A)``. @@ -786,8 +786,8 @@ The full C implementation can be found in :c:func:`!type_getattro` and Invocation from super --------------------- -The logic for super's dotted lookup is in the :meth:`__getattribute__` method for -object returned by :class:`super()`. +The logic for super's dotted lookup is in the :meth:`~object.__getattribute__` method for +object returned by :func:`super`. A dotted lookup such as ``super(A, obj).m`` searches ``obj.__class__.__mro__`` for the base class ``B`` immediately following ``A`` and then returns @@ -803,21 +803,21 @@ The full C implementation can be found in :c:func:`!super_getattro` in Summary of invocation logic --------------------------- -The mechanism for descriptors is embedded in the :meth:`__getattribute__()` +The mechanism for descriptors is embedded in the :meth:`~object.__getattribute__` methods for :class:`object`, :class:`type`, and :func:`super`. The important points to remember are: -* Descriptors are invoked by the :meth:`__getattribute__` method. +* Descriptors are invoked by the :meth:`~object.__getattribute__` method. * Classes inherit this machinery from :class:`object`, :class:`type`, or :func:`super`. -* Overriding :meth:`__getattribute__` prevents automatic descriptor calls +* Overriding :meth:`~object.__getattribute__` prevents automatic descriptor calls because all the descriptor logic is in that method. -* :meth:`object.__getattribute__` and :meth:`type.__getattribute__` make - different calls to :meth:`__get__`. The first includes the instance and may +* :meth:`!object.__getattribute__` and :meth:`!type.__getattribute__` make + different calls to :meth:`~object.__get__`. The first includes the instance and may include the class. The second puts in ``None`` for the instance and always includes the class. @@ -832,16 +832,16 @@ Automatic name notification Sometimes it is desirable for a descriptor to know what class variable name it was assigned to. When a new class is created, the :class:`type` metaclass scans the dictionary of the new class. If any of the entries are descriptors -and if they define :meth:`__set_name__`, that method is called with two +and if they define :meth:`~object.__set_name__`, that method is called with two arguments. The *owner* is the class where the descriptor is used, and the *name* is the class variable the descriptor was assigned to. The implementation details are in :c:func:`!type_new` and :c:func:`!set_names` in :source:`Objects/typeobject.c`. -Since the update logic is in :meth:`type.__new__`, notifications only take +Since the update logic is in :meth:`!type.__new__`, notifications only take place at the time of class creation. If descriptors are added to the class -afterwards, :meth:`__set_name__` will need to be called manually. +afterwards, :meth:`~object.__set_name__` will need to be called manually. ORM example @@ -870,7 +870,7 @@ care of lookups or updates: conn.execute(self.store, [value, obj.key]) conn.commit() -We can use the :class:`Field` class to define `models +We can use the :class:`!Field` class to define `models `_ that describe the schema for each table in a database: @@ -1150,7 +1150,7 @@ to wrap access to the value attribute in a property data descriptor: self.recalc() return self._value -Either the built-in :func:`property` or our :func:`Property` equivalent would +Either the built-in :func:`property` or our :func:`!Property` equivalent would work in this example. @@ -1183,7 +1183,7 @@ roughly equivalent to: return func(obj, *args, **kwargs) To support automatic creation of methods, functions include the -:meth:`__get__` method for binding methods during attribute access. This +:meth:`~object.__get__` method for binding methods during attribute access. This means that functions are non-data descriptors that return bound methods during dotted lookup from an instance. Here's how it works: @@ -1215,19 +1215,19 @@ The function has a :term:`qualified name` attribute to support introspection: 'D.f' Accessing the function through the class dictionary does not invoke -:meth:`__get__`. Instead, it just returns the underlying function object:: +:meth:`~object.__get__`. Instead, it just returns the underlying function object:: >>> D.__dict__['f'] -Dotted access from a class calls :meth:`__get__` which just returns the +Dotted access from a class calls :meth:`~object.__get__` which just returns the underlying function unchanged:: >>> D.f The interesting behavior occurs during dotted access from an instance. The -dotted lookup calls :meth:`__get__` which returns a bound method object:: +dotted lookup calls :meth:`~object.__get__` which returns a bound method object:: >>> d = D() >>> d.f @@ -1252,7 +1252,7 @@ Kinds of methods Non-data descriptors provide a simple mechanism for variations on the usual patterns of binding functions into methods. -To recap, functions have a :meth:`__get__` method so that they can be converted +To recap, functions have a :meth:`~object.__get__` method so that they can be converted to a method when accessed as attributes. The non-data descriptor transforms an ``obj.f(*args)`` call into ``f(obj, *args)``. Calling ``cls.f(*args)`` becomes ``f(*args)``. @@ -1682,7 +1682,7 @@ by member descriptors: 'Emulate member_repr() in Objects/descrobject.c' return f'' -The :meth:`type.__new__` method takes care of adding member objects to class +The :meth:`!type.__new__` method takes care of adding member objects to class variables: .. testcode:: @@ -1733,7 +1733,7 @@ Python: ) super().__delattr__(name) -To use the simulation in a real class, just inherit from :class:`Object` and +To use the simulation in a real class, just inherit from :class:`!Object` and set the :term:`metaclass` to :class:`Type`: .. testcode:: diff --git a/Doc/howto/enum.rst b/Doc/howto/enum.rst index ffdafb74..9b6bb613 100644 --- a/Doc/howto/enum.rst +++ b/Doc/howto/enum.rst @@ -7,7 +7,7 @@ Enum HOWTO .. currentmodule:: enum An :class:`Enum` is a set of symbolic names bound to unique values. They are -similar to global variables, but they offer a more useful :func:`repr()`, +similar to global variables, but they offer a more useful :func:`repr`, grouping, type-safety, and a few other features. They are most useful when you have a variable that can take one of a limited @@ -62,12 +62,12 @@ The *type* of an enumeration member is the enum it belongs to:: >>> isinstance(Weekday.FRIDAY, Weekday) True -Enum members have an attribute that contains just their :attr:`name`:: +Enum members have an attribute that contains just their :attr:`!name`:: >>> print(Weekday.TUESDAY.name) TUESDAY -Likewise, they have an attribute for their :attr:`value`:: +Likewise, they have an attribute for their :attr:`!value`:: >>> Weekday.WEDNESDAY.value @@ -75,17 +75,18 @@ Likewise, they have an attribute for their :attr:`value`:: Unlike many languages that treat enumerations solely as name/value pairs, Python Enums can have behavior added. For example, :class:`datetime.date` -has two methods for returning the weekday: :meth:`weekday` and :meth:`isoweekday`. +has two methods for returning the weekday: +:meth:`~datetime.date.weekday` and :meth:`~datetime.date.isoweekday`. The difference is that one of them counts from 0-6 and the other from 1-7. -Rather than keep track of that ourselves we can add a method to the :class:`Weekday` -enum to extract the day from the :class:`date` instance and return the matching +Rather than keep track of that ourselves we can add a method to the :class:`!Weekday` +enum to extract the day from the :class:`~datetime.date` instance and return the matching enum member:: @classmethod def from_date(cls, date): return cls(date.isoweekday()) -The complete :class:`Weekday` enum now looks like this:: +The complete :class:`!Weekday` enum now looks like this:: >>> class Weekday(Enum): ... MONDAY = 1 @@ -108,7 +109,7 @@ Now we can find out what today is! Observe:: Of course, if you're reading this on some other day, you'll see that day instead. -This :class:`Weekday` enum is great if our variable only needs one day, but +This :class:`!Weekday` enum is great if our variable only needs one day, but what if we need several? Maybe we're writing a function to plot chores during a week, and don't want to use a :class:`list` -- we could use a different type of :class:`Enum`:: @@ -126,7 +127,7 @@ of :class:`Enum`:: We've changed two things: we're inherited from :class:`Flag`, and the values are all powers of 2. -Just like the original :class:`Weekday` enum above, we can have a single selection:: +Just like the original :class:`!Weekday` enum above, we can have a single selection:: >>> first_week_day = Weekday.MONDAY >>> first_week_day @@ -165,7 +166,7 @@ And a function to display the chores for a given day:: answer SO questions In cases where the actual values of the members do not matter, you can save -yourself some work and use :func:`auto()` for the values:: +yourself some work and use :func:`auto` for the values:: >>> from enum import auto >>> class Weekday(Flag): @@ -201,7 +202,7 @@ If you want to access enum members by *name*, use item access:: >>> Color['GREEN'] -If you have an enum member and need its :attr:`name` or :attr:`value`:: +If you have an enum member and need its :attr:`!name` or :attr:`!value`:: >>> member = Color.RED >>> member.name @@ -282,7 +283,7 @@ If the exact value is unimportant you can use :class:`auto`:: >>> [member.value for member in Color] [1, 2, 3] -The values are chosen by :func:`_generate_next_value_`, which can be +The values are chosen by :func:`~Enum._generate_next_value_`, which can be overridden:: >>> class AutoName(Enum): @@ -301,7 +302,7 @@ overridden:: .. note:: - The :meth:`_generate_next_value_` method must be defined before any members. + The :meth:`~Enum._generate_next_value_` method must be defined before any members. Iteration --------- @@ -422,18 +423,18 @@ Then:: The rules for what is allowed are as follows: names that start and end with a single underscore are reserved by enum and cannot be used; all other attributes defined within an enumeration will become members of this -enumeration, with the exception of special methods (:meth:`__str__`, -:meth:`__add__`, etc.), descriptors (methods are also descriptors), and -variable names listed in :attr:`_ignore_`. +enumeration, with the exception of special methods (:meth:`~object.__str__`, +:meth:`~object.__add__`, etc.), descriptors (methods are also descriptors), and +variable names listed in :attr:`~Enum._ignore_`. -Note: if your enumeration defines :meth:`__new__` and/or :meth:`__init__`, +Note: if your enumeration defines :meth:`~object.__new__` and/or :meth:`~object.__init__`, any value(s) given to the enum member will be passed into those methods. See `Planet`_ for an example. .. note:: - The :meth:`__new__` method, if defined, is used during creation of the Enum - members; it is then replaced by Enum's :meth:`__new__` which is used after + The :meth:`~object.__new__` method, if defined, is used during creation of the Enum + members; it is then replaced by Enum's :meth:`~object.__new__` which is used after class creation for lookup of existing members. See :ref:`new-vs-init` for more details. @@ -525,7 +526,7 @@ from that module. nested in other classes. It is possible to modify how enum members are pickled/unpickled by defining -:meth:`__reduce_ex__` in the enumeration class. The default method is by-value, +:meth:`~object.__reduce_ex__` in the enumeration class. The default method is by-value, but enums with complicated values may want to use by-name:: >>> import enum @@ -561,7 +562,7 @@ values. The last two options enable assigning arbitrary values to enumerations; the others auto-assign increasing integers starting with 1 (use the ``start`` parameter to specify a different starting value). A new class derived from :class:`Enum` is returned. In other words, the above -assignment to :class:`Animal` is equivalent to:: +assignment to :class:`!Animal` is equivalent to:: >>> class Animal(Enum): ... ANT = 1 @@ -589,7 +590,7 @@ The solution is to specify the module name explicitly as follows:: the source, pickling will be disabled. The new pickle protocol 4 also, in some circumstances, relies on -:attr:`~definition.__qualname__` being set to the location where pickle will be able +:attr:`~type.__qualname__` being set to the location where pickle will be able to find the class. For example, if the class was made available in class SomeData in the global scope:: @@ -872,7 +873,7 @@ simple to implement independently:: pass This demonstrates how similar derived enumerations can be defined; for example -a :class:`FloatEnum` that mixes in :class:`float` instead of :class:`int`. +a :class:`!FloatEnum` that mixes in :class:`float` instead of :class:`int`. Some rules: @@ -886,32 +887,32 @@ Some rules: additional type, all the members must have values of that type, e.g. :class:`int` above. This restriction does not apply to mix-ins which only add methods and don't specify another type. -4. When another data type is mixed in, the :attr:`value` attribute is *not the +4. When another data type is mixed in, the :attr:`~Enum.value` attribute is *not the same* as the enum member itself, although it is equivalent and will compare equal. -5. A ``data type`` is a mixin that defines :meth:`__new__`, or a +5. A ``data type`` is a mixin that defines :meth:`~object.__new__`, or a :class:`~dataclasses.dataclass` 6. %-style formatting: ``%s`` and ``%r`` call the :class:`Enum` class's - :meth:`__str__` and :meth:`__repr__` respectively; other codes (such as + :meth:`~object.__str__` and :meth:`~object.__repr__` respectively; other codes (such as ``%i`` or ``%h`` for IntEnum) treat the enum member as its mixed-in type. 7. :ref:`Formatted string literals `, :meth:`str.format`, - and :func:`format` will use the enum's :meth:`__str__` method. + and :func:`format` will use the enum's :meth:`~object.__str__` method. .. note:: Because :class:`IntEnum`, :class:`IntFlag`, and :class:`StrEnum` are designed to be drop-in replacements for existing constants, their - :meth:`__str__` method has been reset to their data types' - :meth:`__str__` method. + :meth:`~object.__str__` method has been reset to their data types' + :meth:`~object.__str__` method. .. _new-vs-init: -When to use :meth:`__new__` vs. :meth:`__init__` ------------------------------------------------- +When to use :meth:`~object.__new__` vs. :meth:`~object.__init__` +---------------------------------------------------------------- -:meth:`__new__` must be used whenever you want to customize the actual value of +:meth:`~object.__new__` must be used whenever you want to customize the actual value of the :class:`Enum` member. Any other modifications may go in either -:meth:`__new__` or :meth:`__init__`, with :meth:`__init__` being preferred. +:meth:`~object.__new__` or :meth:`~object.__init__`, with :meth:`~object.__init__` being preferred. For example, if you want to pass several items to the constructor, but only want one of them to be the value:: @@ -950,28 +951,28 @@ Finer Points Supported ``__dunder__`` names """""""""""""""""""""""""""""" -:attr:`__members__` is a read-only ordered mapping of ``member_name``:``member`` +:attr:`~enum.EnumType.__members__` is a read-only ordered mapping of ``member_name``:``member`` items. It is only available on the class. -:meth:`__new__`, if specified, must create and return the enum members; it is -also a very good idea to set the member's :attr:`_value_` appropriately. Once +:meth:`~object.__new__`, if specified, must create and return the enum members; it is +also a very good idea to set the member's :attr:`~Enum._value_` appropriately. Once all the members are created it is no longer used. Supported ``_sunder_`` names """""""""""""""""""""""""""" -- ``_name_`` -- name of the member -- ``_value_`` -- value of the member; can be set / modified in ``__new__`` +- :attr:`~Enum._name_` -- name of the member +- :attr:`~Enum._value_` -- value of the member; can be set / modified in ``__new__`` -- ``_missing_`` -- a lookup function used when a value is not found; may be +- :meth:`~Enum._missing_` -- a lookup function used when a value is not found; may be overridden -- ``_ignore_`` -- a list of names, either as a :class:`list` or a :class:`str`, +- :attr:`~Enum._ignore_` -- a list of names, either as a :class:`list` or a :class:`str`, that will not be transformed into members, and will be removed from the final class -- ``_order_`` -- used in Python 2/3 code to ensure member order is consistent +- :attr:`~Enum._order_` -- used in Python 2/3 code to ensure member order is consistent (class attribute, removed during class creation) -- ``_generate_next_value_`` -- used by the `Functional API`_ and by +- :meth:`~Enum._generate_next_value_` -- used by the `Functional API`_ and by :class:`auto` to get an appropriate value for an enum member; may be overridden @@ -986,7 +987,7 @@ Supported ``_sunder_`` names .. versionadded:: 3.6 ``_missing_``, ``_order_``, ``_generate_next_value_`` .. versionadded:: 3.7 ``_ignore_`` -To help keep Python 2 / Python 3 code in sync an :attr:`_order_` attribute can +To help keep Python 2 / Python 3 code in sync an :attr:`~Enum._order_` attribute can be provided. It will be checked against the actual order of the enumeration and raise an error if the two do not match:: @@ -1004,7 +1005,7 @@ and raise an error if the two do not match:: .. note:: - In Python 2 code the :attr:`_order_` attribute is necessary as definition + In Python 2 code the :attr:`~Enum._order_` attribute is necessary as definition order is lost before it can be recorded. @@ -1129,6 +1130,14 @@ the following are true: >>> (Color.RED | Color.GREEN).name 'RED|GREEN' + >>> class Perm(IntFlag): + ... R = 4 + ... W = 2 + ... X = 1 + ... + >>> (Perm.R & Perm.W).name is None # effectively Perm(0) + True + - multi-bit flags, aka aliases, can be returned from operations:: >>> Color.RED | Color.BLUE @@ -1185,12 +1194,12 @@ Enum Classes ^^^^^^^^^^^^ The :class:`EnumType` metaclass is responsible for providing the -:meth:`__contains__`, :meth:`__dir__`, :meth:`__iter__` and other methods that +:meth:`~object.__contains__`, :meth:`~object.__dir__`, :meth:`~object.__iter__` and other methods that allow one to do things with an :class:`Enum` class that fail on a typical class, such as ``list(Color)`` or ``some_enum_var in Color``. :class:`EnumType` is responsible for ensuring that various other methods on the final :class:`Enum` -class are correct (such as :meth:`__new__`, :meth:`__getnewargs__`, -:meth:`__str__` and :meth:`__repr__`). +class are correct (such as :meth:`~object.__new__`, :meth:`~object.__getnewargs__`, +:meth:`~object.__str__` and :meth:`~object.__repr__`). Flag Classes ^^^^^^^^^^^^ @@ -1205,7 +1214,7 @@ Enum Members (aka instances) The most interesting thing about enum members is that they are singletons. :class:`EnumType` creates them all while it is creating the enum class itself, -and then puts a custom :meth:`__new__` in place to ensure that no new ones are +and then puts a custom :meth:`~object.__new__` in place to ensure that no new ones are ever instantiated by returning only the existing member instances. Flag Members @@ -1253,7 +1262,7 @@ is. There are several ways to define this type of simple enumeration: - use instances of :class:`auto` for the value - use instances of :class:`object` as the value - use a descriptive string as the value -- use a tuple as the value and a custom :meth:`__new__` to replace the +- use a tuple as the value and a custom :meth:`~object.__new__` to replace the tuple with an :class:`int` value Using any of these methods signifies to the user that these values are not @@ -1289,7 +1298,7 @@ Using :class:`object` would look like:: > This is also a good example of why you might want to write your own -:meth:`__repr__`:: +:meth:`~object.__repr__`:: >>> class Color(Enum): ... RED = object() @@ -1317,10 +1326,10 @@ Using a string as the value would look like:: -Using a custom :meth:`__new__` -"""""""""""""""""""""""""""""" +Using a custom :meth:`~object.__new__` +"""""""""""""""""""""""""""""""""""""" -Using an auto-numbering :meth:`__new__` would look like:: +Using an auto-numbering :meth:`~object.__new__` would look like:: >>> class AutoNumber(Enum): ... def __new__(cls): @@ -1366,8 +1375,8 @@ to handle any extra arguments:: .. note:: - The :meth:`__new__` method, if defined, is used during creation of the Enum - members; it is then replaced by Enum's :meth:`__new__` which is used after + The :meth:`~object.__new__` method, if defined, is used during creation of the Enum + members; it is then replaced by Enum's :meth:`~object.__new__` which is used after class creation for lookup of existing members. .. warning:: @@ -1450,7 +1459,7 @@ alias:: Planet ^^^^^^ -If :meth:`__new__` or :meth:`__init__` is defined, the value of the enum member +If :meth:`~object.__new__` or :meth:`~object.__init__` is defined, the value of the enum member will be passed to those methods:: >>> class Planet(Enum): @@ -1481,7 +1490,7 @@ will be passed to those methods:: TimePeriod ^^^^^^^^^^ -An example to show the :attr:`_ignore_` attribute in use:: +An example to show the :attr:`~Enum._ignore_` attribute in use:: >>> from datetime import timedelta >>> class Period(timedelta, Enum): diff --git a/Doc/howto/instrumentation.rst b/Doc/howto/instrumentation.rst index 9c99fcec..6e03ef20 100644 --- a/Doc/howto/instrumentation.rst +++ b/Doc/howto/instrumentation.rst @@ -307,7 +307,7 @@ Available static markers .. object:: gc__start(int generation) Fires when the Python interpreter starts a garbage collection cycle. - ``arg0`` is the generation to scan, like :func:`gc.collect()`. + ``arg0`` is the generation to scan, like :func:`gc.collect`. .. object:: gc__done(long collected) diff --git a/Doc/howto/isolating-extensions.rst b/Doc/howto/isolating-extensions.rst index e35855de..a636e06b 100644 --- a/Doc/howto/isolating-extensions.rst +++ b/Doc/howto/isolating-extensions.rst @@ -339,7 +339,7 @@ That is, heap types should: - Define a traverse function using ``Py_tp_traverse``, which visits the type (e.g. using ``Py_VISIT(Py_TYPE(self))``). -Please refer to the the documentation of +Please refer to the documentation of :c:macro:`Py_TPFLAGS_HAVE_GC` and :c:member:`~PyTypeObject.tp_traverse` for additional considerations. diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst index 06a1ec18..c7b463d1 100644 --- a/Doc/howto/logging-cookbook.rst +++ b/Doc/howto/logging-cookbook.rst @@ -4022,7 +4022,7 @@ As you can see, this output isn't ideal. That's because the underlying code which writes to ``sys.stderr`` makes multiple writes, each of which results in a separate logged line (for example, the last three lines above). To get around this problem, you need to buffer things and only output log lines when newlines -are seen. Let's use a slghtly better implementation of ``LoggerWriter``: +are seen. Let's use a slightly better implementation of ``LoggerWriter``: .. code-block:: python diff --git a/Doc/howto/logging.rst b/Doc/howto/logging.rst index 877cb243..5a392f94 100644 --- a/Doc/howto/logging.rst +++ b/Doc/howto/logging.rst @@ -381,8 +381,52 @@ Logging Flow The flow of log event information in loggers and handlers is illustrated in the following diagram. -.. image:: logging_flow.png - :class: invert-in-dark-mode +.. only:: not html + + .. image:: logging_flow.* + +.. raw:: html + :file: logging_flow.svg + +.. raw:: html + + Loggers ^^^^^^^ diff --git a/Doc/howto/logging_flow.png b/Doc/howto/logging_flow.png index d65e597f811db5e0a70e6c3ce7124e23b6be86de..d60ed7c031585a426e344961ca9e09c2b51d70a7 100644 GIT binary patch literal 39133 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 literal 21907 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 GxBmyOs;SEW diff --git a/Doc/howto/logging_flow.svg b/Doc/howto/logging_flow.svg new file mode 100644 index 00000000..4974994a --- /dev/null +++ b/Doc/howto/logging_flow.svg @@ -0,0 +1,327 @@ + + + + + + + + + + + Logger flow + + + + + Create + LogRecord + + + + + + + + + + + + Logging call in user + code, e.g. + + + logger.info(...) + + + + + + + + + Stop + + + + + + Does a filter attached + to logger reject the + record? + + + + + + + + + + Pass record to + handlers of + current logger + + + + + + Is propagate true for + current logger? + + + + + + Is there a parent + logger? + + + + + + Set current + logger to parent + + + + + + At least one handler + in hierarchy? + + + + + + Use + lastResort + handler + + + + + + Handler enabled for + level of record? + + + + + + Does a filter attached + to handler reject the + record? + + + + + + Stop + + + + + + Emit (includes formatting) + + + + Handler flow + + + + + Logger enabled for + level of call? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No + + + Yes + + + Yes + + + No + + + No + + + Yes + + + Yes + + + No + + + No + + + Yes + + + + + + No + + + + + + + + + Yes + + + No + + + + + + Yes + + + Record passed + to handler + + + + + + + + diff --git a/Doc/howto/mro.rst b/Doc/howto/mro.rst index f44b4f98..46db516e 100644 --- a/Doc/howto/mro.rst +++ b/Doc/howto/mro.rst @@ -335,7 +335,7 @@ E is more specialized than C, even if it is in a higher level. A lazy programmer can obtain the MRO directly from Python 2.2, since in this case it coincides with the Python 2.3 linearization. It is enough -to invoke the .mro() method of class A: +to invoke the :meth:`~type.mro` method of class A: >>> A.mro() # doctest: +NORMALIZE_WHITESPACE [, , , diff --git a/Doc/library/__main__.rst b/Doc/library/__main__.rst index 6232e173..647ff9da 100644 --- a/Doc/library/__main__.rst +++ b/Doc/library/__main__.rst @@ -251,9 +251,9 @@ attribute will include the package's path if imported:: >>> asyncio.__main__.__name__ 'asyncio.__main__' -This won't work for ``__main__.py`` files in the root directory of a .zip file -though. Hence, for consistency, minimal ``__main__.py`` like the :mod:`venv` -one mentioned below are preferred. +This won't work for ``__main__.py`` files in the root directory of a +``.zip`` file though. Hence, for consistency, a minimal ``__main__.py`` +without a ``__name__`` check is preferred. .. seealso:: diff --git a/Doc/library/_thread.rst b/Doc/library/_thread.rst index 35053702..e5cbff0b 100644 --- a/Doc/library/_thread.rst +++ b/Doc/library/_thread.rst @@ -210,23 +210,20 @@ In addition to these methods, lock objects can also be used via the .. index:: pair: module; signal -* Threads interact strangely with interrupts: the :exc:`KeyboardInterrupt` - exception will be received by an arbitrary thread. (When the :mod:`signal` - module is available, interrupts always go to the main thread.) +* Interrupts always go to the main thread (the :exc:`KeyboardInterrupt` + exception will be received by that thread.) * Calling :func:`sys.exit` or raising the :exc:`SystemExit` exception is equivalent to calling :func:`_thread.exit`. -* It is not possible to interrupt the :meth:`~threading.Lock.acquire` method on - a lock --- the :exc:`KeyboardInterrupt` exception will happen after the lock - has been acquired. +* It is platform-dependent whether the :meth:`~threading.Lock.acquire` method + on a lock can be interrupted (so that the :exc:`KeyboardInterrupt` exception + will happen immediately, rather than only after the lock has been acquired or + the operation has timed out). It can be interrupted on POSIX, but not on + Windows. * When the main thread exits, it is system defined whether the other threads survive. On most systems, they are killed without executing :keyword:`try` ... :keyword:`finally` clauses or executing object destructors. -* When the main thread exits, it does not do any of its usual cleanup (except - that :keyword:`try` ... :keyword:`finally` clauses are honored), and the - standard I/O files are not flushed. - diff --git a/Doc/library/abc.rst b/Doc/library/abc.rst index 168ef3ec..38d744e9 100644 --- a/Doc/library/abc.rst +++ b/Doc/library/abc.rst @@ -99,7 +99,7 @@ a helper class :class:`ABC` to alternatively define ABCs through inheritance: that you can customize the behavior of :func:`issubclass` further without the need to call :meth:`register` on every class you want to consider a subclass of the ABC. (This class method is called from the - :meth:`~class.__subclasscheck__` method of the ABC.) + :meth:`~type.__subclasscheck__` method of the ABC.) This method should return ``True``, ``False`` or :data:`NotImplemented`. If it returns ``True``, the *subclass* is considered a subclass of this ABC. @@ -149,7 +149,7 @@ a helper class :class:`ABC` to alternatively define ABCs through inheritance: The :meth:`__subclasshook__` class method defined here says that any class that has an :meth:`~iterator.__iter__` method in its :attr:`~object.__dict__` (or in that of one of its base classes, accessed - via the :attr:`~class.__mro__` list) is considered a ``MyIterable`` too. + via the :attr:`~type.__mro__` list) is considered a ``MyIterable`` too. Finally, the last line makes ``Foo`` a virtual subclass of ``MyIterable``, even though it does not define an :meth:`~iterator.__iter__` method (it uses diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index b7ed3f5e..00d7c384 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -1,4 +1,4 @@ -:mod:`!argparse` --- Parser for command-line options, arguments and sub-commands +:mod:`!argparse` --- Parser for command-line options, arguments and subcommands ================================================================================ .. module:: argparse @@ -19,17 +19,13 @@ introduction to Python command-line parsing, have a look at the :ref:`argparse tutorial `. -The :mod:`argparse` module makes it easy to write user-friendly command-line -interfaces. The program defines what arguments it requires, and :mod:`argparse` -will figure out how to parse those out of :data:`sys.argv`. The :mod:`argparse` +The :mod:`!argparse` module makes it easy to write user-friendly command-line +interfaces. The program defines what arguments it requires, and :mod:`!argparse` +will figure out how to parse those out of :data:`sys.argv`. The :mod:`!argparse` module also automatically generates help and usage messages. The module will also issue errors when users give the program invalid arguments. - -Core Functionality ------------------- - -The :mod:`argparse` module's support for command-line interfaces is built +The :mod:`!argparse` module's support for command-line interfaces is built around an instance of :class:`argparse.ArgumentParser`. It is a container for argument specifications and has options that apply to the parser as whole:: @@ -53,133 +49,9 @@ the extracted data in a :class:`argparse.Namespace` object:: args = parser.parse_args() print(args.filename, args.count, args.verbose) - -Quick Links for add_argument() ------------------------------- - -============================ =========================================================== ========================================================================================================================== -Name Description Values -============================ =========================================================== ========================================================================================================================== -action_ Specify how an argument should be handled ``'store'``, ``'store_const'``, ``'store_true'``, ``'append'``, ``'append_const'``, ``'count'``, ``'help'``, ``'version'`` -choices_ Limit values to a specific set of choices ``['foo', 'bar']``, ``range(1, 10)``, or :class:`~collections.abc.Container` instance -const_ Store a constant value -default_ Default value used when an argument is not provided Defaults to ``None`` -dest_ Specify the attribute name used in the result namespace -help_ Help message for an argument -metavar_ Alternate display name for the argument as shown in help -nargs_ Number of times the argument can be used :class:`int`, ``'?'``, ``'*'``, or ``'+'`` -required_ Indicate whether an argument is required or optional ``True`` or ``False`` -:ref:`type ` Automatically convert an argument to the given type :class:`int`, :class:`float`, ``argparse.FileType('w')``, or callable function -============================ =========================================================== ========================================================================================================================== - - -Example -------- - -The following code is a Python program that takes a list of integers and -produces either the sum or the max:: - - import argparse - - parser = argparse.ArgumentParser(description='Process some integers.') - parser.add_argument('integers', metavar='N', type=int, nargs='+', - help='an integer for the accumulator') - parser.add_argument('--sum', dest='accumulate', action='store_const', - const=sum, default=max, - help='sum the integers (default: find the max)') - - args = parser.parse_args() - print(args.accumulate(args.integers)) - -Assuming the above Python code is saved into a file called ``prog.py``, it can -be run at the command line and it provides useful help messages: - -.. code-block:: shell-session - - $ python prog.py -h - usage: prog.py [-h] [--sum] N [N ...] - - Process some integers. - - positional arguments: - N an integer for the accumulator - - options: - -h, --help show this help message and exit - --sum sum the integers (default: find the max) - -When run with the appropriate arguments, it prints either the sum or the max of -the command-line integers: - -.. code-block:: shell-session - - $ python prog.py 1 2 3 4 - 4 - - $ python prog.py 1 2 3 4 --sum - 10 - -If invalid arguments are passed in, an error will be displayed: - -.. code-block:: shell-session - - $ python prog.py a b c - usage: prog.py [-h] [--sum] N [N ...] - prog.py: error: argument N: invalid int value: 'a' - -The following sections walk you through this example. - - -Creating a parser -^^^^^^^^^^^^^^^^^ - -The first step in using the :mod:`argparse` is creating an -:class:`ArgumentParser` object:: - - >>> parser = argparse.ArgumentParser(description='Process some integers.') - -The :class:`ArgumentParser` object will hold all the information necessary to -parse the command line into Python data types. - - -Adding arguments -^^^^^^^^^^^^^^^^ - -Filling an :class:`ArgumentParser` with information about program arguments is -done by making calls to the :meth:`~ArgumentParser.add_argument` method. -Generally, these calls tell the :class:`ArgumentParser` how to take the strings -on the command line and turn them into objects. This information is stored and -used when :meth:`~ArgumentParser.parse_args` is called. For example:: - - >>> parser.add_argument('integers', metavar='N', type=int, nargs='+', - ... help='an integer for the accumulator') - >>> parser.add_argument('--sum', dest='accumulate', action='store_const', - ... const=sum, default=max, - ... help='sum the integers (default: find the max)') - -Later, calling :meth:`~ArgumentParser.parse_args` will return an object with -two attributes, ``integers`` and ``accumulate``. The ``integers`` attribute -will be a list of one or more integers, and the ``accumulate`` attribute will be -either the :func:`sum` function, if ``--sum`` was specified at the command line, -or the :func:`max` function if it was not. - - -Parsing arguments -^^^^^^^^^^^^^^^^^ - -:class:`ArgumentParser` parses arguments through the -:meth:`~ArgumentParser.parse_args` method. This will inspect the command line, -convert each argument to the appropriate type and then invoke the appropriate action. -In most cases, this means a simple :class:`Namespace` object will be built up from -attributes parsed out of the command line:: - - >>> parser.parse_args(['--sum', '7', '-1', '42']) - Namespace(accumulate=, integers=[7, -1, 42]) - -In a script, :meth:`~ArgumentParser.parse_args` will typically be called with no -arguments, and the :class:`ArgumentParser` will automatically determine the -command-line arguments from :data:`sys.argv`. - +.. note:: + If you're looking for a guide about how to upgrade :mod:`optparse` code + to :mod:`!argparse`, see :ref:`Upgrading Optparse Code `. ArgumentParser objects ---------------------- @@ -228,7 +100,7 @@ ArgumentParser objects * allow_abbrev_ - Allows long options to be abbreviated if the abbreviation is unambiguous. (default: ``True``) - * exit_on_error_ - Determines whether or not ArgumentParser exits with + * exit_on_error_ - Determines whether or not :class:`!ArgumentParser` exits with error info when an error occurs. (default: ``True``) .. versionchanged:: 3.5 @@ -249,38 +121,21 @@ The following sections describe how each of these are used. prog ^^^^ -By default, :class:`ArgumentParser` objects use ``sys.argv[0]`` to determine -how to display the name of the program in help messages. This default is almost -always desirable because it will make the help messages match how the program was -invoked on the command line. For example, consider a file named -``myprogram.py`` with the following code:: - import argparse - parser = argparse.ArgumentParser() - parser.add_argument('--foo', help='foo help') - args = parser.parse_args() - -The help for this program will display ``myprogram.py`` as the program name -(regardless of where the program was invoked from): - -.. code-block:: shell-session +By default, :class:`ArgumentParser` calculates the name of the program +to display in help messages depending on the way the Python interpreter was run: - $ python myprogram.py --help - usage: myprogram.py [-h] [--foo FOO] +* The :func:`base name ` of ``sys.argv[0]`` if a file was + passed as argument. +* The Python interpreter name followed by ``sys.argv[0]`` if a directory or + a zipfile was passed as argument. +* The Python interpreter name followed by ``-m`` followed by the + module or package name if the :option:`-m` option was used. - options: - -h, --help show this help message and exit - --foo FOO foo help - $ cd .. - $ python subdir/myprogram.py --help - usage: myprogram.py [-h] [--foo FOO] - - options: - -h, --help show this help message and exit - --foo FOO foo help - -To change this default behavior, another value can be supplied using the -``prog=`` argument to :class:`ArgumentParser`:: +This default is almost always desirable because it will make the help messages +match the string that was used to invoke the program on the command line. +However, to change this default behavior, another value can be supplied using +the ``prog=`` argument to :class:`ArgumentParser`:: >>> parser = argparse.ArgumentParser(prog='myprogram') >>> parser.print_help() @@ -309,22 +164,8 @@ usage ^^^^^ By default, :class:`ArgumentParser` calculates the usage message from the -arguments it contains:: - - >>> parser = argparse.ArgumentParser(prog='PROG') - >>> parser.add_argument('--foo', nargs='?', help='foo help') - >>> parser.add_argument('bar', nargs='+', help='bar help') - >>> parser.print_help() - usage: PROG [-h] [--foo [FOO]] bar [bar ...] - - positional arguments: - bar bar help - - options: - -h, --help show this help message and exit - --foo [FOO] foo help - -The default message can be overridden with the ``usage=`` keyword argument:: +arguments it contains. The default message can be overridden with the +``usage=`` keyword argument:: >>> parser = argparse.ArgumentParser(prog='PROG', usage='%(prog)s [options]') >>> parser.add_argument('--foo', nargs='?', help='foo help') @@ -352,16 +193,7 @@ Most calls to the :class:`ArgumentParser` constructor will use the ``description=`` keyword argument. This argument gives a brief description of what the program does and how it works. In help messages, the description is displayed between the command-line usage string and the help messages for the -various arguments:: - - >>> parser = argparse.ArgumentParser(description='A foo that bars') - >>> parser.print_help() - usage: argparse.py [-h] - - A foo that bars - - options: - -h, --help show this help message and exit +various arguments. By default, the description will be line-wrapped so that it fits within the given space. To change this behavior, see the formatter_class_ argument. @@ -491,7 +323,7 @@ should not be line-wrapped:: -h, --help show this help message and exit :class:`RawTextHelpFormatter` maintains whitespace for all sorts of help text, -including argument descriptions. However, multiple new lines are replaced with +including argument descriptions. However, multiple newlines are replaced with one. If you wish to preserve multiple blank lines, add spaces between the newlines. @@ -540,7 +372,7 @@ Most command-line options will use ``-`` as the prefix, e.g. ``-f/--foo``. Parsers that need to support different or additional prefix characters, e.g. for options like ``+f`` or ``/foo``, may specify them using the ``prefix_chars=`` argument -to the ArgumentParser constructor:: +to the :class:`ArgumentParser` constructor:: >>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='-+') >>> parser.add_argument('+f') @@ -585,8 +417,8 @@ arguments will never be treated as file references. .. versionchanged:: 3.12 :class:`ArgumentParser` changed encoding and errors to read arguments files - from default (e.g. :func:`locale.getpreferredencoding(False) ` and - ``"strict"``) to :term:`filesystem encoding and error handler`. + from default (e.g. :func:`locale.getpreferredencoding(False) ` + and ``"strict"``) to the :term:`filesystem encoding and error handler`. Arguments file should be encoded in UTF-8 instead of ANSI Codepage on Windows. @@ -671,26 +503,9 @@ string was overridden. add_help ^^^^^^^^ -By default, ArgumentParser objects add an option which simply displays -the parser's help message. For example, consider a file named -``myprogram.py`` containing the following code:: - - import argparse - parser = argparse.ArgumentParser() - parser.add_argument('--foo', help='foo help') - args = parser.parse_args() - -If ``-h`` or ``--help`` is supplied at the command line, the ArgumentParser -help will be printed: - -.. code-block:: shell-session - - $ python myprogram.py --help - usage: myprogram.py [-h] [--foo FOO] - - options: - -h, --help show this help message and exit - --foo FOO foo help +By default, :class:`ArgumentParser` objects add an option which simply displays +the parser's help message. If ``-h`` or ``--help`` is supplied at the command +line, the :class:`!ArgumentParser` help will be printed. Occasionally, it may be useful to disable the addition of this help option. This can be achieved by passing ``False`` as the ``add_help=`` argument to @@ -722,7 +537,8 @@ exit_on_error ^^^^^^^^^^^^^ Normally, when you pass an invalid argument list to the :meth:`~ArgumentParser.parse_args` -method of an :class:`ArgumentParser`, it will exit with error info. +method of an :class:`ArgumentParser`, it will print a *message* to :data:`sys.stderr` and exit with a status +code of 2. If the user would like to catch errors manually, the feature can be enabled by setting ``exit_on_error`` to ``False``:: @@ -743,15 +559,15 @@ If the user would like to catch errors manually, the feature can be enabled by s The add_argument() method ------------------------- -.. method:: ArgumentParser.add_argument(name or flags..., [action], [nargs], \ +.. method:: ArgumentParser.add_argument(name or flags..., *, [action], [nargs], \ [const], [default], [type], [choices], [required], \ [help], [metavar], [dest]) Define how a single command-line argument should be parsed. Each parameter has its own more detailed description below, but in short they are: - * `name or flags`_ - Either a name or a list of option strings, e.g. ``foo`` - or ``-f, --foo``. + * `name or flags`_ - Either a name or a list of option strings, e.g. ``'foo'`` + or ``'-f', '--foo'``. * action_ - The basic type of action to be taken when this argument is encountered at the command line. @@ -780,7 +596,7 @@ The add_argument() method The following sections describe how each of these are used. -.. _name_or_flags: +.. _`name or flags`: name or flags ^^^^^^^^^^^^^ @@ -827,12 +643,7 @@ them, though most actions simply add an attribute to the object returned by how the command-line arguments should be handled. The supplied actions are: * ``'store'`` - This just stores the argument's value. This is the default - action. For example:: - - >>> parser = argparse.ArgumentParser() - >>> parser.add_argument('--foo') - >>> parser.parse_args('--foo 1'.split()) - Namespace(foo='1') + action. * ``'store_const'`` - This stores the value specified by the const_ keyword argument; note that the const_ keyword argument defaults to ``None``. The @@ -847,7 +658,7 @@ how the command-line arguments should be handled. The supplied actions are: * ``'store_true'`` and ``'store_false'`` - These are special cases of ``'store_const'`` used for storing the values ``True`` and ``False`` respectively. In addition, they create default values of ``False`` and - ``True`` respectively. For example:: + ``True`` respectively:: >>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action='store_true') @@ -879,6 +690,21 @@ how the command-line arguments should be handled. The supplied actions are: >>> parser.parse_args('--str --int'.split()) Namespace(types=[, ]) +* ``'extend'`` - This stores a list and appends each item from the multi-value + argument list to it. + The ``'extend'`` action is typically used with the nargs_ keyword argument + value ``'+'`` or ``'*'``. + Note that when nargs_ is ``None`` (the default) or ``'?'``, each + character of the argument string will be appended to the list. + Example usage:: + + >>> parser = argparse.ArgumentParser() + >>> parser.add_argument("--foo", action="extend", nargs="+", type=str) + >>> parser.parse_args(["--foo", "f1", "--foo", "f2", "f3", "f4"]) + Namespace(foo=['f1', 'f2', 'f3', 'f4']) + + .. versionadded:: 3.8 + * ``'count'`` - This counts the number of times a keyword argument occurs. For example, this is useful for increasing verbosity levels:: @@ -904,33 +730,28 @@ how the command-line arguments should be handled. The supplied actions are: >>> parser.parse_args(['--version']) PROG 2.0 -* ``'extend'`` - This stores a list, and extends each argument value to the - list. - Example usage:: +Only actions that consume command-line arguments (e.g. ``'store'``, +``'append'`` or ``'extend'``) can be used with positional arguments. - >>> parser = argparse.ArgumentParser() - >>> parser.add_argument("--foo", action="extend", nargs="+", type=str) - >>> parser.parse_args(["--foo", "f1", "--foo", "f2", "f3", "f4"]) - Namespace(foo=['f1', 'f2', 'f3', 'f4']) +.. class:: BooleanOptionalAction - .. versionadded:: 3.8 + You may also specify an arbitrary action by passing an :class:`Action` subclass or + other object that implements the same interface. The :class:`!BooleanOptionalAction` + is available in :mod:`!argparse` and adds support for boolean actions such as + ``--foo`` and ``--no-foo``:: -You may also specify an arbitrary action by passing an Action subclass or -other object that implements the same interface. The ``BooleanOptionalAction`` -is available in ``argparse`` and adds support for boolean actions such as -``--foo`` and ``--no-foo``:: + >>> import argparse + >>> parser = argparse.ArgumentParser() + >>> parser.add_argument('--foo', action=argparse.BooleanOptionalAction) + >>> parser.parse_args(['--no-foo']) + Namespace(foo=False) - >>> import argparse - >>> parser = argparse.ArgumentParser() - >>> parser.add_argument('--foo', action=argparse.BooleanOptionalAction) - >>> parser.parse_args(['--no-foo']) - Namespace(foo=False) - -.. versionadded:: 3.9 + .. versionadded:: 3.9 The recommended way to create a custom action is to extend :class:`Action`, -overriding the ``__call__`` method and optionally the ``__init__`` and -``format_usage`` methods. +overriding the :meth:`!__call__` method and optionally the :meth:`!__init__` and +:meth:`!format_usage` methods. You can also register custom actions using the +:meth:`~ArgumentParser.register` method and reference them by their registered name. An example of a custom action:: @@ -960,7 +781,7 @@ For more details, see :class:`Action`. nargs ^^^^^ -ArgumentParser objects usually associate a single command-line argument with a +:class:`ArgumentParser` objects usually associate a single command-line argument with a single action to be taken. The ``nargs`` keyword argument associates a different number of command-line arguments with a single action. See also :ref:`specifying-ambiguous-arguments`. The supported values are: @@ -1042,6 +863,8 @@ See also :ref:`specifying-ambiguous-arguments`. The supported values are: If the ``nargs`` keyword argument is not provided, the number of arguments consumed is determined by the action_. Generally this means a single command-line argument will be consumed and a single item (not a list) will be produced. +Actions that do not consume command-line arguments (e.g. +``'store_const'``) set ``nargs=0``. .. _const: @@ -1092,7 +915,7 @@ was not present at the command line:: Namespace(foo=42) If the target namespace already has an attribute set, the action *default* -will not over write it:: +will not overwrite it:: >>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', default=42) @@ -1120,6 +943,9 @@ is used when no command-line argument was present:: >>> parser.parse_args([]) Namespace(foo=42) +For required_ arguments, the ``default`` value is ignored. For example, this +applies to positional arguments with nargs_ values other than ``?`` or ``*``, +or optional arguments marked as ``required=True``. Providing ``default=argparse.SUPPRESS`` causes no attribute to be added if the command-line argument was not present:: @@ -1146,10 +972,11 @@ necessary type-checking and type conversions to be performed. If the type_ keyword is used with the default_ keyword, the type converter is only applied if the default is a string. -The argument to ``type`` can be any callable that accepts a single string. +The argument to ``type`` can be a callable that accepts a single string or +the name of a registered type (see :meth:`~ArgumentParser.register`) If the function raises :exc:`ArgumentTypeError`, :exc:`TypeError`, or :exc:`ValueError`, the exception is caught and a nicely formatted error -message is displayed. No other exception types are handled. +message is displayed. Other exception types are not handled. Common built-in types and functions can be used as type converters: @@ -1163,7 +990,6 @@ Common built-in types and functions can be used as type converters: parser.add_argument('distance', type=float) parser.add_argument('street', type=ascii) parser.add_argument('code_point', type=ord) - parser.add_argument('source_file', type=open) parser.add_argument('dest_file', type=argparse.FileType('w', encoding='latin-1')) parser.add_argument('datapath', type=pathlib.Path) @@ -1194,10 +1020,11 @@ better reporting than can be given by the ``type`` keyword. A :exc:`FileNotFoundError` exception would not be handled at all. Even :class:`~argparse.FileType` has its limitations for use with the ``type`` -keyword. If one argument uses *FileType* and then a subsequent argument fails, -an error is reported but the file is not automatically closed. In this case, it -would be better to wait until after the parser has run and then use the -:keyword:`with`-statement to manage the files. +keyword. If one argument uses :class:`~argparse.FileType` and then a +subsequent argument fails, an error is reported but the file is not +automatically closed. In this case, it would be better to wait until after +the parser has run and then use the :keyword:`with`-statement to manage the +files. For type checkers that simply check against a fixed set of values, consider using the choices_ keyword instead. @@ -1225,15 +1052,7 @@ if the argument was not one of the acceptable values:: Note that inclusion in the *choices* sequence is checked after any type_ conversions have been performed, so the type of the objects in the *choices* -sequence should match the type_ specified:: - - >>> parser = argparse.ArgumentParser(prog='doors.py') - >>> parser.add_argument('door', type=int, choices=range(1, 4)) - >>> print(parser.parse_args(['3'])) - Namespace(door=3) - >>> parser.parse_args(['4']) - usage: doors.py [-h] {1,2,3} - doors.py: error: argument door: invalid choice: 4 (choose from 1, 2, 3) +sequence should match the type_ specified. Any sequence can be passed as the *choices* value, so :class:`list` objects, :class:`tuple` objects, and custom sequences are all supported. @@ -1252,7 +1071,7 @@ many choices), just specify an explicit metavar_. required ^^^^^^^^ -In general, the :mod:`argparse` module assumes that flags like ``-f`` and ``--bar`` +In general, the :mod:`!argparse` module assumes that flags like ``-f`` and ``--bar`` indicate *optional* arguments, which can always be omitted at the command line. To make an option *required*, ``True`` can be specified for the ``required=`` keyword argument to :meth:`~ArgumentParser.add_argument`:: @@ -1283,22 +1102,7 @@ help The ``help`` value is a string containing a brief description of the argument. When a user requests help (usually by using ``-h`` or ``--help`` at the command line), these ``help`` descriptions will be displayed with each -argument:: - - >>> parser = argparse.ArgumentParser(prog='frobble') - >>> parser.add_argument('--foo', action='store_true', - ... help='foo the bars before frobbling') - >>> parser.add_argument('bar', nargs='+', - ... help='one of the bars to be frobbled') - >>> parser.parse_args(['-h']) - usage: frobble [-h] [--foo] bar [bar ...] - - positional arguments: - bar one of the bars to be frobbled - - options: - -h, --help show this help message and exit - --foo foo the bars before frobbling +argument. The ``help`` strings can include various format specifiers to avoid repetition of things like the program name or the argument default_. The available @@ -1320,7 +1124,7 @@ specifiers include the program name, ``%(prog)s`` and most keyword arguments to As the help string supports %-formatting, if you want a literal ``%`` to appear in the help string, you must escape it as ``%%``. -:mod:`argparse` supports silencing the help entry for certain options, by +:mod:`!argparse` supports silencing the help entry for certain options, by setting the ``help`` value to ``argparse.SUPPRESS``:: >>> parser = argparse.ArgumentParser(prog='frobble') @@ -1338,7 +1142,7 @@ metavar ^^^^^^^ When :class:`ArgumentParser` generates help messages, it needs some way to refer -to each expected argument. By default, ArgumentParser objects use the dest_ +to each expected argument. By default, :class:`!ArgumentParser` objects use the dest_ value as the "name" of each object. By default, for positional argument actions, the dest_ value is used directly, and for optional argument actions, the dest_ value is uppercased. So, a single positional argument with @@ -1442,7 +1246,7 @@ behavior:: Action classes ^^^^^^^^^^^^^^ -Action classes implement the Action API, a callable which returns a callable +:class:`!Action` classes implement the Action API, a callable which returns a callable which processes arguments from the command-line. Any object which follows this API may be passed as the ``action`` parameter to :meth:`~ArgumentParser.add_argument`. @@ -1451,40 +1255,46 @@ this API may be passed as the ``action`` parameter to type=None, choices=None, required=False, help=None, \ metavar=None) -Action objects are used by an ArgumentParser to represent the information -needed to parse a single argument from one or more strings from the -command line. The Action class must accept the two positional arguments -plus any keyword arguments passed to :meth:`ArgumentParser.add_argument` -except for the ``action`` itself. + :class:`!Action` objects are used by an :class:`ArgumentParser` to represent the information + needed to parse a single argument from one or more strings from the + command line. The :class:`!Action` class must accept the two positional arguments + plus any keyword arguments passed to :meth:`ArgumentParser.add_argument` + except for the ``action`` itself. + + Instances of :class:`!Action` (or return value of any callable to the + ``action`` parameter) should have attributes :attr:`!dest`, + :attr:`!option_strings`, :attr:`!default`, :attr:`!type`, :attr:`!required`, + :attr:`!help`, etc. defined. The easiest way to ensure these attributes + are defined is to call :meth:`!Action.__init__`. -Instances of Action (or return value of any callable to the ``action`` -parameter) should have attributes "dest", "option_strings", "default", "type", -"required", "help", etc. defined. The easiest way to ensure these attributes -are defined is to call ``Action.__init__``. + .. method:: __call__(parser, namespace, values, option_string=None) -Action instances should be callable, so subclasses must override the -``__call__`` method, which should accept four parameters: + :class:`!Action` instances should be callable, so subclasses must override the + :meth:`!__call__` method, which should accept four parameters: -* ``parser`` - The ArgumentParser object which contains this action. + * *parser* - The :class:`ArgumentParser` object which contains this action. -* ``namespace`` - The :class:`Namespace` object that will be returned by - :meth:`~ArgumentParser.parse_args`. Most actions add an attribute to this - object using :func:`setattr`. + * *namespace* - The :class:`Namespace` object that will be returned by + :meth:`~ArgumentParser.parse_args`. Most actions add an attribute to this + object using :func:`setattr`. -* ``values`` - The associated command-line arguments, with any type conversions - applied. Type conversions are specified with the type_ keyword argument to - :meth:`~ArgumentParser.add_argument`. + * *values* - The associated command-line arguments, with any type conversions + applied. Type conversions are specified with the type_ keyword argument to + :meth:`~ArgumentParser.add_argument`. -* ``option_string`` - The option string that was used to invoke this action. - The ``option_string`` argument is optional, and will be absent if the action - is associated with a positional argument. + * *option_string* - The option string that was used to invoke this action. + The ``option_string`` argument is optional, and will be absent if the action + is associated with a positional argument. -The ``__call__`` method may perform arbitrary actions, but will typically set -attributes on the ``namespace`` based on ``dest`` and ``values``. + The :meth:`!__call__` method may perform arbitrary actions, but will typically set + attributes on the ``namespace`` based on ``dest`` and ``values``. + + .. method:: format_usage() + + :class:`!Action` subclasses can define a :meth:`!format_usage` method that takes no argument + and return a string which will be used when printing the usage of the program. + If such method is not provided, a sensible default will be used. -Action subclasses can define a ``format_usage`` method that takes no argument -and return a string which will be used when printing the usage of the program. -If such method is not provided, a sensible default will be used. The parse_args() method ----------------------- @@ -1496,7 +1306,7 @@ The parse_args() method Previous calls to :meth:`add_argument` determine exactly what objects are created and how they are assigned. See the documentation for - :meth:`add_argument` for details. + :meth:`!add_argument` for details. * args_ - List of strings to parse. The default is taken from :data:`sys.argv`. @@ -1652,7 +1462,7 @@ This feature can be disabled by setting :ref:`allow_abbrev` to ``False``. Beyond ``sys.argv`` ^^^^^^^^^^^^^^^^^^^ -Sometimes it may be useful to have an ArgumentParser parse arguments other than those +Sometimes it may be useful to have an :class:`ArgumentParser` parse arguments other than those of :data:`sys.argv`. This can be accomplished by passing a list of strings to :meth:`~ArgumentParser.parse_args`. This is useful for testing at the interactive prompt:: @@ -1679,29 +1489,29 @@ The Namespace object Simple class used by default by :meth:`~ArgumentParser.parse_args` to create an object holding attributes and return it. -This class is deliberately simple, just an :class:`object` subclass with a -readable string representation. If you prefer to have dict-like view of the -attributes, you can use the standard Python idiom, :func:`vars`:: - - >>> parser = argparse.ArgumentParser() - >>> parser.add_argument('--foo') - >>> args = parser.parse_args(['--foo', 'BAR']) - >>> vars(args) - {'foo': 'BAR'} + This class is deliberately simple, just an :class:`object` subclass with a + readable string representation. If you prefer to have dict-like view of the + attributes, you can use the standard Python idiom, :func:`vars`:: -It may also be useful to have an :class:`ArgumentParser` assign attributes to an -already existing object, rather than a new :class:`Namespace` object. This can -be achieved by specifying the ``namespace=`` keyword argument:: - - >>> class C: - ... pass - ... - >>> c = C() - >>> parser = argparse.ArgumentParser() - >>> parser.add_argument('--foo') - >>> parser.parse_args(args=['--foo', 'BAR'], namespace=c) - >>> c.foo - 'BAR' + >>> parser = argparse.ArgumentParser() + >>> parser.add_argument('--foo') + >>> args = parser.parse_args(['--foo', 'BAR']) + >>> vars(args) + {'foo': 'BAR'} + + It may also be useful to have an :class:`ArgumentParser` assign attributes to an + already existing object, rather than a new :class:`Namespace` object. This can + be achieved by specifying the ``namespace=`` keyword argument:: + + >>> class C: + ... pass + ... + >>> c = C() + >>> parser = argparse.ArgumentParser() + >>> parser.add_argument('--foo') + >>> parser.parse_args(args=['--foo', 'BAR'], namespace=c) + >>> c.foo + 'BAR' Other utilities @@ -1710,38 +1520,38 @@ Other utilities Sub-commands ^^^^^^^^^^^^ -.. method:: ArgumentParser.add_subparsers([title], [description], [prog], \ +.. method:: ArgumentParser.add_subparsers(*, [title], [description], [prog], \ [parser_class], [action], \ - [option_strings], [dest], [required], \ + [dest], [required], \ [help], [metavar]) - Many programs split up their functionality into a number of sub-commands, - for example, the ``svn`` program can invoke sub-commands like ``svn + Many programs split up their functionality into a number of subcommands, + for example, the ``svn`` program can invoke subcommands like ``svn checkout``, ``svn update``, and ``svn commit``. Splitting up functionality this way can be a particularly good idea when a program performs several different functions which require different kinds of command-line arguments. - :class:`ArgumentParser` supports the creation of such sub-commands with the - :meth:`add_subparsers` method. The :meth:`add_subparsers` method is normally + :class:`ArgumentParser` supports the creation of such subcommands with the + :meth:`!add_subparsers` method. The :meth:`!add_subparsers` method is normally called with no arguments and returns a special action object. This object has a single method, :meth:`~_SubParsersAction.add_parser`, which takes a - command name and any :class:`ArgumentParser` constructor arguments, and - returns an :class:`ArgumentParser` object that can be modified as usual. + command name and any :class:`!ArgumentParser` constructor arguments, and + returns an :class:`!ArgumentParser` object that can be modified as usual. Description of parameters: - * title - title for the sub-parser group in help output; by default + * *title* - title for the sub-parser group in help output; by default "subcommands" if description is provided, otherwise uses title for positional arguments - * description - description for the sub-parser group in help output, by + * *description* - description for the sub-parser group in help output, by default ``None`` - * prog - usage information that will be displayed with sub-command help, + * *prog* - usage information that will be displayed with sub-command help, by default the name of the program and any positional arguments before the subparser argument - * parser_class - class which will be used to create sub-parser instances, by - default the class of the current parser (e.g. ArgumentParser) + * *parser_class* - class which will be used to create sub-parser instances, by + default the class of the current parser (e.g. :class:`ArgumentParser`) * action_ - the basic type of action to be taken when this argument is encountered at the command line @@ -1754,15 +1564,15 @@ Sub-commands * help_ - help for sub-parser group in help output, by default ``None`` - * metavar_ - string presenting available sub-commands in help; by default it - is ``None`` and presents sub-commands in form {cmd1, cmd2, ..} + * metavar_ - string presenting available subcommands in help; by default it + is ``None`` and presents subcommands in form {cmd1, cmd2, ..} Some example usage:: >>> # create the top-level parser >>> parser = argparse.ArgumentParser(prog='PROG') >>> parser.add_argument('--foo', action='store_true', help='foo help') - >>> subparsers = parser.add_subparsers(help='sub-command help') + >>> subparsers = parser.add_subparsers(help='subcommand help') >>> >>> # create the parser for the "a" command >>> parser_a = subparsers.add_parser('a', help='a help') @@ -1770,7 +1580,7 @@ Sub-commands >>> >>> # create the parser for the "b" command >>> parser_b = subparsers.add_parser('b', help='b help') - >>> parser_b.add_argument('--baz', choices='XYZ', help='baz help') + >>> parser_b.add_argument('--baz', choices=('X', 'Y', 'Z'), help='baz help') >>> >>> # parse some argument lists >>> parser.parse_args(['a', '12']) @@ -1797,7 +1607,7 @@ Sub-commands usage: PROG [-h] [--foo] {a,b} ... positional arguments: - {a,b} sub-command help + {a,b} subcommand help a a help b b help @@ -1858,7 +1668,7 @@ Sub-commands that each subparser knows which Python function it should execute. For example:: - >>> # sub-command functions + >>> # subcommand functions >>> def foo(args): ... print(args.x * args.y) ... @@ -1907,7 +1717,7 @@ Sub-commands Namespace(subparser_name='2', y='frobble') .. versionchanged:: 3.7 - New *required* keyword argument. + New *required* keyword-only parameter. FileType objects @@ -1943,13 +1753,14 @@ FileType objects Argument groups ^^^^^^^^^^^^^^^ -.. method:: ArgumentParser.add_argument_group(title=None, description=None) +.. method:: ArgumentParser.add_argument_group(title=None, description=None, *, \ + [argument_default], [conflict_handler]) By default, :class:`ArgumentParser` groups command-line arguments into "positional arguments" and "options" when displaying help messages. When there is a better conceptual grouping of arguments than this default one, appropriate groups can be created using the - :meth:`add_argument_group` method:: + :meth:`!add_argument_group` method:: >>> parser = argparse.ArgumentParser(prog='PROG', add_help=False) >>> group = parser.add_argument_group('group') @@ -1966,7 +1777,7 @@ Argument groups has an :meth:`~ArgumentParser.add_argument` method just like a regular :class:`ArgumentParser`. When an argument is added to the group, the parser treats it just like a normal argument, but displays the argument in a - separate group for help messages. The :meth:`add_argument_group` method + separate group for help messages. The :meth:`!add_argument_group` method accepts *title* and *description* arguments which can be used to customize this display:: @@ -1988,6 +1799,11 @@ Argument groups --bar BAR bar help + The optional, keyword-only parameters argument_default_ and conflict_handler_ + allow for finer-grained control of the behavior of the argument group. These + parameters have the same meaning as in the :class:`ArgumentParser` constructor, + but apply specifically to the argument group rather than the entire parser. + Note that any arguments not in your user-defined groups will end up back in the usual "positional arguments" and "optional arguments" sections. @@ -2003,7 +1819,7 @@ Mutual exclusion .. method:: ArgumentParser.add_mutually_exclusive_group(required=False) - Create a mutually exclusive group. :mod:`argparse` will make sure that only + Create a mutually exclusive group. :mod:`!argparse` will make sure that only one of the arguments in the mutually exclusive group was present on the command line:: @@ -2140,20 +1956,20 @@ Partial parsing .. method:: ArgumentParser.parse_known_args(args=None, namespace=None) -Sometimes a script may only parse a few of the command-line arguments, passing -the remaining arguments on to another script or program. In these cases, the -:meth:`~ArgumentParser.parse_known_args` method can be useful. It works much like -:meth:`~ArgumentParser.parse_args` except that it does not produce an error when -extra arguments are present. Instead, it returns a two item tuple containing -the populated namespace and the list of remaining argument strings. + Sometimes a script may only parse a few of the command-line arguments, passing + the remaining arguments on to another script or program. In these cases, the + :meth:`~ArgumentParser.parse_known_args` method can be useful. It works much like + :meth:`~ArgumentParser.parse_args` except that it does not produce an error when + extra arguments are present. Instead, it returns a two item tuple containing + the populated namespace and the list of remaining argument strings. -:: + :: - >>> parser = argparse.ArgumentParser() - >>> parser.add_argument('--foo', action='store_true') - >>> parser.add_argument('bar') - >>> parser.parse_known_args(['--foo', '--badger', 'BAR', 'spam']) - (Namespace(bar='BAR', foo=True), ['--badger', 'spam']) + >>> parser = argparse.ArgumentParser() + >>> parser.add_argument('--foo', action='store_true') + >>> parser.add_argument('bar') + >>> parser.parse_known_args(['--foo', '--badger', 'BAR', 'spam']) + (Namespace(bar='BAR', foo=True), ['--badger', 'spam']) .. warning:: :ref:`Prefix matching ` rules apply to @@ -2190,8 +2006,8 @@ Exiting methods .. method:: ArgumentParser.exit(status=0, message=None) This method terminates the program, exiting with the specified *status* - and, if given, it prints a *message* before that. The user can override - this method to handle these steps differently:: + and, if given, it prints a *message* to :data:`sys.stderr` before that. + The user can override this method to handle these steps differently:: class ErrorCatchingArgumentParser(argparse.ArgumentParser): def exit(self, status=0, message=None): @@ -2201,8 +2017,8 @@ Exiting methods .. method:: ArgumentParser.error(message) - This method prints a usage message including the *message* to the - standard error and terminates the program with a status code of 2. + This method prints a usage message, including the *message*, to + :data:`sys.stderr` and terminates the program with a status code of 2. Intermixed parsing @@ -2211,90 +2027,66 @@ Intermixed parsing .. method:: ArgumentParser.parse_intermixed_args(args=None, namespace=None) .. method:: ArgumentParser.parse_known_intermixed_args(args=None, namespace=None) -A number of Unix commands allow the user to intermix optional arguments with -positional arguments. The :meth:`~ArgumentParser.parse_intermixed_args` -and :meth:`~ArgumentParser.parse_known_intermixed_args` methods -support this parsing style. - -These parsers do not support all the argparse features, and will raise -exceptions if unsupported features are used. In particular, subparsers, -and mutually exclusive groups that include both -optionals and positionals are not supported. - -The following example shows the difference between -:meth:`~ArgumentParser.parse_known_args` and -:meth:`~ArgumentParser.parse_intermixed_args`: the former returns ``['2', -'3']`` as unparsed arguments, while the latter collects all the positionals -into ``rest``. :: + A number of Unix commands allow the user to intermix optional arguments with + positional arguments. The :meth:`~ArgumentParser.parse_intermixed_args` + and :meth:`~ArgumentParser.parse_known_intermixed_args` methods + support this parsing style. - >>> parser = argparse.ArgumentParser() - >>> parser.add_argument('--foo') - >>> parser.add_argument('cmd') - >>> parser.add_argument('rest', nargs='*', type=int) - >>> parser.parse_known_args('doit 1 --foo bar 2 3'.split()) - (Namespace(cmd='doit', foo='bar', rest=[1]), ['2', '3']) - >>> parser.parse_intermixed_args('doit 1 --foo bar 2 3'.split()) - Namespace(cmd='doit', foo='bar', rest=[1, 2, 3]) - -:meth:`~ArgumentParser.parse_known_intermixed_args` returns a two item tuple -containing the populated namespace and the list of remaining argument strings. -:meth:`~ArgumentParser.parse_intermixed_args` raises an error if there are any -remaining unparsed argument strings. + These parsers do not support all the :mod:`!argparse` features, and will raise + exceptions if unsupported features are used. In particular, subparsers, + and mutually exclusive groups that include both + optionals and positionals are not supported. -.. versionadded:: 3.7 + The following example shows the difference between + :meth:`~ArgumentParser.parse_known_args` and + :meth:`~ArgumentParser.parse_intermixed_args`: the former returns ``['2', + '3']`` as unparsed arguments, while the latter collects all the positionals + into ``rest``. :: -.. _upgrading-optparse-code: - -Upgrading optparse code ------------------------ - -Originally, the :mod:`argparse` module had attempted to maintain compatibility -with :mod:`optparse`. However, :mod:`optparse` was difficult to extend -transparently, particularly with the changes required to support the new -``nargs=`` specifiers and better usage messages. When most everything in -:mod:`optparse` had either been copy-pasted over or monkey-patched, it no -longer seemed practical to try to maintain the backwards compatibility. - -The :mod:`argparse` module improves on the standard library :mod:`optparse` -module in a number of ways including: - -* Handling positional arguments. -* Supporting sub-commands. -* Allowing alternative option prefixes like ``+`` and ``/``. -* Handling zero-or-more and one-or-more style arguments. -* Producing more informative usage messages. -* Providing a much simpler interface for custom ``type`` and ``action``. + >>> parser = argparse.ArgumentParser() + >>> parser.add_argument('--foo') + >>> parser.add_argument('cmd') + >>> parser.add_argument('rest', nargs='*', type=int) + >>> parser.parse_known_args('doit 1 --foo bar 2 3'.split()) + (Namespace(cmd='doit', foo='bar', rest=[1]), ['2', '3']) + >>> parser.parse_intermixed_args('doit 1 --foo bar 2 3'.split()) + Namespace(cmd='doit', foo='bar', rest=[1, 2, 3]) -A partial upgrade path from :mod:`optparse` to :mod:`argparse`: + :meth:`~ArgumentParser.parse_known_intermixed_args` returns a two item tuple + containing the populated namespace and the list of remaining argument strings. + :meth:`~ArgumentParser.parse_intermixed_args` raises an error if there are any + remaining unparsed argument strings. -* Replace all :meth:`optparse.OptionParser.add_option` calls with - :meth:`ArgumentParser.add_argument` calls. + .. versionadded:: 3.7 -* Replace ``(options, args) = parser.parse_args()`` with ``args = - parser.parse_args()`` and add additional :meth:`ArgumentParser.add_argument` - calls for the positional arguments. Keep in mind that what was previously - called ``options``, now in the :mod:`argparse` context is called ``args``. -* Replace :meth:`optparse.OptionParser.disable_interspersed_args` - by using :meth:`~ArgumentParser.parse_intermixed_args` instead of - :meth:`~ArgumentParser.parse_args`. +Registering custom types or actions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -* Replace callback actions and the ``callback_*`` keyword arguments with - ``type`` or ``action`` arguments. +.. method:: ArgumentParser.register(registry_name, value, object) -* Replace string names for ``type`` keyword arguments with the corresponding - type objects (e.g. int, float, complex, etc). + Sometimes it's desirable to use a custom string in error messages to provide + more user-friendly output. In these cases, :meth:`!register` can be used to + register custom actions or types with a parser and allow you to reference the + type by their registered name instead of their callable name. -* Replace :class:`optparse.Values` with :class:`Namespace` and - :exc:`optparse.OptionError` and :exc:`optparse.OptionValueError` with - :exc:`ArgumentError`. + The :meth:`!register` method accepts three arguments - a *registry_name*, + specifying the internal registry where the object will be stored (e.g., + ``action``, ``type``), *value*, which is the key under which the object will + be registered, and object, the callable to be registered. -* Replace strings with implicit arguments such as ``%default`` or ``%prog`` with - the standard Python syntax to use dictionaries to format strings, that is, - ``%(default)s`` and ``%(prog)s``. + The following example shows how to register a custom type with a parser:: -* Replace the OptionParser constructor ``version`` argument with a call to - ``parser.add_argument('--version', action='version', version='')``. + >>> import argparse + >>> parser = argparse.ArgumentParser() + >>> parser.register('type', 'hexadecimal integer', lambda s: int(s, 16)) + >>> parser.add_argument('--foo', type='hexadecimal integer') + _StoreAction(option_strings=['--foo'], dest='foo', nargs=None, const=None, default=None, type='hexadecimal integer', choices=None, required=False, help=None, metavar=None, deprecated=False) + >>> parser.parse_args(['--foo', '0xFA']) + Namespace(foo=250) + >>> parser.parse_args(['--foo', '1.2']) + usage: PROG [-h] [--foo FOO] + PROG: error: argument --foo: invalid 'hexadecimal integer' value: '1.2' Exceptions ---------- @@ -2309,3 +2101,12 @@ Exceptions .. exception:: ArgumentTypeError Raised when something goes wrong converting a command line string to a type. + + +.. rubric:: Guides and Tutorials + +.. toctree:: + :maxdepth: 1 + + ../howto/argparse.rst + ../howto/argparse-optparse.rst diff --git a/Doc/library/array.rst b/Doc/library/array.rst index beaa8cda..b4e656a7 100644 --- a/Doc/library/array.rst +++ b/Doc/library/array.rst @@ -9,7 +9,7 @@ -------------- This module defines an object type which can compactly represent an array of -basic values: characters, integers, floating point numbers. Arrays are sequence +basic values: characters, integers, floating-point numbers. Arrays are sequence types and behave very much like lists, except that the type of objects stored in them is constrained. The type is specified at object creation time by using a :dfn:`type code`, which is a single character. The following type codes are @@ -253,7 +253,7 @@ The string representation is guaranteed to be able to be converted back to an array with the same type and value using :func:`eval`, so long as the :class:`~array.array` class has been imported using ``from array import array``. Variables ``inf`` and ``nan`` must also be defined if it contains -corresponding floating point values. +corresponding floating-point values. Examples:: array('l') diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index 1c0c808e..6a98d9b3 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -157,9 +157,9 @@ Root nodes A Python module, as with :ref:`file input `. Node type generated by :func:`ast.parse` in the default ``"exec"`` *mode*. - *body* is a :class:`list` of the module's :ref:`ast-statements`. + ``body`` is a :class:`list` of the module's :ref:`ast-statements`. - *type_ignores* is a :class:`list` of the module's type ignore comments; + ``type_ignores`` is a :class:`list` of the module's type ignore comments; see :func:`ast.parse` for more details. .. doctest:: @@ -179,7 +179,7 @@ Root nodes A single Python :ref:`expression input `. Node type generated by :func:`ast.parse` when *mode* is ``"eval"``. - *body* is a single node, + ``body`` is a single node, one of the :ref:`expression types `. .. doctest:: @@ -194,7 +194,7 @@ Root nodes A single :ref:`interactive input `, like in :ref:`tut-interac`. Node type generated by :func:`ast.parse` when *mode* is ``"single"``. - *body* is a :class:`list` of :ref:`statement nodes `. + ``body`` is a :class:`list` of :ref:`statement nodes `. .. doctest:: @@ -223,9 +223,9 @@ Root nodes # type: (int, int) -> int return a + b - *argtypes* is a :class:`list` of :ref:`expression nodes `. + ``argtypes`` is a :class:`list` of :ref:`expression nodes `. - *returns* is a single :ref:`expression node `. + ``returns`` is a single :ref:`expression node `. .. doctest:: @@ -881,11 +881,15 @@ Statements .. class:: AnnAssign(target, annotation, value, simple) An assignment with a type annotation. ``target`` is a single node and can - be a :class:`Name`, a :class:`Attribute` or a :class:`Subscript`. + be a :class:`Name`, an :class:`Attribute` or a :class:`Subscript`. ``annotation`` is the annotation, such as a :class:`Constant` or :class:`Name` - node. ``value`` is a single optional node. ``simple`` is a boolean integer - set to True for a :class:`Name` node in ``target`` that do not appear in - between parenthesis and are hence pure names and not expressions. + node. ``value`` is a single optional node. + + ``simple`` is always either 0 (indicating a "complex" target) or 1 + (indicating a "simple" target). A "simple" target consists solely of a + :class:`Name` node that does not appear between parentheses; all other + targets are considered complex. Only simple targets appear in + the :attr:`~object.__annotations__` dictionary of modules and classes. .. doctest:: @@ -2000,7 +2004,7 @@ Function and class definitions YieldFrom(value) A ``yield`` or ``yield from`` expression. Because these are expressions, they - must be wrapped in a :class:`Expr` node if the value sent back is not used. + must be wrapped in an :class:`Expr` node if the value sent back is not used. .. doctest:: @@ -2056,8 +2060,7 @@ Function and class definitions * ``name`` is a raw string for the class name * ``bases`` is a list of nodes for explicitly specified base classes. * ``keywords`` is a list of :class:`.keyword` nodes, principally for 'metaclass'. - Other keywords will be passed to the metaclass, as per `PEP-3115 - `_. + Other keywords will be passed to the metaclass, as per :pep:`3115`. * ``body`` is a list of nodes representing the code within the class definition. * ``decorator_list`` is a list of nodes, as in :class:`FunctionDef`. @@ -2167,7 +2170,7 @@ and classes for traversing abstract syntax trees: If ``type_comments=True`` is given, the parser is modified to check and return type comments as specified by :pep:`484` and :pep:`526`. This is equivalent to adding :data:`ast.PyCF_TYPE_COMMENTS` to the - flags passed to :func:`compile()`. This will report syntax errors + flags passed to :func:`compile`. This will report syntax errors for misplaced type comments. Without this flag, type comments will be ignored, and the ``type_comment`` field on selected AST nodes will always be ``None``. In addition, the locations of ``# type: diff --git a/Doc/library/asynchat.rst b/Doc/library/asynchat.rst new file mode 100644 index 00000000..5e5c3a99 --- /dev/null +++ b/Doc/library/asynchat.rst @@ -0,0 +1,17 @@ +:mod:`!asynchat` --- Asynchronous socket command/response handler +================================================================= + +.. module:: asynchat + :synopsis: Removed in 3.12. + :deprecated: + +.. deprecated-removed:: 3.6 3.12 + +This module is no longer part of the Python standard library. +It was :ref:`removed in Python 3.12 ` after +being deprecated in Python 3.6. The removal was decided in :pep:`594`. + +Applications should use the :mod:`asyncio` module instead. + +The last version of Python that provided the :mod:`!asynchat` module was +`Python 3.11 `_. diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index ba0ee1b6..53aaae41 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -126,7 +126,7 @@ Running and stopping the loop Run the event loop until :meth:`stop` is called. - If :meth:`stop` is called before :meth:`run_forever()` is called, + If :meth:`stop` is called before :meth:`run_forever` is called, the loop will poll the I/O selector once with a timeout of zero, run all callbacks scheduled in response to I/O events (and those that were already scheduled), and then exit. @@ -165,7 +165,7 @@ Running and stopping the loop .. coroutinemethod:: loop.shutdown_asyncgens() Schedule all currently open :term:`asynchronous generator` objects to - close with an :meth:`~agen.aclose()` call. After calling this method, + close with an :meth:`~agen.aclose` call. After calling this method, the event loop will issue a warning if a new asynchronous generator is iterated. This should be used to reliably finalize all scheduled asynchronous generators. @@ -1139,6 +1139,14 @@ DNS Asynchronous version of :meth:`socket.getnameinfo`. +.. note:: + Both *getaddrinfo* and *getnameinfo* internally utilize their synchronous + versions through the loop's default thread pool executor. + When this executor is saturated, these methods may experience delays, + which higher-level networking libraries may report as increased timeouts. + To mitigate this, consider using a custom executor for other user tasks, + or setting a default executor with a larger number of workers. + .. versionchanged:: 3.7 Both *getaddrinfo* and *getnameinfo* methods were always documented to return a coroutine, but prior to Python 3.7 they were, in fact, @@ -1238,6 +1246,9 @@ Executing code in thread or process pools The *executor* argument should be an :class:`concurrent.futures.Executor` instance. The default executor is used if *executor* is ``None``. + The default executor can be set by :meth:`loop.set_default_executor`, + otherwise, a :class:`concurrent.futures.ThreadPoolExecutor` will be + lazy-initialized and used by :func:`run_in_executor` if needed. Example:: @@ -1375,7 +1386,7 @@ Allows customizing how exceptions are handled in the event loop. This method should not be overloaded in subclassed event loops. For custom exception handling, use - the :meth:`set_exception_handler()` method. + the :meth:`set_exception_handler` method. Enabling debug mode ^^^^^^^^^^^^^^^^^^^ @@ -1458,7 +1469,7 @@ async/await code consider using the high-level * *stdin* can be any of these: * a file-like object - * an existing file descriptor (a positive integer), for example those created with :meth:`os.pipe()` + * an existing file descriptor (a positive integer), for example those created with :meth:`os.pipe` * the :const:`subprocess.PIPE` constant (default) which will create a new pipe and connect it, * the value ``None`` which will make the subprocess inherit the file @@ -1739,7 +1750,7 @@ on Unix and :class:`ProactorEventLoop` on Windows. .. seealso:: `MSDN documentation on I/O Completion Ports - `_. + `_. .. class:: AbstractEventLoop diff --git a/Doc/library/asyncio-future.rst b/Doc/library/asyncio-future.rst index 893ae551..9dce0731 100644 --- a/Doc/library/asyncio-future.rst +++ b/Doc/library/asyncio-future.rst @@ -120,20 +120,20 @@ Future Object a :exc:`CancelledError` exception. If the Future's result isn't yet available, this method raises - a :exc:`InvalidStateError` exception. + an :exc:`InvalidStateError` exception. .. method:: set_result(result) Mark the Future as *done* and set its result. - Raises a :exc:`InvalidStateError` error if the Future is + Raises an :exc:`InvalidStateError` error if the Future is already *done*. .. method:: set_exception(exception) Mark the Future as *done* and set an exception. - Raises a :exc:`InvalidStateError` error if the Future is + Raises an :exc:`InvalidStateError` error if the Future is already *done*. .. method:: done() diff --git a/Doc/library/asyncio-llapi-index.rst b/Doc/library/asyncio-llapi-index.rst index 67136ba6..3e21054a 100644 --- a/Doc/library/asyncio-llapi-index.rst +++ b/Doc/library/asyncio-llapi-index.rst @@ -56,10 +56,10 @@ See also the main documentation section about the * - :meth:`loop.close` - Close the event loop. - * - :meth:`loop.is_running()` + * - :meth:`loop.is_running` - Return ``True`` if the event loop is running. - * - :meth:`loop.is_closed()` + * - :meth:`loop.is_closed` - Return ``True`` if the event loop is closed. * - ``await`` :meth:`loop.shutdown_asyncgens` diff --git a/Doc/library/asyncio-queue.rst b/Doc/library/asyncio-queue.rst index d86fbc21..63afc411 100644 --- a/Doc/library/asyncio-queue.rst +++ b/Doc/library/asyncio-queue.rst @@ -55,7 +55,7 @@ Queue Return ``True`` if there are :attr:`maxsize` items in the queue. If the queue was initialized with ``maxsize=0`` (the default), - then :meth:`full()` never returns ``True``. + then :meth:`full` never returns ``True``. .. coroutinemethod:: get() diff --git a/Doc/library/asyncio-runner.rst b/Doc/library/asyncio-runner.rst index b68b2570..e2cff48e 100644 --- a/Doc/library/asyncio-runner.rst +++ b/Doc/library/asyncio-runner.rst @@ -89,7 +89,7 @@ Runner context manager current one. By default :func:`asyncio.new_event_loop` is used and set as current event loop with :func:`asyncio.set_event_loop` if *loop_factory* is ``None``. - Basically, :func:`asyncio.run()` example can be rewritten with the runner usage:: + Basically, :func:`asyncio.run` example can be rewritten with the runner usage:: async def main(): await asyncio.sleep(1) diff --git a/Doc/library/asyncio-sync.rst b/Doc/library/asyncio-sync.rst index 05bdf548..4caa8b9b 100644 --- a/Doc/library/asyncio-sync.rst +++ b/Doc/library/asyncio-sync.rst @@ -262,8 +262,9 @@ Condition Wait until a predicate becomes *true*. The predicate must be a callable which result will be - interpreted as a boolean value. The final value is the - return value. + interpreted as a boolean value. The method will repeatedly + :meth:`~Condition.wait` until the predicate evaluates to *true*. + The final value is the return value. Semaphore @@ -428,7 +429,7 @@ Barrier .. coroutinemethod:: abort() Put the barrier into a broken state. This causes any active or future - calls to :meth:`wait` to fail with the :class:`BrokenBarrierError`. + calls to :meth:`~Barrier.wait` to fail with the :class:`BrokenBarrierError`. Use this for example if one of the tasks needs to abort, to avoid infinite waiting tasks. diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst index 6c046ebe..0ba6e84d 100644 --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -158,7 +158,7 @@ other coroutines:: # Nothing happens if we just call "nested()". # A coroutine object is created but not awaited, # so it *won't run at all*. - nested() + nested() # will raise a "RuntimeWarning". # Let's do it differently now and await it: print(await nested()) # will print "42". @@ -386,6 +386,53 @@ The same special case is made for :exc:`KeyboardInterrupt` and :exc:`SystemExit` as in the previous paragraph. +Terminating a Task Group +------------------------ + +While terminating a task group is not natively supported by the standard +library, termination can be achieved by adding an exception-raising task +to the task group and ignoring the raised exception: + +.. code-block:: python + + import asyncio + from asyncio import TaskGroup + + class TerminateTaskGroup(Exception): + """Exception raised to terminate a task group.""" + + async def force_terminate_task_group(): + """Used to force termination of a task group.""" + raise TerminateTaskGroup() + + async def job(task_id, sleep_time): + print(f'Task {task_id}: start') + await asyncio.sleep(sleep_time) + print(f'Task {task_id}: done') + + async def main(): + try: + async with TaskGroup() as group: + # spawn some tasks + group.create_task(job(1, 0.5)) + group.create_task(job(2, 1.5)) + # sleep for 1 second + await asyncio.sleep(1) + # add an exception-raising task to force the group to terminate + group.create_task(force_terminate_task_group()) + except* TerminateTaskGroup: + pass + + asyncio.run(main()) + +Expected output: + +.. code-block:: text + + Task 1: start + Task 2: start + Task 1: done + Sleeping ======== @@ -1104,7 +1151,7 @@ Task Object a :exc:`CancelledError` exception. If the Task's result isn't yet available, this method raises - a :exc:`InvalidStateError` exception. + an :exc:`InvalidStateError` exception. .. method:: exception() diff --git a/Doc/library/asyncio.rst b/Doc/library/asyncio.rst index 184f981c..1fb575d7 100644 --- a/Doc/library/asyncio.rst +++ b/Doc/library/asyncio.rst @@ -56,8 +56,12 @@ Additionally, there are **low-level** APIs for * :ref:`bridge ` callback-based libraries and code with async/await syntax. +.. include:: ../includes/wasm-notavail.rst + .. _asyncio-cli: +.. rubric:: asyncio REPL + You can experiment with an ``asyncio`` concurrent context in the REPL: .. code-block:: pycon @@ -70,7 +74,10 @@ You can experiment with an ``asyncio`` concurrent context in the REPL: >>> await asyncio.sleep(10, result='hello') 'hello' -.. include:: ../includes/wasm-notavail.rst +.. audit-event:: cpython.run_stdin "" "" + +.. versionchanged:: 3.12.5 (also 3.11.10, 3.10.15, 3.9.20, and 3.8.20) + Emits audit events. .. We use the "rubric" directive here to avoid creating the "Reference" subsection in the TOC. diff --git a/Doc/library/asyncore.rst b/Doc/library/asyncore.rst new file mode 100644 index 00000000..22c9881c --- /dev/null +++ b/Doc/library/asyncore.rst @@ -0,0 +1,17 @@ +:mod:`!asyncore` --- Asynchronous socket handler +================================================ + +.. module:: asyncore + :synopsis: Removed in 3.12. + :deprecated: + +.. deprecated-removed:: 3.6 3.12 + +This module is no longer part of the Python standard library. +It was :ref:`removed in Python 3.12 ` after +being deprecated in Python 3.6. The removal was decided in :pep:`594`. + +Applications should use the :mod:`asyncio` module instead. + +The last version of Python that provided the :mod:`!asyncore` module was +`Python 3.11 `_. diff --git a/Doc/library/builtins.rst b/Doc/library/builtins.rst index 644344e7..c4979db5 100644 --- a/Doc/library/builtins.rst +++ b/Doc/library/builtins.rst @@ -7,10 +7,7 @@ -------------- This module provides direct access to all 'built-in' identifiers of Python; for -example, ``builtins.open`` is the full name for the built-in function -:func:`open`. See :ref:`built-in-funcs` and :ref:`built-in-consts` for -documentation. - +example, ``builtins.open`` is the full name for the built-in function :func:`open`. This module is not normally accessed explicitly by most applications, but can be useful in modules that provide objects with the same name as a built-in value, @@ -40,3 +37,10 @@ available as part of their globals. The value of ``__builtins__`` is normally either this module or the value of this module's :attr:`~object.__dict__` attribute. Since this is an implementation detail, it may not be used by alternate implementations of Python. + +.. seealso:: + + * :ref:`built-in-consts` + * :ref:`bltin-exceptions` + * :ref:`built-in-funcs` + * :ref:`bltin-types` diff --git a/Doc/library/calendar.rst b/Doc/library/calendar.rst index 02d659f9..102bc287 100644 --- a/Doc/library/calendar.rst +++ b/Doc/library/calendar.rst @@ -393,13 +393,22 @@ The :mod:`calendar` module exports the following data attributes: .. data:: day_name - An array that represents the days of the week in the current locale. + A sequence that represents the days of the week in the current locale, + where Monday is day number 0. + + >>> import calendar + >>> list(calendar.day_name) + ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] .. data:: day_abbr - An array that represents the abbreviated days of the week in the current locale. + A sequence that represents the abbreviated days of the week in the current locale, + where Mon is day number 0. + >>> import calendar + >>> list(calendar.day_abbr) + ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] .. data:: MONDAY TUESDAY @@ -426,17 +435,24 @@ The :mod:`calendar` module exports the following data attributes: .. data:: month_name - An array that represents the months of the year in the current locale. This + A sequence that represents the months of the year in the current locale. This follows normal convention of January being month number 1, so it has a length of 13 and ``month_name[0]`` is the empty string. + >>> import calendar + >>> list(calendar.month_name) + ['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] + .. data:: month_abbr - An array that represents the abbreviated months of the year in the current + A sequence that represents the abbreviated months of the year in the current locale. This follows normal convention of January being month number 1, so it has a length of 13 and ``month_abbr[0]`` is the empty string. + >>> import calendar + >>> list(calendar.month_abbr) + ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] .. data:: JANUARY FEBRUARY diff --git a/Doc/library/cmath.rst b/Doc/library/cmath.rst index 381a8332..f122e364 100644 --- a/Doc/library/cmath.rst +++ b/Doc/library/cmath.rst @@ -221,19 +221,21 @@ Classification functions ``False`` otherwise. Whether or not two values are considered close is determined according to - given absolute and relative tolerances. + given absolute and relative tolerances. If no errors occur, the result will + be: ``abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)``. *rel_tol* is the relative tolerance -- it is the maximum allowed difference between *a* and *b*, relative to the larger absolute value of *a* or *b*. For example, to set a tolerance of 5%, pass ``rel_tol=0.05``. The default tolerance is ``1e-09``, which assures that the two values are the same - within about 9 decimal digits. *rel_tol* must be greater than zero. - - *abs_tol* is the minimum absolute tolerance -- useful for comparisons near - zero. *abs_tol* must be at least zero. - - If no errors occur, the result will be: - ``abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)``. + within about 9 decimal digits. *rel_tol* must be nonnegative and less + than ``1.0``. + + *abs_tol* is the absolute tolerance; it defaults to ``0.0`` and it must be + nonnegative. When comparing ``x`` to ``0.0``, ``isclose(x, 0)`` is computed + as ``abs(x) <= rel_tol * abs(x)``, which is ``False`` for any ``x`` and + rel_tol less than ``1.0``. So add an appropriate positive abs_tol argument + to the call. The IEEE 754 special values of ``NaN``, ``inf``, and ``-inf`` will be handled according to IEEE rules. Specifically, ``NaN`` is not considered diff --git a/Doc/library/collections.abc.rst b/Doc/library/collections.abc.rst index ea27436f..0adbd305 100644 --- a/Doc/library/collections.abc.rst +++ b/Doc/library/collections.abc.rst @@ -216,6 +216,9 @@ Collections Abstract Base Classes -- Detailed Descriptions ABC for classes that provide the :meth:`~object.__call__` method. + See :ref:`annotating-callables` for details on how to use + :class:`!Callable` in type annotations. + .. class:: Iterable ABC for classes that provide the :meth:`~container.__iter__` method. @@ -253,6 +256,9 @@ Collections Abstract Base Classes -- Detailed Descriptions :meth:`~generator.send`, :meth:`~generator.throw` and :meth:`~generator.close` methods. + See :ref:`annotating-generators-and-coroutines` + for details on using :class:`!Generator` in type annotations. + .. versionadded:: 3.5 .. class:: Sequence @@ -331,6 +337,11 @@ Collections Abstract Base Classes -- Detailed Descriptions Using ``isinstance(gencoro, Coroutine)`` for them will return ``False``. Use :func:`inspect.isawaitable` to detect them. + See :ref:`annotating-generators-and-coroutines` + for details on using :class:`!Coroutine` in type annotations. + The variance and order of type parameters correspond to those of + :class:`Generator`. + .. versionadded:: 3.5 .. class:: AsyncIterable @@ -352,6 +363,9 @@ Collections Abstract Base Classes -- Detailed Descriptions ABC for :term:`asynchronous generator` classes that implement the protocol defined in :pep:`525` and :pep:`492`. + See :ref:`annotating-generators-and-coroutines` + for details on using :class:`!AsyncGenerator` in type annotations. + .. versionadded:: 3.6 .. class:: Buffer diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index fedf1914..c4586afd 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -99,7 +99,7 @@ The class can be used to simulate nested scopes and is useful in templating. :func:`super` function. A reference to ``d.parents`` is equivalent to: ``ChainMap(*d.maps[1:])``. - Note, the iteration order of a :class:`ChainMap()` is determined by + Note, the iteration order of a :class:`ChainMap` is determined by scanning the mappings last to first:: >>> baseline = {'music': 'bach', 'art': 'rembrandt'} @@ -783,10 +783,10 @@ sequence of key-value pairs into a dictionary of lists: When each key is encountered for the first time, it is not already in the mapping; so an entry is automatically created using the :attr:`~defaultdict.default_factory` -function which returns an empty :class:`list`. The :meth:`list.append` +function which returns an empty :class:`list`. The :meth:`!list.append` operation then attaches the value to the new list. When keys are encountered again, the look-up proceeds normally (returning the list for that key) and the -:meth:`list.append` operation adds another value to the list. This technique is +:meth:`!list.append` operation adds another value to the list. This technique is simpler and faster than an equivalent technique using :meth:`dict.setdefault`: >>> d = {} @@ -874,8 +874,8 @@ they add the ability to access fields by name instead of position index. ``(1, 2)``, then ``x`` will be a required argument, ``y`` will default to ``1``, and ``z`` will default to ``2``. - If *module* is defined, the ``__module__`` attribute of the named tuple is - set to that value. + If *module* is defined, the :attr:`~type.__module__` attribute of the + named tuple is set to that value. Named tuple instances do not have per-instance dictionaries, so they are lightweight and require no more memory than regular tuples. @@ -1163,8 +1163,11 @@ Some differences from :class:`dict` still remain: In addition to the usual mapping methods, ordered dictionaries also support reverse iteration using :func:`reversed`. +.. _collections_OrderedDict__eq__: + Equality tests between :class:`OrderedDict` objects are order-sensitive -and are implemented as ``list(od1.items())==list(od2.items())``. +and are roughly equivalent to ``list(od1.items())==list(od2.items())``. + Equality tests between :class:`OrderedDict` objects and other :class:`~collections.abc.Mapping` objects are order-insensitive like regular dictionaries. This allows :class:`OrderedDict` objects to be substituted @@ -1180,7 +1183,7 @@ anywhere a regular dictionary is used. method. .. versionchanged:: 3.9 - Added merge (``|``) and update (``|=``) operators, specified in :pep:`584`. + Added merge (``|``) and update (``|=``) operators, specified in :pep:`584`. :class:`OrderedDict` Examples and Recipes diff --git a/Doc/library/colorsys.rst b/Doc/library/colorsys.rst index 125d62b1..ffebf4e4 100644 --- a/Doc/library/colorsys.rst +++ b/Doc/library/colorsys.rst @@ -14,7 +14,7 @@ The :mod:`colorsys` module defines bidirectional conversions of color values between colors expressed in the RGB (Red Green Blue) color space used in computer monitors and three other coordinate systems: YIQ, HLS (Hue Lightness Saturation) and HSV (Hue Saturation Value). Coordinates in all of these color -spaces are floating point values. In the YIQ space, the Y coordinate is between +spaces are floating-point values. In the YIQ space, the Y coordinate is between 0 and 1, but the I and Q coordinates can be positive or negative. In all other spaces, the coordinates are all between 0 and 1. diff --git a/Doc/library/compileall.rst b/Doc/library/compileall.rst index f2c64334..1cf40fa6 100644 --- a/Doc/library/compileall.rst +++ b/Doc/library/compileall.rst @@ -90,7 +90,7 @@ compile Python sources. .. option:: -j N Use *N* workers to compile the files within the given directory. - If ``0`` is used, then the result of :func:`os.cpu_count()` + If ``0`` is used, then the result of :func:`os.cpu_count` will be used. .. option:: --invalidation-mode [timestamp|checked-hash|unchecked-hash] diff --git a/Doc/library/configparser.rst b/Doc/library/configparser.rst index 560260e8..4f3549d9 100644 --- a/Doc/library/configparser.rst +++ b/Doc/library/configparser.rst @@ -54,6 +54,7 @@ can be customized by end users easily. import os os.remove("example.ini") + os.remove("override.ini") Quick Start @@ -147,23 +148,28 @@ case-insensitive and stored in lowercase [1]_. It is possible to read several configurations into a single :class:`ConfigParser`, where the most recently added configuration has the highest priority. Any conflicting keys are taken from the more recent -configuration while the previously existing keys are retained. +configuration while the previously existing keys are retained. The example +below reads in an ``override.ini`` file, which will override any conflicting +keys from the ``example.ini`` file. + +.. code-block:: ini + + [DEFAULT] + ServerAliveInterval = -1 .. doctest:: - >>> another_config = configparser.ConfigParser() - >>> another_config.read('example.ini') - ['example.ini'] - >>> another_config['topsecret.server.example']['Port'] - '50022' - >>> another_config.read_string("[topsecret.server.example]\nPort=48484") - >>> another_config['topsecret.server.example']['Port'] - '48484' - >>> another_config.read_dict({"topsecret.server.example": {"Port": 21212}}) - >>> another_config['topsecret.server.example']['Port'] - '21212' - >>> another_config['topsecret.server.example']['ForwardX11'] - 'no' + >>> config_override = configparser.ConfigParser() + >>> config_override['DEFAULT'] = {'ServerAliveInterval': '-1'} + >>> with open('override.ini', 'w') as configfile: + ... config_override.write(configfile) + ... + >>> config_override = configparser.ConfigParser() + >>> config_override.read(['example.ini', 'override.ini']) + ['example.ini', 'override.ini'] + >>> print(config_override.get('DEFAULT', 'ServerAliveInterval')) + -1 + This behaviour is equivalent to a :meth:`ConfigParser.read` call with several files passed to the *filenames* parameter. @@ -955,9 +961,34 @@ ConfigParser Objects When *converters* is given, it should be a dictionary where each key represents the name of a type converter and each value is a callable implementing the conversion from string to the desired datatype. Every - converter gets its own corresponding :meth:`!get*()` method on the parser + converter gets its own corresponding :meth:`!get*` method on the parser object and section proxies. + It is possible to read several configurations into a single + :class:`ConfigParser`, where the most recently added configuration has the + highest priority. Any conflicting keys are taken from the more recent + configuration while the previously existing keys are retained. The example + below reads in an ``override.ini`` file, which will override any conflicting + keys from the ``example.ini`` file. + + .. code-block:: ini + + [DEFAULT] + ServerAliveInterval = -1 + + .. doctest:: + + >>> config_override = configparser.ConfigParser() + >>> config_override['DEFAULT'] = {'ServerAliveInterval': '-1'} + >>> with open('override.ini', 'w') as configfile: + ... config_override.write(configfile) + ... + >>> config_override = configparser.ConfigParser() + >>> config_override.read(['example.ini', 'override.ini']) + ['example.ini', 'override.ini'] + >>> print(config_override.get('DEFAULT', 'ServerAliveInterval')) + -1 + .. versionchanged:: 3.1 The default *dict_type* is :class:`collections.OrderedDict`. @@ -970,7 +1001,7 @@ ConfigParser Objects The *converters* argument was added. .. versionchanged:: 3.7 - The *defaults* argument is read with :meth:`read_dict()`, + The *defaults* argument is read with :meth:`read_dict`, providing consistent behavior across the parser: non-string keys and values are implicitly converted to strings. @@ -1123,7 +1154,7 @@ ConfigParser Objects .. method:: getfloat(section, option, *, raw=False, vars=None[, fallback]) A convenience method which coerces the *option* in the specified *section* - to a floating point number. See :meth:`get` for explanation of *raw*, + to a floating-point number. See :meth:`get` for explanation of *raw*, *vars* and *fallback*. diff --git a/Doc/library/constants.rst b/Doc/library/constants.rst index 93a7244f..3eceecc4 100644 --- a/Doc/library/constants.rst +++ b/Doc/library/constants.rst @@ -79,6 +79,8 @@ A small number of constants live in the built-in namespace. They are: :exc:`SyntaxError`), so they can be considered "true" constants. +.. _site-consts: + Constants added by the :mod:`site` module ----------------------------------------- @@ -94,6 +96,13 @@ should not be used in programs. (i.e. EOF) to exit", and when called, raise :exc:`SystemExit` with the specified exit code. +.. data:: help + :noindex: + + Object that when printed, prints the message "Type help() for interactive + help, or help(object) for help about object.", and when called, + acts as described :func:`elsewhere `. + .. data:: copyright credits diff --git a/Doc/library/contextlib.rst b/Doc/library/contextlib.rst index 27cf9944..f5b34944 100644 --- a/Doc/library/contextlib.rst +++ b/Doc/library/contextlib.rst @@ -322,7 +322,7 @@ Functions and classes provided: .. versionchanged:: 3.12 ``suppress`` now supports suppressing exceptions raised as - part of an :exc:`BaseExceptionGroup`. + part of a :exc:`BaseExceptionGroup`. .. function:: redirect_stdout(new_target) diff --git a/Doc/library/contextvars.rst b/Doc/library/contextvars.rst index 8ae386b4..2a79dfe8 100644 --- a/Doc/library/contextvars.rst +++ b/Doc/library/contextvars.rst @@ -15,7 +15,7 @@ function and the :class:`~contextvars.Context` class should be used to manage the current context in asynchronous frameworks. Context managers that have state should use Context Variables -instead of :func:`threading.local()` to prevent their state from +instead of :func:`threading.local` to prevent their state from bleeding to other code unexpectedly, when used in concurrent code. See also :pep:`567` for additional details. @@ -146,7 +146,7 @@ Manual Context Management Every thread will have a different top-level :class:`~contextvars.Context` object. This means that a :class:`ContextVar` object behaves in a similar - fashion to :func:`threading.local()` when values are assigned in different + fashion to :func:`threading.local` when values are assigned in different threads. Context implements the :class:`collections.abc.Mapping` interface. @@ -254,7 +254,7 @@ client:: # without passing it explicitly to this function. client_addr = client_addr_var.get() - return f'Good bye, client @ {client_addr}\n'.encode() + return f'Good bye, client @ {client_addr}\r\n'.encode() async def handle_request(reader, writer): addr = writer.transport.get_extra_info('socket').getpeername() @@ -268,9 +268,10 @@ client:: print(line) if not line.strip(): break - writer.write(line) - writer.write(render_goodbye()) + writer.write(b'HTTP/1.1 200 OK\r\n') # status line + writer.write(b'\r\n') # headers + writer.write(render_goodbye()) # body writer.close() async def main(): @@ -282,5 +283,6 @@ client:: asyncio.run(main()) - # To test it you can use telnet: + # To test it you can use telnet or curl: # telnet 127.0.0.1 8081 + # curl 127.0.0.1:8081 diff --git a/Doc/library/csv.rst b/Doc/library/csv.rst index 533cdf13..8e432078 100644 --- a/Doc/library/csv.rst +++ b/Doc/library/csv.rst @@ -365,6 +365,12 @@ The :mod:`csv` module defines the following constants: .. versionadded:: 3.12 +.. note:: + + Due to a bug, constants :data:`QUOTE_NOTNULL` and :data:`QUOTE_STRINGS` + do not affect behaviour of :class:`reader` objects. + This bug is fixed in Python 3.13. + The :mod:`csv` module defines the following exception: diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index e01bd927..4b5c8f8b 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -51,7 +51,7 @@ function call fails. Here are some examples for Windows. Note that ``msvcrt`` is the MS standard C -library containing most standard C functions, and uses the cdecl calling +library containing most standard C functions, and uses the ``cdecl`` calling convention:: >>> from ctypes import * @@ -107,7 +107,7 @@ Functions are accessed as attributes of dll objects:: Note that win32 system dlls like ``kernel32`` and ``user32`` often export ANSI as well as UNICODE versions of a function. The UNICODE version is exported with -an ``W`` appended to the name, while the ANSI version is exported with an ``A`` +a ``W`` appended to the name, while the ANSI version is exported with an ``A`` appended to the name. The win32 ``GetModuleHandle`` function, which returns a *module handle* for a given module name, has the following C prototype, and a macro is used to expose one of them as ``GetModuleHandle`` depending on whether @@ -383,7 +383,7 @@ as calling functions with a fixed number of parameters. On some platforms, and i particular ARM64 for Apple Platforms, the calling convention for variadic functions is different than that for regular functions. -On those platforms it is required to specify the :attr:`~_FuncPtr.argtypes` +On those platforms it is required to specify the :attr:`~_CFuncPtr.argtypes` attribute for the regular, non-variadic, function arguments: .. code-block:: python3 @@ -391,7 +391,7 @@ attribute for the regular, non-variadic, function arguments: libc.printf.argtypes = [ctypes.c_char_p] Because specifying the attribute does not inhibit portability it is advised to always -specify :attr:`~_FuncPtr.argtypes` for all variadic functions. +specify :attr:`~_CFuncPtr.argtypes` for all variadic functions. .. _ctypes-calling-functions-with-own-custom-data-types: @@ -426,9 +426,9 @@ Specifying the required argument types (function prototypes) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ It is possible to specify the required argument types of functions exported from -DLLs by setting the :attr:`~_FuncPtr.argtypes` attribute. +DLLs by setting the :attr:`~_CFuncPtr.argtypes` attribute. -:attr:`~_FuncPtr.argtypes` must be a sequence of C data types (the :func:`!printf` function is +:attr:`~_CFuncPtr.argtypes` must be a sequence of C data types (the :func:`!printf` function is probably not a good example here, because it takes a variable number and different types of parameters depending on the format string, on the other hand this is quite handy to experiment with this feature):: @@ -453,7 +453,7 @@ prototype for a C function), and tries to convert the arguments to valid types:: If you have defined your own classes which you pass to function calls, you have to implement a :meth:`~_CData.from_param` class method for them to be able to use them -in the :attr:`~_FuncPtr.argtypes` sequence. The :meth:`~_CData.from_param` class method receives +in the :attr:`~_CFuncPtr.argtypes` sequence. The :meth:`~_CData.from_param` class method receives the Python object passed to the function call, it should do a typecheck or whatever is needed to make sure this object is acceptable, and then return the object itself, its :attr:`!_as_parameter_` attribute, or whatever you want to @@ -476,7 +476,7 @@ Return types By default functions are assumed to return the C :c:expr:`int` type. Other -return types can be specified by setting the :attr:`~_FuncPtr.restype` attribute of the +return types can be specified by setting the :attr:`~_CFuncPtr.restype` attribute of the function object. The C prototype of :c:func:`time` is ``time_t time(time_t *)``. Because :c:type:`time_t` @@ -485,7 +485,7 @@ specify the :attr:`!restype` attribute:: >>> libc.time.restype = c_time_t -The argument types can be specified using :attr:`~_FuncPtr.argtypes`:: +The argument types can be specified using :attr:`~_CFuncPtr.argtypes`:: >>> libc.time.argtypes = (POINTER(c_time_t),) @@ -508,7 +508,7 @@ a string pointer and a char, and returns a pointer to a string:: >>> If you want to avoid the :func:`ord("x") ` calls above, you can set the -:attr:`~_FuncPtr.argtypes` attribute, and the second argument will be converted from a +:attr:`~_CFuncPtr.argtypes` attribute, and the second argument will be converted from a single character Python bytes object into a C char: .. doctest:: @@ -527,7 +527,7 @@ single character Python bytes object into a C char: >>> You can also use a callable Python object (a function or a class for example) as -the :attr:`~_FuncPtr.restype` attribute, if the foreign function returns an integer. The +the :attr:`~_CFuncPtr.restype` attribute, if the foreign function returns an integer. The callable will be called with the *integer* the C function returns, and the result of this call will be used as the result of your function call. This is useful to check for error return values and automatically raise an exception:: @@ -555,7 +555,7 @@ get the string representation of an error code, and *returns* an exception. :func:`GetLastError` to retrieve it. Please note that a much more powerful error checking mechanism is available -through the :attr:`~_FuncPtr.errcheck` attribute; +through the :attr:`~_CFuncPtr.errcheck` attribute; see the reference manual for details. @@ -855,7 +855,7 @@ Type conversions ^^^^^^^^^^^^^^^^ Usually, ctypes does strict type checking. This means, if you have -``POINTER(c_int)`` in the :attr:`~_FuncPtr.argtypes` list of a function or as the type of +``POINTER(c_int)`` in the :attr:`~_CFuncPtr.argtypes` list of a function or as the type of a member field in a structure definition, only instances of exactly the same type are accepted. There are some exceptions to this rule, where ctypes accepts other objects. For example, you can pass compatible array instances instead of @@ -876,7 +876,7 @@ pointer types. So, for ``POINTER(c_int)``, ctypes accepts an array of c_int:: >>> In addition, if a function argument is explicitly declared to be a pointer type -(such as ``POINTER(c_int)``) in :attr:`~_FuncPtr.argtypes`, an object of the pointed +(such as ``POINTER(c_int)``) in :attr:`~_CFuncPtr.argtypes`, an object of the pointed type (``c_int`` in this case) can be passed to the function. ctypes will apply the required :func:`byref` conversion in this case automatically. @@ -1390,13 +1390,15 @@ way is to instantiate one of the following classes: .. class:: OleDLL(name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False, winmode=None) - Windows only: Instances of this class represent loaded shared libraries, + Instances of this class represent loaded shared libraries, functions in these libraries use the ``stdcall`` calling convention, and are assumed to return the windows specific :class:`HRESULT` code. :class:`HRESULT` values contain information specifying whether the function call failed or succeeded, together with additional error code. If the return value signals a failure, an :class:`OSError` is automatically raised. + .. availability:: Windows + .. versionchanged:: 3.3 :exc:`WindowsError` used to be raised, which is now an alias of :exc:`OSError`. @@ -1408,14 +1410,17 @@ way is to instantiate one of the following classes: .. class:: WinDLL(name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False, winmode=None) - Windows only: Instances of this class represent loaded shared libraries, + Instances of this class represent loaded shared libraries, functions in these libraries use the ``stdcall`` calling convention, and are assumed to return :c:expr:`int` by default. + .. availability:: Windows + .. versionchanged:: 3.12 The *name* parameter can now be a :term:`path-like object`. + The Python :term:`global interpreter lock` is released before calling any function exported by these libraries, and reacquired afterwards. @@ -1551,13 +1556,17 @@ These prefabricated library loaders are available: .. data:: windll :noindex: - Windows only: Creates :class:`WinDLL` instances. + Creates :class:`WinDLL` instances. + + .. availability:: Windows .. data:: oledll :noindex: - Windows only: Creates :class:`OleDLL` instances. + Creates :class:`OleDLL` instances. + + .. availability:: Windows .. data:: pydll @@ -1604,10 +1613,20 @@ As explained in the previous section, foreign functions can be accessed as attributes of loaded shared libraries. The function objects created in this way by default accept any number of arguments, accept any ctypes data instances as arguments, and return the default result type specified by the library loader. -They are instances of a private class: +They are instances of a private local class :class:`!_FuncPtr` (not exposed +in :mod:`!ctypes`) which inherits from the private :class:`_CFuncPtr` class: + +.. doctest:: + + >>> import ctypes + >>> lib = ctypes.CDLL(None) + >>> issubclass(lib._FuncPtr, ctypes._CFuncPtr) + True + >>> lib._FuncPtr is ctypes._CFuncPtr + False -.. class:: _FuncPtr +.. class:: _CFuncPtr Base class for C callable foreign functions. @@ -1719,11 +1738,13 @@ See :ref:`ctypes-callback-functions` for examples. .. function:: WINFUNCTYPE(restype, *argtypes, use_errno=False, use_last_error=False) - Windows only: The returned function prototype creates functions that use the + The returned function prototype creates functions that use the ``stdcall`` calling convention. The function will release the GIL during the call. *use_errno* and *use_last_error* have the same meaning as above. + .. availability:: Windows + .. function:: PYFUNCTYPE(restype, *argtypes) @@ -1773,7 +1794,7 @@ different ways, depending on the type and number of the parameters in the call: The optional *paramflags* parameter creates foreign function wrappers with much more functionality than the features described above. -*paramflags* must be a tuple of the same length as :attr:`~_FuncPtr.argtypes`. +*paramflags* must be a tuple of the same length as :attr:`~_CFuncPtr.argtypes`. Each item in this tuple contains further information about a parameter, it must be a tuple containing one, two, or three items. @@ -1844,7 +1865,7 @@ value if there is a single one, or a tuple containing the output parameter values when there are more than one, so the GetWindowRect function now returns a RECT instance, when called. -Output parameters can be combined with the :attr:`~_FuncPtr.errcheck` protocol to do +Output parameters can be combined with the :attr:`~_CFuncPtr.errcheck` protocol to do further output processing and error checking. The win32 ``GetWindowRect`` api function returns a ``BOOL`` to signal success or failure, so this function could do the error checking, and raises an exception when the api call failed:: @@ -1857,7 +1878,7 @@ do the error checking, and raises an exception when the api call failed:: >>> GetWindowRect.errcheck = errcheck >>> -If the :attr:`~_FuncPtr.errcheck` function returns the argument tuple it receives +If the :attr:`~_CFuncPtr.errcheck` function returns the argument tuple it receives unchanged, :mod:`ctypes` continues the normal processing it does on the output parameters. If you want to return a tuple of window coordinates instead of a ``RECT`` instance, you can retrieve the fields in the function and return them @@ -1949,17 +1970,21 @@ Utility functions .. function:: DllCanUnloadNow() - Windows only: This function is a hook which allows implementing in-process + This function is a hook which allows implementing in-process COM servers with ctypes. It is called from the DllCanUnloadNow function that the _ctypes extension dll exports. + .. availability:: Windows + .. function:: DllGetClassObject() - Windows only: This function is a hook which allows implementing in-process + This function is a hook which allows implementing in-process COM servers with ctypes. It is called from the DllGetClassObject function that the ``_ctypes`` extension dll exports. + .. availability:: Windows + .. function:: find_library(name) :module: ctypes.util @@ -1975,7 +2000,7 @@ Utility functions .. function:: find_msvcrt() :module: ctypes.util - Windows only: return the filename of the VC runtime library used by Python, + Returns the filename of the VC runtime library used by Python, and by the extension modules. If the name of the library cannot be determined, ``None`` is returned. @@ -1983,20 +2008,27 @@ Utility functions with a call to the ``free(void *)``, it is important that you use the function in the same library that allocated the memory. + .. availability:: Windows + .. function:: FormatError([code]) - Windows only: Returns a textual description of the error code *code*. If no + Returns a textual description of the error code *code*. If no error code is specified, the last error code is used by calling the Windows api function GetLastError. + .. availability:: Windows + .. function:: GetLastError() - Windows only: Returns the last error code set by Windows in the calling thread. + Returns the last error code set by Windows in the calling thread. This function calls the Windows ``GetLastError()`` function directly, it does not return the ctypes-private copy of the error code. + .. availability:: Windows + + .. function:: get_errno() Returns the current value of the ctypes-private copy of the system @@ -2006,11 +2038,14 @@ Utility functions .. function:: get_last_error() - Windows only: returns the current value of the ctypes-private copy of the system + Returns the current value of the ctypes-private copy of the system :data:`!LastError` variable in the calling thread. + .. availability:: Windows + .. audit-event:: ctypes.get_last_error "" ctypes.get_last_error + .. function:: memmove(dst, src, count) Same as the standard C memmove library function: copies *count* bytes from @@ -2059,10 +2094,12 @@ Utility functions .. function:: set_last_error(value) - Windows only: set the current value of the ctypes-private copy of the system + Sets the current value of the ctypes-private copy of the system :data:`!LastError` variable in the calling thread to *value* and return the previous value. + .. availability:: Windows + .. audit-event:: ctypes.set_last_error error ctypes.set_last_error @@ -2083,12 +2120,14 @@ Utility functions .. function:: WinError(code=None, descr=None) - Windows only: this function is probably the worst-named thing in ctypes. It + This function is probably the worst-named thing in ctypes. It creates an instance of :exc:`OSError`. If *code* is not specified, ``GetLastError`` is called to determine the error code. If *descr* is not specified, :func:`FormatError` is called to get a textual description of the error. + .. availability:: Windows + .. versionchanged:: 3.3 An instance of :exc:`WindowsError` used to be created, which is now an alias of :exc:`OSError`. @@ -2157,7 +2196,7 @@ Data types This method adapts *obj* to a ctypes type. It is called with the actual object used in a foreign function call when the type is present in the - foreign function's :attr:`~_FuncPtr.argtypes` tuple; + foreign function's :attr:`~_CFuncPtr.argtypes` tuple; it must return an object that can be used as a function call parameter. All ctypes data types have a default implementation of this classmethod @@ -2223,7 +2262,7 @@ Fundamental data types Fundamental data types, when returned as foreign function call results, or, for example, by retrieving structure field members or array items, are transparently converted to native Python types. In other words, if a foreign function has a -:attr:`~_FuncPtr.restype` of :class:`c_char_p`, you will always receive a Python bytes +:attr:`~_CFuncPtr.restype` of :class:`c_char_p`, you will always receive a Python bytes object, *not* a :class:`c_char_p` instance. .. XXX above is false, it actually returns a Unicode string @@ -2428,9 +2467,11 @@ These are the fundamental ctypes data types: .. class:: HRESULT - Windows only: Represents a :c:type:`!HRESULT` value, which contains success or + Represents a :c:type:`!HRESULT` value, which contains success or error information for a function or method call. + .. availability:: Windows + .. class:: py_object diff --git a/Doc/library/dataclasses.rst b/Doc/library/dataclasses.rst index e4a9cd4e..87b532fb 100644 --- a/Doc/library/dataclasses.rst +++ b/Doc/library/dataclasses.rst @@ -124,7 +124,7 @@ Module contents - *unsafe_hash*: If ``False`` (the default), a :meth:`~object.__hash__` method is generated according to how *eq* and *frozen* are set. - :meth:`!__hash__` is used by built-in :meth:`hash()`, and when objects are + :meth:`!__hash__` is used by built-in :meth:`hash`, and when objects are added to hashed collections such as dictionaries and sets. Having a :meth:`!__hash__` implies that instances of the class are immutable. Mutability is a complicated property that depends on the programmer's @@ -185,10 +185,21 @@ Module contents - *slots*: If true (the default is ``False``), :attr:`~object.__slots__` attribute will be generated and new class will be returned instead of the original one. If :attr:`!__slots__` is already defined in the class, then :exc:`TypeError` - is raised. Calling no-arg :func:`super` in dataclasses using ``slots=True`` will result in - the following exception being raised: - ``TypeError: super(type, obj): obj must be an instance or subtype of type``. - The two-arg :func:`super` is a valid workaround. See :gh:`90562` for full details. + is raised. + + .. warning:: + Calling no-arg :func:`super` in dataclasses using ``slots=True`` + will result in the following exception being raised: + ``TypeError: super(type, obj): obj must be an instance or subtype of type``. + The two-arg :func:`super` is a valid workaround. + See :gh:`90562` for full details. + + .. warning:: + Passing parameters to a base class :meth:`~object.__init_subclass__` + when using ``slots=True`` will result in a :exc:`TypeError`. + Either use ``__init_subclass__`` with no parameters + or use default values as a workaround. + See :gh:`91126` for full details. .. versionadded:: 3.10 @@ -204,7 +215,8 @@ Module contents - *weakref_slot*: If true (the default is ``False``), add a slot named "__weakref__", which is required to make an instance - weakref-able. It is an error to specify ``weakref_slot=True`` + :func:`weakref-able `. + It is an error to specify ``weakref_slot=True`` without also specifying ``slots=True``. .. versionadded:: 3.11 diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst index 4ba9d6df..54ab05e4 100644 --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -48,7 +48,7 @@ Aware and Naive Objects ----------------------- Date and time objects may be categorized as "aware" or "naive" depending on -whether or not they include timezone information. +whether or not they include time zone information. With sufficient knowledge of applicable algorithmic and political time adjustments, such as time zone and daylight saving time information, @@ -58,7 +58,7 @@ interpretation. [#]_ A **naive** object does not contain enough information to unambiguously locate itself relative to other date/time objects. Whether a naive object represents -Coordinated Universal Time (UTC), local time, or time in some other timezone is +Coordinated Universal Time (UTC), local time, or time in some other time zone is purely up to the program, just like it is up to the program whether a particular number represents metres, miles, or mass. Naive objects are easy to understand and to work with, at the cost of ignoring some aspects of reality. @@ -70,9 +70,9 @@ These :class:`tzinfo` objects capture information about the offset from UTC time, the time zone name, and whether daylight saving time is in effect. Only one concrete :class:`tzinfo` class, the :class:`timezone` class, is -supplied by the :mod:`!datetime` module. The :class:`timezone` class can -represent simple timezones with fixed offsets from UTC, such as UTC itself or -North American EST and EDT timezones. Supporting timezones at deeper levels of +supplied by the :mod:`!datetime` module. The :class:`!timezone` class can +represent simple time zones with fixed offsets from UTC, such as UTC itself or +North American EST and EDT time zones. Supporting time zones at deeper levels of detail is up to the application. The rules for time adjustment across the world are more political than rational, change frequently, and there is no standard suitable for every application aside from UTC. @@ -95,7 +95,7 @@ The :mod:`!datetime` module exports the following constants: .. attribute:: UTC - Alias for the UTC timezone singleton :attr:`datetime.timezone.utc`. + Alias for the UTC time zone singleton :attr:`datetime.timezone.utc`. .. versionadded:: 3.11 @@ -180,19 +180,19 @@ Objects of the :class:`date` type are always naive. An object of type :class:`.time` or :class:`.datetime` may be aware or naive. -A :class:`.datetime` object *d* is aware if both of the following hold: +A :class:`.datetime` object ``d`` is aware if both of the following hold: 1. ``d.tzinfo`` is not ``None`` 2. ``d.tzinfo.utcoffset(d)`` does not return ``None`` -Otherwise, *d* is naive. +Otherwise, ``d`` is naive. -A :class:`.time` object *t* is aware if both of the following hold: +A :class:`.time` object ``t`` is aware if both of the following hold: 1. ``t.tzinfo`` is not ``None`` 2. ``t.tzinfo.utcoffset(None)`` does not return ``None``. -Otherwise, *t* is naive. +Otherwise, ``t`` is naive. The distinction between aware and naive doesn't apply to :class:`timedelta` objects. @@ -283,17 +283,37 @@ Class attributes: Note that, because of normalization, ``timedelta.max`` is greater than ``-timedelta.min``. ``-timedelta.max`` is not representable as a :class:`timedelta` object. + Instance attributes (read-only): -+------------------+--------------------------------------------+ -| Attribute | Value | -+==================+============================================+ -| ``days`` | Between -999999999 and 999999999 inclusive | -+------------------+--------------------------------------------+ -| ``seconds`` | Between 0 and 86399 inclusive | -+------------------+--------------------------------------------+ -| ``microseconds`` | Between 0 and 999999 inclusive | -+------------------+--------------------------------------------+ +.. attribute:: timedelta.days + + Between -999,999,999 and 999,999,999 inclusive. + + +.. attribute:: timedelta.seconds + + Between 0 and 86,399 inclusive. + + .. caution:: + + It is a somewhat common bug for code to unintentionally use this attribute + when it is actually intended to get a :meth:`~timedelta.total_seconds` + value instead: + + .. doctest:: + + >>> from datetime import timedelta + >>> duration = timedelta(seconds=11235813) + >>> duration.days, duration.seconds + (130, 3813) + >>> duration.total_seconds() + 11235813.0 + +.. attribute:: timedelta.microseconds + + Between 0 and 999,999 inclusive. + Supported operations: @@ -338,14 +358,14 @@ Supported operations: +--------------------------------+-----------------------------------------------+ | ``q, r = divmod(t1, t2)`` | Computes the quotient and the remainder: | | | ``q = t1 // t2`` (3) and ``r = t1 % t2``. | -| | q is an integer and r is a :class:`timedelta` | -| | object. | +| | ``q`` is an integer and ``r`` is a | +| | :class:`timedelta` object. | +--------------------------------+-----------------------------------------------+ | ``+t1`` | Returns a :class:`timedelta` object with the | | | same value. (2) | +--------------------------------+-----------------------------------------------+ | ``-t1`` | Equivalent to ``timedelta(-t1.days, | -| | -t1.seconds*, -t1.microseconds)``, | +| | -t1.seconds, -t1.microseconds)``, | | | and to ``t1 * -1``. (1)(4) | +--------------------------------+-----------------------------------------------+ | ``abs(t)`` | Equivalent to ``+t`` when ``t.days >= 0``, | @@ -506,7 +526,7 @@ Other constructors, all class methods: January 1 of year 1 has ordinal 1. :exc:`ValueError` is raised unless ``1 <= ordinal <= - date.max.toordinal()``. For any date *d*, + date.max.toordinal()``. For any date ``d``, ``date.fromordinal(d.toordinal()) == d``. @@ -658,7 +678,7 @@ Instance methods: .. method:: date.toordinal() Return the proleptic Gregorian ordinal of the date, where January 1 of year 1 - has ordinal 1. For any :class:`date` object *d*, + has ordinal 1. For any :class:`date` object ``d``, ``date.fromordinal(d.toordinal()) == d``. @@ -710,7 +730,7 @@ Instance methods: .. method:: date.__str__() - For a date *d*, ``str(d)`` is equivalent to ``d.isoformat()``. + For a date ``d``, ``str(d)`` is equivalent to ``d.isoformat()``. .. method:: date.ctime() @@ -850,7 +870,7 @@ Other constructors, all class methods: .. classmethod:: datetime.today() - Return the current local datetime, with :attr:`.tzinfo` ``None``. + Return the current local date and time, with :attr:`.tzinfo` ``None``. Equivalent to:: @@ -876,6 +896,10 @@ Other constructors, all class methods: This function is preferred over :meth:`today` and :meth:`utcnow`. + .. note:: + + Subsequent calls to :meth:`!datetime.now` may return the same + instant depending on the precision of the underlying clock. .. classmethod:: datetime.utcnow() @@ -987,7 +1011,7 @@ Other constructors, all class methods: is used. If the *date* argument is a :class:`.datetime` object, its time components and :attr:`.tzinfo` attributes are ignored. - For any :class:`.datetime` object *d*, + For any :class:`.datetime` object ``d``, ``d == datetime.combine(d.date(), d.time(), d.tzinfo)``. .. versionchanged:: 3.6 @@ -1034,7 +1058,7 @@ Other constructors, all class methods: .. versionadded:: 3.7 .. versionchanged:: 3.11 Previously, this method only supported formats that could be emitted by - :meth:`date.isoformat()` or :meth:`datetime.isoformat()`. + :meth:`date.isoformat` or :meth:`datetime.isoformat`. .. classmethod:: datetime.fromisocalendar(year, week, day) @@ -1051,7 +1075,7 @@ Other constructors, all class methods: Return a :class:`.datetime` corresponding to *date_string*, parsed according to *format*. - If *format* does not contain microseconds or timezone information, this is equivalent to:: + If *format* does not contain microseconds or time zone information, this is equivalent to:: datetime(*(time.strptime(date_string, format)[0:6])) @@ -1176,11 +1200,11 @@ Supported operations: If both are naive, or both are aware and have the same :attr:`~.datetime.tzinfo` attribute, the :attr:`~.datetime.tzinfo` attributes are ignored, and the result is a :class:`timedelta` - object *t* such that ``datetime2 + t == datetime1``. No time zone adjustments + object ``t`` such that ``datetime2 + t == datetime1``. No time zone adjustments are done in this case. If both are aware and have different :attr:`~.datetime.tzinfo` attributes, ``a-b`` acts - as if *a* and *b* were first converted to naive UTC datetimes. The + as if ``a`` and ``b`` were first converted to naive UTC datetimes. The result is ``(a.replace(tzinfo=None) - a.utcoffset()) - (b.replace(tzinfo=None) - b.utcoffset())`` except that the implementation never overflows. @@ -1267,22 +1291,22 @@ Instance methods: If provided, *tz* must be an instance of a :class:`tzinfo` subclass, and its :meth:`utcoffset` and :meth:`dst` methods must not return ``None``. If *self* - is naive, it is presumed to represent time in the system timezone. + is naive, it is presumed to represent time in the system time zone. If called without arguments (or with ``tz=None``) the system local - timezone is assumed for the target timezone. The ``.tzinfo`` attribute of the converted + time zone is assumed for the target time zone. The ``.tzinfo`` attribute of the converted datetime instance will be set to an instance of :class:`timezone` with the zone name and offset obtained from the OS. If ``self.tzinfo`` is *tz*, ``self.astimezone(tz)`` is equal to *self*: no adjustment of date or time data is performed. Else the result is local - time in the timezone *tz*, representing the same UTC time as *self*: after + time in the time zone *tz*, representing the same UTC time as *self*: after ``astz = dt.astimezone(tz)``, ``astz - astz.utcoffset()`` will have the same date and time data as ``dt - dt.utcoffset()``. - If you merely want to attach a time zone object *tz* to a datetime *dt* without + If you merely want to attach a :class:`timezone` object *tz* to a datetime *dt* without adjustment of date and time data, use ``dt.replace(tzinfo=tz)``. If you - merely want to remove the time zone object from an aware datetime *dt* without + merely want to remove the :class:`!timezone` object from an aware datetime *dt* without conversion of date and time data, use ``dt.replace(tzinfo=None)``. Note that the default :meth:`tzinfo.fromutc` method can be overridden in a @@ -1292,7 +1316,7 @@ Instance methods: def astimezone(self, tz): if self.tzinfo is tz: return self - # Convert self to UTC, and attach the new time zone object. + # Convert self to UTC, and attach the new timezone object. utc = (self - self.utcoffset()).replace(tzinfo=tz) # Convert from UTC to tz's local time. return tz.fromutc(utc) @@ -1353,11 +1377,11 @@ Instance methods: .. method:: datetime.utctimetuple() - If :class:`.datetime` instance *d* is naive, this is the same as + If :class:`.datetime` instance ``d`` is naive, this is the same as ``d.timetuple()`` except that :attr:`~.time.struct_time.tm_isdst` is forced to 0 regardless of what ``d.dst()`` returns. DST is never in effect for a UTC time. - If *d* is aware, *d* is normalized to UTC time, by subtracting + If ``d`` is aware, ``d`` is normalized to UTC time, by subtracting ``d.utcoffset()``, and a :class:`time.struct_time` for the normalized time is returned. :attr:`!tm_isdst` is forced to 0. Note that an :exc:`OverflowError` may be raised if ``d.year`` was @@ -1406,7 +1430,7 @@ Instance methods: There is no method to obtain the POSIX timestamp directly from a naive :class:`.datetime` instance representing UTC time. If your - application uses this convention and your system timezone is not + application uses this convention and your system time zone is not set to UTC, you can obtain the POSIX timestamp by supplying ``tzinfo=timezone.utc``:: @@ -1505,7 +1529,7 @@ Instance methods: .. method:: datetime.__str__() - For a :class:`.datetime` instance *d*, ``str(d)`` is equivalent to + For a :class:`.datetime` instance ``d``, ``str(d)`` is equivalent to ``d.isoformat(' ')``. @@ -1752,7 +1776,7 @@ Instance attributes (read-only): .. versionadded:: 3.6 :class:`.time` objects support equality and order comparisons, -where *a* is considered less than *b* when *a* precedes *b* in time. +where ``a`` is considered less than ``b`` when ``a`` precedes ``b`` in time. Naive and aware :class:`!time` objects are never equal. Order comparison between naive and aware :class:`!time` objects raises @@ -1817,7 +1841,7 @@ Other constructor: .. versionadded:: 3.7 .. versionchanged:: 3.11 Previously, this method only supported formats that could be emitted by - :meth:`time.isoformat()`. + :meth:`time.isoformat`. Instance methods: @@ -1880,7 +1904,7 @@ Instance methods: .. method:: time.__str__() - For a time *t*, ``str(t)`` is equivalent to ``t.isoformat()``. + For a time ``t``, ``str(t)`` is equivalent to ``t.isoformat()``. .. method:: time.strftime(format) @@ -1974,7 +1998,7 @@ Examples of working with a :class:`.time` object:: supply implementations of the standard :class:`tzinfo` methods needed by the :class:`.datetime` methods you use. The :mod:`!datetime` module provides :class:`timezone`, a simple concrete subclass of :class:`tzinfo` which can - represent timezones with fixed offset from UTC such as UTC itself or North + represent time zones with fixed offset from UTC such as UTC itself or North American EST and EDT. Special requirement for pickling: A :class:`tzinfo` subclass must have an @@ -2099,14 +2123,14 @@ When a :class:`.datetime` object is passed in response to a :class:`.datetime` method, ``dt.tzinfo`` is the same object as *self*. :class:`tzinfo` methods can rely on this, unless user code calls :class:`tzinfo` methods directly. The intent is that the :class:`tzinfo` methods interpret *dt* as being in local -time, and not need worry about objects in other timezones. +time, and not need worry about objects in other time zones. There is one more :class:`tzinfo` method that a subclass may wish to override: .. method:: tzinfo.fromutc(dt) - This is called from the default :class:`datetime.astimezone()` + This is called from the default :meth:`datetime.astimezone` implementation. When called from that, ``dt.tzinfo`` is *self*, and *dt*'s date and time data are to be viewed as expressing a UTC time. The purpose of :meth:`fromutc` is to adjust the date and time data, returning an @@ -2216,12 +2240,12 @@ only EST (fixed offset -5 hours), or only EDT (fixed offset -4 hours)). :mod:`zoneinfo` The :mod:`!datetime` module has a basic :class:`timezone` class (for handling arbitrary fixed offsets from UTC) and its :attr:`timezone.utc` - attribute (a UTC timezone instance). + attribute (a UTC :class:`!timezone` instance). - ``zoneinfo`` brings the *IANA timezone database* (also known as the Olson + ``zoneinfo`` brings the *IANA time zone database* (also known as the Olson database) to Python, and its usage is recommended. - `IANA timezone database `_ + `IANA time zone database `_ The Time Zone Database (often called tz, tzdata or zoneinfo) contains code and data that represent the history of local time for many representative locations around the globe. It is updated periodically to reflect changes @@ -2235,10 +2259,10 @@ only EST (fixed offset -5 hours), or only EDT (fixed offset -4 hours)). ------------------------- The :class:`timezone` class is a subclass of :class:`tzinfo`, each -instance of which represents a timezone defined by a fixed offset from +instance of which represents a time zone defined by a fixed offset from UTC. -Objects of this class cannot be used to represent timezone information in the +Objects of this class cannot be used to represent time zone information in the locations where different offsets are used in different days of the year or where historical changes have been made to civil time. @@ -2299,7 +2323,7 @@ Class attributes: .. attribute:: timezone.utc - The UTC timezone, ``timezone(timedelta(0))``. + The UTC time zone, ``timezone(timedelta(0))``. .. index:: @@ -2508,7 +2532,7 @@ Using ``datetime.strptime(date_string, format)`` is equivalent to:: datetime(*(time.strptime(date_string, format)[0:6])) -except when the format includes sub-second components or timezone offset +except when the format includes sub-second components or time zone offset information, which are supported in ``datetime.strptime`` but are discarded by ``time.strptime``. diff --git a/Doc/library/decimal.rst b/Doc/library/decimal.rst index 9aa4254a..c5544f62 100644 --- a/Doc/library/decimal.rst +++ b/Doc/library/decimal.rst @@ -1,4 +1,4 @@ -:mod:`!decimal` --- Decimal fixed point and floating point arithmetic +:mod:`!decimal` --- Decimal fixed-point and floating-point arithmetic ===================================================================== .. module:: decimal @@ -31,7 +31,7 @@ -------------- The :mod:`decimal` module provides support for fast correctly rounded -decimal floating point arithmetic. It offers several advantages over the +decimal floating-point arithmetic. It offers several advantages over the :class:`float` datatype: * Decimal "is based on a floating-point model which was designed with people @@ -207,7 +207,7 @@ a decimal raises :class:`InvalidOperation`:: .. versionchanged:: 3.3 Decimals interact well with much of the rest of Python. Here is a small decimal -floating point flying circus: +floating-point flying circus: .. doctest:: :options: +NORMALIZE_WHITESPACE @@ -373,7 +373,7 @@ Decimal objects digits, and an integer exponent. For example, ``Decimal((0, (1, 4, 1, 4), -3))`` returns ``Decimal('1.414')``. - If *value* is a :class:`float`, the binary floating point value is losslessly + If *value* is a :class:`float`, the binary floating-point value is losslessly converted to its exact decimal equivalent. This conversion can often require 53 or more digits of precision. For example, ``Decimal(float('1.1'))`` converts to @@ -403,7 +403,7 @@ Decimal objects Underscores are allowed for grouping, as with integral and floating-point literals in code. - Decimal floating point objects share many properties with the other built-in + Decimal floating-point objects share many properties with the other built-in numeric types such as :class:`float` and :class:`int`. All of the usual math operations and special methods apply. Likewise, decimal objects can be copied, pickled, printed, used as dictionary keys, used as set elements, @@ -445,7 +445,7 @@ Decimal objects Mixed-type comparisons between :class:`Decimal` instances and other numeric types are now fully supported. - In addition to the standard numeric properties, decimal floating point + In addition to the standard numeric properties, decimal floating-point objects also have a number of specialized methods: @@ -897,6 +897,48 @@ Decimal objects :const:`Rounded`. If given, applies *rounding*; otherwise, uses the rounding method in either the supplied *context* or the current context. + Decimal numbers can be rounded using the :func:`.round` function: + + .. describe:: round(number) + .. describe:: round(number, ndigits) + + If *ndigits* is not given or ``None``, + returns the nearest :class:`int` to *number*, + rounding ties to even, and ignoring the rounding mode of the + :class:`Decimal` context. Raises :exc:`OverflowError` if *number* is an + infinity or :exc:`ValueError` if it is a (quiet or signaling) NaN. + + If *ndigits* is an :class:`int`, the context's rounding mode is respected + and a :class:`Decimal` representing *number* rounded to the nearest + multiple of ``Decimal('1E-ndigits')`` is returned; in this case, + ``round(number, ndigits)`` is equivalent to + ``self.quantize(Decimal('1E-ndigits'))``. Returns ``Decimal('NaN')`` if + *number* is a quiet NaN. Raises :class:`InvalidOperation` if *number* + is an infinity, a signaling NaN, or if the length of the coefficient after + the quantize operation would be greater than the current context's + precision. In other words, for the non-corner cases: + + * if *ndigits* is positive, return *number* rounded to *ndigits* decimal + places; + * if *ndigits* is zero, return *number* rounded to the nearest integer; + * if *ndigits* is negative, return *number* rounded to the nearest + multiple of ``10**abs(ndigits)``. + + For example:: + + >>> from decimal import Decimal, getcontext, ROUND_DOWN + >>> getcontext().rounding = ROUND_DOWN + >>> round(Decimal('3.75')) # context rounding ignored + 4 + >>> round(Decimal('3.5')) # round-ties-to-even + 4 + >>> round(Decimal('3.75'), 0) # uses the context rounding + Decimal('3') + >>> round(Decimal('3.75'), 1) + Decimal('3.7') + >>> round(Decimal('3.75'), -1) + Decimal('0E+1') + .. _logical_operands_label: @@ -1699,7 +1741,7 @@ The following table summarizes the hierarchy of signals:: .. _decimal-notes: -Floating Point Notes +Floating-Point Notes -------------------- @@ -1712,7 +1754,7 @@ can still incur round-off error when non-zero digits exceed the fixed precision. The effects of round-off error can be amplified by the addition or subtraction of nearly offsetting quantities resulting in loss of significance. Knuth -provides two instructive examples where rounded floating point arithmetic with +provides two instructive examples where rounded floating-point arithmetic with insufficient precision causes the breakdown of the associative and distributive properties of addition: @@ -1802,7 +1844,7 @@ treated as equal and their sign is informational. In addition to the two signed zeros which are distinct yet equal, there are various representations of zero with differing precisions yet equivalent in value. This takes a bit of getting used to. For an eye accustomed to -normalized floating point representations, it is not immediately obvious that +normalized floating-point representations, it is not immediately obvious that the following calculation returns a value equal to zero: >>> 1 / Decimal('Infinity') @@ -2129,7 +2171,7 @@ value unchanged: Q. Is there a way to convert a regular float to a :class:`Decimal`? -A. Yes, any binary floating point number can be exactly expressed as a +A. Yes, any binary floating-point number can be exactly expressed as a Decimal though an exact conversion may take more precision than intuition would suggest: @@ -2183,7 +2225,7 @@ Q. Is the CPython implementation fast for large numbers? A. Yes. In the CPython and PyPy3 implementations, the C/CFFI versions of the decimal module integrate the high speed `libmpdec `_ library for -arbitrary precision correctly rounded decimal floating point arithmetic [#]_. +arbitrary precision correctly rounded decimal floating-point arithmetic [#]_. ``libmpdec`` uses `Karatsuba multiplication `_ for medium-sized numbers and the `Number Theoretic Transform diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index e3920587..f9f82d25 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -850,7 +850,8 @@ iterations of the loop. .. opcode:: GET_LEN - Perform ``STACK.append(len(STACK[-1]))``. + Perform ``STACK.append(len(STACK[-1]))``. Used in :keyword:`match` statements where + comparison with structure of pattern is needed. .. versionadded:: 3.10 @@ -995,11 +996,15 @@ iterations of the loop. .. opcode:: BUILD_TUPLE (count) Creates a tuple consuming *count* items from the stack, and pushes the - resulting tuple onto the stack.:: + resulting tuple onto the stack:: - assert count > 0 - STACK, values = STACK[:-count], STACK[-count:] - STACK.append(tuple(values)) + if count == 0: + value = () + else: + value = tuple(STACK[-count:]) + STACK = STACK[:-count] + + STACK.append(value) .. opcode:: BUILD_LIST (count) @@ -1128,7 +1133,10 @@ iterations of the loop. .. opcode:: COMPARE_OP (opname) Performs a Boolean operation. The operation name can be found in - ``cmp_op[opname]``. + ``cmp_op[opname >> 4]``. + + .. versionchanged:: 3.12 + The cmp_op index is now stored in the four-highest bits of oparg instead of the four-lowest bits of oparg. .. opcode:: IS_OP (invert) @@ -1455,7 +1463,7 @@ iterations of the loop. end = STACK.pop() start = STACK.pop() - STACK.append(slice(start, stop)) + STACK.append(slice(start, end)) if it is 3, implements:: @@ -1592,7 +1600,7 @@ iterations of the loop. | ``INTRINSIC_STOPITERATION_ERROR`` | Extracts the return value from a | | | ``StopIteration`` exception. | +-----------------------------------+-----------------------------------+ - | ``INTRINSIC_ASYNC_GEN_WRAP`` | Wraps an aync generator value | + | ``INTRINSIC_ASYNC_GEN_WRAP`` | Wraps an async generator value | +-----------------------------------+-----------------------------------+ | ``INTRINSIC_UNARY_POSITIVE`` | Performs the unary ``+`` | | | operation | diff --git a/Doc/library/distutils.rst b/Doc/library/distutils.rst new file mode 100644 index 00000000..af63e035 --- /dev/null +++ b/Doc/library/distutils.rst @@ -0,0 +1,17 @@ +:mod:`!distutils` --- Building and installing Python modules +============================================================ + +.. module:: distutils + :synopsis: Removed in 3.12. + :deprecated: + +.. deprecated-removed:: 3.10 3.12 + +This module is no longer part of the Python standard library. +It was :ref:`removed in Python 3.12 ` after +being deprecated in Python 3.10. The removal was decided in :pep:`632`, +which has `migration advice +`_. + +The last version of Python that provided the :mod:`!distutils` module was +`Python 3.11 `_. diff --git a/Doc/library/email.compat32-message.rst b/Doc/library/email.compat32-message.rst index c4c322a8..4285c436 100644 --- a/Doc/library/email.compat32-message.rst +++ b/Doc/library/email.compat32-message.rst @@ -7,6 +7,7 @@ :synopsis: The base class representing email messages in a fashion backward compatible with Python 3.2 :noindex: + :no-index: The :class:`Message` class is very similar to the @@ -104,7 +105,7 @@ Here are the methods of the :class:`Message` class: .. method:: __str__() - Equivalent to :meth:`.as_string()`. Allows ``str(msg)`` to produce a + Equivalent to :meth:`.as_string`. Allows ``str(msg)`` to produce a string containing the formatted message. @@ -142,7 +143,7 @@ Here are the methods of the :class:`Message` class: .. method:: __bytes__() - Equivalent to :meth:`.as_bytes()`. Allows ``bytes(msg)`` to produce a + Equivalent to :meth:`.as_bytes`. Allows ``bytes(msg)`` to produce a bytes object containing the formatted message. .. versionadded:: 3.4 diff --git a/Doc/library/email.contentmanager.rst b/Doc/library/email.contentmanager.rst index 34121f8c..a86e2274 100644 --- a/Doc/library/email.contentmanager.rst +++ b/Doc/library/email.contentmanager.rst @@ -58,11 +58,12 @@ * the type itself (``typ``) * the type's fully qualified name (``typ.__module__ + '.' + typ.__qualname__``). - * the type's qualname (``typ.__qualname__``) - * the type's name (``typ.__name__``). + * the type's :attr:`qualname ` (``typ.__qualname__``) + * the type's :attr:`name ` (``typ.__name__``). If none of the above match, repeat all of the checks above for each of - the types in the :term:`MRO` (``typ.__mro__``). Finally, if no other key + the types in the :term:`MRO` (:attr:`typ.__mro__ `). + Finally, if no other key yields a handler, check for a handler for the key ``None``. If there is no handler for ``None``, raise a :exc:`KeyError` for the fully qualified name of the type. diff --git a/Doc/library/email.errors.rst b/Doc/library/email.errors.rst index 33ab4265..f8f43d82 100644 --- a/Doc/library/email.errors.rst +++ b/Doc/library/email.errors.rst @@ -58,6 +58,13 @@ The following exception classes are defined in the :mod:`email.errors` module: :class:`~email.mime.nonmultipart.MIMENonMultipart` (e.g. :class:`~email.mime.image.MIMEImage`). + +.. exception:: HeaderWriteError() + + Raised when an error occurs when the :mod:`~email.generator` outputs + headers. + + .. exception:: MessageDefect() This is the base class for all defects found when parsing email messages. diff --git a/Doc/library/email.header.rst b/Doc/library/email.header.rst index 6e230d5f..219fad0d 100644 --- a/Doc/library/email.header.rst +++ b/Doc/library/email.header.rst @@ -77,7 +77,7 @@ Here is the :class:`Header` class description: The maximum line length can be specified explicitly via *maxlinelen*. For splitting the first line to a shorter value (to account for the field header which isn't included in *s*, e.g. :mailheader:`Subject`) pass in the name of the - field in *header_name*. The default *maxlinelen* is 76, and the default value + field in *header_name*. The default *maxlinelen* is 78, and the default value for *header_name* is ``None``, meaning it is not taken into account for the first line of a long, split header. diff --git a/Doc/library/email.headerregistry.rst b/Doc/library/email.headerregistry.rst index bcbd00c8..7f804493 100644 --- a/Doc/library/email.headerregistry.rst +++ b/Doc/library/email.headerregistry.rst @@ -317,7 +317,7 @@ variant, :attr:`~.BaseHeader.max_count` is set to 1. class. When *use_default_map* is ``True`` (the default), the standard mapping of header names to classes is copied in to the registry during initialization. *base_class* is always the last class in the generated - class's ``__bases__`` list. + class's :class:`~type.__bases__` list. The default mappings are: diff --git a/Doc/library/email.message.rst b/Doc/library/email.message.rst index e9cce1af..71d6e321 100644 --- a/Doc/library/email.message.rst +++ b/Doc/library/email.message.rst @@ -124,7 +124,7 @@ message objects. .. method:: __bytes__() - Equivalent to :meth:`.as_bytes()`. Allows ``bytes(msg)`` to produce a + Equivalent to :meth:`.as_bytes`. Allows ``bytes(msg)`` to produce a bytes object containing the serialized message. diff --git a/Doc/library/email.policy.rst b/Doc/library/email.policy.rst index 83feedf7..51d65dc5 100644 --- a/Doc/library/email.policy.rst +++ b/Doc/library/email.policy.rst @@ -229,6 +229,24 @@ added matters. To illustrate:: .. versionadded:: 3.6 + + .. attribute:: verify_generated_headers + + If ``True`` (the default), the generator will raise + :exc:`~email.errors.HeaderWriteError` instead of writing a header + that is improperly folded or delimited, such that it would + be parsed as multiple headers or joined with adjacent data. + Such headers can be generated by custom header classes or bugs + in the ``email`` module. + + As it's a security feature, this defaults to ``True`` even in the + :class:`~email.policy.Compat32` policy. + For backwards compatible, but unsafe, behavior, it must be set to + ``False`` explicitly. + + .. versionadded:: 3.12.5 + + The following :class:`Policy` method is intended to be called by code using the email library to create policy instances with custom settings: diff --git a/Doc/library/email.utils.rst b/Doc/library/email.utils.rst index 092bfa81..1cb744b5 100644 --- a/Doc/library/email.utils.rst +++ b/Doc/library/email.utils.rst @@ -58,13 +58,18 @@ of the new API. begins with angle brackets, they are stripped off. -.. function:: parseaddr(address) +.. function:: parseaddr(address, *, strict=True) Parse address -- which should be the value of some address-containing field such as :mailheader:`To` or :mailheader:`Cc` -- into its constituent *realname* and *email address* parts. Returns a tuple of that information, unless the parse fails, in which case a 2-tuple of ``('', '')`` is returned. + If *strict* is true, use a strict parser which rejects malformed inputs. + + .. versionchanged:: 3.12.6 + Add *strict* optional parameter and reject malformed inputs by default. + .. function:: formataddr(pair, charset='utf-8') @@ -82,12 +87,15 @@ of the new API. Added the *charset* option. -.. function:: getaddresses(fieldvalues) +.. function:: getaddresses(fieldvalues, *, strict=True) This method returns a list of 2-tuples of the form returned by ``parseaddr()``. *fieldvalues* is a sequence of header field values as might be returned by - :meth:`Message.get_all `. Here's a simple - example that gets all the recipients of a message:: + :meth:`Message.get_all `. + + If *strict* is true, use a strict parser which rejects malformed inputs. + + Here's a simple example that gets all the recipients of a message:: from email.utils import getaddresses @@ -97,6 +105,9 @@ of the new API. resent_ccs = msg.get_all('resent-cc', []) all_recipients = getaddresses(tos + ccs + resent_tos + resent_ccs) + .. versionchanged:: 3.12.6 + Add *strict* optional parameter and reject malformed inputs by default. + .. function:: parsedate(date) @@ -148,7 +159,7 @@ of the new API. Fri, 09 Nov 2001 01:08:47 -0000 - Optional *timeval* if given is a floating point time value as accepted by + Optional *timeval* if given is a floating-point time value as accepted by :func:`time.gmtime` and :func:`time.localtime`, otherwise the current time is used. diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index 10acff61..a4b6a53d 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -44,7 +44,7 @@ using function-call syntax:: ... BLUE = 3 >>> # functional syntax - >>> Color = Enum('Color', ['RED', 'GREEN', 'BLUE']) + >>> Color = Enum('Color', [('RED', 1), ('GREEN', 2), ('BLUE', 3)]) Even though we can use :keyword:`class` syntax to create Enums, Enums are not normal Python classes. See @@ -517,7 +517,7 @@ Data Types ``Flag`` is the same as :class:`Enum`, but its members support the bitwise operators ``&`` (*AND*), ``|`` (*OR*), ``^`` (*XOR*), and ``~`` (*INVERT*); - the results of those operators are members of the enumeration. + the results of those operations are (aliases of) members of the enumeration. .. method:: __contains__(self, value) @@ -560,6 +560,8 @@ Data Types >>> len(white) 3 + .. versionadded:: 3.11 + .. method:: __bool__(self): Returns *True* if any members in flag, *False* otherwise:: diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst index de46518e..537547f6 100644 --- a/Doc/library/exceptions.rst +++ b/Doc/library/exceptions.rst @@ -412,8 +412,8 @@ The following exceptions are the exceptions that are usually raised. represented. This cannot occur for integers (which would rather raise :exc:`MemoryError` than give up). However, for historical reasons, OverflowError is sometimes raised for integers that are outside a required - range. Because of the lack of standardization of floating point exception - handling in C, most floating point operations are not checked. + range. Because of the lack of standardization of floating-point exception + handling in C, most floating-point operations are not checked. .. exception:: RecursionError diff --git a/Doc/library/fileinput.rst b/Doc/library/fileinput.rst index 94a4139f..8f32b11e 100644 --- a/Doc/library/fileinput.rst +++ b/Doc/library/fileinput.rst @@ -47,7 +47,7 @@ Lines are returned with any newlines intact, which means that the last line in a file may not have one. You can control how files are opened by providing an opening hook via the -*openhook* parameter to :func:`fileinput.input` or :class:`FileInput()`. The +*openhook* parameter to :func:`fileinput.input` or :func:`FileInput`. The hook must be a function that takes two arguments, *filename* and *mode*, and returns an accordingly opened file-like object. If *encoding* and/or *errors* are specified, they will be passed to the hook as additional keyword arguments. diff --git a/Doc/library/fractions.rst b/Doc/library/fractions.rst index 42569ec8..11591cb3 100644 --- a/Doc/library/fractions.rst +++ b/Doc/library/fractions.rst @@ -31,7 +31,7 @@ another rational number, or from a string. :class:`Fraction` instance with the same value. The next two versions accept either a :class:`float` or a :class:`decimal.Decimal` instance, and return a :class:`Fraction` instance with exactly the same value. Note that due to the - usual issues with binary floating-point (see :ref:`tut-fp-issues`), the + usual issues with binary floating point (see :ref:`tut-fp-issues`), the argument to ``Fraction(1.1)`` is not exactly equal to 11/10, and so ``Fraction(1.1)`` does *not* return ``Fraction(11, 10)`` as one might expect. (But see the documentation for the :meth:`limit_denominator` method below.) @@ -87,7 +87,7 @@ another rational number, or from a string. .. versionchanged:: 3.9 The :func:`math.gcd` function is now used to normalize the *numerator* - and *denominator*. :func:`math.gcd` always return a :class:`int` type. + and *denominator*. :func:`math.gcd` always returns an :class:`int` type. Previously, the GCD type depended on *numerator* and *denominator*. .. versionchanged:: 3.11 diff --git a/Doc/library/ftplib.rst b/Doc/library/ftplib.rst index 8c39dc00..bb153220 100644 --- a/Doc/library/ftplib.rst +++ b/Doc/library/ftplib.rst @@ -243,7 +243,7 @@ FTP objects Retrieve a file in binary transfer mode. :param str cmd: - An appropriate ``STOR`` command: :samp:`"STOR {filename}"`. + An appropriate ``RETR`` command: :samp:`"RETR {filename}"`. :param callback: A single parameter callable that is called diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 6901c021..d26e79d1 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -57,7 +57,7 @@ are always available. They are listed here in alphabetical order. .. function:: abs(x) Return the absolute value of a number. The argument may be an - integer, a floating point number, or an object implementing + integer, a floating-point number, or an object implementing :meth:`~object.__abs__`. If the argument is a complex number, its magnitude is returned. @@ -161,7 +161,7 @@ are always available. They are listed here in alphabetical order. This function drops you into the debugger at the call site. Specifically, it calls :func:`sys.breakpointhook`, passing ``args`` and ``kws`` straight through. By default, ``sys.breakpointhook()`` calls - :func:`pdb.set_trace()` expecting no arguments. In this case, it is + :func:`pdb.set_trace` expecting no arguments. In this case, it is purely a convenience function so you don't have to explicitly import :mod:`pdb` or type as much code to enter the debugger. However, :func:`sys.breakpointhook` can be set to some other function and @@ -283,9 +283,11 @@ are always available. They are listed here in alphabetical order. :func:`property`. .. versionchanged:: 3.10 - Class methods now inherit the method attributes (``__module__``, - ``__name__``, ``__qualname__``, ``__doc__`` and ``__annotations__``) and - have a new ``__wrapped__`` attribute. + Class methods now inherit the method attributes + (:attr:`~function.__module__`, :attr:`~function.__name__`, + :attr:`~function.__qualname__`, :attr:`~function.__doc__` and + :attr:`~function.__annotations__`) and have a new ``__wrapped__`` + attribute. .. versionchanged:: 3.11 Class methods can no longer wrap other :term:`descriptors ` such as @@ -538,7 +540,7 @@ are always available. They are listed here in alphabetical order. Take two (non-complex) numbers as arguments and return a pair of numbers consisting of their quotient and remainder when using integer division. With mixed operand types, the rules for binary arithmetic operators apply. For - integers, the result is the same as ``(a // b, a % b)``. For floating point + integers, the result is the same as ``(a // b, a % b)``. For floating-point numbers the result is ``(q, a % b)``, where *q* is usually ``math.floor(a / b)`` but may be 1 less than that. In any case ``q * b + a % b`` is very close to *a*, if ``a % b`` is non-zero it has the same sign as *b*, and ``0 @@ -586,6 +588,11 @@ are always available. They are listed here in alphabetical order. :returns: The result of the evaluated expression. :raises: Syntax errors are reported as exceptions. + .. warning:: + + This function executes arbitrary code. Calling it with + user-supplied input may lead to security vulnerabilities. + The *expression* argument is parsed and evaluated as a Python expression (technically speaking, a condition list) using the *globals* and *locals* dictionaries as global and local namespace. If the *globals* dictionary is @@ -632,6 +639,11 @@ are always available. They are listed here in alphabetical order. .. function:: exec(object, globals=None, locals=None, /, *, closure=None) + .. warning:: + + This function executes arbitrary code. Calling it with + user-supplied input may lead to security vulnerabilities. + This function supports dynamic execution of Python code. *object* must be either a string or a code object. If it is a string, the string is parsed as a suite of Python statements which is then executed (unless a syntax error @@ -714,7 +726,7 @@ are always available. They are listed here in alphabetical order. single: NaN single: Infinity - Return a floating point number constructed from a number or a string. + Return a floating-point number constructed from a number or a string. Examples: @@ -755,8 +767,8 @@ are always available. They are listed here in alphabetical order. Case is not significant, so, for example, "inf", "Inf", "INFINITY", and "iNfINity" are all acceptable spellings for positive infinity. - Otherwise, if the argument is an integer or a floating point number, a - floating point number with the same value (within Python's floating point + Otherwise, if the argument is an integer or a floating-point number, a + floating-point number with the same value (within Python's floating-point precision) is returned. If the argument is outside the range of a Python float, an :exc:`OverflowError` will be raised. @@ -983,7 +995,7 @@ are always available. They are listed here in alphabetical order. ``int(x)`` returns ``x.__int__()``. If the argument defines :meth:`~object.__index__`, it returns ``x.__index__()``. If the argument defines :meth:`~object.__trunc__`, it returns ``x.__trunc__()``. - For floating point numbers, this truncates towards zero. + For floating-point numbers, this truncates towards zero. If the argument is not a number or if *base* is given, then it must be a string, :class:`bytes`, or :class:`bytearray` instance representing an integer @@ -1211,14 +1223,16 @@ are always available. They are listed here in alphabetical order. .. class:: object() - Return a new featureless object. :class:`object` is a base for all classes. - It has methods that are common to all instances of Python classes. This - function does not accept any arguments. + This is the ultimate base class of all other classes. It has methods + that are common to all instances of Python classes. When the constructor + is called, it returns a new featureless object. The constructor does not + accept any arguments. .. note:: - :class:`object` does *not* have a :attr:`~object.__dict__`, so you can't - assign arbitrary attributes to an instance of the :class:`object` class. + :class:`object` instances do *not* have :attr:`~object.__dict__` + attributes, so you can't assign arbitrary attributes to an instance of + :class:`object`. .. function:: oct(x) @@ -1267,7 +1281,7 @@ are always available. They are listed here in alphabetical order. (which on *some* Unix systems, means that *all* writes append to the end of the file regardless of the current seek position). In text mode, if *encoding* is not specified the encoding used is platform-dependent: - :func:`locale.getencoding()` is called to get the current locale encoding. + :func:`locale.getencoding` is called to get the current locale encoding. (For reading and writing raw bytes use binary mode and leave *encoding* unspecified.) The available modes are: @@ -1440,7 +1454,7 @@ are always available. They are listed here in alphabetical order. (where :func:`open` is declared), :mod:`os`, :mod:`os.path`, :mod:`tempfile`, and :mod:`shutil`. - .. audit-event:: open file,mode,flags open + .. audit-event:: open path,mode,flags open The ``mode`` and ``flags`` arguments may have been modified or inferred from the original call. @@ -1496,7 +1510,9 @@ are always available. They are listed here in alphabetical order. returns ``100``, but ``pow(10, -2)`` returns ``0.01``. For a negative base of type :class:`int` or :class:`float` and a non-integral exponent, a complex result is delivered. For example, ``pow(-9, 0.5)`` returns a value close - to ``3j``. + to ``3j``. Whereas, for a negative base of type :class:`int` or :class:`float` + with an integral exponent, a float result is delivered. For example, + ``pow(-9, 2.0)`` returns ``81.0``. For :class:`int` operands *base* and *exp*, if *mod* is present, *mod* must also be of integer type and *mod* must be nonzero. If *mod* is present and @@ -1829,10 +1845,11 @@ are always available. They are listed here in alphabetical order. For more information on static methods, see :ref:`types`. .. versionchanged:: 3.10 - Static methods now inherit the method attributes (``__module__``, - ``__name__``, ``__qualname__``, ``__doc__`` and ``__annotations__``), - have a new ``__wrapped__`` attribute, and are now callable as regular - functions. + Static methods now inherit the method attributes + (:attr:`~function.__module__`, :attr:`~function.__name__`, + :attr:`~function.__qualname__`, :attr:`~function.__doc__` and + :attr:`~function.__annotations__`), have a new ``__wrapped__`` attribute, + and are now callable as regular functions. .. index:: @@ -1857,7 +1874,7 @@ are always available. They are listed here in alphabetical order. For some use cases, there are good alternatives to :func:`sum`. The preferred, fast way to concatenate a sequence of strings is by calling - ``''.join(sequence)``. To add floating point values with extended precision, + ``''.join(sequence)``. To add floating-point values with extended precision, see :func:`math.fsum`\. To concatenate a series of iterables, consider using :func:`itertools.chain`. @@ -1879,14 +1896,14 @@ are always available. They are listed here in alphabetical order. to be searched. The search starts from the class right after the *type*. - For example, if :attr:`~class.__mro__` of *object_or_type* is + For example, if :attr:`~type.__mro__` of *object_or_type* is ``D -> B -> C -> A -> object`` and the value of *type* is ``B``, then :func:`super` searches ``C -> A -> object``. - The :attr:`~class.__mro__` attribute of the *object_or_type* lists the method - resolution search order used by both :func:`getattr` and :func:`super`. The - attribute is dynamic and can change whenever the inheritance hierarchy is - updated. + The :attr:`~type.__mro__` attribute of the class corresponding to + *object_or_type* lists the method resolution search order used by both + :func:`getattr` and :func:`super`. The attribute is dynamic and can change + whenever the inheritance hierarchy is updated. If the second argument is omitted, the super object returned is unbound. If the second argument is an object, ``isinstance(obj, type)`` must be true. If @@ -1955,28 +1972,30 @@ are always available. They are listed here in alphabetical order. With one argument, return the type of an *object*. The return value is a type object and generally the same object as returned by - :attr:`object.__class__ `. + :attr:`object.__class__`. The :func:`isinstance` built-in function is recommended for testing the type of an object, because it takes subclasses into account. - With three arguments, return a new type object. This is essentially a dynamic form of the :keyword:`class` statement. The *name* string is - the class name and becomes the :attr:`~definition.__name__` attribute. + the class name and becomes the :attr:`~type.__name__` attribute. The *bases* tuple contains the base classes and becomes the - :attr:`~class.__bases__` attribute; if empty, :class:`object`, the + :attr:`~type.__bases__` attribute; if empty, :class:`object`, the ultimate base of all classes, is added. The *dict* dictionary contains attribute and method definitions for the class body; it may be copied - or wrapped before becoming the :attr:`~object.__dict__` attribute. - The following two statements create identical :class:`type` objects: + or wrapped before becoming the :attr:`~type.__dict__` attribute. + The following two statements create identical :class:`!type` objects: >>> class X: ... a = 1 ... >>> X = type('X', (), dict(a=1)) - See also :ref:`bltin-type-objects`. + See also: + + * :ref:`Documentation on attributes and methods on classes `. + * :ref:`bltin-type-objects` Keyword arguments provided to the three argument form are passed to the appropriate metaclass machinery (usually :meth:`~object.__init_subclass__`) @@ -1986,18 +2005,18 @@ are always available. They are listed here in alphabetical order. See also :ref:`class-customization`. .. versionchanged:: 3.6 - Subclasses of :class:`type` which don't override ``type.__new__`` may no + Subclasses of :class:`!type` which don't override ``type.__new__`` may no longer use the one-argument form to get the type of an object. .. function:: vars() vars(object) Return the :attr:`~object.__dict__` attribute for a module, class, instance, - or any other object with a :attr:`~object.__dict__` attribute. + or any other object with a :attr:`!__dict__` attribute. Objects such as modules and instances have an updateable :attr:`~object.__dict__` attribute; however, other objects may have write restrictions on their - :attr:`~object.__dict__` attributes (for example, classes use a + :attr:`!__dict__` attributes (for example, classes use a :class:`types.MappingProxyType` to prevent direct dictionary updates). Without an argument, :func:`vars` acts like :func:`locals`. Note, the diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst index 655e05f4..4bd2ecd9 100644 --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -34,7 +34,7 @@ The :mod:`functools` module defines the following functions: Returns the same as ``lru_cache(maxsize=None)``, creating a thin wrapper around a dictionary lookup for the function arguments. Because it never needs to evict old values, this is smaller and faster than - :func:`lru_cache()` with a size limit. + :func:`lru_cache` with a size limit. For example:: @@ -218,7 +218,7 @@ The :mod:`functools` module defines the following functions: cache. See :ref:`faq-cache-method-calls` An `LRU (least recently used) cache - `_ + `_ works best when the most recent calls are the best predictors of upcoming calls (for example, the most popular articles on a news server tend to change each day). The cache's size limit assures that the cache does not @@ -490,6 +490,25 @@ The :mod:`functools` module defines the following functions: ... print(arg.real, arg.imag) ... + For code that dispatches on a collections type (e.g., ``list``), but wants + to typehint the items of the collection (e.g., ``list[int]``), the + dispatch type should be passed explicitly to the decorator itself with the + typehint going into the function definition:: + + >>> @fun.register(list) + ... def _(arg: list[int], verbose=False): + ... if verbose: + ... print("Enumerate this:") + ... for i, elem in enumerate(arg): + ... print(i, elem) + + .. note:: + + At runtime the function will dispatch on an instance of a list regardless + of the type contained within the list i.e. ``[1,2,3]`` will be + dispatched the same as ``["foo", "bar", "baz"]``. The annotation + provided in this example is for static type checkers only and has no + runtime impact. To enable registering :term:`lambdas` and pre-existing functions, the :func:`register` attribute can also be used in a functional form:: @@ -644,10 +663,11 @@ The :mod:`functools` module defines the following functions: attributes of the wrapper function are updated with the corresponding attributes from the original function. The default values for these arguments are the module level constants ``WRAPPER_ASSIGNMENTS`` (which assigns to the wrapper - function's ``__module__``, ``__name__``, ``__qualname__``, ``__annotations__``, - ``__type_params__``, and ``__doc__``, the documentation string) - and ``WRAPPER_UPDATES`` (which - updates the wrapper function's ``__dict__``, i.e. the instance dictionary). + function's :attr:`~function.__module__`, :attr:`~function.__name__`, + :attr:`~function.__qualname__`, :attr:`~function.__annotations__`, + :attr:`~function.__type_params__`, and :attr:`~function.__doc__`, the + documentation string) and ``WRAPPER_UPDATES`` (which updates the wrapper + function's :attr:`~function.__dict__`, i.e. the instance dictionary). To allow access to the original function for introspection and other purposes (e.g. bypassing a caching decorator such as :func:`lru_cache`), this function @@ -668,7 +688,7 @@ The :mod:`functools` module defines the following functions: .. versionchanged:: 3.2 The ``__wrapped__`` attribute is now automatically added. - The ``__annotations__`` attribute is now copied by default. + The :attr:`~function.__annotations__` attribute is now copied by default. Missing attributes no longer trigger an :exc:`AttributeError`. .. versionchanged:: 3.4 @@ -677,7 +697,7 @@ The :mod:`functools` module defines the following functions: (see :issue:`17482`) .. versionchanged:: 3.12 - The ``__type_params__`` attribute is now copied by default. + The :attr:`~function.__type_params__` attribute is now copied by default. .. decorator:: wraps(wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES) @@ -739,9 +759,10 @@ have three read-only attributes: The keyword arguments that will be supplied when the :class:`partial` object is called. -:class:`partial` objects are like :class:`function` objects in that they are -callable, weak referenceable, and can have attributes. There are some important -differences. For instance, the :attr:`~definition.__name__` and :attr:`__doc__` attributes +:class:`partial` objects are like :ref:`function objects ` +in that they are callable, weak referenceable, and can have attributes. +There are some important differences. For instance, the +:attr:`~function.__name__` and :attr:`function.__doc__` attributes are not created automatically. Also, :class:`partial` objects defined in classes behave like static methods and do not transform into bound methods during instance attribute look-up. diff --git a/Doc/library/getopt.rst b/Doc/library/getopt.rst index ef07ce9d..13f1d964 100644 --- a/Doc/library/getopt.rst +++ b/Doc/library/getopt.rst @@ -92,6 +92,8 @@ exception: An example using only Unix style options: +.. doctest:: + >>> import getopt >>> args = '-a -b -cfoo -d bar a1 a2'.split() >>> args @@ -104,6 +106,8 @@ An example using only Unix style options: Using long option names is equally easy: +.. doctest:: + >>> s = '--condition=foo --testing --output-file abc.def -x a1 a2' >>> args = s.split() >>> args @@ -115,7 +119,9 @@ Using long option names is equally easy: >>> args ['a1', 'a2'] -In a script, typical usage is something like this:: +In a script, typical usage is something like this: + +.. testcode:: import getopt, sys @@ -145,7 +151,9 @@ In a script, typical usage is something like this:: main() Note that an equivalent command line interface could be produced with less code -and more informative help and error messages by using the :mod:`argparse` module:: +and more informative help and error messages by using the :mod:`argparse` module: + +.. testcode:: import argparse diff --git a/Doc/library/getpass.rst b/Doc/library/getpass.rst index b364b1fe..5c0de188 100644 --- a/Doc/library/getpass.rst +++ b/Doc/library/getpass.rst @@ -49,4 +49,4 @@ The :mod:`getpass` module provides two functions: systems which support the :mod:`pwd` module, otherwise, an exception is raised. - In general, this function should be preferred over :func:`os.getlogin()`. + In general, this function should be preferred over :func:`os.getlogin`. diff --git a/Doc/library/gzip.rst b/Doc/library/gzip.rst index a2fff0f9..30088666 100644 --- a/Doc/library/gzip.rst +++ b/Doc/library/gzip.rst @@ -194,7 +194,9 @@ The module defines the following items: .. versionchanged:: 3.11 Speed is improved by compressing all data at once instead of in a streamed fashion. Calls with *mtime* set to ``0`` are delegated to - :func:`zlib.compress` for better speed. + :func:`zlib.compress` for better speed. In this situation the + output may contain a gzip header "OS" byte value other than 255 + "unknown" as supplied by the underlying zlib implementation. .. function:: decompress(data) diff --git a/Doc/library/hashlib.rst b/Doc/library/hashlib.rst index 8f4c42d0..e2881a99 100644 --- a/Doc/library/hashlib.rst +++ b/Doc/library/hashlib.rst @@ -653,7 +653,7 @@ on the hash function used in digital signatures. by the signer. (`NIST SP-800-106 "Randomized Hashing for Digital Signatures" - `_) + `_) In BLAKE2 the salt is processed as a one-time input to the hash function during initialization, rather than as an input to each compression function. @@ -807,8 +807,8 @@ Domain Dedication 1.0 Universal: .. _NIST-SP-800-132: https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf .. _stackexchange pbkdf2 iterations question: https://security.stackexchange.com/questions/3959/recommended-of-iterations-when-using-pbkdf2-sha256/ .. _Attacks on cryptographic hash algorithms: https://en.wikipedia.org/wiki/Cryptographic_hash_function#Attacks_on_cryptographic_hash_algorithms -.. _the FIPS 180-4 standard: https://csrc.nist.gov/publications/detail/fips/180/4/final -.. _the FIPS 202 standard: https://csrc.nist.gov/publications/detail/fips/202/final +.. _the FIPS 180-4 standard: https://csrc.nist.gov/pubs/fips/180-4/upd1/final +.. _the FIPS 202 standard: https://csrc.nist.gov/pubs/fips/202/final .. _HACL\* project: https://github.com/hacl-star/hacl-star @@ -825,7 +825,7 @@ Domain Dedication 1.0 Universal: https://nvlpubs.nist.gov/nistpubs/fips/nist.fips.180-4.pdf The FIPS 180-4 publication on Secure Hash Algorithms. - https://csrc.nist.gov/publications/detail/fips/202/final + https://csrc.nist.gov/pubs/fips/202/final The FIPS 202 publication on the SHA-3 Standard. https://www.blake2.net/ diff --git a/Doc/library/http.cookiejar.rst b/Doc/library/http.cookiejar.rst index 31ac8baf..23ddecf8 100644 --- a/Doc/library/http.cookiejar.rst +++ b/Doc/library/http.cookiejar.rst @@ -137,7 +137,7 @@ The following classes are provided: The Netscape protocol with the bugs fixed. Uses :mailheader:`Set-Cookie2` in place of :mailheader:`Set-Cookie`. Not widely used. - http://kristol.org/cookie/errata.html + https://kristol.org/cookie/errata.html Unfinished errata to :rfc:`2965`. :rfc:`2964` - Use of HTTP State Management diff --git a/Doc/library/http.server.rst b/Doc/library/http.server.rst index fcc314a8..d2e43f03 100644 --- a/Doc/library/http.server.rst +++ b/Doc/library/http.server.rst @@ -263,7 +263,7 @@ provides three different variants: Adds a blank line (indicating the end of the HTTP headers in the response) - to the headers buffer and calls :meth:`flush_headers()`. + to the headers buffer and calls :meth:`flush_headers`. .. versionchanged:: 3.2 The buffered headers are written to the output stream. @@ -378,7 +378,7 @@ provides three different variants: If the request was mapped to a file, it is opened. Any :exc:`OSError` exception in opening the requested file is mapped to a ``404``, - ``'File not found'`` error. If there was a ``'If-Modified-Since'`` + ``'File not found'`` error. If there was an ``'If-Modified-Since'`` header in the request, and the file was not modified after this time, a ``304``, ``'Not Modified'`` response is sent. Otherwise, the content type is guessed by calling the :meth:`guess_type` method, which in turn diff --git a/Doc/library/imp.rst b/Doc/library/imp.rst new file mode 100644 index 00000000..3dc4c568 --- /dev/null +++ b/Doc/library/imp.rst @@ -0,0 +1,18 @@ +:mod:`!imp` --- Access the import internals +=========================================== + +.. module:: imp + :synopsis: Removed in 3.12. + :deprecated: + +.. deprecated-removed:: 3.4 3.12 + +This module is no longer part of the Python standard library. +It was :ref:`removed in Python 3.12 ` after +being deprecated in Python 3.4. + +The :ref:`removal notice ` includes guidance for +migrating code from :mod:`!imp` to :mod:`importlib`. + +The last version of Python that provided the :mod:`!imp` module was +`Python 3.11 `_. diff --git a/Doc/library/importlib.metadata.rst b/Doc/library/importlib.metadata.rst index 3f407ba4..289e02cc 100644 --- a/Doc/library/importlib.metadata.rst +++ b/Doc/library/importlib.metadata.rst @@ -100,6 +100,13 @@ You can also get a :ref:`distribution's version number `, list its :ref:`requirements`. +.. exception:: PackageNotFoundError + + Subclass of :class:`ModuleNotFoundError` raised by several functions in this + module when queried for a distribution package which is not installed in the + current Python environment. + + Functional API ============== @@ -111,31 +118,53 @@ This package provides the following functionality via its public API. Entry points ------------ -The ``entry_points()`` function returns a collection of entry points. -Entry points are represented by ``EntryPoint`` instances; -each ``EntryPoint`` has a ``.name``, ``.group``, and ``.value`` attributes and -a ``.load()`` method to resolve the value. There are also ``.module``, -``.attr``, and ``.extras`` attributes for getting the components of the -``.value`` attribute. +.. function:: entry_points(**select_params) + + Returns a :class:`EntryPoints` instance describing entry points for the + current environment. Any given keyword parameters are passed to the + :meth:`!select` method for comparison to the attributes of + the individual entry point definitions. + + Note: it is not currently possible to query for entry points based on + their :attr:`!EntryPoint.dist` attribute (as different :class:`!Distribution` + instances do not currently compare equal, even if they have the same attributes) + +.. class:: EntryPoints + + Details of a collection of installed entry points. + + Also provides a ``.groups`` attribute that reports all identified entry + point groups, and a ``.names`` attribute that reports all identified entry + point names. + +.. class:: EntryPoint + + Details of an installed entry point. + + Each :class:`!EntryPoint` instance has ``.name``, ``.group``, and ``.value`` + attributes and a ``.load()`` method to resolve the value. There are also + ``.module``, ``.attr``, and ``.extras`` attributes for getting the + components of the ``.value`` attribute, and ``.dist`` for obtaining + information regarding the distribution package that provides the entry point. Query all entry points:: >>> eps = entry_points() # doctest: +SKIP -The ``entry_points()`` function returns an ``EntryPoints`` object, -a collection of all ``EntryPoint`` objects with ``names`` and ``groups`` +The :func:`!entry_points` function returns a :class:`!EntryPoints` object, +a collection of all :class:`!EntryPoint` objects with ``names`` and ``groups`` attributes for convenience:: >>> sorted(eps.groups) # doctest: +SKIP ['console_scripts', 'distutils.commands', 'distutils.setup_keywords', 'egg_info.writers', 'setuptools.installation'] -``EntryPoints`` has a ``select`` method to select entry points +:class:`!EntryPoints` has a :meth:`!select` method to select entry points matching specific properties. Select entry points in the ``console_scripts`` group:: >>> scripts = eps.select(group='console_scripts') # doctest: +SKIP -Equivalently, since ``entry_points`` passes keyword arguments +Equivalently, since :func:`!entry_points` passes keyword arguments through to select:: >>> scripts = entry_points(group='console_scripts') # doctest: +SKIP @@ -187,31 +216,41 @@ for compatibility options. Distribution metadata --------------------- -Every `Distribution Package `_ includes some metadata, -which you can extract using the -``metadata()`` function:: +.. function:: metadata(distribution_name) + + Return the distribution metadata corresponding to the named + distribution package as a :class:`PackageMetadata` instance. + + Raises :exc:`PackageNotFoundError` if the named distribution + package is not installed in the current Python environment. + +.. class:: PackageMetadata + + A concrete implementation of the + `PackageMetadata protocol `_. + + In addition to providing the defined protocol methods and attributes, subscripting + the instance is equivalent to calling the :meth:`!get` method. + +Every `Distribution Package `_ +includes some metadata, which you can extract using the :func:`!metadata` function:: >>> wheel_metadata = metadata('wheel') # doctest: +SKIP -The keys of the returned data structure, a ``PackageMetadata``, -name the metadata keywords, and +The keys of the returned data structure name the metadata keywords, and the values are returned unparsed from the distribution metadata:: >>> wheel_metadata['Requires-Python'] # doctest: +SKIP '>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*' -``PackageMetadata`` also presents a ``json`` attribute that returns +:class:`PackageMetadata` also presents a :attr:`!json` attribute that returns all the metadata in a JSON-compatible form per :PEP:`566`:: >>> wheel_metadata.json['requires_python'] '>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*' -.. note:: - - The actual type of the object returned by ``metadata()`` is an - implementation detail and should be accessed only through the interface - described by the - `PackageMetadata protocol `_. +The full set of available metadata is not described here. +See the PyPA `Core metadata specification `_ for additional details. .. versionchanged:: 3.10 The ``Description`` is now included in the metadata when presented @@ -225,7 +264,15 @@ all the metadata in a JSON-compatible form per :PEP:`566`:: Distribution versions --------------------- -The ``version()`` function is the quickest way to get a +.. function:: version(distribution_name) + + Return the installed distribution package version for the named + distribution package. + + Raises :exc:`PackageNotFoundError` if the named distribution + package is not installed in the current Python environment. + +The :func:`!version` function is the quickest way to get a `Distribution Package `_'s version number, as a string:: @@ -238,12 +285,28 @@ number, as a string:: Distribution files ------------------ -You can also get the full set of files contained within a distribution. The -``files()`` function takes a `Distribution Package `_ name -and returns all of the -files installed by this distribution. Each file object returned is a -``PackagePath``, a :class:`pathlib.PurePath` derived object with additional ``dist``, -``size``, and ``hash`` properties as indicated by the metadata. For example:: +.. function:: files(distribution_name) + + Return the full set of files contained within the named + distribution package. + + Raises :exc:`PackageNotFoundError` if the named distribution + package is not installed in the current Python environment. + + Returns :const:`None` if the distribution is found but the installation + database records reporting the files associated with the distribuion package + are missing. + +.. class:: PackagePath + + A :class:`pathlib.PurePath` derived object with additional ``dist``, + ``size``, and ``hash`` properties corresponding to the distribution + package's installation metadata for that file. + +The :func:`!files` function takes a +`Distribution Package `_ +name and returns all of the files installed by this distribution. Each file is reported +as a :class:`PackagePath` instance. For example:: >>> util = [p for p in files('wheel') if 'util.py' in str(p)][0] # doctest: +SKIP >>> util # doctest: +SKIP @@ -266,16 +329,16 @@ Once you have the file, you can also read its contents:: return s.encode('utf-8') return s -You can also use the ``locate`` method to get a the absolute path to the -file:: +You can also use the :meth:`!locate` method to get the absolute +path to the file:: >>> util.locate() # doctest: +SKIP PosixPath('/home/gustav/example/lib/site-packages/wheel/util.py') In the case where the metadata file listing files -(RECORD or SOURCES.txt) is missing, ``files()`` will -return ``None``. The caller may wish to wrap calls to -``files()`` in `always_iterable +(``RECORD`` or ``SOURCES.txt``) is missing, :func:`!files` will +return :const:`None`. The caller may wish to wrap calls to +:func:`!files` in `always_iterable `_ or otherwise guard against this condition if the target distribution is not known to have the metadata present. @@ -285,8 +348,16 @@ distribution is not known to have the metadata present. Distribution requirements ------------------------- +.. function:: requires(distribution_name) + + Return the declared dependency specifiers for the named + distribution package. + + Raises :exc:`PackageNotFoundError` if the named distribution + package is not installed in the current Python environment. + To get the full set of requirements for a `Distribution Package `_, -use the ``requires()`` +use the :func:`!requires` function:: >>> requires('wheel') # doctest: +SKIP @@ -299,6 +370,16 @@ function:: Mapping import to distribution packages --------------------------------------- +.. function:: packages_distributions() + + Return a mapping from the top level module and import package + names found via :attr:`sys.meta_path` to the names of the distribution + packages (if any) that provide the corresponding files. + + To allow for namespace packages (which may have members provided by + multiple distribution packages), each top level import name maps to a + list of distribution names rather than mapping directly to a single name. + A convenience method to resolve the `Distribution Package `_ name (or names, in the case of a namespace package) that provide each importable top-level @@ -318,23 +399,42 @@ function is not reliable with such installs. Distributions ============= -While the above API is the most common and convenient usage, you can get all -of that information from the ``Distribution`` class. A ``Distribution`` is an -abstract object that represents the metadata for -a Python `Distribution Package `_. You can -get the ``Distribution`` instance:: +.. function:: distribution(distribution_name) + + Return a :class:`Distribution` instance describing the named + distribution package. + + Raises :exc:`PackageNotFoundError` if the named distribution + package is not installed in the current Python environment. + +.. class:: Distribution + + Details of an installed distribution package. + + Note: different :class:`!Distribution` instances do not currently compare + equal, even if they relate to the same installed distribution and + accordingly have the same attributes. + +While the module level API described above is the most common and convenient usage, +you can get all of that information from the :class:`!Distribution` class. +:class:`!Distribution` is an abstract object that represents the metadata for +a Python `Distribution Package `_. +You can get the concreate :class:`!Distribution` subclass instance for an installed +distribution package by calling the :func:`distribution` function:: >>> from importlib.metadata import distribution # doctest: +SKIP >>> dist = distribution('wheel') # doctest: +SKIP + >>> type(dist) # doctest: +SKIP + Thus, an alternative way to get the version number is through the -``Distribution`` instance:: +:class:`!Distribution` instance:: >>> dist.version # doctest: +SKIP '0.32.3' -There are all kinds of additional metadata available on the ``Distribution`` -instance:: +There are all kinds of additional metadata available on :class:`!Distribution` +instances:: >>> dist.metadata['Requires-Python'] # doctest: +SKIP '>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*' @@ -342,7 +442,7 @@ instance:: 'MIT' The full set of available metadata is not described here. -See the `Core metadata specifications `_ for additional details. +See the PyPA `Core metadata specification `_ for additional details. Distribution Discovery diff --git a/Doc/library/importlib.resources.abc.rst b/Doc/library/importlib.resources.abc.rst index 5ea8044e..54995ddb 100644 --- a/Doc/library/importlib.resources.abc.rst +++ b/Doc/library/importlib.resources.abc.rst @@ -22,7 +22,7 @@ something like a data file that lives next to the ``__init__.py`` file of the package. The purpose of this class is to help abstract out the accessing of such data files so that it does not matter if - the package and its data file(s) are stored in a e.g. zip file + the package and its data file(s) are stored e.g. in a zip file versus on the file system. For any of methods of this class, a *resource* argument is diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst index d92bb2f8..e4e09b09 100644 --- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -249,7 +249,7 @@ ABC hierarchy:: An abstract method for finding a :term:`spec ` for the specified module. If this is a top-level import, *path* will be ``None``. Otherwise, this is a search for a subpackage or - module and *path* will be the value of :attr:`__path__` from the + module and *path* will be the value of :attr:`~module.__path__` from the parent package. If a spec cannot be found, ``None`` is returned. When passed in, ``target`` is a module object that the finder may use to make a more educated guess about what spec to return. @@ -355,34 +355,12 @@ ABC hierarchy:: (note that some of these attributes can change when a module is reloaded): - - :attr:`__name__` - The module's fully qualified name. - It is ``'__main__'`` for an executed module. - - - :attr:`__file__` - The location the :term:`loader` used to load the module. - For example, for modules loaded from a .py file this is the filename. - It is not set on all modules (e.g. built-in modules). - - - :attr:`__cached__` - The filename of a compiled version of the module's code. - It is not set on all modules (e.g. built-in modules). - - - :attr:`__path__` - The list of locations where the package's submodules will be found. - Most of the time this is a single directory. - The import system passes this attribute to ``__import__()`` and to finders - in the same way as :data:`sys.path` but just for the package. - It is not set on non-package modules so it can be used - as an indicator that the module is a package. - - - :attr:`__package__` - The fully qualified name of the package the module is in (or the - empty string for a top-level module). - If the module is a package then this is the same as :attr:`__name__`. - - - :attr:`__loader__` - The :term:`loader` used to load the module. + - :attr:`module.__name__` + - :attr:`module.__file__` + - :attr:`module.__cached__` + - :attr:`module.__path__` + - :attr:`module.__package__` + - :attr:`module.__loader__` *(deprecated)* When :meth:`exec_module` is available then backwards-compatible functionality is provided. @@ -418,7 +396,8 @@ ABC hierarchy:: can implement this abstract method to give direct access to the data stored. :exc:`OSError` is to be raised if the *path* cannot be found. The *path* is expected to be constructed using a module's - :attr:`__file__` attribute or an item from a package's :attr:`__path__`. + :attr:`~module.__file__` attribute or an item from a package's + :attr:`~module.__path__`. .. versionchanged:: 3.4 Raises :exc:`OSError` instead of :exc:`NotImplementedError`. @@ -505,9 +484,9 @@ ABC hierarchy:: .. abstractmethod:: get_filename(fullname) - An abstract method that is to return the value of :attr:`__file__` for - the specified module. If no path is available, :exc:`ImportError` is - raised. + An abstract method that is to return the value of + :attr:`~module.__file__` for the specified module. If no path is + available, :exc:`ImportError` is raised. If source code is available, then the method should return the path to the source file, regardless of whether a bytecode was used to load the @@ -657,7 +636,7 @@ ABC hierarchy:: something like a data file that lives next to the ``__init__.py`` file of the package. The purpose of this class is to help abstract out the accessing of such data files so that it does not matter if - the package and its data file(s) are stored in a e.g. zip file + the package and its data file(s) are stored e.g. in a zip file versus on the file system. For any of methods of this class, a *resource* argument is @@ -1166,79 +1145,74 @@ find and load modules. .. class:: ModuleSpec(name, loader, *, origin=None, loader_state=None, is_package=None) A specification for a module's import-system-related state. This is - typically exposed as the module's :attr:`__spec__` attribute. In the - descriptions below, the names in parentheses give the corresponding - attribute available directly on the module object, - e.g. ``module.__spec__.origin == module.__file__``. Note, however, that + typically exposed as the module's :attr:`~module.__spec__` attribute. Many + of these attributes are also available directly on a module: for example, + ``module.__spec__.origin == module.__file__``. Note, however, that while the *values* are usually equivalent, they can differ since there is - no synchronization between the two objects. For example, it is possible to update - the module's :attr:`__file__` at runtime and this will not be automatically - reflected in the module's :attr:`__spec__.origin`, and vice versa. + no synchronization between the two objects. For example, it is possible to + update the module's :attr:`~module.__file__` at runtime and this will not be + automatically reflected in the module's + :attr:`__spec__.origin `, and vice versa. .. versionadded:: 3.4 .. attribute:: name - (:attr:`__name__`) - - The module's fully qualified name. - The :term:`finder` should always set this attribute to a non-empty string. + The module's fully qualified name (see :attr:`module.__name__`). + The :term:`finder` should always set this attribute to a non-empty string. .. attribute:: loader - (:attr:`__loader__`) - - The :term:`loader` used to load the module. - The :term:`finder` should always set this attribute. + The :term:`loader` used to load the module (see :attr:`module.__loader__`). + The :term:`finder` should always set this attribute. .. attribute:: origin - (:attr:`__file__`) - - The location the :term:`loader` should use to load the module. - For example, for modules loaded from a .py file this is the filename. - The :term:`finder` should always set this attribute to a meaningful value - for the :term:`loader` to use. In the uncommon case that there is not one - (like for namespace packages), it should be set to ``None``. + The location the :term:`loader` should use to load the module + (see :attr:`module.__file__`). + For example, for modules loaded from a ``.py`` file this is the filename. + The :term:`finder` should always set this attribute to a meaningful value + for the :term:`loader` to use. In the uncommon case that there is not one + (like for namespace packages), it should be set to ``None``. .. attribute:: submodule_search_locations - (:attr:`__path__`) + A (possibly empty) :term:`sequence` of strings enumerating the locations + in which a package's submodules will be found + (see :attr:`module.__path__`). Most of the time there will only be a + single directory in this list. - The list of locations where the package's submodules will be found. - Most of the time this is a single directory. - The :term:`finder` should set this attribute to a list, even an empty one, to indicate - to the import system that the module is a package. It should be set to ``None`` for - non-package modules. It is set automatically later to a special object for - namespace packages. + The :term:`finder` should set this attribute to a sequence, even an empty + one, to indicate + to the import system that the module is a package. It should be set to ``None`` for + non-package modules. It is set automatically later to a special object for + namespace packages. .. attribute:: loader_state - The :term:`finder` may set this attribute to an object containing additional, - module-specific data to use when loading the module. Otherwise it should be - set to ``None``. + The :term:`finder` may set this attribute to an object containing additional, + module-specific data to use when loading the module. Otherwise it should be + set to ``None``. .. attribute:: cached - (:attr:`__cached__`) - - The filename of a compiled version of the module's code. - The :term:`finder` should always set this attribute but it may be ``None`` - for modules that do not need compiled code stored. + The filename of a compiled version of the module's code + (see :attr:`module.__cached__`). + The :term:`finder` should always set this attribute but it may be ``None`` + for modules that do not need compiled code stored. .. attribute:: parent - (:attr:`__package__`) - - (Read-only) The fully qualified name of the package the module is in (or the - empty string for a top-level module). - If the module is a package then this is the same as :attr:`name`. + (Read-only) The fully qualified name of the package the module is in (or the + empty string for a top-level module). + See :attr:`module.__package__`. + If the module is a package then this is the same as :attr:`name`. .. attribute:: has_location - ``True`` if the spec's :attr:`origin` refers to a loadable location, - ``False`` otherwise. This value impacts how :attr:`origin` is interpreted - and how the module's :attr:`__file__` is populated. + ``True`` if the spec's :attr:`origin` refers to a loadable location, + ``False`` otherwise. This value impacts how :attr:`!origin` is interpreted + and how the module's :attr:`~module.__file__` is populated. :mod:`importlib.util` -- Utility code for importers @@ -1360,8 +1334,8 @@ an :term:`importer`. .. versionchanged:: 3.7 Raises :exc:`ModuleNotFoundError` instead of :exc:`AttributeError` if - **package** is in fact not a package (i.e. lacks a :attr:`__path__` - attribute). + **package** is in fact not a package (i.e. lacks a + :attr:`~module.__path__` attribute). .. function:: module_from_spec(spec) @@ -1521,20 +1495,34 @@ Note that if ``name`` is a submodule (contains a dot), Importing a source file directly '''''''''''''''''''''''''''''''' -To import a Python source file directly, use the following recipe:: +This recipe should be used with caution: it is an approximation of an import +statement where the file path is specified directly, rather than +:data:`sys.path` being searched. Alternatives should first be considered first, +such as modifying :data:`sys.path` when a proper module is required, or using +:func:`runpy.run_path` when the global namespace resulting from running a Python +file is appropriate. - import importlib.util - import sys +To import a Python source file directly from a path, use the following recipe:: + + import importlib.util + import sys - # For illustrative purposes. - import tokenize - file_path = tokenize.__file__ - module_name = tokenize.__name__ - spec = importlib.util.spec_from_file_location(module_name, file_path) - module = importlib.util.module_from_spec(spec) - sys.modules[module_name] = module - spec.loader.exec_module(module) + def import_from_path(module_name, file_path): + spec = importlib.util.spec_from_file_location(module_name, file_path) + module = importlib.util.module_from_spec(spec) + sys.modules[module_name] = module + spec.loader.exec_module(module) + return module + + + # For illustrative purposes only (use of `json` is arbitrary). + import json + file_path = json.__file__ + module_name = json.__name__ + + # Similar outcome as `import json`. + json = import_from_path(module_name, file_path) Implementing lazy imports @@ -1560,7 +1548,6 @@ The example below shows how to implement lazy imports:: False - Setting up an importer '''''''''''''''''''''' diff --git a/Doc/library/index.rst b/Doc/library/index.rst index 0b348ae6..951fbcf1 100644 --- a/Doc/library/index.rst +++ b/Doc/library/index.rst @@ -75,4 +75,5 @@ the `Python Package Index `_. unix.rst cmdline.rst superseded.rst + removed.rst security_warnings.rst diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst index 7d1aab8e..93a1ed0f 100644 --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -42,220 +42,233 @@ attributes (see :ref:`import-mod-attrs` for module attributes): .. this function name is too big to fit in the ascii-art table below .. |coroutine-origin-link| replace:: :func:`sys.set_coroutine_origin_tracking_depth` -+-----------+-------------------+---------------------------+ -| Type | Attribute | Description | -+===========+===================+===========================+ -| class | __doc__ | documentation string | -+-----------+-------------------+---------------------------+ -| | __name__ | name with which this | -| | | class was defined | -+-----------+-------------------+---------------------------+ -| | __qualname__ | qualified name | -+-----------+-------------------+---------------------------+ -| | __module__ | name of module in which | -| | | this class was defined | -+-----------+-------------------+---------------------------+ -| | __type_params__ | A tuple containing the | -| | | :ref:`type parameters | -| | | ` of | -| | | a generic class | -+-----------+-------------------+---------------------------+ -| method | __doc__ | documentation string | -+-----------+-------------------+---------------------------+ -| | __name__ | name with which this | -| | | method was defined | -+-----------+-------------------+---------------------------+ -| | __qualname__ | qualified name | -+-----------+-------------------+---------------------------+ -| | __func__ | function object | -| | | containing implementation | -| | | of method | -+-----------+-------------------+---------------------------+ -| | __self__ | instance to which this | -| | | method is bound, or | -| | | ``None`` | -+-----------+-------------------+---------------------------+ -| | __module__ | name of module in which | -| | | this method was defined | -+-----------+-------------------+---------------------------+ -| function | __doc__ | documentation string | -+-----------+-------------------+---------------------------+ -| | __name__ | name with which this | -| | | function was defined | -+-----------+-------------------+---------------------------+ -| | __qualname__ | qualified name | -+-----------+-------------------+---------------------------+ -| | __code__ | code object containing | -| | | compiled function | -| | | :term:`bytecode` | -+-----------+-------------------+---------------------------+ -| | __defaults__ | tuple of any default | -| | | values for positional or | -| | | keyword parameters | -+-----------+-------------------+---------------------------+ -| | __kwdefaults__ | mapping of any default | -| | | values for keyword-only | -| | | parameters | -+-----------+-------------------+---------------------------+ -| | __globals__ | global namespace in which | -| | | this function was defined | -+-----------+-------------------+---------------------------+ -| | __builtins__ | builtins namespace | -+-----------+-------------------+---------------------------+ -| | __annotations__ | mapping of parameters | -| | | names to annotations; | -| | | ``"return"`` key is | -| | | reserved for return | -| | | annotations. | -+-----------+-------------------+---------------------------+ -| | __type_params__ | A tuple containing the | -| | | :ref:`type parameters | -| | | ` of | -| | | a generic function | -+-----------+-------------------+---------------------------+ -| | __module__ | name of module in which | -| | | this function was defined | -+-----------+-------------------+---------------------------+ -| traceback | tb_frame | frame object at this | -| | | level | -+-----------+-------------------+---------------------------+ -| | tb_lasti | index of last attempted | -| | | instruction in bytecode | -+-----------+-------------------+---------------------------+ -| | tb_lineno | current line number in | -| | | Python source code | -+-----------+-------------------+---------------------------+ -| | tb_next | next inner traceback | -| | | object (called by this | -| | | level) | -+-----------+-------------------+---------------------------+ -| frame | f_back | next outer frame object | -| | | (this frame's caller) | -+-----------+-------------------+---------------------------+ -| | f_builtins | builtins namespace seen | -| | | by this frame | -+-----------+-------------------+---------------------------+ -| | f_code | code object being | -| | | executed in this frame | -+-----------+-------------------+---------------------------+ -| | f_globals | global namespace seen by | -| | | this frame | -+-----------+-------------------+---------------------------+ -| | f_lasti | index of last attempted | -| | | instruction in bytecode | -+-----------+-------------------+---------------------------+ -| | f_lineno | current line number in | -| | | Python source code | -+-----------+-------------------+---------------------------+ -| | f_locals | local namespace seen by | -| | | this frame | -+-----------+-------------------+---------------------------+ -| | f_trace | tracing function for this | -| | | frame, or ``None`` | -+-----------+-------------------+---------------------------+ -| code | co_argcount | number of arguments (not | -| | | including keyword only | -| | | arguments, \* or \*\* | -| | | args) | -+-----------+-------------------+---------------------------+ -| | co_code | string of raw compiled | -| | | bytecode | -+-----------+-------------------+---------------------------+ -| | co_cellvars | tuple of names of cell | -| | | variables (referenced by | -| | | containing scopes) | -+-----------+-------------------+---------------------------+ -| | co_consts | tuple of constants used | -| | | in the bytecode | -+-----------+-------------------+---------------------------+ -| | co_filename | name of file in which | -| | | this code object was | -| | | created | -+-----------+-------------------+---------------------------+ -| | co_firstlineno | number of first line in | -| | | Python source code | -+-----------+-------------------+---------------------------+ -| | co_flags | bitmap of ``CO_*`` flags, | -| | | read more :ref:`here | -| | | `| -+-----------+-------------------+---------------------------+ -| | co_lnotab | encoded mapping of line | -| | | numbers to bytecode | -| | | indices | -+-----------+-------------------+---------------------------+ -| | co_freevars | tuple of names of free | -| | | variables (referenced via | -| | | a function's closure) | -+-----------+-------------------+---------------------------+ -| | co_posonlyargcount| number of positional only | -| | | arguments | -+-----------+-------------------+---------------------------+ -| | co_kwonlyargcount | number of keyword only | -| | | arguments (not including | -| | | \*\* arg) | -+-----------+-------------------+---------------------------+ -| | co_name | name with which this code | -| | | object was defined | -+-----------+-------------------+---------------------------+ -| | co_qualname | fully qualified name with | -| | | which this code object | -| | | was defined | -+-----------+-------------------+---------------------------+ -| | co_names | tuple of names other | -| | | than arguments and | -| | | function locals | -+-----------+-------------------+---------------------------+ -| | co_nlocals | number of local variables | -+-----------+-------------------+---------------------------+ -| | co_stacksize | virtual machine stack | -| | | space required | -+-----------+-------------------+---------------------------+ -| | co_varnames | tuple of names of | -| | | arguments and local | -| | | variables | -+-----------+-------------------+---------------------------+ -| generator | __name__ | name | -+-----------+-------------------+---------------------------+ -| | __qualname__ | qualified name | -+-----------+-------------------+---------------------------+ -| | gi_frame | frame | -+-----------+-------------------+---------------------------+ -| | gi_running | is the generator running? | -+-----------+-------------------+---------------------------+ -| | gi_code | code | -+-----------+-------------------+---------------------------+ -| | gi_yieldfrom | object being iterated by | -| | | ``yield from``, or | -| | | ``None`` | -+-----------+-------------------+---------------------------+ -| coroutine | __name__ | name | -+-----------+-------------------+---------------------------+ -| | __qualname__ | qualified name | -+-----------+-------------------+---------------------------+ -| | cr_await | object being awaited on, | -| | | or ``None`` | -+-----------+-------------------+---------------------------+ -| | cr_frame | frame | -+-----------+-------------------+---------------------------+ -| | cr_running | is the coroutine running? | -+-----------+-------------------+---------------------------+ -| | cr_code | code | -+-----------+-------------------+---------------------------+ -| | cr_origin | where coroutine was | -| | | created, or ``None``. See | -| | | |coroutine-origin-link| | -+-----------+-------------------+---------------------------+ -| builtin | __doc__ | documentation string | -+-----------+-------------------+---------------------------+ -| | __name__ | original name of this | -| | | function or method | -+-----------+-------------------+---------------------------+ -| | __qualname__ | qualified name | -+-----------+-------------------+---------------------------+ -| | __self__ | instance to which a | -| | | method is bound, or | -| | | ``None`` | -+-----------+-------------------+---------------------------+ ++-----------------+-------------------+---------------------------+ +| Type | Attribute | Description | ++=================+===================+===========================+ +| class | __doc__ | documentation string | ++-----------------+-------------------+---------------------------+ +| | __name__ | name with which this | +| | | class was defined | ++-----------------+-------------------+---------------------------+ +| | __qualname__ | qualified name | ++-----------------+-------------------+---------------------------+ +| | __module__ | name of module in which | +| | | this class was defined | ++-----------------+-------------------+---------------------------+ +| | __type_params__ | A tuple containing the | +| | | :ref:`type parameters | +| | | ` of | +| | | a generic class | ++-----------------+-------------------+---------------------------+ +| method | __doc__ | documentation string | ++-----------------+-------------------+---------------------------+ +| | __name__ | name with which this | +| | | method was defined | ++-----------------+-------------------+---------------------------+ +| | __qualname__ | qualified name | ++-----------------+-------------------+---------------------------+ +| | __func__ | function object | +| | | containing implementation | +| | | of method | ++-----------------+-------------------+---------------------------+ +| | __self__ | instance to which this | +| | | method is bound, or | +| | | ``None`` | ++-----------------+-------------------+---------------------------+ +| | __module__ | name of module in which | +| | | this method was defined | ++-----------------+-------------------+---------------------------+ +| function | __doc__ | documentation string | ++-----------------+-------------------+---------------------------+ +| | __name__ | name with which this | +| | | function was defined | ++-----------------+-------------------+---------------------------+ +| | __qualname__ | qualified name | ++-----------------+-------------------+---------------------------+ +| | __code__ | code object containing | +| | | compiled function | +| | | :term:`bytecode` | ++-----------------+-------------------+---------------------------+ +| | __defaults__ | tuple of any default | +| | | values for positional or | +| | | keyword parameters | ++-----------------+-------------------+---------------------------+ +| | __kwdefaults__ | mapping of any default | +| | | values for keyword-only | +| | | parameters | ++-----------------+-------------------+---------------------------+ +| | __globals__ | global namespace in which | +| | | this function was defined | ++-----------------+-------------------+---------------------------+ +| | __builtins__ | builtins namespace | ++-----------------+-------------------+---------------------------+ +| | __annotations__ | mapping of parameters | +| | | names to annotations; | +| | | ``"return"`` key is | +| | | reserved for return | +| | | annotations. | ++-----------------+-------------------+---------------------------+ +| | __type_params__ | A tuple containing the | +| | | :ref:`type parameters | +| | | ` of | +| | | a generic function | ++-----------------+-------------------+---------------------------+ +| | __module__ | name of module in which | +| | | this function was defined | ++-----------------+-------------------+---------------------------+ +| traceback | tb_frame | frame object at this | +| | | level | ++-----------------+-------------------+---------------------------+ +| | tb_lasti | index of last attempted | +| | | instruction in bytecode | ++-----------------+-------------------+---------------------------+ +| | tb_lineno | current line number in | +| | | Python source code | ++-----------------+-------------------+---------------------------+ +| | tb_next | next inner traceback | +| | | object (called by this | +| | | level) | ++-----------------+-------------------+---------------------------+ +| frame | f_back | next outer frame object | +| | | (this frame's caller) | ++-----------------+-------------------+---------------------------+ +| | f_builtins | builtins namespace seen | +| | | by this frame | ++-----------------+-------------------+---------------------------+ +| | f_code | code object being | +| | | executed in this frame | ++-----------------+-------------------+---------------------------+ +| | f_globals | global namespace seen by | +| | | this frame | ++-----------------+-------------------+---------------------------+ +| | f_lasti | index of last attempted | +| | | instruction in bytecode | ++-----------------+-------------------+---------------------------+ +| | f_lineno | current line number in | +| | | Python source code | ++-----------------+-------------------+---------------------------+ +| | f_locals | local namespace seen by | +| | | this frame | ++-----------------+-------------------+---------------------------+ +| | f_trace | tracing function for this | +| | | frame, or ``None`` | ++-----------------+-------------------+---------------------------+ +| code | co_argcount | number of arguments (not | +| | | including keyword only | +| | | arguments, \* or \*\* | +| | | args) | ++-----------------+-------------------+---------------------------+ +| | co_code | string of raw compiled | +| | | bytecode | ++-----------------+-------------------+---------------------------+ +| | co_cellvars | tuple of names of cell | +| | | variables (referenced by | +| | | containing scopes) | ++-----------------+-------------------+---------------------------+ +| | co_consts | tuple of constants used | +| | | in the bytecode | ++-----------------+-------------------+---------------------------+ +| | co_filename | name of file in which | +| | | this code object was | +| | | created | ++-----------------+-------------------+---------------------------+ +| | co_firstlineno | number of first line in | +| | | Python source code | ++-----------------+-------------------+---------------------------+ +| | co_flags | bitmap of ``CO_*`` flags, | +| | | read more :ref:`here | +| | | `| ++-----------------+-------------------+---------------------------+ +| | co_lnotab | encoded mapping of line | +| | | numbers to bytecode | +| | | indices | ++-----------------+-------------------+---------------------------+ +| | co_freevars | tuple of names of free | +| | | variables (referenced via | +| | | a function's closure) | ++-----------------+-------------------+---------------------------+ +| | co_posonlyargcount| number of positional only | +| | | arguments | ++-----------------+-------------------+---------------------------+ +| | co_kwonlyargcount | number of keyword only | +| | | arguments (not including | +| | | \*\* arg) | ++-----------------+-------------------+---------------------------+ +| | co_name | name with which this code | +| | | object was defined | ++-----------------+-------------------+---------------------------+ +| | co_qualname | fully qualified name with | +| | | which this code object | +| | | was defined | ++-----------------+-------------------+---------------------------+ +| | co_names | tuple of names other | +| | | than arguments and | +| | | function locals | ++-----------------+-------------------+---------------------------+ +| | co_nlocals | number of local variables | ++-----------------+-------------------+---------------------------+ +| | co_stacksize | virtual machine stack | +| | | space required | ++-----------------+-------------------+---------------------------+ +| | co_varnames | tuple of names of | +| | | arguments and local | +| | | variables | ++-----------------+-------------------+---------------------------+ +| generator | __name__ | name | ++-----------------+-------------------+---------------------------+ +| | __qualname__ | qualified name | ++-----------------+-------------------+---------------------------+ +| | gi_frame | frame | ++-----------------+-------------------+---------------------------+ +| | gi_running | is the generator running? | ++-----------------+-------------------+---------------------------+ +| | gi_code | code | ++-----------------+-------------------+---------------------------+ +| | gi_yieldfrom | object being iterated by | +| | | ``yield from``, or | +| | | ``None`` | ++-----------------+-------------------+---------------------------+ +| async generator | __name__ | name | ++-----------------+-------------------+---------------------------+ +| | __qualname__ | qualified name | ++-----------------+-------------------+---------------------------+ +| | ag_await | object being awaited on, | +| | | or ``None`` | ++-----------------+-------------------+---------------------------+ +| | ag_frame | frame | ++-----------------+-------------------+---------------------------+ +| | ag_running | is the generator running? | ++-----------------+-------------------+---------------------------+ +| | ag_code | code | ++-----------------+-------------------+---------------------------+ +| coroutine | __name__ | name | ++-----------------+-------------------+---------------------------+ +| | __qualname__ | qualified name | ++-----------------+-------------------+---------------------------+ +| | cr_await | object being awaited on, | +| | | or ``None`` | ++-----------------+-------------------+---------------------------+ +| | cr_frame | frame | ++-----------------+-------------------+---------------------------+ +| | cr_running | is the coroutine running? | ++-----------------+-------------------+---------------------------+ +| | cr_code | code | ++-----------------+-------------------+---------------------------+ +| | cr_origin | where coroutine was | +| | | created, or ``None``. See | +| | | |coroutine-origin-link| | ++-----------------+-------------------+---------------------------+ +| builtin | __doc__ | documentation string | ++-----------------+-------------------+---------------------------+ +| | __name__ | original name of this | +| | | function or method | ++-----------------+-------------------+---------------------------+ +| | __qualname__ | qualified name | ++-----------------+-------------------+---------------------------+ +| | __self__ | instance to which a | +| | | method is bound, or | +| | | ``None`` | ++-----------------+-------------------+---------------------------+ .. versionchanged:: 3.5 @@ -437,7 +450,7 @@ attributes (see :ref:`import-mod-attrs` for module attributes): .. versionchanged:: 3.8 Functions wrapped in :func:`functools.partial` now return ``True`` if the - wrapped function is a :term:`asynchronous generator` function. + wrapped function is an :term:`asynchronous generator` function. .. function:: isasyncgen(object) @@ -497,7 +510,7 @@ attributes (see :ref:`import-mod-attrs` for module attributes): has a :meth:`~object.__get__` method but not a :meth:`~object.__set__` method, but beyond that the set of attributes varies. A :attr:`~definition.__name__` attribute is usually - sensible, and :attr:`!__doc__` often is. + sensible, and :attr:`~definition.__doc__` often is. Methods implemented via descriptors that also pass one of the other tests return ``False`` from the :func:`ismethoddescriptor` test, simply because the @@ -896,7 +909,7 @@ function. .. attribute:: Parameter.kind.description - Describes a enum value of :attr:`Parameter.kind`. + Describes an enum value of :attr:`Parameter.kind`. .. versionadded:: 3.8 @@ -973,7 +986,8 @@ function. .. attribute:: BoundArguments.kwargs A dict of keyword arguments values. Dynamically computed from the - :attr:`arguments` attribute. + :attr:`arguments` attribute. Arguments that can be passed positionally + are included in :attr:`args` instead. .. attribute:: BoundArguments.signature @@ -1191,7 +1205,7 @@ Classes and functions This function handles several details for you: * If ``eval_str`` is true, values of type ``str`` will - be un-stringized using :func:`eval()`. This is intended + be un-stringized using :func:`eval`. This is intended for use with stringized annotations (``from __future__ import annotations``). * If ``obj`` doesn't have an annotations dict, returns an @@ -1205,16 +1219,16 @@ Classes and functions * Always, always, always returns a freshly created dict. ``eval_str`` controls whether or not values of type ``str`` are replaced - with the result of calling :func:`eval()` on those values: + with the result of calling :func:`eval` on those values: - * If eval_str is true, :func:`eval()` is called on values of type ``str``. - (Note that ``get_annotations`` doesn't catch exceptions; if :func:`eval()` + * If eval_str is true, :func:`eval` is called on values of type ``str``. + (Note that ``get_annotations`` doesn't catch exceptions; if :func:`eval` raises an exception, it will unwind the stack past the ``get_annotations`` call.) * If eval_str is false (the default), values of type ``str`` are unchanged. - ``globals`` and ``locals`` are passed in to :func:`eval()`; see the documentation - for :func:`eval()` for more information. If ``globals`` or ``locals`` + ``globals`` and ``locals`` are passed in to :func:`eval`; see the documentation + for :func:`eval` for more information. If ``globals`` or ``locals`` is ``None``, this function may replace that value with a context-specific default, contingent on ``type(obj)``: diff --git a/Doc/library/io.rst b/Doc/library/io.rst index 748c4996..f793d7a7 100644 --- a/Doc/library/io.rst +++ b/Doc/library/io.rst @@ -55,7 +55,7 @@ the backing store is natively made of bytes (such as in the case of a file), encoding and decoding of data is made transparently as well as optional translation of platform-specific newline characters. -The easiest way to create a text stream is with :meth:`open()`, optionally +The easiest way to create a text stream is with :meth:`open`, optionally specifying an encoding:: f = open("myfile.txt", "r", encoding="utf-8") @@ -77,7 +77,7 @@ objects. No encoding, decoding, or newline translation is performed. This category of streams can be used for all kinds of non-text data, and also when manual control over the handling of text data is desired. -The easiest way to create a binary stream is with :meth:`open()` with ``'b'`` in +The easiest way to create a binary stream is with :meth:`open` with ``'b'`` in the mode string:: f = open("myfile.jpg", "rb") @@ -950,7 +950,7 @@ Text I/O :class:`TextIOBase`. *encoding* gives the name of the encoding that the stream will be decoded or - encoded with. It defaults to :func:`locale.getencoding()`. + encoded with. It defaults to :func:`locale.getencoding`. ``encoding="locale"`` can be used to specify the current locale's encoding explicitly. See :ref:`io-text-encoding` for more information. @@ -1182,7 +1182,7 @@ re-enter a buffered object which it is already accessing, a :exc:`RuntimeError` is raised. Note this doesn't prohibit a different thread from entering the buffered object. -The above implicitly extends to text files, since the :func:`open()` function +The above implicitly extends to text files, since the :func:`open` function will wrap a buffered object inside a :class:`TextIOWrapper`. This includes -standard streams and therefore affects the built-in :func:`print()` function as +standard streams and therefore affects the built-in :func:`print` function as well. diff --git a/Doc/library/ipaddress.rst b/Doc/library/ipaddress.rst index d359451b..d780969c 100644 --- a/Doc/library/ipaddress.rst +++ b/Doc/library/ipaddress.rst @@ -983,7 +983,7 @@ The module also provides the following module level functions: .. function:: collapse_addresses(addresses) Return an iterator of the collapsed :class:`IPv4Network` or - :class:`IPv6Network` objects. *addresses* is an iterator of + :class:`IPv6Network` objects. *addresses* is an :term:`iterable` of :class:`IPv4Network` or :class:`IPv6Network` objects. A :exc:`TypeError` is raised if *addresses* contains mixed version objects. @@ -1003,7 +1003,7 @@ The module also provides the following module level functions: doesn't make sense. There are some times however, where you may wish to have :mod:`ipaddress` sort these anyway. If you need to do this, you can use - this function as the *key* argument to :func:`sorted()`. + this function as the *key* argument to :func:`sorted`. *obj* is either a network or address object. diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index 21bb3f1f..047d805e 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -329,7 +329,7 @@ loops that truncate the stream. yield n n += step - When counting with floating point numbers, better accuracy can sometimes be + When counting with floating-point numbers, better accuracy can sometimes be achieved by substituting multiplicative code such as: ``(start + step * i for i in count())``. @@ -676,24 +676,37 @@ loops that truncate the stream. Roughly equivalent to:: def tee(iterable, n=2): - iterator = iter(iterable) - shared_link = [None, None] - return tuple(_tee(iterator, shared_link) for _ in range(n)) - - def _tee(iterator, link): - try: - while True: - if link[1] is None: - link[0] = next(iterator) - link[1] = [None, None] - value, link = link - yield value - except StopIteration: - return - - Once a :func:`tee` has been created, the original *iterable* should not be - used anywhere else; otherwise, the *iterable* could get advanced without - the tee objects being informed. + if n < 0: + raise ValueError + if n == 0: + return () + iterator = _tee(iterable) + result = [iterator] + for _ in range(n - 1): + result.append(_tee(iterator)) + return tuple(result) + + class _tee: + + def __init__(self, iterable): + it = iter(iterable) + if isinstance(it, _tee): + self.iterator = it.iterator + self.link = it.link + else: + self.iterator = it + self.link = [None, None] + + def __iter__(self): + return self + + def __next__(self): + link = self.link + if link[1] is None: + link[0] = next(self.iterator) + link[1] = [None, None] + value, self.link = link + return value ``tee`` iterators are not threadsafe. A :exc:`RuntimeError` may be raised when simultaneously using iterators returned by the same :func:`tee` diff --git a/Doc/library/json.rst b/Doc/library/json.rst index a1aba65c..88882aee 100644 --- a/Doc/library/json.rst +++ b/Doc/library/json.rst @@ -13,7 +13,7 @@ `JSON (JavaScript Object Notation) `_, specified by :rfc:`7159` (which obsoletes :rfc:`4627`) and by -`ECMA-404 `_, +`ECMA-404 `_, is a lightweight data interchange format inspired by `JavaScript `_ object literal syntax (although it is not a strict subset of JavaScript [#rfc-errata]_ ). @@ -230,28 +230,28 @@ Basic Usage *object_hook* is an optional function that will be called with the result of any object literal decoded (a :class:`dict`). The return value of - *object_hook* will be used instead of the :class:`dict`. This feature can be used - to implement custom decoders (e.g. `JSON-RPC `_ - class hinting). + *object_hook* will be used instead of the :class:`dict`. This feature can + be used to implement custom decoders (e.g. `JSON-RPC + `_ class hinting). *object_pairs_hook* is an optional function that will be called with the result of any object literal decoded with an ordered list of pairs. The return value of *object_pairs_hook* will be used instead of the - :class:`dict`. This feature can be used to implement custom decoders. - If *object_hook* is also defined, the *object_pairs_hook* takes priority. + :class:`dict`. This feature can be used to implement custom decoders. If + *object_hook* is also defined, the *object_pairs_hook* takes priority. .. versionchanged:: 3.1 Added support for *object_pairs_hook*. - *parse_float*, if specified, will be called with the string of every JSON - float to be decoded. By default, this is equivalent to ``float(num_str)``. - This can be used to use another datatype or parser for JSON floats - (e.g. :class:`decimal.Decimal`). + *parse_float* is an optional function that will be called with the string of + every JSON float to be decoded. By default, this is equivalent to + ``float(num_str)``. This can be used to use another datatype or parser for + JSON floats (e.g. :class:`decimal.Decimal`). - *parse_int*, if specified, will be called with the string of every JSON int - to be decoded. By default, this is equivalent to ``int(num_str)``. This can - be used to use another datatype or parser for JSON integers - (e.g. :class:`float`). + *parse_int* is an optional function that will be called with the string of + every JSON int to be decoded. By default, this is equivalent to + ``int(num_str)``. This can be used to use another datatype or parser for + JSON integers (e.g. :class:`float`). .. versionchanged:: 3.11 The default *parse_int* of :func:`int` now limits the maximum length of @@ -259,10 +259,9 @@ Basic Usage conversion length limitation ` to help avoid denial of service attacks. - *parse_constant*, if specified, will be called with one of the following - strings: ``'-Infinity'``, ``'Infinity'``, ``'NaN'``. - This can be used to raise an exception if invalid JSON numbers - are encountered. + *parse_constant* is an optional function that will be called with one of the + following strings: ``'-Infinity'``, ``'Infinity'``, ``'NaN'``. This can be + used to raise an exception if invalid JSON numbers are encountered. .. versionchanged:: 3.1 *parse_constant* doesn't get called on 'null', 'true', 'false' anymore. @@ -334,34 +333,33 @@ Encoders and Decoders It also understands ``NaN``, ``Infinity``, and ``-Infinity`` as their corresponding ``float`` values, which is outside the JSON spec. - *object_hook*, if specified, will be called with the result of every JSON - object decoded and its return value will be used in place of the given - :class:`dict`. This can be used to provide custom deserializations (e.g. to - support `JSON-RPC `_ class hinting). + *object_hook* is an optional function that will be called with the result of + every JSON object decoded and its return value will be used in place of the + given :class:`dict`. This can be used to provide custom deserializations + (e.g. to support `JSON-RPC `_ class hinting). - *object_pairs_hook*, if specified will be called with the result of every - JSON object decoded with an ordered list of pairs. The return value of - *object_pairs_hook* will be used instead of the :class:`dict`. This - feature can be used to implement custom decoders. If *object_hook* is also - defined, the *object_pairs_hook* takes priority. + *object_pairs_hook* is an optional function that will be called with the + result of every JSON object decoded with an ordered list of pairs. The + return value of *object_pairs_hook* will be used instead of the + :class:`dict`. This feature can be used to implement custom decoders. If + *object_hook* is also defined, the *object_pairs_hook* takes priority. .. versionchanged:: 3.1 Added support for *object_pairs_hook*. - *parse_float*, if specified, will be called with the string of every JSON - float to be decoded. By default, this is equivalent to ``float(num_str)``. - This can be used to use another datatype or parser for JSON floats - (e.g. :class:`decimal.Decimal`). + *parse_float* is an optional function that will be called with the string of + every JSON float to be decoded. By default, this is equivalent to + ``float(num_str)``. This can be used to use another datatype or parser for + JSON floats (e.g. :class:`decimal.Decimal`). - *parse_int*, if specified, will be called with the string of every JSON int - to be decoded. By default, this is equivalent to ``int(num_str)``. This can - be used to use another datatype or parser for JSON integers - (e.g. :class:`float`). + *parse_int* is an optional function that will be called with the string of + every JSON int to be decoded. By default, this is equivalent to + ``int(num_str)``. This can be used to use another datatype or parser for + JSON integers (e.g. :class:`float`). - *parse_constant*, if specified, will be called with one of the following - strings: ``'-Infinity'``, ``'Infinity'``, ``'NaN'``. - This can be used to raise an exception if invalid JSON numbers - are encountered. + *parse_constant* is an optional function that will be called with one of the + following strings: ``'-Infinity'``, ``'Infinity'``, ``'NaN'``. This can be + used to raise an exception if invalid JSON numbers are encountered. If *strict* is false (``True`` is the default), then control characters will be allowed inside strings. Control characters in this context are @@ -548,7 +546,7 @@ Standard Compliance and Interoperability ---------------------------------------- The JSON format is specified by :rfc:`7159` and by -`ECMA-404 `_. +`ECMA-404 `_. This section details this module's level of compliance with the RFC. For simplicity, :class:`JSONEncoder` and :class:`JSONDecoder` subclasses, and parameters other than those explicitly mentioned, are not considered. diff --git a/Doc/library/locale.rst b/Doc/library/locale.rst index 10c37639..fee5aba7 100644 --- a/Doc/library/locale.rst +++ b/Doc/library/locale.rst @@ -281,7 +281,8 @@ The :mod:`locale` module defines the following exception and functions: .. data:: ERA - Get a string that represents the era used in the current locale. + Get a string which describes how years are counted and displayed for + each era in a locale. Most locales do not define this value. An example of a locale which does define this value is the Japanese one. In Japan, the traditional @@ -290,9 +291,10 @@ The :mod:`locale` module defines the following exception and functions: Normally it should not be necessary to use this value directly. Specifying the ``E`` modifier in their format strings causes the :func:`time.strftime` - function to use this information. The format of the returned string is not - specified, and therefore you should not assume knowledge of it on different - systems. + function to use this information. + The format of the returned string is specified in *The Open Group Base + Specifications Issue 8*, paragraph `7.3.5.2 LC_TIME C-Language Access + `_. .. data:: ERA_D_T_FMT @@ -311,8 +313,9 @@ The :mod:`locale` module defines the following exception and functions: .. data:: ALT_DIGITS - Get a representation of up to 100 values used to represent the values - 0 to 99. + Get a string consisting of up to 100 semicolon-separated symbols used + to represent the values 0 to 99 in a locale-specific way. + In most locales this is an empty string. .. function:: getdefaultlocale([envvars]) @@ -434,7 +437,7 @@ The :mod:`locale` module defines the following exception and functions: .. function:: format_string(format, val, grouping=False, monetary=False) Formats a number *val* according to the current :const:`LC_NUMERIC` setting. - The format follows the conventions of the ``%`` operator. For floating point + The format follows the conventions of the ``%`` operator. For floating-point values, the decimal point is modified if appropriate. If *grouping* is ``True``, also takes the grouping into account. @@ -465,7 +468,7 @@ The :mod:`locale` module defines the following exception and functions: .. function:: str(float) - Formats a floating point number using the same format as the built-in function + Formats a floating-point number using the same format as the built-in function ``str(float)``, but takes the decimal point into account. diff --git a/Doc/library/logging.config.rst b/Doc/library/logging.config.rst index 23aac191..bc85f430 100644 --- a/Doc/library/logging.config.rst +++ b/Doc/library/logging.config.rst @@ -69,7 +69,7 @@ in :mod:`logging` itself) and defining handlers which are declared either in dictConfigClass(config).configure() For example, a subclass of :class:`DictConfigurator` could call - ``DictConfigurator.__init__()`` in its own :meth:`__init__()`, then + ``DictConfigurator.__init__()`` in its own :meth:`__init__`, then set up custom prefixes which would be usable in the subsequent :meth:`configure` call. :attr:`dictConfigClass` would be bound to this new subclass, and then :func:`dictConfig` could be called exactly as @@ -752,13 +752,17 @@ The ``queue`` and ``listener`` keys are optional. If the ``queue`` key is present, the corresponding value can be one of the following: -* An actual instance of :class:`queue.Queue` or a subclass thereof. This is of course - only possible if you are constructing or modifying the configuration dictionary in - code. +* An object implementing the :meth:`Queue.put_nowait ` + and :meth:`Queue.get ` public API. For instance, this may be + an actual instance of :class:`queue.Queue` or a subclass thereof, or a proxy + obtained by :meth:`multiprocessing.managers.SyncManager.Queue`. + + This is of course only possible if you are constructing or modifying + the configuration dictionary in code. * A string that resolves to a callable which, when called with no arguments, returns - the :class:`queue.Queue` instance to use. That callable could be a - :class:`queue.Queue` subclass or a function which returns a suitable queue instance, + the queue instance to use. That callable could be a :class:`queue.Queue` subclass + or a function which returns a suitable queue instance, such as ``my.module.queue_factory()``. * A dict with a ``'()'`` key which is constructed in the usual way as discussed in diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst index c6ab3744..5d0bfcb1 100644 --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -304,7 +304,8 @@ in a module, ``__name__`` is the module's name in the Python package namespace. parameter mirrors the equivalent one in the :mod:`warnings` module. The fourth keyword argument is *extra* which can be used to pass a - dictionary which is used to populate the __dict__ of the :class:`LogRecord` + dictionary which is used to populate the :attr:`~object.__dict__` of the + :class:`LogRecord` created for the logging event with user-defined attributes. These custom attributes can then be used as you like. For example, they could be incorporated into logged messages. For example:: @@ -1094,11 +1095,11 @@ information into logging calls. For a usage example, see the section on .. attribute:: manager - Delegates to the underlying :attr:`!manager`` on *logger*. + Delegates to the underlying :attr:`!manager` on *logger*. .. attribute:: _log - Delegates to the underlying :meth:`!_log`` method on *logger*. + Delegates to the underlying :meth:`!_log` method on *logger*. In addition to the above, :class:`LoggerAdapter` supports the following methods of :class:`Logger`: :meth:`~Logger.debug`, :meth:`~Logger.info`, diff --git a/Doc/library/mailbox.rst b/Doc/library/mailbox.rst index 1e4e7283..6eb8dec4 100644 --- a/Doc/library/mailbox.rst +++ b/Doc/library/mailbox.rst @@ -1278,7 +1278,7 @@ When an :class:`!MHMessage` instance is created based upon a .. method:: get_visible() - Return an :class:`Message` instance whose headers are the message's + Return a :class:`Message` instance whose headers are the message's visible headers and whose body is empty. diff --git a/Doc/library/marshal.rst b/Doc/library/marshal.rst index ce549b73..a85d9206 100644 --- a/Doc/library/marshal.rst +++ b/Doc/library/marshal.rst @@ -38,8 +38,8 @@ supports a substantially wider range of objects than marshal. Not all Python object types are supported; in general, only objects whose value is independent from a particular invocation of Python can be written and read by -this module. The following types are supported: booleans, integers, floating -point numbers, complex numbers, strings, bytes, bytearrays, tuples, lists, sets, +this module. The following types are supported: booleans, integers, floating-point +numbers, complex numbers, strings, bytes, bytearrays, tuples, lists, sets, frozensets, dictionaries, and code objects, where it should be understood that tuples, lists, sets, frozensets and dictionaries are only supported as long as the values contained therein are themselves supported. The @@ -121,7 +121,7 @@ In addition, the following constants are defined: Indicates the format that the module uses. Version 0 is the historical format, version 1 shares interned strings and version 2 uses a binary format - for floating point numbers. + for floating-point numbers. Version 3 adds support for object instancing and recursion. The current version is 4. diff --git a/Doc/library/math.rst b/Doc/library/math.rst index b6a7d98a..fb852712 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -107,7 +107,7 @@ Number-theoretic and representation functions .. function:: fsum(iterable) - Return an accurate floating point sum of values in the iterable. Avoids + Return an accurate floating-point sum of values in the iterable. Avoids loss of precision by tracking multiple intermediate partial sums. The algorithm's accuracy depends on IEEE-754 arithmetic guarantees and the @@ -117,7 +117,7 @@ Number-theoretic and representation functions least significant bit. For further discussion and two alternative approaches, see the `ASPN cookbook - recipes for accurate floating point summation + recipes for accurate floating-point summation `_\. @@ -142,19 +142,21 @@ Number-theoretic and representation functions ``False`` otherwise. Whether or not two values are considered close is determined according to - given absolute and relative tolerances. + given absolute and relative tolerances. If no errors occur, the result will + be: ``abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)``. *rel_tol* is the relative tolerance -- it is the maximum allowed difference between *a* and *b*, relative to the larger absolute value of *a* or *b*. For example, to set a tolerance of 5%, pass ``rel_tol=0.05``. The default tolerance is ``1e-09``, which assures that the two values are the same - within about 9 decimal digits. *rel_tol* must be greater than zero. + within about 9 decimal digits. *rel_tol* must be nonnegative and less + than ``1.0``. - *abs_tol* is the minimum absolute tolerance -- useful for comparisons near - zero. *abs_tol* must be at least zero. - - If no errors occur, the result will be: - ``abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)``. + *abs_tol* is the absolute tolerance; it defaults to ``0.0`` and it must be + nonnegative. When comparing ``x`` to ``0.0``, ``isclose(x, 0)`` is computed + as ``abs(x) <= rel_tol * abs(x)``, which is ``False`` for any ``x`` and + rel_tol less than ``1.0``. So add an appropriate positive abs_tol argument + to the call. The IEEE 754 special values of ``NaN``, ``inf``, and ``-inf`` will be handled according to IEEE rules. Specifically, ``NaN`` is not considered @@ -288,7 +290,7 @@ Number-theoretic and representation functions If the result of the remainder operation is zero, that zero will have the same sign as *x*. - On platforms using IEEE 754 binary floating-point, the result of this + On platforms using IEEE 754 binary floating point, the result of this operation is always exactly representable: no rounding error is introduced. .. versionadded:: 3.7 diff --git a/Doc/library/mimetypes.rst b/Doc/library/mimetypes.rst index 930b4793..1522285b 100644 --- a/Doc/library/mimetypes.rst +++ b/Doc/library/mimetypes.rst @@ -272,3 +272,13 @@ than one MIME-type database; it provides an interface similar to the one of the types, else to the list of non-standard types. .. versionadded:: 3.2 + + + .. method:: MimeTypes.add_type(type, ext, strict=True) + + Add a mapping from the MIME type *type* to the extension *ext*. When the + extension is already known, the new type will replace the old one. When the type + is already known the extension will be added to the list of known extensions. + + When *strict* is ``True`` (the default), the mapping will be added to the + official MIME types, otherwise to the non-standard ones. diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index d6474ef9..3fec8608 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -254,6 +254,7 @@ processes: p.join() Queues are thread and process safe. + Any object put into a :mod:`~multiprocessing` queue will be serialized. **Pipes** @@ -281,6 +282,8 @@ processes: of corruption from processes using different ends of the pipe at the same time. + The :meth:`~Connection.send` method serializes the object and + :meth:`~Connection.recv` re-creates the object. Synchronization between processes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -502,7 +505,7 @@ The :mod:`multiprocessing` package mostly replicates the API of the The constructor should always be called with keyword arguments. *group* should always be ``None``; it exists solely for compatibility with :class:`threading.Thread`. *target* is the callable object to be invoked by - the :meth:`run()` method. It defaults to ``None``, meaning nothing is + the :meth:`run` method. It defaults to ``None``, meaning nothing is called. *name* is the process name (see :attr:`name` for more details). *args* is the argument tuple for the target invocation. *kwargs* is a dictionary of keyword arguments for the target invocation. If provided, @@ -639,7 +642,7 @@ The :mod:`multiprocessing` package mostly replicates the API of the You can use this value if you want to wait on several events at once using :func:`multiprocessing.connection.wait`. Otherwise - calling :meth:`join()` is simpler. + calling :meth:`join` is simpler. On Windows, this is an OS handle usable with the ``WaitForSingleObject`` and ``WaitForMultipleObjects`` family of API calls. On POSIX, this is @@ -666,7 +669,7 @@ The :mod:`multiprocessing` package mostly replicates the API of the .. method:: kill() - Same as :meth:`terminate()` but using the ``SIGKILL`` signal on POSIX. + Same as :meth:`terminate` but using the ``SIGKILL`` signal on POSIX. .. versionadded:: 3.7 @@ -709,7 +712,7 @@ The :mod:`multiprocessing` package mostly replicates the API of the .. exception:: BufferTooShort - Exception raised by :meth:`Connection.recv_bytes_into()` when the supplied + Exception raised by :meth:`Connection.recv_bytes_into` when the supplied buffer object is too small for the message read. If ``e`` is an instance of :exc:`BufferTooShort` then ``e.args[0]`` will give @@ -745,6 +748,11 @@ If you use :class:`JoinableQueue` then you **must** call semaphore used to count the number of unfinished tasks may eventually overflow, raising an exception. +One difference from other Python queue implementations, is that :mod:`multiprocessing` +queues serializes all objects that are put into them using :mod:`pickle`. +The object return by the get method is a re-created object that does not share memory +with the original object. + Note that one can also create a shared queue by using a manager object -- see :ref:`multiprocessing-managers`. @@ -811,6 +819,8 @@ For an example of the usage of queues for interprocess communication see used for receiving messages and ``conn2`` can only be used for sending messages. + The :meth:`~multiprocessing.Connection.send` method serializes the object using + :mod:`pickle` and the :meth:`~multiprocessing.Connection.recv` re-creates the object. .. class:: Queue([maxsize]) @@ -837,6 +847,8 @@ For an example of the usage of queues for interprocess communication see Return ``True`` if the queue is empty, ``False`` otherwise. Because of multithreading/multiprocessing semantics, this is not reliable. + May raise an :exc:`OSError` on closed queues. (not guaranteed) + .. method:: full() Return ``True`` if the queue is full, ``False`` otherwise. Because of @@ -940,6 +952,8 @@ For an example of the usage of queues for interprocess communication see Return ``True`` if the queue is empty, ``False`` otherwise. + Always raises an :exc:`OSError` if the SimpleQueue is closed. + .. method:: get() Remove and return an item from the queue. @@ -1452,17 +1466,6 @@ object -- see :ref:`multiprocessing-managers`. On macOS, ``sem_timedwait`` is unsupported, so calling ``acquire()`` with a timeout will emulate that function's behavior using a sleeping loop. -.. note:: - - If the SIGINT signal generated by :kbd:`Ctrl-C` arrives while the main thread is - blocked by a call to :meth:`BoundedSemaphore.acquire`, :meth:`Lock.acquire`, - :meth:`RLock.acquire`, :meth:`Semaphore.acquire`, :meth:`Condition.acquire` - or :meth:`Condition.wait` then the call will be immediately interrupted and - :exc:`KeyboardInterrupt` will be raised. - - This differs from the behaviour of :mod:`threading` where SIGINT will be - ignored while the equivalent blocking calls are in progress. - .. note:: Some of this package's functionality requires a functioning shared semaphore @@ -2948,7 +2951,7 @@ Beware of replacing :data:`sys.stdin` with a "file like object" resulting in a bad file descriptor error, but introduces a potential danger to applications which replace :func:`sys.stdin` with a "file-like object" with output buffering. This danger is that if multiple processes call - :meth:`~io.IOBase.close()` on this file-like object, it could result in the same + :meth:`~io.IOBase.close` on this file-like object, it could result in the same data being flushed to the object multiple times, resulting in corruption. If you write a file-like object and implement your own caching, you can diff --git a/Doc/library/nntplib.rst b/Doc/library/nntplib.rst index 143e4e0c..fde0bfc9 100644 --- a/Doc/library/nntplib.rst +++ b/Doc/library/nntplib.rst @@ -484,14 +484,14 @@ tuples or objects that the method normally returns will be empty. .. method:: NNTP.head(message_spec=None, *, file=None) - Same as :meth:`article()`, but sends a ``HEAD`` command. The *lines* + Same as :meth:`article`, but sends a ``HEAD`` command. The *lines* returned (or written to *file*) will only contain the message headers, not the body. .. method:: NNTP.body(message_spec=None, *, file=None) - Same as :meth:`article()`, but sends a ``BODY`` command. The *lines* + Same as :meth:`article`, but sends a ``BODY`` command. The *lines* returned (or written to *file*) will only contain the message body, not the headers. @@ -513,7 +513,7 @@ tuples or objects that the method normally returns will be empty. Send an ``IHAVE`` command. *message_id* is the id of the message to send to the server (enclosed in ``'<'`` and ``'>'``). The *data* parameter - and the return value are the same as for :meth:`post()`. + and the return value are the same as for :meth:`post`. .. method:: NNTP.date() @@ -560,7 +560,7 @@ them have been superseded by newer commands in :rfc:`3977`. Send an ``XOVER`` command. *start* and *end* are article numbers delimiting the range of articles to select. The return value is the - same of for :meth:`over()`. It is recommended to use :meth:`over()` + same of for :meth:`over`. It is recommended to use :meth:`over` instead, since it will automatically use the newer ``OVER`` command if available. diff --git a/Doc/library/optparse.rst b/Doc/library/optparse.rst index fc652d23..15b5d5c3 100644 --- a/Doc/library/optparse.rst +++ b/Doc/library/optparse.rst @@ -1351,7 +1351,7 @@ The whole point of creating and populating an OptionParser is to call its the list of arguments to process (default: ``sys.argv[1:]``) ``values`` - an :class:`Values` object to store option arguments in (default: a + a :class:`Values` object to store option arguments in (default: a new instance of :class:`Values`) -- if you give an existing object, the option defaults will not be initialized on it diff --git a/Doc/library/os.path.rst b/Doc/library/os.path.rst index c5004c3f..51e89087 100644 --- a/Doc/library/os.path.rst +++ b/Doc/library/os.path.rst @@ -81,7 +81,7 @@ the :mod:`glob` module.) Return the longest common sub-path of each pathname in the sequence *paths*. Raise :exc:`ValueError` if *paths* contain both absolute - and relative pathnames, the *paths* are on the different drives or + and relative pathnames, if *paths* are on different drives, or if *paths* is empty. Unlike :func:`commonprefix`, this returns a valid path. @@ -198,14 +198,14 @@ the :mod:`glob` module.) .. function:: getatime(path) - Return the time of last access of *path*. The return value is a floating point number giving + Return the time of last access of *path*. The return value is a floating-point number giving the number of seconds since the epoch (see the :mod:`time` module). Raise :exc:`OSError` if the file does not exist or is inaccessible. .. function:: getmtime(path) - Return the time of last modification of *path*. The return value is a floating point number + Return the time of last modification of *path*. The return value is a floating-point number giving the number of seconds since the epoch (see the :mod:`time` module). Raise :exc:`OSError` if the file does not exist or is inaccessible. @@ -359,7 +359,7 @@ the :mod:`glob` module.) that contains symbolic links. On Windows, it converts forward slashes to backward slashes. To normalize case, use :func:`normcase`. - .. note:: + .. note:: On POSIX systems, in accordance with `IEEE Std 1003.1 2013 Edition; 4.13 Pathname Resolution `_, if a pathname begins with exactly two slashes, the first component diff --git a/Doc/library/os.rst b/Doc/library/os.rst index a793d244..18e58249 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -113,8 +113,8 @@ of the UTF-8 encoding: * Use UTF-8 as the :term:`filesystem encoding `. -* :func:`sys.getfilesystemencoding()` returns ``'utf-8'``. -* :func:`locale.getpreferredencoding()` returns ``'utf-8'`` (the *do_setlocale* +* :func:`sys.getfilesystemencoding` returns ``'utf-8'``. +* :func:`locale.getpreferredencoding` returns ``'utf-8'`` (the *do_setlocale* argument has no effect). * :data:`sys.stdin`, :data:`sys.stdout`, and :data:`sys.stderr` all use UTF-8 as their text encoding, with the ``surrogateescape`` @@ -133,8 +133,8 @@ level APIs also exhibit different default behaviours: * Command line arguments, environment variables and filenames are decoded to text using the UTF-8 encoding. -* :func:`os.fsdecode()` and :func:`os.fsencode()` use the UTF-8 encoding. -* :func:`open()`, :func:`io.open()`, and :func:`codecs.open()` use the UTF-8 +* :func:`os.fsdecode` and :func:`os.fsencode` use the UTF-8 encoding. +* :func:`open`, :func:`io.open`, and :func:`codecs.open` use the UTF-8 encoding by default. However, they still use the strict error handler by default so that attempting to open a binary file in text mode is likely to raise an exception rather than producing nonsense data. @@ -1497,7 +1497,7 @@ or `the MSDN `_ on Windo .. function:: pwritev(fd, buffers, offset, flags=0, /) - Write the *buffers* contents to file descriptor *fd* at a offset *offset*, + Write the *buffers* contents to file descriptor *fd* at an offset *offset*, leaving the file offset unchanged. *buffers* must be a sequence of :term:`bytes-like objects `. Buffers are processed in array order. Entire contents of the first buffer is written before @@ -2756,7 +2756,7 @@ features: .. versionchanged:: 3.6 Added support for the :term:`context manager` protocol and the - :func:`~scandir.close()` method. If a :func:`scandir` iterator is neither + :func:`~scandir.close` method. If a :func:`scandir` iterator is neither exhausted nor explicitly closed a :exc:`ResourceWarning` will be emitted in its destructor. @@ -3571,6 +3571,7 @@ features: os.remove(os.path.join(root, name)) for name in dirs: os.rmdir(os.path.join(root, name)) + os.rmdir(top) .. audit-event:: os.walk top,topdown,onerror,followlinks os.walk @@ -3701,7 +3702,7 @@ features: new file descriptor is :ref:`non-inheritable `. *initval* is the initial value of the event counter. The initial value - must be an 32 bit unsigned integer. Please note that the initial value is + must be a 32 bit unsigned integer. Please note that the initial value is limited to a 32 bit unsigned int although the event counter is an unsigned 64 bit integer with a maximum value of 2\ :sup:`64`\ -\ 2. @@ -3780,7 +3781,7 @@ features: .. data:: EFD_SEMAPHORE - Provide semaphore-like semantics for reads from a :func:`eventfd` file + Provide semaphore-like semantics for reads from an :func:`eventfd` file descriptor. On read the internal counter is decremented by one. .. availability:: Linux >= 2.6.30 @@ -4244,8 +4245,7 @@ written in Python, such as a mail server's external command delivery program. only be sent to console processes which share a common console window, e.g., some subprocesses. Any other value for *sig* will cause the process to be unconditionally killed by the TerminateProcess API, and the exit code - will be set to *sig*. The Windows version of :func:`kill` additionally takes - process handles to be killed. + will be set to *sig*. See also :func:`signal.pthread_kill`. diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst index d4b0e072..c5cf4063 100644 --- a/Doc/library/pathlib.rst +++ b/Doc/library/pathlib.rst @@ -21,6 +21,12 @@ inherit from pure paths but also provide I/O operations. .. image:: pathlib-inheritance.png :align: center :class: invert-in-dark-mode + :alt: Inheritance diagram showing the classes available in pathlib. The + most basic class is PurePath, which has three direct subclasses: + PurePosixPath, PureWindowsPath, and Path. Further to these four + classes, there are two classes that use multiple inheritance: + PosixPath subclasses PurePosixPath and Path, and WindowsPath + subclasses PureWindowsPath and Path. If you've never used this module before or just aren't sure which class is right for your task, :class:`Path` is most likely what you need. It instantiates @@ -161,8 +167,8 @@ we also call *flavours*: A subclass of :class:`PurePath`, this path flavour represents non-Windows filesystem paths:: - >>> PurePosixPath('/etc') - PurePosixPath('/etc') + >>> PurePosixPath('/etc/hosts') + PurePosixPath('/etc/hosts') *pathsegments* is specified similarly to :class:`PurePath`. @@ -171,8 +177,8 @@ we also call *flavours*: A subclass of :class:`PurePath`, this path flavour represents Windows filesystem paths, including `UNC paths`_:: - >>> PureWindowsPath('c:/Program Files/') - PureWindowsPath('c:/Program Files') + >>> PureWindowsPath('c:/', 'Users', 'Ximénez') + PureWindowsPath('c:/Users/Ximénez') >>> PureWindowsPath('//server/share/file') PureWindowsPath('//server/share/file') @@ -756,8 +762,8 @@ calls on path objects. There are three ways to instantiate concrete paths: A subclass of :class:`Path` and :class:`PurePosixPath`, this class represents concrete non-Windows filesystem paths:: - >>> PosixPath('/etc') - PosixPath('/etc') + >>> PosixPath('/etc/hosts') + PosixPath('/etc/hosts') *pathsegments* is specified similarly to :class:`PurePath`. @@ -766,8 +772,8 @@ calls on path objects. There are three ways to instantiate concrete paths: A subclass of :class:`Path` and :class:`PureWindowsPath`, this class represents concrete Windows filesystem paths:: - >>> WindowsPath('c:/Program Files/') - WindowsPath('c:/Program Files') + >>> WindowsPath('c:/', 'Users', 'Ximénez') + WindowsPath('c:/Users/Ximénez') *pathsegments* is specified similarly to :class:`PurePath`. @@ -789,23 +795,119 @@ bugs or failures in your application):: % (cls.__name__,)) NotImplementedError: cannot instantiate 'WindowsPath' on your system +Some concrete path methods can raise an :exc:`OSError` if a system call fails +(for example because the path doesn't exist). + + +Expanding and resolving paths +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. classmethod:: Path.home() + + Return a new path object representing the user's home directory (as + returned by :func:`os.path.expanduser` with ``~`` construct). If the home + directory can't be resolved, :exc:`RuntimeError` is raised. + + :: + + >>> Path.home() + PosixPath('/home/antoine') + + .. versionadded:: 3.5 + + +.. method:: Path.expanduser() + + Return a new path with expanded ``~`` and ``~user`` constructs, + as returned by :meth:`os.path.expanduser`. If a home directory can't be + resolved, :exc:`RuntimeError` is raised. + + :: + + >>> p = PosixPath('~/films/Monty Python') + >>> p.expanduser() + PosixPath('/home/eric/films/Monty Python') + + .. versionadded:: 3.5 + + +.. classmethod:: Path.cwd() + + Return a new path object representing the current directory (as returned + by :func:`os.getcwd`):: + + >>> Path.cwd() + PosixPath('/home/antoine/pathlib') + + +.. method:: Path.absolute() + + Make the path absolute, without normalization or resolving symlinks. + Returns a new path object:: + + >>> p = Path('tests') + >>> p + PosixPath('tests') + >>> p.absolute() + PosixPath('/home/antoine/pathlib/tests') + + +.. method:: Path.resolve(strict=False) + + Make the path absolute, resolving any symlinks. A new path object is + returned:: + + >>> p = Path() + >>> p + PosixPath('.') + >>> p.resolve() + PosixPath('/home/antoine/pathlib') + + "``..``" components are also eliminated (this is the only method to do so):: + + >>> p = Path('docs/../setup.py') + >>> p.resolve() + PosixPath('/home/antoine/pathlib/setup.py') + + If the path doesn't exist and *strict* is ``True``, :exc:`FileNotFoundError` + is raised. If *strict* is ``False``, the path is resolved as far as possible + and any remainder is appended without checking whether it exists. If an + infinite loop is encountered along the resolution path, :exc:`RuntimeError` + is raised. + + .. versionchanged:: 3.6 + The *strict* parameter was added (pre-3.6 behavior is strict). + + +.. method:: Path.readlink() + + Return the path to which the symbolic link points (as returned by + :func:`os.readlink`):: + + >>> p = Path('mylink') + >>> p.symlink_to('setup.py') + >>> p.readlink() + PosixPath('setup.py') + + .. versionadded:: 3.9 + Querying file type and status ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. versionchanged:: 3.8 - :meth:`~Path.exists()`, :meth:`~Path.is_dir()`, :meth:`~Path.is_file()`, - :meth:`~Path.is_mount()`, :meth:`~Path.is_symlink()`, - :meth:`~Path.is_block_device()`, :meth:`~Path.is_char_device()`, - :meth:`~Path.is_fifo()`, :meth:`~Path.is_socket()` now return ``False`` + :meth:`~Path.exists`, :meth:`~Path.is_dir`, :meth:`~Path.is_file`, + :meth:`~Path.is_mount`, :meth:`~Path.is_symlink`, + :meth:`~Path.is_block_device`, :meth:`~Path.is_char_device`, + :meth:`~Path.is_fifo`, :meth:`~Path.is_socket` now return ``False`` instead of raising an exception for paths that contain characters unrepresentable at the OS level. .. method:: Path.stat(*, follow_symlinks=True) - Return a :class:`os.stat_result` object containing information about this path, like :func:`os.stat`. + Return an :class:`os.stat_result` object containing information about this path, like :func:`os.stat`. The result is looked up at each call to this method. This method normally follows symlinks; to stat a symlink add the argument @@ -1040,71 +1142,32 @@ Reading and writing files .. versionadded:: 3.5 -Other methods -^^^^^^^^^^^^^ - -Many of these methods can raise an :exc:`OSError` if a system call fails (for -example because the path doesn't exist). - - -.. classmethod:: Path.cwd() - - Return a new path object representing the current directory (as returned - by :func:`os.getcwd`):: - - >>> Path.cwd() - PosixPath('/home/antoine/pathlib') - - -.. classmethod:: Path.home() - - Return a new path object representing the user's home directory (as - returned by :func:`os.path.expanduser` with ``~`` construct). If the home - directory can't be resolved, :exc:`RuntimeError` is raised. - - :: - - >>> Path.home() - PosixPath('/home/antoine') - - .. versionadded:: 3.5 - - -.. method:: Path.chmod(mode, *, follow_symlinks=True) - - Change the file mode and permissions, like :func:`os.chmod`. - - This method normally follows symlinks. Some Unix flavours support changing - permissions on the symlink itself; on these platforms you may add the - argument ``follow_symlinks=False``, or use :meth:`~Path.lchmod`. - - :: - - >>> p = Path('setup.py') - >>> p.stat().st_mode - 33277 - >>> p.chmod(0o444) - >>> p.stat().st_mode - 33060 - - .. versionchanged:: 3.10 - The *follow_symlinks* parameter was added. - - -.. method:: Path.expanduser() +Reading directories +^^^^^^^^^^^^^^^^^^^ - Return a new path with expanded ``~`` and ``~user`` constructs, - as returned by :meth:`os.path.expanduser`. If a home directory can't be - resolved, :exc:`RuntimeError` is raised. +.. method:: Path.iterdir() - :: + When the path points to a directory, yield path objects of the directory + contents:: - >>> p = PosixPath('~/films/Monty Python') - >>> p.expanduser() - PosixPath('/home/eric/films/Monty Python') + >>> p = Path('docs') + >>> for child in p.iterdir(): child + ... + PosixPath('docs/conf.py') + PosixPath('docs/_templates') + PosixPath('docs/make.bat') + PosixPath('docs/index.rst') + PosixPath('docs/_build') + PosixPath('docs/_static') + PosixPath('docs/Makefile') - .. versionadded:: 3.5 + The children are yielded in arbitrary order, and the special entries + ``'.'`` and ``'..'`` are not included. If a file is removed from or added + to the directory after creating the iterator, it is unspecified whether + a path object for that file is included. + If the path is not a directory or otherwise inaccessible, :exc:`OSError` is + raised. .. method:: Path.glob(pattern, *, case_sensitive=None) @@ -1150,32 +1213,33 @@ example because the path doesn't exist). The *case_sensitive* parameter was added. -.. method:: Path.group() +.. method:: Path.rglob(pattern, *, case_sensitive=None) - Return the name of the group owning the file. :exc:`KeyError` is raised - if the file's gid isn't found in the system database. + Glob the given relative *pattern* recursively. This is like calling + :func:`Path.glob` with "``**/``" added in front of the *pattern*, where + *patterns* are the same as for :mod:`fnmatch`:: + >>> sorted(Path().rglob("*.py")) + [PosixPath('build/lib/pathlib.py'), + PosixPath('docs/conf.py'), + PosixPath('pathlib.py'), + PosixPath('setup.py'), + PosixPath('test_pathlib.py')] -.. method:: Path.iterdir() + By default, or when the *case_sensitive* keyword-only argument is set to + ``None``, this method matches paths using platform-specific casing rules: + typically, case-sensitive on POSIX, and case-insensitive on Windows. + Set *case_sensitive* to ``True`` or ``False`` to override this behaviour. - When the path points to a directory, yield path objects of the directory - contents:: + .. audit-event:: pathlib.Path.rglob self,pattern pathlib.Path.rglob - >>> p = Path('docs') - >>> for child in p.iterdir(): child - ... - PosixPath('docs/conf.py') - PosixPath('docs/_templates') - PosixPath('docs/make.bat') - PosixPath('docs/index.rst') - PosixPath('docs/_build') - PosixPath('docs/_static') - PosixPath('docs/Makefile') + .. versionchanged:: 3.11 + Return only directories if *pattern* ends with a pathname components + separator (:data:`~os.sep` or :data:`~os.altsep`). + + .. versionchanged:: 3.12 + The *case_sensitive* parameter was added. - The children are yielded in arbitrary order, and the special entries - ``'.'`` and ``'..'`` are not included. If a file is removed from or added - to the directory after creating the iterator, whether a path object for - that file be included is unspecified. .. method:: Path.walk(top_down=True, on_error=None, follow_symlinks=False) @@ -1208,7 +1272,7 @@ example because the path doesn't exist). This can be used to prune the search, or to impose a specific order of visiting, or even to inform :meth:`Path.walk` about directories the caller creates or renames before it resumes :meth:`Path.walk` again. Modifying *dirnames* when - *top_down* is false has no effect on the behavior of :meth:`Path.walk()` since the + *top_down* is false has no effect on the behavior of :meth:`Path.walk` since the directories in *dirnames* have already been generated by the time *dirnames* is yielded to the caller. @@ -1272,16 +1336,27 @@ example because the path doesn't exist). .. versionadded:: 3.12 -.. method:: Path.lchmod(mode) - Like :meth:`Path.chmod` but, if the path points to a symbolic link, the - symbolic link's mode is changed rather than its target's. +Creating files and directories +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. method:: Path.touch(mode=0o666, exist_ok=True) + + Create a file at this given path. If *mode* is given, it is combined + with the process's ``umask`` value to determine the file mode and access + flags. If the file already exists, the function succeeds when *exist_ok* + is true (and its modification time is updated to the current time), + otherwise :exc:`FileExistsError` is raised. + + .. seealso:: + The :meth:`~Path.open`, :meth:`~Path.write_text` and + :meth:`~Path.write_bytes` methods are often used to create files. .. method:: Path.mkdir(mode=0o777, parents=False, exist_ok=False) Create a new directory at this given path. If *mode* is given, it is - combined with the process' ``umask`` value to determine the file mode + combined with the process's ``umask`` value to determine the file mode and access flags. If the path already exists, :exc:`FileExistsError` is raised. @@ -1303,30 +1378,51 @@ example because the path doesn't exist). The *exist_ok* parameter was added. -.. method:: Path.owner() - - Return the name of the user owning the file. :exc:`KeyError` is raised - if the file's uid isn't found in the system database. +.. method:: Path.symlink_to(target, target_is_directory=False) + Make this path a symbolic link pointing to *target*. -.. method:: Path.readlink() + On Windows, a symlink represents either a file or a directory, and does not + morph to the target dynamically. If the target is present, the type of the + symlink will be created to match. Otherwise, the symlink will be created + as a directory if *target_is_directory* is true or a file symlink (the + default) otherwise. On non-Windows platforms, *target_is_directory* is ignored. - Return the path to which the symbolic link points (as returned by - :func:`os.readlink`):: + :: >>> p = Path('mylink') >>> p.symlink_to('setup.py') - >>> p.readlink() - PosixPath('setup.py') + >>> p.resolve() + PosixPath('/home/antoine/pathlib/setup.py') + >>> p.stat().st_size + 956 + >>> p.lstat().st_size + 8 - .. versionadded:: 3.9 + .. note:: + The order of arguments (link, target) is the reverse + of :func:`os.symlink`'s. + + +.. method:: Path.hardlink_to(target) + + Make this path a hard link to the same file as *target*. + + .. note:: + The order of arguments (link, target) is the reverse + of :func:`os.link`'s. + + .. versionadded:: 3.10 +Renaming and deleting +^^^^^^^^^^^^^^^^^^^^^ + .. method:: Path.rename(target) - Rename this file or directory to the given *target*, and return a new Path - instance pointing to *target*. On Unix, if *target* exists and is a file, - it will be replaced silently if the user has permission. + Rename this file or directory to the given *target*, and return a new + :class:`!Path` instance pointing to *target*. On Unix, if *target* exists + and is a file, it will be replaced silently if the user has permission. On Windows, if *target* exists, :exc:`FileExistsError` will be raised. *target* can be either a string or another path object:: @@ -1340,93 +1436,42 @@ example because the path doesn't exist). 'some text' The target path may be absolute or relative. Relative paths are interpreted - relative to the current working directory, *not* the directory of the Path - object. + relative to the current working directory, *not* the directory of the + :class:`!Path` object. It is implemented in terms of :func:`os.rename` and gives the same guarantees. .. versionchanged:: 3.8 - Added return value, return the new Path instance. + Added return value, return the new :class:`!Path` instance. .. method:: Path.replace(target) - Rename this file or directory to the given *target*, and return a new Path - instance pointing to *target*. If *target* points to an existing file or - empty directory, it will be unconditionally replaced. + Rename this file or directory to the given *target*, and return a new + :class:`!Path` instance pointing to *target*. If *target* points to an + existing file or empty directory, it will be unconditionally replaced. The target path may be absolute or relative. Relative paths are interpreted - relative to the current working directory, *not* the directory of the Path - object. + relative to the current working directory, *not* the directory of the + :class:`!Path` object. .. versionchanged:: 3.8 - Added return value, return the new Path instance. - - -.. method:: Path.absolute() - - Make the path absolute, without normalization or resolving symlinks. - Returns a new path object:: - - >>> p = Path('tests') - >>> p - PosixPath('tests') - >>> p.absolute() - PosixPath('/home/antoine/pathlib/tests') - - -.. method:: Path.resolve(strict=False) - - Make the path absolute, resolving any symlinks. A new path object is - returned:: - - >>> p = Path() - >>> p - PosixPath('.') - >>> p.resolve() - PosixPath('/home/antoine/pathlib') - - "``..``" components are also eliminated (this is the only method to do so):: + Added return value, return the new :class:`!Path` instance. - >>> p = Path('docs/../setup.py') - >>> p.resolve() - PosixPath('/home/antoine/pathlib/setup.py') - - If the path doesn't exist and *strict* is ``True``, :exc:`FileNotFoundError` - is raised. If *strict* is ``False``, the path is resolved as far as possible - and any remainder is appended without checking whether it exists. If an - infinite loop is encountered along the resolution path, :exc:`RuntimeError` - is raised. - - .. versionchanged:: 3.6 - The *strict* parameter was added (pre-3.6 behavior is strict). -.. method:: Path.rglob(pattern, *, case_sensitive=None) - - Glob the given relative *pattern* recursively. This is like calling - :func:`Path.glob` with "``**/``" added in front of the *pattern*, where - *patterns* are the same as for :mod:`fnmatch`:: - - >>> sorted(Path().rglob("*.py")) - [PosixPath('build/lib/pathlib.py'), - PosixPath('docs/conf.py'), - PosixPath('pathlib.py'), - PosixPath('setup.py'), - PosixPath('test_pathlib.py')] +.. method:: Path.unlink(missing_ok=False) - By default, or when the *case_sensitive* keyword-only argument is set to - ``None``, this method matches paths using platform-specific casing rules: - typically, case-sensitive on POSIX, and case-insensitive on Windows. - Set *case_sensitive* to ``True`` or ``False`` to override this behaviour. + Remove this file or symbolic link. If the path points to a directory, + use :func:`Path.rmdir` instead. - .. audit-event:: pathlib.Path.rglob self,pattern pathlib.Path.rglob + If *missing_ok* is false (the default), :exc:`FileNotFoundError` is + raised if the path does not exist. - .. versionchanged:: 3.11 - Return only directories if *pattern* ends with a pathname components - separator (:data:`~os.sep` or :data:`~os.altsep`). + If *missing_ok* is true, :exc:`FileNotFoundError` exceptions will be + ignored (same behavior as the POSIX ``rm -f`` command). - .. versionchanged:: 3.12 - The *case_sensitive* parameter was added. + .. versionchanged:: 3.8 + The *missing_ok* parameter was added. .. method:: Path.rmdir() @@ -1434,64 +1479,46 @@ example because the path doesn't exist). Remove this directory. The directory must be empty. -.. method:: Path.symlink_to(target, target_is_directory=False) - - Make this path a symbolic link pointing to *target*. - - On Windows, a symlink represents either a file or a directory, and does not - morph to the target dynamically. If the target is present, the type of the - symlink will be created to match. Otherwise, the symlink will be created - as a directory if *target_is_directory* is ``True`` or a file symlink (the - default) otherwise. On non-Windows platforms, *target_is_directory* is ignored. - - :: +Permissions and ownership +^^^^^^^^^^^^^^^^^^^^^^^^^ - >>> p = Path('mylink') - >>> p.symlink_to('setup.py') - >>> p.resolve() - PosixPath('/home/antoine/pathlib/setup.py') - >>> p.stat().st_size - 956 - >>> p.lstat().st_size - 8 +.. method:: Path.owner() - .. note:: - The order of arguments (link, target) is the reverse - of :func:`os.symlink`'s. + Return the name of the user owning the file. :exc:`KeyError` is raised + if the file's user identifier (UID) isn't found in the system database. -.. method:: Path.hardlink_to(target) - Make this path a hard link to the same file as *target*. +.. method:: Path.group() - .. note:: - The order of arguments (link, target) is the reverse - of :func:`os.link`'s. + Return the name of the group owning the file. :exc:`KeyError` is raised + if the file's group identifier (GID) isn't found in the system database. - .. versionadded:: 3.10 +.. method:: Path.chmod(mode, *, follow_symlinks=True) -.. method:: Path.touch(mode=0o666, exist_ok=True) + Change the file mode and permissions, like :func:`os.chmod`. - Create a file at this given path. If *mode* is given, it is combined - with the process' ``umask`` value to determine the file mode and access - flags. If the file already exists, the function succeeds if *exist_ok* - is true (and its modification time is updated to the current time), - otherwise :exc:`FileExistsError` is raised. + This method normally follows symlinks. Some Unix flavours support changing + permissions on the symlink itself; on these platforms you may add the + argument ``follow_symlinks=False``, or use :meth:`~Path.lchmod`. + :: -.. method:: Path.unlink(missing_ok=False) + >>> p = Path('setup.py') + >>> p.stat().st_mode + 33277 + >>> p.chmod(0o444) + >>> p.stat().st_mode + 33060 - Remove this file or symbolic link. If the path points to a directory, - use :func:`Path.rmdir` instead. + .. versionchanged:: 3.10 + The *follow_symlinks* parameter was added. - If *missing_ok* is false (the default), :exc:`FileNotFoundError` is - raised if the path does not exist. - If *missing_ok* is true, :exc:`FileNotFoundError` exceptions will be - ignored (same behavior as the POSIX ``rm -f`` command). +.. method:: Path.lchmod(mode) - .. versionchanged:: 3.8 - The *missing_ok* parameter was added. + Like :meth:`Path.chmod` but, if the path points to a symbolic link, the + symbolic link's mode is changed rather than its target's. Correspondence to tools in the :mod:`os` module @@ -1500,51 +1527,54 @@ Correspondence to tools in the :mod:`os` module Below is a table mapping various :mod:`os` functions to their corresponding :class:`PurePath`/:class:`Path` equivalent. -.. note:: - - Not all pairs of functions/methods below are equivalent. Some of them, - despite having some overlapping use-cases, have different semantics. They - include :func:`os.path.abspath` and :meth:`Path.absolute`, - :func:`os.path.relpath` and :meth:`PurePath.relative_to`. - -==================================== ============================== -:mod:`os` and :mod:`os.path` :mod:`pathlib` -==================================== ============================== -:func:`os.path.abspath` :meth:`Path.absolute` [#]_ -:func:`os.path.realpath` :meth:`Path.resolve` -:func:`os.chmod` :meth:`Path.chmod` -:func:`os.mkdir` :meth:`Path.mkdir` -:func:`os.makedirs` :meth:`Path.mkdir` -:func:`os.rename` :meth:`Path.rename` -:func:`os.replace` :meth:`Path.replace` -:func:`os.rmdir` :meth:`Path.rmdir` -:func:`os.remove`, :func:`os.unlink` :meth:`Path.unlink` -:func:`os.getcwd` :func:`Path.cwd` -:func:`os.path.exists` :meth:`Path.exists` -:func:`os.path.expanduser` :meth:`Path.expanduser` and - :meth:`Path.home` -:func:`os.listdir` :meth:`Path.iterdir` -:func:`os.walk` :meth:`Path.walk` -:func:`os.path.isdir` :meth:`Path.is_dir` -:func:`os.path.isfile` :meth:`Path.is_file` -:func:`os.path.islink` :meth:`Path.is_symlink` -:func:`os.link` :meth:`Path.hardlink_to` -:func:`os.symlink` :meth:`Path.symlink_to` -:func:`os.readlink` :meth:`Path.readlink` -:func:`os.path.relpath` :meth:`PurePath.relative_to` [#]_ -:func:`os.stat` :meth:`Path.stat`, - :meth:`Path.owner`, - :meth:`Path.group` -:func:`os.path.isabs` :meth:`PurePath.is_absolute` -:func:`os.path.join` :func:`PurePath.joinpath` -:func:`os.path.basename` :attr:`PurePath.name` -:func:`os.path.dirname` :attr:`PurePath.parent` -:func:`os.path.samefile` :meth:`Path.samefile` -:func:`os.path.splitext` :attr:`PurePath.stem` and - :attr:`PurePath.suffix` -==================================== ============================== +===================================== ============================================== +:mod:`os` and :mod:`os.path` :mod:`pathlib` +===================================== ============================================== +:func:`os.path.dirname` :attr:`PurePath.parent` +:func:`os.path.basename` :attr:`PurePath.name` +:func:`os.path.splitext` :attr:`PurePath.stem`, :attr:`PurePath.suffix` +:func:`os.path.join` :meth:`PurePath.joinpath` +:func:`os.path.isabs` :meth:`PurePath.is_absolute` +:func:`os.path.relpath` :meth:`PurePath.relative_to` [1]_ +:func:`os.path.expanduser` :meth:`Path.expanduser` [2]_ +:func:`os.path.realpath` :meth:`Path.resolve` +:func:`os.path.abspath` :meth:`Path.absolute` [3]_ +:func:`os.path.exists` :meth:`Path.exists` +:func:`os.path.isfile` :meth:`Path.is_file` +:func:`os.path.isdir` :meth:`Path.is_dir` +:func:`os.path.islink` :meth:`Path.is_symlink` +:func:`os.path.isjunction` :meth:`Path.is_junction` +:func:`os.path.ismount` :meth:`Path.is_mount` +:func:`os.path.samefile` :meth:`Path.samefile` +:func:`os.getcwd` :meth:`Path.cwd` +:func:`os.stat` :meth:`Path.stat` +:func:`os.lstat` :meth:`Path.lstat` +:func:`os.listdir` :meth:`Path.iterdir` +:func:`os.walk` :meth:`Path.walk` [4]_ +:func:`os.mkdir`, :func:`os.makedirs` :meth:`Path.mkdir` +:func:`os.link` :meth:`Path.hardlink_to` +:func:`os.symlink` :meth:`Path.symlink_to` +:func:`os.readlink` :meth:`Path.readlink` +:func:`os.rename` :meth:`Path.rename` +:func:`os.replace` :meth:`Path.replace` +:func:`os.remove`, :func:`os.unlink` :meth:`Path.unlink` +:func:`os.rmdir` :meth:`Path.rmdir` +:func:`os.chmod` :meth:`Path.chmod` +:func:`os.lchmod` :meth:`Path.lchmod` +===================================== ============================================== .. rubric:: Footnotes -.. [#] :func:`os.path.abspath` normalizes the resulting path, which may change its meaning in the presence of symlinks, while :meth:`Path.absolute` does not. -.. [#] :meth:`PurePath.relative_to` requires ``self`` to be the subpath of the argument, but :func:`os.path.relpath` does not. +.. [1] :func:`os.path.relpath` calls :func:`~os.path.abspath` to make paths + absolute and remove "``..``" parts, whereas :meth:`PurePath.relative_to` + is a lexical operation that raises :exc:`ValueError` when its inputs' + anchors differ (e.g. if one path is absolute and the other relative.) +.. [2] :func:`os.path.expanduser` returns the path unchanged if the home + directory can't be resolved, whereas :meth:`Path.expanduser` raises + :exc:`RuntimeError`. +.. [3] :func:`os.path.abspath` removes "``..``" components without resolving + symlinks, which may change the meaning of the path, whereas + :meth:`Path.absolute` leaves any "``..``" components in the path. +.. [4] :func:`os.walk` always follows symlinks when categorizing paths into + *dirnames* and *filenames*, whereas :meth:`Path.walk` categorizes all + symlinks into *filenames* when *follow_symlinks* is false (the default.) diff --git a/Doc/library/pdb.rst b/Doc/library/pdb.rst index 8a6ee9c5..32c41b8b 100644 --- a/Doc/library/pdb.rst +++ b/Doc/library/pdb.rst @@ -49,7 +49,7 @@ You can then step through the code following this statement, and continue running without the debugger using the :pdbcmd:`continue` command. .. versionchanged:: 3.7 - The built-in :func:`breakpoint()`, when called with defaults, can be used + The built-in :func:`breakpoint`, when called with defaults, can be used instead of ``import pdb; pdb.set_trace()``. :: diff --git a/Doc/library/pkgutil.rst b/Doc/library/pkgutil.rst index 5d4ff34b..4a39d53a 100644 --- a/Doc/library/pkgutil.rst +++ b/Doc/library/pkgutil.rst @@ -26,7 +26,8 @@ support. __path__ = extend_path(__path__, __name__) For each directory on :data:`sys.path` that has a subdirectory that matches the - package name, add the subdirectory to the package's :attr:`__path__`. This is useful + package name, add the subdirectory to the package's + :attr:`~module.__path__`. This is useful if one wants to distribute different parts of a single logical package as multiple directories. @@ -34,9 +35,9 @@ support. *name* argument. This feature is similar to :file:`\*.pth` files (see the :mod:`site` module for more information), except that it doesn't special-case lines starting with ``import``. A :file:`\*.pkg` file is trusted at face - value: apart from checking for duplicates, all entries found in a - :file:`\*.pkg` file are added to the path, regardless of whether they exist - on the filesystem. (This is a feature.) + value: apart from skipping blank lines and ignoring comments, all entries + found in a :file:`\*.pkg` file are added to the path, regardless of whether + they exist on the filesystem (this is a feature). If the input path is not a list (as is the case for frozen packages) it is returned unchanged. The input path is not modified; an extended copy is diff --git a/Doc/library/pprint.rst b/Doc/library/pprint.rst index df706c10..2985f31b 100644 --- a/Doc/library/pprint.rst +++ b/Doc/library/pprint.rst @@ -35,24 +35,66 @@ Dictionaries are sorted by key before the display is computed. Functions --------- -.. 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* and *kwargs* will be passed to :func:`~pprint.pprint` as formatting - parameters. - - >>> import pprint - >>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni'] - >>> stuff.insert(0, stuff) - >>> pprint.pp(stuff) - [, - 'spam', - 'eggs', - 'lumberjack', - 'knights', - 'ni'] +.. function:: pp(object, stream=None, indent=1, width=80, depth=None, *, \ + compact=False, sort_dicts=False, underscore_numbers=False) + + Prints the formatted representation of *object*, followed by a newline. + This function may be used in the interactive interpreter + instead of the :func:`print` function for inspecting values. + Tip: you can reassign ``print = pprint.pp`` for use within a scope. + + :param object: + The object to be printed. + + :param stream: + A file-like object to which the output will be written + by calling its :meth:`!write` method. + If ``None`` (the default), :data:`sys.stdout` is used. + :type stream: :term:`file-like object` | None + + :param int indent: + The amount of indentation added for each nesting level. + + :param int width: + The desired maximum number of characters per line in the output. + If a structure cannot be formatted within the width constraint, + a best effort will be made. + + :param depth: + The number of nesting levels which may be printed. + If the data structure being printed is too deep, + the next contained level is replaced by ``...``. + If ``None`` (the default), there is no constraint + on the depth of the objects being formatted. + :type depth: int | None + + :param bool compact: + Control the way long :term:`sequences ` are formatted. + If ``False`` (the default), + each item of a sequence will be formatted on a separate line, + otherwise as many items as will fit within the *width* + will be formatted on each output line. + + :param bool sort_dicts: + If ``True``, dictionaries will be formatted with + their keys sorted, otherwise + they will be displayed in insertion order (the default). + + :param bool underscore_numbers: + If ``True``, + integers will be formatted with the ``_`` character for a thousands separator, + otherwise underscores are not displayed (the default). + + >>> import pprint + >>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni'] + >>> stuff.insert(0, stuff) + >>> pprint.pp(stuff) + [, + 'spam', + 'eggs', + 'lumberjack', + 'knights', + 'ni'] .. versionadded:: 3.8 @@ -60,19 +102,10 @@ Functions .. function:: pprint(object, stream=None, indent=1, width=80, depth=None, *, \ compact=False, sort_dicts=True, underscore_numbers=False) - Prints the formatted representation of *object* on *stream*, followed by a - newline. If *stream* is ``None``, :data:`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). - - The configuration parameters *stream*, *indent*, *width*, *depth*, - *compact*, *sort_dicts* and *underscore_numbers* are passed to the - :class:`PrettyPrinter` constructor and their meanings are as - described in its documentation below. + Alias for :func:`~pprint.pp` with *sort_dicts* set to ``True`` by default, + which would automatically sort the dictionaries' keys, + you might want to use :func:`~pprint.pp` instead where it is ``False`` by default. - Note that *sort_dicts* is ``True`` by default and you might want to use - :func:`~pprint.pp` instead where it is ``False`` by default. .. function:: pformat(object, indent=1, width=80, depth=None, *, \ compact=False, sort_dicts=True, underscore_numbers=False) @@ -80,7 +113,7 @@ Functions Return the formatted representation of *object* as a string. *indent*, *width*, *depth*, *compact*, *sort_dicts* and *underscore_numbers* are passed to the :class:`PrettyPrinter` constructor as formatting parameters - and their meanings are as described in its documentation below. + and their meanings are as described in the documentation above. .. function:: isreadable(object) @@ -119,51 +152,39 @@ Functions PrettyPrinter Objects --------------------- -This module defines one class: - -.. First the implementation class: - - .. index:: single: ...; placeholder .. class:: PrettyPrinter(indent=1, width=80, depth=None, stream=None, *, \ compact=False, sort_dicts=True, underscore_numbers=False) - Construct a :class:`PrettyPrinter` instance. This constructor understands - several keyword parameters. - - *stream* (default :data:`!sys.stdout`) is a :term:`file-like object` to - which the output will be written by calling its :meth:`!write` method. - If both *stream* and :data:`!sys.stdout` are ``None``, then - :meth:`~PrettyPrinter.pprint` silently returns. + Construct a :class:`PrettyPrinter` instance. - Other values configure the manner in which nesting of complex data - structures is displayed. + Arguments have the same meaning as for :func:`~pprint.pp`. + Note that they are in a different order, and that *sort_dicts* defaults to ``True``. - *indent* (default 1) specifies the amount of indentation added for - each nesting level. - - *depth* controls the number of nesting levels which may be printed; if - the data structure being printed is too deep, the next contained level - is replaced by ``...``. By default, there is no constraint on the - depth of the objects being formatted. - - *width* (default 80) specifies the desired maximum number of characters per - line in the output. If a structure cannot be formatted within the width - constraint, a best effort will be made. - - *compact* impacts the way that long sequences (lists, tuples, sets, etc) - are formatted. If *compact* is false (the default) then each item of a - 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. - - If *sort_dicts* is true (the default), dictionaries will be formatted with - their keys sorted, otherwise they will display in insertion order. + >>> import pprint + >>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni'] + >>> stuff.insert(0, stuff[:]) + >>> pp = pprint.PrettyPrinter(indent=4) + >>> pp.pprint(stuff) + [ ['spam', 'eggs', 'lumberjack', 'knights', 'ni'], + 'spam', + 'eggs', + 'lumberjack', + 'knights', + 'ni'] + >>> pp = pprint.PrettyPrinter(width=41, compact=True) + >>> pp.pprint(stuff) + [['spam', 'eggs', 'lumberjack', + 'knights', 'ni'], + 'spam', 'eggs', 'lumberjack', 'knights', + 'ni'] + >>> tup = ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', + ... ('parrot', ('fresh fruit',)))))))) + >>> pp = pprint.PrettyPrinter(depth=6) + >>> pp.pprint(tup) + ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', (...))))))) - If *underscore_numbers* is true, integers will be formatted with the - ``_`` character for a thousands separator, otherwise underscores are not - displayed (the default). .. versionchanged:: 3.4 Added the *compact* parameter. @@ -177,29 +198,6 @@ This module defines one class: .. versionchanged:: 3.11 No longer attempts to write to :data:`!sys.stdout` if it is ``None``. - >>> import pprint - >>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni'] - >>> stuff.insert(0, stuff[:]) - >>> pp = pprint.PrettyPrinter(indent=4) - >>> pp.pprint(stuff) - [ ['spam', 'eggs', 'lumberjack', 'knights', 'ni'], - 'spam', - 'eggs', - 'lumberjack', - 'knights', - 'ni'] - >>> pp = pprint.PrettyPrinter(width=41, compact=True) - >>> pp.pprint(stuff) - [['spam', 'eggs', 'lumberjack', - 'knights', 'ni'], - 'spam', 'eggs', 'lumberjack', 'knights', - 'ni'] - >>> tup = ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', - ... ('parrot', ('fresh fruit',)))))))) - >>> pp = pprint.PrettyPrinter(depth=6) - >>> pp.pprint(tup) - ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', (...))))))) - :class:`PrettyPrinter` instances have the following methods: @@ -269,7 +267,7 @@ let's fetch information about a project from `PyPI `_:: >>> import json >>> import pprint >>> from urllib.request import urlopen - >>> with urlopen('https://pypi.org/pypi/sampleproject/json') as resp: + >>> with urlopen('https://pypi.org/pypi/sampleproject/1.2.0/json') as resp: ... project_info = json.load(resp)['info'] In its basic form, :func:`~pprint.pp` shows the whole object:: diff --git a/Doc/library/profile.rst b/Doc/library/profile.rst index cc059b66..b89655ea 100644 --- a/Doc/library/profile.rst +++ b/Doc/library/profile.rst @@ -675,7 +675,7 @@ you are using :class:`profile.Profile` or :class:`cProfile.Profile`, that you choose (see :ref:`profile-calibration`). For most machines, a timer that returns a lone integer value will provide the best results in terms of low overhead during profiling. (:func:`os.times` is *pretty* bad, as it - returns a tuple of floating point values). If you want to substitute a + returns a tuple of floating-point values). If you want to substitute a better timer in the cleanest fashion, derive a class and hardwire a replacement dispatch method that best handles your timer call, along with the appropriate calibration constant. @@ -692,7 +692,7 @@ you are using :class:`profile.Profile` or :class:`cProfile.Profile`, As the :class:`cProfile.Profile` class cannot be calibrated, custom timer functions should be used with care and should be as fast as possible. For the best results with a custom timer, it might be necessary to hard-code it - in the C source of the internal :mod:`_lsprof` module. + in the C source of the internal :mod:`!_lsprof` module. Python 3.3 adds several new functions in :mod:`time` that can be used to make precise measurements of process or wall-clock time. For example, see diff --git a/Doc/library/pydoc.rst b/Doc/library/pydoc.rst index f7ca1e04..e8f153ee 100644 --- a/Doc/library/pydoc.rst +++ b/Doc/library/pydoc.rst @@ -21,7 +21,7 @@ modules. The documentation can be presented as pages of text on the console, served to a web browser, or saved to HTML files. For modules, classes, functions and methods, the displayed documentation is -derived from the docstring (i.e. the :attr:`!__doc__` attribute) of the object, +derived from the docstring (i.e. the :attr:`~definition.__doc__` attribute) of the object, and recursively of its documentable members. If there is no docstring, :mod:`!pydoc` tries to obtain a description from the block of comment lines just above the definition of the class, function or method in the source file, or at @@ -52,8 +52,9 @@ produced for that file. only execute code when a file is invoked as a script and not just imported. When printing output to the console, :program:`pydoc` attempts to paginate the -output for easier reading. If the :envvar:`PAGER` environment variable is set, -:program:`pydoc` will use its value as a pagination program. +output for easier reading. If either the :envvar:`MANPAGER` or the +:envvar:`PAGER` environment variable is set, :program:`pydoc` will use its +value as a pagination program. When both are set, :envvar:`MANPAGER` is used. Specifying a ``-w`` flag before the argument will cause HTML documentation to be written out to a file in the current directory, instead of displaying text diff --git a/Doc/library/random.rst b/Doc/library/random.rst index 10c88ac6..a589bf76 100644 --- a/Doc/library/random.rst +++ b/Doc/library/random.rst @@ -194,8 +194,8 @@ Functions for sequences For a given seed, the :func:`choices` function with equal weighting typically produces a different sequence than repeated calls to - :func:`choice`. The algorithm used by :func:`choices` uses floating - point arithmetic for internal consistency and speed. The algorithm used + :func:`choice`. The algorithm used by :func:`choices` uses floating-point + arithmetic for internal consistency and speed. The algorithm used by :func:`choice` defaults to integer arithmetic with repeated selections to avoid small biases from round-off error. @@ -292,12 +292,12 @@ be found in any statistics text. .. function:: random() - Return the next random floating point number in the range ``0.0 <= X < 1.0`` + Return the next random floating-point number in the range ``0.0 <= X < 1.0`` .. function:: uniform(a, b) - Return a random floating point number *N* such that ``a <= N <= b`` for + Return a random floating-point number *N* such that ``a <= N <= b`` for ``a <= b`` and ``b <= N <= a`` for ``b < a``. The end-point value ``b`` may or may not be included in the range @@ -307,7 +307,7 @@ be found in any statistics text. .. function:: triangular(low, high, mode) - Return a random floating point number *N* such that ``low <= N <= high`` and + Return a random floating-point number *N* such that ``low <= N <= high`` and with the specified *mode* between those bounds. The *low* and *high* bounds default to zero and one. The *mode* argument defaults to the midpoint between the bounds, giving a symmetric distribution. diff --git a/Doc/library/re.rst b/Doc/library/re.rst index 220bd687..0a8391a0 100644 --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -101,7 +101,7 @@ The special characters are: ``.`` (Dot.) In the default mode, this matches any character except a newline. If the :const:`DOTALL` flag has been specified, this matches any character - including a newline. + including a newline. ``(?s:.)`` matches any character regardless of flags. .. index:: single: ^ (caret); in regular expressions @@ -572,6 +572,12 @@ character ``'$'``. Word boundaries are determined by the current locale if the :py:const:`~re.LOCALE` flag is used. + .. note:: + + Note that ``\B`` does not match an empty string, which differs from + RE implementations in other programming languages such as Perl. + This behavior is kept for compatibility reasons. + .. index:: single: \d; in regular expressions ``\d`` @@ -600,10 +606,9 @@ character ``'$'``. ``\s`` For Unicode (str) patterns: - Matches Unicode whitespace characters (which includes - ``[ \t\n\r\f\v]``, and also many other characters, for example the - non-breaking spaces mandated by typography rules in many - languages). + Matches Unicode whitespace characters (as defined by :py:meth:`str.isspace`). + This includes ``[ \t\n\r\f\v]``, and also many other characters, for example the + non-breaking spaces mandated by typography rules in many languages. Matches ``[ \t\n\r\f\v]`` if the :py:const:`~re.ASCII` flag is used. @@ -911,6 +916,10 @@ Functions ``None`` if no position in the string matches the pattern; note that this is different from finding a zero-length match at some point in the string. + The expression's behaviour can be modified by specifying a *flags* value. + Values can be any of the `flags`_ variables, combined using bitwise OR + (the ``|`` operator). + .. function:: match(pattern, string, flags=0) @@ -925,6 +934,10 @@ Functions If you want to locate a match anywhere in *string*, use :func:`search` instead (see also :ref:`search-vs-match`). + The expression's behaviour can be modified by specifying a *flags* value. + Values can be any of the `flags`_ variables, combined using bitwise OR + (the ``|`` operator). + .. function:: fullmatch(pattern, string, flags=0) @@ -932,6 +945,10 @@ Functions corresponding :class:`~re.Match`. Return ``None`` if the string does not match the pattern; note that this is different from a zero-length match. + The expression's behaviour can be modified by specifying a *flags* value. + Values can be any of the `flags`_ variables, combined using bitwise OR + (the ``|`` operator). + .. versionadded:: 3.4 @@ -974,6 +991,10 @@ Functions >>> re.split(r'(\W*)', '...words...') ['', '...', '', '', 'w', '', 'o', '', 'r', '', 'd', '', 's', '...', '', '', ''] + The expression's behaviour can be modified by specifying a *flags* value. + Values can be any of the `flags`_ variables, combined using bitwise OR + (the ``|`` operator). + .. versionchanged:: 3.1 Added the optional flags argument. @@ -999,6 +1020,10 @@ Functions >>> re.findall(r'(\w+)=(\d+)', 'set width=20 and height=10') [('width', '20'), ('height', '10')] + The expression's behaviour can be modified by specifying a *flags* value. + Values can be any of the `flags`_ variables, combined using bitwise OR + (the ``|`` operator). + .. versionchanged:: 3.7 Non-empty matches can now start just after a previous empty match. @@ -1010,6 +1035,10 @@ Functions is scanned left-to-right, and matches are returned in the order found. Empty matches are included in the result. + The expression's behaviour can be modified by specifying a *flags* value. + Values can be any of the `flags`_ variables, combined using bitwise OR + (the ``|`` operator). + .. versionchanged:: 3.7 Non-empty matches can now start just after a previous empty match. @@ -1065,6 +1094,10 @@ Functions character ``'0'``. The backreference ``\g<0>`` substitutes in the entire substring matched by the RE. + The expression's behaviour can be modified by specifying a *flags* value. + Values can be any of the `flags`_ variables, combined using bitwise OR + (the ``|`` operator). + .. versionchanged:: 3.1 Added the optional flags argument. @@ -1100,6 +1133,10 @@ Functions .. versionchanged:: 3.5 Unmatched groups are replaced with an empty string. + The expression's behaviour can be modified by specifying a *flags* value. + Values can be any of the `flags`_ variables, combined using bitwise OR + (the ``|`` operator). + .. function:: escape(pattern) diff --git a/Doc/library/readline.rst b/Doc/library/readline.rst index 43cf8d5c..f02aec8a 100644 --- a/Doc/library/readline.rst +++ b/Doc/library/readline.rst @@ -44,6 +44,10 @@ Readline library in general. python:bind -v python:bind ^I rl_complete + Also note that different libraries may use different history file formats. + When switching the underlying library, existing history files may become + unusable. + Init file --------- diff --git a/Doc/library/removed.rst b/Doc/library/removed.rst new file mode 100644 index 00000000..4aafb088 --- /dev/null +++ b/Doc/library/removed.rst @@ -0,0 +1,20 @@ +:tocdepth: 1 + +.. _removed: + +*************** +Removed Modules +*************** + +The modules described in this chapter have been removed from the Python +standard library. They are documented here to help people find replacements. + + +.. toctree:: + :maxdepth: 1 + + asynchat.rst + asyncore.rst + distutils.rst + imp.rst + smtpd.rst diff --git a/Doc/library/resource.rst b/Doc/library/resource.rst index 7465bc54..02009d82 100644 --- a/Doc/library/resource.rst +++ b/Doc/library/resource.rst @@ -305,7 +305,7 @@ These functions are used to retrieve resource usage information: elements. The fields :attr:`ru_utime` and :attr:`ru_stime` of the return value are - floating point values representing the amount of time spent executing in user + floating-point values representing the amount of time spent executing in user mode and the amount of time spent executing in system mode, respectively. The remaining values are integers. Consult the :manpage:`getrusage(2)` man page for detailed information about these values. A brief summary is presented here: diff --git a/Doc/library/secrets.rst b/Doc/library/secrets.rst index 1401a925..75dafc54 100644 --- a/Doc/library/secrets.rst +++ b/Doc/library/secrets.rst @@ -52,7 +52,7 @@ randomness that your operating system provides. .. function:: randbits(k) - Return an int with *k* random bits. + Return a non-negative int with *k* random bits. Generating tokens diff --git a/Doc/library/select.rst b/Doc/library/select.rst index 06ebaf02..f23a249f 100644 --- a/Doc/library/select.rst +++ b/Doc/library/select.rst @@ -129,7 +129,7 @@ The module defines the following: Empty iterables are allowed, but acceptance of three empty iterables is platform-dependent. (It is known to work on Unix but not on Windows.) The - optional *timeout* argument specifies a time-out as a floating point number + optional *timeout* argument specifies a time-out as a floating-point number in seconds. When the *timeout* argument is omitted the function blocks until at least one file descriptor is ready. A time-out value of zero specifies a poll and never blocks. diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst index 49d2c7ff..08128f87 100644 --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -439,8 +439,10 @@ Directory and files operations *mode* is a permission mask passed to :func:`os.access`, by default determining if the file exists and is executable. - When no *path* is specified, the results of :func:`os.environ` are used, - returning either the "PATH" value or a fallback of :data:`os.defpath`. + *path* is a "``PATH`` string" specifying the directories to look in, + delimited by :data:`os.pathsep`. When no *path* is specified, the + :envvar:`PATH` environment variable is read from :data:`os.environ`, + falling back to :data:`os.defpath` if it is not set. On Windows, the current directory is prepended to the *path* if *mode* does not include ``os.X_OK``. When the *mode* does include ``os.X_OK``, the @@ -449,9 +451,9 @@ Directory and files operations consulting the current working directory for executables: set the environment variable ``NoDefaultCurrentDirectoryInExePath``. - Also on Windows, the ``PATHEXT`` variable is used to resolve commands - that may not already include an extension. For example, if you call - ``shutil.which("python")``, :func:`which` will search ``PATHEXT`` + Also on Windows, the :envvar:`PATHEXT` environment variable is used to + resolve commands that may not already include an extension. For example, + if you call ``shutil.which("python")``, :func:`which` will search ``PATHEXT`` to know that it should look for ``python.exe`` within the *path* directories. For example, on Windows:: @@ -479,12 +481,6 @@ Directory and files operations or ends with an extension that is in ``PATHEXT``; and filenames that have no extension can now be found. - .. versionchanged:: 3.12.1 - On Windows, if *mode* includes ``os.X_OK``, executables with an - extension in ``PATHEXT`` will be preferred over executables without a - matching extension. - This brings behavior closer to that of Python 3.11. - .. exception:: Error This exception collects exceptions that are raised during a multi-file diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst index 60f21bc9..641a6c02 100644 --- a/Doc/library/signal.rst +++ b/Doc/library/signal.rst @@ -425,7 +425,7 @@ The :mod:`signal` module defines the following functions: signal to a particular Python thread would be to force a running system call to fail with :exc:`InterruptedError`. - Use :func:`threading.get_ident()` or the :attr:`~threading.Thread.ident` + Use :func:`threading.get_ident` or the :attr:`~threading.Thread.ident` attribute of :class:`threading.Thread` objects to get a suitable value for *thread_id*. diff --git a/Doc/library/site.rst b/Doc/library/site.rst index f5cf81fb..514eed31 100644 --- a/Doc/library/site.rst +++ b/Doc/library/site.rst @@ -15,8 +15,9 @@ import can be suppressed using the interpreter's :option:`-S` option. .. index:: triple: module; search; path -Importing this module will append site-specific paths to the module search path -and add a few builtins, unless :option:`-S` was used. In that case, this module +Importing this module normally appends site-specific paths to the module search path +and adds :ref:`callables `, including :func:`help` to the built-in +namespace. However, Python startup option :option:`-S` blocks this and this module can be safely imported with no automatic modifications to the module search path or additions to the builtins. To explicitly trigger the usual site-specific additions, call the :func:`main` function. diff --git a/Doc/library/smtpd.rst b/Doc/library/smtpd.rst new file mode 100644 index 00000000..c704f4a2 --- /dev/null +++ b/Doc/library/smtpd.rst @@ -0,0 +1,18 @@ +:mod:`!smtpd` --- SMTP Server +============================= + +.. module:: smtpd + :synopsis: Removed in 3.12. + :deprecated: + +.. deprecated-removed:: 3.6 3.12 + +This module is no longer part of the Python standard library. +It was :ref:`removed in Python 3.12 ` after +being deprecated in Python 3.6. The removal was decided in :pep:`594`. + +A possible replacement is the third-party :pypi:`aiosmtpd` library. This +library is not maintained or supported by the Python core team. + +The last version of Python that provided the :mod:`!smtpd` module was +`Python 3.11 `_. diff --git a/Doc/library/smtplib.rst b/Doc/library/smtplib.rst index 2511ef7f..7cd530a5 100644 --- a/Doc/library/smtplib.rst +++ b/Doc/library/smtplib.rst @@ -556,34 +556,33 @@ This example prompts the user for addresses needed in the message envelope ('To' and 'From' addresses), and the message to be delivered. Note that the headers to be included with the message must be included in the message as entered; this example doesn't do any processing of the :rfc:`822` headers. In particular, the -'To' and 'From' addresses must be included in the message headers explicitly. :: +'To' and 'From' addresses must be included in the message headers explicitly:: import smtplib - def prompt(prompt): - return input(prompt).strip() + def prompt(title): + return input(title).strip() - fromaddr = prompt("From: ") - toaddrs = prompt("To: ").split() + from_addr = prompt("From: ") + to_addrs = prompt("To: ").split() print("Enter message, end with ^D (Unix) or ^Z (Windows):") # Add the From: and To: headers at the start! - msg = ("From: %s\r\nTo: %s\r\n\r\n" - % (fromaddr, ", ".join(toaddrs))) + lines = [f"From: {from_addr}", f"To: {', '.join(to_addrs)}", ""] while True: try: line = input() except EOFError: break - if not line: - break - msg = msg + line + else: + lines.append(line) + msg = "\r\n".join(lines) print("Message length is", len(msg)) - server = smtplib.SMTP('localhost') + server = smtplib.SMTP("localhost") server.set_debuglevel(1) - server.sendmail(fromaddr, toaddrs, msg) + server.sendmail(from_addr, to_addrs, msg) server.quit() .. note:: diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index 10f03b3f..dd4c2f83 100644 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -695,6 +695,13 @@ Constants .. versionadded:: 3.12 +.. data:: SHUT_RD + SHUT_WR + SHUT_RDWR + + These constants are used by the :meth:`~socket.socket.shutdown` method of socket objects. + + .. availability:: not WASI. Functions ^^^^^^^^^ @@ -724,7 +731,7 @@ The following functions all create :ref:`socket objects `. of :meth:`socket.getpeername` but not the actual OS resource. Unlike :func:`socket.fromfd`, *fileno* will return the same socket and not a duplicate. This may help close a detached socket using - :meth:`socket.close()`. + :meth:`socket.close`. The newly created socket is :ref:`non-inheritable `. @@ -908,7 +915,9 @@ The :mod:`socket` module also offers various network-related services: .. versionadded:: 3.7 -.. function:: getaddrinfo(host, port, family=0, type=0, proto=0, flags=0) +.. function:: getaddrinfo(host, port, family=AF_UNSPEC, type=0, proto=0, flags=0) + + This function wraps the C function ``getaddrinfo`` of the underlying system. Translate the *host*/*port* argument into a sequence of 5-tuples that contain all the necessary arguments for creating a socket connected to that service. @@ -918,8 +927,10 @@ The :mod:`socket` module also offers various network-related services: and *port*, you can pass ``NULL`` to the underlying C API. The *family*, *type* and *proto* arguments can be optionally specified - in order to narrow the list of addresses returned. Passing zero as a - value for each of these arguments selects the full range of results. + in order to provide options and limit the list of addresses returned. + Pass their default values (:data:`AF_UNSPEC`, 0, and 0, respectively) + to not limit the results. See the note below for details. + The *flags* argument can be one or several of the ``AI_*`` constants, and will influence how results are computed and returned. For example, :const:`AI_NUMERICHOST` will disable domain name resolution @@ -939,6 +950,29 @@ The :mod:`socket` module also offers various network-related services: :const:`AF_INET6`), and is meant to be passed to the :meth:`socket.connect` method. + .. note:: + + If you intend to use results from :func:`!getaddrinfo` to create a socket + (rather than, for example, retrieve *canonname*), + consider limiting the results by *type* (e.g. :data:`SOCK_STREAM` or + :data:`SOCK_DGRAM`) and/or *proto* (e.g. :data:`IPPROTO_TCP` or + :data:`IPPROTO_UDP`) that your application can handle. + + The behavior with default values of *family*, *type*, *proto* + and *flags* is system-specific. + + Many systems (for example, most Linux configurations) will return a sorted + list of all matching addresses. + These addresses should generally be tried in order until a connection succeeds + (possibly tried in parallel, for example, using a `Happy Eyeballs`_ algorithm). + In these cases, limiting the *type* and/or *proto* can help eliminate + unsuccessful or unusable connection attempts. + + Some systems will, however, only return a single address. + (For example, this was reported on Solaris and AIX configurations.) + On these systems, limiting the *type* and/or *proto* helps ensure that + this address is usable. + .. audit-event:: socket.getaddrinfo host,port,family,type,protocol socket.getaddrinfo The following example fetches address information for a hypothetical TCP @@ -958,6 +992,8 @@ The :mod:`socket` module also offers various network-related services: for IPv6 multicast addresses, string representing an address will not contain ``%scope_id`` part. +.. _Happy Eyeballs: https://en.wikipedia.org/wiki/Happy_Eyeballs + .. function:: getfqdn([name]) Return a fully qualified domain name for *name*. If *name* is omitted or empty, @@ -1403,7 +1439,7 @@ to sockets. .. method:: socket.close() Mark the socket closed. The underlying system resource (e.g. a file - descriptor) is also closed when all file objects from :meth:`makefile()` + descriptor) is also closed when all file objects from :meth:`makefile` are closed. Once that happens, all future operations on the socket object will fail. The remote end will receive no more data (after queued data is flushed). @@ -1418,10 +1454,10 @@ to sockets. .. note:: - :meth:`close()` releases the resource associated with a connection but + :meth:`close` releases the resource associated with a connection but does not necessarily close the connection immediately. If you want - to close the connection in a timely fashion, call :meth:`shutdown()` - before :meth:`close()`. + to close the connection in a timely fashion, call :meth:`shutdown` + before :meth:`close`. .. method:: socket.connect(address) @@ -1917,7 +1953,7 @@ to sockets. .. method:: socket.settimeout(value) Set a timeout on blocking socket operations. The *value* argument can be a - nonnegative floating point number expressing seconds, or ``None``. + nonnegative floating-point number expressing seconds, or ``None``. If a non-zero value is given, subsequent socket operations will raise a :exc:`timeout` exception if the timeout period *value* has elapsed before the operation has completed. If zero is given, the socket is put in @@ -2030,7 +2066,7 @@ can be changed by calling :func:`setdefaulttimeout`. in non-blocking mode. Also, the blocking and timeout modes are shared between file descriptors and socket objects that refer to the same network endpoint. This implementation detail can have visible consequences if e.g. you decide - to use the :meth:`~socket.fileno()` of a socket. + to use the :meth:`~socket.fileno` of a socket. Timeouts and the ``connect`` method ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst index 70f1e05a..3078ec29 100644 --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -127,7 +127,7 @@ and call :meth:`res.fetchone() ` to fetch the resulting row: We can see that the table has been created, as the query returns a :class:`tuple` containing the table's name. If we query ``sqlite_master`` for a non-existent table ``spam``, -:meth:`!res.fetchone()` will return ``None``: +:meth:`!res.fetchone` will return ``None``: .. doctest:: @@ -519,21 +519,20 @@ Module constants The mappings from SQLite threading modes to DB-API 2.0 threadsafety levels are as follows: - +------------------+-----------------+----------------------+-------------------------------+ - | SQLite threading | `threadsafety`_ | `SQLITE_THREADSAFE`_ | DB-API 2.0 meaning | - | mode | | | | - +==================+=================+======================+===============================+ - | single-thread | 0 | 0 | Threads may not share the | - | | | | module | - +------------------+-----------------+----------------------+-------------------------------+ - | multi-thread | 1 | 2 | Threads may share the module, | - | | | | but not connections | - +------------------+-----------------+----------------------+-------------------------------+ - | serialized | 3 | 1 | Threads may share the module, | - | | | | connections and cursors | - +------------------+-----------------+----------------------+-------------------------------+ - - .. _threadsafety: https://peps.python.org/pep-0249/#threadsafety + +------------------+----------------------+----------------------+-------------------------------+ + | SQLite threading | :pep:`threadsafety | `SQLITE_THREADSAFE`_ | DB-API 2.0 meaning | + | mode | <0249#threadsafety>` | | | + +==================+======================+======================+===============================+ + | single-thread | 0 | 0 | Threads may not share the | + | | | | module | + +------------------+----------------------+----------------------+-------------------------------+ + | multi-thread | 1 | 2 | Threads may share the module, | + | | | | but not connections | + +------------------+----------------------+----------------------+-------------------------------+ + | serialized | 3 | 1 | Threads may share the module, | + | | | | connections and cursors | + +------------------+----------------------+----------------------+-------------------------------+ + .. _SQLITE_THREADSAFE: https://sqlite.org/compile.html#threadsafe .. versionchanged:: 3.11 @@ -2421,6 +2420,7 @@ Some useful URI tricks include: >>> con.execute("CREATE TABLE readonly(data)") Traceback (most recent call last): OperationalError: attempt to write a readonly database + >>> con.close() * Do not implicitly create a new database file if it does not already exist; will raise :exc:`~sqlite3.OperationalError` if unable to create a new file: diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst index 8fb0d505..f78ab7b1 100644 --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -1021,25 +1021,25 @@ SSL Sockets SSL sockets provide the following methods of :ref:`socket-objects`: - - :meth:`~socket.socket.accept()` - - :meth:`~socket.socket.bind()` - - :meth:`~socket.socket.close()` - - :meth:`~socket.socket.connect()` - - :meth:`~socket.socket.detach()` - - :meth:`~socket.socket.fileno()` - - :meth:`~socket.socket.getpeername()`, :meth:`~socket.socket.getsockname()` - - :meth:`~socket.socket.getsockopt()`, :meth:`~socket.socket.setsockopt()` - - :meth:`~socket.socket.gettimeout()`, :meth:`~socket.socket.settimeout()`, - :meth:`~socket.socket.setblocking()` - - :meth:`~socket.socket.listen()` - - :meth:`~socket.socket.makefile()` - - :meth:`~socket.socket.recv()`, :meth:`~socket.socket.recv_into()` + - :meth:`~socket.socket.accept` + - :meth:`~socket.socket.bind` + - :meth:`~socket.socket.close` + - :meth:`~socket.socket.connect` + - :meth:`~socket.socket.detach` + - :meth:`~socket.socket.fileno` + - :meth:`~socket.socket.getpeername`, :meth:`~socket.socket.getsockname` + - :meth:`~socket.socket.getsockopt`, :meth:`~socket.socket.setsockopt` + - :meth:`~socket.socket.gettimeout`, :meth:`~socket.socket.settimeout`, + :meth:`~socket.socket.setblocking` + - :meth:`~socket.socket.listen` + - :meth:`~socket.socket.makefile` + - :meth:`~socket.socket.recv`, :meth:`~socket.socket.recv_into` (but passing a non-zero ``flags`` argument is not allowed) - - :meth:`~socket.socket.send()`, :meth:`~socket.socket.sendall()` (with + - :meth:`~socket.socket.send`, :meth:`~socket.socket.sendall` (with the same limitation) - - :meth:`~socket.socket.sendfile()` (but :mod:`os.sendfile` will be used - for plain-text sockets only, else :meth:`~socket.socket.send()` will be used) - - :meth:`~socket.socket.shutdown()` + - :meth:`~socket.socket.sendfile` (but :mod:`os.sendfile` will be used + for plain-text sockets only, else :meth:`~socket.socket.send` will be used) + - :meth:`~socket.socket.shutdown` However, since the SSL (and TLS) protocol has its own framing atop of TCP, the SSL sockets abstraction can, in certain respects, diverge from @@ -1428,6 +1428,19 @@ to speed up repeated connections from the same clients. :data:`PROTOCOL_TLS`, :data:`PROTOCOL_TLS_CLIENT`, and :data:`PROTOCOL_TLS_SERVER` use TLS 1.2 as minimum TLS version. + .. note:: + + :class:`SSLContext` only supports limited mutation once it has been used + by a connection. Adding new certificates to the internal trust store is + allowed, but changing ciphers, verification settings, or mTLS + certificates may result in surprising behavior. + + .. note:: + + :class:`SSLContext` is designed to be shared and used by multiple + connections. + Thus, it is thread-safe as long as it is not reconfigured after being + used by a connection. :class:`SSLContext` objects have the following methods and attributes: @@ -1509,7 +1522,7 @@ to speed up repeated connections from the same clients. The *capath* string, if present, is the path to a directory containing several CA certificates in PEM format, following an `OpenSSL specific layout - `_. + `_. The *cadata* object, if present, is either an ASCII string of one or more PEM-encoded certificates or a :term:`bytes-like object` of DER-encoded @@ -1584,7 +1597,7 @@ to speed up repeated connections from the same clients. Set the available ciphers for sockets created with this context. It should be a string in the `OpenSSL cipher list format - `_. + `_. If no cipher can be selected (because compile-time options or other configuration forbids use of all the specified ciphers), an :class:`SSLError` will be raised. @@ -1684,7 +1697,7 @@ to speed up repeated connections from the same clients. IDN-encoded internationalized domain name, the *server_name_callback* receives a decoded U-label (``"pythön.org"``). - If there is an decoding error on the server name, the TLS connection will + If there is a decoding error on the server name, the TLS connection will terminate with an :const:`ALERT_DESCRIPTION_INTERNAL_ERROR` fatal TLS alert message to the client. @@ -1816,7 +1829,7 @@ to speed up repeated connections from the same clients. .. method:: SSLContext.session_stats() Get statistics about the SSL sessions created or managed by this context. - A dictionary is returned which maps the names of each `piece of information `_ to their + A dictionary is returned which maps the names of each `piece of information `_ to their numeric values. For example, here is the total number of hits and misses in the session cache since the context was created:: @@ -1959,7 +1972,7 @@ to speed up repeated connections from the same clients. .. attribute:: SSLContext.security_level An integer representing the `security level - `_ + `_ for the context. This attribute is read-only. .. versionadded:: 3.10 @@ -2556,7 +2569,7 @@ Verifying certificates When calling the :class:`SSLContext` constructor directly, :const:`CERT_NONE` is the default. Since it does not authenticate the other -peer, it can be insecure, especially in client mode where most of time you +peer, it can be insecure, especially in client mode where most of the time you would like to ensure the authenticity of the server you're talking to. Therefore, when in client mode, it is highly recommended to use :const:`CERT_REQUIRED`. However, it is in itself not sufficient; you also @@ -2605,7 +2618,7 @@ enabled when negotiating a SSL session is possible through the :meth:`SSLContext.set_ciphers` method. Starting from Python 3.2.3, the ssl module disables certain weak ciphers by default, but you may want to further restrict the cipher choice. Be sure to read OpenSSL's documentation -about the `cipher list format `_. +about the `cipher list format `_. If you want to check which ciphers are enabled by a given cipher list, use :meth:`SSLContext.get_ciphers` or the ``openssl ciphers`` command on your system. diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst index 6da3bced..ce1b8a11 100644 --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -73,7 +73,7 @@ or sample. ======================= =============================================================== :func:`mean` Arithmetic mean ("average") of data. -:func:`fmean` Fast, floating point arithmetic mean, with optional weighting. +:func:`fmean` Fast, floating-point arithmetic mean, with optional weighting. :func:`geometric_mean` Geometric mean of data. :func:`harmonic_mean` Harmonic mean of data. :func:`median` Median (middle value) of data. @@ -408,6 +408,12 @@ However, for reading convenience, most of the examples show sorted sequences. >>> mode(["red", "blue", "blue", "red", "green", "red", "red"]) 'red' + Only hashable inputs are supported. To handle type :class:`set`, + consider casting to :class:`frozenset`. To handle type :class:`list`, + consider casting to :class:`tuple`. For mixed or nested inputs, consider + using this slower quadratic algorithm that only depends on equality tests: + ``max(data, key=data.count)``. + .. versionchanged:: 3.8 Now handles multimodal datasets by returning the first mode encountered. Formerly, it raised :exc:`StatisticsError` when more than one mode was diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index d11bfb80..cc67a378 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -209,18 +209,18 @@ Numeric Types --- :class:`int`, :class:`float`, :class:`complex` pair: object; numeric pair: object; Boolean pair: object; integer - pair: object; floating point + pair: object; floating-point pair: object; complex number pair: C; language -There are three distinct numeric types: :dfn:`integers`, :dfn:`floating -point numbers`, and :dfn:`complex numbers`. In addition, Booleans are a -subtype of integers. Integers have unlimited precision. Floating point +There are three distinct numeric types: :dfn:`integers`, :dfn:`floating-point +numbers`, and :dfn:`complex numbers`. In addition, Booleans are a +subtype of integers. Integers have unlimited precision. Floating-point numbers are usually implemented using :c:expr:`double` in C; information -about the precision and internal representation of floating point +about the precision and internal representation of floating-point numbers for the machine on which your program is running is available in :data:`sys.float_info`. Complex numbers have a real and imaginary -part, which are each a floating point number. To extract these parts +part, which are each a floating-point number. To extract these parts from a complex number *z*, use ``z.real`` and ``z.imag``. (The standard library includes the additional numeric types :mod:`fractions.Fraction`, for rationals, and :mod:`decimal.Decimal`, for floating-point numbers with @@ -229,7 +229,7 @@ user-definable precision.) .. index:: pair: numeric; literals pair: integer; literals - pair: floating point; literals + pair: floating-point; literals pair: complex number; literals pair: hexadecimal; literals pair: octal; literals @@ -238,7 +238,7 @@ user-definable precision.) Numbers are created by numeric literals or as the result of built-in functions and operators. Unadorned integer literals (including hex, octal and binary numbers) yield integers. Numeric literals containing a decimal point or an -exponent sign yield floating point numbers. Appending ``'j'`` or ``'J'`` to a +exponent sign yield floating-point numbers. Appending ``'j'`` or ``'J'`` to a numeric literal yields an imaginary number (a complex number with a zero real part) which you can add to an integer or float to get a complex number with real and imaginary parts. @@ -832,7 +832,7 @@ over ``&``, ``|`` and ``^``. .. deprecated:: 3.12 The use of the bitwise inversion operator ``~`` is deprecated and will - raise an error in Python 3.14. + raise an error in Python 3.16. :class:`bool` is a subclass of :class:`int` (see :ref:`typesnumeric`). In many numeric contexts, ``False`` and ``True`` behave like the integers 0 and 1, respectively. @@ -1209,8 +1209,9 @@ accepts integers that meet the value restriction ``0 <= x <= 255``). | ``s.pop()`` or ``s.pop(i)`` | retrieves the item at *i* and | \(2) | | | also removes it from *s* | | +------------------------------+--------------------------------+---------------------+ -| ``s.remove(x)`` | remove the first item from *s* | \(3) | -| | where ``s[i]`` is equal to *x* | | +| ``s.remove(x)`` | removes the first item from | \(3) | +| | *s* where ``s[i]`` is equal to | | +| | *x* | | +------------------------------+--------------------------------+---------------------+ | ``s.reverse()`` | reverses the items of *s* in | \(4) | | | place | | @@ -1220,7 +1221,7 @@ accepts integers that meet the value restriction ``0 <= x <= 255``). Notes: (1) - *t* must have the same length as the slice it is replacing. + If *k* is not equal to ``1``, *t* must have the same length as the slice it is replacing. (2) The optional argument *i* defaults to ``-1``, so that by default the last @@ -1497,8 +1498,8 @@ objects that compare equal might have different :attr:`~range.start`, .. seealso:: * The `linspace recipe `_ - shows how to implement a lazy version of range suitable for floating - point applications. + shows how to implement a lazy version of range suitable for floating-point + applications. .. index:: single: string; text sequence type @@ -2092,8 +2093,9 @@ expression support in the :mod:`re` module). If *sep* is given, consecutive delimiters are not grouped together and are deemed to delimit empty strings (for example, ``'1,,2'.split(',')`` returns ``['1', '', '2']``). The *sep* argument may consist of multiple characters - (for example, ``'1<>2<>3'.split('<>')`` returns ``['1', '2', '3']``). - Splitting an empty string with a specified separator returns ``['']``. + as a single delimiter (to split with multiple delimiters, use + :func:`re.split`). Splitting an empty string with a specified separator + returns ``['']``. For example:: @@ -2103,6 +2105,8 @@ expression support in the :mod:`re` module). ['1', '2,3'] >>> '1,2,,3,'.split(',') ['1', '2', '', '3', ''] + >>> '1<>2<>3<4'.split('<>') + ['1', '2', '3<4'] If *sep* is not specified or is ``None``, a different splitting algorithm is applied: runs of consecutive whitespace are regarded as a single separator, @@ -2430,19 +2434,19 @@ The conversion types are: +------------+-----------------------------------------------------+-------+ | ``'X'`` | Signed hexadecimal (uppercase). | \(2) | +------------+-----------------------------------------------------+-------+ -| ``'e'`` | Floating point exponential format (lowercase). | \(3) | +| ``'e'`` | Floating-point exponential format (lowercase). | \(3) | +------------+-----------------------------------------------------+-------+ -| ``'E'`` | Floating point exponential format (uppercase). | \(3) | +| ``'E'`` | Floating-point exponential format (uppercase). | \(3) | +------------+-----------------------------------------------------+-------+ -| ``'f'`` | Floating point decimal format. | \(3) | +| ``'f'`` | Floating-point decimal format. | \(3) | +------------+-----------------------------------------------------+-------+ -| ``'F'`` | Floating point decimal format. | \(3) | +| ``'F'`` | Floating-point decimal format. | \(3) | +------------+-----------------------------------------------------+-------+ -| ``'g'`` | Floating point format. Uses lowercase exponential | \(4) | +| ``'g'`` | Floating-point format. Uses lowercase exponential | \(4) | | | format if exponent is less than -4 or not less than | | | | precision, decimal format otherwise. | | +------------+-----------------------------------------------------+-------+ -| ``'G'`` | Floating point format. Uses uppercase exponential | \(4) | +| ``'G'`` | Floating-point format. Uses uppercase exponential | \(4) | | | format if exponent is less than -4 or not less than | | | | precision, decimal format otherwise. | | +------------+-----------------------------------------------------+-------+ @@ -3140,10 +3144,9 @@ produce new objects. If *sep* is given, consecutive delimiters are not grouped together and are deemed to delimit empty subsequences (for example, ``b'1,,2'.split(b',')`` returns ``[b'1', b'', b'2']``). The *sep* argument may consist of a - multibyte sequence (for example, ``b'1<>2<>3'.split(b'<>')`` returns - ``[b'1', b'2', b'3']``). Splitting an empty sequence with a specified - separator returns ``[b'']`` or ``[bytearray(b'')]`` depending on the type - of object being split. The *sep* argument may be any + multibyte sequence as a single delimiter. Splitting an empty sequence with + a specified separator returns ``[b'']`` or ``[bytearray(b'')]`` depending + on the type of object being split. The *sep* argument may be any :term:`bytes-like object`. For example:: @@ -3154,6 +3157,8 @@ produce new objects. [b'1', b'2,3'] >>> b'1,2,,3,'.split(b',') [b'1', b'2', b'', b'3', b''] + >>> b'1<>2<>3<4'.split(b'<>') + [b'1', b'2', b'3<4'] If *sep* is not specified or is ``None``, a different splitting algorithm is applied: runs of consecutive ASCII whitespace are regarded as a single @@ -3427,7 +3432,7 @@ place, and instead produce new objects. ``b'abcdefghijklmnopqrstuvwxyz'``. Uppercase ASCII characters are those byte values in the sequence ``b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'``. - Unlike :func:`str.swapcase()`, it is always the case that + Unlike :func:`str.swapcase`, it is always the case that ``bin.swapcase().swapcase() == bin`` for the binary versions. Case conversions are symmetrical in ASCII, even though that is not generally true for arbitrary Unicode code points. @@ -3648,19 +3653,19 @@ The conversion types are: +------------+-----------------------------------------------------+-------+ | ``'X'`` | Signed hexadecimal (uppercase). | \(2) | +------------+-----------------------------------------------------+-------+ -| ``'e'`` | Floating point exponential format (lowercase). | \(3) | +| ``'e'`` | Floating-point exponential format (lowercase). | \(3) | +------------+-----------------------------------------------------+-------+ -| ``'E'`` | Floating point exponential format (uppercase). | \(3) | +| ``'E'`` | Floating-point exponential format (uppercase). | \(3) | +------------+-----------------------------------------------------+-------+ -| ``'f'`` | Floating point decimal format. | \(3) | +| ``'f'`` | Floating-point decimal format. | \(3) | +------------+-----------------------------------------------------+-------+ -| ``'F'`` | Floating point decimal format. | \(3) | +| ``'F'`` | Floating-point decimal format. | \(3) | +------------+-----------------------------------------------------+-------+ -| ``'g'`` | Floating point format. Uses lowercase exponential | \(4) | +| ``'g'`` | Floating-point format. Uses lowercase exponential | \(4) | | | format if exponent is less than -4 or not less than | | | | precision, decimal format otherwise. | | +------------+-----------------------------------------------------+-------+ -| ``'G'`` | Floating point format. Uses uppercase exponential | \(4) | +| ``'G'`` | Floating-point format. Uses uppercase exponential | \(4) | | | format if exponent is less than -4 or not less than | | | | precision, decimal format otherwise. | | +------------+-----------------------------------------------------+-------+ @@ -3882,7 +3887,7 @@ copying. >>> a == b False - Note that, as with floating point numbers, ``v is w`` does *not* imply + Note that, as with floating-point numbers, ``v is w`` does *not* imply ``v == w`` for memoryview objects. .. versionchanged:: 3.3 @@ -3973,7 +3978,7 @@ copying. dangling resources) as soon as possible. After this method has been called, any further operation on the view - raises a :class:`ValueError` (except :meth:`release()` itself which can + raises a :class:`ValueError` (except :meth:`release` itself which can be called multiple times):: >>> m = memoryview(b'abc') @@ -4455,14 +4460,14 @@ can be used interchangeably to index the same dictionary entry. ``dict([('foo', 100), ('bar', 200)])``, ``dict(foo=100, bar=200)`` If no positional argument is given, an empty dictionary is created. - If a positional argument is given and it is a mapping object, a dictionary - is created with the same key-value pairs as the mapping object. Otherwise, - the positional argument must be an :term:`iterable` object. Each item in - the iterable must itself be an iterable with exactly two objects. The - first object of each item becomes a key in the new dictionary, and the - second object the corresponding value. If a key occurs more than once, the - last value for that key becomes the corresponding value in the new - dictionary. + If a positional argument is given and it defines a ``keys()`` method, a + dictionary is created by calling :meth:`~object.__getitem__` on the argument with + each returned key from the method. Otherwise, the positional argument must be an + :term:`iterable` object. Each item in the iterable must itself be an iterable + with exactly two elements. The first element of each item becomes a key in the + new dictionary, and the second element the corresponding value. If a key occurs + more than once, the last value for that key becomes the corresponding value in + the new dictionary. If keyword arguments are given, the keyword arguments and their values are added to the dictionary created from the positional argument. If a key @@ -4556,7 +4561,7 @@ can be used interchangeably to index the same dictionary entry. Return a shallow copy of the dictionary. - .. classmethod:: fromkeys(iterable, value=None) + .. classmethod:: fromkeys(iterable, value=None, /) Create a new dictionary with keys from *iterable* and values set to *value*. @@ -4619,10 +4624,11 @@ can be used interchangeably to index the same dictionary entry. Update the dictionary with the key/value pairs from *other*, overwriting existing keys. Return ``None``. - :meth:`update` accepts either another dictionary object or an iterable of - key/value pairs (as tuples or other iterables of length two). If keyword - arguments are specified, the dictionary is then updated with those - key/value pairs: ``d.update(red=1, blue=2)``. + :meth:`update` accepts either another object with a ``keys()`` method (in + which case :meth:`~object.__getitem__` is called with every key returned from + the method) or an iterable of key/value pairs (as tuples or other iterables + of length two). If keyword arguments are specified, the dictionary is then + updated with those key/value pairs: ``d.update(red=1, blue=2)``. .. method:: values() @@ -5472,22 +5478,6 @@ types, where they are relevant. Some of these are not reported by the :func:`dir` built-in function. -.. attribute:: object.__dict__ - - A dictionary or other mapping object used to store an object's (writable) - attributes. - - -.. attribute:: instance.__class__ - - The class to which a class instance belongs. - - -.. attribute:: class.__bases__ - - The tuple of base classes of a class object. - - .. attribute:: definition.__name__ The name of the class, function, method, descriptor, or @@ -5502,35 +5492,23 @@ types, where they are relevant. Some of these are not reported by the .. versionadded:: 3.3 -.. attribute:: definition.__type_params__ - - The :ref:`type parameters ` of generic classes, functions, - and :ref:`type aliases `. - - .. versionadded:: 3.12 +.. attribute:: definition.__module__ + The name of the module in which a class or function was defined. -.. attribute:: class.__mro__ - This attribute is a tuple of classes that are considered when looking for - base classes during method resolution. +.. attribute:: definition.__doc__ + The documentation string of a class or function, or ``None`` if undefined. -.. method:: class.mro() - This method can be overridden by a metaclass to customize the method - resolution order for its instances. It is called at class instantiation, and - its result is stored in :attr:`~class.__mro__`. - - -.. method:: class.__subclasses__ +.. attribute:: definition.__type_params__ - Each class keeps a list of weak references to its immediate subclasses. This - method returns a list of all those references still alive. The list is in - definition order. Example:: + The :ref:`type parameters ` of generic classes, functions, + and :ref:`type aliases `. For classes and functions that + are not generic, this will be an empty tuple. - >>> int.__subclasses__() - [, , , ] + .. versionadded:: 3.12 .. _int_max_str_digits: diff --git a/Doc/library/string.rst b/Doc/library/string.rst index c3c0d732..a000bb49 100644 --- a/Doc/library/string.rst +++ b/Doc/library/string.rst @@ -350,8 +350,9 @@ The meaning of the various alignment options is as follows: | ``'='`` | Forces the padding to be placed after the sign (if any) | | | but before the digits. This is used for printing fields | | | in the form '+000000120'. This alignment option is only | -| | valid for numeric types. It becomes the default for | -| | numbers when '0' immediately precedes the field width. | +| | valid for numeric types, excluding :class:`complex`. | +| | It becomes the default for numbers when '0' immediately | +| | precedes the field width. | +---------+----------------------------------------------------------+ | ``'^'`` | Forces the field to be centered within the available | | | space. | @@ -418,7 +419,7 @@ instead. .. index:: single: _ (underscore); in string formatting The ``'_'`` option signals the use of an underscore for a thousands -separator for floating point presentation types and for integer +separator for floating-point presentation types and for integer presentation type ``'d'``. For integer presentation types ``'b'``, ``'o'``, ``'x'``, and ``'X'``, underscores will be inserted every 4 digits. For other presentation types, specifying this option is an @@ -432,9 +433,9 @@ including any prefixes, separators, and other formatting characters. If not specified, then the field width will be determined by the content. When no explicit alignment is given, preceding the *width* field by a zero -(``'0'``) character enables -sign-aware zero-padding for numeric types. This is equivalent to a *fill* -character of ``'0'`` with an *alignment* type of ``'='``. +(``'0'``) character enables sign-aware zero-padding for numeric types, +excluding :class:`complex`. This is equivalent to a *fill* character of +``'0'`` with an *alignment* type of ``'='``. .. versionchanged:: 3.10 Preceding the *width* field by ``'0'`` no longer affects the default @@ -491,9 +492,9 @@ The available integer presentation types are: +---------+----------------------------------------------------------+ In addition to the above presentation types, integers can be formatted -with the floating point presentation types listed below (except +with the floating-point presentation types listed below (except ``'n'`` and ``None``). When doing so, :func:`float` is used to convert the -integer to a floating point number before formatting. +integer to a floating-point number before formatting. The available presentation types for :class:`float` and :class:`~decimal.Decimal` values are: @@ -509,9 +510,8 @@ The available presentation types for :class:`float` and | | significant digits. With no precision given, uses a | | | precision of ``6`` digits after the decimal point for | | | :class:`float`, and shows all coefficient digits | - | | for :class:`~decimal.Decimal`. If no digits follow the | - | | decimal point, the decimal point is also removed unless | - | | the ``#`` option is used. | + | | for :class:`~decimal.Decimal`. If ``p=0``, the decimal | + | | point is omitted unless the ``#`` option is used. | +---------+----------------------------------------------------------+ | ``'E'`` | Scientific notation. Same as ``'e'`` except it uses | | | an upper case 'E' as the separator character. | @@ -522,9 +522,8 @@ The available presentation types for :class:`float` and | | precision given, uses a precision of ``6`` digits after | | | the decimal point for :class:`float`, and uses a | | | precision large enough to show all coefficient digits | - | | for :class:`~decimal.Decimal`. If no digits follow the | - | | decimal point, the decimal point is also removed unless | - | | the ``#`` option is used. | + | | for :class:`~decimal.Decimal`. If ``p=0``, the decimal | + | | point is omitted unless the ``#`` option is used. | +---------+----------------------------------------------------------+ | ``'F'`` | Fixed-point notation. Same as ``'f'``, but converts | | | ``nan`` to ``NAN`` and ``inf`` to ``INF``. | @@ -574,11 +573,13 @@ The available presentation types for :class:`float` and | ``'%'`` | Percentage. Multiplies the number by 100 and displays | | | in fixed (``'f'``) format, followed by a percent sign. | +---------+----------------------------------------------------------+ - | None | For :class:`float` this is the same as ``'g'``, except | + | None | For :class:`float` this is like the ``'g'`` type, except | | | that when fixed-point notation is used to format the | | | result, it always includes at least one digit past the | - | | decimal point. The precision used is as large as needed | - | | to represent the given value faithfully. | + | | decimal point, and switches to the scientific notation | + | | when ``exp >= p - 1``. When the precision is not | + | | specified, the latter will be as large as needed to | + | | represent the given value faithfully. | | | | | | For :class:`~decimal.Decimal`, this is the same as | | | either ``'g'`` or ``'G'`` depending on the value of | @@ -588,6 +589,20 @@ The available presentation types for :class:`float` and | | as altered by the other format modifiers. | +---------+----------------------------------------------------------+ +The result should be correctly rounded to a given precision ``p`` of digits +after the decimal point. The rounding mode for :class:`float` matches that +of the :func:`round` builtin. For :class:`~decimal.Decimal`, the rounding +mode of the current :ref:`context ` will be used. + +The available presentation types for :class:`complex` are the same as those for +:class:`float` (``'%'`` is not allowed). Both the real and imaginary components +of a complex number are formatted as floating-point numbers, according to the +specified presentation type. They are separated by the mandatory sign of the +imaginary part, the latter being terminated by a ``j`` suffix. If the presentation +type is missing, the result will match the output of :func:`str` (complex numbers with +a non-zero real part are also surrounded by parentheses), possibly altered by +other format modifiers. + .. _formatexamples: diff --git a/Doc/library/struct.rst b/Doc/library/struct.rst index 346784d8..29bce521 100644 --- a/Doc/library/struct.rst +++ b/Doc/library/struct.rst @@ -275,9 +275,9 @@ Notes: (1) .. index:: single: ? (question mark); in struct format strings - The ``'?'`` conversion code corresponds to the :c:expr:`_Bool` type defined by - C99. If this type is not available, it is simulated using a :c:expr:`char`. In - standard mode, it is always represented by one byte. + The ``'?'`` conversion code corresponds to the :c:expr:`_Bool` type + defined by C standards since C99. In standard mode, it is + represented by one byte. (2) When attempting to pack a non-integer using any of the integer conversion diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index 33f96a2f..755ff4c6 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -608,7 +608,7 @@ functions. If *group* is not ``None``, the setregid() system call will be made in the child process prior to the execution of the subprocess. If the provided - value is a string, it will be looked up via :func:`grp.getgrnam()` and + value is a string, it will be looked up via :func:`grp.getgrnam` and the value in ``gr_gid`` will be used. If the value is an integer, it will be passed verbatim. (POSIX only) @@ -618,7 +618,7 @@ functions. If *extra_groups* is not ``None``, the setgroups() system call will be made in the child process prior to the execution of the subprocess. Strings provided in *extra_groups* will be looked up via - :func:`grp.getgrnam()` and the values in ``gr_gid`` will be used. + :func:`grp.getgrnam` and the values in ``gr_gid`` will be used. Integer values will be passed verbatim. (POSIX only) .. availability:: POSIX @@ -626,7 +626,7 @@ functions. If *user* is not ``None``, the setreuid() system call will be made in the child process prior to the execution of the subprocess. If the provided - value is a string, it will be looked up via :func:`pwd.getpwnam()` and + value is a string, it will be looked up via :func:`pwd.getpwnam` and the value in ``pw_uid`` will be used. If the value is an integer, it will be passed verbatim. (POSIX only) @@ -1110,7 +1110,7 @@ The :mod:`subprocess` module exposes the following constants. .. data:: NORMAL_PRIORITY_CLASS A :class:`Popen` ``creationflags`` parameter to specify that a new process - will have an normal priority. (default) + will have a normal priority. (default) .. versionadded:: 3.7 diff --git a/Doc/library/symtable.rst b/Doc/library/symtable.rst index fc2d79b7..de9a9615 100644 --- a/Doc/library/symtable.rst +++ b/Doc/library/symtable.rst @@ -127,8 +127,39 @@ Examining Symbol Tables .. method:: get_methods() - Return a tuple containing the names of methods declared in the class. - + Return a tuple containing the names of method-like functions declared + in the class. + + Here, the term 'method' designates *any* function defined in the class + body via :keyword:`def` or :keyword:`async def`. + + Functions defined in a deeper scope (e.g., in an inner class) are not + picked up by :meth:`get_methods`. + + For example: + + >>> import symtable + >>> st = symtable.symtable(''' + ... def outer(): pass + ... + ... class A: + ... def f(): + ... def w(): pass + ... + ... def g(self): pass + ... + ... @classmethod + ... async def h(cls): pass + ... + ... global outer + ... def outer(self): pass + ... ''', 'test', 'exec') + >>> class_A = st.get_children()[1] + >>> class_A.get_methods() + ('f', 'g', 'h') + + Although ``A().f()`` raises :exc:`TypeError` at runtime, ``A.f`` is still + considered as a method-like function. .. class:: Symbol diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 03f1f309..90c794e3 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -724,11 +724,11 @@ always available. regardless of their size. This function is mainly useful for tracking and debugging memory leaks. Because of the interpreter's internal caches, the result can vary from call to call; you may have to call - :func:`_clear_type_cache()` and :func:`gc.collect()` to get more + :func:`_clear_type_cache` and :func:`gc.collect` to get more predictable results. If a Python build or implementation cannot reasonably compute this - information, :func:`getallocatedblocks()` is allowed to return 0 instead. + information, :func:`getallocatedblocks` is allowed to return 0 instead. .. versionadded:: 3.4 @@ -907,6 +907,35 @@ always available. It is not guaranteed to exist in all implementations of Python. +.. function:: getobjects(limit[, type]) + + This function only exists if CPython was built using the + specialized configure option :option:`--with-trace-refs`. + It is intended only for debugging garbage-collection issues. + + Return a list of up to *limit* dynamically allocated Python objects. + If *type* is given, only objects of that exact type (not subtypes) + are included. + + Objects from the list are not safe to use. + Specifically, the result will include objects from all interpreters that + share their object allocator state (that is, ones created with + :c:member:`PyInterpreterConfig.use_main_obmalloc` set to 1 + or using :c:func:`Py_NewInterpreter`, and the + :ref:`main interpreter `). + Mixing objects from different interpreters may lead to crashes + or other unexpected behavior. + + .. impl-detail:: + + This function should be used for specialized purposes only. + It is not guaranteed to exist in all implementations of Python. + + .. versionchanged:: 3.12.8 + + The result may include objects from other interpreters. + + .. function:: getprofile() .. index:: @@ -1239,7 +1268,8 @@ always available. that implement Python's default import semantics. The :meth:`~importlib.abc.MetaPathFinder.find_spec` method is called with at least the absolute name of the module being imported. If the module to be - imported is contained in a package, then the parent package's :attr:`__path__` + imported is contained in a package, then the parent package's + :attr:`~module.__path__` attribute is passed in as a second argument. The method returns a :term:`module spec`, or ``None`` if the module cannot be found. diff --git a/Doc/library/sysconfig.rst b/Doc/library/sysconfig.rst index 75672913..aaccc043 100644 --- a/Doc/library/sysconfig.rst +++ b/Doc/library/sysconfig.rst @@ -305,7 +305,7 @@ Installation path functions mix with those by the other. End users should not use this function, but :func:`get_default_scheme` and - :func:`get_preferred_scheme()` instead. + :func:`get_preferred_scheme` instead. .. versionadded:: 3.10 @@ -376,7 +376,7 @@ Other functions This is used mainly to distinguish platform-specific build directories and platform-specific built distributions. Typically includes the OS name and - version and the architecture (as supplied by 'os.uname()'), although the + version and the architecture (as supplied by :func:`os.uname`), although the exact information included depends on the OS; e.g., on Linux, the kernel version isn't particularly important. diff --git a/Doc/library/tarfile.rst b/Doc/library/tarfile.rst index bd745c78..0352cddb 100644 --- a/Doc/library/tarfile.rst +++ b/Doc/library/tarfile.rst @@ -608,7 +608,7 @@ be finalized; only the internally used file object will be closed. See the it is best practice to only do so in top-level applications or :mod:`site configuration `. To set a global default this way, a filter function needs to be wrapped in - :func:`staticmethod()` to prevent injection of a ``self`` argument. + :func:`staticmethod` to prevent injection of a ``self`` argument. .. method:: TarFile.add(name, arcname=None, recursive=True, *, filter=None) diff --git a/Doc/library/test.rst b/Doc/library/test.rst index 64bf8174..71661896 100644 --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -940,7 +940,7 @@ The :mod:`test.support` module defines the following functions: other modules, possibly a C backend (like ``csv`` and its ``_csv``). The *extra* argument can be a set of names that wouldn't otherwise be automatically - detected as "public", like objects without a proper ``__module__`` + detected as "public", like objects without a proper :attr:`~definition.__module__` attribute. If provided, it will be added to the automatically detected ones. The *not_exported* argument can be a set of names that must not be treated @@ -1695,7 +1695,7 @@ The :mod:`test.support.warnings_helper` module provides support for warnings tes .. function:: check_warnings(*filters, quiet=True) - A convenience wrapper for :func:`warnings.catch_warnings()` that makes it + A convenience wrapper for :func:`warnings.catch_warnings` that makes it easier to test that a warning was correctly raised. It is approximately equivalent to calling ``warnings.catch_warnings(record=True)`` with :meth:`warnings.simplefilter` set to ``always`` and with the option to diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index c88dcabc..5d94a776 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -409,7 +409,7 @@ since it is impossible to detect the termination of alien threads. timeout occurs. When the *timeout* argument is present and not ``None``, it should be a - floating point number specifying a timeout for the operation in seconds + floating-point number specifying a timeout for the operation in seconds (or fractions thereof). As :meth:`~Thread.join` always returns ``None``, you must call :meth:`~Thread.is_alive` after :meth:`~Thread.join` to decide whether a timeout happened -- if the thread is still alive, the @@ -790,7 +790,7 @@ item to the buffer only needs to wake up one consumer thread. occurs. Once awakened or timed out, it re-acquires the lock and returns. When the *timeout* argument is present and not ``None``, it should be a - floating point number specifying a timeout for the operation in seconds + floating-point number specifying a timeout for the operation in seconds (or fractions thereof). When the underlying lock is an :class:`RLock`, it is not released using @@ -1014,10 +1014,10 @@ method. The :meth:`~Event.wait` method blocks until the flag is true. has not expired. The return value represents the reason that this blocking method returned; ``True`` if returning because the internal flag is set to true, or ``False`` if a timeout is given and - the the internal flag did not become true within the given wait time. + the internal flag did not become true within the given wait time. When the timeout argument is present and not ``None``, it should be a - floating point number specifying a timeout for the operation in seconds, + floating-point number specifying a timeout for the operation in seconds, or fractions thereof. .. versionchanged:: 3.1 diff --git a/Doc/library/time.rst b/Doc/library/time.rst index d792d563..db53296e 100644 --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -69,7 +69,7 @@ An explanation of some terminology and conventions is in order. systems, the clock "ticks" only 50 or 100 times a second. * On the other hand, the precision of :func:`.time` and :func:`sleep` is better - than their Unix equivalents: times are expressed as floating point numbers, + than their Unix equivalents: times are expressed as floating-point numbers, :func:`.time` returns the most accurate time available (using Unix :c:func:`!gettimeofday` where available), and :func:`sleep` will accept a time with a nonzero fraction (Unix :c:func:`!select` is used to implement this, where @@ -273,7 +273,7 @@ Functions This is the inverse function of :func:`localtime`. Its argument is the :class:`struct_time` or full 9-tuple (since the dst flag is needed; use ``-1`` as the dst flag if it is unknown) which expresses the time in *local* time, not - UTC. It returns a floating point number, for compatibility with :func:`.time`. + UTC. It returns a floating-point number, for compatibility with :func:`.time`. If the input value cannot be represented as a valid time, either :exc:`OverflowError` or :exc:`ValueError` will be raised (which depends on whether the invalid value is caught by Python or the underlying C libraries). @@ -358,7 +358,7 @@ Functions .. function:: sleep(secs) Suspend execution of the calling thread for the given number of seconds. - The argument may be a floating point number to indicate a more precise sleep + The argument may be a floating-point number to indicate a more precise sleep time. If the sleep is interrupted by a signal and no exception is raised by the @@ -372,7 +372,7 @@ Functions threads ready to run, the function returns immediately, and the thread continues execution. On Windows 8.1 and newer the implementation uses a `high-resolution timer - `_ + `_ which provides resolution of 100 nanoseconds. If *secs* is zero, ``Sleep(0)`` is used. Unix implementation: @@ -460,6 +460,9 @@ Functions | | | | | | | | +-----------+------------------------------------------------+-------+ + | ``%u`` | Day of the week (Monday is 1; Sunday is 7) | | + | | as a decimal number [1, 7]. | | + +-----------+------------------------------------------------+-------+ | ``%w`` | Weekday as a decimal number [0(Sunday),6]. | | | | | | +-----------+------------------------------------------------+-------+ @@ -492,6 +495,16 @@ Functions | ``%Z`` | Time zone name (no characters if no time zone | | | | exists). Deprecated. [1]_ | | +-----------+------------------------------------------------+-------+ + | ``%G`` | ISO 8601 year (similar to ``%Y`` but follows | | + | | the rules for the ISO 8601 calendar year). | | + | | The year starts with the week that contains | | + | | the first Thursday of the calendar year. | | + +-----------+------------------------------------------------+-------+ + | ``%V`` | ISO 8601 week number (as a decimal number | | + | | [01,53]). The first week of the year is the | | + | | one that contains the first Thursday of the | | + | | year. Weeks start on Monday. | | + +-----------+------------------------------------------------+-------+ | ``%%`` | A literal ``'%'`` character. | | +-----------+------------------------------------------------+-------+ @@ -642,13 +655,13 @@ Functions .. function:: time() -> float - Return the time in seconds since the epoch_ as a floating point + Return the time in seconds since the epoch_ as a floating-point number. The handling of `leap seconds`_ is platform dependent. On Windows and most Unix systems, the leap seconds are not counted towards the time in seconds since the epoch_. This is commonly referred to as `Unix time `_. - Note that even though the time is always returned as a floating point + Note that even though the time is always returned as a floating-point number, not all systems provide time with a better precision than 1 second. While this function normally returns non-decreasing values, it can return a lower value than a previous call if the system clock has been set back diff --git a/Doc/library/tkinter.rst b/Doc/library/tkinter.rst index fd9125bc..843e994d 100644 --- a/Doc/library/tkinter.rst +++ b/Doc/library/tkinter.rst @@ -58,7 +58,7 @@ details that are unchanged. * `Modern Tkinter for Busy Python Developers `_ By Mark Roseman. (ISBN 978-1999149567) - * `Python GUI programming with Tkinter `_ + * `Python GUI programming with Tkinter `_ By Alan D. Moore. (ISBN 978-1788835886) * `Programming Python `_ diff --git a/Doc/library/token.rst b/Doc/library/token.rst index 9368ced9..6d06ae82 100644 --- a/Doc/library/token.rst +++ b/Doc/library/token.rst @@ -75,10 +75,17 @@ the :mod:`tokenize` module. :noindex: Token value indicating that a type comment was recognized. Such - tokens are only produced when :func:`ast.parse()` is invoked with + tokens are only produced when :func:`ast.parse` is invoked with ``type_comments=True``. +.. data:: EXACT_TOKEN_TYPES + + A dictionary mapping the string representation of a token to its numeric code. + + .. versionadded:: 3.8 + + .. versionchanged:: 3.5 Added :data:`AWAIT` and :data:`ASYNC` tokens. diff --git a/Doc/library/tomllib.rst b/Doc/library/tomllib.rst index b523ad93..521a7a17 100644 --- a/Doc/library/tomllib.rst +++ b/Doc/library/tomllib.rst @@ -13,7 +13,7 @@ -------------- -This module provides an interface for parsing TOML (Tom's Obvious Minimal +This module provides an interface for parsing TOML 1.0.0 (Tom's Obvious Minimal Language, `https://toml.io `_). This module does not support writing TOML. diff --git a/Doc/library/traceback.rst b/Doc/library/traceback.rst index 85dae821..9d57c354 100644 --- a/Doc/library/traceback.rst +++ b/Doc/library/traceback.rst @@ -8,11 +8,15 @@ -------------- -This module provides a standard interface to extract, format and print stack -traces of Python programs. It exactly mimics the behavior of the Python -interpreter when it prints a stack trace. This is useful when you want to print -stack traces under program control, such as in a "wrapper" around the -interpreter. +This module provides a standard interface to extract, format and print +stack traces of Python programs. It is more flexible than the +interpreter's default traceback display, and therefore makes it +possible to configure certain aspects of the output. Finally, +it contains a utility for capturing enough information about an +exception to print it later, without the need to save a reference +to the actual exception. Since exceptions can be the roots of large +objects graph, this utility can significantly improve +memory management. .. index:: pair: object; traceback @@ -29,7 +33,20 @@ which are assigned to the :attr:`~BaseException.__traceback__` field of Module :mod:`pdb` Interactive source code debugger for Python programs. -The module defines the following functions: +The module's API can be divided into two parts: + +* Module-level functions offering basic functionality, which are useful for interactive + inspection of exceptions and tracebacks. + +* :class:`TracebackException` class and its helper classes + :class:`StackSummary` and :class:`FrameSummary`. These offer both more + flexibility in the output generated and the ability to store the information + necessary for later formatting without holding references to actual exception + and traceback objects. + + +Module-Level Functions +---------------------- .. function:: print_tb(tb, limit=None, file=None) @@ -42,6 +59,14 @@ The module defines the following functions: :term:`file ` or :term:`file-like object` to receive the output. + .. note:: + + The meaning of the *limit* parameter is different than the meaning + of :const:`sys.tracebacklimit`. A negative *limit* value corresponds to + a positive value of :const:`!sys.tracebacklimit`, whereas the behaviour of + a positive *limit* value cannot be achieved with + :const:`!sys.tracebacklimit`. + .. versionchanged:: 3.5 Added negative *limit* support. @@ -222,7 +247,6 @@ The module defines the following functions: .. versionadded:: 3.5 -The module also defines the following classes: :class:`!TracebackException` Objects ------------------------------------ @@ -230,12 +254,17 @@ The module also defines the following classes: .. versionadded:: 3.5 :class:`!TracebackException` objects are created from actual exceptions to -capture data for later printing in a lightweight fashion. +capture data for later printing. They offer a more lightweight method of +storing this information by avoiding holding references to +:ref:`traceback` and :ref:`frame` objects +In addition, they expose more options to configure the output compared to +the module-level functions described above. .. class:: TracebackException(exc_type, exc_value, exc_traceback, *, limit=None, lookup_lines=True, capture_locals=False, compact=False, max_group_width=15, max_group_depth=10) - Capture an exception for later rendering. *limit*, *lookup_lines* and - *capture_locals* are as for the :class:`StackSummary` class. + Capture an exception for later rendering. The meaning of *limit*, + *lookup_lines* and *capture_locals* are as for the :class:`StackSummary` + class. If *compact* is true, only data that is required by :class:`!TracebackException`'s :meth:`format` method @@ -480,8 +509,8 @@ in a :ref:`traceback `. .. _traceback-example: -Traceback Examples ------------------- +Examples of Using the Module-Level Functions +-------------------------------------------- This simple example implements a basic read-eval-print loop, similar to (but less useful than) the standard Python interactive interpreter loop. For a more @@ -520,8 +549,7 @@ exception and traceback: try: lumberjack() - except IndexError: - exc = sys.exception() + except IndexError as exc: print("*** print_tb:") traceback.print_tb(exc.__traceback__, limit=1, file=sys.stdout) print("*** print_exception:") @@ -619,5 +647,88 @@ This last example demonstrates the final few formatting functions: [' File "spam.py", line 3, in \n spam.eggs()\n', ' File "eggs.py", line 42, in eggs\n return "bacon"\n'] >>> an_error = IndexError('tuple index out of range') - >>> traceback.format_exception_only(type(an_error), an_error) + >>> traceback.format_exception_only(an_error) ['IndexError: tuple index out of range\n'] + + +Examples of Using :class:`TracebackException` +--------------------------------------------- + +With the helper class, we have more options:: + + >>> import sys + >>> from traceback import TracebackException + >>> + >>> def lumberjack(): + ... bright_side_of_life() + ... + >>> def bright_side_of_life(): + ... t = "bright", "side", "of", "life" + ... return t[5] + ... + >>> try: + ... lumberjack() + ... except IndexError as e: + ... exc = e + ... + >>> try: + ... try: + ... lumberjack() + ... except: + ... 1/0 + ... except Exception as e: + ... chained_exc = e + ... + >>> # limit works as with the module-level functions + >>> TracebackException.from_exception(exc, limit=-2).print() + Traceback (most recent call last): + File "", line 6, in lumberjack + bright_side_of_life() + ~~~~~~~~~~~~~~~~~~~^^ + File "", line 10, in bright_side_of_life + return t[5] + ~^^^ + IndexError: tuple index out of range + + >>> # capture_locals adds local variables in frames + >>> TracebackException.from_exception(exc, limit=-2, capture_locals=True).print() + Traceback (most recent call last): + File "", line 6, in lumberjack + bright_side_of_life() + ~~~~~~~~~~~~~~~~~~~^^ + File "", line 10, in bright_side_of_life + return t[5] + ~^^^ + t = ("bright", "side", "of", "life") + IndexError: tuple index out of range + + >>> # The *chain* kwarg to print() controls whether chained + >>> # exceptions are displayed + >>> TracebackException.from_exception(chained_exc).print() + Traceback (most recent call last): + File "", line 4, in + lumberjack() + ~~~~~~~~~~^^ + File "", line 7, in lumberjack + bright_side_of_life() + ~~~~~~~~~~~~~~~~~~~^^ + File "", line 11, in bright_side_of_life + return t[5] + ~^^^ + IndexError: tuple index out of range + + During handling of the above exception, another exception occurred: + + Traceback (most recent call last): + File "", line 6, in + 1/0 + ~^~ + ZeroDivisionError: division by zero + + >>> TracebackException.from_exception(chained_exc).print(chain=False) + Traceback (most recent call last): + File "", line 6, in + 1/0 + ~^~ + ZeroDivisionError: division by zero + diff --git a/Doc/library/types.rst b/Doc/library/types.rst index 64263532..ce31a248 100644 --- a/Doc/library/types.rst +++ b/Doc/library/types.rst @@ -91,8 +91,8 @@ Dynamic Type Creation For classes that have an ``__orig_bases__`` attribute, this function returns the value of ``cls.__orig_bases__``. - For classes without the ``__orig_bases__`` attribute, ``cls.__bases__`` is - returned. + For classes without the ``__orig_bases__`` attribute, + :attr:`cls.__bases__ ` is returned. Examples:: @@ -260,63 +260,18 @@ Standard names are defined for the following types: The type of :term:`modules `. The constructor takes the name of the module to be created and optionally its :term:`docstring`. - .. note:: - Use :func:`importlib.util.module_from_spec` to create a new module if you - wish to set the various import-controlled attributes. - - .. attribute:: __doc__ - - The :term:`docstring` of the module. Defaults to ``None``. - - .. attribute:: __loader__ - - The :term:`loader` which loaded the module. Defaults to ``None``. - - This attribute is to match :attr:`importlib.machinery.ModuleSpec.loader` - as stored in the :attr:`__spec__` object. - - .. note:: - A future version of Python may stop setting this attribute by default. - To guard against this potential change, preferably read from the - :attr:`__spec__` attribute instead or use - ``getattr(module, "__loader__", None)`` if you explicitly need to use - this attribute. - - .. versionchanged:: 3.4 - Defaults to ``None``. Previously the attribute was optional. - - .. attribute:: __name__ - - The name of the module. Expected to match - :attr:`importlib.machinery.ModuleSpec.name`. - - .. attribute:: __package__ - - Which :term:`package` a module belongs to. If the module is top-level - (i.e. not a part of any specific package) then the attribute should be set - to ``''``, else it should be set to the name of the package (which can be - :attr:`__name__` if the module is a package itself). Defaults to ``None``. - - This attribute is to match :attr:`importlib.machinery.ModuleSpec.parent` - as stored in the :attr:`__spec__` object. - - .. note:: - A future version of Python may stop setting this attribute by default. - To guard against this potential change, preferably read from the - :attr:`__spec__` attribute instead or use - ``getattr(module, "__package__", None)`` if you explicitly need to use - this attribute. - - .. versionchanged:: 3.4 - Defaults to ``None``. Previously the attribute was optional. - - .. attribute:: __spec__ - - A record of the module's import-system-related state. Expected to be an - instance of :class:`importlib.machinery.ModuleSpec`. + .. seealso:: - .. versionadded:: 3.4 + :ref:`Documentation on module objects ` + Provides details on the special attributes that can be found on + instances of :class:`!ModuleType`. + :func:`importlib.util.module_from_spec` + Modules created using the :class:`!ModuleType` constructor are + created with many of their special attributes unset or set to default + values. :func:`!module_from_spec` provides a more robust way of + creating :class:`!ModuleType` instances which ensures the various + attributes are set appropriately. .. data:: EllipsisType @@ -392,7 +347,7 @@ Standard names are defined for the following types: In addition, when a class is defined with a :attr:`~object.__slots__` attribute, then for each slot, an instance of :class:`!MemberDescriptorType` will be added as an attribute - on the class. This allows the slot to appear in the class's :attr:`~object.__dict__`. + on the class. This allows the slot to appear in the class's :attr:`~type.__dict__`. .. impl-detail:: diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 1a5c21d3..54a19ae0 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -27,12 +27,13 @@ This module provides runtime support for type hints. Consider the function below:: - def moon_weight(earth_weight: float) -> str: - return f'On the moon, you would weigh {earth_weight * 0.166} kilograms.' + def surface_area_of_cube(edge_length: float) -> str: + return f"The surface area of the cube is {6 * edge_length ** 2}." -The function ``moon_weight`` takes an argument expected to be an instance of :class:`float`, -as indicated by the *type hint* ``earth_weight: float``. The function is expected to -return an instance of :class:`str`, as indicated by the ``-> str`` hint. +The function ``surface_area_of_cube`` takes an argument expected to +be an instance of :class:`float`, as indicated by the :term:`type hint` +``edge_length: float``. The function is expected to return an instance +of :class:`str`, as indicated by the ``-> str`` hint. While type hints can be simple classes like :class:`float` or :class:`str`, they can also be more complex. The :mod:`typing` module provides a vocabulary of @@ -97,8 +98,9 @@ Type aliases are useful for simplifying complex type signatures. For example:: # The static type checker will treat the previous type signature as # being exactly equivalent to this one. def broadcast_message( - message: str, - servers: Sequence[tuple[tuple[str, int], dict[str, str]]]) -> None: + message: str, + servers: Sequence[tuple[tuple[str, int], dict[str, str]]] + ) -> None: ... The :keyword:`type` statement is new in Python 3.12. For backwards @@ -206,7 +208,7 @@ Annotating callable objects =========================== Functions -- or other :term:`callable` objects -- can be annotated using -:class:`collections.abc.Callable` or :data:`typing.Callable`. +:class:`collections.abc.Callable` or deprecated :data:`typing.Callable`. ``Callable[[int], str]`` signifies a function that takes a single parameter of type :class:`int` and returns a :class:`str`. @@ -399,7 +401,7 @@ The type of class objects ========================= A variable annotated with ``C`` may accept a value of type ``C``. In -contrast, a variable annotated with ``type[C]`` (or +contrast, a variable annotated with ``type[C]`` (or deprecated :class:`typing.Type[C] `) may accept values that are classes themselves -- specifically, it will accept the *class object* of ``C``. For example:: @@ -439,6 +441,72 @@ For example:: ``type[Any]`` is equivalent to :class:`type`, which is the root of Python's :ref:`metaclass hierarchy `. + +.. _annotating-generators-and-coroutines: + +Annotating generators and coroutines +==================================== + +A generator can be annotated using the generic type +:class:`Generator[YieldType, SendType, ReturnType] `. +For example:: + + def echo_round() -> Generator[int, float, str]: + sent = yield 0 + while sent >= 0: + sent = yield round(sent) + return 'Done' + +Note that unlike many other generic classes in the standard library, +the ``SendType`` of :class:`~collections.abc.Generator` behaves +contravariantly, not covariantly or invariantly. + +If your generator will only yield values, set the ``SendType`` and +``ReturnType`` to ``None``:: + + def infinite_stream(start: int) -> Generator[int, None, None]: + while True: + yield start + start += 1 + +Alternatively, annotate your generator as having a return type of +either ``Iterable[YieldType]`` or ``Iterator[YieldType]``:: + + def infinite_stream(start: int) -> Iterator[int]: + while True: + yield start + start += 1 + +Async generators are handled in a similar fashion, but don't +expect a ``ReturnType`` type argument +(:class:`AsyncGenerator[YieldType, SendType] `):: + + async def infinite_stream(start: int) -> AsyncGenerator[int, None]: + while True: + yield start + start = await increment(start) + +As in the synchronous case, +:class:`AsyncIterable[YieldType] ` +and :class:`AsyncIterator[YieldType] ` are +available as well:: + + async def infinite_stream(start: int) -> AsyncIterator[int]: + while True: + yield start + start = await increment(start) + +Coroutines can be annotated using +:class:`Coroutine[YieldType, SendType, ReturnType] `. +Generic arguments correspond to those of :class:`~collections.abc.Generator`, +for example:: + + from collections.abc import Coroutine + c: Coroutine[list[str], str, int] # Some coroutine defined elsewhere + x = c.send('hi') # Inferred type of 'x' is list[str] + async def bar() -> None: + y = await c # Inferred type of 'y' is int + .. _user-defined-generics: User-defined generic types @@ -1337,6 +1405,23 @@ These can be used as types in annotations. They all support subscription using >>> X.__metadata__ ('very', 'important', 'metadata') + * At runtime, if you want to retrieve the original + type wrapped by ``Annotated``, use the :attr:`!__origin__` attribute: + + .. doctest:: + + >>> from typing import Annotated, get_origin + >>> Password = Annotated[str, "secret"] + >>> Password.__origin__ + + + Note that using :func:`get_origin` will return ``Annotated`` itself: + + .. doctest:: + + >>> get_origin(Password) + + .. seealso:: :pep:`593` - Flexible function and variable annotations @@ -1394,8 +1479,8 @@ These can be used as types in annotations. They all support subscription using print("Not a list of strings!") If ``is_str_list`` is a class or instance method, then the type in - ``TypeGuard`` maps to the type of the second parameter after ``cls`` or - ``self``. + ``TypeGuard`` maps to the type of the second parameter (after ``cls`` or + ``self``). In short, the form ``def foo(arg: TypeA) -> TypeGuard[TypeB]: ...``, means that if ``foo(arg)`` returns ``True``, then ``arg`` narrows from @@ -1524,11 +1609,11 @@ without the dedicated syntax, as documented below. class Sequence[T]: # T is a TypeVar ... - This syntax can also be used to create bound and constrained type + This syntax can also be used to create bounded and constrained type variables:: - class StrSequence[S: str]: # S is a TypeVar bound to str - ... + class StrSequence[S: str]: # S is a TypeVar with a `str` upper bound; + ... # we can say that S is "bounded by `str`" class StrOrBytesSequence[A: (str, bytes)]: # A is a TypeVar constrained to str or bytes @@ -1561,8 +1646,8 @@ without the dedicated syntax, as documented below. """Add two strings or bytes objects together.""" return x + y - Note that type variables can be *bound*, *constrained*, or neither, but - cannot be both bound *and* constrained. + Note that type variables can be *bounded*, *constrained*, or neither, but + cannot be both bounded *and* constrained. The variance of type variables is inferred by type checkers when they are created through the :ref:`type parameter syntax ` or when @@ -1572,8 +1657,8 @@ without the dedicated syntax, as documented below. By default, manually created type variables are invariant. See :pep:`484` and :pep:`695` for more details. - Bound type variables and constrained type variables have different - semantics in several important ways. Using a *bound* type variable means + Bounded type variables and constrained type variables have different + semantics in several important ways. Using a *bounded* type variable means that the ``TypeVar`` will be solved using the most specific type possible:: x = print_capitalized('a string') @@ -1587,8 +1672,8 @@ without the dedicated syntax, as documented below. z = print_capitalized(45) # error: int is not a subtype of str - Type variables can be bound to concrete types, abstract types (ABCs or - protocols), and even unions of types:: + The upper bound of a type variable can be a concrete type, abstract type + (ABC or Protocol), or even a union of types:: # Can be anything with an __abs__ method def print_abs[T: SupportsAbs](arg: T) -> None: @@ -1632,7 +1717,7 @@ without the dedicated syntax, as documented below. .. attribute:: __bound__ - The bound of the type variable, if any. + The upper bound of the type variable, if any. .. versionchanged:: 3.12 @@ -1749,8 +1834,8 @@ without the dedicated syntax, as documented below. of ``*args``:: def call_soon[*Ts]( - callback: Callable[[*Ts], None], - *args: *Ts + callback: Callable[[*Ts], None], + *args: *Ts ) -> None: ... callback(*args) @@ -1818,7 +1903,7 @@ without the dedicated syntax, as documented below. return x + y Without ``ParamSpec``, the simplest way to annotate this previously was to - use a :class:`TypeVar` with bound ``Callable[..., Any]``. However this + use a :class:`TypeVar` with upper bound ``Callable[..., Any]``. However this causes two problems: 1. The type checker can't type check the ``inner`` function because @@ -2011,7 +2096,9 @@ types. Backward-compatible usage:: - # For creating a generic NamedTuple on Python 3.11 or lower + # For creating a generic NamedTuple on Python 3.11 + T = TypeVar("T") + class Group(NamedTuple, Generic[T]): key: T group: list[T] @@ -2513,7 +2600,7 @@ Functions and decorators .. seealso:: `Unreachable Code and Exhaustiveness Checking - `__ has more + `__ has more information about exhaustiveness checking with static typing. .. versionadded:: 3.11 @@ -2896,7 +2983,8 @@ Introspection helpers empty dictionary is returned. * If *obj* is a class ``C``, the function returns a dictionary that merges annotations from ``C``'s base classes with those on ``C`` directly. This - is done by traversing ``C.__mro__`` and iteratively combining + is done by traversing :attr:`C.__mro__ ` and iteratively + combining ``__annotations__`` dictionaries. Annotations on classes appearing earlier in the :term:`method resolution order` always take precedence over annotations on classes appearing later in the method resolution order. @@ -2942,6 +3030,7 @@ Introspection helpers assert get_origin(str) is None assert get_origin(Dict[str, int]) is dict assert get_origin(Union[int, str]) is Union + assert get_origin(Annotated[str, "metadata"]) is Annotated P = ParamSpec('P') assert get_origin(P.args) is P assert get_origin(P.kwargs) is P @@ -3071,14 +3160,9 @@ Aliases to built-in types Deprecated alias to :class:`dict`. Note that to annotate arguments, it is preferred - to use an abstract collection type such as :class:`Mapping` + to use an abstract collection type such as :class:`~collections.abc.Mapping` rather than to use :class:`dict` or :class:`!typing.Dict`. - This type can be used as follows:: - - def count_words(text: str) -> Dict[str, int]: - ... - .. deprecated:: 3.9 :class:`builtins.dict ` now supports subscripting (``[]``). See :pep:`585` and :ref:`types-genericalias`. @@ -3088,16 +3172,9 @@ Aliases to built-in types Deprecated alias to :class:`list`. Note that to annotate arguments, it is preferred - to use an abstract collection type such as :class:`Sequence` or - :class:`Iterable` rather than to use :class:`list` or :class:`!typing.List`. - - This type may be used as follows:: - - def vec2[T: (int, float)](x: T, y: T) -> List[T]: - return [x, y] - - def keep_positives[T: (int, float)](vector: Sequence[T]) -> List[T]: - return [item for item in vector if item > 0] + to use an abstract collection type such as + :class:`~collections.abc.Sequence` or :class:`~collections.abc.Iterable` + rather than to use :class:`list` or :class:`!typing.List`. .. deprecated:: 3.9 :class:`builtins.list ` now supports subscripting (``[]``). @@ -3108,8 +3185,8 @@ Aliases to built-in types Deprecated alias to :class:`builtins.set `. Note that to annotate arguments, it is preferred - to use an abstract collection type such as :class:`AbstractSet` - rather than to use :class:`set` or :class:`!typing.Set`. + to use an abstract collection type such as :class:`collections.abc.Set` + rather than to use :class:`set` or :class:`typing.Set`. .. deprecated:: 3.9 :class:`builtins.set ` now supports subscripting (``[]``). @@ -3313,11 +3390,6 @@ Aliases to container ABCs in :mod:`collections.abc` Deprecated alias to :class:`collections.abc.Mapping`. - This type can be used as follows:: - - def get_position_in_index(word_list: Mapping[str, int], word: str) -> int: - return word_list[word] - .. deprecated:: 3.9 :class:`collections.abc.Mapping` now supports subscripting (``[]``). See :pep:`585` and :ref:`types-genericalias`. @@ -3381,14 +3453,9 @@ Aliases to asynchronous ABCs in :mod:`collections.abc` Deprecated alias to :class:`collections.abc.Coroutine`. - The variance and order of type variables - correspond to those of :class:`Generator`, for example:: - - from collections.abc import Coroutine - c: Coroutine[list[str], str, int] # Some coroutine defined elsewhere - x = c.send('hi') # Inferred type of 'x' is list[str] - async def bar() -> None: - y = await c # Inferred type of 'y' is int + See :ref:`annotating-generators-and-coroutines` + for details on using :class:`collections.abc.Coroutine` + and ``typing.Coroutine`` in type annotations. .. versionadded:: 3.5.3 @@ -3400,34 +3467,9 @@ Aliases to asynchronous ABCs in :mod:`collections.abc` Deprecated alias to :class:`collections.abc.AsyncGenerator`. - An async generator can be annotated by the generic type - ``AsyncGenerator[YieldType, SendType]``. For example:: - - async def echo_round() -> AsyncGenerator[int, float]: - sent = yield 0 - while sent >= 0.0: - rounded = await round(sent) - sent = yield rounded - - Unlike normal generators, async generators cannot return a value, so there - is no ``ReturnType`` type parameter. As with :class:`Generator`, the - ``SendType`` behaves contravariantly. - - If your generator will only yield values, set the ``SendType`` to - ``None``:: - - async def infinite_stream(start: int) -> AsyncGenerator[int, None]: - while True: - yield start - start = await increment(start) - - Alternatively, annotate your generator as having a return type of - either ``AsyncIterable[YieldType]`` or ``AsyncIterator[YieldType]``:: - - async def infinite_stream(start: int) -> AsyncIterator[int]: - while True: - yield start - start = await increment(start) + See :ref:`annotating-generators-and-coroutines` + for details on using :class:`collections.abc.AsyncGenerator` + and ``typing.AsyncGenerator`` in type annotations. .. versionadded:: 3.6.1 @@ -3506,34 +3548,9 @@ Aliases to other ABCs in :mod:`collections.abc` Deprecated alias to :class:`collections.abc.Generator`. - A generator can be annotated by the generic type - ``Generator[YieldType, SendType, ReturnType]``. For example:: - - def echo_round() -> Generator[int, float, str]: - sent = yield 0 - while sent >= 0: - sent = yield round(sent) - return 'Done' - - Note that unlike many other generics in the typing module, the ``SendType`` - of :class:`Generator` behaves contravariantly, not covariantly or - invariantly. - - If your generator will only yield values, set the ``SendType`` and - ``ReturnType`` to ``None``:: - - def infinite_stream(start: int) -> Generator[int, None, None]: - while True: - yield start - start += 1 - - Alternatively, annotate your generator as having a return type of - either ``Iterable[YieldType]`` or ``Iterator[YieldType]``:: - - def infinite_stream(start: int) -> Iterator[int]: - while True: - yield start - start += 1 + See :ref:`annotating-generators-and-coroutines` + for details on using :class:`collections.abc.Generator` + and ``typing.Generator`` in type annotations. .. deprecated:: 3.9 :class:`collections.abc.Generator` now supports subscripting (``[]``). diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst index 8dcb8c2a..84f34a06 100644 --- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -68,7 +68,7 @@ available, and then make assertions about how they have been used: 3 >>> thing.method.assert_called_with(3, 4, 5, key='value') -:attr:`side_effect` allows you to perform side effects, including raising an +:attr:`~Mock.side_effect` allows you to perform side effects, including raising an exception when a mock is called: >>> from unittest.mock import Mock @@ -237,7 +237,7 @@ the *new_callable* argument to :func:`patch`. Accessing any attribute not in this list will raise an :exc:`AttributeError`. If *spec* is an object (rather than a list of strings) then - :attr:`~instance.__class__` returns the class of the spec object. This + :attr:`~object.__class__` returns the class of the spec object. This allows mocks to pass :func:`isinstance` tests. * *spec_set*: A stricter variant of *spec*. If used, attempting to *set* @@ -397,6 +397,8 @@ the *new_callable* argument to :func:`patch`. The reset_mock method resets all the call attributes on a mock object: + .. doctest:: + >>> mock = Mock(return_value=None) >>> mock('hello') >>> mock.called @@ -405,20 +407,41 @@ the *new_callable* argument to :func:`patch`. >>> mock.called False - .. versionchanged:: 3.6 - Added two keyword-only arguments to the reset_mock function. - This can be useful where you want to make a series of assertions that - reuse the same object. Note that :meth:`reset_mock` *doesn't* clear the + reuse the same object. + + *return_value* parameter when set to ``True`` resets :attr:`return_value`: + + .. doctest:: + + >>> mock = Mock(return_value=5) + >>> mock('hello') + 5 + >>> mock.reset_mock(return_value=True) + >>> mock('hello') # doctest: +ELLIPSIS + + + *side_effect* parameter when set to ``True`` resets :attr:`side_effect`: + + .. doctest:: + + >>> mock = Mock(side_effect=ValueError) + >>> mock('hello') + Traceback (most recent call last): + ... + ValueError + >>> mock.reset_mock(side_effect=True) + >>> mock('hello') # doctest: +ELLIPSIS + + + Note that :meth:`reset_mock` *doesn't* clear the :attr:`return_value`, :attr:`side_effect` or any child attributes you have - set using normal assignment by default. In case you want to reset - :attr:`return_value` or :attr:`side_effect`, then pass the corresponding - parameter as ``True``. Child mocks and the return value mock - (if any) are reset as well. + set using normal assignment by default. - .. note:: *return_value*, and *side_effect* are keyword-only - arguments. + Child mocks are reset as well. + .. versionchanged:: 3.6 + Added two keyword-only arguments to the reset_mock function. .. method:: mock_add_spec(spec, spec_set=False) @@ -733,8 +756,8 @@ the *new_callable* argument to :func:`patch`. .. attribute:: __class__ - Normally the :attr:`__class__` attribute of an object will return its type. - For a mock object with a :attr:`spec`, ``__class__`` returns the spec class + Normally the :attr:`!__class__` attribute of an object will return its type. + For a mock object with a :attr:`!spec`, :attr:`!__class__` returns the spec class instead. This allows mock objects to pass :func:`isinstance` tests for the object they are replacing / masquerading as: @@ -742,7 +765,7 @@ the *new_callable* argument to :func:`patch`. >>> isinstance(mock, int) True - :attr:`__class__` is assignable to, this allows a mock to pass an + :attr:`!__class__` is assignable to, this allows a mock to pass an :func:`isinstance` check without forcing you to use a spec: >>> mock = Mock() @@ -756,8 +779,8 @@ the *new_callable* argument to :func:`patch`. meaning of :class:`Mock`, with the exception of *return_value* and *side_effect* which have no meaning on a non-callable mock. -Mock objects that use a class or an instance as a :attr:`spec` or -:attr:`spec_set` are able to pass :func:`isinstance` tests: +Mock objects that use a class or an instance as a :attr:`!spec` or +:attr:`!spec_set` are able to pass :func:`isinstance` tests: >>> mock = Mock(spec=SomeClass) >>> isinstance(mock, SomeClass) @@ -856,6 +879,20 @@ object:: 3 >>> p.assert_called_once_with() +.. caution:: + + If an :exc:`AttributeError` is raised by :class:`PropertyMock`, + it will be interpreted as a missing descriptor and + :meth:`~object.__getattr__` will be called on the parent mock:: + + >>> m = MagicMock() + >>> no_attribute = PropertyMock(side_effect=AttributeError) + >>> type(m).my_property = no_attribute + >>> m.my_property + + + See :meth:`~object.__getattr__` for details. + .. class:: AsyncMock(spec=None, side_effect=None, return_value=DEFAULT, wraps=None, name=None, spec_set=None, unsafe=False, **kwargs) @@ -1112,7 +1149,7 @@ Calls made to the object will be recorded in the attributes like :attr:`~Mock.call_args` and :attr:`~Mock.call_args_list`. If :attr:`~Mock.side_effect` is set then it will be called after the call has -been recorded, so if :attr:`side_effect` raises an exception the call is still +been recorded, so if :attr:`!side_effect` raises an exception the call is still recorded. The simplest way to make a mock raise an exception when called is to make @@ -1133,8 +1170,8 @@ The simplest way to make a mock raise an exception when called is to make >>> m.mock_calls [call(1, 2, 3), call('two', 'three', 'four')] -If :attr:`side_effect` is a function then whatever that function returns is what -calls to the mock return. The :attr:`side_effect` function is called with the +If :attr:`~Mock.side_effect` is a function then whatever that function returns is what +calls to the mock return. The :attr:`!side_effect` function is called with the same arguments as the mock. This allows you to vary the return value of the call dynamically, based on the input: @@ -1151,7 +1188,7 @@ call dynamically, based on the input: If you want the mock to still return the default return value (a new mock), or any set return value, then there are two ways of doing this. Either return -:attr:`mock.return_value` from inside :attr:`side_effect`, or return :data:`DEFAULT`: +:attr:`~Mock.return_value` from inside :attr:`~Mock.side_effect`, or return :data:`DEFAULT`: >>> m = MagicMock() >>> def side_effect(*args, **kwargs): @@ -1168,8 +1205,8 @@ any set return value, then there are two ways of doing this. Either return >>> m() 3 -To remove a :attr:`side_effect`, and return to the default behaviour, set the -:attr:`side_effect` to ``None``: +To remove a :attr:`~Mock.side_effect`, and return to the default behaviour, set the +:attr:`!side_effect` to ``None``: >>> m = MagicMock(return_value=6) >>> def side_effect(*args, **kwargs): @@ -1182,7 +1219,7 @@ To remove a :attr:`side_effect`, and return to the default behaviour, set the >>> m() 6 -The :attr:`side_effect` can also be any iterable object. Repeated calls to the mock +The :attr:`~Mock.side_effect` can also be any iterable object. Repeated calls to the mock will return values from the iterable (until the iterable is exhausted and a :exc:`StopIteration` is raised): @@ -1223,7 +1260,7 @@ objects of any type. You may want a mock object to return ``False`` to a :func:`hasattr` call, or raise an :exc:`AttributeError` when an attribute is fetched. You can do this by providing -an object as a :attr:`spec` for a mock, but that isn't always convenient. +an object as a :attr:`!spec` for a mock, but that isn't always convenient. You "block" attributes by deleting them. Once deleted, accessing an attribute will raise an :exc:`AttributeError`. @@ -1392,7 +1429,7 @@ patch If you are patching builtins in a module then you don't need to pass ``create=True``, it will be added by default. - Patch can be used as a :class:`TestCase` class decorator. It works by + Patch can be used as a :class:`~unittest.TestCase` class decorator. It works by decorating each test method in the class. This reduces the boilerplate code when your test methods share a common patchings set. :func:`patch` finds tests by looking for method names that start with ``patch.TEST_PREFIX``. @@ -1430,7 +1467,7 @@ If the class is instantiated multiple times you could use can set the *return_value* to be anything you want. To configure return values on methods of *instances* on the patched class -you must do this on the :attr:`return_value`. For example:: +you must do this on the :attr:`~Mock.return_value`. For example:: >>> class Class: ... def method(self): @@ -1751,13 +1788,13 @@ context manager is a dictionary where created mocks are keyed by name:: patch methods: start and stop ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -All the patchers have :meth:`start` and :meth:`stop` methods. These make it simpler to do +All the patchers have :meth:`!start` and :meth:`!stop` methods. These make it simpler to do patching in ``setUp`` methods or where you want to do multiple patches without nesting decorators or with statements. To use them call :func:`patch`, :func:`patch.object` or :func:`patch.dict` as normal and keep a reference to the returned ``patcher`` object. You can then -call :meth:`start` to put the patch in place and :meth:`stop` to undo it. +call :meth:`!start` to put the patch in place and :meth:`!stop` to undo it. If you are using :func:`patch` to create a mock for you then it will be returned by the call to ``patcher.start``. :: @@ -1774,7 +1811,7 @@ the call to ``patcher.start``. :: A typical use case for this might be for doing multiple patches in the ``setUp`` -method of a :class:`TestCase`:: +method of a :class:`~unittest.TestCase`:: >>> class MyTest(unittest.TestCase): ... def setUp(self): @@ -2447,7 +2484,7 @@ behaviour you can switch it off by setting the module level switch Alternatively you can just use ``vars(my_mock)`` (instance members) and ``dir(type(my_mock))`` (type members) to bypass the filtering irrespective of -:const:`mock.FILTER_DIR`. +:const:`FILTER_DIR`. mock_open @@ -2462,7 +2499,7 @@ mock_open default) then a :class:`MagicMock` will be created for you, with the API limited to methods or attributes available on standard file handles. - *read_data* is a string for the :meth:`~io.IOBase.read`, + *read_data* is a string for the :meth:`~io.RawIOBase.read`, :meth:`~io.IOBase.readline`, and :meth:`~io.IOBase.readlines` methods of the file handle to return. Calls to those methods will take data from *read_data* until it is depleted. The mock of these methods is pretty @@ -2474,7 +2511,7 @@ mock_open .. versionchanged:: 3.4 Added :meth:`~io.IOBase.readline` and :meth:`~io.IOBase.readlines` support. - The mock of :meth:`~io.IOBase.read` changed to consume *read_data* rather + The mock of :meth:`~io.RawIOBase.read` changed to consume *read_data* rather than returning it on each call. .. versionchanged:: 3.5 @@ -2526,7 +2563,7 @@ And for reading files:: Autospeccing ~~~~~~~~~~~~ -Autospeccing is based on the existing :attr:`spec` feature of mock. It limits the +Autospeccing is based on the existing :attr:`!spec` feature of mock. It limits the api of mocks to the api of an original object (the spec), but it is recursive (implemented lazily) so that attributes of mocks only have the same api as the attributes of the spec. In addition mocked functions / methods have the @@ -2551,8 +2588,8 @@ unit tests. Testing everything in isolation is all fine and dandy, but if you don't test how your units are "wired together" there is still lots of room for bugs that tests might have caught. -:mod:`mock` already provides a feature to help with this, called speccing. If you -use a class or instance as the :attr:`spec` for a mock then you can only access +:mod:`unittest.mock` already provides a feature to help with this, called speccing. If you +use a class or instance as the :attr:`!spec` for a mock then you can only access attributes on the mock that exist on the real class: >>> from urllib import request @@ -2590,7 +2627,7 @@ Here's an example of it in use:: >>> mock_request.Request -You can see that :class:`request.Request` has a spec. :class:`request.Request` takes two +You can see that :class:`!request.Request` has a spec. :class:`!request.Request` takes two arguments in the constructor (one of which is *self*). Here's what happens if we try to call it incorrectly:: @@ -2606,8 +2643,8 @@ specced mocks):: >>> req -:class:`Request` objects are not callable, so the return value of instantiating our -mocked out :class:`request.Request` is a non-callable mock. With the spec in place +:class:`!Request` objects are not callable, so the return value of instantiating our +mocked out :class:`!request.Request` is a non-callable mock. With the spec in place any typos in our asserts will raise the correct error:: >>> req.add_header('spam', 'eggs') @@ -2759,8 +2796,8 @@ Sealing mocks .. versionadded:: 3.7 -Order of precedence of :attr:`side_effect`, :attr:`return_value` and *wraps* ----------------------------------------------------------------------------- +Order of precedence of :attr:`!side_effect`, :attr:`!return_value` and *wraps* +------------------------------------------------------------------------------ The order of their precedence is: diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index 68a8ddee..54ea8bb4 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -2308,8 +2308,8 @@ Loading and running tests (see :ref:`Warning control `), otherwise it will be set to ``'default'``. - Calling ``main`` actually returns an instance of the ``TestProgram`` class. - This stores the result of the tests run as the ``result`` attribute. + Calling ``main`` returns an object with the ``result`` attribute that contains + the result of the tests run as a :class:`unittest.TestResult`. .. versionchanged:: 3.1 The *exit* parameter was added. @@ -2521,7 +2521,7 @@ Signal Handling .. versionadded:: 3.2 The :option:`-c/--catch ` command-line option to unittest, -along with the ``catchbreak`` parameter to :func:`unittest.main()`, provide +along with the ``catchbreak`` parameter to :func:`unittest.main`, provide more friendly handling of control-C during a test run. With catch break behavior enabled control-C will allow the currently running test to complete, and the test run will then end and report all the results so far. A second diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst index cd402e87..b32b4af1 100644 --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -173,7 +173,7 @@ or on combining URL components into a URL string. Added IPv6 URL parsing capabilities. .. versionchanged:: 3.3 - The fragment is now parsed for all URL schemes (unless *allow_fragment* is + The fragment is now parsed for all URL schemes (unless *allow_fragments* is false), in accordance with :rfc:`3986`. Previously, an allowlist of schemes that support fragments existed. @@ -395,6 +395,15 @@ or on combining URL components into a URL string. If you do not want that behavior, preprocess the *url* with :func:`urlsplit` and :func:`urlunsplit`, removing possible *scheme* and *netloc* parts. + .. warning:: + + Because an absolute URL may be passed as the ``url`` parameter, it is + generally **not secure** to use ``urljoin`` with an attacker-controlled + ``url``. For example in, + ``urljoin("https://website.com/users/", username)``, if ``username`` can + contain an absolute URL, the result of ``urljoin`` will be the absolute + URL. + .. versionchanged:: 3.5 diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst index 8705adfb..0c5aa045 100644 --- a/Doc/library/urllib.request.rst +++ b/Doc/library/urllib.request.rst @@ -160,16 +160,28 @@ The :mod:`urllib.request` module defines the following functions: .. function:: pathname2url(path) - Convert the pathname *path* from the local syntax for a path to the form used in - the path component of a URL. This does not produce a complete URL. The return - value will already be quoted using the :func:`~urllib.parse.quote` function. + Convert the given local path to a ``file:`` URL. This function uses + :func:`~urllib.parse.quote` function to encode the path. For historical + reasons, the return value omits the ``file:`` scheme prefix. This example + shows the function being used on Windows:: + >>> from urllib.request import pathname2url + >>> path = 'C:\\Program Files' + >>> 'file:' + pathname2url(path) + 'file:///C:/Program%20Files' -.. function:: url2pathname(path) - Convert the path component *path* from a percent-encoded URL to the local syntax for a - path. This does not accept a complete URL. This function uses - :func:`~urllib.parse.unquote` to decode *path*. +.. function:: url2pathname(url) + + Convert the given ``file:`` URL to a local path. This function uses + :func:`~urllib.parse.unquote` to decode the URL. For historical reasons, + the given value *must* omit the ``file:`` scheme prefix. This example shows + the function being used on Windows:: + + >>> from urllib.request import url2pathname + >>> url = 'file:///C:/Program%20Files' + >>> url2pathname(url.removeprefix('file:')) + 'C:\\Program Files' .. function:: getproxies() @@ -252,7 +264,7 @@ The following classes are provided: *method* should be a string that indicates the HTTP request method that will be used (e.g. ``'HEAD'``). If provided, its value is stored in the - :attr:`~Request.method` attribute and is used by :meth:`get_method()`. + :attr:`~Request.method` attribute and is used by :meth:`get_method`. The default is ``'GET'`` if *data* is ``None`` or ``'POST'`` otherwise. Subclasses may indicate a different default method by setting the :attr:`~Request.method` attribute in the class itself. @@ -1103,7 +1115,7 @@ FileHandler Objects .. versionchanged:: 3.2 This method is applicable only for local hostnames. When a remote - hostname is given, an :exc:`~urllib.error.URLError` is raised. + hostname is given, a :exc:`~urllib.error.URLError` is raised. .. _data-handler-objects: @@ -1118,7 +1130,7 @@ DataHandler Objects ignores white spaces in base64 encoded data URLs so the URL may be wrapped in whatever source file it comes from. But even though some browsers don't mind about a missing padding at the end of a base64 encoded data URL, this - implementation will raise an :exc:`ValueError` in that case. + implementation will raise a :exc:`ValueError` in that case. .. _ftp-handler-objects: diff --git a/Doc/library/venv.rst b/Doc/library/venv.rst index 57b0ee71..9eb0e9d1 100644 --- a/Doc/library/venv.rst +++ b/Doc/library/venv.rst @@ -37,14 +37,14 @@ A virtual environment is (amongst other things): are by default isolated from software in other virtual environments and Python interpreters and libraries installed in the operating system. -* Contained in a directory, conventionally either named ``venv`` or ``.venv`` in +* Contained in a directory, conventionally named ``.venv`` or ``venv`` in the project directory, or under a container directory for lots of virtual environments, such as ``~/.virtualenvs``. * Not checked into source control systems such as Git. * Considered as disposable -- it should be simple to delete and recreate it from - scratch. You don't place any project code in the environment + scratch. You don't place any project code in the environment. * Not considered as movable or copyable -- you just recreate the same environment in the target location. @@ -61,7 +61,117 @@ See :pep:`405` for more background on Python virtual environments. Creating virtual environments ----------------------------- -.. include:: /using/venv-create.inc +:ref:`Virtual environments ` are created by executing the ``venv`` +module: + +.. code-block:: shell + + python -m venv /path/to/new/virtual/environment + +This creates the target directory (including parent directories as needed) +and places a :file:`pyvenv.cfg` file in it with a ``home`` key +pointing to the Python installation from which the command was run. +It also creates a :file:`bin` (or :file:`Scripts` on Windows) subdirectory +containing a copy or symlink of the Python executable +(as appropriate for the platform or arguments used at environment creation time). +It also creates a :file:`lib/pythonX.Y/site-packages` subdirectory +(on Windows, this is :file:`Lib\site-packages`). +If an existing directory is specified, it will be re-used. + +.. versionchanged:: 3.5 + The use of ``venv`` is now recommended for creating virtual environments. + +.. deprecated-removed:: 3.6 3.8 + :program:`pyvenv` was the recommended tool for creating virtual environments + for Python 3.3 and 3.4, and replaced in 3.5 by executing ``venv`` directly. + +.. highlight:: none + +On Windows, invoke the ``venv`` command as follows: + +.. code-block:: ps1con + + PS> python -m venv C:\path\to\new\virtual\environment + +The command, if run with ``-h``, will show the available options:: + + usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear] + [--upgrade] [--without-pip] [--prompt PROMPT] [--upgrade-deps] + ENV_DIR [ENV_DIR ...] + + Creates virtual Python environments in one or more target directories. + + positional arguments: + ENV_DIR A directory to create the environment in. + + options: + -h, --help show this help message and exit + --system-site-packages + Give the virtual environment access to the system + site-packages dir. + --symlinks Try to use symlinks rather than copies, when + symlinks are not the default for the platform. + --copies Try to use copies rather than symlinks, even when + symlinks are the default for the platform. + --clear Delete the contents of the environment directory + if it already exists, before environment creation. + --upgrade Upgrade the environment directory to use this + version of Python, assuming Python has been + upgraded in-place. + --without-pip Skips installing or upgrading pip in the virtual + environment (pip is bootstrapped by default) + --prompt PROMPT Provides an alternative prompt prefix for this + environment. + --upgrade-deps Upgrade core dependencies (pip) to the latest + version in PyPI + + Once an environment has been created, you may wish to activate it, e.g. by + sourcing an activate script in its bin directory. + + +.. versionchanged:: 3.4 + Installs pip by default, added the ``--without-pip`` and ``--copies`` + options. + +.. versionchanged:: 3.4 + In earlier versions, if the target directory already existed, an error was + raised, unless the ``--clear`` or ``--upgrade`` option was provided. + +.. versionchanged:: 3.9 + Add ``--upgrade-deps`` option to upgrade pip + setuptools to the latest on PyPI. + +.. versionchanged:: 3.12 + + ``setuptools`` is no longer a core venv dependency. + +.. note:: + While symlinks are supported on Windows, they are not recommended. Of + particular note is that double-clicking ``python.exe`` in File Explorer + will resolve the symlink eagerly and ignore the virtual environment. + +.. note:: + On Microsoft Windows, it may be required to enable the ``Activate.ps1`` + script by setting the execution policy for the user. You can do this by + issuing the following PowerShell command: + + .. code-block:: powershell + + PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser + + See `About Execution Policies + `_ + for more information. + +The created :file:`pyvenv.cfg` file also includes the +``include-system-site-packages`` key, set to ``true`` if ``venv`` is +run with the ``--system-site-packages`` option, ``false`` otherwise. + +Unless the ``--without-pip`` option is given, :mod:`ensurepip` will be +invoked to bootstrap ``pip`` into the virtual environment. + +Multiple paths can be given to ``venv``, in which case an identical virtual +environment will be created, according to the given options, at each provided +path. .. _venv-explanation: @@ -95,7 +205,7 @@ containing the virtual environment): | +------------+--------------------------------------------------+ | | csh/tcsh | :samp:`$ source {}/bin/activate.csh` | | +------------+--------------------------------------------------+ -| | PowerShell | :samp:`$ {}/bin/Activate.ps1` | +| | pwsh | :samp:`$ {}/bin/Activate.ps1` | +-------------+------------+--------------------------------------------------+ | Windows | cmd.exe | :samp:`C:\\> {}\\Scripts\\activate.bat` | | +------------+--------------------------------------------------+ @@ -117,7 +227,7 @@ should be runnable without activating it. In order to achieve this, scripts installed into virtual environments have a "shebang" line which points to the environment's Python interpreter, -i.e. :samp:`#!/{}/bin/python`. +:samp:`#!/{}/bin/python`. This means that the script will run with that interpreter regardless of the value of :envvar:`PATH`. On Windows, "shebang" line processing is supported if you have the :ref:`launcher` installed. Thus, double-clicking an installed @@ -167,29 +277,29 @@ creation according to their needs, the :class:`EnvBuilder` class. The :class:`EnvBuilder` class accepts the following keyword arguments on instantiation: - * ``system_site_packages`` -- a Boolean value indicating that the system Python + * *system_site_packages* -- a boolean value indicating that the system Python site-packages should be available to the environment (defaults to ``False``). - * ``clear`` -- a Boolean value which, if true, will delete the contents of + * *clear* -- a boolean value which, if true, will delete the contents of any existing target directory, before creating the environment. - * ``symlinks`` -- a Boolean value indicating whether to attempt to symlink the + * *symlinks* -- a boolean value indicating whether to attempt to symlink the Python binary rather than copying. - * ``upgrade`` -- a Boolean value which, if true, will upgrade an existing + * *upgrade* -- a boolean value which, if true, will upgrade an existing environment with the running Python - for use when that Python has been upgraded in-place (defaults to ``False``). - * ``with_pip`` -- a Boolean value which, if true, ensures pip is + * *with_pip* -- a boolean value which, if true, ensures pip is installed in the virtual environment. This uses :mod:`ensurepip` with the ``--default-pip`` option. - * ``prompt`` -- a String to be used after virtual environment is activated + * *prompt* -- a string to be used after virtual environment is activated (defaults to ``None`` which means directory name of the environment would be used). If the special string ``"."`` is provided, the basename of the current directory is used as the prompt. - * ``upgrade_deps`` -- Update the base venv modules to the latest on PyPI + * *upgrade_deps* -- Update the base venv modules to the latest on PyPI .. versionchanged:: 3.4 Added the ``with_pip`` parameter @@ -200,10 +310,7 @@ creation according to their needs, the :class:`EnvBuilder` class. .. versionchanged:: 3.9 Added the ``upgrade_deps`` parameter - Creators of third-party virtual environment tools will be free to use the - provided :class:`EnvBuilder` class as a base class. - - The returned env-builder is an object which has a method, ``create``: + :class:`EnvBuilder` may be used as a base class. .. method:: create(env_dir) @@ -303,14 +410,14 @@ creation according to their needs, the :class:`EnvBuilder` class. .. method:: upgrade_dependencies(context) - Upgrades the core venv dependency packages (currently ``pip``) + Upgrades the core venv dependency packages (currently :pypi:`pip`) in the environment. This is done by shelling out to the ``pip`` executable in the environment. .. versionadded:: 3.9 .. versionchanged:: 3.12 - ``setuptools`` is no longer a core venv dependency. + :pypi:`setuptools` is no longer a core venv dependency. .. method:: post_setup(context) @@ -318,25 +425,15 @@ creation according to their needs, the :class:`EnvBuilder` class. implementations to pre-install packages in the virtual environment or perform other post-creation steps. - .. versionchanged:: 3.7.2 - Windows now uses redirector scripts for ``python[w].exe`` instead of - copying the actual binaries. In 3.7.2 only :meth:`setup_python` does - nothing unless running from a build in the source tree. - - .. versionchanged:: 3.7.3 - Windows copies the redirector scripts as part of :meth:`setup_python` - instead of :meth:`setup_scripts`. This was not the case in 3.7.2. - When using symlinks, the original executables will be linked. - - In addition, :class:`EnvBuilder` provides this utility method that can be - called from :meth:`setup_scripts` or :meth:`post_setup` in subclasses to - assist in installing custom scripts into the virtual environment. - .. method:: install_scripts(context, path) + This method can be + called from :meth:`setup_scripts` or :meth:`post_setup` in subclasses to + assist in installing custom scripts into the virtual environment. + *path* is the path to a directory that should contain subdirectories - "common", "posix", "nt", each containing scripts destined for the bin - directory in the environment. The contents of "common" and the + ``common``, ``posix``, ``nt``; each containing scripts destined for the + ``bin`` directory in the environment. The contents of ``common`` and the directory corresponding to :data:`os.name` are copied after some text replacement of placeholders: @@ -358,6 +455,16 @@ creation according to their needs, the :class:`EnvBuilder` class. The directories are allowed to exist (for when an existing environment is being upgraded). + .. versionchanged:: 3.7.2 + Windows now uses redirector scripts for ``python[w].exe`` instead of + copying the actual binaries. In 3.7.2 only :meth:`setup_python` does + nothing unless running from a build in the source tree. + + .. versionchanged:: 3.7.3 + Windows copies the redirector scripts as part of :meth:`setup_python` + instead of :meth:`setup_scripts`. This was not the case in 3.7.2. + When using symlinks, the original executables will be linked. + There is also a module-level convenience function: .. function:: create(env_dir, system_site_packages=False, clear=False, \ @@ -370,13 +477,13 @@ There is also a module-level convenience function: .. versionadded:: 3.3 .. versionchanged:: 3.4 - Added the ``with_pip`` parameter + Added the *with_pip* parameter .. versionchanged:: 3.6 - Added the ``prompt`` parameter + Added the *prompt* parameter .. versionchanged:: 3.9 - Added the ``upgrade_deps`` parameter + Added the *upgrade_deps* parameter An example of extending ``EnvBuilder`` -------------------------------------- diff --git a/Doc/library/warnings.rst b/Doc/library/warnings.rst index df38eaf8..53a402e3 100644 --- a/Doc/library/warnings.rst +++ b/Doc/library/warnings.rst @@ -178,6 +178,19 @@ If a warning is reported and doesn't match any registered filter then the "default" action is applied (hence its name). + +.. _repeated-warning-suppression-criteria: + +Repeated Warning Suppression Criteria +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The filters that suppress repeated warnings apply the following criteria to determine if a warning is considered a repeat: + +- ``"default"``: A warning is considered a repeat only if the (*message*, *category*, *module*, *lineno*) are all the same. +- ``"module"``: A warning is considered a repeat if the (*message*, *category*, *module*) are the same, ignoring the line number. +- ``"once"``: A warning is considered a repeat if the (*message*, *category*) are the same, ignoring the module and line number. + + .. _describing-warning-filters: Describing Warning Filters @@ -396,7 +409,7 @@ Available Functions ------------------- -.. function:: warn(message, category=None, stacklevel=1, source=None, *, skip_file_prefixes=None) +.. function:: warn(message, category=None, stacklevel=1, source=None, *, skip_file_prefixes=()) Issue a warning, or maybe ignore it or raise an exception. The *category* argument, if given, must be a :ref:`warning category class `; it @@ -545,6 +558,9 @@ Available Context Managers passed to :func:`simplefilter` as if it were called immediately on entering the context. + See :ref:`warning-filter` for the meaning of the *category* and *lineno* + parameters. + .. note:: The :class:`catch_warnings` manager works by replacing and diff --git a/Doc/library/wave.rst b/Doc/library/wave.rst index ba0ed23b..454f0541 100644 --- a/Doc/library/wave.rst +++ b/Doc/library/wave.rst @@ -46,8 +46,8 @@ The :mod:`wave` module defines the following function and exception: the file object. The :func:`.open` function may be used in a :keyword:`with` statement. When - the :keyword:`!with` block completes, the :meth:`Wave_read.close()` or - :meth:`Wave_write.close()` method is called. + the :keyword:`!with` block completes, the :meth:`Wave_read.close` or + :meth:`Wave_write.close` method is called. .. versionchanged:: 3.4 Added support for unseekable files. diff --git a/Doc/library/weakref.rst b/Doc/library/weakref.rst index d6e062df..2a25ed04 100644 --- a/Doc/library/weakref.rst +++ b/Doc/library/weakref.rst @@ -197,7 +197,7 @@ See :ref:`__slots__ documentation ` for details. >>> del k1 # d = {k2: 2} .. versionchanged:: 3.9 - Added support for ``|`` and ``|=`` operators, specified in :pep:`584`. + Added support for ``|`` and ``|=`` operators, as specified in :pep:`584`. :class:`WeakKeyDictionary` objects have an additional method that exposes the internal references directly. The references are not guaranteed to diff --git a/Doc/library/webbrowser.rst b/Doc/library/webbrowser.rst index df22c5f5..c34b2170 100644 --- a/Doc/library/webbrowser.rst +++ b/Doc/library/webbrowser.rst @@ -62,6 +62,8 @@ The following functions are defined: (note that under many window managers this will occur regardless of the setting of this variable). + Returns ``True`` if a browser was successfully launched, ``False`` otherwise. + Note that on some platforms, trying to open a filename using this function, may work and start the operating system's associated program. However, this is neither supported nor portable. @@ -74,11 +76,16 @@ The following functions are defined: Open *url* in a new window of the default browser, if possible, otherwise, open *url* in the only browser window. + Returns ``True`` if a browser was successfully launched, ``False`` otherwise. + + .. function:: open_new_tab(url) Open *url* in a new page ("tab") of the default browser, if possible, otherwise equivalent to :func:`open_new`. + Returns ``True`` if a browser was successfully launched, ``False`` otherwise. + .. function:: get(using=None) diff --git a/Doc/library/wsgiref.rst b/Doc/library/wsgiref.rst index 6faf7e8c..95327736 100644 --- a/Doc/library/wsgiref.rst +++ b/Doc/library/wsgiref.rst @@ -783,8 +783,8 @@ in :pep:`3333`. .. class:: StartResponse() - A :class:`typing.Protocol` describing `start_response() - `_ + A :class:`typing.Protocol` describing :pep:`start_response() + <3333#the-start-response-callable>` callables (:pep:`3333`). .. data:: WSGIEnvironment @@ -797,18 +797,18 @@ in :pep:`3333`. .. class:: InputStream() - A :class:`typing.Protocol` describing a `WSGI Input Stream - `_. + A :class:`typing.Protocol` describing a :pep:`WSGI Input Stream + <3333#input-and-error-streams>`. .. class:: ErrorStream() - A :class:`typing.Protocol` describing a `WSGI Error Stream - `_. + A :class:`typing.Protocol` describing a :pep:`WSGI Error Stream + <3333#input-and-error-streams>`. .. class:: FileWrapper() - A :class:`typing.Protocol` describing a `file wrapper - `_. + A :class:`typing.Protocol` describing a :pep:`file wrapper + <3333#optional-platform-specific-file-handling>`. See :class:`wsgiref.util.FileWrapper` for a concrete implementation of this protocol. diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst index 2fedd99e..9acb7169 100644 --- a/Doc/library/xml.etree.elementtree.rst +++ b/Doc/library/xml.etree.elementtree.rst @@ -508,7 +508,7 @@ Functions `C14N 2.0 `_ transformation function. Canonicalization is a way to normalise XML output in a way that allows - byte-by-byte comparisons and digital signatures. It reduced the freedom + byte-by-byte comparisons and digital signatures. It reduces the freedom that XML serializers have and instead generates a more constrained XML representation. The main restrictions regard the placement of namespace declarations, the ordering of attributes, and ignorable whitespace. @@ -869,6 +869,7 @@ Element Objects .. module:: xml.etree.ElementTree :noindex: + :no-index: .. class:: Element(tag, attrib={}, **extra) @@ -965,7 +966,7 @@ Element Objects .. method:: extend(subelements) - Appends *subelements* from a sequence object with zero or more elements. + Appends *subelements* from an iterable of elements. Raises :exc:`TypeError` if a subelement is not an :class:`Element`. .. versionadded:: 3.2 @@ -1053,9 +1054,10 @@ Element Objects :meth:`~object.__getitem__`, :meth:`~object.__setitem__`, :meth:`~object.__len__`. - Caution: Elements with no subelements will test as ``False``. Testing the - truth value of an Element is deprecated and will raise an exception in - Python 3.14. Use specific ``len(elem)`` or ``elem is None`` test instead.:: + Caution: Elements with no subelements will test as ``False``. In a future + release of Python, all elements will test as ``True`` regardless of whether + subelements exist. Instead, prefer explicit ``len(elem)`` or + ``elem is not None`` tests.:: element = root.find('foo') @@ -1368,7 +1370,7 @@ XMLParser Objects .. versionchanged:: 3.8 Parameters are now :ref:`keyword-only `. - The *html* argument no longer supported. + The *html* argument is no longer supported. .. method:: close() diff --git a/Doc/library/xmlrpc.client.rst b/Doc/library/xmlrpc.client.rst index 614fb19d..c57f433e 100644 --- a/Doc/library/xmlrpc.client.rst +++ b/Doc/library/xmlrpc.client.rst @@ -165,7 +165,7 @@ between conformable Python objects and XML on the wire. A good description of XML-RPC operation and client software in several languages. Contains pretty much everything an XML-RPC client developer needs to know. - `XML-RPC Introspection `_ + `XML-RPC Introspection `_ Describes the XML-RPC protocol extension for introspection. `XML-RPC Specification `_ diff --git a/Doc/library/zipapp.rst b/Doc/library/zipapp.rst index cf561b45..cdaba07a 100644 --- a/Doc/library/zipapp.rst +++ b/Doc/library/zipapp.rst @@ -332,7 +332,7 @@ Formally, the Python zip application format is therefore: interpreter name, and then a newline (``b'\n'``) character. The interpreter name can be anything acceptable to the OS "shebang" processing, or the Python launcher on Windows. The interpreter should be encoded in UTF-8 on Windows, - and in :func:`sys.getfilesystemencoding()` on POSIX. + and in :func:`sys.getfilesystemencoding` on POSIX. 2. Standard zipfile data, as generated by the :mod:`zipfile` module. The zipfile content *must* include a file called ``__main__.py`` (which must be in the "root" of the zipfile - i.e., it cannot be in a subdirectory). The diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst index 374404bf..ddb1337f 100644 --- a/Doc/reference/compound_stmts.rst +++ b/Doc/reference/compound_stmts.rst @@ -245,13 +245,12 @@ handler is started. This search inspects the :keyword:`!except` clauses in turn until one is found that matches the exception. An expression-less :keyword:`!except` clause, if present, must be last; it matches any exception. -For an :keyword:`!except` clause with an expression, -that expression is evaluated, and the clause matches the exception -if the resulting object is "compatible" with the exception. An object is -compatible with an exception if the object is the class or a -:term:`non-virtual base class ` of the exception object, -or a tuple containing an item that is the class or a non-virtual base class -of the exception object. + +For an :keyword:`!except` clause with an expression, the +expression must evaluate to an exception type or a tuple of exception types. +The raised exception matches an :keyword:`!except` clause whose expression evaluates +to the class or a :term:`non-virtual base class ` of the exception object, +or to a tuple that contains such a class. If no :keyword:`!except` clause matches the exception, the search for an exception handler @@ -378,8 +377,10 @@ exception group with an empty message string. :: ... ExceptionGroup('', (BlockingIOError())) -An :keyword:`!except*` clause must have a matching type, -and this type cannot be a subclass of :exc:`BaseExceptionGroup`. +An :keyword:`!except*` clause must have a matching expression; it cannot be ``except*:``. +Furthermore, this expression cannot contain exception group types, because that would +have ambiguous semantics. + It is not possible to mix :keyword:`except` and :keyword:`!except*` in the same :keyword:`try`. :keyword:`break`, :keyword:`continue` and :keyword:`return` @@ -533,18 +534,15 @@ is semantically equivalent to:: enter = type(manager).__enter__ exit = type(manager).__exit__ value = enter(manager) - hit_except = False try: TARGET = value SUITE except: - hit_except = True if not exit(manager, *sys.exc_info()): raise - finally: - if not hit_except: - exit(manager, None, None, None) + else: + exit(manager, None, None, None) With more than one item, the context managers are processed as if multiple :keyword:`with` statements were nested:: @@ -840,7 +838,7 @@ A literal pattern corresponds to most : | "None" : | "True" : | "False" - : | `signed_number`: NUMBER | "-" NUMBER + signed_number: ["-"] NUMBER The rule ``strings`` and the token ``NUMBER`` are defined in the :doc:`standard Python grammar <./grammar>`. Triple-quoted strings are @@ -1216,9 +1214,10 @@ A function definition defines a user-defined function object (see section : | `parameter_list_no_posonly` parameter_list_no_posonly: `defparameter` ("," `defparameter`)* ["," [`parameter_list_starargs`]] : | `parameter_list_starargs` - parameter_list_starargs: "*" [`parameter`] ("," `defparameter`)* ["," ["**" `parameter` [","]]] + parameter_list_starargs: "*" [`star_parameter`] ("," `defparameter`)* ["," ["**" `parameter` [","]]] : | "**" `parameter` [","] parameter: `identifier` [":" `expression`] + star_parameter: `identifier` [":" ["*"] `expression`] defparameter: `parameter` ["=" `expression`] funcname: `identifier` @@ -1325,7 +1324,8 @@ and may only be passed by positional arguments. Parameters may have an :term:`annotation ` of the form "``: expression``" following the parameter name. Any parameter may have an annotation, even those of the form -``*identifier`` or ``**identifier``. Functions may have "return" annotation of +``*identifier`` or ``**identifier``. (As a special case, parameters of the form +``*identifier`` may have an annotation "``: *expression``".) Functions may have "return" annotation of the form "``-> expression``" after the parameter list. These annotations can be any valid Python expression. The presence of annotations does not change the semantics of a function. The annotation values are available as values of @@ -1336,6 +1336,10 @@ enables postponed evaluation. Otherwise, they are evaluated when the function definition is executed. In this case annotations may be evaluated in a different order than they appear in the source code. +.. versionchanged:: 3.11 + Parameters of the form "``*identifier``" may have an annotation + "``: *expression``". See :pep:`646`. + .. index:: pair: lambda; expression It is also possible to create anonymous functions (functions not bound to a @@ -1421,7 +1425,7 @@ dictionary. The class name is bound to this class object in the original local namespace. The order in which attributes are defined in the class body is preserved -in the new class's ``__dict__``. Note that this is reliable only right +in the new class's :attr:`~type.__dict__`. Note that this is reliable only right after the class is created and only for classes that were defined using the definition syntax. @@ -1452,8 +1456,8 @@ decorators. The result is then bound to the class name. A list of :ref:`type parameters ` may be given in square brackets immediately after the class's name. This indicates to static type checkers that the class is generic. At runtime, -the type parameters can be retrieved from the class's ``__type_params__`` -attribute. See :ref:`generic-classes` for more. +the type parameters can be retrieved from the class's +:attr:`~type.__type_params__` attribute. See :ref:`generic-classes` for more. .. versionchanged:: 3.12 Type parameter lists are new in Python 3.12. @@ -1663,8 +1667,8 @@ with more precision. The scope of type parameters is modeled with a special function (technically, an :ref:`annotation scope `) that wraps the creation of the generic object. -Generic functions, classes, and type aliases have a :attr:`!__type_params__` -attribute listing their type parameters. +Generic functions, classes, and type aliases have a +:attr:`~definition.__type_params__` attribute listing their type parameters. Type parameters come in three kinds: @@ -1876,5 +1880,5 @@ like ``TYPE_PARAMS_OF_ListOrSet`` are not actually bound at runtime. therefore the function's :term:`docstring`. .. [#] A string literal appearing as the first statement in the class body is - transformed into the namespace's ``__doc__`` item and therefore the class's - :term:`docstring`. + transformed into the namespace's :attr:`~type.__doc__` item and therefore + the class's :term:`docstring`. diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 602014de..e19a365f 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -106,12 +106,16 @@ that mutable object is changed. Types affect almost all aspects of object behavior. Even the importance of object identity is affected in some sense: for immutable types, operations that compute new values may actually return a reference to any existing object with -the same type and value, while for mutable objects this is not allowed. E.g., -after ``a = 1; b = 1``, ``a`` and ``b`` may or may not refer to the same object -with the value one, depending on the implementation, but after ``c = []; d = -[]``, ``c`` and ``d`` are guaranteed to refer to two different, unique, newly -created empty lists. (Note that ``c = d = []`` assigns the same object to both -``c`` and ``d``.) +the same type and value, while for mutable objects this is not allowed. +For example, after ``a = 1; b = 1``, *a* and *b* may or may not refer to +the same object with the value one, depending on the implementation. +This is because :class:`int` is an immutable type, so the reference to ``1`` +can be reused. This behaviour depends on the implementation used, so should +not be relied upon, but is something to be aware of when making use of object +identity tests. +However, after ``c = []; d = []``, *c* and *d* are guaranteed to refer to two +different, unique, newly created empty lists. (Note that ``e = f = []`` assigns +the *same* object to both *e* and *f*.) .. _types: @@ -215,7 +219,7 @@ properties: * A sign is shown only when the number is negative. -Python distinguishes between integers, floating point numbers, and complex +Python distinguishes between integers, floating-point numbers, and complex numbers: @@ -259,18 +263,18 @@ Booleans (:class:`bool`) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. index:: - pair: object; floating point - pair: floating point; number + pair: object; floating-point + pair: floating-point; number pair: C; language pair: Java; language -These represent machine-level double precision floating point numbers. You are +These represent machine-level double precision floating-point numbers. You are at the mercy of the underlying machine architecture (and C or Java implementation) for the accepted range and handling of overflow. Python does not -support single-precision floating point numbers; the savings in processor and +support single-precision floating-point numbers; the savings in processor and memory usage that are usually the reason for using these are dwarfed by the overhead of using objects in Python, so there is no reason to complicate the -language with two kinds of floating point numbers. +language with two kinds of floating-point numbers. :class:`numbers.Complex` (:class:`complex`) @@ -281,7 +285,7 @@ language with two kinds of floating point numbers. pair: complex; number These represent complex numbers as a pair of machine-level double precision -floating point numbers. The same caveats apply as for floating point numbers. +floating-point numbers. The same caveats apply as for floating-point numbers. The real and imaginary parts of a complex number ``z`` can be retrieved through the read-only attributes ``z.real`` and ``z.imag``. @@ -373,7 +377,7 @@ Bytes A bytes object is an immutable array. The items are 8-bit bytes, represented by integers in the range 0 <= x < 256. Bytes literals - (like ``b'abc'``) and the built-in :func:`bytes()` constructor + (like ``b'abc'``) and the built-in :func:`bytes` constructor can be used to create bytes objects. Also, bytes objects can be decoded to strings via the :meth:`~bytes.decode` method. @@ -492,7 +496,7 @@ in the same order they were added sequentially over the dictionary. Replacing an existing key does not change the order, however removing a key and re-inserting it will add it to the end instead of keeping its old place. -Dictionaries are mutable; they can be created by the ``{...}`` notation (see +Dictionaries are mutable; they can be created by the ``{}`` notation (see section :ref:`dict`). .. index:: @@ -587,7 +591,6 @@ Most of these attributes check the type of the assigned value: * - .. attribute:: function.__doc__ - The function's documentation string, or ``None`` if unavailable. - Not inherited by subclasses. * - .. attribute:: function.__name__ - The function's name. @@ -727,14 +730,7 @@ When an instance method object is derived from a :class:`classmethod` object, th itself, so that calling either ``x.f(1)`` or ``C.f(1)`` is equivalent to calling ``f(C,1)`` where ``f`` is the underlying function. -Note that the transformation from :ref:`function object ` -to instance method -object happens each time the attribute is retrieved from the instance. In -some cases, a fruitful optimization is to assign the attribute to a local -variable and call that local variable. Also notice that this -transformation only happens for user-defined functions; other callable -objects (and all non-callable objects) are retrieved without -transformation. It is also important to note that user-defined functions +It is important to note that user-defined functions which are attributes of a class instance are not converted to bound methods; this *only* happens when the function is an attribute of the class. @@ -853,6 +849,8 @@ Instances of arbitrary classes can be made callable by defining a :meth:`~object.__call__` method in their class. +.. _module-objects: + Modules ------- @@ -878,47 +876,225 @@ Attribute assignment updates the module's namespace dictionary, e.g., .. index:: single: __name__ (module attribute) - single: __doc__ (module attribute) + single: __spec__ (module attribute) + single: __package__ (module attribute) + single: __loader__ (module attribute) + single: __path__ (module attribute) single: __file__ (module attribute) + single: __cached__ (module attribute) + single: __doc__ (module attribute) single: __annotations__ (module attribute) pair: module; namespace -Predefined (writable) attributes: +.. _import-mod-attrs: + +Import-related attributes on module objects +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Module objects have the following attributes that relate to the +:ref:`import system `. When a module is created using the machinery associated +with the import system, these attributes are filled in based on the module's +:term:`spec `, before the :term:`loader` executes and loads the +module. + +To create a module dynamically rather than using the import system, +it's recommended to use :func:`importlib.util.module_from_spec`, +which will set the various import-controlled attributes to appropriate values. +It's also possible to use the :class:`types.ModuleType` constructor to create +modules directly, but this technique is more error-prone, as most attributes +must be manually set on the module object after it has been created when using +this approach. + +.. caution:: + + With the exception of :attr:`~module.__name__`, it is **strongly** + recommended that you rely on :attr:`~module.__spec__` and its attributes + instead of any of the other individual attributes listed in this subsection. + Note that updating an attribute on :attr:`!__spec__` will not update the + corresponding attribute on the module itself: + + .. doctest:: + + >>> import typing + >>> typing.__name__, typing.__spec__.name + ('typing', 'typing') + >>> typing.__spec__.name = 'spelling' + >>> typing.__name__, typing.__spec__.name + ('typing', 'spelling') + >>> typing.__name__ = 'keyboard_smashing' + >>> typing.__name__, typing.__spec__.name + ('keyboard_smashing', 'spelling') + +.. attribute:: module.__name__ + + The name used to uniquely identify the module in the import system. + For a directly executed module, this will be set to ``"__main__"``. + + This attribute must be set to the fully qualified name of the module. + It is expected to match the value of + :attr:`module.__spec__.name `. + +.. attribute:: module.__spec__ + + A record of the module's import-system-related state. + + Set to the :class:`module spec ` that was + used when importing the module. See :ref:`module-specs` for more details. + + .. versionadded:: 3.4 + +.. attribute:: module.__package__ + + The :term:`package` a module belongs to. + + If the module is top-level (that is, not a part of any specific package) + then the attribute should be set to ``''`` (the empty string). Otherwise, + it should be set to the name of the module's package (which can be equal to + :attr:`module.__name__` if the module itself is a package). See :pep:`366` + for further details. + + This attribute is used instead of :attr:`~module.__name__` to calculate + explicit relative imports for main modules. It defaults to ``None`` for + modules created dynamically using the :class:`types.ModuleType` constructor; + use :func:`importlib.util.module_from_spec` instead to ensure the attribute + is set to a :class:`str`. + + It is **strongly** recommended that you use + :attr:`module.__spec__.parent ` + instead of :attr:`!module.__package__`. :attr:`__package__` is now only used + as a fallback if :attr:`!__spec__.parent` is not set, and this fallback + path is deprecated. + + .. versionchanged:: 3.4 + This attribute now defaults to ``None`` for modules created dynamically + using the :class:`types.ModuleType` constructor. + Previously the attribute was optional. + + .. versionchanged:: 3.6 + The value of :attr:`!__package__` is expected to be the same as + :attr:`__spec__.parent `. + :attr:`__package__` is now only used as a fallback during import + resolution if :attr:`!__spec__.parent` is not defined. + + .. versionchanged:: 3.10 + :exc:`ImportWarning` is raised if an import resolution falls back to + :attr:`!__package__` instead of + :attr:`__spec__.parent `. + + .. versionchanged:: 3.12 + Raise :exc:`DeprecationWarning` instead of :exc:`ImportWarning` when + falling back to :attr:`!__package__` during import resolution. + +.. attribute:: module.__loader__ + + The :term:`loader` object that the import machinery used to load the module. + + This attribute is mostly useful for introspection, but can be used for + additional loader-specific functionality, for example getting data + associated with a loader. + + :attr:`!__loader__` defaults to ``None`` for modules created dynamically + using the :class:`types.ModuleType` constructor; + use :func:`importlib.util.module_from_spec` instead to ensure the attribute + is set to a :term:`loader` object. + + It is **strongly** recommended that you use + :attr:`module.__spec__.loader ` + instead of :attr:`!module.__loader__`. + + .. versionchanged:: 3.4 + This attribute now defaults to ``None`` for modules created dynamically + using the :class:`types.ModuleType` constructor. + Previously the attribute was optional. + + .. deprecated-removed:: 3.12 3.16 + Setting :attr:`!__loader__` on a module while failing to set + :attr:`!__spec__.loader` is deprecated. In Python 3.16, + :attr:`!__loader__` will cease to be set or taken into consideration by + the import system or the standard library. + +.. attribute:: module.__path__ + + A (possibly empty) :term:`sequence` of strings enumerating the locations + where the package's submodules will be found. Non-package modules should + not have a :attr:`!__path__` attribute. See :ref:`package-path-rules` for + more details. + + It is **strongly** recommended that you use + :attr:`module.__spec__.submodule_search_locations ` + instead of :attr:`!module.__path__`. + +.. attribute:: module.__file__ +.. attribute:: module.__cached__ + + :attr:`!__file__` and :attr:`!__cached__` are both optional attributes that + may or may not be set. Both attributes should be a :class:`str` when they + are available. + + :attr:`!__file__` indicates the pathname of the file from which the module + was loaded (if loaded from a file), or the pathname of the shared library + file for extension modules loaded dynamically from a shared library. + It might be missing for certain types of modules, such as C modules that are + statically linked into the interpreter, and the + :ref:`import system ` may opt to leave it unset if it + has no semantic meaning (for example, a module loaded from a database). + + If :attr:`!__file__` is set then the :attr:`!__cached__` attribute might + also be set, which is the path to any compiled version of + the code (for example, a byte-compiled file). The file does not need to exist + to set this attribute; the path can simply point to where the + compiled file *would* exist (see :pep:`3147`). + + Note that :attr:`!__cached__` may be set even if :attr:`!__file__` is not + set. However, that scenario is quite atypical. Ultimately, the + :term:`loader` is what makes use of the module spec provided by the + :term:`finder` (from which :attr:`!__file__` and :attr:`!__cached__` are + derived). So if a loader can load from a cached module but otherwise does + not load from a file, that atypical scenario may be appropriate. + + It is **strongly** recommended that you use + :attr:`module.__spec__.cached ` + instead of :attr:`!module.__cached__`. + +Other writable attributes on module objects +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +As well as the import-related attributes listed above, module objects also have +the following writable attributes: - :attr:`__name__` - The module's name. +.. attribute:: module.__doc__ - :attr:`__doc__` - The module's documentation string, or ``None`` if - unavailable. + The module's documentation string, or ``None`` if unavailable. + See also: :attr:`__doc__ attributes `. - :attr:`__file__` - The pathname of the file from which the - module was loaded, if it was loaded from a file. - The :attr:`__file__` - attribute may be missing for certain types of modules, such as C modules - that are statically linked into the interpreter. For extension modules - loaded dynamically from a shared library, it's the pathname of the shared - library file. +.. attribute:: module.__annotations__ - :attr:`__annotations__` - A dictionary containing - :term:`variable annotations ` collected during - module body execution. For best practices on working - with :attr:`__annotations__`, please see :ref:`annotations-howto`. + A dictionary containing + :term:`variable annotations ` collected during module + body execution. For best practices on working with :attr:`__annotations__`, + please see :ref:`annotations-howto`. + +Module dictionaries +^^^^^^^^^^^^^^^^^^^ + +Module objects also have the following special read-only attribute: .. index:: single: __dict__ (module attribute) +.. attribute:: module.__dict__ -Special read-only attribute: :attr:`~object.__dict__` is the module's -namespace as a dictionary object. + The module's namespace as a dictionary object. Uniquely among the attributes + listed here, :attr:`!__dict__` cannot be accessed as a global variable from + within a module; it can only be accessed as an attribute on module objects. -.. impl-detail:: + .. impl-detail:: + + Because of the way CPython clears module dictionaries, the module + dictionary will be cleared when the module falls out of scope even if the + dictionary still has live references. To avoid this, copy the dictionary + or keep the module around while using its dictionary directly. - Because of the way CPython clears module dictionaries, the module - dictionary will be cleared when the module falls out of scope even if the - dictionary still has live references. To avoid this, copy the dictionary - or keep the module around while using its dictionary directly. +.. _class-attrs-and-methods: Custom classes -------------- @@ -962,6 +1138,9 @@ of a base class. A class object can be called (see above) to yield a class instance (see below). +Special attributes +^^^^^^^^^^^^^^^^^^ + .. index:: single: __name__ (class attribute) single: __module__ (class attribute) @@ -971,35 +1150,86 @@ A class object can be called (see above) to yield a class instance (see below). single: __annotations__ (class attribute) single: __type_params__ (class attribute) -Special attributes: +.. list-table:: + :header-rows: 1 - :attr:`~definition.__name__` - The class name. + * - Attribute + - Meaning - :attr:`__module__` - The name of the module in which the class was defined. + * - .. attribute:: type.__name__ + - The class's name. + See also: :attr:`__name__ attributes `. - :attr:`~object.__dict__` - The dictionary containing the class's namespace. + * - .. attribute:: type.__qualname__ + - The class's :term:`qualified name`. + See also: :attr:`__qualname__ attributes `. + + * - .. attribute:: type.__module__ + - The name of the module in which the class was defined. + + * - .. attribute:: type.__dict__ + - A :class:`mapping proxy ` + providing a read-only view of the class's namespace. + See also: :attr:`__dict__ attributes `. + + * - .. attribute:: type.__bases__ + - A :class:`tuple` containing the class's bases. + In most cases, for a class defined as ``class X(A, B, C)``, + ``X.__bases__`` will be exactly equal to ``(A, B, C)``. + + * - .. attribute:: type.__doc__ + - The class's documentation string, or ``None`` if undefined. + Not inherited by subclasses. + + * - .. attribute:: type.__annotations__ + - A dictionary containing + :term:`variable annotations ` + collected during class body execution. For best practices on working + with :attr:`!__annotations__`, please see :ref:`annotations-howto`. + + .. caution:: - :attr:`~class.__bases__` - A tuple containing the base classes, in the order of - their occurrence in the base class list. + Accessing the :attr:`!__annotations__` attribute of a class + object directly may yield incorrect results in the presence of + metaclasses. In addition, the attribute may not exist for + some classes. Use :func:`inspect.get_annotations` to + retrieve class annotations safely. - :attr:`__doc__` - The class's documentation string, or ``None`` if undefined. + * - .. attribute:: type.__type_params__ + - A :class:`tuple` containing the :ref:`type parameters ` of + a :ref:`generic class `. + + .. versionadded:: 3.12 + + * - .. attribute:: type.__mro__ + - The :class:`tuple` of classes that are considered when looking for + base classes during method resolution. + + +Special methods +^^^^^^^^^^^^^^^ + +In addition to the special attributes described above, all Python classes also +have the following two methods available: + +.. method:: type.mro - :attr:`__annotations__` - A dictionary containing - :term:`variable annotations ` - collected during class body execution. For best practices on - working with :attr:`__annotations__`, please see - :ref:`annotations-howto`. + This method can be overridden by a metaclass to customize the method + resolution order for its instances. It is called at class instantiation, + and its result is stored in :attr:`~type.__mro__`. - :attr:`__type_params__` - A tuple containing the :ref:`type parameters ` of - a :ref:`generic class `. +.. method:: type.__subclasses__ + Each class keeps a list of weak references to its immediate subclasses. This + method returns a list of all those references still alive. The list is in + definition order. Example: + + .. doctest:: + + >>> class A: pass + >>> class B(A): pass + >>> A.__subclasses__() + [] Class instances --------------- @@ -1039,12 +1269,22 @@ dictionary directly. Class instances can pretend to be numbers, sequences, or mappings if they have methods with certain special names. See section :ref:`specialnames`. +Special attributes +^^^^^^^^^^^^^^^^^^ + .. index:: single: __dict__ (instance attribute) single: __class__ (instance attribute) -Special attributes: :attr:`~object.__dict__` is the attribute dictionary; -:attr:`~instance.__class__` is the instance's class. +.. attribute:: object.__class__ + + The class to which a class instance belongs. + +.. attribute:: object.__dict__ + + A dictionary or other mapping object used to store an object's (writable) + attributes. Not all instances have a :attr:`!__dict__` attribute; see the + section on :ref:`slots` for more details. I/O objects (also known as file objects) @@ -1188,7 +1428,7 @@ Special read-only attributes .. deprecated:: 3.12 This attribute of code objects is deprecated, and may be removed in - Python 3.14. + Python 3.15. * - .. attribute:: codeobject.co_stacksize - The required stack size of the code object @@ -1643,6 +1883,8 @@ Basic customization It is not guaranteed that :meth:`__del__` methods are called for objects that still exist when the interpreter exits. + :class:`weakref.finalize` provides a straightforward way to register + a cleanup function to be called when an object is garbage collected. .. note:: @@ -1700,7 +1942,8 @@ Basic customization "informal" string representation of instances of that class is required. This is typically used for debugging, so it is important that the representation - is information-rich and unambiguous. + is information-rich and unambiguous. A default implementation is provided by the + :class:`object` class itself. .. index:: single: string; __str__() (object method) @@ -1710,10 +1953,10 @@ Basic customization .. method:: object.__str__(self) - Called by :func:`str(object) ` and the built-in functions - :func:`format` and :func:`print` to compute the "informal" or nicely + Called by :func:`str(object) `, the default :meth:`__format__` implementation, + and the built-in function :func:`print`, to compute the "informal" or nicely printable string representation of an object. The return value must be a - :ref:`string ` object. + :ref:`str ` object. This method differs from :meth:`object.__repr__` in that there is no expectation that :meth:`__str__` return a valid Python expression: a more @@ -1730,7 +1973,8 @@ Basic customization .. index:: pair: built-in function; bytes Called by :ref:`bytes ` to compute a byte-string representation - of an object. This should return a :class:`bytes` object. + of an object. This should return a :class:`bytes` object. The :class:`object` + class itself does not provide this method. .. index:: single: string; __format__() (object method) @@ -1754,6 +1998,9 @@ Basic customization The return value must be a string object. + The default implementation by the :class:`object` class should be given + an empty *format_spec* string. It delegates to :meth:`__str__`. + .. versionchanged:: 3.4 The __format__ method of ``object`` itself raises a :exc:`TypeError` if passed any non-empty string. @@ -1796,6 +2043,12 @@ Basic customization ``(x` with multiple slotted parent @@ -2547,7 +2801,7 @@ in the local namespace as the defined class. When a new class is created by ``type.__new__``, the object provided as the namespace parameter is copied to a new ordered mapping and the original object is discarded. The new copy is wrapped in a read-only proxy, which -becomes the :attr:`~object.__dict__` attribute of the class object. +becomes the :attr:`~type.__dict__` attribute of the class object. .. seealso:: @@ -2575,14 +2829,14 @@ order to allow the addition of Abstract Base Classes (ABCs) as "virtual base classes" to any class or type (including built-in types), including other ABCs. -.. method:: class.__instancecheck__(self, instance) +.. method:: type.__instancecheck__(self, instance) Return true if *instance* should be considered a (direct or indirect) instance of *class*. If defined, called to implement ``isinstance(instance, class)``. -.. method:: class.__subclasscheck__(self, subclass) +.. method:: type.__subclasscheck__(self, subclass) Return true if *subclass* should be considered a (direct or indirect) subclass of *class*. If defined, called to implement ``issubclass(subclass, @@ -2598,8 +2852,8 @@ case the instance is itself a class. :pep:`3119` - Introducing Abstract Base Classes Includes the specification for customizing :func:`isinstance` and - :func:`issubclass` behavior through :meth:`~class.__instancecheck__` and - :meth:`~class.__subclasscheck__`, with motivation for this functionality + :func:`issubclass` behavior through :meth:`~type.__instancecheck__` and + :meth:`~type.__subclasscheck__`, with motivation for this functionality in the context of adding Abstract Base Classes (see the :mod:`abc` module) to the language. @@ -2757,6 +3011,7 @@ Emulating callable objects Called when the instance is "called" as a function; if this method is defined, ``x(arg1, arg2, ...)`` roughly translates to ``type(x).__call__(x, arg1, ...)``. + The :class:`object` class itself does not provide this method. .. _sequence-types: @@ -2764,10 +3019,11 @@ Emulating callable objects Emulating container types ------------------------- -The following methods can be defined to implement container objects. Containers -usually are :term:`sequences ` (such as :class:`lists ` or +The following methods can be defined to implement container objects. None of them +are provided by the :class:`object` class itself. Containers usually are +:term:`sequences ` (such as :class:`lists ` or :class:`tuples `) or :term:`mappings ` (like -:class:`dictionaries `), +:term:`dictionaries `), but can represent other containers as well. The first set of methods is used either to emulate a sequence or to emulate a mapping; the difference is that for a sequence, the allowable keys should be the integers *k* for which ``0 <= k < @@ -3130,6 +3386,7 @@ Typical uses of context managers include saving and restoring various kinds of global state, locking and unlocking resources, closing opened files, etc. For more information on context managers, see :ref:`typecontextmanager`. +The :class:`object` class itself does not provide the context manager methods. .. method:: object.__enter__(self) @@ -3334,6 +3591,8 @@ are awaitable. Must return an :term:`iterator`. Should be used to implement :term:`awaitable` objects. For instance, :class:`asyncio.Future` implements this method to be compatible with the :keyword:`await` expression. + The :class:`object` class itself is not awaitable and does not provide + this method. .. note:: @@ -3419,6 +3678,9 @@ its ``__anext__`` method. Asynchronous iterators can be used in an :keyword:`async for` statement. +The :class:`object` class itself does not provide these methods. + + .. method:: object.__aiter__(self) Must return an *asynchronous iterator* object. @@ -3465,6 +3727,8 @@ suspend execution in its ``__aenter__`` and ``__aexit__`` methods. Asynchronous context managers can be used in an :keyword:`async with` statement. +The :class:`object` class itself does not provide these methods. + .. method:: object.__aenter__(self) Semantically similar to :meth:`~object.__enter__`, the only diff --git a/Doc/reference/executionmodel.rst b/Doc/reference/executionmodel.rst index ed50faed..44b852d4 100644 --- a/Doc/reference/executionmodel.rst +++ b/Doc/reference/executionmodel.rst @@ -225,8 +225,8 @@ Annotation scopes differ from function scopes in the following ways: statements in inner scopes. This includes only type parameters, as no other syntactic elements that can appear within annotation scopes can introduce new names. * While annotation scopes have an internal name, that name is not reflected in the - :term:`__qualname__ ` of objects defined within the scope. - Instead, the :attr:`!__qualname__` + :term:`qualified name` of objects defined within the scope. + Instead, the :attr:`~definition.__qualname__` of such objects is as if the object were defined in the enclosing scope. .. versionadded:: 3.12 diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index 38f00ae2..6c178ad8 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -33,7 +33,7 @@ implementation for built-in types works as follows: * If either argument is a complex number, the other is converted to complex; -* otherwise, if either argument is a floating point number, the other is +* otherwise, if either argument is a floating-point number, the other is converted to floating point; * otherwise, both must be integers and no conversion is necessary. @@ -83,18 +83,47 @@ exception. pair: name; mangling pair: private; names -**Private name mangling:** When an identifier that textually occurs in a class -definition begins with two or more underscore characters and does not end in two -or more underscores, it is considered a :dfn:`private name` of that class. -Private names are transformed to a longer form before code is generated for -them. The transformation inserts the class name, with leading underscores -removed and a single underscore inserted, in front of the name. For example, -the identifier ``__spam`` occurring in a class named ``Ham`` will be transformed -to ``_Ham__spam``. This transformation is independent of the syntactical -context in which the identifier is used. If the transformed name is extremely -long (longer than 255 characters), implementation defined truncation may happen. -If the class name consists only of underscores, no transformation is done. +Private name mangling +^^^^^^^^^^^^^^^^^^^^^ +When an identifier that textually occurs in a class definition begins with two +or more underscore characters and does not end in two or more underscores, it +is considered a :dfn:`private name` of that class. + +.. seealso:: + + The :ref:`class specifications `. + +More precisely, private names are transformed to a longer form before code is +generated for them. If the transformed name is longer than 255 characters, +implementation-defined truncation may happen. + +The transformation is independent of the syntactical context in which the +identifier is used but only the following private identifiers are mangled: + +- Any name used as the name of a variable that is assigned or read or any + name of an attribute being accessed. + + The :attr:`~definition.__name__` attribute of nested functions, classes, and + type aliases is however not mangled. + +- The name of imported modules, e.g., ``__spam`` in ``import __spam``. + If the module is part of a package (i.e., its name contains a dot), + the name is *not* mangled, e.g., the ``__foo`` in ``import __foo.bar`` + is not mangled. + +- The name of an imported member, e.g., ``__f`` in ``from spam import __f``. + +The transformation rule is defined as follows: + +- The class name, with leading underscores removed and a single leading + underscore inserted, is inserted in front of the identifier, e.g., the + identifier ``__spam`` occurring in a class named ``Foo``, ``_Foo`` or + ``__Foo`` is transformed to ``_Foo__spam``. + +- If the class name consists only of underscores, the transformation is the + identity, e.g., the identifier ``__spam`` occurring in a class named ``_`` + or ``__`` is left as is. .. _atom-literals: @@ -110,8 +139,8 @@ Python supports string and bytes literals and various numeric literals: : | `integer` | `floatnumber` | `imagnumber` Evaluation of a literal yields an object of the given type (string, bytes, -integer, floating point number, complex number) with the given value. The value -may be approximated in the case of floating point and imaginary (complex) +integer, floating-point number, complex number) with the given value. The value +may be approximated in the case of floating-point and imaginary (complex) literals. See section :ref:`literals` for details. .. index:: @@ -218,10 +247,12 @@ A comprehension in an :keyword:`!async def` function may consist of either a :keyword:`!for` or :keyword:`!async for` clause following the leading expression, may contain additional :keyword:`!for` or :keyword:`!async for` clauses, and may also use :keyword:`await` expressions. -If a comprehension contains either :keyword:`!async for` clauses or -:keyword:`!await` expressions or other asynchronous comprehensions it is called -an :dfn:`asynchronous comprehension`. An asynchronous comprehension may -suspend the execution of the coroutine function in which it appears. + +If a comprehension contains :keyword:`!async for` clauses, or if it contains +:keyword:`!await` expressions or other asynchronous comprehensions anywhere except +the iterable expression in the leftmost :keyword:`!for` clause, it is called an +:dfn:`asynchronous comprehension`. An asynchronous comprehension may suspend the +execution of the coroutine function in which it appears. See also :pep:`530`. .. versionadded:: 3.6 @@ -253,7 +284,7 @@ A list display is a possibly empty series of expressions enclosed in square brackets: .. productionlist:: python-grammar - list_display: "[" [`starred_list` | `comprehension`] "]" + list_display: "[" [`flexible_expression_list` | `comprehension`] "]" A list display yields a new list object, the contents being specified by either a list of expressions or a comprehension. When a comma-separated list of @@ -278,7 +309,7 @@ A set display is denoted by curly braces and distinguishable from dictionary displays by the lack of colons separating keys and values: .. productionlist:: python-grammar - set_display: "{" (`starred_list` | `comprehension`) "}" + set_display: "{" (`flexible_expression_list` | `comprehension`) "}" A set display yields a new mutable set object, the contents being specified by either a sequence of expressions or a comprehension. When a comma-separated @@ -423,7 +454,7 @@ Yield expressions .. productionlist:: python-grammar yield_atom: "(" `yield_expression` ")" yield_from: "yield" "from" `expression` - yield_expression: "yield" `expression_list` | `yield_from` + yield_expression: "yield" `yield_list` | `yield_from` The yield expression is used when defining a :term:`generator` function or an :term:`asynchronous generator` function and @@ -454,9 +485,9 @@ When a generator function is called, it returns an iterator known as a generator. That generator then controls the execution of the generator function. The execution starts when one of the generator's methods is called. At that time, the execution proceeds to the first yield expression, where it is -suspended again, returning the value of :token:`~python-grammar:expression_list` +suspended again, returning the value of :token:`~python-grammar:yield_list` to the generator's caller, -or ``None`` if :token:`~python-grammar:expression_list` is omitted. +or ``None`` if :token:`~python-grammar:yield_list` is omitted. By suspended, we mean that all local state is retained, including the current bindings of local variables, the instruction pointer, the internal evaluation stack, and the state of any exception handling. @@ -545,7 +576,7 @@ is already executing raises a :exc:`ValueError` exception. :meth:`~generator.__next__` method, the current yield expression always evaluates to :const:`None`. The execution then continues to the next yield expression, where the generator is suspended again, and the value of the - :token:`~python-grammar:expression_list` is returned to :meth:`__next__`'s + :token:`~python-grammar:yield_list` is returned to :meth:`__next__`'s caller. If the generator exits without yielding another value, a :exc:`StopIteration` exception is raised. @@ -657,7 +688,7 @@ how a generator object would be used in a :keyword:`for` statement. Calling one of the asynchronous generator's methods returns an :term:`awaitable` object, and the execution starts when this object is awaited on. At that time, the execution proceeds to the first yield expression, where it is suspended -again, returning the value of :token:`~python-grammar:expression_list` to the +again, returning the value of :token:`~python-grammar:yield_list` to the awaiting coroutine. As with a generator, suspension means that all local state is retained, including the current bindings of local variables, the instruction pointer, the internal evaluation stack, and the state of any exception handling. @@ -721,7 +752,7 @@ which are used to control the execution of a generator function. asynchronous generator function is resumed with an :meth:`~agen.__anext__` method, the current yield expression always evaluates to :const:`None` in the returned awaitable, which when run will continue to the next yield - expression. The value of the :token:`~python-grammar:expression_list` of the + expression. The value of the :token:`~python-grammar:yield_list` of the yield expression is the value of the :exc:`StopIteration` exception raised by the completing coroutine. If the asynchronous generator exits without yielding another value, the awaitable instead raises a @@ -734,7 +765,7 @@ which are used to control the execution of a generator function. .. coroutinemethod:: agen.asend(value) Returns an awaitable which when run resumes the execution of the - asynchronous generator. As with the :meth:`~generator.send()` method for a + asynchronous generator. As with the :meth:`~generator.send` method for a generator, this "sends" a value into the asynchronous generator function, and the *value* argument becomes the result of the current yield expression. The awaitable returned by the :meth:`asend` method will return the next @@ -854,7 +885,7 @@ will generally select an element from the container. The subscription of a :ref:`GenericAlias ` object. .. productionlist:: python-grammar - subscription: `primary` "[" `expression_list` "]" + subscription: `primary` "[" `flexible_expression_list` "]" When an object is subscripted, the interpreter will evaluate the primary and the expression list. @@ -866,9 +897,13 @@ primary is subscripted, the evaluated result of the expression list will be passed to one of these methods. For more details on when ``__class_getitem__`` is called instead of ``__getitem__``, see :ref:`classgetitem-versus-getitem`. -If the expression list contains at least one comma, it will evaluate to a -:class:`tuple` containing the items of the expression list. Otherwise, the -expression list will evaluate to the value of the list's sole member. +If the expression list contains at least one comma, or if any of the expressions +are starred, the expression list will evaluate to a :class:`tuple` containing +the items of the expression list. Otherwise, the expression list will evaluate +to the value of the list's sole member. + +.. versionchanged:: 3.11 + Expressions in an expression list may be starred. See :pep:`646`. For built-in objects, there are two types of objects that support subscription via :meth:`~object.__getitem__`: @@ -1114,7 +1149,8 @@ a user-defined function: first thing the code block will do is bind the formal parameters to the arguments; this is described in section :ref:`function`. When the code block executes a :keyword:`return` statement, this specifies the return value of the - function call. + function call. If execution reaches the end of the code block without + executing a :keyword:`return` statement, the return value is ``None``. a built-in function or method: .. index:: @@ -1204,7 +1240,8 @@ Raising ``0.0`` to a negative power results in a :exc:`ZeroDivisionError`. Raising a negative number to a fractional power results in a :class:`complex` number. (In earlier versions it raised a :exc:`ValueError`.) -This operation can be customized using the special :meth:`~object.__pow__` method. +This operation can be customized using the special :meth:`~object.__pow__` and +:meth:`~object.__rpow__` methods. .. _unary: @@ -1292,6 +1329,9 @@ This operation can be customized using the special :meth:`~object.__mul__` and The ``@`` (at) operator is intended to be used for matrix multiplication. No builtin Python types implement this operator. +This operation can be customized using the special :meth:`~object.__matmul__` and +:meth:`~object.__rmatmul__` methods. + .. versionadded:: 3.5 .. index:: @@ -1307,8 +1347,10 @@ integer; the result is that of mathematical division with the 'floor' function applied to the result. Division by zero raises the :exc:`ZeroDivisionError` exception. -This operation can be customized using the special :meth:`~object.__truediv__` and -:meth:`~object.__floordiv__` methods. +The division operation can be customized using the special :meth:`~object.__truediv__` +and :meth:`~object.__rtruediv__` methods. +The floor division operation can be customized using the special +:meth:`~object.__floordiv__` and :meth:`~object.__rfloordiv__` methods. .. index:: single: modulo @@ -1317,7 +1359,7 @@ This operation can be customized using the special :meth:`~object.__truediv__` a The ``%`` (modulo) operator yields the remainder from the division of the first argument by the second. The numeric arguments are first converted to a common type. A zero right argument raises the :exc:`ZeroDivisionError` exception. The -arguments may be floating point numbers, e.g., ``3.14%0.7`` equals ``0.34`` +arguments may be floating-point numbers, e.g., ``3.14%0.7`` equals ``0.34`` (since ``3.14`` equals ``4*0.7 + 0.34``.) The modulo operator always yields a result with the same sign as its second operand (or zero); the absolute value of the result is strictly smaller than the absolute value of the second operand @@ -1333,11 +1375,12 @@ also overloaded by string objects to perform old-style string formatting (also known as interpolation). The syntax for string formatting is described in the Python Library Reference, section :ref:`old-string-formatting`. -The *modulo* operation can be customized using the special :meth:`~object.__mod__` method. +The *modulo* operation can be customized using the special :meth:`~object.__mod__` +and :meth:`~object.__rmod__` methods. The floor division operator, the modulo operator, and the :func:`divmod` -function are not defined for complex numbers. Instead, convert to a floating -point number using the :func:`abs` function if appropriate. +function are not defined for complex numbers. Instead, convert to a +floating-point number using the :func:`abs` function if appropriate. .. index:: single: addition @@ -1360,7 +1403,8 @@ This operation can be customized using the special :meth:`~object.__add__` and The ``-`` (subtraction) operator yields the difference of its arguments. The numeric arguments are first converted to a common type. -This operation can be customized using the special :meth:`~object.__sub__` method. +This operation can be customized using the special :meth:`~object.__sub__` and +:meth:`~object.__rsub__` methods. .. _shifting: @@ -1381,8 +1425,10 @@ The shifting operations have lower priority than the arithmetic operations: These operators accept integers as arguments. They shift the first argument to the left or right by the number of bits given by the second argument. -This operation can be customized using the special :meth:`~object.__lshift__` and -:meth:`~object.__rshift__` methods. +The left shift operation can be customized using the special :meth:`~object.__lshift__` +and :meth:`~object.__rlshift__` methods. +The right shift operation can be customized using the special :meth:`~object.__rshift__` +and :meth:`~object.__rrshift__` methods. .. index:: pair: exception; ValueError @@ -1857,10 +1903,12 @@ Expression lists single: , (comma); expression list .. productionlist:: python-grammar + starred_expression: ["*"] `or_expr` + flexible_expression: `assignment_expression` | `starred_expression` + flexible_expression_list: `flexible_expression` ("," `flexible_expression`)* [","] + starred_expression_list: `starred_expression` ("," `starred_expression`)* [","] expression_list: `expression` ("," `expression`)* [","] - starred_list: `starred_item` ("," `starred_item`)* [","] - starred_expression: `expression` | (`starred_item` ",")* [`starred_item`] - starred_item: `assignment_expression` | "*" `or_expr` + yield_list: `expression_list` | `starred_expression` "," [`starred_expression_list`] .. index:: pair: object; tuple @@ -1881,6 +1929,9 @@ the unpacking. .. versionadded:: 3.5 Iterable unpacking in expression lists, originally proposed by :pep:`448`. +.. versionadded:: 3.11 + Any item in an expression list may be starred. See :pep:`646`. + .. index:: pair: trailing; comma A trailing comma is required only to create a one-item tuple, diff --git a/Doc/reference/import.rst b/Doc/reference/import.rst index f8c97241..ac363e8c 100644 --- a/Doc/reference/import.rst +++ b/Doc/reference/import.rst @@ -281,7 +281,7 @@ When the named module is not found in :data:`sys.modules`, Python next searches :data:`sys.meta_path`, which contains a list of meta path finder objects. These finders are queried in order to see if they know how to handle the named module. Meta path finders must implement a method called -:meth:`~importlib.abc.MetaPathFinder.find_spec()` which takes three arguments: +:meth:`~importlib.abc.MetaPathFinder.find_spec` which takes three arguments: a name, an import path, and (optionally) a target module. The meta path finder can use any strategy it wants to determine whether it can handle the named module or not. @@ -292,7 +292,7 @@ spec object. If it cannot handle the named module, it returns ``None``. If a spec, then a :exc:`ModuleNotFoundError` is raised. Any other exceptions raised are simply propagated up, aborting the import process. -The :meth:`~importlib.abc.MetaPathFinder.find_spec()` method of meta path +The :meth:`~importlib.abc.MetaPathFinder.find_spec` method of meta path finders is called with two or three arguments. The first is the fully qualified name of the module being imported, for example ``foo.bar.baz``. The second argument is the path entries to use for the module search. For @@ -513,8 +513,10 @@ holding is that if you have ``sys.modules['spam']`` and ``sys.modules['spam.foo']`` (as you would after the above import), the latter must appear as the ``foo`` attribute of the former. -Module spec ------------ +.. _module-specs: + +Module specs +------------ The import machinery uses a variety of information about each module during import, especially before loading. Most of the information is @@ -527,155 +529,44 @@ and the loader that executes it. Most importantly, it allows the import machinery to perform the boilerplate operations of loading, whereas without a module spec the loader had that responsibility. -The module's spec is exposed as the ``__spec__`` attribute on a module object. +The module's spec is exposed as :attr:`module.__spec__`. Setting +:attr:`!__spec__` appropriately applies equally to +:ref:`modules initialized during interpreter startup `. +The one exception is ``__main__``, where :attr:`!__spec__` is +:ref:`set to None in some cases `. + See :class:`~importlib.machinery.ModuleSpec` for details on the contents of the module spec. .. versionadded:: 3.4 -.. _import-mod-attrs: - -Import-related module attributes --------------------------------- - -The import machinery fills in these attributes on each module object -during loading, based on the module's spec, before the loader executes -the module. - -It is **strongly** recommended that you rely on :attr:`__spec__` and -its attributes instead of any of the other individual attributes -listed below. - -.. attribute:: __name__ - - The ``__name__`` attribute must be set to the fully qualified name of - the module. This name is used to uniquely identify the module in - the import system. - -.. attribute:: __loader__ - - The ``__loader__`` attribute must be set to the loader object that - the import machinery used when loading the module. This is mostly - for introspection, but can be used for additional loader-specific - functionality, for example getting data associated with a loader. - - It is **strongly** recommended that you rely on :attr:`__spec__` - instead of this attribute. - - .. versionchanged:: 3.12 - The value of ``__loader__`` is expected to be the same as - ``__spec__.loader``. The use of ``__loader__`` is deprecated and slated - for removal in Python 3.14. - -.. attribute:: __package__ - - The module's ``__package__`` attribute may be set. Its value must - be a string, but it can be the same value as its ``__name__``. When - the module is a package, its ``__package__`` value should be set to - its ``__name__``. When the module is not a package, ``__package__`` - should be set to the empty string for top-level modules, or for - submodules, to the parent package's name. See :pep:`366` for further - details. - - This attribute is used instead of ``__name__`` to calculate explicit - relative imports for main modules, as defined in :pep:`366`. - - It is **strongly** recommended that you rely on :attr:`__spec__` - instead of this attribute. - - .. versionchanged:: 3.6 - The value of ``__package__`` is expected to be the same as - ``__spec__.parent``. - - .. versionchanged:: 3.10 - :exc:`ImportWarning` is raised if import falls back to - ``__package__`` instead of - :attr:`~importlib.machinery.ModuleSpec.parent`. - - .. versionchanged:: 3.12 - Raise :exc:`DeprecationWarning` instead of :exc:`ImportWarning` - when falling back to ``__package__``. - - -.. attribute:: __spec__ - - The ``__spec__`` attribute must be set to the module spec that was - used when importing the module. Setting ``__spec__`` - appropriately applies equally to :ref:`modules initialized during - interpreter startup `. The one exception is ``__main__``, - where ``__spec__`` is :ref:`set to None in some cases `. - - When ``__spec__.parent`` is not set, ``__package__`` is used as - a fallback. - - .. versionadded:: 3.4 - - .. versionchanged:: 3.6 - ``__spec__.parent`` is used as a fallback when ``__package__`` is - not defined. - -.. attribute:: __path__ - - If the module is a package (either regular or namespace), the module - object's ``__path__`` attribute must be set. The value must be - iterable, but may be empty if ``__path__`` has no further significance. - If ``__path__`` is not empty, it must produce strings when iterated - over. More details on the semantics of ``__path__`` are given - :ref:`below `. - - Non-package modules should not have a ``__path__`` attribute. - -.. attribute:: __file__ -.. attribute:: __cached__ - - ``__file__`` is optional (if set, value must be a string). It indicates - the pathname of the file from which the module was loaded (if - loaded from a file), or the pathname of the shared library file - for extension modules loaded dynamically from a shared library. - It might be missing for certain types of modules, such as C - modules that are statically linked into the interpreter, and the - import system may opt to leave it unset if it has no semantic - meaning (e.g. a module loaded from a database). - - If ``__file__`` is set then the ``__cached__`` attribute might also - be set, which is the path to any compiled version of - the code (e.g. byte-compiled file). The file does not need to exist - to set this attribute; the path can simply point to where the - compiled file would exist (see :pep:`3147`). - - Note that ``__cached__`` may be set even if ``__file__`` is not - set. However, that scenario is quite atypical. Ultimately, the - loader is what makes use of the module spec provided by the finder - (from which ``__file__`` and ``__cached__`` are derived). So - if a loader can load from a cached module but otherwise does not load - from a file, that atypical scenario may be appropriate. - - It is **strongly** recommended that you rely on :attr:`__spec__` - instead of ``__cached__``. - .. _package-path-rules: -module.__path__ ---------------- +__path__ attributes on modules +------------------------------ -By definition, if a module has a ``__path__`` attribute, it is a package. +The :attr:`~module.__path__` attribute should be a (possibly empty) +:term:`sequence` of strings enumerating the locations where the package's +submodules will be found. By definition, if a module has a :attr:`!__path__` +attribute, it is a :term:`package`. -A package's ``__path__`` attribute is used during imports of its subpackages. +A package's :attr:`~module.__path__` attribute is used during imports of its +subpackages. Within the import machinery, it functions much the same as :data:`sys.path`, i.e. providing a list of locations to search for modules during import. -However, ``__path__`` is typically much more constrained than -:data:`sys.path`. +However, :attr:`!__path__` is typically much more constrained than +:data:`!sys.path`. -``__path__`` must be an iterable of strings, but it may be empty. The same rules used for :data:`sys.path` also apply to a package's -``__path__``, and :data:`sys.path_hooks` (described below) are -consulted when traversing a package's ``__path__``. +:attr:`!__path__`. :data:`sys.path_hooks` (described below) are +consulted when traversing a package's :attr:`!__path__`. -A package's ``__init__.py`` file may set or alter the package's ``__path__`` +A package's ``__init__.py`` file may set or alter the package's +:attr:`~module.__path__` attribute, and this was typically the way namespace packages were implemented prior to :pep:`420`. With the adoption of :pep:`420`, namespace packages no -longer need to supply ``__init__.py`` files containing only ``__path__`` -manipulation code; the import machinery automatically sets ``__path__`` +longer need to supply ``__init__.py`` files containing only :attr:`!__path__` +manipulation code; the import machinery automatically sets :attr:`!__path__` correctly for the namespace package. Module reprs diff --git a/Doc/reference/introduction.rst b/Doc/reference/introduction.rst index cf186705..b7b70e6b 100644 --- a/Doc/reference/introduction.rst +++ b/Doc/reference/introduction.rst @@ -74,7 +74,7 @@ PyPy and a Just in Time compiler. One of the goals of the project is to encourage experimentation with the language itself by making it easier to modify the interpreter (since it is written in Python). Additional information is - available on `the PyPy project's home page `_. + available on `the PyPy project's home page `_. Each of these implementations varies in some way from the language as documented in this manual, or introduces specific information beyond what's covered in the diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst index 103d6ef0..41d8fbae 100644 --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -284,11 +284,10 @@ UAX-31, with elaboration and changes as defined below; see also :pep:`3131` for further details. Within the ASCII range (U+0001..U+007F), the valid characters for identifiers -are the same as in Python 2.x: the uppercase and lowercase letters ``A`` through +include the uppercase and lowercase letters ``A`` through ``Z``, the underscore ``_`` and, except for the first character, the digits ``0`` through ``9``. - -Python 3.0 introduces additional characters from outside the ASCII range (see +Python 3.0 introduced additional characters from outside the ASCII range (see :pep:`3131`). For these characters, the classification uses the version of the Unicode Character Database as included in the :mod:`unicodedata` module. @@ -503,11 +502,10 @@ must be expressed with escapes. single: r"; raw string literal Both string and bytes literals may optionally be prefixed with a letter ``'r'`` -or ``'R'``; such strings are called :dfn:`raw strings` and treat backslashes as -literal characters. As a result, in string literals, ``'\U'`` and ``'\u'`` -escapes in raw strings are not treated specially. Given that Python 2.x's raw -unicode literals behave differently than Python 3.x's the ``'ur'`` syntax -is not supported. +or ``'R'``; such constructs are called :dfn:`raw string literals` +and :dfn:`raw bytes literals` respectively and treat backslashes as +literal characters. As a result, in raw string literals, ``'\U'`` and ``'\u'`` +escapes are not treated specially. .. versionadded:: 3.3 The ``'rb'`` prefix of raw bytes literals has been added as a synonym @@ -879,10 +877,10 @@ Numeric literals ---------------- .. index:: number, numeric literal, integer literal - floating point literal, hexadecimal literal + floating-point literal, hexadecimal literal octal literal, binary literal, decimal literal, imaginary literal, complex literal -There are three types of numeric literals: integers, floating point numbers, and +There are three types of numeric literals: integers, floating-point numbers, and imaginary numbers. There are no complex literals (complex numbers can be formed by adding a real number and an imaginary number). @@ -943,10 +941,10 @@ Some examples of integer literals:: single: _ (underscore); in numeric literal .. _floating: -Floating point literals +Floating-point literals ----------------------- -Floating point literals are described by the following lexical definitions: +Floating-point literals are described by the following lexical definitions: .. productionlist:: python-grammar floatnumber: `pointfloat` | `exponentfloat` @@ -958,10 +956,10 @@ Floating point literals are described by the following lexical definitions: Note that the integer and exponent parts are always interpreted using radix 10. For example, ``077e010`` is legal, and denotes the same number as ``77e10``. The -allowed range of floating point literals is implementation-dependent. As in +allowed range of floating-point literals is implementation-dependent. As in integer literals, underscores are supported for digit grouping. -Some examples of floating point literals:: +Some examples of floating-point literals:: 3.14 10. .001 1e100 3.14e-10 0e0 3.14_15_93 @@ -982,9 +980,9 @@ Imaginary literals are described by the following lexical definitions: imagnumber: (`floatnumber` | `digitpart`) ("j" | "J") An imaginary literal yields a complex number with a real part of 0.0. Complex -numbers are represented as a pair of floating point numbers and have the same +numbers are represented as a pair of floating-point numbers and have the same restrictions on their range. To create a complex number with a nonzero real -part, add a floating point number to it, e.g., ``(3+4j)``. Some examples of +part, add a floating-point number to it, e.g., ``(3+4j)``. Some examples of imaginary literals:: 3.14j 10.j 10j .001j 1e100j 3.14e-10j 3.14_15_93j @@ -1019,9 +1017,9 @@ The following tokens serve as delimiters in the grammar: .. code-block:: none ( ) [ ] { } - , : . ; @ = -> - += -= *= /= //= %= @= - &= |= ^= >>= <<= **= + , : ! . ; @ = + -> += -= *= /= //= %= + @= &= |= ^= >>= <<= **= The period can also occur in floating-point and imaginary literals. A sequence of three periods has a special meaning as an ellipsis literal. The second half diff --git a/Doc/reference/simple_stmts.rst b/Doc/reference/simple_stmts.rst index a2534821..5e3ede69 100644 --- a/Doc/reference/simple_stmts.rst +++ b/Doc/reference/simple_stmts.rst @@ -293,7 +293,7 @@ statements, cannot be an unpacking) and the expression list, performs the binary operation specific to the type of assignment on the two operands, and assigns the result to the original target. The target is only evaluated once. -An augmented assignment expression like ``x += 1`` can be rewritten as ``x = x + +An augmented assignment statement like ``x += 1`` can be rewritten as ``x = x + 1`` to achieve a similar, but not exactly equal effect. In the augmented version, ``x`` is only evaluated once. Also, when possible, the actual operation is performed *in-place*, meaning that rather than creating a new object and @@ -333,7 +333,9 @@ statement, of a variable or attribute annotation and an optional assignment stat The difference from normal :ref:`assignment` is that only a single target is allowed. -For simple names as assignment targets, if in class or module scope, +The assignment target is considered "simple" if it consists of a single +name that is not enclosed in parentheses. +For simple assignment targets, if in class or module scope, the annotations are evaluated and stored in a special class or module attribute :attr:`__annotations__` that is a dictionary mapping from variable names (mangled if private) to @@ -341,7 +343,8 @@ evaluated annotations. This attribute is writable and is automatically created at the start of class or module body execution, if annotations are found statically. -For expressions as assignment targets, the annotations are evaluated if +If the assignment target is not simple (an attribute, subscript node, or +parenthesized name), the annotation is evaluated if in class or module scope, but not stored. If a name is annotated in a function scope, then this name is local for @@ -403,9 +406,9 @@ The extended form, ``assert expression1, expression2``, is equivalent to :: These equivalences assume that :const:`__debug__` and :exc:`AssertionError` refer to the built-in variables with those names. In the current implementation, the -built-in variable :const:`__debug__` is ``True`` under normal circumstances, +built-in variable ``__debug__`` is ``True`` under normal circumstances, ``False`` when optimization is requested (command line option :option:`-O`). The current -code generator emits no code for an assert statement when optimization is +code generator emits no code for an :keyword:`assert` statement when optimization is requested at compile time. Note that it is unnecessary to include the source code for the expression that failed in the error message; it will be displayed as part of the stack trace. @@ -528,8 +531,8 @@ The :keyword:`!yield` statement yield_stmt: `yield_expression` A :keyword:`yield` statement is semantically equivalent to a :ref:`yield -expression `. The yield statement can be used to omit the parentheses -that would otherwise be required in the equivalent yield expression +expression `. The ``yield`` statement can be used to omit the +parentheses that would otherwise be required in the equivalent yield expression statement. For example, the yield statements :: yield @@ -541,7 +544,7 @@ are equivalent to the yield expression statements :: (yield from ) Yield expressions and statements are only used when defining a :term:`generator` -function, and are only used in the body of the generator function. Using yield +function, and are only used in the body of the generator function. Using :keyword:`yield` in a function definition is sufficient to cause that definition to create a generator function instead of a normal function. @@ -961,25 +964,14 @@ The :keyword:`!global` statement .. productionlist:: python-grammar global_stmt: "global" `identifier` ("," `identifier`)* -The :keyword:`global` statement is a declaration which holds for the entire -current code block. It means that the listed identifiers are to be interpreted -as globals. It would be impossible to assign to a global variable without +The :keyword:`global` statement causes the listed identifiers to be interpreted +as globals. It would be impossible to assign to a global variable without :keyword:`!global`, although free variables may refer to globals without being declared global. -Names listed in a :keyword:`global` statement must not be used in the same code -block textually preceding that :keyword:`!global` statement. - -Names listed in a :keyword:`global` statement must not be defined as formal -parameters, or as targets in :keyword:`with` statements or :keyword:`except` clauses, or in a :keyword:`for` target list, :keyword:`class` -definition, function definition, :keyword:`import` statement, or variable -annotation. - -.. impl-detail:: - - The current implementation does not enforce some of these restrictions, but - programs should not abuse this freedom, as future implementations may enforce - them or silently change the meaning of the program. +The :keyword:`global` statement applies to the entire scope of a function or +class body. A :exc:`SyntaxError` is raised if a variable is used or +assigned to prior to its global declaration in the scope. .. index:: pair: built-in function; exec @@ -1015,7 +1007,7 @@ identifiers. If a name is bound in more than one nonlocal scope, the nearest binding is used. If a name is not bound in any nonlocal scope, or if there is no nonlocal scope, a :exc:`SyntaxError` is raised. -The nonlocal statement applies to the entire scope of a function or +The :keyword:`nonlocal` statement applies to the entire scope of a function or class body. A :exc:`SyntaxError` is raised if a variable is used or assigned to prior to its nonlocal declaration in the scope. diff --git a/Doc/requirements-oldest-sphinx.txt b/Doc/requirements-oldest-sphinx.txt index 3ae65bc9..3483faea 100644 --- a/Doc/requirements-oldest-sphinx.txt +++ b/Doc/requirements-oldest-sphinx.txt @@ -7,29 +7,29 @@ blurb python-docs-theme>=2022.1 # Generated from: -# pip install "Sphinx~=6.2.1" +# pip install "Sphinx~=7.2.6" # pip freeze # -# Sphinx 6.2.1 comes from ``needs_sphinx = '6.2.1'`` in ``Doc/conf.py``. +# Sphinx 7.2.6 comes from ``needs_sphinx = '7.2.6'`` in ``Doc/conf.py``. alabaster==0.7.16 -Babel==2.15.0 -certifi==2024.2.2 -charset-normalizer==3.3.2 -docutils==0.19 -idna==3.7 +Babel==2.16.0 +certifi==2024.8.30 +charset-normalizer==3.4.0 +docutils==0.20.1 +idna==3.10 imagesize==1.4.1 Jinja2==3.1.4 -MarkupSafe==2.1.5 -packaging==24.0 +MarkupSafe==3.0.1 +packaging==24.1 Pygments==2.18.0 -requests==2.32.2 +requests==2.32.3 snowballstemmer==2.2.0 -Sphinx==6.2.1 -sphinxcontrib-applehelp==1.0.8 -sphinxcontrib-devhelp==1.0.6 -sphinxcontrib-htmlhelp==2.0.5 +Sphinx==7.2.6 +sphinxcontrib-applehelp==2.0.0 +sphinxcontrib-devhelp==2.0.0 +sphinxcontrib-htmlhelp==2.1.0 sphinxcontrib-jsmath==1.0.1 -sphinxcontrib-qthelp==1.0.7 -sphinxcontrib-serializinghtml==1.1.10 -urllib3==2.2.1 +sphinxcontrib-qthelp==2.0.0 +sphinxcontrib-serializinghtml==2.0.0 +urllib3==2.2.3 diff --git a/Doc/requirements.txt b/Doc/requirements.txt index b47a9d8a..5105786c 100644 --- a/Doc/requirements.txt +++ b/Doc/requirements.txt @@ -6,12 +6,12 @@ # Sphinx version is pinned so that new versions that introduce new warnings # won't suddenly cause build failures. Updating the version is fine as long # as no warnings are raised by doing so. -sphinx~=7.3.0 +sphinx~=8.1.0 blurb -sphinxext-opengraph==0.7.5 -sphinx-notfound-page==1.0.0 +sphinxext-opengraph~=0.9.0 +sphinx-notfound-page~=1.0.0 # The theme used by the documentation is stored separately, so we need # to install that as well. diff --git a/Doc/tools/.nitignore b/Doc/tools/.nitignore index 108ad393..c665ddd1 100644 --- a/Doc/tools/.nitignore +++ b/Doc/tools/.nitignore @@ -14,8 +14,6 @@ Doc/c-api/type.rst Doc/c-api/typeobj.rst Doc/extending/extending.rst Doc/glossary.rst -Doc/howto/descriptor.rst -Doc/howto/enum.rst Doc/library/2to3.rst Doc/library/aifc.rst Doc/library/ast.rst @@ -91,7 +89,6 @@ Doc/library/xmlrpc.server.rst Doc/library/zlib.rst Doc/reference/compound_stmts.rst Doc/reference/datamodel.rst -Doc/tutorial/datastructures.rst Doc/using/windows.rst Doc/whatsnew/2.4.rst Doc/whatsnew/2.5.rst diff --git a/Doc/tools/check-warnings.py b/Doc/tools/check-warnings.py index c50b0063..8f92ab29 100644 --- a/Doc/tools/check-warnings.py +++ b/Doc/tools/check-warnings.py @@ -2,6 +2,7 @@ """ Check the output of running Sphinx in nit-picky mode (missing references). """ + from __future__ import annotations import argparse @@ -14,7 +15,7 @@ from typing import TextIO # Fail if NEWS nit found before this line number -NEWS_NIT_THRESHOLD = 200 +NEWS_NIT_THRESHOLD = 300 # Exclude these whether they're dirty or clean, # because they trigger a rebuild of dirty files. @@ -206,7 +207,9 @@ def annotate_diff( def fail_if_regression( - warnings: list[str], files_with_expected_nits: set[str], files_with_nits: set[str] + warnings: list[str], + files_with_expected_nits: set[str], + files_with_nits: set[str], ) -> int: """ Ensure some files always pass Sphinx nit-picky mode (no missing references). @@ -252,17 +255,11 @@ def fail_if_new_news_nit(warnings: list[str], threshold: int) -> int: """ Ensure no warnings are found in the NEWS file before a given line number. """ - news_nits = ( - warning - for warning in warnings - if "/build/NEWS:" in warning - ) + news_nits = (warning for warning in warnings if "/build/NEWS:" in warning) # Nits found before the threshold line new_news_nits = [ - nit - for nit in news_nits - if int(nit.split(":")[1]) <= threshold + nit for nit in news_nits if int(nit.split(":")[1]) <= threshold ] if new_news_nits: @@ -311,7 +308,8 @@ def main(argv: list[str] | None = None) -> int: exit_code = 0 wrong_directory_msg = "Must run this script from the repo root" - assert Path("Doc").exists() and Path("Doc").is_dir(), wrong_directory_msg + if not Path("Doc").exists() or not Path("Doc").is_dir(): + raise RuntimeError(wrong_directory_msg) with Path("Doc/sphinx-warnings.txt").open(encoding="UTF-8") as f: warnings = f.read().splitlines() @@ -339,7 +337,9 @@ def main(argv: list[str] | None = None) -> int: ) if args.fail_if_improved: - exit_code += fail_if_improved(files_with_expected_nits, files_with_nits) + exit_code += fail_if_improved( + files_with_expected_nits, files_with_nits + ) if args.fail_if_new_news_nit: exit_code += fail_if_new_news_nit(warnings, args.fail_if_new_news_nit) diff --git a/Doc/tools/extensions/audit_events.py b/Doc/tools/extensions/audit_events.py new file mode 100644 index 00000000..23d82c0f --- /dev/null +++ b/Doc/tools/extensions/audit_events.py @@ -0,0 +1,264 @@ +"""Support for documenting audit events.""" + +from __future__ import annotations + +import re +from typing import TYPE_CHECKING + +from docutils import nodes +from sphinx.errors import NoUri +from sphinx.locale import _ as sphinx_gettext +from sphinx.transforms.post_transforms import SphinxPostTransform +from sphinx.util import logging +from sphinx.util.docutils import SphinxDirective + +if TYPE_CHECKING: + from collections.abc import Iterator + + from sphinx.application import Sphinx + from sphinx.builders import Builder + from sphinx.environment import BuildEnvironment + +logger = logging.getLogger(__name__) + +# This list of sets are allowable synonyms for event argument names. +# If two names are in the same set, they are treated as equal for the +# purposes of warning. This won't help if the number of arguments is +# different! +_SYNONYMS = [ + frozenset({"file", "path", "fd"}), +] + + +class AuditEvents: + def __init__(self) -> None: + self.events: dict[str, list[str]] = {} + self.sources: dict[str, list[tuple[str, str]]] = {} + + def __iter__(self) -> Iterator[tuple[str, list[str], tuple[str, str]]]: + for name, args in self.events.items(): + for source in self.sources[name]: + yield name, args, source + + def add_event( + self, name, args: list[str], source: tuple[str, str] + ) -> None: + if name in self.events: + self._check_args_match(name, args) + else: + self.events[name] = args + self.sources.setdefault(name, []).append(source) + + def _check_args_match(self, name: str, args: list[str]) -> None: + current_args = self.events[name] + msg = ( + f"Mismatched arguments for audit-event {name}: " + f"{current_args!r} != {args!r}" + ) + if current_args == args: + return + if len(current_args) != len(args): + logger.warning(msg) + return + for a1, a2 in zip(current_args, args, strict=False): + if a1 == a2: + continue + if any(a1 in s and a2 in s for s in _SYNONYMS): + continue + logger.warning(msg) + return + + def id_for(self, name) -> str: + source_count = len(self.sources.get(name, ())) + name_clean = re.sub(r"\W", "_", name) + return f"audit_event_{name_clean}_{source_count}" + + def rows(self) -> Iterator[tuple[str, list[str], list[tuple[str, str]]]]: + for name in sorted(self.events.keys()): + yield name, self.events[name], self.sources[name] + + +def initialise_audit_events(app: Sphinx) -> None: + """Initialise the audit_events attribute on the environment.""" + if not hasattr(app.env, "audit_events"): + app.env.audit_events = AuditEvents() + + +def audit_events_purge( + app: Sphinx, env: BuildEnvironment, docname: str +) -> None: + """This is to remove traces of removed documents from env.audit_events.""" + fresh_audit_events = AuditEvents() + for name, args, (doc, target) in env.audit_events: + if doc != docname: + fresh_audit_events.add_event(name, args, (doc, target)) + + +def audit_events_merge( + app: Sphinx, + env: BuildEnvironment, + docnames: list[str], + other: BuildEnvironment, +) -> None: + """In Sphinx parallel builds, this merges audit_events from subprocesses.""" + for name, args, source in other.audit_events: + env.audit_events.add_event(name, args, source) + + +class AuditEvent(SphinxDirective): + has_content = True + required_arguments = 1 + optional_arguments = 2 + final_argument_whitespace = True + + _label = [ + sphinx_gettext( + "Raises an :ref:`auditing event ` " + "{name} with no arguments." + ), + sphinx_gettext( + "Raises an :ref:`auditing event ` " + "{name} with argument {args}." + ), + sphinx_gettext( + "Raises an :ref:`auditing event ` " + "{name} with arguments {args}." + ), + ] + + def run(self) -> list[nodes.paragraph]: + name = self.arguments[0] + if len(self.arguments) >= 2 and self.arguments[1]: + args = [ + arg + for argument in self.arguments[1].strip("'\"").split(",") + if (arg := argument.strip()) + ] + else: + args = [] + ids = [] + try: + target = self.arguments[2].strip("\"'") + except (IndexError, TypeError): + target = None + if not target: + target = self.env.audit_events.id_for(name) + ids.append(target) + self.env.audit_events.add_event(name, args, (self.env.docname, target)) + + node = nodes.paragraph("", classes=["audit-hook"], ids=ids) + self.set_source_info(node) + if self.content: + node.rawsource = '\n'.join(self.content) # for gettext + self.state.nested_parse(self.content, self.content_offset, node) + else: + num_args = min(2, len(args)) + text = self._label[num_args].format( + name=f"``{name}``", + args=", ".join(f"``{a}``" for a in args), + ) + node.rawsource = text # for gettext + parsed, messages = self.state.inline_text(text, self.lineno) + node += parsed + node += messages + return [node] + + +class audit_event_list(nodes.General, nodes.Element): # noqa: N801 + pass + + +class AuditEventListDirective(SphinxDirective): + def run(self) -> list[audit_event_list]: + return [audit_event_list()] + + +class AuditEventListTransform(SphinxPostTransform): + default_priority = 500 + + def run(self) -> None: + if self.document.next_node(audit_event_list) is None: + return + + table = self._make_table(self.app.builder, self.env.docname) + for node in self.document.findall(audit_event_list): + node.replace_self(table) + + def _make_table(self, builder: Builder, docname: str) -> nodes.table: + table = nodes.table(cols=3) + group = nodes.tgroup( + "", + nodes.colspec(colwidth=30), + nodes.colspec(colwidth=55), + nodes.colspec(colwidth=15), + cols=3, + ) + head = nodes.thead() + body = nodes.tbody() + + table += group + group += head + group += body + + head += nodes.row( + "", + nodes.entry("", nodes.paragraph("", "Audit event")), + nodes.entry("", nodes.paragraph("", "Arguments")), + nodes.entry("", nodes.paragraph("", "References")), + ) + + for name, args, sources in builder.env.audit_events.rows(): + body += self._make_row(builder, docname, name, args, sources) + + return table + + @staticmethod + def _make_row( + builder: Builder, + docname: str, + name: str, + args: list[str], + sources: list[tuple[str, str]], + ) -> nodes.row: + row = nodes.row() + name_node = nodes.paragraph("", nodes.Text(name)) + row += nodes.entry("", name_node) + + args_node = nodes.paragraph() + for arg in args: + args_node += nodes.literal(arg, arg) + args_node += nodes.Text(", ") + if len(args_node.children) > 0: + args_node.children.pop() # remove trailing comma + row += nodes.entry("", args_node) + + backlinks_node = nodes.paragraph() + backlinks = enumerate(sorted(set(sources)), start=1) + for i, (doc, label) in backlinks: + if isinstance(label, str): + ref = nodes.reference("", f"[{i}]", internal=True) + try: + target = ( + f"{builder.get_relative_uri(docname, doc)}#{label}" + ) + except NoUri: + continue + else: + ref["refuri"] = target + backlinks_node += ref + row += nodes.entry("", backlinks_node) + return row + + +def setup(app: Sphinx): + app.add_directive("audit-event", AuditEvent) + app.add_directive("audit-event-table", AuditEventListDirective) + app.add_post_transform(AuditEventListTransform) + app.connect("builder-inited", initialise_audit_events) + app.connect("env-purge-doc", audit_events_purge) + app.connect("env-merge-info", audit_events_merge) + return { + "version": "1.0", + "parallel_read_safe": True, + "parallel_write_safe": True, + } diff --git a/Doc/tools/extensions/availability.py b/Doc/tools/extensions/availability.py new file mode 100644 index 00000000..897af70a --- /dev/null +++ b/Doc/tools/extensions/availability.py @@ -0,0 +1,123 @@ +"""Support for documenting platform availability""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +from docutils import nodes +from sphinx import addnodes +from sphinx.util import logging +from sphinx.util.docutils import SphinxDirective + +if TYPE_CHECKING: + from sphinx.application import Sphinx + from sphinx.util.typing import ExtensionMetadata + +logger = logging.getLogger("availability") + +# known platform, libc, and threading implementations +_PLATFORMS = frozenset({ + "AIX", + "Android", + "BSD", + "DragonFlyBSD", + "Emscripten", + "FreeBSD", + "Linux", + "macOS", + "NetBSD", + "OpenBSD", + "POSIX", + "Solaris", + "Unix", + "VxWorks", + "WASI", + "Windows", +}) +_LIBC = frozenset({ + "BSD libc", + "glibc", + "musl", +}) +_THREADING = frozenset({ + # POSIX platforms with pthreads + "pthreads", +}) +KNOWN_PLATFORMS = _PLATFORMS | _LIBC | _THREADING + + +class Availability(SphinxDirective): + has_content = True + required_arguments = 1 + optional_arguments = 0 + final_argument_whitespace = True + + def run(self) -> list[nodes.container]: + title = "Availability" + refnode = addnodes.pending_xref( + title, + nodes.inline(title, title, classes=["xref", "std", "std-ref"]), + refdoc=self.env.docname, + refdomain="std", + refexplicit=True, + reftarget="availability", + reftype="ref", + refwarn=True, + ) + sep = nodes.Text(": ") + parsed, msgs = self.state.inline_text(self.arguments[0], self.lineno) + pnode = nodes.paragraph(title, "", refnode, sep, *parsed, *msgs) + self.set_source_info(pnode) + cnode = nodes.container("", pnode, classes=["availability"]) + self.set_source_info(cnode) + if self.content: + self.state.nested_parse(self.content, self.content_offset, cnode) + self.parse_platforms() + + return [cnode] + + def parse_platforms(self) -> dict[str, str | bool]: + """Parse platform information from arguments + + Arguments is a comma-separated string of platforms. A platform may + be prefixed with "not " to indicate that a feature is not available. + + Example:: + + .. availability:: Windows, Linux >= 4.2, not WASI + + Arguments like "Linux >= 3.17 with glibc >= 2.27" are currently not + parsed into separate tokens. + """ + platforms = {} + for arg in self.arguments[0].rstrip(".").split(","): + arg = arg.strip() + platform, _, version = arg.partition(" >= ") + if platform.startswith("not "): + version = False + platform = platform.removeprefix("not ") + elif not version: + version = True + platforms[platform] = version + + if unknown := set(platforms).difference(KNOWN_PLATFORMS): + logger.warning( + "Unknown platform%s or syntax '%s' in '.. availability:: %s', " + "see %s:KNOWN_PLATFORMS for a set of known platforms.", + "s" if len(platforms) != 1 else "", + " ".join(sorted(unknown)), + self.arguments[0], + __file__, + ) + + return platforms + + +def setup(app: Sphinx) -> ExtensionMetadata: + app.add_directive("availability", Availability) + + return { + "version": "1.0", + "parallel_read_safe": True, + "parallel_write_safe": True, + } diff --git a/Doc/tools/extensions/c_annotations.py b/Doc/tools/extensions/c_annotations.py index 7916b178..50065d34 100644 --- a/Doc/tools/extensions/c_annotations.py +++ b/Doc/tools/extensions/c_annotations.py @@ -1,226 +1,302 @@ -""" - c_annotations.py - ~~~~~~~~~~~~~~~~ - - Supports annotations for C API elements: +"""Support annotations for C API elements. - * reference count annotations for C API functions. Based on - refcount.py and anno-api.py in the old Python documentation tools. +* Reference count annotations for C API functions. +* Stable ABI annotations +* Limited API annotations - * stable API annotations +Configuration: +* Set ``refcount_file`` to the path to the reference count data file. +* Set ``stable_abi_file`` to the path to stable ABI list. +""" - Usage: - * Set the `refcount_file` config value to the path to the reference - count data file. - * Set the `stable_abi_file` config value to the path to stable ABI list. +from __future__ import annotations - :copyright: Copyright 2007-2014 by Georg Brandl. - :license: Python license. -""" +import csv +import dataclasses +from pathlib import Path +from typing import TYPE_CHECKING -from os import path +import sphinx from docutils import nodes -from docutils.parsers.rst import directives -from docutils.parsers.rst import Directive from docutils.statemachine import StringList -from sphinx.locale import _ as sphinx_gettext -import csv - from sphinx import addnodes -from sphinx.domains.c import CObject +from sphinx.locale import _ as sphinx_gettext +from sphinx.util.docutils import SphinxDirective +if TYPE_CHECKING: + from sphinx.application import Sphinx + from sphinx.util.typing import ExtensionMetadata -REST_ROLE_MAP = { - 'function': 'func', - 'macro': 'macro', - 'member': 'member', - 'type': 'type', - 'var': 'data', +ROLE_TO_OBJECT_TYPE = { + "func": "function", + "macro": "macro", + "member": "member", + "type": "type", + "data": "var", } -class RCEntry: - def __init__(self, name): - self.name = name - self.args = [] - self.result_type = '' - self.result_refs = None - - -class Annotations: - def __init__(self, refcount_filename, stable_abi_file): - self.refcount_data = {} - with open(refcount_filename, encoding='utf8') as fp: - for line in fp: - line = line.strip() - if line[:1] in ("", "#"): - # blank lines and comments - continue - parts = line.split(":", 4) - if len(parts) != 5: - raise ValueError(f"Wrong field count in {line!r}") - function, type, arg, refcount, comment = parts - # Get the entry, creating it if needed: - try: - entry = self.refcount_data[function] - except KeyError: - entry = self.refcount_data[function] = RCEntry(function) - if not refcount or refcount == "null": - refcount = None - else: - refcount = int(refcount) - # Update the entry with the new parameter or the result - # information. - if arg: - entry.args.append((arg, type, refcount)) - else: - entry.result_type = type - entry.result_refs = refcount - - self.stable_abi_data = {} - with open(stable_abi_file, encoding='utf8') as fp: - for record in csv.DictReader(fp): - name = record['name'] - self.stable_abi_data[name] = record - - def add_annotations(self, app, doctree): - for node in doctree.findall(addnodes.desc_content): - par = node.parent - if par['domain'] != 'c': - continue - if not par[0].has_key('ids') or not par[0]['ids']: - continue - name = par[0]['ids'][0] - if name.startswith("c."): - name = name[2:] - - objtype = par['objtype'] - - # Stable ABI annotation. These have two forms: - # Part of the [Stable ABI](link). - # Part of the [Stable ABI](link) since version X.Y. - # For structs, there's some more info in the message: - # Part of the [Limited API](link) (as an opaque struct). - # Part of the [Stable ABI](link) (including all members). - # Part of the [Limited API](link) (Only some members are part - # of the stable ABI.). - # ... all of which can have "since version X.Y" appended. - record = self.stable_abi_data.get(name) - if record: - if record['role'] != objtype: - raise ValueError( - f"Object type mismatch in limited API annotation " - f"for {name}: {record['role']!r} != {objtype!r}") - stable_added = record['added'] - message = sphinx_gettext('Part of the') - message = message.center(len(message) + 2) - emph_node = nodes.emphasis(message, message, - classes=['stableabi']) - ref_node = addnodes.pending_xref( - 'Stable ABI', refdomain="std", reftarget='stable', - reftype='ref', refexplicit="False") - struct_abi_kind = record['struct_abi_kind'] - if struct_abi_kind in {'opaque', 'members'}: - ref_node += nodes.Text(sphinx_gettext('Limited API')) - else: - ref_node += nodes.Text(sphinx_gettext('Stable ABI')) - emph_node += ref_node - if struct_abi_kind == 'opaque': - emph_node += nodes.Text(' ' + sphinx_gettext('(as an opaque struct)')) - elif struct_abi_kind == 'full-abi': - emph_node += nodes.Text(' ' + sphinx_gettext('(including all members)')) - if record['ifdef_note']: - emph_node += nodes.Text(' ' + record['ifdef_note']) - if stable_added == '3.2': - # Stable ABI was introduced in 3.2. - pass - else: - emph_node += nodes.Text(' ' + sphinx_gettext('since version %s') % stable_added) - emph_node += nodes.Text('.') - if struct_abi_kind == 'members': - emph_node += nodes.Text( - ' ' + sphinx_gettext('(Only some members are part of the stable ABI.)')) - node.insert(0, emph_node) - - # Unstable API annotation. - if name.startswith('PyUnstable'): - warn_node = nodes.admonition( - classes=['unstable-c-api', 'warning']) - message = sphinx_gettext('This is') + ' ' - emph_node = nodes.emphasis(message, message) - ref_node = addnodes.pending_xref( - 'Unstable API', refdomain="std", - reftarget='unstable-c-api', - reftype='ref', refexplicit="False") - ref_node += nodes.Text(sphinx_gettext('Unstable API')) - emph_node += ref_node - emph_node += nodes.Text(sphinx_gettext('. It may change without warning in minor releases.')) - warn_node += emph_node - node.insert(0, warn_node) - - # Return value annotation - if objtype != 'function': - continue - entry = self.refcount_data.get(name) - if not entry: - continue - elif not entry.result_type.endswith("Object*"): - continue - classes = ['refcount'] - if entry.result_refs is None: - rc = sphinx_gettext('Return value: Always NULL.') - classes.append('return_null') - elif entry.result_refs: - rc = sphinx_gettext('Return value: New reference.') - classes.append('return_new_ref') - else: - rc = sphinx_gettext('Return value: Borrowed reference.') - classes.append('return_borrowed_ref') - node.insert(0, nodes.emphasis(rc, rc, classes=classes)) - - -def init_annotations(app): - annotations = Annotations( - path.join(app.srcdir, app.config.refcount_file), - path.join(app.srcdir, app.config.stable_abi_file), +@dataclasses.dataclass(slots=True) +class RefCountEntry: + # Name of the function. + name: str + # List of (argument name, type, refcount effect) tuples. + # (Currently not used. If it was, a dataclass might work better.) + args: list = dataclasses.field(default_factory=list) + # Return type of the function. + result_type: str = "" + # Reference count effect for the return value. + result_refs: int | None = None + + +@dataclasses.dataclass(frozen=True, slots=True) +class StableABIEntry: + # Role of the object. + # Source: Each [item_kind] in stable_abi.toml is mapped to a C Domain role. + role: str + # Name of the object. + # Source: [.*] in stable_abi.toml. + name: str + # Version when the object was added to the stable ABI. + # (Source: [.*.added] in stable_abi.toml. + added: str + # An explananatory blurb for the ifdef. + # Source: ``feature_macro.*.doc`` in stable_abi.toml. + ifdef_note: str + # Defines how much of the struct is exposed. Only relevant for structs. + # Source: [.*.struct_abi_kind] in stable_abi.toml. + struct_abi_kind: str + + +def read_refcount_data(refcount_filename: Path) -> dict[str, RefCountEntry]: + refcount_data = {} + refcounts = refcount_filename.read_text(encoding="utf8") + for line in refcounts.splitlines(): + line = line.strip() + if not line or line.startswith("#"): + # blank lines and comments + continue + + # Each line is of the form + # function ':' type ':' [param name] ':' [refcount effect] ':' [comment] + parts = line.split(":", 4) + if len(parts) != 5: + raise ValueError(f"Wrong field count in {line!r}") + function, type, arg, refcount, _comment = parts + + # Get the entry, creating it if needed: + try: + entry = refcount_data[function] + except KeyError: + entry = refcount_data[function] = RefCountEntry(function) + if not refcount or refcount == "null": + refcount = None + else: + refcount = int(refcount) + # Update the entry with the new parameter + # or the result information. + if arg: + entry.args.append((arg, type, refcount)) + else: + entry.result_type = type + entry.result_refs = refcount + + return refcount_data + + +def read_stable_abi_data(stable_abi_file: Path) -> dict[str, StableABIEntry]: + stable_abi_data = {} + with open(stable_abi_file, encoding="utf8") as fp: + for record in csv.DictReader(fp): + name = record["name"] + stable_abi_data[name] = StableABIEntry(**record) + + return stable_abi_data + + +def add_annotations(app: Sphinx, doctree: nodes.document) -> None: + state = app.env.domaindata["c_annotations"] + refcount_data = state["refcount_data"] + stable_abi_data = state["stable_abi_data"] + for node in doctree.findall(addnodes.desc_content): + par = node.parent + if par["domain"] != "c": + continue + if not par[0].get("ids", None): + continue + name = par[0]["ids"][0].removeprefix("c.") + objtype = par["objtype"] + + # Stable ABI annotation. + if record := stable_abi_data.get(name): + if ROLE_TO_OBJECT_TYPE[record.role] != objtype: + msg = ( + f"Object type mismatch in limited API annotation for {name}: " + f"{ROLE_TO_OBJECT_TYPE[record.role]!r} != {objtype!r}" + ) + raise ValueError(msg) + annotation = _stable_abi_annotation(record) + node.insert(0, annotation) + + # Unstable API annotation. + if name.startswith("PyUnstable"): + annotation = _unstable_api_annotation() + node.insert(0, annotation) + + # Return value annotation + if objtype != "function": + continue + if name not in refcount_data: + continue + entry = refcount_data[name] + if not entry.result_type.endswith("Object*"): + continue + annotation = _return_value_annotation(entry.result_refs) + node.insert(0, annotation) + + +def _stable_abi_annotation(record: StableABIEntry) -> nodes.emphasis: + """Create the Stable ABI annotation. + + These have two forms: + Part of the `Stable ABI `_. + Part of the `Stable ABI `_ since version X.Y. + For structs, there's some more info in the message: + Part of the `Limited API `_ (as an opaque struct). + Part of the `Stable ABI `_ (including all members). + Part of the `Limited API `_ (Only some members are part + of the stable ABI.). + ... all of which can have "since version X.Y" appended. + """ + stable_added = record.added + message = sphinx_gettext("Part of the") + message = message.center(len(message) + 2) + emph_node = nodes.emphasis(message, message, classes=["stableabi"]) + ref_node = addnodes.pending_xref( + "Stable ABI", + refdomain="std", + reftarget="stable", + reftype="ref", + refexplicit="False", ) - app.connect('doctree-read', annotations.add_annotations) + struct_abi_kind = record.struct_abi_kind + if struct_abi_kind in {"opaque", "members"}: + ref_node += nodes.Text(sphinx_gettext("Limited API")) + else: + ref_node += nodes.Text(sphinx_gettext("Stable ABI")) + emph_node += ref_node + if struct_abi_kind == "opaque": + emph_node += nodes.Text(" " + sphinx_gettext("(as an opaque struct)")) + elif struct_abi_kind == "full-abi": + emph_node += nodes.Text( + " " + sphinx_gettext("(including all members)") + ) + if record.ifdef_note: + emph_node += nodes.Text(f" {record.ifdef_note}") + if stable_added == "3.2": + # Stable ABI was introduced in 3.2. + pass + else: + emph_node += nodes.Text( + " " + sphinx_gettext("since version %s") % stable_added + ) + emph_node += nodes.Text(".") + if struct_abi_kind == "members": + msg = " " + sphinx_gettext( + "(Only some members are part of the stable ABI.)" + ) + emph_node += nodes.Text(msg) + return emph_node - class LimitedAPIList(Directive): - has_content = False - required_arguments = 0 - optional_arguments = 0 - final_argument_whitespace = True +def _unstable_api_annotation() -> nodes.admonition: + ref_node = addnodes.pending_xref( + "Unstable API", + nodes.Text(sphinx_gettext("Unstable API")), + refdomain="std", + reftarget="unstable-c-api", + reftype="ref", + refexplicit="False", + ) + emph_node = nodes.emphasis( + "This is ", + sphinx_gettext("This is") + " ", + ref_node, + nodes.Text( + sphinx_gettext( + ". It may change without warning in minor releases." + ) + ), + ) + return nodes.admonition( + "", + emph_node, + classes=["unstable-c-api", "warning"], + ) - def run(self): - content = [] - for record in annotations.stable_abi_data.values(): - role = REST_ROLE_MAP[record['role']] - name = record['name'] - content.append(f'* :c:{role}:`{name}`') - pnode = nodes.paragraph() - self.state.nested_parse(StringList(content), 0, pnode) - return [pnode] +def _return_value_annotation(result_refs: int | None) -> nodes.emphasis: + classes = ["refcount"] + if result_refs is None: + rc = sphinx_gettext("Return value: Always NULL.") + classes.append("return_null") + elif result_refs: + rc = sphinx_gettext("Return value: New reference.") + classes.append("return_new_ref") + else: + rc = sphinx_gettext("Return value: Borrowed reference.") + classes.append("return_borrowed_ref") + return nodes.emphasis(rc, rc, classes=classes) - app.add_directive('limited-api-list', LimitedAPIList) +class LimitedAPIList(SphinxDirective): + has_content = False + required_arguments = 0 + optional_arguments = 0 + final_argument_whitespace = True -def setup(app): - app.add_config_value('refcount_file', '', True) - app.add_config_value('stable_abi_file', '', True) - app.connect('builder-inited', init_annotations) + def run(self) -> list[nodes.Node]: + state = self.env.domaindata["c_annotations"] + content = [ + f"* :c:{record.role}:`{record.name}`" + for record in state["stable_abi_data"].values() + ] + node = nodes.paragraph() + self.state.nested_parse(StringList(content), 0, node) + return [node] + + +def init_annotations(app: Sphinx) -> None: + # Using domaindata is a bit hack-ish, + # but allows storing state without a global variable or closure. + app.env.domaindata["c_annotations"] = state = {} + state["refcount_data"] = read_refcount_data( + Path(app.srcdir, app.config.refcount_file) + ) + state["stable_abi_data"] = read_stable_abi_data( + Path(app.srcdir, app.config.stable_abi_file) + ) - # monkey-patch C object... - CObject.option_spec = { - 'noindex': directives.flag, - 'stableabi': directives.flag, - } - old_handle_signature = CObject.handle_signature - def new_handle_signature(self, sig, signode): - signode.parent['stableabi'] = 'stableabi' in self.options - return old_handle_signature(self, sig, signode) - CObject.handle_signature = new_handle_signature - return {'version': '1.0', 'parallel_read_safe': True} +def setup(app: Sphinx) -> ExtensionMetadata: + app.add_config_value("refcount_file", "", "env", types={str}) + app.add_config_value("stable_abi_file", "", "env", types={str}) + app.add_directive("limited-api-list", LimitedAPIList) + app.connect("builder-inited", init_annotations) + app.connect("doctree-read", add_annotations) + + if sphinx.version_info[:2] < (7, 2): + from docutils.parsers.rst import directives + from sphinx.domains.c import CObject + + # monkey-patch C object... + CObject.option_spec |= { + "no-index-entry": directives.flag, + "no-contents-entry": directives.flag, + } + + return { + "version": "1.0", + "parallel_read_safe": True, + "parallel_write_safe": True, + } diff --git a/Doc/tools/extensions/escape4chm.py b/Doc/tools/extensions/escape4chm.py deleted file mode 100644 index 89970975..00000000 --- a/Doc/tools/extensions/escape4chm.py +++ /dev/null @@ -1,58 +0,0 @@ -""" -Escape the `body` part of .chm source file to 7-bit ASCII, to fix visual -effect on some MBCS Windows systems. - -https://bugs.python.org/issue32174 -""" - -import pathlib -import re -from html.entities import codepoint2name - -from sphinx.util.logging import getLogger - -# escape the characters which codepoint > 0x7F -def _process(string): - def escape(matchobj): - codepoint = ord(matchobj.group(0)) - - name = codepoint2name.get(codepoint) - if name is None: - return '&#%d;' % codepoint - else: - return '&%s;' % name - - return re.sub(r'[^\x00-\x7F]', escape, string) - -def escape_for_chm(app, pagename, templatename, context, doctree): - # only works for .chm output - if getattr(app.builder, 'name', '') != 'htmlhelp': - return - - # escape the `body` part to 7-bit ASCII - body = context.get('body') - if body is not None: - context['body'] = _process(body) - -def fixup_keywords(app, exception): - # only works for .chm output - if getattr(app.builder, 'name', '') != 'htmlhelp' or exception: - return - - getLogger(__name__).info('fixing HTML escapes in keywords file...') - outdir = pathlib.Path(app.builder.outdir) - outname = app.builder.config.htmlhelp_basename - with open(outdir / (outname + '.hhk'), 'rb') as f: - index = f.read() - with open(outdir / (outname + '.hhk'), 'wb') as f: - f.write(index.replace(b''', b''')) - -def setup(app): - # `html-page-context` event emitted when the HTML builder has - # created a context dictionary to render a template with. - app.connect('html-page-context', escape_for_chm) - # `build-finished` event emitted when all the files have been - # output. - app.connect('build-finished', fixup_keywords) - - return {'version': '1.0', 'parallel_read_safe': True} diff --git a/Doc/tools/extensions/glossary_search.py b/Doc/tools/extensions/glossary_search.py index 7c93b1e4..502b6cd9 100644 --- a/Doc/tools/extensions/glossary_search.py +++ b/Doc/tools/extensions/glossary_search.py @@ -1,63 +1,63 @@ -# -*- coding: utf-8 -*- -""" - glossary_search.py - ~~~~~~~~~~~~~~~~ +"""Feature search results for glossary items prominently.""" - Feature search results for glossary items prominently. +from __future__ import annotations - :license: Python license. -""" import json -import os.path -from docutils.nodes import definition_list_item +from pathlib import Path +from typing import TYPE_CHECKING + +from docutils import nodes from sphinx.addnodes import glossary from sphinx.util import logging +if TYPE_CHECKING: + from sphinx.application import Sphinx + from sphinx.util.typing import ExtensionMetadata logger = logging.getLogger(__name__) -STATIC_DIR = '_static' -JSON = 'glossary.json' -def process_glossary_nodes(app, doctree, fromdocname): +def process_glossary_nodes( + app: Sphinx, + doctree: nodes.document, + _docname: str, +) -> None: if app.builder.format != 'html' or app.builder.embedded: return - terms = {} + if hasattr(app.env, 'glossary_terms'): + terms = app.env.glossary_terms + else: + terms = app.env.glossary_terms = {} for node in doctree.findall(glossary): - for glossary_item in node.findall(definition_list_item): - term = glossary_item[0].astext().lower() - definition = glossary_item[1] + for glossary_item in node.findall(nodes.definition_list_item): + term = glossary_item[0].astext() + definition = glossary_item[-1] rendered = app.builder.render_partial(definition) - terms[term] = { - 'title': glossary_item[0].astext(), - 'body': rendered['html_body'] + terms[term.lower()] = { + 'title': term, + 'body': rendered['html_body'], } - if hasattr(app.env, 'glossary_terms'): - app.env.glossary_terms.update(terms) - else: - app.env.glossary_terms = terms -def on_build_finish(app, exc): - if not hasattr(app.env, 'glossary_terms'): - return - if not app.env.glossary_terms: +def write_glossary_json(app: Sphinx, _exc: Exception) -> None: + if not getattr(app.env, 'glossary_terms', None): return - logger.info(f'Writing {JSON}', color='green') - - dest_dir = os.path.join(app.outdir, STATIC_DIR) - os.makedirs(dest_dir, exist_ok=True) - - with open(os.path.join(dest_dir, JSON), 'w') as f: - json.dump(app.env.glossary_terms, f) + logger.info('Writing glossary.json', color='green') + dest = Path(app.outdir, '_static', 'glossary.json') + dest.parent.mkdir(exist_ok=True) + dest.write_text(json.dumps(app.env.glossary_terms), encoding='utf-8') -def setup(app): +def setup(app: Sphinx) -> ExtensionMetadata: app.connect('doctree-resolved', process_glossary_nodes) - app.connect('build-finished', on_build_finish) + app.connect('build-finished', write_glossary_json) - return {'version': '0.1', 'parallel_read_safe': True} + return { + 'version': '1.0', + 'parallel_read_safe': True, + 'parallel_write_safe': True, + } diff --git a/Doc/tools/extensions/lexers/__init__.py b/Doc/tools/extensions/lexers/__init__.py new file mode 100644 index 00000000..e12ac5be --- /dev/null +++ b/Doc/tools/extensions/lexers/__init__.py @@ -0,0 +1,15 @@ +from .asdl_lexer import ASDLLexer +from .peg_lexer import PEGLexer + + +def setup(app): + # Used for highlighting Parser/Python.asdl in library/ast.rst + app.add_lexer("asdl", ASDLLexer) + # Used for highlighting Grammar/python.gram in reference/grammar.rst + app.add_lexer("peg", PEGLexer) + + return { + "version": "1.0", + "parallel_read_safe": True, + "parallel_write_safe": True, + } diff --git a/Doc/tools/extensions/asdl_highlight.py b/Doc/tools/extensions/lexers/asdl_lexer.py similarity index 62% rename from Doc/tools/extensions/asdl_highlight.py rename to Doc/tools/extensions/lexers/asdl_lexer.py index 42863a4b..3a74174a 100644 --- a/Doc/tools/extensions/asdl_highlight.py +++ b/Doc/tools/extensions/lexers/asdl_lexer.py @@ -1,15 +1,6 @@ -import sys -from pathlib import Path +from pygments.lexer import RegexLexer, bygroups, include +from pygments.token import Comment, Keyword, Name, Operator, Punctuation, Text -CPYTHON_ROOT = Path(__file__).resolve().parent.parent.parent.parent -sys.path.append(str(CPYTHON_ROOT / "Parser")) - -from pygments.lexer import RegexLexer, bygroups, include, words -from pygments.token import (Comment, Keyword, Name, Operator, - Punctuation, Text) - -from asdl import builtin_types -from sphinx.highlighting import lexers class ASDLLexer(RegexLexer): name = "ASDL" @@ -34,7 +25,10 @@ class ASDLLexer(RegexLexer): r"(\w+)(\*\s|\?\s|\s)(\w+)", bygroups(Name.Builtin.Pseudo, Operator, Name), ), - (words(builtin_types), Name.Builtin), + # Keep in line with ``builtin_types`` from Parser/asdl.py. + # ASDL's 4 builtin types are + # constant, identifier, int, string + ("constant|identifier|int|string", Name.Builtin), (r"attributes", Name.Builtin), ( _name + _text_ws + "(=)", @@ -46,8 +40,3 @@ class ASDLLexer(RegexLexer): (r".", Text), ], } - - -def setup(app): - lexers["asdl"] = ASDLLexer() - return {'version': '1.0', 'parallel_read_safe': True} diff --git a/Doc/tools/extensions/peg_highlight.py b/Doc/tools/extensions/lexers/peg_lexer.py similarity index 94% rename from Doc/tools/extensions/peg_highlight.py rename to Doc/tools/extensions/lexers/peg_lexer.py index 5ab5530d..06f9f8eb 100644 --- a/Doc/tools/extensions/peg_highlight.py +++ b/Doc/tools/extensions/lexers/peg_lexer.py @@ -1,8 +1,6 @@ from pygments.lexer import RegexLexer, bygroups, include from pygments.token import Comment, Keyword, Name, Operator, Punctuation, Text -from sphinx.highlighting import lexers - class PEGLexer(RegexLexer): """Pygments Lexer for PEG grammar (.gram) files @@ -81,8 +79,3 @@ class PEGLexer(RegexLexer): (r".", Text), ], } - - -def setup(app): - lexers["peg"] = PEGLexer() - return {"version": "1.0", "parallel_read_safe": True} diff --git a/Doc/tools/extensions/patchlevel.py b/Doc/tools/extensions/patchlevel.py index 617f28c2..9ccaec3d 100644 --- a/Doc/tools/extensions/patchlevel.py +++ b/Doc/tools/extensions/patchlevel.py @@ -1,68 +1,81 @@ -# -*- coding: utf-8 -*- -""" - patchlevel.py - ~~~~~~~~~~~~~ +"""Extract version information from Include/patchlevel.h.""" - Extract version info from Include/patchlevel.h. - Adapted from Doc/tools/getversioninfo. +import re +import sys +from pathlib import Path +from typing import Literal, NamedTuple - :copyright: 2007-2008 by Georg Brandl. - :license: Python license. -""" +CPYTHON_ROOT = Path( + __file__, # cpython/Doc/tools/extensions/patchlevel.py + "..", # cpython/Doc/tools/extensions + "..", # cpython/Doc/tools + "..", # cpython/Doc + "..", # cpython +).resolve() +PATCHLEVEL_H = CPYTHON_ROOT / "Include" / "patchlevel.h" -from __future__ import print_function +RELEASE_LEVELS = { + "PY_RELEASE_LEVEL_ALPHA": "alpha", + "PY_RELEASE_LEVEL_BETA": "beta", + "PY_RELEASE_LEVEL_GAMMA": "candidate", + "PY_RELEASE_LEVEL_FINAL": "final", +} -import os -import re -import sys -def get_header_version_info(srcdir): - patchlevel_h = os.path.join(srcdir, '..', 'Include', 'patchlevel.h') +class version_info(NamedTuple): # noqa: N801 + major: int #: Major release number + minor: int #: Minor release number + micro: int #: Patch release number + releaselevel: Literal["alpha", "beta", "candidate", "final"] + serial: int #: Serial release number - # This won't pick out all #defines, but it will pick up the ones we - # care about. - rx = re.compile(r'\s*#define\s+([a-zA-Z][a-zA-Z_0-9]*)\s+([a-zA-Z_0-9]+)') - d = {} - with open(patchlevel_h) as f: - for line in f: - m = rx.match(line) - if m is not None: - name, value = m.group(1, 2) - d[name] = value +def get_header_version_info() -> version_info: + # Capture PY_ prefixed #defines. + pat = re.compile(r"\s*#define\s+(PY_\w*)\s+(\w+)", re.ASCII) - release = version = '%s.%s' % (d['PY_MAJOR_VERSION'], d['PY_MINOR_VERSION']) - micro = int(d['PY_MICRO_VERSION']) - release += '.' + str(micro) + defines = {} + patchlevel_h = PATCHLEVEL_H.read_text(encoding="utf-8") + for line in patchlevel_h.splitlines(): + if (m := pat.match(line)) is not None: + name, value = m.groups() + defines[name] = value - level = d['PY_RELEASE_LEVEL'] - suffixes = { - 'PY_RELEASE_LEVEL_ALPHA': 'a', - 'PY_RELEASE_LEVEL_BETA': 'b', - 'PY_RELEASE_LEVEL_GAMMA': 'rc', - } - if level != 'PY_RELEASE_LEVEL_FINAL': - release += suffixes[level] + str(int(d['PY_RELEASE_SERIAL'])) - return version, release + return version_info( + major=int(defines["PY_MAJOR_VERSION"]), + minor=int(defines["PY_MINOR_VERSION"]), + micro=int(defines["PY_MICRO_VERSION"]), + releaselevel=RELEASE_LEVELS[defines["PY_RELEASE_LEVEL"]], + serial=int(defines["PY_RELEASE_SERIAL"]), + ) -def get_sys_version_info(): - major, minor, micro, level, serial = sys.version_info - release = version = '%s.%s' % (major, minor) - release += '.%s' % micro - if level != 'final': - release += '%s%s' % (level[0], serial) +def format_version_info(info: version_info) -> tuple[str, str]: + version = f"{info.major}.{info.minor}" + release = f"{info.major}.{info.minor}.{info.micro}" + if info.releaselevel != "final": + suffix = {"alpha": "a", "beta": "b", "candidate": "rc"} + release += f"{suffix[info.releaselevel]}{info.serial}" return version, release def get_version_info(): try: - return get_header_version_info('.') - except (IOError, OSError): - version, release = get_sys_version_info() - print('Can\'t get version info from Include/patchlevel.h, ' \ - 'using version of this interpreter (%s).' % release, file=sys.stderr) + info = get_header_version_info() + return format_version_info(info) + except OSError: + version, release = format_version_info(sys.version_info) + print( + f"Failed to get version info from Include/patchlevel.h, " + f"using version of this interpreter ({release}).", + file=sys.stderr, + ) return version, release -if __name__ == '__main__': - print(get_header_version_info('.')[1]) + +if __name__ == "__main__": + short_ver, full_ver = format_version_info(get_header_version_info()) + if sys.argv[1:2] == ["--short"]: + print(short_ver) + else: + print(full_ver) diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index caf14599..615c7f1f 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -15,16 +15,15 @@ from time import asctime from pprint import pformat -from docutils import nodes, utils +from docutils import nodes from docutils.io import StringOutput -from docutils.parsers.rst import Directive -from docutils.utils import new_document +from docutils.parsers.rst import directives +from docutils.utils import new_document, unescape from sphinx import addnodes from sphinx.builders import Builder -from sphinx.domains.python import PyFunction, PyMethod -from sphinx.errors import NoUri +from sphinx.domains.changeset import VersionChange, versionlabels, versionlabel_classes +from sphinx.domains.python import PyFunction, PyMethod, PyModule from sphinx.locale import _ as sphinx_gettext -from sphinx.util import logging from sphinx.util.docutils import SphinxDirective from sphinx.writers.text import TextWriter, TextTranslator from sphinx.util.display import status_iterator @@ -48,11 +47,14 @@ std.token_re = re.compile(r'`((~?[\w-]*:)?\w+)`') +# backport :no-index: +PyModule.option_spec['no-index'] = directives.flag + # Support for marking up and linking to bugs.python.org issues def issue_role(typ, rawtext, text, lineno, inliner, options={}, content=[]): - issue = utils.unescape(text) + issue = unescape(text) # sanity check: there are no bpo issues within these two values if 47261 < int(issue) < 400000: msg = inliner.reporter.error(f'The BPO ID {text!r} seems too high -- ' @@ -67,7 +69,7 @@ def issue_role(typ, rawtext, text, lineno, inliner, options={}, content=[]): # Support for marking up and linking to GitHub issues def gh_issue_role(typ, rawtext, text, lineno, inliner, options={}, content=[]): - issue = utils.unescape(text) + issue = unescape(text) # sanity check: all GitHub issues have ID >= 32426 # even though some of them are also valid BPO IDs if int(issue) < 32426: @@ -82,7 +84,7 @@ def gh_issue_role(typ, rawtext, text, lineno, inliner, options={}, content=[]): # Support for marking up implementation details -class ImplementationDetail(Directive): +class ImplementationDetail(SphinxDirective): has_content = True final_argument_whitespace = True @@ -105,217 +107,6 @@ def run(self): return [pnode] -# Support for documenting platform availability - -class Availability(SphinxDirective): - - has_content = True - required_arguments = 1 - optional_arguments = 0 - final_argument_whitespace = True - - # known platform, libc, and threading implementations - known_platforms = frozenset({ - "AIX", "Android", "BSD", "DragonFlyBSD", "Emscripten", "FreeBSD", - "Linux", "NetBSD", "OpenBSD", "POSIX", "Solaris", "Unix", "VxWorks", - "WASI", "Windows", "macOS", - # libc - "BSD libc", "glibc", "musl", - # POSIX platforms with pthreads - "pthreads", - }) - - def run(self): - availability_ref = ':ref:`Availability `: ' - avail_nodes, avail_msgs = self.state.inline_text( - availability_ref + self.arguments[0], - self.lineno) - pnode = nodes.paragraph(availability_ref + self.arguments[0], - '', *avail_nodes, *avail_msgs) - self.set_source_info(pnode) - cnode = nodes.container("", pnode, classes=["availability"]) - self.set_source_info(cnode) - if self.content: - self.state.nested_parse(self.content, self.content_offset, cnode) - self.parse_platforms() - - return [cnode] - - def parse_platforms(self): - """Parse platform information from arguments - - Arguments is a comma-separated string of platforms. A platform may - be prefixed with "not " to indicate that a feature is not available. - - Example:: - - .. availability:: Windows, Linux >= 4.2, not Emscripten, not WASI - - Arguments like "Linux >= 3.17 with glibc >= 2.27" are currently not - parsed into separate tokens. - """ - platforms = {} - for arg in self.arguments[0].rstrip(".").split(","): - arg = arg.strip() - platform, _, version = arg.partition(" >= ") - if platform.startswith("not "): - version = False - platform = platform[4:] - elif not version: - version = True - platforms[platform] = version - - unknown = set(platforms).difference(self.known_platforms) - if unknown: - cls = type(self) - logger = logging.getLogger(cls.__qualname__) - logger.warning( - f"Unknown platform(s) or syntax '{' '.join(sorted(unknown))}' " - f"in '.. availability:: {self.arguments[0]}', see " - f"{__file__}:{cls.__qualname__}.known_platforms for a set " - "known platforms." - ) - - return platforms - - -# Support for documenting audit event - -def audit_events_purge(app, env, docname): - """This is to remove from env.all_audit_events old traces of removed - documents. - """ - if not hasattr(env, 'all_audit_events'): - return - fresh_all_audit_events = {} - for name, event in env.all_audit_events.items(): - event["source"] = [(d, t) for d, t in event["source"] if d != docname] - if event["source"]: - # Only keep audit_events that have at least one source. - fresh_all_audit_events[name] = event - env.all_audit_events = fresh_all_audit_events - - -def audit_events_merge(app, env, docnames, other): - """In Sphinx parallel builds, this merges env.all_audit_events from - subprocesses. - - all_audit_events is a dict of names, with values like: - {'source': [(docname, target), ...], 'args': args} - """ - if not hasattr(other, 'all_audit_events'): - return - if not hasattr(env, 'all_audit_events'): - env.all_audit_events = {} - for name, value in other.all_audit_events.items(): - if name in env.all_audit_events: - env.all_audit_events[name]["source"].extend(value["source"]) - else: - env.all_audit_events[name] = value - - -class AuditEvent(Directive): - - has_content = True - required_arguments = 1 - optional_arguments = 2 - final_argument_whitespace = True - - _label = [ - sphinx_gettext("Raises an :ref:`auditing event ` {name} with no arguments."), - sphinx_gettext("Raises an :ref:`auditing event ` {name} with argument {args}."), - sphinx_gettext("Raises an :ref:`auditing event ` {name} with arguments {args}."), - ] - - @property - def logger(self): - cls = type(self) - return logging.getLogger(cls.__module__ + "." + cls.__name__) - - def run(self): - name = self.arguments[0] - if len(self.arguments) >= 2 and self.arguments[1]: - args = (a.strip() for a in self.arguments[1].strip("'\"").split(",")) - args = [a for a in args if a] - else: - args = [] - - label = self._label[min(2, len(args))] - text = label.format(name="``{}``".format(name), - args=", ".join("``{}``".format(a) for a in args if a)) - - env = self.state.document.settings.env - if not hasattr(env, 'all_audit_events'): - env.all_audit_events = {} - - new_info = { - 'source': [], - 'args': args - } - info = env.all_audit_events.setdefault(name, new_info) - if info is not new_info: - if not self._do_args_match(info['args'], new_info['args']): - self.logger.warning( - "Mismatched arguments for audit-event {}: {!r} != {!r}" - .format(name, info['args'], new_info['args']) - ) - - ids = [] - try: - target = self.arguments[2].strip("\"'") - except (IndexError, TypeError): - target = None - if not target: - target = "audit_event_{}_{}".format( - re.sub(r'\W', '_', name), - len(info['source']), - ) - ids.append(target) - - info['source'].append((env.docname, target)) - - pnode = nodes.paragraph(text, classes=["audit-hook"], ids=ids) - pnode.line = self.lineno - if self.content: - self.state.nested_parse(self.content, self.content_offset, pnode) - else: - n, m = self.state.inline_text(text, self.lineno) - pnode.extend(n + m) - - return [pnode] - - # This list of sets are allowable synonyms for event argument names. - # If two names are in the same set, they are treated as equal for the - # purposes of warning. This won't help if number of arguments is - # different! - _SYNONYMS = [ - {"file", "path", "fd"}, - ] - - def _do_args_match(self, args1, args2): - if args1 == args2: - return True - if len(args1) != len(args2): - return False - for a1, a2 in zip(args1, args2): - if a1 == a2: - continue - if any(a1 in s and a2 in s for s in self._SYNONYMS): - continue - return False - return True - - -class audit_event_list(nodes.General, nodes.Element): - pass - - -class AuditEventListDirective(Directive): - - def run(self): - return [audit_event_list('')] - - # Support for documenting decorators class PyDecoratorMixin(object): @@ -393,60 +184,55 @@ def run(self): return PyMethod.run(self) -# Support for documenting version of removal in deprecations +# Support for documenting version of changes, additions, deprecations -class DeprecatedRemoved(Directive): - has_content = True +def expand_version_arg(argument, release): + """Expand "next" to the current version""" + if argument == 'next': + return sphinx_gettext('{} (unreleased)').format(release) + return argument + + +class PyVersionChange(VersionChange): + def run(self): + # Replace the 'next' special token with the current development version + self.arguments[0] = expand_version_arg(self.arguments[0], + self.config.release) + return super().run() + + +class DeprecatedRemoved(VersionChange): required_arguments = 2 - optional_arguments = 1 - final_argument_whitespace = True - option_spec = {} - _deprecated_label = sphinx_gettext('Deprecated since version {deprecated}, will be removed in version {removed}') - _removed_label = sphinx_gettext('Deprecated since version {deprecated}, removed in version {removed}') + _deprecated_label = sphinx_gettext('Deprecated since version %s, will be removed in version %s') + _removed_label = sphinx_gettext('Deprecated since version %s, removed in version %s') def run(self): - node = addnodes.versionmodified() - node.document = self.state.document - node['type'] = 'deprecated-removed' - version = (self.arguments[0], self.arguments[1]) - node['version'] = version - env = self.state.document.settings.env - current_version = tuple(int(e) for e in env.config.version.split('.')) - removed_version = tuple(int(e) for e in self.arguments[1].split('.')) + # Replace the first two arguments (deprecated version and removed version) + # with a single tuple of both versions. + version_deprecated = expand_version_arg(self.arguments[0], + self.config.release) + version_removed = self.arguments.pop(1) + if version_removed == 'next': + raise ValueError( + 'deprecated-removed:: second argument cannot be `next`') + self.arguments[0] = version_deprecated, version_removed + + # Set the label based on if we have reached the removal version + current_version = tuple(map(int, self.config.version.split('.'))) + removed_version = tuple(map(int, version_removed.split('.'))) if current_version < removed_version: - label = self._deprecated_label - else: - label = self._removed_label - - text = label.format(deprecated=self.arguments[0], removed=self.arguments[1]) - if len(self.arguments) == 3: - inodes, messages = self.state.inline_text(self.arguments[2], - self.lineno+1) - para = nodes.paragraph(self.arguments[2], '', *inodes, translatable=False) - node.append(para) - else: - messages = [] - if self.content: - self.state.nested_parse(self.content, self.content_offset, node) - if len(node): - if isinstance(node[0], nodes.paragraph) and node[0].rawsource: - content = nodes.inline(node[0].rawsource, translatable=True) - content.source = node[0].source - content.line = node[0].line - content += node[0].children - node[0].replace_self(nodes.paragraph('', '', content, translatable=False)) - node[0].insert(0, nodes.inline('', '%s: ' % text, - classes=['versionmodified'])) + versionlabels[self.name] = self._deprecated_label + versionlabel_classes[self.name] = 'deprecated' else: - para = nodes.paragraph('', '', - nodes.inline('', '%s.' % text, - classes=['versionmodified']), - translatable=False) - node.append(para) - env = self.state.document.settings.env - env.get_domain('changeset').note_changeset(node) - return [node] + messages + versionlabels[self.name] = self._removed_label + versionlabel_classes[self.name] = 'removed' + try: + return super().run() + finally: + # reset versionlabels and versionlabel_classes + versionlabels[self.name] = '' + versionlabel_classes[self.name] = '' # Support for including Misc/NEWS @@ -456,7 +242,7 @@ def run(self): whatsnew_re = re.compile(r"(?im)^what's new in (.*?)\??$") -class MiscNews(Directive): +class MiscNews(SphinxDirective): has_content = False required_arguments = 1 optional_arguments = 0 @@ -471,7 +257,7 @@ def run(self): if not source_dir: source_dir = path.dirname(path.abspath(source)) fpath = path.join(source_dir, fname) - self.state.document.settings.record_dependencies.add(fpath) + self.env.note_dependency(path.abspath(fpath)) try: with io.open(fpath, encoding='utf-8') as fp: content = fp.read() @@ -603,70 +389,6 @@ def parse_monitoring_event(env, sig, signode): return sig -def process_audit_events(app, doctree, fromdocname): - for node in doctree.findall(audit_event_list): - break - else: - return - - env = app.builder.env - - table = nodes.table(cols=3) - group = nodes.tgroup( - '', - nodes.colspec(colwidth=30), - nodes.colspec(colwidth=55), - nodes.colspec(colwidth=15), - cols=3, - ) - head = nodes.thead() - body = nodes.tbody() - - table += group - group += head - group += body - - row = nodes.row() - row += nodes.entry('', nodes.paragraph('', nodes.Text('Audit event'))) - row += nodes.entry('', nodes.paragraph('', nodes.Text('Arguments'))) - row += nodes.entry('', nodes.paragraph('', nodes.Text('References'))) - head += row - - for name in sorted(getattr(env, "all_audit_events", ())): - audit_event = env.all_audit_events[name] - - row = nodes.row() - node = nodes.paragraph('', nodes.Text(name)) - row += nodes.entry('', node) - - node = nodes.paragraph() - for i, a in enumerate(audit_event['args']): - if i: - node += nodes.Text(", ") - node += nodes.literal(a, nodes.Text(a)) - row += nodes.entry('', node) - - node = nodes.paragraph() - backlinks = enumerate(sorted(set(audit_event['source'])), start=1) - for i, (doc, label) in backlinks: - if isinstance(label, str): - ref = nodes.reference("", nodes.Text("[{}]".format(i)), internal=True) - try: - ref['refuri'] = "{}#{}".format( - app.builder.get_relative_uri(fromdocname, doc), - label, - ) - except NoUri: - continue - node += ref - row += nodes.entry('', node) - - body += row - - for node in doctree.findall(audit_event_list): - node.replace_self(table) - - def patch_pairindextypes(app, _env) -> None: """Remove all entries from ``pairindextypes`` before writing POT files. @@ -695,9 +417,10 @@ def setup(app): app.add_role('issue', issue_role) app.add_role('gh', gh_issue_role) app.add_directive('impl-detail', ImplementationDetail) - app.add_directive('availability', Availability) - app.add_directive('audit-event', AuditEvent) - app.add_directive('audit-event-table', AuditEventListDirective) + app.add_directive('versionadded', PyVersionChange, override=True) + app.add_directive('versionchanged', PyVersionChange, override=True) + app.add_directive('versionremoved', PyVersionChange, override=True) + app.add_directive('deprecated', PyVersionChange, override=True) app.add_directive('deprecated-removed', DeprecatedRemoved) app.add_builder(PydocTopicsBuilder) app.add_object_type('opcode', 'opcode', '%s (opcode)', parse_opcode_signature) @@ -712,8 +435,6 @@ def setup(app): app.add_directive_to_domain('py', 'awaitablemethod', PyAwaitableMethod) app.add_directive_to_domain('py', 'abstractmethod', PyAbstractMethod) app.add_directive('miscnews', MiscNews) + app.add_css_file('sidebar-wrap.css') app.connect('env-check-consistency', patch_pairindextypes) - app.connect('doctree-resolved', process_audit_events) - app.connect('env-merge-info', audit_events_merge) - app.connect('env-purge-doc', audit_events_purge) return {'version': '1.0', 'parallel_read_safe': True} diff --git a/Doc/tools/static/glossary_search.js b/Doc/tools/static/glossary_search.js new file mode 100644 index 00000000..13d728dc --- /dev/null +++ b/Doc/tools/static/glossary_search.js @@ -0,0 +1,47 @@ +"use strict"; + +const GLOSSARY_PAGE = "glossary.html"; + +const glossary_search = async () => { + const response = await fetch("_static/glossary.json"); + if (!response.ok) { + throw new Error("Failed to fetch glossary.json"); + } + const glossary = await response.json(); + + const params = new URLSearchParams(document.location.search).get("q"); + if (!params) { + return; + } + + const searchParam = params.toLowerCase(); + const glossaryItem = glossary[searchParam]; + if (!glossaryItem) { + return; + } + + // set up the title text with a link to the glossary page + const glossaryTitle = document.getElementById("glossary-title"); + glossaryTitle.textContent = "Glossary: " + glossaryItem.title; + const linkTarget = searchParam.replace(/ /g, "-"); + glossaryTitle.href = GLOSSARY_PAGE + "#term-" + linkTarget; + + // rewrite any anchor links (to other glossary terms) + // to have a full reference to the glossary page + const glossaryBody = document.getElementById("glossary-body"); + glossaryBody.innerHTML = glossaryItem.body; + const anchorLinks = glossaryBody.querySelectorAll('a[href^="#"]'); + anchorLinks.forEach(function (link) { + const currentUrl = link.getAttribute("href"); + link.href = GLOSSARY_PAGE + currentUrl; + }); + + const glossaryResult = document.getElementById("glossary-result"); + glossaryResult.style.display = ""; +}; + +if (document.readyState !== "loading") { + glossary_search().catch(console.error); +} else { + document.addEventListener("DOMContentLoaded", glossary_search); +} diff --git a/Doc/tools/static/rtd_switcher.js b/Doc/tools/static/rtd_switcher.js new file mode 100644 index 00000000..2bf01a00 --- /dev/null +++ b/Doc/tools/static/rtd_switcher.js @@ -0,0 +1,55 @@ + function onSwitch(event) { + const option = event.target.selectedIndex; + const item = event.target.options[option]; + window.location.href = item.dataset.url; + } + + document.addEventListener("readthedocs-addons-data-ready", function(event) { + const config = event.detail.data() + const versionSelect = ` + + `; + + // Prepend the current language to the options on the selector + let languages = config.projects.translations.concat(config.projects.current); + languages = languages.sort((a, b) => a.language.name.localeCompare(b.language.name)); + + const languageSelect = ` + + `; + + // Query all the placeholders because there are different ones for Desktop/Mobile + const versionPlaceholders = document.querySelectorAll(".version_switcher_placeholder"); + for (placeholder of versionPlaceholders) { + placeholder.innerHTML = versionSelect; + let selectElement = placeholder.querySelector("select"); + selectElement.addEventListener("change", onSwitch); + } + + const languagePlaceholders = document.querySelectorAll(".language_switcher_placeholder"); + for (placeholder of languagePlaceholders) { + placeholder.innerHTML = languageSelect; + let selectElement = placeholder.querySelector("select"); + selectElement.addEventListener("change", onSwitch); + } + }); diff --git a/Doc/tools/static/sidebar-wrap.css b/Doc/tools/static/sidebar-wrap.css new file mode 100644 index 00000000..0a80f516 --- /dev/null +++ b/Doc/tools/static/sidebar-wrap.css @@ -0,0 +1,6 @@ +div.sphinxsidebarwrapper { + overflow-x: scroll; +} +div.sphinxsidebarwrapper li code { + overflow-wrap: normal; +} diff --git a/Doc/tools/templates/download.html b/Doc/tools/templates/download.html index b5353d6f..45ec436f 100644 --- a/Doc/tools/templates/download.html +++ b/Doc/tools/templates/download.html @@ -1,64 +1,75 @@ {% extends "layout.html" %} -{% set title = 'Download' %} +{% set title = _('Download') %} {% if daily is defined %} - {% set dlbase = pathto('archives', 1) %} + {% set dl_base = pathto('archives', resource=True) %} + {% set dl_version = version %} {% else %} {# The link below returns HTTP 404 until the first related alpha release. This is expected; use daily documentation builds for CPython development. #} - {% set dlbase = 'https://docs.python.org/ftp/python/doc/' + release %} + {% set dl_base = 'https://www.python.org/ftp/python/doc/' + release %} + {% set dl_version = release %} {% endif %} {% block body %} -

Download Python {{ release }} Documentation

+

{% trans %}Download Python {{ dl_version }} Documentation{% endtrans %}

-{% if last_updated %}

Last updated on: {{ last_updated }}.

{% endif %} +{% if last_updated %}

{% trans %}Last updated on: {{ last_updated }}.{% endtrans %}

{% endif %} -

To download an archive containing all the documents for this version of -Python in one of various formats, follow one of links in this table.

+

{% trans %}To download an archive containing all the documents for this version of +Python in one of various formats, follow one of links in this table.{% endtrans %}

- - - - + + + + - - - + + + + - - - + + + + - - - + + + + - - + + + + + + + +
FormatPacked as .zipPacked as .tar.bz2
PDF (US-Letter paper size)Download (ca. 13 MiB)Download (ca. 13 MiB)
{% trans %}Format{% endtrans %}{% trans %}Packed as .zip{% endtrans %}{% trans %}Packed as .tar.bz2{% endtrans %}
PDF (A4 paper size)Download (ca. 13 MiB)Download (ca. 13 MiB)
{% trans %}PDF{% endtrans %}{% trans download_size="17" %}Download (ca. {{ download_size }} MiB){% endtrans %}{% trans download_size="17" %}Download (ca. {{ download_size }} MiB){% endtrans %}
HTMLDownload (ca. 9 MiB)Download (ca. 6 MiB)
{% trans %}HTML{% endtrans %}{% trans download_size="13" %}Download (ca. {{ download_size }} MiB){% endtrans %}{% trans download_size="8" %}Download (ca. {{ download_size }} MiB){% endtrans %}
Plain TextDownload (ca. 3 MiB)Download (ca. 2 MiB)
{% trans %}Plain text{% endtrans %}{% trans download_size="4" %}Download (ca. {{ download_size }} MiB){% endtrans %}{% trans download_size="3" %}Download (ca. {{ download_size }} MiB){% endtrans %}
EPUBDownload (ca. 5 MiB)
{% trans %}Texinfo{% endtrans %}{% trans download_size="9" %}Download (ca. {{ download_size }} MiB){% endtrans %}{% trans download_size="7" %}Download (ca. {{ download_size }} MiB){% endtrans %}
{% trans %}EPUB{% endtrans %}{% trans download_size="6" %}Download (ca. {{ download_size }} MiB){% endtrans %}
-

These archives contain all the content in the documentation.

+

{% trans %}These archives contain all the content in the documentation.{% endtrans %}

-

Unpacking

+

{% trans %}Unpacking{% endtrans %}

-

Unix users should download the .tar.bz2 archives; these are bzipped tar +

{% trans %}Unix users should download the .tar.bz2 archives; these are bzipped tar archives and can be handled in the usual way using tar and the bzip2 program. The Info-ZIP unzip program can be used to handle the ZIP archives if desired. The .tar.bz2 archives provide the -best compression and fastest download times.

+best compression and fastest download times.{% endtrans %}

-

Windows users can use the ZIP archives since those are customary on that -platform. These are created on Unix using the Info-ZIP zip program.

+

{% trans %}Windows users can use the ZIP archives since those are customary on that +platform. These are created on Unix using the Info-ZIP zip program.{% endtrans %}

-

Problems

+

{% trans %}Problems{% endtrans %}

-

If you have comments or suggestions for the Python documentation, please send -email to docs@python.org.

+

{% trans %}If you have comments or suggestions for the Python documentation, please send +email to docs@python.org.{% endtrans %}

{% endblock %} diff --git a/Doc/tools/templates/indexcontent.html b/Doc/tools/templates/indexcontent.html index 6f854e86..2686f48d 100644 --- a/Doc/tools/templates/indexcontent.html +++ b/Doc/tools/templates/indexcontent.html @@ -33,6 +33,8 @@

{{ docstitle|e }}

{% trans %}C API reference{% endtrans %}

+ @@ -57,7 +59,7 @@

{{ docstitle|e }}

- + diff --git a/Doc/tools/templates/layout.html b/Doc/tools/templates/layout.html index e9311478..b09fd21a 100644 --- a/Doc/tools/templates/layout.html +++ b/Doc/tools/templates/layout.html @@ -26,6 +26,9 @@ {% endblock %} {% block extrahead %} + {% if builder == "html" and enable_analytics %} + + {% endif %} {% if builder != "htmlhelp" %} {% if pagename == 'whatsnew/changelog' and not embedded %} @@ -43,90 +46,7 @@ {{ super() }} {%- if not embedded %} - - + + {%- endif %} {% endblock %} diff --git a/Doc/tools/templates/search.html b/Doc/tools/templates/search.html index 85297446..6ddac5f8 100644 --- a/Doc/tools/templates/search.html +++ b/Doc/tools/templates/search.html @@ -2,61 +2,16 @@ {% block extrahead %} {{ super() }} - + +{% endblock %} +{% block searchresults %} +
+ {# For glossary_search.js #} + +
{% endblock %} diff --git a/Doc/tutorial/classes.rst b/Doc/tutorial/classes.rst index 1b64741c..49256896 100644 --- a/Doc/tutorial/classes.rst +++ b/Doc/tutorial/classes.rst @@ -276,8 +276,8 @@ definition looked like this:: then ``MyClass.i`` and ``MyClass.f`` are valid attribute references, returning an integer and a function object, respectively. Class attributes can also be assigned to, so you can change the value of ``MyClass.i`` by assignment. -:attr:`!__doc__` is also a valid attribute, returning the docstring belonging to -the class: ``"A simple example class"``. +:attr:`~type.__doc__` is also a valid attribute, returning the docstring +belonging to the class: ``"A simple example class"``. Class *instantiation* uses function notation. Just pretend that the class object is a parameterless function that returns a new instance of the class. @@ -688,6 +688,11 @@ current class name with leading underscore(s) stripped. This mangling is done without regard to the syntactic position of the identifier, as long as it occurs within the definition of a class. +.. seealso:: + + The :ref:`private name mangling specifications ` + for details and special cases. + Name mangling is helpful for letting subclasses override methods without breaking intraclass method calls. For example:: @@ -927,6 +932,6 @@ Examples:: .. [#] Except for one thing. Module objects have a secret read-only attribute called :attr:`~object.__dict__` which returns the dictionary used to implement the module's - namespace; the name :attr:`~object.__dict__` is an attribute but not a global name. + namespace; the name ``__dict__`` is an attribute but not a global name. Obviously, using this violates the abstraction of namespace implementation, and should be restricted to things like post-mortem debuggers. diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst index 77444f9c..8261bbdb 100644 --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -61,7 +61,7 @@ they appear in the sequence. For example (no pun intended): :: >>> # Measure some strings: - ... words = ['cat', 'window', 'defenestrate'] + >>> words = ['cat', 'window', 'defenestrate'] >>> for w in words: ... print(w, len(w)) ... @@ -160,21 +160,60 @@ arguments. In chapter :ref:`tut-structures`, we will discuss in more detail abo .. _tut-break: -:keyword:`!break` and :keyword:`!continue` Statements, and :keyword:`!else` Clauses on Loops -============================================================================================ +:keyword:`!break` and :keyword:`!continue` Statements +===================================================== The :keyword:`break` statement breaks out of the innermost enclosing -:keyword:`for` or :keyword:`while` loop. +:keyword:`for` or :keyword:`while` loop:: -A :keyword:`!for` or :keyword:`!while` loop can include an :keyword:`!else` clause. + >>> for n in range(2, 10): + ... for x in range(2, n): + ... if n % x == 0: + ... print(f"{n} equals {x} * {n//x}") + ... break + ... + 4 equals 2 * 2 + 6 equals 2 * 3 + 8 equals 2 * 4 + 9 equals 3 * 3 + +The :keyword:`continue` statement continues with the next +iteration of the loop:: + + >>> for num in range(2, 10): + ... if num % 2 == 0: + ... print(f"Found an even number {num}") + ... continue + ... print(f"Found an odd number {num}") + ... + Found an even number 2 + Found an odd number 3 + Found an even number 4 + Found an odd number 5 + Found an even number 6 + Found an odd number 7 + Found an even number 8 + Found an odd number 9 + +.. _tut-for-else: +.. _break-and-continue-statements-and-else-clauses-on-loops: + +:keyword:`!else` Clauses on Loops +================================= + +In a :keyword:`!for` or :keyword:`!while` loop the :keyword:`!break` statement +may be paired with an :keyword:`!else` clause. If the loop finishes without +executing the :keyword:`!break`, the :keyword:`!else` clause executes. In a :keyword:`for` loop, the :keyword:`!else` clause is executed -after the loop reaches its final iteration. +after the loop finishes its final iteration, that is, if no break occurred. In a :keyword:`while` loop, it's executed after the loop's condition becomes false. -In either kind of loop, the :keyword:`!else` clause is **not** executed -if the loop was terminated by a :keyword:`break`. +In either kind of loop, the :keyword:`!else` clause is **not** executed if the +loop was terminated by a :keyword:`break`. Of course, other ways of ending the +loop early, such as a :keyword:`return` or a raised exception, will also skip +execution of the :keyword:`else` clause. This is exemplified in the following :keyword:`!for` loop, which searches for prime numbers:: @@ -198,32 +237,19 @@ which searches for prime numbers:: 9 equals 3 * 3 (Yes, this is the correct code. Look closely: the ``else`` clause belongs to -the :keyword:`for` loop, **not** the :keyword:`if` statement.) +the ``for`` loop, **not** the ``if`` statement.) -When used with a loop, the ``else`` clause has more in common with the -``else`` clause of a :keyword:`try` statement than it does with that of -:keyword:`if` statements: a :keyword:`try` statement's ``else`` clause runs -when no exception occurs, and a loop's ``else`` clause runs when no ``break`` -occurs. For more on the :keyword:`!try` statement and exceptions, see -:ref:`tut-handling`. - -The :keyword:`continue` statement, also borrowed from C, continues with the next -iteration of the loop:: +One way to think of the else clause is to imagine it paired with the ``if`` +inside the loop. As the loop executes, it will run a sequence like +if/if/if/else. The ``if`` is inside the loop, encountered a number of times. If +the condition is ever true, a ``break`` will happen. If the condition is never +true, the ``else`` clause outside the loop will execute. - >>> for num in range(2, 10): - ... if num % 2 == 0: - ... print("Found an even number", num) - ... continue - ... print("Found an odd number", num) - ... - Found an even number 2 - Found an odd number 3 - Found an even number 4 - Found an odd number 5 - Found an even number 6 - Found an odd number 7 - Found an even number 8 - Found an odd number 9 +When used with a loop, the ``else`` clause has more in common with the ``else`` +clause of a :keyword:`try` statement than it does with that of ``if`` +statements: a ``try`` statement's ``else`` clause runs when no exception +occurs, and a loop's ``else`` clause runs when no ``break`` occurs. For more on +the ``try`` statement and exceptions, see :ref:`tut-handling`. .. _tut-pass: @@ -436,8 +462,8 @@ Defining Functions We can create a function that writes the Fibonacci series to an arbitrary boundary:: - >>> def fib(n): # write Fibonacci series up to n - ... """Print a Fibonacci series up to n.""" + >>> def fib(n): # write Fibonacci series less than n + ... """Print a Fibonacci series less than n.""" ... a, b = 0, 1 ... while a < n: ... print(a, end=' ') @@ -445,7 +471,7 @@ boundary:: ... print() ... >>> # Now call the function we just defined: - ... fib(2000) + >>> fib(2000) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 .. index:: @@ -807,7 +833,7 @@ parameters as there is a ``/`` in the function definition:: File "", line 1, in TypeError: pos_only_arg() got some positional-only arguments passed as keyword arguments: 'arg' -The third function ``kwd_only_args`` only allows keyword arguments as indicated +The third function ``kwd_only_arg`` only allows keyword arguments as indicated by a ``*`` in the function definition:: >>> kwd_only_arg(3) diff --git a/Doc/tutorial/datastructures.rst b/Doc/tutorial/datastructures.rst index a1492298..263b0c2e 100644 --- a/Doc/tutorial/datastructures.rst +++ b/Doc/tutorial/datastructures.rst @@ -19,13 +19,13 @@ objects: .. method:: list.append(x) :noindex: - Add an item to the end of the list. Equivalent to ``a[len(a):] = [x]``. + Add an item to the end of the list. Similar to ``a[len(a):] = [x]``. .. method:: list.extend(iterable) :noindex: - Extend the list by appending all the items from the iterable. Equivalent to + Extend the list by appending all the items from the iterable. Similar to ``a[len(a):] = iterable``. @@ -56,7 +56,7 @@ objects: .. method:: list.clear() :noindex: - Remove all items from the list. Equivalent to ``del a[:]``. + Remove all items from the list. Similar to ``del a[:]``. .. method:: list.index(x[, start[, end]]) @@ -93,7 +93,7 @@ objects: .. method:: list.copy() :noindex: - Return a shallow copy of the list. Equivalent to ``a[:]``. + Return a shallow copy of the list. Similar to ``a[:]``. An example that uses most of the list methods:: @@ -142,8 +142,8 @@ Using Lists as Stacks The list methods make it very easy to use a list as a stack, where the last element added is the first element retrieved ("last-in, first-out"). To add an -item to the top of the stack, use :meth:`~list.append`. To retrieve an item from the -top of the stack, use :meth:`~list.pop` without an explicit index. For example:: +item to the top of the stack, use :meth:`!~list.append`. To retrieve an item from the +top of the stack, use :meth:`!~list.pop` without an explicit index. For example:: >>> stack = [3, 4, 5] >>> stack.append(6) @@ -340,7 +340,7 @@ The :keyword:`!del` statement ============================= There is a way to remove an item from a list given its index instead of its -value: the :keyword:`del` statement. This differs from the :meth:`~list.pop` method +value: the :keyword:`del` statement. This differs from the :meth:`!~list.pop` method which returns a value. The :keyword:`!del` statement can also be used to remove slices from a list or clear the entire list (which we did earlier by assignment of an empty list to the slice). For example:: @@ -383,16 +383,16 @@ A tuple consists of a number of values separated by commas, for instance:: >>> t (12345, 54321, 'hello!') >>> # Tuples may be nested: - ... u = t, (1, 2, 3, 4, 5) + >>> u = t, (1, 2, 3, 4, 5) >>> u ((12345, 54321, 'hello!'), (1, 2, 3, 4, 5)) >>> # Tuples are immutable: - ... t[0] = 88888 + >>> t[0] = 88888 Traceback (most recent call last): File "", line 1, in TypeError: 'tuple' object does not support item assignment >>> # but they can contain mutable objects: - ... v = ([1, 2, 3], [3, 2, 1]) + >>> v = ([1, 2, 3], [3, 2, 1]) >>> v ([1, 2, 3], [3, 2, 1]) @@ -465,7 +465,7 @@ Here is a brief demonstration:: False >>> # Demonstrate set operations on unique letters from two words - ... + >>> >>> a = set('abracadabra') >>> b = set('alacazam') >>> a # unique letters in a @@ -500,8 +500,8 @@ any immutable type; strings and numbers can always be keys. Tuples can be used as keys if they contain only strings, numbers, or tuples; if a tuple contains any mutable object either directly or indirectly, it cannot be used as a key. You can't use lists as keys, since lists can be modified in place using index -assignments, slice assignments, or methods like :meth:`~list.append` and -:meth:`~list.extend`. +assignments, slice assignments, or methods like :meth:`!~list.append` and +:meth:`!~list.extend`. It is best to think of a dictionary as a set of *key: value* pairs, with the requirement that the keys are unique (within one dictionary). A pair of diff --git a/Doc/tutorial/errors.rst b/Doc/tutorial/errors.rst index 981b14f5..247b2f64 100644 --- a/Doc/tutorial/errors.rst +++ b/Doc/tutorial/errors.rst @@ -23,7 +23,7 @@ complaint you get while you are still learning Python:: ^^^^^ SyntaxError: invalid syntax -The parser repeats the offending line and displays little 'arrow's pointing +The parser repeats the offending line and displays little arrows pointing at the token in the line where the error was detected. The error may be caused by the absence of a token *before* the indicated token. In the example, the error is detected at the function :func:`print`, since a colon diff --git a/Doc/tutorial/floatingpoint.rst b/Doc/tutorial/floatingpoint.rst index 0795e2fe..dfe2d1d3 100644 --- a/Doc/tutorial/floatingpoint.rst +++ b/Doc/tutorial/floatingpoint.rst @@ -6,7 +6,7 @@ .. _tut-fp-issues: ************************************************** -Floating Point Arithmetic: Issues and Limitations +Floating-Point Arithmetic: Issues and Limitations ************************************************** .. sectionauthor:: Tim Peters @@ -88,7 +88,7 @@ the one with 17 significant digits, ``0.10000000000000001``. Starting with Python 3.1, Python (on most systems) is now able to choose the shortest of these and simply display ``0.1``. -Note that this is in the very nature of binary floating-point: this is not a bug +Note that this is in the very nature of binary floating point: this is not a bug in Python, and it is not a bug in your code either. You'll see the same kind of thing in all languages that support your hardware's floating-point arithmetic (although some languages may not *display* the difference by default, or in all @@ -148,13 +148,13 @@ Binary floating-point arithmetic holds many surprises like this. The problem with "0.1" is explained in precise detail below, in the "Representation Error" section. See `Examples of Floating Point Problems `_ for -a pleasant summary of how binary floating-point works and the kinds of +a pleasant summary of how binary floating point works and the kinds of problems commonly encountered in practice. Also see `The Perils of Floating Point `_ for a more complete account of other common surprises. As that says near the end, "there are no easy answers." Still, don't be unduly -wary of floating-point! The errors in Python float operations are inherited +wary of floating point! The errors in Python float operations are inherited from the floating-point hardware, and on most machines are on the order of no more than 1 part in 2\*\*53 per operation. That's more than adequate for most tasks, but you do need to keep in mind that it's not decimal arithmetic and @@ -230,7 +230,7 @@ accumulate to the point where they affect the final total: >>> sum([0.1] * 10) == 1.0 True -The :func:`math.fsum()` goes further and tracks all of the "lost digits" +The :func:`math.fsum` goes further and tracks all of the "lost digits" as values are added onto a running total so that the result has only a single rounding. This is slower than :func:`sum` but will be more accurate in uncommon cases where large magnitude inputs mostly cancel diff --git a/Doc/tutorial/inputoutput.rst b/Doc/tutorial/inputoutput.rst index 857068a5..35b8c7cd 100644 --- a/Doc/tutorial/inputoutput.rst +++ b/Doc/tutorial/inputoutput.rst @@ -87,12 +87,12 @@ Some examples:: >>> print(s) The value of x is 32.5, and y is 40000... >>> # The repr() of a string adds string quotes and backslashes: - ... hello = 'hello, world\n' + >>> hello = 'hello, world\n' >>> hellos = repr(hello) >>> print(hellos) 'hello, world\n' >>> # The argument to repr() may be any Python object: - ... repr((x, y, ('spam', 'eggs'))) + >>> repr((x, y, ('spam', 'eggs'))) "(32.5, 40000, ('spam', 'eggs'))" The :mod:`string` module contains a :class:`~string.Template` class that offers @@ -100,6 +100,13 @@ yet another way to substitute values into strings, using placeholders like ``$x`` and replacing them with values from a dictionary, but offers much less control of the formatting. +.. index:: + single: formatted string literal + single: interpolated string literal + single: string; formatted literal + single: string; interpolated literal + single: f-string + single: fstring .. _tut-f-strings: @@ -279,9 +286,11 @@ left with zeros. It understands about plus and minus signs:: Old string formatting --------------------- -The % operator (modulo) can also be used for string formatting. Given ``'string' -% values``, instances of ``%`` in ``string`` are replaced with zero or more -elements of ``values``. This operation is commonly known as string +The % operator (modulo) can also be used for string formatting. +Given ``format % values`` (where *format* is a string), +``%`` conversion specifications in *format* are replaced with +zero or more elements of *values*. +This operation is commonly known as string interpolation. For example:: >>> import math diff --git a/Doc/tutorial/introduction.rst b/Doc/tutorial/introduction.rst index 0f16dae8..65e3b193 100644 --- a/Doc/tutorial/introduction.rst +++ b/Doc/tutorial/introduction.rst @@ -62,7 +62,7 @@ For example:: 20 >>> (50 - 5*6) / 4 5.0 - >>> 8 / 5 # division always returns a floating point number + >>> 8 / 5 # division always returns a floating-point number 1.6 The integer numbers (e.g. ``2``, ``4``, ``20``) have type :class:`int`, @@ -197,21 +197,19 @@ and workarounds. String literals can span multiple lines. One way is using triple-quotes: ``"""..."""`` or ``'''...'''``. End of lines are automatically included in the string, but it's possible to prevent this by adding a ``\`` at -the end of the line. The following example:: - - print("""\ +the end of the line. In the following example, the initial newline is not +included:: + + >>> print("""\ + ... Usage: thingy [OPTIONS] + ... -h Display this usage message + ... -H hostname Hostname to connect to + ... """) Usage: thingy [OPTIONS] -h Display this usage message -H hostname Hostname to connect to - """) - -produces the following output (note that the initial newline is not included): -.. code-block:: text - - Usage: thingy [OPTIONS] - -h Display this usage message - -H hostname Hostname to connect to + >>> Strings can be concatenated (glued together) with the ``+`` operator, and repeated with ``*``:: @@ -501,8 +499,8 @@ together. For instance, we can write an initial sub-sequence of the as follows:: >>> # Fibonacci series: - ... # the sum of two elements defines the next - ... a, b = 0, 1 + >>> # the sum of two elements defines the next + >>> a, b = 0, 1 >>> while a < 10: ... print(a) ... a, b = b, a+b @@ -544,7 +542,7 @@ This example introduces several new features. * The :func:`print` function writes the value of the argument(s) it is given. It differs from just writing the expression you want to write (as we did earlier in the calculator examples) in the way it handles multiple arguments, - floating point quantities, and strings. Strings are printed without quotes, + floating-point quantities, and strings. Strings are printed without quotes, and a space is inserted between items, so you can format things nicely, like this:: diff --git a/Doc/tutorial/modules.rst b/Doc/tutorial/modules.rst index 0316239e..de7aa0e2 100644 --- a/Doc/tutorial/modules.rst +++ b/Doc/tutorial/modules.rst @@ -585,8 +585,9 @@ as the main module of a Python application must always use absolute imports. Packages in Multiple Directories -------------------------------- -Packages support one more special attribute, :attr:`__path__`. This is -initialized to be a list containing the name of the directory holding the +Packages support one more special attribute, :attr:`~module.__path__`. This is +initialized to be a :term:`sequence` of strings containing the name of the +directory holding the package's :file:`__init__.py` before the code in that file is executed. This variable can be modified; doing so affects future searches for modules and subpackages contained in the package. diff --git a/Doc/tutorial/stdlib.rst b/Doc/tutorial/stdlib.rst index 6bae279c..ca9dadb4 100644 --- a/Doc/tutorial/stdlib.rst +++ b/Doc/tutorial/stdlib.rst @@ -138,7 +138,7 @@ Mathematics =========== The :mod:`math` module gives access to the underlying C library functions for -floating point math:: +floating-point math:: >>> import math >>> math.cos(math.pi / 4) diff --git a/Doc/tutorial/stdlib2.rst b/Doc/tutorial/stdlib2.rst index 33f311db..b6d36365 100644 --- a/Doc/tutorial/stdlib2.rst +++ b/Doc/tutorial/stdlib2.rst @@ -293,7 +293,7 @@ Many data structure needs can be met with the built-in list type. However, sometimes there is a need for alternative implementations with different performance trade-offs. -The :mod:`array` module provides an :class:`~array.array()` object that is like +The :mod:`array` module provides an :class:`~array.array` object that is like a list that stores only homogeneous data and stores it more compactly. The following example shows an array of numbers stored as two byte unsigned binary numbers (typecode ``"H"``) rather than the usual 16 bytes per entry for regular @@ -306,7 +306,7 @@ lists of Python int objects:: >>> a[1:3] array('H', [10, 700]) -The :mod:`collections` module provides a :class:`~collections.deque()` object +The :mod:`collections` module provides a :class:`~collections.deque` object that is like a list with faster appends and pops from the left side but slower lookups in the middle. These objects are well suited for implementing queues and breadth first tree searches:: @@ -352,11 +352,11 @@ not want to run a full list sort:: .. _tut-decimal-fp: -Decimal Floating Point Arithmetic +Decimal Floating-Point Arithmetic ================================= The :mod:`decimal` module offers a :class:`~decimal.Decimal` datatype for -decimal floating point arithmetic. Compared to the built-in :class:`float` +decimal floating-point arithmetic. Compared to the built-in :class:`float` implementation of binary floating point, the class is especially helpful for * financial applications and other uses which require exact decimal diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst index 82fbc82b..50f6eb8c 100644 --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -24,7 +24,7 @@ Command line When invoking Python, you may specify any of these options:: - python [-bBdEhiIOqsSuvVWx?] [-c command | -m module-name | script | - ] [args] + python [-bBdEhiIOPqRsSuvVWx?] [-c command | -m module-name | script | - ] [args] The most common use case is, of course, a simple invocation of a script:: @@ -440,6 +440,7 @@ Miscellaneous options -Wdefault # Warn once per call location -Werror # Convert to exceptions -Walways # Warn every time + -Wall # Same as -Walways -Wmodule # Warn once per calling module -Wonce # Warn once per Python process -Wignore # Never warn @@ -719,6 +720,11 @@ conflict. This variable can also be modified by Python code using :data:`os.environ` to force inspect mode on program termination. + .. audit-event:: cpython.run_stdin "" "" + + .. versionchanged:: 3.12.5 (also 3.11.10, 3.10.15, 3.9.20, and 3.8.20) + Emits audit events. + .. envvar:: PYTHONUNBUFFERED @@ -842,6 +848,7 @@ conflict. PYTHONWARNINGS=default # Warn once per call location PYTHONWARNINGS=error # Convert to exceptions PYTHONWARNINGS=always # Warn every time + PYTHONWARNINGS=all # Same as PYTHONWARNINGS=always PYTHONWARNINGS=module # Warn once per calling module PYTHONWARNINGS=once # Warn once per Python process PYTHONWARNINGS=ignore # Never warn @@ -943,7 +950,7 @@ conflict. 'surrogatepass' are used. This may also be enabled at runtime with - :func:`sys._enablelegacywindowsfsencoding()`. + :func:`sys._enablelegacywindowsfsencoding`. .. availability:: Windows. diff --git a/Doc/using/configure.rst b/Doc/using/configure.rst index 0e605b38..fed1d1e2 100644 --- a/Doc/using/configure.rst +++ b/Doc/using/configure.rst @@ -14,8 +14,8 @@ Features required to build CPython: `_ are not required. -* Support for `IEEE 754 `_ floating - point numbers and `floating point Not-a-Number (NaN) +* Support for `IEEE 754 `_ + floating-point numbers and `floating-point Not-a-Number (NaN) `_. * Support for threads. @@ -459,7 +459,7 @@ Debug options Effects: * Define the ``Py_TRACE_REFS`` macro. - * Add :func:`!sys.getobjects` function. + * Add :func:`sys.getobjects` function. * Add :envvar:`PYTHONDUMPREFS` environment variable. This build is not ABI compatible with release build (default build) or debug diff --git a/Doc/using/mac.rst b/Doc/using/mac.rst index 31d37aad..8b67652d 100644 --- a/Doc/using/mac.rst +++ b/Doc/using/mac.rst @@ -155,7 +155,7 @@ https://www.activestate.com; it can also be built from source. A number of alternative macOS GUI toolkits are available: * `PySide `__: Official Python bindings to the - `Qt GUI toolkit `__. + `Qt GUI toolkit `__. * `PyQt `__: Alternative Python bindings to Qt. diff --git a/Doc/using/unix.rst b/Doc/using/unix.rst index 58838c28..a2bcdab0 100644 --- a/Doc/using/unix.rst +++ b/Doc/using/unix.rst @@ -17,12 +17,12 @@ On Linux Python comes preinstalled on most Linux distributions, and is available as a package on all others. However there are certain features you might want to use -that are not available on your distro's package. You can easily compile the +that are not available on your distro's package. You can compile the latest version of Python from source. -In the event that Python doesn't come preinstalled and isn't in the repositories as -well, you can easily make packages for your own distro. Have a look at the -following links: +In the event that the latest version of Python doesn't come preinstalled and isn't +in the repositories as well, you can make packages for your own distro. Have a +look at the following links: .. seealso:: diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index 013374f2..2a507675 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -394,7 +394,7 @@ When writing to the Windows Registry, the following behaviors exist: For more detail on the technical basis for these limitations, please consult Microsoft's documentation on packaged full-trust apps, currently available at `docs.microsoft.com/en-us/windows/msix/desktop/desktop-to-uwp-behind-the-scenes -`_ +`_ .. _windows-nuget: @@ -475,7 +475,7 @@ dependents, such as Idle), pip and the Python documentation are not included. .. note:: The embedded distribution does not include the `Microsoft C Runtime - `_ and it is + `_ and it is the responsibility of the application installer to provide this. The runtime may have already been installed on a user's system previously or automatically via Windows Update, and can be detected by finding @@ -548,7 +548,7 @@ key features: Popular scientific modules (such as numpy, scipy and pandas) and the ``conda`` package manager. -`Enthought Deployment Manager `_ +`Enthought Deployment Manager `_ "The Next Generation Python Environment and Package Manager". Previously Enthought provided Canopy, but it `reached end of life in 2016 @@ -618,13 +618,13 @@ System variables, you need non-restricted access to your machine .. seealso:: - https://docs.microsoft.com/en-us/windows/win32/procthread/environment-variables + https://learn.microsoft.com/windows/win32/procthread/environment-variables Overview of environment variables on Windows - https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/set_1 + https://learn.microsoft.com/windows-server/administration/windows-commands/set_1 The ``set`` command, for temporarily modifying environment variables - https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/setx + https://learn.microsoft.com/windows-server/administration/windows-commands/setx The ``setx`` command, for permanently modifying environment variables @@ -1222,13 +1222,13 @@ is a collection of modules for advanced Windows-specific support. This includes utilities for: * `Component Object Model - `_ + `_ (COM) * Win32 API calls * Registry * Event log * `Microsoft Foundation Classes - `_ + `_ (MFC) user interfaces `PythonWin `_ + `Win32 How Do I...? `_ by Tim Golden `Python and COM `_ diff --git a/Doc/whatsnew/2.1.rst b/Doc/whatsnew/2.1.rst index b4002f06..f23f27c9 100644 --- a/Doc/whatsnew/2.1.rst +++ b/Doc/whatsnew/2.1.rst @@ -443,8 +443,8 @@ Python syntax:: f.grammar = "A ::= B (C D)*" The dictionary containing attributes can be accessed as the function's -:attr:`~object.__dict__`. Unlike the :attr:`~object.__dict__` attribute of class instances, in -functions you can actually assign a new dictionary to :attr:`~object.__dict__`, though +:attr:`~function.__dict__`. Unlike the :attr:`~type.__dict__` attribute of class instances, in +functions you can actually assign a new dictionary to :attr:`~function.__dict__`, though the new value is restricted to a regular Python dictionary; you *can't* be tricky and set it to a :class:`!UserDict` instance, or any other random object that behaves like a mapping. @@ -644,9 +644,9 @@ New and Improved Modules lists the function arguments and the local variables for each frame. * Various functions in the :mod:`time` module, such as :func:`~time.asctime` and - :func:`~time.localtime`, require a floating point argument containing the time in + :func:`~time.localtime`, require a floating-point argument containing the time in seconds since the epoch. The most common use of these functions is to work with - the current time, so the floating point argument has been made optional; when a + the current time, so the floating-point argument has been made optional; when a value isn't provided, the current time will be used. For example, log file entries usually need a string containing the current time; in Python 2.1, ``time.asctime()`` can be used, instead of the lengthier diff --git a/Doc/whatsnew/2.2.rst b/Doc/whatsnew/2.2.rst index d4dbe057..856be5ec 100644 --- a/Doc/whatsnew/2.2.rst +++ b/Doc/whatsnew/2.2.rst @@ -171,7 +171,7 @@ attributes of their own: * :attr:`~definition.__name__` is the attribute's name. -* :attr:`!__doc__` is the attribute's docstring. +* :attr:`~definition.__doc__` is the attribute's docstring. * ``__get__(object)`` is a method that retrieves the attribute value from *object*. @@ -186,7 +186,8 @@ are:: descriptor = obj.__class__.x descriptor.__get__(obj) -For methods, :meth:`!descriptor.__get__` returns a temporary object that's +For methods, :meth:`descriptor.__get__ ` returns a temporary +object that's callable, and wraps up the instance and the method to be called on it. This is also why static methods and class methods are now possible; they have descriptors that wrap up just the method, or the method and the class. As a @@ -1249,7 +1250,7 @@ Some of the more notable changes are: * The :func:`pow` built-in function no longer supports 3 arguments when floating-point numbers are supplied. ``pow(x, y, z)`` returns ``(x**y) % z``, - but this is never useful for floating point numbers, and the final result varies + but this is never useful for floating-point numbers, and the final result varies unpredictably depending on the platform. A call such as ``pow(2.0, 8.0, 7.0)`` will now raise a :exc:`TypeError` exception. diff --git a/Doc/whatsnew/2.3.rst b/Doc/whatsnew/2.3.rst index e2f1bbf7..93a36e74 100644 --- a/Doc/whatsnew/2.3.rst +++ b/Doc/whatsnew/2.3.rst @@ -1113,10 +1113,10 @@ Here are all of the changes that Python 2.3 makes to the core Python language. * One of the noted incompatibilities between old- and new-style classes has been - removed: you can now assign to the :attr:`~definition.__name__` and :attr:`~class.__bases__` + removed: you can now assign to the :attr:`~type.__name__` and :attr:`~type.__bases__` attributes of new-style classes. There are some restrictions on what can be - assigned to :attr:`~class.__bases__` along the lines of those relating to assigning to - an instance's :attr:`~instance.__class__` attribute. + assigned to :attr:`!__bases__` along the lines of those relating to assigning to + an instance's :attr:`~object.__class__` attribute. .. ====================================================================== @@ -1382,7 +1382,7 @@ complete list of changes, or look through the CVS logs for all the details. In Python 2.4, the default will change to always returning floats. Application developers should enable this feature only if all their libraries - work properly when confronted with floating point time stamps, or if they use + work properly when confronted with floating-point time stamps, or if they use the tuple API. If used, the feature should be activated on an application level instead of trying to enable it on a per-use basis. @@ -1925,8 +1925,8 @@ Changes to Python's build process and to the C API include: dependence on a system version or local installation of Expat. * If you dynamically allocate type objects in your extension, you should be - aware of a change in the rules relating to the :attr:`!__module__` and - :attr:`~definition.__name__` attributes. In summary, you will want to ensure the type's + aware of a change in the rules relating to the :attr:`~type.__module__` and + :attr:`~type.__name__` attributes. In summary, you will want to ensure the type's dictionary contains a ``'__module__'`` key; making the module name the part of the type name leading up to the final period will no longer have the desired effect. For more detail, read the API reference documentation or the source. diff --git a/Doc/whatsnew/2.4.rst b/Doc/whatsnew/2.4.rst index f085f5c6..909abfb2 100644 --- a/Doc/whatsnew/2.4.rst +++ b/Doc/whatsnew/2.4.rst @@ -684,11 +684,11 @@ includes a quick-start tutorial and a reference. Written by Facundo Batista and implemented by Facundo Batista, Eric Price, Raymond Hettinger, Aahz, and Tim Peters. - http://www.lahey.com/float.htm + `http://www.lahey.com/float.htm `__ The article uses Fortran code to illustrate many of the problems that floating-point inaccuracy can cause. - http://speleotrove.com/decimal/ + https://speleotrove.com/decimal/ A description of a decimal-based representation. This representation is being proposed as a standard, and underlies the new Python decimal type. Much of this material was written by Mike Cowlishaw, designer of the Rexx language. @@ -757,7 +757,7 @@ API that perform ASCII-only conversions, ignoring the locale setting: :c:expr:`double` to an ASCII string. The code for these functions came from the GLib library -(https://developer-old.gnome.org/glib/2.26/), whose developers kindly +(`https://developer-old.gnome.org/glib/2.26/ `__), whose developers kindly relicensed the relevant functions and donated them to the Python Software Foundation. The :mod:`locale` module can now change the numeric locale, letting extensions such as GTK+ produce the correct results. diff --git a/Doc/whatsnew/2.5.rst b/Doc/whatsnew/2.5.rst index 6aa3e459..802c3a90 100644 --- a/Doc/whatsnew/2.5.rst +++ b/Doc/whatsnew/2.5.rst @@ -1724,7 +1724,7 @@ attribute of the function object to change this:: :mod:`ctypes` also provides a wrapper for Python's C API as the ``ctypes.pythonapi`` object. This object does *not* release the global interpreter lock before calling a function, because the lock must be held when -calling into the interpreter's code. There's a :class:`py_object()` type +calling into the interpreter's code. There's a :class:`~ctypes.py_object` type constructor that will create a :c:expr:`PyObject *` pointer. A simple usage:: import ctypes @@ -1734,7 +1734,7 @@ constructor that will create a :c:expr:`PyObject *` pointer. A simple usage:: ctypes.py_object("abc"), ctypes.py_object(1)) # d is now {'abc', 1}. -Don't forget to use :class:`py_object()`; if it's omitted you end up with a +Don't forget to use :func:`~ctypes.py_object`; if it's omitted you end up with a segmentation fault. :mod:`ctypes` has been around for a while, but people still write and diff --git a/Doc/whatsnew/2.6.rst b/Doc/whatsnew/2.6.rst index d2a82d5c..e04684b9 100644 --- a/Doc/whatsnew/2.6.rst +++ b/Doc/whatsnew/2.6.rst @@ -502,12 +502,12 @@ Python's :option:`-m` switch allows running a module as a script. When you ran a module that was located inside a package, relative imports didn't work correctly. -The fix for Python 2.6 adds a :attr:`__package__` attribute to -modules. When this attribute is present, relative imports will be +The fix for Python 2.6 adds a :attr:`module.__package__` attribute. +When this attribute is present, relative imports will be relative to the value of this attribute instead of the -:attr:`__name__` attribute. +:attr:`~module.__name__` attribute. -PEP 302-style importers can then set :attr:`__package__` as necessary. +PEP 302-style importers can then set :attr:`~module.__package__` as necessary. The :mod:`runpy` module that implements the :option:`-m` switch now does this, so relative imports will now work correctly in scripts running from inside a package. @@ -1453,7 +1453,7 @@ that will be the numerator and denominator of the resulting fraction. :: Fraction(5, 3) For converting floating-point numbers to rationals, -the float type now has an :meth:`as_integer_ratio()` method that returns +the float type now has an :meth:`as_integer_ratio` method that returns the numerator and denominator for a fraction that evaluates to the same floating-point value:: @@ -2273,7 +2273,7 @@ changes, or look through the Subversion logs for all the details. (Contributed by Guido van Rossum from work for Google App Engine; :issue:`3487`.) -* The :mod:`rlcompleter` module's :meth:`Completer.complete()` method +* The :mod:`rlcompleter` module's :meth:`Completer.complete` method will now ignore exceptions triggered while evaluating a name. (Fixed by Lorenz Quack; :issue:`2250`.) @@ -2566,7 +2566,7 @@ changes, or look through the Subversion logs for all the details. :meth:`tracer`, and :meth:`speed` methods. * The ability to set new shapes for the turtle, and to define a new coordinate system. - * Turtles now have an :meth:`undo()` method that can roll back actions. + * Turtles now have an :meth:`undo` method that can roll back actions. * Simple support for reacting to input events such as mouse and keyboard activity, making it possible to write simple games. * A :file:`turtle.cfg` file can be used to customize the starting appearance @@ -3051,7 +3051,7 @@ Changes to Python's build process and to the C API include: * Several functions return information about the platform's floating-point support. :c:func:`PyFloat_GetMax` returns - the maximum representable floating point value, + the maximum representable floating-point value, and :c:func:`PyFloat_GetMin` returns the minimum positive value. :c:func:`PyFloat_GetInfo` returns an object containing more information from the :file:`float.h` file, such as diff --git a/Doc/whatsnew/2.7.rst b/Doc/whatsnew/2.7.rst index 585c704a..1231bd76 100644 --- a/Doc/whatsnew/2.7.rst +++ b/Doc/whatsnew/2.7.rst @@ -291,7 +291,7 @@ modules. configuration files can now be read, modified, and then written back in their original order. -* The :meth:`~collections.somenamedtuple._asdict()` method for +* The :meth:`~collections.somenamedtuple._asdict` method for :func:`collections.namedtuple` now returns an ordered dictionary with the values appearing in the same order as the underlying tuple indices. @@ -1198,7 +1198,7 @@ changes, or look through the Subversion logs for all the details. of the operands. Previously such comparisons would fall back to Python's default rules for comparing objects, which produced arbitrary results based on their type. Note that you still cannot combine - :class:`!Decimal` and floating-point in other operations such as addition, + :class:`!Decimal` and floating point in other operations such as addition, since you should be explicitly choosing how to convert between float and :class:`!Decimal`. (Fixed by Mark Dickinson; :issue:`2531`.) @@ -1548,7 +1548,7 @@ changes, or look through the Subversion logs for all the details. *ciphers* argument that's a string listing the encryption algorithms to be allowed; the format of the string is described `in the OpenSSL documentation - `__. + `__. (Added by Antoine Pitrou; :issue:`8322`.) Another change makes the extension load all of OpenSSL's ciphers and @@ -2680,14 +2680,12 @@ automatic ``PATH`` modifications to have ``pip`` available from the command line by default, otherwise it can still be accessed through the Python launcher for Windows as ``py -m pip``. -As `discussed in the PEP`__, platform packagers may choose not to install +As :pep:`discussed in the PEP <0477#disabling-ensurepip-by-downstream-distributors>`, +platform packagers may choose not to install these commands by default, as long as, when invoked, they provide clear and simple directions on how to install them on that platform (usually using the system package manager). -__ https://peps.python.org/pep-0477/#disabling-ensurepip-by-downstream-distributors - - Documentation Changes ~~~~~~~~~~~~~~~~~~~~~ diff --git a/Doc/whatsnew/3.0.rst b/Doc/whatsnew/3.0.rst index 22e44671..766db5ec 100644 --- a/Doc/whatsnew/3.0.rst +++ b/Doc/whatsnew/3.0.rst @@ -357,8 +357,8 @@ New Syntax provides a standardized way of annotating a function's parameters and return value. There are no semantics attached to such annotations except that they can be introspected at runtime using - the :attr:`__annotations__` attribute. The intent is to encourage - experimentation through metaclasses, decorators or frameworks. + the :attr:`~object.__annotations__` attribute. The intent is to + encourage experimentation through metaclasses, decorators or frameworks. * :pep:`3102`: Keyword-only arguments. Named parameters occurring after ``*args`` in the parameter list *must* be specified using diff --git a/Doc/whatsnew/3.1.rst b/Doc/whatsnew/3.1.rst index 7ecc34ab..fd427421 100644 --- a/Doc/whatsnew/3.1.rst +++ b/Doc/whatsnew/3.1.rst @@ -205,9 +205,9 @@ Some smaller changes made to the core Python language are: (Contributed by Mark Dickinson; :issue:`4707`.) -* Python now uses David Gay's algorithm for finding the shortest floating - point representation that doesn't change its value. This should help - mitigate some of the confusion surrounding binary floating point +* Python now uses David Gay's algorithm for finding the shortest floating-point + representation that doesn't change its value. This should help + mitigate some of the confusion surrounding binary floating-point numbers. The significance is easily seen with a number like ``1.1`` which does not @@ -215,7 +215,7 @@ Some smaller changes made to the core Python language are: equivalent, an expression like ``float('1.1')`` evaluates to the nearest representable value which is ``0x1.199999999999ap+0`` in hex or ``1.100000000000000088817841970012523233890533447265625`` in decimal. That - nearest value was and still is used in subsequent floating point + nearest value was and still is used in subsequent floating-point calculations. What is new is how the number gets displayed. Formerly, Python used a @@ -224,7 +224,7 @@ Some smaller changes made to the core Python language are: using 17 digits was that it relied on IEEE-754 guarantees to assure that ``eval(repr(1.1))`` would round-trip exactly to its original value. The disadvantage is that many people found the output to be confusing (mistaking - intrinsic limitations of binary floating point representation as being a + intrinsic limitations of binary floating-point representation as being a problem with Python itself). The new algorithm for ``repr(1.1)`` is smarter and returns ``'1.1'``. @@ -236,8 +236,8 @@ Some smaller changes made to the core Python language are: it does not change the underlying values. So, it is still the case that ``1.1 + 2.2 != 3.3`` even though the representations may suggest otherwise. - The new algorithm depends on certain features in the underlying floating - point implementation. If the required features are not found, the old + The new algorithm depends on certain features in the underlying floating-point + implementation. If the required features are not found, the old algorithm will continue to be used. Also, the text pickle protocols assure cross-platform portability by using the old algorithm. @@ -550,7 +550,7 @@ Porting to Python 3.1 This section lists previously described changes and other bugfixes that may require changes to your code: -* The new floating point string representations can break existing doctests. +* The new floating-point string representations can break existing doctests. For example:: def e(): diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 30b39aad..9c647972 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -1233,7 +1233,7 @@ also now un-stringize stringized annotations. itertools --------- -Add :func:`itertools.pairwise()`. +Add :func:`itertools.pairwise`. (Contributed by Raymond Hettinger in :issue:`38200`.) linecache @@ -1245,14 +1245,14 @@ When a module does not define ``__loader__``, fall back to ``__spec__.loader``. os -- -Add :func:`os.cpu_count()` support for VxWorks RTOS. +Add :func:`os.cpu_count` support for VxWorks RTOS. (Contributed by Peixing Xin in :issue:`41440`.) Add a new function :func:`os.eventfd` and related helpers to wrap the ``eventfd2`` syscall on Linux. (Contributed by Christian Heimes in :issue:`41001`.) -Add :func:`os.splice()` that allows to move data between two file +Add :func:`os.splice` that allows to move data between two file descriptors without copying between kernel address space and user address space, where one of the file descriptors must refer to a pipe. (Contributed by Pablo Galindo in :issue:`41625`.) @@ -1292,7 +1292,7 @@ functions in the :mod:`os` module. platform -------- -Add :func:`platform.freedesktop_os_release()` to retrieve operation system +Add :func:`platform.freedesktop_os_release` to retrieve operation system identification from `freedesktop.org os-release `_ standard file. (Contributed by Christian Heimes in :issue:`28468`.) diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 5e272478..84805f93 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -768,6 +768,21 @@ functools (Contributed by Yurii Karabas in :issue:`46014`.) +.. _whatsnew311-gzip: + +gzip +---- + +* The :func:`gzip.compress` function is now faster when used with the + **mtime=0** argument as it delegates the compression entirely to a single + :func:`zlib.compress` operation. There is one side effect of this change: The + gzip file header contains an "OS" byte in its header. That was traditionally + always set to a value of 255 representing "unknown" by the :mod:`gzip` + module. Now, when using :func:`~gzip.compress` with **mtime=0**, it may be + set to a different value by the underlying zlib C library Python was linked + against. + (See :gh:`112346` for details on the side effect.) + .. _whatsnew311-hashlib: hashlib @@ -2017,8 +2032,8 @@ Removed C APIs are :ref:`listed separately `. It was introduced in Python 3.4 but has been broken since Python 3.7. (Contributed by Inada Naoki in :issue:`23882`.) -* Removed the undocumented private :meth:`!float.__set_format__()` method, - previously known as :meth:`!float.__setformat__()` in Python 3.7. +* Removed the undocumented private :meth:`!float.__set_format__` method, + previously known as :meth:`!float.__setformat__` in Python 3.7. Its docstring said: "You probably don't want to use this function. It exists mainly to be used in Python's test suite." (Contributed by Victor Stinner in :issue:`46852`.) @@ -2123,7 +2138,7 @@ Build Changes :issue:`45440` and :issue:`46640`.) * Support for `IEEE 754 `_ - floating point numbers. + floating-point numbers. (Contributed by Victor Stinner in :issue:`46917`.) * The :c:macro:`!Py_NO_NAN` macro has been removed. diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 6ba04c62..ee347d20 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -59,7 +59,7 @@ Summary -- Release highlights .. This section singles out the most important changes in Python 3.12. Brevity is key. -Python 3.12 is the latest stable release of the Python programming language, +Python 3.12 is a stable release of the Python programming language, with a mix of changes to the language and the standard library. The library changes focus on cleaning up deprecated APIs, usability, and correctness. Of note, the :mod:`!distutils` package has been removed from the standard library. @@ -154,7 +154,7 @@ Important deprecations, removals or restrictions: reducing the size of every :class:`str` object by at least 8 bytes. * :pep:`632`: Remove the :mod:`!distutils` package. - See `the migration guide `_ + See :pep:`the migration guide <0632#migration-advice>` for advice replacing the APIs it provided. The third-party `Setuptools `__ package continues to provide :mod:`!distutils`, @@ -739,7 +739,7 @@ inspect itertools --------- -* Add :class:`itertools.batched()` for collecting into even-sized +* Add :func:`itertools.batched` for collecting into even-sized tuples where the last batch may be shorter than the rest. (Contributed by Raymond Hettinger in :gh:`98363`.) @@ -1265,7 +1265,7 @@ Deprecated We added the warning to raise awareness as issues encountered by code doing this are becoming more frequent. See the :func:`os.fork` documentation for more details along with `this discussion on fork being incompatible with threads - `_ for *why* we're now surfacing this + `_ for *why* we're now surfacing this longstanding platform compatibility problem to developers. When this warning appears due to usage of :mod:`multiprocessing` or @@ -1320,173 +1320,39 @@ Deprecated may be removed in a future version of Python. Use the single-arg versions of these functions instead. (Contributed by Ofey Chan in :gh:`89874`.) -* :exc:`DeprecationWarning` is now raised when ``__package__`` on a - module differs from ``__spec__.parent`` (previously it was - :exc:`ImportWarning`). +* :exc:`DeprecationWarning` is now raised when :attr:`~module.__package__` on a + module differs from + :attr:`__spec__.parent ` (previously + it was :exc:`ImportWarning`). (Contributed by Brett Cannon in :gh:`65961`.) -* Setting ``__package__`` or ``__cached__`` on a module is deprecated, - and will cease to be set or taken into consideration by the import system in Python 3.14. - (Contributed by Brett Cannon in :gh:`65961`.) +* Setting :attr:`~module.__package__` or :attr:`~module.__cached__` on a + module is deprecated, and will cease to be set or taken into consideration by + the import system in Python 3.14. (Contributed by Brett Cannon in :gh:`65961`.) * The bitwise inversion operator (``~``) on bool is deprecated. It will throw an - error in Python 3.14. Use ``not`` for logical negation of bools instead. + error in Python 3.16. Use ``not`` for logical negation of bools instead. In the rare case that you really need the bitwise inversion of the underlying ``int``, convert to int explicitly: ``~int(x)``. (Contributed by Tim Hoffmann in :gh:`103487`.) * Accessing :attr:`~codeobject.co_lnotab` on code objects was deprecated in Python 3.10 via :pep:`626`, - but it only got a proper :exc:`DeprecationWarning` in 3.12, - therefore it will be removed in 3.14. + but it only got a proper :exc:`DeprecationWarning` in 3.12. + May be removed in 3.15. (Contributed by Nikita Sobolev in :gh:`101866`.) -Pending Removal in Python 3.13 ------------------------------- - -The following modules and APIs have been deprecated in earlier Python releases, -and will be removed in Python 3.13. - -Modules (see :pep:`594`): - -* :mod:`aifc` -* :mod:`audioop` -* :mod:`cgi` -* :mod:`cgitb` -* :mod:`chunk` -* :mod:`crypt` -* :mod:`imghdr` -* :mod:`mailcap` -* :mod:`msilib` -* :mod:`nis` -* :mod:`nntplib` -* :mod:`ossaudiodev` -* :mod:`pipes` -* :mod:`sndhdr` -* :mod:`spwd` -* :mod:`sunau` -* :mod:`telnetlib` -* :mod:`uu` -* :mod:`xdrlib` - -Other modules: - -* :mod:`!lib2to3`, and the :program:`2to3` program (:gh:`84540`) - -APIs: - -* :class:`!configparser.LegacyInterpolation` (:gh:`90765`) -* ``locale.resetlocale()`` (:gh:`90817`) -* :meth:`!turtle.RawTurtle.settiltangle` (:gh:`50096`) -* :func:`!unittest.findTestCases` (:gh:`50096`) -* :func:`!unittest.getTestCaseNames` (:gh:`50096`) -* :func:`!unittest.makeSuite` (:gh:`50096`) -* :meth:`!unittest.TestProgram.usageExit` (:gh:`67048`) -* :class:`!webbrowser.MacOSX` (:gh:`86421`) -* :class:`classmethod` descriptor chaining (:gh:`89519`) -* :mod:`importlib.resources` deprecated methods: - - * ``contents()`` - * ``is_resource()`` - * ``open_binary()`` - * ``open_text()`` - * ``path()`` - * ``read_binary()`` - * ``read_text()`` - - Use :func:`importlib.resources.files()` instead. Refer to `importlib-resources: Migrating from Legacy - `_ (:gh:`106531`) - -Pending Removal in Python 3.14 ------------------------------- - -The following APIs have been deprecated -and will be removed in Python 3.14. - -* :mod:`argparse`: The *type*, *choices*, and *metavar* parameters - of :class:`!argparse.BooleanOptionalAction` - -* :mod:`ast`: - - * :class:`!ast.Num` - * :class:`!ast.Str` - * :class:`!ast.Bytes` - * :class:`!ast.NameConstant` - * :class:`!ast.Ellipsis` - -* :mod:`asyncio`: - - * :class:`!asyncio.MultiLoopChildWatcher` - * :class:`!asyncio.FastChildWatcher` - * :class:`!asyncio.AbstractChildWatcher` - * :class:`!asyncio.SafeChildWatcher` - * :func:`!asyncio.set_child_watcher` - * :func:`!asyncio.get_child_watcher`, - * :meth:`!asyncio.AbstractEventLoopPolicy.set_child_watcher` - * :meth:`!asyncio.AbstractEventLoopPolicy.get_child_watcher` - -* :mod:`collections.abc`: :class:`!collections.abc.ByteString`. - -* :mod:`email`: the *isdst* parameter in :func:`email.utils.localtime`. - -* :mod:`importlib.abc`: - - * :class:`!importlib.abc.ResourceReader` - * :class:`!importlib.abc.Traversable` - * :class:`!importlib.abc.TraversableResources` - -* :mod:`itertools`: Support for copy, deepcopy, and pickle operations. - -* :mod:`pkgutil`: - - * :func:`!pkgutil.find_loader` - * :func:`!pkgutil.get_loader`. - -* :mod:`pty`: - - * :func:`!pty.master_open` - * :func:`!pty.slave_open` +.. include:: ../deprecations/pending-removal-in-3.13.rst -* :mod:`shutil`: The *onerror* argument of :func:`shutil.rmtree` - -* :mod:`typing`: :class:`!typing.ByteString` - -* :mod:`xml.etree.ElementTree`: Testing the truth value of an :class:`xml.etree.ElementTree.Element`. - -* The ``__package__`` and ``__cached__`` attributes on module objects. - -* The :attr:`~codeobject.co_lnotab` attribute of code objects. - -Pending Removal in Python 3.15 ------------------------------- +.. include:: ../deprecations/pending-removal-in-3.14.rst -The following APIs have been deprecated -and will be removed in Python 3.15. +.. include:: ../deprecations/pending-removal-in-3.15.rst -APIs: +.. include:: ../deprecations/pending-removal-in-3.16.rst -* :func:`locale.getdefaultlocale` (:gh:`90817`) - - -Pending Removal in Future Versions ----------------------------------- - -The following APIs were deprecated in earlier Python versions and will be removed, -although there is currently no date scheduled for their removal. - -* :mod:`array`'s ``'u'`` format code (:gh:`57281`) - -* :class:`typing.Text` (:gh:`92332`) - -* Currently Python accepts numeric literals immediately followed by keywords, - for example ``0in x``, ``1or x``, ``0if 1else 2``. It allows confusing - and ambiguous expressions like ``[0x1for x in y]`` (which can be - interpreted as ``[0x1 for x in y]`` or ``[0x1f or x in y]``). - A syntax warning is raised if the numeric literal is - immediately followed by one of keywords :keyword:`and`, :keyword:`else`, - :keyword:`for`, :keyword:`if`, :keyword:`in`, :keyword:`is` and :keyword:`or`. - In a future release it will be changed to a syntax error. (:gh:`87999`) +.. include:: ../deprecations/pending-removal-in-future.rst +.. _whatsnew312-removed: Removed ======= @@ -1513,6 +1379,8 @@ configparser * :class:`configparser.ConfigParser` no longer has a ``readfp`` method. Use :meth:`~configparser.ConfigParser.read_file` instead. +.. _whatsnew312-removed-distutils: + distutils --------- @@ -1570,9 +1438,9 @@ hashlib ------- * Remove the pure Python implementation of :mod:`hashlib`'s - :func:`hashlib.pbkdf2_hmac()`, deprecated in Python 3.10. Python 3.10 and + :func:`hashlib.pbkdf2_hmac`, deprecated in Python 3.10. Python 3.10 and newer requires OpenSSL 1.1.1 (:pep:`644`): this OpenSSL version provides - a C implementation of :func:`~hashlib.pbkdf2_hmac()` which is faster. + a C implementation of :func:`~hashlib.pbkdf2_hmac` which is faster. (Contributed by Victor Stinner in :gh:`94199`.) importlib @@ -1581,7 +1449,7 @@ importlib * Many previously deprecated cleanups in :mod:`importlib` have now been completed: - * References to, and support for :meth:`!module_repr()` has been removed. + * References to, and support for :meth:`!module_repr` has been removed. (Contributed by Barry Warsaw in :gh:`97850`.) * ``importlib.util.set_package``, ``importlib.util.set_loader`` and @@ -1594,6 +1462,8 @@ importlib * ``importlib.abc.Finder``, ``pkgutil.ImpImporter``, and ``pkgutil.ImpLoader`` have been removed. (Contributed by Barry Warsaw in :gh:`98040`.) +.. _whatsnew312-removed-imp: + imp --- @@ -2035,7 +1905,7 @@ New Features The :c:macro:`Py_TPFLAGS_MANAGED_DICT` and :c:macro:`Py_TPFLAGS_MANAGED_WEAKREF` flags have been added. This allows extensions classes to support object - ``__dict__`` and weakrefs with less bookkeeping, + :attr:`~object.__dict__` and weakrefs with less bookkeeping, using less memory and with faster access. * API for performing calls using @@ -2154,7 +2024,7 @@ Porting to Python 3.12 internal-only field directly. To get a list of subclasses, call the Python method - :py:meth:`~class.__subclasses__` (using :c:func:`PyObject_CallMethod`, + :py:meth:`~type.__subclasses__` (using :c:func:`PyObject_CallMethod`, for example). * Add support of more formatting options (left aligning, octals, uppercase @@ -2173,7 +2043,7 @@ Porting to Python 3.12 :c:func:`PyUnicode_FromFormatV`. (Contributed by Philip Georgi in :gh:`95504`.) -* Extension classes wanting to add a ``__dict__`` or weak reference slot +* Extension classes wanting to add a :attr:`~object.__dict__` or weak reference slot should use :c:macro:`Py_TPFLAGS_MANAGED_DICT` and :c:macro:`Py_TPFLAGS_MANAGED_WEAKREF` instead of ``tp_dictoffset`` and ``tp_weaklistoffset``, respectively. @@ -2358,92 +2228,13 @@ Deprecated overrides :c:member:`~PyTypeObject.tp_new` is deprecated. Call the metaclass instead. -Pending Removal in Python 3.14 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. Add deprecations above alphabetically, not here at the end. -* The ``ma_version_tag`` field in :c:type:`PyDictObject` for extension modules - (:pep:`699`; :gh:`101193`). +.. include:: ../deprecations/c-api-pending-removal-in-3.14.rst -* Global configuration variables: +.. include:: ../deprecations/c-api-pending-removal-in-3.15.rst - * :c:var:`Py_DebugFlag`: use :c:member:`PyConfig.parser_debug` - * :c:var:`Py_VerboseFlag`: use :c:member:`PyConfig.verbose` - * :c:var:`Py_QuietFlag`: use :c:member:`PyConfig.quiet` - * :c:var:`Py_InteractiveFlag`: use :c:member:`PyConfig.interactive` - * :c:var:`Py_InspectFlag`: use :c:member:`PyConfig.inspect` - * :c:var:`Py_OptimizeFlag`: use :c:member:`PyConfig.optimization_level` - * :c:var:`Py_NoSiteFlag`: use :c:member:`PyConfig.site_import` - * :c:var:`Py_BytesWarningFlag`: use :c:member:`PyConfig.bytes_warning` - * :c:var:`Py_FrozenFlag`: use :c:member:`PyConfig.pathconfig_warnings` - * :c:var:`Py_IgnoreEnvironmentFlag`: use :c:member:`PyConfig.use_environment` - * :c:var:`Py_DontWriteBytecodeFlag`: use :c:member:`PyConfig.write_bytecode` - * :c:var:`Py_NoUserSiteDirectory`: use :c:member:`PyConfig.user_site_directory` - * :c:var:`Py_UnbufferedStdioFlag`: use :c:member:`PyConfig.buffered_stdio` - * :c:var:`Py_HashRandomizationFlag`: use :c:member:`PyConfig.use_hash_seed` - and :c:member:`PyConfig.hash_seed` - * :c:var:`Py_IsolatedFlag`: use :c:member:`PyConfig.isolated` - * :c:var:`Py_LegacyWindowsFSEncodingFlag`: use :c:member:`PyPreConfig.legacy_windows_fs_encoding` - * :c:var:`Py_LegacyWindowsStdioFlag`: use :c:member:`PyConfig.legacy_windows_stdio` - * :c:var:`!Py_FileSystemDefaultEncoding`: use :c:member:`PyConfig.filesystem_encoding` - * :c:var:`!Py_HasFileSystemDefaultEncoding`: use :c:member:`PyConfig.filesystem_encoding` - * :c:var:`!Py_FileSystemDefaultEncodeErrors`: use :c:member:`PyConfig.filesystem_errors` - * :c:var:`!Py_UTF8Mode`: use :c:member:`PyPreConfig.utf8_mode` (see :c:func:`Py_PreInitialize`) - - The :c:func:`Py_InitializeFromConfig` API should be used with - :c:type:`PyConfig` instead. - -* Creating :c:data:`immutable types ` with mutable - bases (:gh:`95388`). - -Pending Removal in Python 3.15 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -* :c:func:`PyImport_ImportModuleNoBlock`: use :c:func:`PyImport_ImportModule` -* :c:type:`!Py_UNICODE_WIDE` type: use :c:type:`wchar_t` -* :c:type:`Py_UNICODE` type: use :c:type:`wchar_t` -* Python initialization functions: - - * :c:func:`PySys_ResetWarnOptions`: clear :data:`sys.warnoptions` and - :data:`!warnings.filters` - * :c:func:`Py_GetExecPrefix`: get :data:`sys.exec_prefix` - * :c:func:`Py_GetPath`: get :data:`sys.path` - * :c:func:`Py_GetPrefix`: get :data:`sys.prefix` - * :c:func:`Py_GetProgramFullPath`: get :data:`sys.executable` - * :c:func:`Py_GetProgramName`: get :data:`sys.executable` - * :c:func:`Py_GetPythonHome`: get :c:member:`PyConfig.home` or - the :envvar:`PYTHONHOME` environment variable - -Pending Removal in Future Versions -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The following APIs are deprecated and will be removed, -although there is currently no date scheduled for their removal. - -* :c:macro:`Py_TPFLAGS_HAVE_FINALIZE`: unneeded since Python 3.8 -* :c:func:`PyErr_Fetch`: use :c:func:`PyErr_GetRaisedException` -* :c:func:`PyErr_NormalizeException`: use :c:func:`PyErr_GetRaisedException` -* :c:func:`PyErr_Restore`: use :c:func:`PyErr_SetRaisedException` -* :c:func:`PyModule_GetFilename`: use :c:func:`PyModule_GetFilenameObject` -* :c:func:`PyOS_AfterFork`: use :c:func:`PyOS_AfterFork_Child` -* :c:func:`PySlice_GetIndicesEx`: use :c:func:`PySlice_Unpack` and :c:func:`PySlice_AdjustIndices` -* :c:func:`!PyUnicode_AsDecodedObject`: use :c:func:`PyCodec_Decode` -* :c:func:`!PyUnicode_AsDecodedUnicode`: use :c:func:`PyCodec_Decode` -* :c:func:`!PyUnicode_AsEncodedObject`: use :c:func:`PyCodec_Encode` -* :c:func:`!PyUnicode_AsEncodedUnicode`: use :c:func:`PyCodec_Encode` -* :c:func:`PyUnicode_READY`: unneeded since Python 3.12 -* :c:func:`!PyErr_Display`: use :c:func:`PyErr_DisplayException` -* :c:func:`!_PyErr_ChainExceptions`: use ``_PyErr_ChainExceptions1`` -* :c:member:`!PyBytesObject.ob_shash` member: - call :c:func:`PyObject_Hash` instead -* :c:member:`!PyDictObject.ma_version_tag` member -* Thread Local Storage (TLS) API: - - * :c:func:`PyThread_create_key`: use :c:func:`PyThread_tss_alloc` - * :c:func:`PyThread_delete_key`: use :c:func:`PyThread_tss_free` - * :c:func:`PyThread_set_key_value`: use :c:func:`PyThread_tss_set` - * :c:func:`PyThread_get_key_value`: use :c:func:`PyThread_tss_get` - * :c:func:`PyThread_delete_key_value`: use :c:func:`PyThread_tss_delete` - * :c:func:`PyThread_ReInitTLS`: unneeded since Python 3.7 +.. include:: ../deprecations/c-api-pending-removal-in-future.rst Removed ------- @@ -2476,3 +2267,48 @@ ipaddress * Fixed ``is_global`` and ``is_private`` behavior in ``IPv4Address``, ``IPv6Address``, ``IPv4Network`` and ``IPv6Network``. + + +Notable changes in 3.12.5 +========================= + +email +----- + + +* Headers with embedded newlines are now quoted on output. + + The :mod:`~email.generator` will now refuse to serialize (write) headers + that are improperly folded or delimited, such that they would be parsed as + multiple headers or joined with adjacent data. + If you need to turn this safety feature off, + set :attr:`~email.policy.Policy.verify_generated_headers`. + (Contributed by Bas Bloemsaat and Petr Viktorin in :gh:`121650`.) + + +Notable changes in 3.12.6 +========================= + +email +----- + +* :func:`email.utils.getaddresses` and :func:`email.utils.parseaddr` now return + ``('', '')`` 2-tuples in more situations where invalid email addresses are + encountered, instead of potentially inaccurate values. + An optional *strict* parameter was added to these two functions: + use ``strict=False`` to get the old behavior, accepting malformed inputs. + ``getattr(email.utils, 'supports_strict_parsing', False)`` can be used to + check if the *strict* paramater is available. + (Contributed by Thomas Dwyer and Victor Stinner for :gh:`102988` to improve + the CVE-2023-27043 fix.) + + +Notable changes in 3.12.8 +========================= + +sys +--- + +* The previously undocumented special function :func:`sys.getobjects`, + which only exists in specialized builds of Python, may now return objects + from other interpreters than the one it's called in. diff --git a/Doc/whatsnew/3.2.rst b/Doc/whatsnew/3.2.rst index 1300b759..135ecda4 100644 --- a/Doc/whatsnew/3.2.rst +++ b/Doc/whatsnew/3.2.rst @@ -312,8 +312,8 @@ cluttering source directories, the *pyc* files are now collected in a Aside from the filenames and target directories, the new scheme has a few aspects that are visible to the programmer: -* Imported modules now have a :attr:`__cached__` attribute which stores the name - of the actual file that was imported: +* Imported modules now have a :attr:`~module.__cached__` attribute which stores + the name of the actual file that was imported: >>> import collections >>> collections.__cached__ # doctest: +SKIP @@ -531,7 +531,7 @@ Some smaller changes made to the core Python language are: (Proposed and implemented by Mark Dickinson; :issue:`9337`.) -* :class:`memoryview` objects now have a :meth:`~memoryview.release()` method +* :class:`memoryview` objects now have a :meth:`~memoryview.release` method and they also now support the context management protocol. This allows timely release of any resources that were acquired when requesting a buffer from the original object. @@ -1312,7 +1312,7 @@ An early decision to limit the interoperability of various numeric types has been relaxed. It is still unsupported (and ill-advised) to have implicit mixing in arithmetic expressions such as ``Decimal('1.1') + float('1.1')`` because the latter loses information in the process of constructing the binary -float. However, since existing floating point value can be converted losslessly +float. However, since existing floating-point value can be converted losslessly to either a decimal or rational representation, it makes sense to add them to the constructor and to support mixed-type comparisons. @@ -1325,7 +1325,7 @@ the constructor and to support mixed-type comparisons. and :class:`fractions.Fraction` (:issue:`2531` and :issue:`8188`). Similar changes were made to :class:`fractions.Fraction` so that the -:meth:`~fractions.Fraction.from_float()` and :meth:`~fractions.Fraction.from_decimal` +:meth:`~fractions.Fraction.from_float` and :meth:`~fractions.Fraction.from_decimal` methods are no longer needed (:issue:`8294`): >>> from decimal import Decimal @@ -1622,7 +1622,7 @@ socket The :mod:`socket` module has two new improvements. -* Socket objects now have a :meth:`~socket.socket.detach()` method which puts +* Socket objects now have a :meth:`~socket.socket.detach` method which puts the socket into closed state without actually closing the underlying file descriptor. The latter can then be reused for other purposes. (Added by Antoine Pitrou; :issue:`8524`.) @@ -1650,7 +1650,7 @@ for secure (encrypted, authenticated) internet connections: * The :func:`ssl.wrap_socket() ` constructor function now takes a *ciphers* argument. The *ciphers* string lists the allowed encryption algorithms using the format described in the `OpenSSL documentation - `__. + `__. * When linked against recent versions of OpenSSL, the :mod:`ssl` module now supports the Server Name Indication extension to the TLS protocol, allowing @@ -1859,11 +1859,11 @@ asyncore -------- :class:`!asyncore.dispatcher` now provides a -:meth:`!handle_accepted()` method +:meth:`!handle_accepted` method returning a ``(sock, addr)`` pair which is called when a connection has actually been established with a new remote endpoint. This is supposed to be used as a -replacement for old :meth:`!handle_accept()` and avoids -the user to call :meth:`!accept()` directly. +replacement for old :meth:`!handle_accept` and avoids +the user to call :meth:`!accept` directly. (Contributed by Giampaolo Rodolà; :issue:`6706`.) @@ -2321,7 +2321,7 @@ Multi-threading intervals and reduced overhead due to lock contention and the number of ensuing system calls. The notion of a "check interval" to allow thread switches has been abandoned and replaced by an absolute duration expressed in - seconds. This parameter is tunable through :func:`sys.setswitchinterval()`. + seconds. This parameter is tunable through :func:`sys.setswitchinterval`. It currently defaults to 5 milliseconds. Additional details about the implementation can be read from a `python-dev diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst index 0f810c17..92656090 100644 --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -549,9 +549,11 @@ separation of binary and text data). PEP 3155: Qualified name for classes and functions ================================================== -Functions and class objects have a new ``__qualname__`` attribute representing +Functions and class objects have a new :attr:`~definition.__qualname__` +attribute representing the "path" from the module top-level to their definition. For global functions -and classes, this is the same as ``__name__``. For other functions and classes, +and classes, this is the same as :attr:`~definition.__name__`. +For other functions and classes, it provides better information about where they were actually defined, and how they might be accessible from the global scope. @@ -779,8 +781,8 @@ Other Language Changes Some smaller changes made to the core Python language are: * Added support for Unicode name aliases and named sequences. - Both :func:`unicodedata.lookup()` and ``'\N{...}'`` now resolve name aliases, - and :func:`unicodedata.lookup()` resolves named sequences too. + Both :func:`unicodedata.lookup` and ``'\N{...}'`` now resolve name aliases, + and :func:`unicodedata.lookup` resolves named sequences too. (Contributed by Ezio Melotti in :issue:`12753`.) @@ -1097,12 +1099,12 @@ decimal C-module and libmpdec written by Stefan Krah. The new C version of the decimal module integrates the high speed libmpdec -library for arbitrary precision correctly rounded decimal floating point +library for arbitrary precision correctly rounded decimal floating-point arithmetic. libmpdec conforms to IBM's General Decimal Arithmetic Specification. Performance gains range from 10x for database applications to 100x for numerically intensive applications. These numbers are expected gains -for standard precisions used in decimal floating point arithmetic. Since +for standard precisions used in decimal floating-point arithmetic. Since the precision is user configurable, the exact figures may vary. For example, in integer bignum arithmetic the differences can be significantly higher. diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst index 33635c6d..6213915c 100644 --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -215,13 +215,12 @@ automatic ``PATH`` modifications to have ``pip`` available from the command line by default, otherwise it can still be accessed through the Python launcher for Windows as ``py -m pip``. -As `discussed in the PEP`__, platform packagers may choose not to install +As :pep:`discussed in the PEP <0453#recommendations-for-downstream-distributors>` +platform packagers may choose not to install these commands by default, as long as, when invoked, they provide clear and simple directions on how to install them on that platform (usually using the system package manager). -__ https://peps.python.org/pep-0453/#recommendations-for-downstream-distributors - .. note:: To avoid conflicts between parallel Python 2 and Python 3 installations, @@ -1495,7 +1494,7 @@ The dictionary returned by :meth:`.SSLSocket.getpeercert` contains additional stat ---- -The :mod:`stat` module is now backed by a C implementation in :mod:`_stat`. A C +The :mod:`stat` module is now backed by a C implementation in :mod:`!_stat`. A C implementation is required as most of the values aren't standardized and are platform-dependent. (Contributed by Christian Heimes in :issue:`11016`.) @@ -1963,11 +1962,11 @@ Other Improvements `_ will build python, run the test suite, and generate an HTML coverage report for the C codebase using ``gcov`` and `lcov - `_. + `_. * The ``-R`` option to the :ref:`python regression test suite ` now also checks for memory allocation leaks, using - :func:`sys.getallocatedblocks()`. (Contributed by Antoine Pitrou in + :func:`sys.getallocatedblocks`. (Contributed by Antoine Pitrou in :issue:`13390`.) * ``python -m`` now works with namespace packages. @@ -1980,7 +1979,7 @@ Other Improvements now works correctly (previously it silently returned the first python module in the file). (Contributed by Václav Šmilauer in :issue:`16421`.) -* A new opcode, :opcode:`LOAD_CLASSDEREF`, has been added to fix a bug in the +* A new opcode, :opcode:`!LOAD_CLASSDEREF`, has been added to fix a bug in the loading of free variables in class bodies that could be triggered by certain uses of :ref:`__prepare__ `. (Contributed by Benjamin Peterson in :issue:`17853`.) @@ -2272,7 +2271,8 @@ Changes in the Python API :func:`super` and falling through all the way to the ABCs. For compatibility, catch both :exc:`NotImplementedError` or the appropriate exception as needed. -* The module type now initializes the :attr:`__package__` and :attr:`__loader__` +* The module type now initializes the :attr:`~module.__package__` and + :attr:`~module.__loader__` attributes to ``None`` by default. To determine if these attributes were set in a backwards-compatible fashion, use e.g. ``getattr(module, '__loader__', None) is not None``. (:issue:`17115`.) diff --git a/Doc/whatsnew/3.5.rst b/Doc/whatsnew/3.5.rst index 06bcd354..b18fbb00 100644 --- a/Doc/whatsnew/3.5.rst +++ b/Doc/whatsnew/3.5.rst @@ -423,8 +423,8 @@ are declared in the annotations:: return 'Hello ' + name While these annotations are available at runtime through the usual -:attr:`__annotations__` attribute, *no automatic type checking happens at -runtime*. Instead, it is assumed that a separate off-line type checker +:attr:`~object.__annotations__` attribute, *no automatic type checking happens +at runtime*. Instead, it is assumed that a separate off-line type checker (e.g. `mypy `_) will be used for on-demand source code analysis. @@ -1667,7 +1667,7 @@ Both the :class:`!SMTPServer` and :class:`!SMTPChannel` classes now accept a *decode_data* keyword argument to determine if the ``DATA`` portion of the SMTP transaction is decoded using the ``"utf-8"`` codec or is instead provided to the -:meth:`!SMTPServer.process_message()` +:meth:`!SMTPServer.process_message` method as a byte string. The default is ``True`` for backward compatibility reasons, but will change to ``False`` in Python 3.6. If *decode_data* is set to ``False``, the ``process_message`` method must be prepared to accept keyword @@ -1677,14 +1677,14 @@ arguments. The :class:`!SMTPServer` class now advertises the ``8BITMIME`` extension (:rfc:`6152`) if *decode_data* has been set ``True``. If the client specifies ``BODY=8BITMIME`` on the ``MAIL`` command, it is passed to -:meth:`!SMTPServer.process_message()` +:meth:`!SMTPServer.process_message` via the *mail_options* keyword. (Contributed by Milan Oberkirch and R. David Murray in :issue:`21795`.) The :class:`!SMTPServer` class now also supports the ``SMTPUTF8`` extension (:rfc:`6531`: Internationalized Email). If the client specified ``SMTPUTF8 BODY=8BITMIME`` on the ``MAIL`` command, they are passed to -:meth:`!SMTPServer.process_message()` +:meth:`!SMTPServer.process_message` via the *mail_options* keyword. It is the responsibility of the ``process_message`` method to correctly handle the ``SMTPUTF8`` data. (Contributed by Milan Oberkirch in :issue:`21725`.) @@ -1935,8 +1935,8 @@ specifying the namespace in which the code will be running. tkinter ------- -The :mod:`tkinter._fix` module used for setting up the Tcl/Tk environment -on Windows has been replaced by a private function in the :mod:`_tkinter` +The :mod:`!tkinter._fix` module used for setting up the Tcl/Tk environment +on Windows has been replaced by a private function in the :mod:`!_tkinter` module which makes no permanent changes to environment variables. (Contributed by Zachary Ware in :issue:`20035`.) @@ -2405,7 +2405,7 @@ Changes in the Python API error-prone and has been removed in Python 3.5. See :issue:`13936` for full details. -* The :meth:`ssl.SSLSocket.send()` method now raises either +* The :meth:`ssl.SSLSocket.send` method now raises either :exc:`ssl.SSLWantReadError` or :exc:`ssl.SSLWantWriteError` on a non-blocking socket if the operation would block. Previously, it would return ``0``. (Contributed by Nikolaus Rath in :issue:`20951`.) @@ -2526,9 +2526,9 @@ Changes in the C API to format the :func:`repr` of the object. (Contributed by Serhiy Storchaka in :issue:`22453`.) -* Because the lack of the :attr:`__module__` attribute breaks pickling and +* Because the lack of the :attr:`~type.__module__` attribute breaks pickling and introspection, a deprecation warning is now raised for builtin types without - the :attr:`__module__` attribute. This would be an AttributeError in + the :attr:`~type.__module__` attribute. This will be an :exc:`AttributeError` in the future. (Contributed by Serhiy Storchaka in :issue:`20204`.) diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst index e91e6dc1..aa72cf4f 100644 --- a/Doc/whatsnew/3.6.rst +++ b/Doc/whatsnew/3.6.rst @@ -261,7 +261,7 @@ allowed. The :ref:`string formatting ` language also now has support for the ``'_'`` option to signal the use of an underscore for a thousands -separator for floating point presentation types and for integer +separator for floating-point presentation types and for integer presentation type ``'d'``. For integer presentation types ``'b'``, ``'o'``, ``'x'``, and ``'X'``, underscores will be inserted every 4 digits:: @@ -511,10 +511,10 @@ correct. Prior to Python 3.6, data loss could result when using bytes paths on Windows. With this change, using bytes to represent paths is now supported on Windows, provided those bytes are encoded with the encoding returned by -:func:`sys.getfilesystemencoding()`, which now defaults to ``'utf-8'``. +:func:`sys.getfilesystemencoding`, which now defaults to ``'utf-8'``. Applications that do not use str to represent paths should use -:func:`os.fsencode()` and :func:`os.fsdecode()` to ensure their bytes are +:func:`os.fsencode` and :func:`os.fsdecode` to ensure their bytes are correctly encoded. To revert to the previous behaviour, set :envvar:`PYTHONLEGACYWINDOWSFSENCODING` or call :func:`sys._enablelegacywindowsfsencoding`. @@ -549,7 +549,7 @@ PEP 520: Preserving Class Attribute Definition Order Attributes in a class definition body have a natural ordering: the same order in which the names appear in the source. This order is now -preserved in the new class's :attr:`~object.__dict__` attribute. +preserved in the new class's :attr:`~type.__dict__` attribute. Also, the effective default class *execution* namespace (returned from :ref:`type.__prepare__() `) is now an insertion-order-preserving @@ -780,7 +780,7 @@ for managing secrets, such as account authentication, tokens, and similar. Note that the pseudo-random generators in the :mod:`random` module should *NOT* be used for security purposes. Use :mod:`secrets` - on Python 3.6+ and :func:`os.urandom()` on Python 3.5 and earlier. + on Python 3.6+ and :func:`os.urandom` on Python 3.5 and earlier. .. seealso:: @@ -934,7 +934,7 @@ asynchronous generators. The :func:`~collections.namedtuple` function now accepts an optional keyword argument *module*, which, when specified, is used for -the ``__module__`` attribute of the returned named tuple class. +the :attr:`~type.__module__` attribute of the returned named tuple class. (Contributed by Raymond Hettinger in :issue:`17941`.) The *verbose* and *rename* arguments for @@ -1316,7 +1316,7 @@ Storchaka in :issue:`24164`.) pickletools ----------- -:func:`pickletools.dis()` now outputs the implicit memo index for the +:func:`pickletools.dis` now outputs the implicit memo index for the ``MEMOIZE`` opcode. (Contributed by Serhiy Storchaka in :issue:`25382`.) @@ -2377,16 +2377,16 @@ There have been several major changes to the :term:`bytecode` in Python 3.6. * The function call opcodes have been heavily reworked for better performance and simpler implementation. - The :opcode:`MAKE_FUNCTION`, :opcode:`CALL_FUNCTION`, - :opcode:`CALL_FUNCTION_KW` and :opcode:`BUILD_MAP_UNPACK_WITH_CALL` opcodes + The :opcode:`MAKE_FUNCTION`, :opcode:`!CALL_FUNCTION`, + :opcode:`!CALL_FUNCTION_KW` and :opcode:`!BUILD_MAP_UNPACK_WITH_CALL` opcodes have been modified, the new :opcode:`CALL_FUNCTION_EX` and - :opcode:`BUILD_TUPLE_UNPACK_WITH_CALL` have been added, and + :opcode:`!BUILD_TUPLE_UNPACK_WITH_CALL` have been added, and ``CALL_FUNCTION_VAR``, ``CALL_FUNCTION_VAR_KW`` and ``MAKE_CLOSURE`` opcodes have been removed. (Contributed by Demur Rumed in :issue:`27095`, and Serhiy Storchaka in :issue:`27213`, :issue:`28257`.) -* The new :opcode:`SETUP_ANNOTATIONS` and :opcode:`STORE_ANNOTATION` opcodes +* The new :opcode:`SETUP_ANNOTATIONS` and :opcode:`!STORE_ANNOTATION` opcodes have been added to support the new :term:`variable annotation` syntax. (Contributed by Ivan Levkivskyi in :issue:`27985`.) diff --git a/Doc/whatsnew/3.7.rst b/Doc/whatsnew/3.7.rst index 71831fc6..7e4b189d 100644 --- a/Doc/whatsnew/3.7.rst +++ b/Doc/whatsnew/3.7.rst @@ -339,7 +339,7 @@ PEP 564: New Time Functions With Nanosecond Resolution ------------------------------------------------------ The resolution of clocks in modern systems can exceed the limited precision -of a floating point number returned by the :func:`time.time` function +of a floating-point number returned by the :func:`time.time` function and its variants. To avoid loss of precision, :pep:`564` adds six new "nanosecond" variants of the existing timer functions to the :mod:`time` module: @@ -353,7 +353,7 @@ module: The new functions return the number of nanoseconds as an integer value. -`Measurements `_ +:pep:`Measurements <0564#annex-clocks-resolution-in-python>` show that on Linux and Windows the resolution of :func:`time.time_ns` is approximately 3 times better than that of :func:`time.time`. @@ -603,7 +603,7 @@ The new :mod:`importlib.resources` module provides several new APIs and one new ABC for access to, opening, and reading *resources* inside packages. Resources are roughly similar to files inside packages, but they needn't be actual files on the physical file system. Module loaders can provide a -:meth:`get_resource_reader()` function which returns +:meth:`get_resource_reader` function which returns a :class:`importlib.abc.ResourceReader` instance to support this new API. Built-in file path loaders and zip file loaders both support this. @@ -2017,11 +2017,11 @@ importlib --------- Methods -:meth:`!MetaPathFinder.find_module()` +:meth:`!MetaPathFinder.find_module` (replaced by :meth:`MetaPathFinder.find_spec() `) and -:meth:`!PathEntryFinder.find_loader()` +:meth:`!PathEntryFinder.find_loader` (replaced by :meth:`PathEntryFinder.find_spec() `) both deprecated in Python 3.4 now emit :exc:`DeprecationWarning`. @@ -2048,7 +2048,7 @@ The :mod:`macpath` is now deprecated and will be removed in Python 3.8. threading --------- -:mod:`dummy_threading` and :mod:`_dummy_thread` have been deprecated. It is +:mod:`!dummy_threading` and :mod:`!_dummy_thread` have been deprecated. It is no longer possible to build Python with threading disabled. Use :mod:`threading` instead. (Contributed by Antoine Pitrou in :issue:`31370`.) @@ -2184,7 +2184,7 @@ The following features and APIs have been removed from Python 3.7: ``socket.socketpair`` on Python 3.5 and newer. * :mod:`asyncio` no longer exports the :mod:`selectors` and - :mod:`_overlapped` modules as ``asyncio.selectors`` and + :mod:`!_overlapped` modules as ``asyncio.selectors`` and ``asyncio._overlapped``. Replace ``from asyncio import selectors`` with ``import selectors``. @@ -2366,7 +2366,7 @@ Changes in the Python API positions 2--3. To match only blank lines, the pattern should be rewritten as ``r'(?m)^[^\S\n]*$'``. - :func:`re.sub()` now replaces empty matches adjacent to a previous + :func:`re.sub` now replaces empty matches adjacent to a previous non-empty match. For example ``re.sub('x*', '-', 'abxd')`` returns now ``'-a-b--d-'`` instead of ``'-a-b-d-'`` (the first minus between 'b' and 'd' replaces 'x', and the second minus replaces an empty string between @@ -2425,7 +2425,7 @@ Changes in the Python API to :meth:`ArgumentParser.add_subparsers() `. (Contributed by Anthony Sottile in :issue:`26510`.) -* :meth:`ast.literal_eval()` is now stricter. Addition and subtraction of +* :meth:`ast.literal_eval` is now stricter. Addition and subtraction of arbitrary numbers are no longer allowed. (Contributed by Serhiy Storchaka in :issue:`31778`.) @@ -2476,10 +2476,10 @@ avoiding possible problems use new functions :c:func:`PySlice_Unpack` and CPython bytecode changes ------------------------ -There are two new opcodes: :opcode:`LOAD_METHOD` and :opcode:`CALL_METHOD`. +There are two new opcodes: :opcode:`LOAD_METHOD` and :opcode:`!CALL_METHOD`. (Contributed by Yury Selivanov and INADA Naoki in :issue:`26110`.) -The :opcode:`STORE_ANNOTATION` opcode has been removed. +The :opcode:`!STORE_ANNOTATION` opcode has been removed. (Contributed by Mark Shannon in :issue:`32550`.) diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index ae049a31..c1f3717b 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -936,7 +936,7 @@ Add option ``--json-lines`` to parse every input line as a separate JSON object. logging ------- -Added a *force* keyword argument to :func:`logging.basicConfig()` +Added a *force* keyword argument to :func:`logging.basicConfig`. When set to true, any existing handlers attached to the root logger are removed and closed before carrying out the configuration specified by the other arguments. @@ -1077,16 +1077,16 @@ pathlib ------- :mod:`pathlib.Path` methods that return a boolean result like -:meth:`~pathlib.Path.exists()`, :meth:`~pathlib.Path.is_dir()`, -:meth:`~pathlib.Path.is_file()`, :meth:`~pathlib.Path.is_mount()`, -:meth:`~pathlib.Path.is_symlink()`, :meth:`~pathlib.Path.is_block_device()`, -:meth:`~pathlib.Path.is_char_device()`, :meth:`~pathlib.Path.is_fifo()`, -:meth:`~pathlib.Path.is_socket()` now return ``False`` instead of raising +:meth:`~pathlib.Path.exists`, :meth:`~pathlib.Path.is_dir`, +:meth:`~pathlib.Path.is_file`, :meth:`~pathlib.Path.is_mount`, +:meth:`~pathlib.Path.is_symlink`, :meth:`~pathlib.Path.is_block_device`, +:meth:`~pathlib.Path.is_char_device`, :meth:`~pathlib.Path.is_fifo`, +:meth:`~pathlib.Path.is_socket` now return ``False`` instead of raising :exc:`ValueError` or its subclass :exc:`UnicodeEncodeError` for paths that contain characters unrepresentable at the OS level. (Contributed by Serhiy Storchaka in :issue:`33721`.) -Added :meth:`!pathlib.Path.link_to()` which creates a hard link pointing +Added :meth:`!pathlib.Path.link_to` which creates a hard link pointing to a path. (Contributed by Joannah Nanjekye in :issue:`26978`) Note that ``link_to`` was deprecated in 3.10 and removed in 3.12 in @@ -1170,13 +1170,13 @@ recursively removing their contents first. socket ------ -Added :meth:`~socket.create_server()` and :meth:`~socket.has_dualstack_ipv6()` +Added :meth:`~socket.create_server` and :meth:`~socket.has_dualstack_ipv6` convenience functions to automate the necessary tasks usually involved when creating a server socket, including accepting both IPv4 and IPv6 connections on the same socket. (Contributed by Giampaolo Rodolà in :issue:`17561`.) -The :func:`socket.if_nameindex()`, :func:`socket.if_nametoindex()`, and -:func:`socket.if_indextoname()` functions have been implemented on Windows. +The :func:`socket.if_nameindex`, :func:`socket.if_nametoindex`, and +:func:`socket.if_indextoname` functions have been implemented on Windows. (Contributed by Zackery Spytz in :issue:`37007`.) @@ -1192,11 +1192,11 @@ post-handshake authentication. statistics ---------- -Added :func:`statistics.fmean` as a faster, floating point variant of -:func:`statistics.mean()`. (Contributed by Raymond Hettinger and +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.geometric_mean()` +Added :func:`statistics.geometric_mean` (Contributed by Raymond Hettinger in :issue:`27181`.) Added :func:`statistics.multimode` that returns a list of the most @@ -1367,10 +1367,10 @@ Added :class:`~unittest.mock.AsyncMock` to support an asynchronous version of have been added as well. (Contributed by Lisa Roach in :issue:`26467`). -Added :func:`~unittest.addModuleCleanup()` and -:meth:`~unittest.TestCase.addClassCleanup()` to unittest to support -cleanups for :func:`~unittest.setUpModule()` and -:meth:`~unittest.TestCase.setUpClass()`. +Added :func:`~unittest.addModuleCleanup` and +:meth:`~unittest.TestCase.addClassCleanup` to unittest to support +cleanups for :func:`~unittest.setUpModule` and +:meth:`~unittest.TestCase.setUpClass`. (Contributed by Lisa Roach in :issue:`24412`.) Several mock assert functions now also print a list of actual calls upon @@ -1432,7 +1432,7 @@ and ``{namespace}*`` which returns all tags in the given namespace. (Contributed by Stefan Behnel in :issue:`28238`.) The :mod:`xml.etree.ElementTree` module provides a new function -:func:`–xml.etree.ElementTree.canonicalize()` that implements C14N 2.0. +:func:`–xml.etree.ElementTree.canonicalize` that implements C14N 2.0. (Contributed by Stefan Behnel in :issue:`13611`.) The target object of :class:`xml.etree.ElementTree.XMLParser` can @@ -1712,7 +1712,7 @@ Deprecated the ``l*gettext()`` functions. (Contributed by Serhiy Storchaka in :issue:`33710`.) -* The :meth:`~threading.Thread.isAlive()` method of :class:`threading.Thread` +* The :meth:`~threading.Thread.isAlive` method of :class:`threading.Thread` has been deprecated. (Contributed by Donghee Na in :issue:`35283`.) @@ -1755,7 +1755,7 @@ The following features and APIs have been removed from Python 3.8: * Starting with Python 3.3, importing ABCs from :mod:`collections` was deprecated, and importing should be done from :mod:`collections.abc`. Being able to import from collections was marked for removal in 3.8, but has been - delayed to 3.9. (See :issue:`36952`.) + delayed to 3.9. (See :gh:`81134`.) * The :mod:`macpath` module, deprecated in Python 3.7, has been removed. (Contributed by Victor Stinner in :issue:`35471`.) @@ -2152,11 +2152,11 @@ CPython bytecode changes cleaning-up code for :keyword:`break`, :keyword:`continue` and :keyword:`return`. - Removed opcodes :opcode:`BREAK_LOOP`, :opcode:`CONTINUE_LOOP`, - :opcode:`SETUP_LOOP` and :opcode:`SETUP_EXCEPT`. Added new opcodes - :opcode:`ROT_FOUR`, :opcode:`BEGIN_FINALLY`, :opcode:`CALL_FINALLY` and - :opcode:`POP_FINALLY`. Changed the behavior of :opcode:`END_FINALLY` - and :opcode:`WITH_CLEANUP_START`. + Removed opcodes :opcode:`!BREAK_LOOP`, :opcode:`!CONTINUE_LOOP`, + :opcode:`!SETUP_LOOP` and :opcode:`!SETUP_EXCEPT`. Added new opcodes + :opcode:`!ROT_FOUR`, :opcode:`!BEGIN_FINALLY`, :opcode:`!CALL_FINALLY` and + :opcode:`!POP_FINALLY`. Changed the behavior of :opcode:`!END_FINALLY` + and :opcode:`!WITH_CLEANUP_START`. (Contributed by Mark Shannon, Antoine Pitrou and Serhiy Storchaka in :issue:`17611`.) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index f32224ae..48965c27 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -408,8 +408,8 @@ Added :func:`curses.get_escdelay`, :func:`curses.set_escdelay`, datetime -------- -The :meth:`~datetime.date.isocalendar()` of :class:`datetime.date` -and :meth:`~datetime.datetime.isocalendar()` of :class:`datetime.datetime` +The :meth:`~datetime.date.isocalendar` of :class:`datetime.date` +and :meth:`~datetime.datetime.isocalendar` of :class:`datetime.datetime` methods now returns a :func:`~collections.namedtuple` instead of a :class:`tuple`. (Contributed by Donghee Na in :issue:`24416`.) @@ -610,7 +610,7 @@ convert a wait status to an exit code. pathlib ------- -Added :meth:`pathlib.Path.readlink()` which acts similarly to +Added :meth:`pathlib.Path.readlink` which acts similarly to :func:`os.readlink`. (Contributed by Girts Folkmanis in :issue:`30618`) @@ -637,7 +637,8 @@ pydoc ----- The documentation string is now shown not only for class, function, -method etc, but for any object that has its own ``__doc__`` attribute. +method etc, but for any object that has its own :attr:`~definition.__doc__` +attribute. (Contributed by Serhiy Storchaka in :issue:`40257`.) random @@ -983,13 +984,13 @@ Removed (Contributed by Victor Stinner in :issue:`37312`.) * ``aifc.openfp()`` alias to ``aifc.open()``, ``sunau.openfp()`` alias to - ``sunau.open()``, and ``wave.openfp()`` alias to :func:`wave.open()` have been + ``sunau.open()``, and ``wave.openfp()`` alias to :func:`wave.open` have been removed. They were deprecated since Python 3.7. (Contributed by Victor Stinner in :issue:`37320`.) -* The :meth:`!isAlive()` method of :class:`threading.Thread` +* The :meth:`!isAlive` method of :class:`threading.Thread` has been removed. It was deprecated since Python 3.8. - Use :meth:`~threading.Thread.is_alive()` instead. + Use :meth:`~threading.Thread.is_alive` instead. (Contributed by Donghee Na in :issue:`37804`.) * Methods ``getchildren()`` and ``getiterator()`` of classes diff --git a/Include/floatobject.h b/Include/floatobject.h index 999441ac..8963c168 100644 --- a/Include/floatobject.h +++ b/Include/floatobject.h @@ -2,7 +2,7 @@ /* Float object interface */ /* -PyFloatObject represents a (double precision) floating point number. +PyFloatObject represents a (double precision) floating-point number. */ #ifndef Py_FLOATOBJECT_H diff --git a/Include/internal/pycore_dtoa.h b/Include/internal/pycore_dtoa.h index 4d9681d5..899d413b 100644 --- a/Include/internal/pycore_dtoa.h +++ b/Include/internal/pycore_dtoa.h @@ -11,8 +11,6 @@ extern "C" { #include "pycore_pymath.h" // _PY_SHORT_FLOAT_REPR -#if _PY_SHORT_FLOAT_REPR == 1 - typedef uint32_t ULong; struct @@ -22,15 +20,15 @@ Bigint { ULong x[1]; }; -#ifdef Py_USING_MEMORY_DEBUGGER +#if defined(Py_USING_MEMORY_DEBUGGER) || _PY_SHORT_FLOAT_REPR == 0 struct _dtoa_state { int _not_used; }; -#define _dtoa_interp_state_INIT(INTERP) \ +#define _dtoa_state_INIT(INTERP) \ {0} -#else // !Py_USING_MEMORY_DEBUGGER +#else // !Py_USING_MEMORY_DEBUGGER && _PY_SHORT_FLOAT_REPR != 0 /* The size of the Bigint freelist */ #define Bigint_Kmax 7 @@ -65,8 +63,6 @@ PyAPI_FUNC(char *) _Py_dg_dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve); PyAPI_FUNC(void) _Py_dg_freedtoa(char *s); -#endif // _PY_SHORT_FLOAT_REPR == 1 - #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_frame.h b/Include/internal/pycore_frame.h index ad7d74c5..4d355b2b 100644 --- a/Include/internal/pycore_frame.h +++ b/Include/internal/pycore_frame.h @@ -200,7 +200,7 @@ _PyFrame_MakeAndSetFrameObject(_PyInterpreterFrame *frame); /* Gets the PyFrameObject for this frame, lazily * creating it if necessary. - * Returns a borrowed referennce */ + * Returns a borrowed reference */ static inline PyFrameObject * _PyFrame_GetFrameObject(_PyInterpreterFrame *frame) { @@ -213,9 +213,6 @@ _PyFrame_GetFrameObject(_PyInterpreterFrame *frame) return _PyFrame_MakeAndSetFrameObject(frame); } -void -_PyFrame_ClearLocals(_PyInterpreterFrame *frame); - /* Clears all references in the frame. * If take is non-zero, then the _PyInterpreterFrame frame * may be transferred to the frame object it references diff --git a/Include/internal/pycore_global_objects_fini_generated.h b/Include/internal/pycore_global_objects_fini_generated.h index 909fe90b..75765254 100644 --- a/Include/internal/pycore_global_objects_fini_generated.h +++ b/Include/internal/pycore_global_objects_fini_generated.h @@ -550,21 +550,16 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(anon_setcomp)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(anon_string)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(anon_unknown)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(close_br)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(dbl_close_br)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(dbl_open_br)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(dbl_percent)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(defaults)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(dot)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(dot_locals)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(empty)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(generic_base)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(json_decoder)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(kwdefaults)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(list_err)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(newline)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(open_br)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(percent)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(shim_name)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(type_params)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_STR(utf_8)); @@ -577,7 +572,6 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(TextIOWrapper)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(True)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(WarningMessage)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_WindowsConsoleIO)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__IOBase_closed)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(__abc_tpflags__)); @@ -766,6 +760,7 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_lock_unlock_module)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_loop)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_needs_com_addref_)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_only_immortal)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_pack_)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_restype_)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_showwarnmsg)); @@ -777,7 +772,6 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_uninitialized_submodules)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_warn_unawaited_coroutine)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_xoptions)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(a)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(abs_tol)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(access)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(add)); @@ -797,7 +791,6 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(attribute)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(authorizer_callback)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(autocommit)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(b)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(backtick)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(base)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(before)); @@ -815,7 +808,6 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(byteorder)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(bytes)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(bytes_per_sep)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(c)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(c_call)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(c_exception)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(c_return)); @@ -868,7 +860,6 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(count)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(covariant)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(cwd)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(d)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(data)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(database)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(decode)); @@ -896,7 +887,6 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(dst)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(dst_dir_fd)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(duration)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(e)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(eager_start)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(effective_ids)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(element_factory)); @@ -1057,7 +1047,6 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(mro)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(msg)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(mycmp)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(n)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(n_arg)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(n_fields)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(n_sequence_fields)); @@ -1102,7 +1091,6 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(outgoing)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(overlapped)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(owner)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(p)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(pages)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(parent)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(password)); @@ -1130,7 +1118,6 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(ps2)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(query)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(quotetabs)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(r)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(raw)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(read)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(read1)); @@ -1154,7 +1141,6 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(return)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(reverse)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(reversed)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(s)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(salt)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(sched_priority)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(scheduler)); @@ -1257,7 +1243,6 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(writable)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(write)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(write_through)); - _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(x)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(year)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(zdict)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_SINGLETON(strings).ascii[0]); diff --git a/Include/internal/pycore_global_strings.h b/Include/internal/pycore_global_strings.h index 26c1be3b..4f5bfd98 100644 --- a/Include/internal/pycore_global_strings.h +++ b/Include/internal/pycore_global_strings.h @@ -36,21 +36,16 @@ struct _Py_global_strings { STRUCT_FOR_STR(anon_setcomp, "") STRUCT_FOR_STR(anon_string, "") STRUCT_FOR_STR(anon_unknown, "") - STRUCT_FOR_STR(close_br, "}") STRUCT_FOR_STR(dbl_close_br, "}}") STRUCT_FOR_STR(dbl_open_br, "{{") STRUCT_FOR_STR(dbl_percent, "%%") STRUCT_FOR_STR(defaults, ".defaults") - STRUCT_FOR_STR(dot, ".") STRUCT_FOR_STR(dot_locals, ".") STRUCT_FOR_STR(empty, "") STRUCT_FOR_STR(generic_base, ".generic_base") STRUCT_FOR_STR(json_decoder, "json.decoder") STRUCT_FOR_STR(kwdefaults, ".kwdefaults") STRUCT_FOR_STR(list_err, "list index out of range") - STRUCT_FOR_STR(newline, "\n") - STRUCT_FOR_STR(open_br, "{") - STRUCT_FOR_STR(percent, "%") STRUCT_FOR_STR(shim_name, "") STRUCT_FOR_STR(type_params, ".type_params") STRUCT_FOR_STR(utf_8, "utf-8") @@ -66,7 +61,6 @@ struct _Py_global_strings { STRUCT_FOR_ID(TextIOWrapper) STRUCT_FOR_ID(True) STRUCT_FOR_ID(WarningMessage) - STRUCT_FOR_ID(_) STRUCT_FOR_ID(_WindowsConsoleIO) STRUCT_FOR_ID(__IOBase_closed) STRUCT_FOR_ID(__abc_tpflags__) @@ -255,6 +249,7 @@ struct _Py_global_strings { STRUCT_FOR_ID(_lock_unlock_module) STRUCT_FOR_ID(_loop) STRUCT_FOR_ID(_needs_com_addref_) + STRUCT_FOR_ID(_only_immortal) STRUCT_FOR_ID(_pack_) STRUCT_FOR_ID(_restype_) STRUCT_FOR_ID(_showwarnmsg) @@ -266,7 +261,6 @@ struct _Py_global_strings { STRUCT_FOR_ID(_uninitialized_submodules) STRUCT_FOR_ID(_warn_unawaited_coroutine) STRUCT_FOR_ID(_xoptions) - STRUCT_FOR_ID(a) STRUCT_FOR_ID(abs_tol) STRUCT_FOR_ID(access) STRUCT_FOR_ID(add) @@ -286,7 +280,6 @@ struct _Py_global_strings { STRUCT_FOR_ID(attribute) STRUCT_FOR_ID(authorizer_callback) STRUCT_FOR_ID(autocommit) - STRUCT_FOR_ID(b) STRUCT_FOR_ID(backtick) STRUCT_FOR_ID(base) STRUCT_FOR_ID(before) @@ -304,7 +297,6 @@ struct _Py_global_strings { STRUCT_FOR_ID(byteorder) STRUCT_FOR_ID(bytes) STRUCT_FOR_ID(bytes_per_sep) - STRUCT_FOR_ID(c) STRUCT_FOR_ID(c_call) STRUCT_FOR_ID(c_exception) STRUCT_FOR_ID(c_return) @@ -357,7 +349,6 @@ struct _Py_global_strings { STRUCT_FOR_ID(count) STRUCT_FOR_ID(covariant) STRUCT_FOR_ID(cwd) - STRUCT_FOR_ID(d) STRUCT_FOR_ID(data) STRUCT_FOR_ID(database) STRUCT_FOR_ID(decode) @@ -385,7 +376,6 @@ struct _Py_global_strings { STRUCT_FOR_ID(dst) STRUCT_FOR_ID(dst_dir_fd) STRUCT_FOR_ID(duration) - STRUCT_FOR_ID(e) STRUCT_FOR_ID(eager_start) STRUCT_FOR_ID(effective_ids) STRUCT_FOR_ID(element_factory) @@ -546,7 +536,6 @@ struct _Py_global_strings { STRUCT_FOR_ID(mro) STRUCT_FOR_ID(msg) STRUCT_FOR_ID(mycmp) - STRUCT_FOR_ID(n) STRUCT_FOR_ID(n_arg) STRUCT_FOR_ID(n_fields) STRUCT_FOR_ID(n_sequence_fields) @@ -591,7 +580,6 @@ struct _Py_global_strings { STRUCT_FOR_ID(outgoing) STRUCT_FOR_ID(overlapped) STRUCT_FOR_ID(owner) - STRUCT_FOR_ID(p) STRUCT_FOR_ID(pages) STRUCT_FOR_ID(parent) STRUCT_FOR_ID(password) @@ -619,7 +607,6 @@ struct _Py_global_strings { STRUCT_FOR_ID(ps2) STRUCT_FOR_ID(query) STRUCT_FOR_ID(quotetabs) - STRUCT_FOR_ID(r) STRUCT_FOR_ID(raw) STRUCT_FOR_ID(read) STRUCT_FOR_ID(read1) @@ -643,7 +630,6 @@ struct _Py_global_strings { STRUCT_FOR_ID(return) STRUCT_FOR_ID(reverse) STRUCT_FOR_ID(reversed) - STRUCT_FOR_ID(s) STRUCT_FOR_ID(salt) STRUCT_FOR_ID(sched_priority) STRUCT_FOR_ID(scheduler) @@ -746,7 +732,6 @@ struct _Py_global_strings { STRUCT_FOR_ID(writable) STRUCT_FOR_ID(write) STRUCT_FOR_ID(write_through) - STRUCT_FOR_ID(x) STRUCT_FOR_ID(year) STRUCT_FOR_ID(zdict) } identifiers; @@ -769,6 +754,10 @@ struct _Py_global_strings { (_Py_SINGLETON(strings.identifiers._py_ ## NAME._ascii.ob_base)) #define _Py_STR(NAME) \ (_Py_SINGLETON(strings.literals._py_ ## NAME._ascii.ob_base)) +#define _Py_LATIN1_CHR(CH) \ + ((CH) < 128 \ + ? (PyObject*)&_Py_SINGLETON(strings).ascii[(CH)] \ + : (PyObject*)&_Py_SINGLETON(strings).latin1[(CH) - 128]) /* _Py_DECLARE_STR() should precede all uses of _Py_STR() in a function. diff --git a/Include/internal/pycore_object.h b/Include/internal/pycore_object.h index 63e74a65..546f98d9 100644 --- a/Include/internal/pycore_object.h +++ b/Include/internal/pycore_object.h @@ -70,6 +70,13 @@ static inline void _Py_RefcntAdd(PyObject* op, Py_ssize_t n) static inline void _Py_SetImmortal(PyObject *op) { +#ifdef Py_DEBUG + // For strings, use _PyUnicode_InternImmortal instead. + if (PyUnicode_CheckExact(op)) { + assert(PyUnicode_CHECK_INTERNED(op) == SSTATE_INTERNED_IMMORTAL + || PyUnicode_CHECK_INTERNED(op) == SSTATE_INTERNED_IMMORTAL_STATIC); + } +#endif if (op) { op->ob_refcnt = _Py_IMMORTAL_REFCNT; } diff --git a/Include/internal/pycore_object_state.h b/Include/internal/pycore_object_state.h index 65feb5af..6e07b1a0 100644 --- a/Include/internal/pycore_object_state.h +++ b/Include/internal/pycore_object_state.h @@ -24,7 +24,13 @@ struct _py_object_state { * together via the _ob_prev and _ob_next members of a PyObject, which * exist only in a Py_TRACE_REFS build. */ - PyObject refchain; + PyObject *refchain; + /* In most cases, refchain points to _refchain_obj. + * In sub-interpreters that share objmalloc state with the main interp, + * refchain points to the main interpreter's _refchain_obj, and their own + * _refchain_obj is unused. + */ + PyObject _refchain_obj; #endif int _not_used; }; diff --git a/Include/internal/pycore_runtime_init.h b/Include/internal/pycore_runtime_init.h index e5f9e17e..ad90ea68 100644 --- a/Include/internal/pycore_runtime_init.h +++ b/Include/internal/pycore_runtime_init.h @@ -132,15 +132,8 @@ extern PyTypeObject _PyExc_MemoryError; .context_ver = 1, \ } -#ifdef Py_TRACE_REFS -# define _py_object_state_INIT(INTERP) \ - { \ - .refchain = {&INTERP.object_state.refchain, &INTERP.object_state.refchain}, \ - } -#else # define _py_object_state_INIT(INTERP) \ { 0 } -#endif // global objects diff --git a/Include/internal/pycore_runtime_init_generated.h b/Include/internal/pycore_runtime_init_generated.h index dbfb633c..460a6c79 100644 --- a/Include/internal/pycore_runtime_init_generated.h +++ b/Include/internal/pycore_runtime_init_generated.h @@ -542,21 +542,16 @@ extern "C" { INIT_STR(anon_setcomp, ""), \ INIT_STR(anon_string, ""), \ INIT_STR(anon_unknown, ""), \ - INIT_STR(close_br, "}"), \ INIT_STR(dbl_close_br, "}}"), \ INIT_STR(dbl_open_br, "{{"), \ INIT_STR(dbl_percent, "%%"), \ INIT_STR(defaults, ".defaults"), \ - INIT_STR(dot, "."), \ INIT_STR(dot_locals, "."), \ INIT_STR(empty, ""), \ INIT_STR(generic_base, ".generic_base"), \ INIT_STR(json_decoder, "json.decoder"), \ INIT_STR(kwdefaults, ".kwdefaults"), \ INIT_STR(list_err, "list index out of range"), \ - INIT_STR(newline, "\n"), \ - INIT_STR(open_br, "{"), \ - INIT_STR(percent, "%"), \ INIT_STR(shim_name, ""), \ INIT_STR(type_params, ".type_params"), \ INIT_STR(utf_8, "utf-8"), \ @@ -572,7 +567,6 @@ extern "C" { INIT_ID(TextIOWrapper), \ INIT_ID(True), \ INIT_ID(WarningMessage), \ - INIT_ID(_), \ INIT_ID(_WindowsConsoleIO), \ INIT_ID(__IOBase_closed), \ INIT_ID(__abc_tpflags__), \ @@ -761,6 +755,7 @@ extern "C" { INIT_ID(_lock_unlock_module), \ INIT_ID(_loop), \ INIT_ID(_needs_com_addref_), \ + INIT_ID(_only_immortal), \ INIT_ID(_pack_), \ INIT_ID(_restype_), \ INIT_ID(_showwarnmsg), \ @@ -772,7 +767,6 @@ extern "C" { INIT_ID(_uninitialized_submodules), \ INIT_ID(_warn_unawaited_coroutine), \ INIT_ID(_xoptions), \ - INIT_ID(a), \ INIT_ID(abs_tol), \ INIT_ID(access), \ INIT_ID(add), \ @@ -792,7 +786,6 @@ extern "C" { INIT_ID(attribute), \ INIT_ID(authorizer_callback), \ INIT_ID(autocommit), \ - INIT_ID(b), \ INIT_ID(backtick), \ INIT_ID(base), \ INIT_ID(before), \ @@ -810,7 +803,6 @@ extern "C" { INIT_ID(byteorder), \ INIT_ID(bytes), \ INIT_ID(bytes_per_sep), \ - INIT_ID(c), \ INIT_ID(c_call), \ INIT_ID(c_exception), \ INIT_ID(c_return), \ @@ -863,7 +855,6 @@ extern "C" { INIT_ID(count), \ INIT_ID(covariant), \ INIT_ID(cwd), \ - INIT_ID(d), \ INIT_ID(data), \ INIT_ID(database), \ INIT_ID(decode), \ @@ -891,7 +882,6 @@ extern "C" { INIT_ID(dst), \ INIT_ID(dst_dir_fd), \ INIT_ID(duration), \ - INIT_ID(e), \ INIT_ID(eager_start), \ INIT_ID(effective_ids), \ INIT_ID(element_factory), \ @@ -1052,7 +1042,6 @@ extern "C" { INIT_ID(mro), \ INIT_ID(msg), \ INIT_ID(mycmp), \ - INIT_ID(n), \ INIT_ID(n_arg), \ INIT_ID(n_fields), \ INIT_ID(n_sequence_fields), \ @@ -1097,7 +1086,6 @@ extern "C" { INIT_ID(outgoing), \ INIT_ID(overlapped), \ INIT_ID(owner), \ - INIT_ID(p), \ INIT_ID(pages), \ INIT_ID(parent), \ INIT_ID(password), \ @@ -1125,7 +1113,6 @@ extern "C" { INIT_ID(ps2), \ INIT_ID(query), \ INIT_ID(quotetabs), \ - INIT_ID(r), \ INIT_ID(raw), \ INIT_ID(read), \ INIT_ID(read1), \ @@ -1149,7 +1136,6 @@ extern "C" { INIT_ID(return), \ INIT_ID(reverse), \ INIT_ID(reversed), \ - INIT_ID(s), \ INIT_ID(salt), \ INIT_ID(sched_priority), \ INIT_ID(scheduler), \ @@ -1252,7 +1238,6 @@ extern "C" { INIT_ID(writable), \ INIT_ID(write), \ INIT_ID(write_through), \ - INIT_ID(x), \ INIT_ID(year), \ INIT_ID(zdict), \ } diff --git a/Include/internal/pycore_typeobject.h b/Include/internal/pycore_typeobject.h index 63f76fc5..4fdbc91a 100644 --- a/Include/internal/pycore_typeobject.h +++ b/Include/internal/pycore_typeobject.h @@ -143,6 +143,8 @@ PyAPI_DATA(PyTypeObject) _PyBufferWrapper_Type; PyObject * _PySuper_Lookup(PyTypeObject *su_type, PyObject *su_obj, PyObject *name, int *meth_found); +extern int _PyType_AddMethod(PyTypeObject *, PyMethodDef *); + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_unicodeobject.h b/Include/internal/pycore_unicodeobject.h index 1bb0f366..cecdabe4 100644 --- a/Include/internal/pycore_unicodeobject.h +++ b/Include/internal/pycore_unicodeobject.h @@ -13,17 +13,31 @@ extern "C" { void _PyUnicode_ExactDealloc(PyObject *op); Py_ssize_t _PyUnicode_InternedSize(void); +Py_ssize_t _PyUnicode_InternedSize_Immortal(void); /* runtime lifecycle */ extern void _PyUnicode_InitState(PyInterpreterState *); extern PyStatus _PyUnicode_InitGlobalObjects(PyInterpreterState *); +extern PyStatus _PyUnicode_InitInternDict(PyInterpreterState *); extern PyStatus _PyUnicode_InitTypes(PyInterpreterState *); extern void _PyUnicode_Fini(PyInterpreterState *); extern void _PyUnicode_FiniTypes(PyInterpreterState *); extern PyTypeObject _PyUnicodeASCIIIter_Type; +/* Interning */ + +// All these are "ref-neutral", like the public PyUnicode_InternInPlace. + +// Explicit interning routines: +PyAPI_FUNC(void) _PyUnicode_InternMortal(PyInterpreterState *interp, PyObject **); +PyAPI_FUNC(void) _PyUnicode_InternImmortal(PyInterpreterState *interp, PyObject **); +// Left here to help backporting: +PyAPI_FUNC(void) _PyUnicode_InternInPlace(PyInterpreterState *interp, PyObject **p); +// Only for statically allocated strings: +extern void _PyUnicode_InternStatic(PyInterpreterState *interp, PyObject **); + /* other API */ struct _Py_unicode_runtime_ids { @@ -60,9 +74,11 @@ struct _Py_unicode_state { struct _Py_unicode_ids ids; }; -extern void _PyUnicode_InternInPlace(PyInterpreterState *interp, PyObject **p); extern void _PyUnicode_ClearInterned(PyInterpreterState *interp); +// Like PyUnicode_AsUTF8(), but check for embedded null characters. +extern const char* _PyUnicode_AsUTF8NoNUL(PyObject *); + #ifdef __cplusplus } diff --git a/Include/internal/pycore_unicodeobject_generated.h b/Include/internal/pycore_unicodeobject_generated.h index 9f9e23f5..90c61bcd 100644 --- a/Include/internal/pycore_unicodeobject_generated.h +++ b/Include/internal/pycore_unicodeobject_generated.h @@ -13,2081 +13,2817 @@ static inline void _PyUnicode_InitStaticStrings(PyInterpreterState *interp) { PyObject *string; string = &_Py_ID(CANCELLED); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(FINISHED); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(False); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(JSONDecodeError); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(PENDING); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(Py_Repr); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(TextIOWrapper); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(True); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(WarningMessage); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); - string = &_Py_ID(_); - assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_WindowsConsoleIO); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__IOBase_closed); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__abc_tpflags__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__abs__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__abstractmethods__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__add__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__aenter__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__aexit__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__aiter__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__all__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__and__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__anext__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__annotations__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__args__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__asyncio_running_event_loop__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__await__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__bases__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__bool__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__buffer__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__build_class__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__builtins__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__bytes__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__call__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__cantrace__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__class__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__class_getitem__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__classcell__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__classdict__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__classdictcell__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__complex__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__contains__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__copy__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__ctypes_from_outparam__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__del__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__delattr__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__delete__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__delitem__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__dict__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__dictoffset__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__dir__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__divmod__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__doc__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__enter__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__eq__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__exit__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__file__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__float__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__floordiv__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__format__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__fspath__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__ge__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__get__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__getattr__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__getattribute__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__getinitargs__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__getitem__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__getnewargs__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__getnewargs_ex__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__getstate__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__gt__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__hash__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__iadd__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__iand__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__ifloordiv__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__ilshift__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__imatmul__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__imod__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__import__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__imul__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__index__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__init__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__init_subclass__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__instancecheck__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__int__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__invert__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__ior__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__ipow__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__irshift__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__isabstractmethod__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__isub__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__iter__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__itruediv__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__ixor__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__le__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__len__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__length_hint__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__lltrace__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__loader__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__lshift__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__lt__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__main__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__matmul__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__missing__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__mod__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__module__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__mro_entries__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__mul__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__name__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__ne__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__neg__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__new__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__newobj__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__newobj_ex__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__next__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__notes__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__or__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__orig_class__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__origin__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__package__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__parameters__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__path__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__pos__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__pow__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__prepare__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__qualname__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__radd__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__rand__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__rdivmod__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__reduce__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__reduce_ex__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__release_buffer__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__repr__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__reversed__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__rfloordiv__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__rlshift__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__rmatmul__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__rmod__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__rmul__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__ror__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__round__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__rpow__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__rrshift__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__rshift__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__rsub__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__rtruediv__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__rxor__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__set__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__set_name__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__setattr__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__setitem__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__setstate__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__sizeof__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__slotnames__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__slots__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__spec__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__str__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__sub__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__subclasscheck__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__subclasshook__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__truediv__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__trunc__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__type_params__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__typing_is_unpacked_typevartuple__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__typing_prepare_subst__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__typing_subst__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__typing_unpacked_tuple_args__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__warningregistry__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__weaklistoffset__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__weakref__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(__xor__); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_abc_impl); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_abstract_); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_active); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_annotation); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_anonymous_); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_argtypes_); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_as_parameter_); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_asyncio_future_blocking); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_blksize); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_bootstrap); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_check_retval_); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_dealloc_warn); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_feature_version); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_fields_); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_finalizing); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_find_and_load); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_fix_up_module); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_flags_); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_get_sourcefile); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_handle_fromlist); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_initializing); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_io); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_is_text_encoding); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_length_); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_limbo); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_lock_unlock_module); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_loop); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_needs_com_addref_); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_ID(_only_immortal); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_pack_); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_restype_); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_showwarnmsg); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_shutdown); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_slotnames); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_strptime_datetime); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_swappedbytes_); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_type_); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_uninitialized_submodules); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_warn_unawaited_coroutine); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(_xoptions); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); - string = &_Py_ID(a); - assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(abs_tol); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(access); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(add); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(add_done_callback); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(after_in_child); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(after_in_parent); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(aggregate_class); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(alias); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(append); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(arg); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(argdefs); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(args); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(arguments); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(argv); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(as_integer_ratio); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(ast); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(attribute); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(authorizer_callback); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(autocommit); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); - string = &_Py_ID(b); - assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(backtick); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(base); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(before); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(big); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(binary_form); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(block); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(bound); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(buffer); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(buffer_callback); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(buffer_size); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(buffering); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(buffers); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(bufsize); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(builtins); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(byteorder); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(bytes); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(bytes_per_sep); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); - string = &_Py_ID(c); - assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(c_call); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(c_exception); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(c_return); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(cached_statements); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(cadata); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(cafile); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(call); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(call_exception_handler); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(call_soon); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(cancel); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(capath); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(category); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(cb_type); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(certfile); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(check_same_thread); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(clear); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(close); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(closed); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(closefd); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(closure); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_argcount); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_cellvars); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_code); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_consts); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_exceptiontable); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_filename); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_firstlineno); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_flags); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_freevars); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_kwonlyargcount); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_linetable); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_name); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_names); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_nlocals); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_posonlyargcount); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_qualname); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_stacksize); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(co_varnames); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(code); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(command); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(comment_factory); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(compile_mode); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(consts); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(context); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(contravariant); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(cookie); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(copy); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(copyreg); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(coro); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(count); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(covariant); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(cwd); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); - string = &_Py_ID(d); - assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(data); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(database); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(decode); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(decoder); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(default); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(defaultaction); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(delete); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(depth); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(detect_types); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(deterministic); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(device); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(dict); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(dictcomp); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(difference_update); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(digest); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(digest_size); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(digestmod); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(dir_fd); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(discard); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(dispatch_table); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(displayhook); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(dklen); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(doc); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(dont_inherit); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(dst); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(dst_dir_fd); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(duration); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); - string = &_Py_ID(e); - assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(eager_start); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(effective_ids); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(element_factory); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(encode); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(encoding); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(end); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(end_lineno); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(end_offset); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(endpos); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(entrypoint); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(env); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(errors); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(event); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(eventmask); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(exc_type); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(exc_value); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(excepthook); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(exception); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(existing_file_name); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(exp); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(extend); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(extra_tokens); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(facility); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(factory); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(false); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(family); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(fanout); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(fd); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(fd2); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(fdel); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(fget); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(file); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(file_actions); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(filename); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(fileno); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(filepath); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(fillvalue); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(filters); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(final); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(find_class); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(fix_imports); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(flags); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(flush); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(follow_symlinks); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(format); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(frequency); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(from_param); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(fromlist); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(fromtimestamp); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(fromutc); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(fset); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(func); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(future); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(generation); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(genexpr); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(get); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(get_debug); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(get_event_loop); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(get_loop); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(get_source); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(getattr); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(getstate); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(gid); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(globals); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(groupindex); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(groups); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(handle); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(hash_name); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(header); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(headers); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(hi); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(hook); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(id); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(ident); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(ignore); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(imag); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(importlib); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(in_fd); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(incoming); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(indexgroup); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(inf); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(infer_variance); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(inheritable); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(initial); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(initial_bytes); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(initial_value); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(initval); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(inner_size); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(input); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(insert_comments); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(insert_pis); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(instructions); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(intern); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(intersection); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(is_running); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(isatty); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(isinstance); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(isoformat); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(isolation_level); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(istext); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(item); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(items); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(iter); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(iterable); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(iterations); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(join); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(jump); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(keepends); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(key); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(keyfile); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(keys); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(kind); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(kw); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(kw1); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(kw2); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(lambda); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(last); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(last_exc); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(last_node); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(last_traceback); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(last_type); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(last_value); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(latin1); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(leaf_size); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(len); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(length); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(level); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(limit); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(line); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(line_buffering); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(lineno); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(listcomp); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(little); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(lo); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(locale); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(locals); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(logoption); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(loop); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(mapping); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(match); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(max_length); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(maxdigits); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(maxevents); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(maxmem); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(maxsplit); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(maxvalue); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(memLevel); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(memlimit); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(message); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(metaclass); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(metadata); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(method); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(mod); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(mode); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(module); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(module_globals); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(modules); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(mro); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(msg); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(mycmp); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); - string = &_Py_ID(n); - assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(n_arg); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(n_fields); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(n_sequence_fields); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(n_unnamed_fields); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(name); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(name_from); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(namespace_separator); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(namespaces); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(narg); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(ndigits); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(new_file_name); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(new_limit); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(newline); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(newlines); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(next); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(nlocals); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(node_depth); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(node_offset); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(ns); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(nstype); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(nt); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(null); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(number); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(obj); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(object); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(offset); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(offset_dst); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(offset_src); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(on_type_read); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(onceregistry); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(only_keys); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(oparg); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(opcode); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(open); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(opener); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(operation); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(optimize); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(options); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(order); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(origin); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(out_fd); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(outgoing); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(overlapped); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(owner); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); - string = &_Py_ID(p); - assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(pages); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(parent); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(password); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(path); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(pattern); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(peek); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(persistent_id); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(persistent_load); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(person); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(pi_factory); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(pid); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(policy); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(pos); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(pos1); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(pos2); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(posix); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(print_file_and_line); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(priority); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(progress); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(progress_handler); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(progress_routine); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(proto); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(protocol); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(ps1); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(ps2); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(query); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(quotetabs); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); - string = &_Py_ID(r); - assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(raw); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(read); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(read1); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(readable); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(readall); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(readinto); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(readinto1); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(readline); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(readonly); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(real); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(reducer_override); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(registry); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(rel_tol); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(release); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(reload); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(repl); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(replace); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(reserved); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(reset); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(resetids); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(return); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(reverse); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(reversed); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); - string = &_Py_ID(s); - assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(salt); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(sched_priority); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(scheduler); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(seek); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(seekable); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(selectors); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(self); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(send); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(sep); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(sequence); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(server_hostname); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(server_side); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(session); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(setcomp); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(setpgroup); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(setsid); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(setsigdef); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(setsigmask); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(setstate); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(shape); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(show_cmd); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(signed); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(size); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(sizehint); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(skip_file_prefixes); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(sleep); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(sock); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(sort); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(sound); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(source); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(source_traceback); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(spam); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(src); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(src_dir_fd); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(stacklevel); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(start); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(statement); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(status); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(stderr); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(stdin); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(stdout); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(step); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(steps); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(store_name); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(strategy); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(strftime); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(strict); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(strict_mode); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(string); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(sub_key); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(symmetric_difference_update); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(tabsize); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(tag); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(target); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(target_is_directory); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(task); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(tb_frame); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(tb_lasti); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(tb_lineno); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(tb_next); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(tell); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(template); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(term); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(text); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(threading); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(throw); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(timeout); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(times); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(timetuple); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(top); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(trace_callback); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(traceback); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(trailers); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(translate); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(true); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(truncate); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(twice); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(txt); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(type); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(type_params); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(tz); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(tzname); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(uid); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(unlink); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(unraisablehook); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(uri); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(usedforsecurity); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(value); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(values); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(version); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(volume); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(warnings); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(warnoptions); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(wbits); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(week); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(weekday); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(which); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(who); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(withdata); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(writable); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(write); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(write_through); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); - string = &_Py_ID(x); - assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(year); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); string = &_Py_ID(zdict); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(empty); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(dbl_percent); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(dot_locals); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(defaults); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(generic_base); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(kwdefaults); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(type_params); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(anon_dictcomp); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(anon_genexpr); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(anon_lambda); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(anon_listcomp); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(anon_module); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(anon_setcomp); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(shim_name); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(anon_string); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(anon_unknown); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(json_decoder); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(list_err); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(utf_8); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(dbl_open_br); + _PyUnicode_InternStatic(interp, &string); + assert(_PyUnicode_CheckConsistency(string, 1)); + assert(PyUnicode_GET_LENGTH(string) != 1); + string = &_Py_STR(dbl_close_br); + _PyUnicode_InternStatic(interp, &string); assert(_PyUnicode_CheckConsistency(string, 1)); - _PyUnicode_InternInPlace(interp, &string); + assert(PyUnicode_GET_LENGTH(string) != 1); } /* End auto-generated code */ #ifdef __cplusplus diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 07e77187..6c597837 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -18,12 +18,12 @@ /*--start constants--*/ #define PY_MAJOR_VERSION 3 #define PY_MINOR_VERSION 12 -#define PY_MICRO_VERSION 4 +#define PY_MICRO_VERSION 8 #define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL #define PY_RELEASE_SERIAL 0 /* Version as a string */ -#define PY_VERSION "3.12.4" +#define PY_VERSION "3.12.8" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Include/pymacro.h b/Include/pymacro.h index 342d2a7b..d5700dc3 100644 --- a/Include/pymacro.h +++ b/Include/pymacro.h @@ -15,11 +15,11 @@ // MSVC makes static_assert a keyword in C11-17, contrary to the standards. // // In C++11 and C2x, static_assert is a keyword, redefining is undefined -// behaviour. So only define if building as C (if __STDC_VERSION__ is defined), -// not C++, and only for C11-17. +// behaviour. So only define if building as C, not C++ (if __cplusplus is +// not defined), and only for C11-17. #if !defined(static_assert) && (defined(__GNUC__) || defined(__clang__)) \ - && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L \ - && __STDC_VERSION__ <= 201710L + && !defined(__cplusplus) && defined(__STDC_VERSION__) \ + && __STDC_VERSION__ >= 201112L && __STDC_VERSION__ <= 201710L # define static_assert _Static_assert #endif diff --git a/InternalDocs/string_interning.md b/InternalDocs/string_interning.md new file mode 100644 index 00000000..4d0de118 --- /dev/null +++ b/InternalDocs/string_interning.md @@ -0,0 +1,122 @@ +# String interning + +*Interned* strings are conceptually part of an interpreter-global +*set* of interned strings, meaning that: +- no two interned strings have the same content (across an interpreter); +- two interned strings can be safely compared using pointer equality + (Python `is`). + +This is used to optimize dict and attribute lookups, among other things. + +Python uses two different mechanisms to intern strings: singletons and +dynamic interning. + +## Singletons + +The 256 possible one-character latin-1 strings, which can be retrieved with +`_Py_LATIN1_CHR(c)`, are stored in statically allocated arrays, +`_PyRuntime.static_objects.strings.ascii` and +`_PyRuntime.static_objects.strings.latin1`. + +Longer singleton strings are marked in C source with `_Py_ID` (if the string +is a valid C identifier fragment) or `_Py_STR` (if it needs a separate +C-compatible name.) +These are also stored in statically allocated arrays. +They are collected from CPython sources using `make regen-global-objects` +(`Tools/build/generate_global_objects.py`), which generates code +for declaration, initialization and finalization. + +The empty string is one of the singletons: `_Py_STR(empty)`. + +Deep-frozen modules (see `Tools/build/deepfreeze.py`) use either singletons, +or statically allocated strings. These are added to `INTERNED_STRINGS` +at runtime initialization, when deepfreeze modules are loaded. + +These sets of singletons (`_Py_LATIN1_CHR`, `_Py_ID`, `_Py_STR`, deepfreeze) +are disjoint. +If you have such a singleton, it (and no other copy) will be interned. + +These singletons are interned in a runtime-global lookup table, +`_PyRuntime.cached_objects.interned_strings` (`INTERNED_STRINGS`), +at runtime initialization, and immutable until it's torn down +at runtime finalization. +It is shared across threads and interpreters without any synchronization. + + +## Dynamically allocated strings + +All other strings are allocated dynamically, and have their +`_PyUnicode_STATE(s).statically_allocated` flag set to zero. +When interned, such strings are added to an interpreter-wide dict, +`PyInterpreterState.cached_objects.interned_strings`. + +The key and value of each entry in this dict reference the same object. + + +## Immortality and reference counting + +Invariant: Every immortal string is interned. + +In practice, this means that you must not use `_Py_SetImmortal` on +a string. (If you know it's already immortal, don't immortalize it; +if you know it's not interned you might be immortalizing a redundant copy; +if it's interned and mortal it needs extra processing in +`_PyUnicode_InternImmortal`.) + +The converse is not true: interned strings can be mortal. +For mortal interned strings: +- the 2 references from the interned dict (key & value) are excluded from + their refcount +- the deallocator (`unicode_dealloc`) removes the string from the interned dict +- at shutdown, when the interned dict is cleared, the references are added back + +As with any type, you should only immortalize strings that will live until +interpreter shutdown. +We currently also immortalize strings contained in code objects and similar, +specifically in the compiler and in `marshal`. +These are “close enough” to immortal: even in use cases like hot reloading +or `eval`-ing user input, the number of distinct identifiers and string +constants expected to stay low. + + +## Internal API + +We have the following *internal* API for interning: + +- `_PyUnicode_InternMortal`: just intern the string +- `_PyUnicode_InternImmortal`: intern, and immortalize the result +- `_PyUnicode_InternStatic`: intern a static singleton (`_Py_STR`, `_Py_ID` + or one-byte). Not for general use. + +All take an interpreter state, and a pointer to a `PyObject*` which they +modify in place. + +The functions take ownership of (“steal”) the reference to their argument, +and update the argument with a *new* reference. +This means: +- They're “reference neutral”. +- They must not be called with a borrowed reference. + + +## State + +The intern state (retrieved by `PyUnicode_CHECK_INTERNED(s)`; +stored in `_PyUnicode_STATE(s).interned`) can be: + +- `SSTATE_NOT_INTERNED` (defined as 0, which is useful in a boolean context) +- `SSTATE_INTERNED_MORTAL` (1) +- `SSTATE_INTERNED_IMMORTAL` (2) +- `SSTATE_INTERNED_IMMORTAL_STATIC` (3) + +The valid transitions between these states are: + +- For dynamically allocated strings: + + - 0 -> 1 (`_PyUnicode_InternMortal`) + - 1 -> 2 or 0 -> 2 (`_PyUnicode_InternImmortal`) + + Using `_PyUnicode_InternStatic` on these is an error; the other cases + don't change the state. + +- Singletons are interned (0 -> 3) at runtime init; + after that all interning functions don't change the state. diff --git a/Lib/_collections_abc.py b/Lib/_collections_abc.py index 601107d2..09745658 100644 --- a/Lib/_collections_abc.py +++ b/Lib/_collections_abc.py @@ -973,7 +973,7 @@ def clear(self): def update(self, other=(), /, **kwds): ''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F. - If E present and has a .keys() method, does: for k in E: D[k] = E[k] + If E present and has a .keys() method, does: for k in E.keys(): D[k] = E[k] If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v In either case, this is followed by: for k, v in F.items(): D[k] = v ''' diff --git a/Lib/_pydatetime.py b/Lib/_pydatetime.py index cd0ea900..ad6292e1 100644 --- a/Lib/_pydatetime.py +++ b/Lib/_pydatetime.py @@ -970,6 +970,8 @@ def __new__(cls, year, month=None, day=None): @classmethod def fromtimestamp(cls, t): "Construct a date from a POSIX timestamp (like time.time())." + if t is None: + raise TypeError("'NoneType' object cannot be interpreted as an integer") y, m, d, hh, mm, ss, weekday, jday, dst = _time.localtime(t) return cls(y, m, d) diff --git a/Lib/_pydecimal.py b/Lib/_pydecimal.py index 613123ec..75df3db2 100644 --- a/Lib/_pydecimal.py +++ b/Lib/_pydecimal.py @@ -424,7 +424,7 @@ def sin(x): # numbers.py for more detail. class Decimal(object): - """Floating point class for decimal arithmetic.""" + """Floating-point class for decimal arithmetic.""" __slots__ = ('_exp','_int','_sign', '_is_special') # Generally, the value of the Decimal instance is given by diff --git a/Lib/_strptime.py b/Lib/_strptime.py index 798cf9f9..dfd2bc5d 100644 --- a/Lib/_strptime.py +++ b/Lib/_strptime.py @@ -14,6 +14,7 @@ import locale import calendar from re import compile as re_compile +from re import sub as re_sub from re import IGNORECASE from re import escape as re_escape from datetime import (date as datetime_date, @@ -27,6 +28,18 @@ def _getlang(): # Figure out what the current language is set to. return locale.getlocale(locale.LC_TIME) +def _findall(haystack, needle): + # Find all positions of needle in haystack. + if not needle: + return + i = 0 + while True: + i = haystack.find(needle, i) + if i < 0: + break + yield i + i += len(needle) + class LocaleTime(object): """Stores and handles locale-specific information related to time. @@ -101,7 +114,8 @@ def __calc_am_pm(self): am_pm = [] for hour in (1, 22): time_tuple = time.struct_time((1999,3,17,hour,44,55,2,76,0)) - am_pm.append(time.strftime("%p", time_tuple).lower()) + # br_FR has AM/PM info (' ',' '). + am_pm.append(time.strftime("%p", time_tuple).lower().strip()) self.am_pm = am_pm def __calc_date_time(self): @@ -113,42 +127,130 @@ def __calc_date_time(self): # values within the format string is very important; it eliminates # possible ambiguity for what something represents. time_tuple = time.struct_time((1999,3,17,22,44,55,2,76,0)) - date_time = [None, None, None] - date_time[0] = time.strftime("%c", time_tuple).lower() - date_time[1] = time.strftime("%x", time_tuple).lower() - date_time[2] = time.strftime("%X", time_tuple).lower() - replacement_pairs = [('%', '%%'), (self.f_weekday[2], '%A'), - (self.f_month[3], '%B'), (self.a_weekday[2], '%a'), - (self.a_month[3], '%b'), (self.am_pm[1], '%p'), - ('1999', '%Y'), ('99', '%y'), ('22', '%H'), - ('44', '%M'), ('55', '%S'), ('76', '%j'), - ('17', '%d'), ('03', '%m'), ('3', '%m'), - # '3' needed for when no leading zero. - ('2', '%w'), ('10', '%I')] - replacement_pairs.extend([(tz, "%Z") for tz_values in self.timezone - for tz in tz_values]) - for offset,directive in ((0,'%c'), (1,'%x'), (2,'%X')): - current_format = date_time[offset] - for old, new in replacement_pairs: + time_tuple2 = time.struct_time((1999,1,3,1,1,1,6,3,0)) + replacement_pairs = [ + ('1999', '%Y'), ('99', '%y'), ('22', '%H'), + ('44', '%M'), ('55', '%S'), ('76', '%j'), + ('17', '%d'), ('03', '%m'), ('3', '%m'), + # '3' needed for when no leading zero. + ('2', '%w'), ('10', '%I'), + # Non-ASCII digits + ('\u0661\u0669\u0669\u0669', '%Y'), + ('\u0669\u0669', '%Oy'), + ('\u0662\u0662', '%OH'), + ('\u0664\u0664', '%OM'), + ('\u0665\u0665', '%OS'), + ('\u0661\u0667', '%Od'), + ('\u0660\u0663', '%Om'), + ('\u0663', '%Om'), + ('\u0662', '%Ow'), + ('\u0661\u0660', '%OI'), + ] + date_time = [] + for directive in ('%c', '%x', '%X'): + current_format = time.strftime(directive, time_tuple).lower() + current_format = current_format.replace('%', '%%') + # The month and the day of the week formats are treated specially + # because of a possible ambiguity in some locales where the full + # and abbreviated names are equal or names of different types + # are equal. See doc of __find_month_format for more details. + lst, fmt = self.__find_weekday_format(directive) + if lst: + current_format = current_format.replace(lst[2], fmt, 1) + lst, fmt = self.__find_month_format(directive) + if lst: + current_format = current_format.replace(lst[3], fmt, 1) + if self.am_pm[1]: # Must deal with possible lack of locale info # manifesting itself as the empty string (e.g., Swedish's # lack of AM/PM info) or a platform returning a tuple of empty # strings (e.g., MacOS 9 having timezone as ('','')). - if old: - current_format = current_format.replace(old, new) + current_format = current_format.replace(self.am_pm[1], '%p') + for tz_values in self.timezone: + for tz in tz_values: + if tz: + current_format = current_format.replace(tz, "%Z") + # Transform all non-ASCII digits to digits in range U+0660 to U+0669. + current_format = re_sub(r'\d(?3[0-1]|[1-2]\d|0[1-9]|[1-9]| [1-9])", 'f': r"(?P[0-9]{1,6})", 'H': r"(?P2[0-3]|[0-1]\d|\d)", - 'I': r"(?P1[0-2]|0[1-9]|[1-9])", + 'I': r"(?P1[0-2]|0[1-9]|[1-9]| [1-9])", 'G': r"(?P\d\d\d\d)", 'j': r"(?P36[0-6]|3[0-5]\d|[1-2]\d\d|0[1-9]\d|00[1-9]|[1-9]\d|0[1-9]|[1-9])", 'm': r"(?P1[0-2]|0[1-9]|[1-9])", @@ -210,11 +312,15 @@ def __init__(self, locale_time=None): 'Z': self.__seqToRE((tz for tz_names in self.locale_time.timezone for tz in tz_names), 'Z'), - '%': '%'}) - base.__setitem__('W', base.__getitem__('U').replace('U', 'W')) - base.__setitem__('c', self.pattern(self.locale_time.LC_date_time)) - base.__setitem__('x', self.pattern(self.locale_time.LC_date)) + '%': '%'} + for d in 'dmyHIMS': + mapping['O' + d] = r'(?P<%s>\d\d|\d| \d)' % d + mapping['Ow'] = r'(?P\d)' + mapping['W'] = mapping['U'].replace('U', 'W') + base.__init__(mapping) base.__setitem__('X', self.pattern(self.locale_time.LC_time)) + base.__setitem__('x', self.pattern(self.locale_time.LC_date)) + base.__setitem__('c', self.pattern(self.locale_time.LC_date_time)) def __seqToRE(self, to_convert, directive): """Convert a list to a regex string for matching a directive. @@ -242,21 +348,16 @@ def pattern(self, format): regex syntax are escaped. """ - processed_format = '' # The sub() call escapes all characters that might be misconstrued # as regex syntax. Cannot use re.escape since we have to deal with # format directives (%m, etc.). - regex_chars = re_compile(r"([\\.^$*+?\(\){}\[\]|])") - format = regex_chars.sub(r"\\\1", format) - whitespace_replacement = re_compile(r'\s+') - format = whitespace_replacement.sub(r'\\s+', format) - while '%' in format: - directive_index = format.index('%')+1 - processed_format = "%s%s%s" % (processed_format, - format[:directive_index-1], - self[format[directive_index]]) - format = format[directive_index+1:] - return "%s%s" % (processed_format, format) + format = re_sub(r"([\\.^$*+?\(\){}\[\]|])", r"\\\1", format) + format = re_sub(r'\s+', r'\\s+', format) + format = re_sub(r"'", "['\u02bc]", format) # needed for br_FR + def repl(m): + return self[m[1]] + format = re_sub(r'%(O?.)', repl, format) + return format def compile(self, format): """Return a compiled re object for the format string.""" diff --git a/Lib/argparse.py b/Lib/argparse.py index 120cb6c8..2a8b501a 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -263,13 +263,12 @@ def add_argument(self, action): # find all invocations get_invocation = self._format_action_invocation - invocations = [get_invocation(action)] + invocation_lengths = [len(get_invocation(action)) + self._current_indent] for subaction in self._iter_indented_subactions(action): - invocations.append(get_invocation(subaction)) + invocation_lengths.append(len(get_invocation(subaction)) + self._current_indent) # update the maximum item length - invocation_length = max(map(len, invocations)) - action_length = invocation_length + self._current_indent + action_length = max(invocation_lengths) self._action_max_length = max(self._action_max_length, action_length) @@ -565,8 +564,7 @@ def _format_action(self, action): def _format_action_invocation(self, action): if not action.option_strings: default = self._get_default_metavar_for_positional(action) - metavar, = self._metavar_formatter(action, default)(1) - return metavar + return ' '.join(self._metavar_formatter(action, default)(1)) else: parts = [] @@ -590,8 +588,7 @@ def _metavar_formatter(self, action, default_metavar): if action.metavar is not None: result = action.metavar elif action.choices is not None: - choice_strs = [str(choice) for choice in action.choices] - result = '{%s}' % ','.join(choice_strs) + result = '{%s}' % ','.join(map(str, action.choices)) else: result = default_metavar @@ -639,8 +636,7 @@ def _expand_help(self, action): if hasattr(params[name], '__name__'): params[name] = params[name].__name__ if params.get('choices') is not None: - choices_str = ', '.join([str(c) for c in params['choices']]) - params['choices'] = choices_str + params['choices'] = ', '.join(map(str, params['choices'])) return self._get_help_string(action) % params def _iter_indented_subactions(self, action): @@ -753,11 +749,19 @@ def _get_action_name(argument): elif argument.option_strings: return '/'.join(argument.option_strings) elif argument.metavar not in (None, SUPPRESS): - return argument.metavar + metavar = argument.metavar + if not isinstance(metavar, tuple): + return metavar + if argument.nargs == ZERO_OR_MORE and len(metavar) == 2: + return '%s[, %s]' % metavar + elif argument.nargs == ONE_OR_MORE: + return '%s[, %s]' % metavar + else: + return ', '.join(metavar) elif argument.dest not in (None, SUPPRESS): return argument.dest elif argument.choices: - return '{' + ','.join(argument.choices) + '}' + return '{%s}' % ','.join(map(str, argument.choices)) else: return None @@ -1270,7 +1274,8 @@ def __call__(self, parser, namespace, values, option_string=None): setattr(namespace, key, value) if arg_strings: - vars(namespace).setdefault(_UNRECOGNIZED_ARGS_ATTR, []) + if not hasattr(namespace, _UNRECOGNIZED_ARGS_ATTR): + setattr(namespace, _UNRECOGNIZED_ARGS_ATTR, []) getattr(namespace, _UNRECOGNIZED_ARGS_ATTR).extend(arg_strings) class _ExtendAction(_AppendAction): @@ -1557,7 +1562,11 @@ def _add_container_actions(self, container): # NOTE: if add_mutually_exclusive_group ever gains title= and # description= then this code will need to be expanded as above for group in container._mutually_exclusive_groups: - mutex_group = self.add_mutually_exclusive_group( + if group._container is container: + cont = self + else: + cont = title_group_map[group._container.title] + mutex_group = cont.add_mutually_exclusive_group( required=group.required) # map the actions to their new mutex group @@ -1576,9 +1585,8 @@ def _get_positional_kwargs(self, dest, **kwargs): # mark positional arguments as required if at least one is # always required - if kwargs.get('nargs') not in [OPTIONAL, ZERO_OR_MORE]: - kwargs['required'] = True - if kwargs.get('nargs') == ZERO_OR_MORE and 'default' not in kwargs: + nargs = kwargs.get('nargs') + if nargs not in [OPTIONAL, ZERO_OR_MORE, REMAINDER, SUPPRESS, 0]: kwargs['required'] = True # return the keyword arguments with no option strings @@ -1843,14 +1851,14 @@ def _get_kwargs(self): # ================================== def add_subparsers(self, **kwargs): if self._subparsers is not None: - self.error(_('cannot have multiple subparser arguments')) + raise ArgumentError(None, _('cannot have multiple subparser arguments')) # add the parser class to the arguments if it's not present kwargs.setdefault('parser_class', type(self)) if 'title' in kwargs or 'description' in kwargs: - title = _(kwargs.pop('title', 'subcommands')) - description = _(kwargs.pop('description', None)) + title = kwargs.pop('title', _('subcommands')) + description = kwargs.pop('description', None) self._subparsers = self.add_argument_group(title, description) else: self._subparsers = self._positionals @@ -1895,11 +1903,17 @@ def _get_positional_actions(self): def parse_args(self, args=None, namespace=None): args, argv = self.parse_known_args(args, namespace) if argv: - msg = _('unrecognized arguments: %s') - self.error(msg % ' '.join(argv)) + msg = _('unrecognized arguments: %s') % ' '.join(argv) + if self.exit_on_error: + self.error(msg) + else: + raise ArgumentError(None, msg) return args def parse_known_args(self, args=None, namespace=None): + return self._parse_known_args2(args, namespace, intermixed=False) + + def _parse_known_args2(self, args, namespace, intermixed): if args is None: # args default to the system args args = _sys.argv[1:] @@ -1926,18 +1940,18 @@ def parse_known_args(self, args=None, namespace=None): # parse the arguments and exit if there are any errors if self.exit_on_error: try: - namespace, args = self._parse_known_args(args, namespace) + namespace, args = self._parse_known_args(args, namespace, intermixed) except ArgumentError as err: self.error(str(err)) else: - namespace, args = self._parse_known_args(args, namespace) + namespace, args = self._parse_known_args(args, namespace, intermixed) if hasattr(namespace, _UNRECOGNIZED_ARGS_ATTR): args.extend(getattr(namespace, _UNRECOGNIZED_ARGS_ATTR)) delattr(namespace, _UNRECOGNIZED_ARGS_ATTR) return namespace, args - def _parse_known_args(self, arg_strings, namespace): + def _parse_known_args(self, arg_strings, namespace, intermixed): # replace arg strings that are file references if self.fromfile_prefix_chars is not None: arg_strings = self._read_args_from_files(arg_strings) @@ -1969,11 +1983,11 @@ def _parse_known_args(self, arg_strings, namespace): # otherwise, add the arg to the arg strings # and note the index if it was an option else: - option_tuple = self._parse_optional(arg_string) - if option_tuple is None: + option_tuples = self._parse_optional(arg_string) + if option_tuples is None: pattern = 'A' else: - option_string_indices[i] = option_tuple + option_string_indices[i] = option_tuples pattern = 'O' arg_string_pattern_parts.append(pattern) @@ -1989,9 +2003,8 @@ def take_action(action, argument_strings, option_string=None): argument_values = self._get_values(action, argument_strings) # error if this argument is not allowed with other previously - # seen arguments, assuming that actions that use the default - # value don't really count as "present" - if argument_values is not action.default: + # seen arguments + if action.option_strings or argument_strings: seen_non_default_actions.add(action) for conflict_action in action_conflicts.get(action, []): if conflict_action in seen_non_default_actions: @@ -2008,8 +2021,16 @@ def take_action(action, argument_strings, option_string=None): def consume_optional(start_index): # get the optional identified at this index - option_tuple = option_string_indices[start_index] - action, option_string, sep, explicit_arg = option_tuple + option_tuples = option_string_indices[start_index] + # if multiple actions match, the option string was ambiguous + if len(option_tuples) > 1: + options = ', '.join([option_string + for action, option_string, sep, explicit_arg in option_tuples]) + args = {'option': arg_strings[start_index], 'matches': options} + msg = _('ambiguous option: %(option)s could match %(matches)s') + raise ArgumentError(None, msg % args) + + action, option_string, sep, explicit_arg = option_tuples[0] # identify additional optionals in the same arg string # (e.g. -xyz is the same as -x -y -z if no args are required) @@ -2020,6 +2041,7 @@ def consume_optional(start_index): # if we found no optional action, skip it if action is None: extras.append(arg_strings[start_index]) + extras_pattern.append('O') return start_index + 1 # if there is an explicit argument, try to match the @@ -2055,6 +2077,7 @@ def consume_optional(start_index): sep = '' else: extras.append(char + explicit_arg) + extras_pattern.append('O') stop = start_index + 1 break # if the action expect exactly one argument, we've @@ -2105,6 +2128,15 @@ def consume_positionals(start_index): # and add the Positional and its args to the list for action, arg_count in zip(positionals, arg_counts): args = arg_strings[start_index: start_index + arg_count] + # Strip out the first '--' if it is not in REMAINDER arg. + if action.nargs == PARSER: + if arg_strings_pattern[start_index] == '-': + assert args[0] == '--' + args.remove('--') + elif action.nargs != REMAINDER: + if (arg_strings_pattern.find('-', start_index, + start_index + arg_count) >= 0): + args.remove('--') start_index += arg_count take_action(action, args) @@ -2116,6 +2148,7 @@ def consume_positionals(start_index): # consume Positionals and Optionals alternately, until we have # passed the last option string extras = [] + extras_pattern = [] start_index = 0 if option_string_indices: max_option_string_index = max(option_string_indices) @@ -2128,7 +2161,7 @@ def consume_positionals(start_index): index for index in option_string_indices if index >= start_index]) - if start_index != next_option_string_index: + if not intermixed and start_index != next_option_string_index: positionals_end_index = consume_positionals(start_index) # only try to parse the next optional if we didn't consume @@ -2144,16 +2177,35 @@ def consume_positionals(start_index): if start_index not in option_string_indices: strings = arg_strings[start_index:next_option_string_index] extras.extend(strings) + extras_pattern.extend(arg_strings_pattern[start_index:next_option_string_index]) start_index = next_option_string_index # consume the next optional and any arguments for it start_index = consume_optional(start_index) - # consume any positionals following the last Optional - stop_index = consume_positionals(start_index) + if not intermixed: + # consume any positionals following the last Optional + stop_index = consume_positionals(start_index) - # if we didn't consume all the argument strings, there were extras - extras.extend(arg_strings[stop_index:]) + # if we didn't consume all the argument strings, there were extras + extras.extend(arg_strings[stop_index:]) + else: + extras.extend(arg_strings[start_index:]) + extras_pattern.extend(arg_strings_pattern[start_index:]) + extras_pattern = ''.join(extras_pattern) + assert len(extras_pattern) == len(extras) + # consume all positionals + arg_strings = [s for s, c in zip(extras, extras_pattern) if c != 'O'] + arg_strings_pattern = extras_pattern.replace('O', '') + stop_index = consume_positionals(0) + # leave unknown optionals and non-consumed positionals in extras + for i, c in enumerate(extras_pattern): + if not stop_index: + break + if c != 'O': + stop_index -= 1 + extras[i] = None + extras = [s for s in extras if s is not None] # make sure all required actions were present and also convert # action defaults which were not given as arguments @@ -2175,7 +2227,7 @@ def consume_positionals(start_index): self._get_value(action, action.default)) if required_actions: - self.error(_('the following arguments are required: %s') % + raise ArgumentError(None, _('the following arguments are required: %s') % ', '.join(required_actions)) # make sure all required groups had one option present @@ -2191,7 +2243,7 @@ def consume_positionals(start_index): for action in group._group_actions if action.help is not SUPPRESS] msg = _('one of the arguments %s is required') - self.error(msg % ' '.join(names)) + raise ArgumentError(None, msg % ' '.join(names)) # return the updated namespace and the extra arguments return namespace, extras @@ -2218,7 +2270,7 @@ def _read_args_from_files(self, arg_strings): arg_strings = self._read_args_from_files(arg_strings) new_arg_strings.extend(arg_strings) except OSError as err: - self.error(str(err)) + raise ArgumentError(None, str(err)) # return the modified argument list return new_arg_strings @@ -2251,18 +2303,19 @@ def _match_argument(self, action, arg_strings_pattern): def _match_arguments_partial(self, actions, arg_strings_pattern): # progressively shorten the actions list by slicing off the # final actions until we find a match - result = [] for i in range(len(actions), 0, -1): actions_slice = actions[:i] pattern = ''.join([self._get_nargs_pattern(action) for action in actions_slice]) match = _re.match(pattern, arg_strings_pattern) if match is not None: - result.extend([len(string) for string in match.groups()]) - break - - # return the list of arg string counts - return result + result = [len(string) for string in match.groups()] + if (match.end() < len(arg_strings_pattern) + and arg_strings_pattern[match.end()] == 'O'): + while result and not result[-1]: + del result[-1] + return result + return [] def _parse_optional(self, arg_string): # if it's an empty string, it was meant to be a positional @@ -2276,7 +2329,7 @@ def _parse_optional(self, arg_string): # if the option string is present in the parser, return the action if arg_string in self._option_string_actions: action = self._option_string_actions[arg_string] - return action, arg_string, None, None + return [(action, arg_string, None, None)] # if it's just a single character, it was meant to be positional if len(arg_string) == 1: @@ -2286,25 +2339,14 @@ def _parse_optional(self, arg_string): option_string, sep, explicit_arg = arg_string.partition('=') if sep and option_string in self._option_string_actions: action = self._option_string_actions[option_string] - return action, option_string, sep, explicit_arg + return [(action, option_string, sep, explicit_arg)] # search through all possible prefixes of the option string # and all actions in the parser for possible interpretations option_tuples = self._get_option_tuples(arg_string) - # if multiple actions match, the option string was ambiguous - if len(option_tuples) > 1: - options = ', '.join([option_string - for action, option_string, sep, explicit_arg in option_tuples]) - args = {'option': arg_string, 'matches': options} - msg = _('ambiguous option: %(option)s could match %(matches)s') - self.error(msg % args) - - # if exactly one action matched, this segmentation is good, - # so return the parsed action - elif len(option_tuples) == 1: - option_tuple, = option_tuples - return option_tuple + if option_tuples: + return option_tuples # if it was not found as an option, but it looks like a negative # number, it was meant to be positional @@ -2319,7 +2361,7 @@ def _parse_optional(self, arg_string): # it was meant to be an optional but there is no such option # in this parser (though it might be a valid option in a subparser) - return None, arg_string, None, None + return [(None, arg_string, None, None)] def _get_option_tuples(self, option_string): result = [] @@ -2342,7 +2384,9 @@ def _get_option_tuples(self, option_string): # but multiple character options always have to have their argument # separate elif option_string[0] in chars and option_string[1] not in chars: - option_prefix = option_string + option_prefix, sep, explicit_arg = option_string.partition('=') + if not sep: + sep = explicit_arg = None short_option_prefix = option_string[:2] short_explicit_arg = option_string[2:] @@ -2351,14 +2395,14 @@ def _get_option_tuples(self, option_string): action = self._option_string_actions[option_string] tup = action, option_string, '', short_explicit_arg result.append(tup) - elif option_string.startswith(option_prefix): + elif self.allow_abbrev and option_string.startswith(option_prefix): action = self._option_string_actions[option_string] - tup = action, option_string, None, None + tup = action, option_string, sep, explicit_arg result.append(tup) # shouldn't ever get here else: - self.error(_('unexpected option string: %s') % option_string) + raise ArgumentError(None, _('unexpected option string: %s') % option_string) # return the collected option tuples return result @@ -2367,43 +2411,40 @@ def _get_nargs_pattern(self, action): # in all examples below, we have to allow for '--' args # which are represented as '-' in the pattern nargs = action.nargs + # if this is an optional action, -- is not allowed + option = action.option_strings # the default (None) is assumed to be a single argument if nargs is None: - nargs_pattern = '(-*A-*)' + nargs_pattern = '([A])' if option else '(-*A-*)' # allow zero or one arguments elif nargs == OPTIONAL: - nargs_pattern = '(-*A?-*)' + nargs_pattern = '(A?)' if option else '(-*A?-*)' # allow zero or more arguments elif nargs == ZERO_OR_MORE: - nargs_pattern = '(-*[A-]*)' + nargs_pattern = '(A*)' if option else '(-*[A-]*)' # allow one or more arguments elif nargs == ONE_OR_MORE: - nargs_pattern = '(-*A[A-]*)' + nargs_pattern = '(A+)' if option else '(-*A[A-]*)' # allow any number of options or arguments elif nargs == REMAINDER: - nargs_pattern = '([-AO]*)' + nargs_pattern = '([AO]*)' if option else '(.*)' # allow one argument followed by any number of options or arguments elif nargs == PARSER: - nargs_pattern = '(-*A[-AO]*)' + nargs_pattern = '(A[AO]*)' if option else '(-*A[-AO]*)' # suppress action, like nargs=0 elif nargs == SUPPRESS: - nargs_pattern = '(-*-*)' + nargs_pattern = '()' if option else '(-*)' # all others should be integers else: - nargs_pattern = '(-*%s-*)' % '-*'.join('A' * nargs) - - # if this is an optional action, -- is not allowed - if action.option_strings: - nargs_pattern = nargs_pattern.replace('-*', '') - nargs_pattern = nargs_pattern.replace('-', '') + nargs_pattern = '([AO]{%d})' % nargs if option else '((?:-*A){%d}-*)' % nargs # return the pattern return nargs_pattern @@ -2415,8 +2456,11 @@ def _get_nargs_pattern(self, action): def parse_intermixed_args(self, args=None, namespace=None): args, argv = self.parse_known_intermixed_args(args, namespace) if argv: - msg = _('unrecognized arguments: %s') - self.error(msg % ' '.join(argv)) + msg = _('unrecognized arguments: %s') % ' '.join(argv) + if self.exit_on_error: + self.error(msg) + else: + raise ArgumentError(None, msg) return args def parse_known_intermixed_args(self, args=None, namespace=None): @@ -2427,10 +2471,6 @@ def parse_known_intermixed_args(self, args=None, namespace=None): # are then parsed. If the parser definition is incompatible with the # intermixed assumptions (e.g. use of REMAINDER, subparsers) a # TypeError is raised. - # - # positionals are 'deactivated' by setting nargs and default to - # SUPPRESS. This blocks the addition of that positional to the - # namespace positionals = self._get_positional_actions() a = [action for action in positionals @@ -2439,78 +2479,19 @@ def parse_known_intermixed_args(self, args=None, namespace=None): raise TypeError('parse_intermixed_args: positional arg' ' with nargs=%s'%a[0].nargs) - if [action.dest for group in self._mutually_exclusive_groups - for action in group._group_actions if action in positionals]: - raise TypeError('parse_intermixed_args: positional in' - ' mutuallyExclusiveGroup') - - try: - save_usage = self.usage - try: - if self.usage is None: - # capture the full usage for use in error messages - self.usage = self.format_usage()[7:] - for action in positionals: - # deactivate positionals - action.save_nargs = action.nargs - # action.nargs = 0 - action.nargs = SUPPRESS - action.save_default = action.default - action.default = SUPPRESS - namespace, remaining_args = self.parse_known_args(args, - namespace) - for action in positionals: - # remove the empty positional values from namespace - if (hasattr(namespace, action.dest) - and getattr(namespace, action.dest)==[]): - from warnings import warn - warn('Do not expect %s in %s' % (action.dest, namespace)) - delattr(namespace, action.dest) - finally: - # restore nargs and usage before exiting - for action in positionals: - action.nargs = action.save_nargs - action.default = action.save_default - optionals = self._get_optional_actions() - try: - # parse positionals. optionals aren't normally required, but - # they could be, so make sure they aren't. - for action in optionals: - action.save_required = action.required - action.required = False - for group in self._mutually_exclusive_groups: - group.save_required = group.required - group.required = False - namespace, extras = self.parse_known_args(remaining_args, - namespace) - finally: - # restore parser values before exiting - for action in optionals: - action.required = action.save_required - for group in self._mutually_exclusive_groups: - group.required = group.save_required - finally: - self.usage = save_usage - return namespace, extras + return self._parse_known_args2(args, namespace, intermixed=True) # ======================== # Value conversion methods # ======================== def _get_values(self, action, arg_strings): - # for everything but PARSER, REMAINDER args, strip out first '--' - if not action.option_strings and action.nargs not in [PARSER, REMAINDER]: - try: - arg_strings.remove('--') - except ValueError: - pass - # optional argument produces a default when not present if not arg_strings and action.nargs == OPTIONAL: if action.option_strings: value = action.const else: value = action.default - if isinstance(value, str): + if isinstance(value, str) and value is not SUPPRESS: value = self._get_value(action, value) self._check_value(action, value) @@ -2581,11 +2562,15 @@ def _get_value(self, action, arg_string): def _check_value(self, action, value): # converted value must be one of the choices (if specified) - if action.choices is not None and value not in action.choices: - args = {'value': value, - 'choices': ', '.join(map(repr, action.choices))} - msg = _('invalid choice: %(value)r (choose from %(choices)s)') - raise ArgumentError(action, msg % args) + choices = action.choices + if choices is not None: + if isinstance(choices, str): + choices = iter(choices) + if value not in choices: + args = {'value': str(value), + 'choices': ', '.join(map(str, action.choices))} + msg = _('invalid choice: %(value)r (choose from %(choices)s)') + raise ArgumentError(action, msg % args) # ======================= # Help-formatting methods diff --git a/Lib/asyncio/__main__.py b/Lib/asyncio/__main__.py index c39a31d7..29e528ae 100644 --- a/Lib/asyncio/__main__.py +++ b/Lib/asyncio/__main__.py @@ -2,6 +2,7 @@ import asyncio import code import concurrent.futures +import contextvars import inspect import sys import threading @@ -17,6 +18,7 @@ def __init__(self, locals, loop): super().__init__(locals) self.compile.compiler.flags |= ast.PyCF_ALLOW_TOP_LEVEL_AWAIT self.loop = loop + self.context = contextvars.copy_context() def runcode(self, code): future = concurrent.futures.Future() @@ -46,12 +48,12 @@ def callback(): return try: - repl_future = self.loop.create_task(coro) + repl_future = self.loop.create_task(coro, context=self.context) futures._chain_future(repl_future, future) except BaseException as exc: future.set_exception(exc) - loop.call_soon_threadsafe(callback) + loop.call_soon_threadsafe(callback, context=self.context) try: return future.result() @@ -89,6 +91,8 @@ def run(self): if __name__ == '__main__': + sys.audit("cpython.run_stdin") + loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index 29eff049..3146f7f3 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -17,7 +17,6 @@ import collections.abc import concurrent.futures import errno -import functools import heapq import itertools import os @@ -994,8 +993,7 @@ async def _connect_sock(self, exceptions, addr_info, local_addr_infos=None): except OSError as exc: msg = ( f'error while attempting to bind on ' - f'address {laddr!r}: ' - f'{exc.strerror.lower()}' + f'address {laddr!r}: {str(exc).lower()}' ) exc = OSError(exc.errno, msg) my_exceptions.append(exc) @@ -1107,11 +1105,18 @@ async def create_connection( except OSError: continue else: # using happy eyeballs - sock, _, _ = await staggered.staggered_race( - (functools.partial(self._connect_sock, - exceptions, addrinfo, laddr_infos) - for addrinfo in infos), - happy_eyeballs_delay, loop=self) + sock = (await staggered.staggered_race( + ( + # can't use functools.partial as it keeps a reference + # to exceptions + lambda addrinfo=addrinfo: self._connect_sock( + exceptions, addrinfo, laddr_infos + ) + for addrinfo in infos + ), + happy_eyeballs_delay, + loop=self, + ))[0] # can't use sock, _, _ as it keeks a reference to exceptions if sock is None: exceptions = [exc for sub in exceptions for exc in sub] @@ -1561,7 +1566,7 @@ async def create_server( except OSError as err: msg = ('error while attempting ' 'to bind on address %r: %s' - % (sa, err.strerror.lower())) + % (sa, str(err).lower())) if err.errno == errno.EADDRNOTAVAIL: # Assume the family is not enabled (bpo-30945) sockets.pop() diff --git a/Lib/asyncio/futures.py b/Lib/asyncio/futures.py index 97fc4e3f..0c530bbd 100644 --- a/Lib/asyncio/futures.py +++ b/Lib/asyncio/futures.py @@ -194,8 +194,7 @@ def result(self): the future is done and has an exception set, this exception is raised. """ if self._state == _CANCELLED: - exc = self._make_cancelled_error() - raise exc + raise self._make_cancelled_error() if self._state != _FINISHED: raise exceptions.InvalidStateError('Result is not ready.') self.__log_traceback = False @@ -212,8 +211,7 @@ def exception(self): InvalidStateError. """ if self._state == _CANCELLED: - exc = self._make_cancelled_error() - raise exc + raise self._make_cancelled_error() if self._state != _FINISHED: raise exceptions.InvalidStateError('Exception is not set.') self.__log_traceback = False @@ -272,9 +270,13 @@ def set_exception(self, exception): raise exceptions.InvalidStateError(f'{self._state}: {self!r}') if isinstance(exception, type): exception = exception() - if type(exception) is StopIteration: - raise TypeError("StopIteration interacts badly with generators " - "and cannot be raised into a Future") + if isinstance(exception, StopIteration): + new_exc = RuntimeError("StopIteration interacts badly with " + "generators and cannot be raised into a " + "Future") + new_exc.__cause__ = exception + new_exc.__context__ = exception + exception = new_exc self._exception = exception self._exception_tb = exception.__traceback__ self._state = _FINISHED diff --git a/Lib/asyncio/sslproto.py b/Lib/asyncio/sslproto.py index e51669a2..29e72b1f 100644 --- a/Lib/asyncio/sslproto.py +++ b/Lib/asyncio/sslproto.py @@ -101,7 +101,7 @@ def get_protocol(self): return self._ssl_protocol._app_protocol def is_closing(self): - return self._closed + return self._closed or self._ssl_protocol._is_transport_closing() def close(self): """Close the transport. @@ -379,6 +379,9 @@ def _get_app_transport(self): self._app_transport_created = True return self._app_transport + def _is_transport_closing(self): + return self._transport is not None and self._transport.is_closing() + def connection_made(self, transport): """Called when the low-level connection is made. diff --git a/Lib/asyncio/staggered.py b/Lib/asyncio/staggered.py index 451a53a1..0f4df885 100644 --- a/Lib/asyncio/staggered.py +++ b/Lib/asyncio/staggered.py @@ -3,7 +3,6 @@ __all__ = 'staggered_race', import contextlib -import typing from . import events from . import exceptions as exceptions_mod @@ -11,16 +10,7 @@ from . import tasks -async def staggered_race( - coro_fns: typing.Iterable[typing.Callable[[], typing.Awaitable]], - delay: typing.Optional[float], - *, - loop: events.AbstractEventLoop = None, -) -> typing.Tuple[ - typing.Any, - typing.Optional[int], - typing.List[typing.Optional[Exception]] -]: +async def staggered_race(coro_fns, delay, *, loop=None): """Run coroutines with staggered start times and take the first to finish. This method takes an iterable of coroutine functions. The first one is @@ -79,8 +69,11 @@ async def staggered_race( exceptions = [] running_tasks = [] - async def run_one_coro( - previous_failed: typing.Optional[locks.Event]) -> None: + async def run_one_coro(ok_to_start, previous_failed) -> None: + # in eager tasks this waits for the calling task to append this task + # to running_tasks, in regular tasks this wait is a no-op that does + # not yield a future. See gh-124309. + await ok_to_start.wait() # Wait for the previous task to finish, or for delay seconds if previous_failed is not None: with contextlib.suppress(exceptions_mod.TimeoutError): @@ -96,8 +89,12 @@ async def run_one_coro( return # Start task that will run the next coroutine this_failed = locks.Event() - next_task = loop.create_task(run_one_coro(this_failed)) + next_ok_to_start = locks.Event() + next_task = loop.create_task(run_one_coro(next_ok_to_start, this_failed)) running_tasks.append(next_task) + # next_task has been appended to running_tasks so next_task is ok to + # start. + next_ok_to_start.set() assert len(running_tasks) == this_index + 2 # Prepare place to put this coroutine's exceptions if not won exceptions.append(None) @@ -127,8 +124,11 @@ async def run_one_coro( if i != this_index: t.cancel() - first_task = loop.create_task(run_one_coro(None)) + ok_to_start = locks.Event() + first_task = loop.create_task(run_one_coro(ok_to_start, None)) running_tasks.append(first_task) + # first_task has been appended to running_tasks so first_task is ok to start. + ok_to_start.set() try: # Wait for a growing list of tasks to all finish: poor man's version of # curio's TaskGroup or trio's nursery @@ -144,6 +144,7 @@ async def run_one_coro( raise d.exception() return winner_result, winner_index, exceptions finally: + del exceptions # Make sure no tasks are left running if we leave this function for t in running_tasks: t.cancel() diff --git a/Lib/asyncio/taskgroups.py b/Lib/asyncio/taskgroups.py index d264e51f..aada3ffa 100644 --- a/Lib/asyncio/taskgroups.py +++ b/Lib/asyncio/taskgroups.py @@ -66,6 +66,20 @@ async def __aenter__(self): return self async def __aexit__(self, et, exc, tb): + tb = None + try: + return await self._aexit(et, exc) + finally: + # Exceptions are heavy objects that can have object + # cycles (bad for GC); let's not keep a reference to + # a bunch of them. It would be nicer to use a try/finally + # in __aexit__ directly but that introduced some diff noise + self._parent_task = None + self._errors = None + self._base_error = None + exc = None + + async def _aexit(self, et, exc): self._exiting = True if (exc is not None and @@ -126,25 +140,34 @@ async def __aexit__(self, et, exc, tb): assert not self._tasks if self._base_error is not None: - raise self._base_error + try: + raise self._base_error + finally: + exc = None # Propagate CancelledError if there is one, except if there # are other errors -- those have priority. - if propagate_cancellation_error and not self._errors: - raise propagate_cancellation_error + try: + if propagate_cancellation_error and not self._errors: + try: + raise propagate_cancellation_error + finally: + exc = None + finally: + propagate_cancellation_error = None if et is not None and et is not exceptions.CancelledError: self._errors.append(exc) if self._errors: - # Exceptions are heavy objects that can have object - # cycles (bad for GC); let's not keep a reference to - # a bunch of them. try: - me = BaseExceptionGroup('unhandled errors in a TaskGroup', self._errors) - raise me from None + raise BaseExceptionGroup( + 'unhandled errors in a TaskGroup', + self._errors, + ) from None finally: - self._errors = None + exc = None + def create_task(self, coro, *, name=None, context=None): """Create a new task in this group and return it. diff --git a/Lib/bdb.py b/Lib/bdb.py index 564d6c5e..196e6b17 100644 --- a/Lib/bdb.py +++ b/Lib/bdb.py @@ -295,9 +295,10 @@ def _set_caller_tracefunc(self, current_frame): # Issue #13183: pdb skips frames after hitting a breakpoint and running # step commands. # Restore the trace function in the caller (that may not have been set - # for performance reasons) when returning from the current frame. + # for performance reasons) when returning from the current frame, unless + # the caller is the botframe. caller_frame = current_frame.f_back - if caller_frame and not caller_frame.f_trace: + if caller_frame and not caller_frame.f_trace and caller_frame is not self.botframe: caller_frame.f_trace = self.trace_dispatch # Derived classes and clients can call the following methods diff --git a/Lib/calendar.py b/Lib/calendar.py index 97d7cab3..35096484 100644 --- a/Lib/calendar.py +++ b/Lib/calendar.py @@ -28,7 +28,9 @@ error = ValueError # Exceptions raised for bad input -class IllegalMonthError(ValueError): +# This is trick for backward compatibility. Since 3.13, we will raise IllegalMonthError instead of +# IndexError for bad month number(out of 1-12). But we can't remove IndexError for backward compatibility. +class IllegalMonthError(ValueError, IndexError): def __init__(self, month): self.month = month def __str__(self): @@ -158,11 +160,14 @@ def weekday(year, month, day): return Day(datetime.date(year, month, day).weekday()) -def monthrange(year, month): - """Return weekday (0-6 ~ Mon-Sun) and number of days (28-31) for - year, month.""" +def _validate_month(month): if not 1 <= month <= 12: raise IllegalMonthError(month) + +def monthrange(year, month): + """Return weekday of first day of month (0-6 ~ Mon-Sun) + and number of days (28-31) for year, month.""" + _validate_month(month) day1 = weekday(year, month, 1) ndays = mdays[month] + (month == FEBRUARY and isleap(year)) return day1, ndays @@ -370,6 +375,8 @@ def formatmonthname(self, theyear, themonth, width, withyear=True): """ Return a formatted month name. """ + _validate_month(themonth) + s = month_name[themonth] if withyear: s = "%s %r" % (s, theyear) @@ -500,6 +507,7 @@ def formatmonthname(self, theyear, themonth, withyear=True): """ Return a month name as a table row. """ + _validate_month(themonth) if withyear: s = '%s %s' % (month_name[themonth], theyear) else: @@ -781,6 +789,8 @@ def main(args): if options.month is None: optdict["c"] = options.spacing optdict["m"] = options.months + if options.month is not None: + _validate_month(options.month) if options.year is None: result = cal.formatyear(datetime.date.today().year, **optdict) elif options.month is None: diff --git a/Lib/code.py b/Lib/code.py index 2bd5fa3e..cb7dd44b 100644 --- a/Lib/code.py +++ b/Lib/code.py @@ -105,29 +105,21 @@ def showsyntaxerror(self, filename=None): The output is written by self.write(), below. """ - type, value, tb = sys.exc_info() - sys.last_exc = value - sys.last_type = type - sys.last_value = value - sys.last_traceback = tb - if filename and type is SyntaxError: - # Work hard to stuff the correct filename in the exception - try: - msg, (dummy_filename, lineno, offset, line) = value.args - except ValueError: - # Not the format we expect; leave it alone - pass - else: - # Stuff in the right filename - value = SyntaxError(msg, (filename, lineno, offset, line)) - sys.last_exc = sys.last_value = value - if sys.excepthook is sys.__excepthook__: - lines = traceback.format_exception_only(type, value) - self.write(''.join(lines)) - else: - # If someone has set sys.excepthook, we let that take precedence - # over self.write - sys.excepthook(type, value, tb) + try: + typ, value, tb = sys.exc_info() + if filename and typ is SyntaxError: + # Work hard to stuff the correct filename in the exception + try: + msg, (dummy_filename, lineno, offset, line) = value.args + except ValueError: + # Not the format we expect; leave it alone + pass + else: + # Stuff in the right filename + value = SyntaxError(msg, (filename, lineno, offset, line)) + self._showtraceback(typ, value, None) + finally: + typ = value = tb = None def showtraceback(self): """Display the exception that just occurred. @@ -137,19 +129,34 @@ def showtraceback(self): The output is written by self.write(), below. """ - sys.last_type, sys.last_value, last_tb = ei = sys.exc_info() - sys.last_traceback = last_tb - sys.last_exc = ei[1] try: - lines = traceback.format_exception(ei[0], ei[1], last_tb.tb_next) - if sys.excepthook is sys.__excepthook__: - self.write(''.join(lines)) - else: - # If someone has set sys.excepthook, we let that take precedence - # over self.write - sys.excepthook(ei[0], ei[1], last_tb) + typ, value, tb = sys.exc_info() + self._showtraceback(typ, value, tb.tb_next) finally: - last_tb = ei = None + typ = value = tb = None + + def _showtraceback(self, typ, value, tb): + sys.last_type = typ + sys.last_traceback = tb + sys.last_exc = sys.last_value = value = value.with_traceback(tb) + if sys.excepthook is sys.__excepthook__: + lines = traceback.format_exception(typ, value, tb) + self.write(''.join(lines)) + else: + # If someone has set sys.excepthook, we let that take precedence + # over self.write + try: + sys.excepthook(typ, value, tb) + except SystemExit: + raise + except BaseException as e: + e.__context__ = None + e = e.with_traceback(e.__traceback__.tb_next) + print('Error in sys.excepthook:', file=sys.stderr) + sys.__excepthook__(type(e), e, e.__traceback__) + print(file=sys.stderr) + print('Original exception was:', file=sys.stderr) + sys.__excepthook__(typ, value, tb) def write(self, data): """Write a string. diff --git a/Lib/colorsys.py b/Lib/colorsys.py index bc897bd0..e97f9171 100644 --- a/Lib/colorsys.py +++ b/Lib/colorsys.py @@ -24,7 +24,7 @@ __all__ = ["rgb_to_yiq","yiq_to_rgb","rgb_to_hls","hls_to_rgb", "rgb_to_hsv","hsv_to_rgb"] -# Some floating point constants +# Some floating-point constants ONE_THIRD = 1.0/3.0 ONE_SIXTH = 1.0/6.0 diff --git a/Lib/concurrent/futures/__init__.py b/Lib/concurrent/futures/__init__.py index 292e886d..72de617a 100644 --- a/Lib/concurrent/futures/__init__.py +++ b/Lib/concurrent/futures/__init__.py @@ -23,6 +23,7 @@ 'ALL_COMPLETED', 'CancelledError', 'TimeoutError', + 'InvalidStateError', 'BrokenExecutor', 'Future', 'Executor', diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index 0e452883..ff7c17ef 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -68,27 +68,31 @@ class _ThreadWakeup: def __init__(self): self._closed = False + self._lock = threading.Lock() self._reader, self._writer = mp.Pipe(duplex=False) def close(self): - # Please note that we do not take the shutdown lock when + # Please note that we do not take the self._lock when # calling clear() (to avoid deadlocking) so this method can # only be called safely from the same thread as all calls to - # clear() even if you hold the shutdown lock. Otherwise we + # clear() even if you hold the lock. Otherwise we # might try to read from the closed pipe. - if not self._closed: - self._closed = True - self._writer.close() - self._reader.close() + with self._lock: + if not self._closed: + self._closed = True + self._writer.close() + self._reader.close() def wakeup(self): - if not self._closed: - self._writer.send_bytes(b"") + with self._lock: + if not self._closed: + self._writer.send_bytes(b"") def clear(self): - if not self._closed: - while self._reader.poll(): - self._reader.recv_bytes() + if self._closed: + raise RuntimeError('operation on closed _ThreadWakeup') + while self._reader.poll(): + self._reader.recv_bytes() def _python_exit(): @@ -167,10 +171,8 @@ def __init__(self, work_id, fn, args, kwargs): class _SafeQueue(Queue): """Safe Queue set exception to the future object linked to a job""" - def __init__(self, max_size=0, *, ctx, pending_work_items, shutdown_lock, - thread_wakeup): + def __init__(self, max_size=0, *, ctx, pending_work_items, thread_wakeup): self.pending_work_items = pending_work_items - self.shutdown_lock = shutdown_lock self.thread_wakeup = thread_wakeup super().__init__(max_size, ctx=ctx) @@ -179,8 +181,7 @@ def _on_queue_feeder_error(self, e, obj): tb = format_exception(type(e), e, e.__traceback__) e.__cause__ = _RemoteTraceback('\n"""\n{}"""'.format(''.join(tb))) work_item = self.pending_work_items.pop(obj.work_id, None) - with self.shutdown_lock: - self.thread_wakeup.wakeup() + self.thread_wakeup.wakeup() # work_item can be None if another process terminated. In this # case, the executor_manager_thread fails all work_items # with BrokenProcessPool @@ -305,12 +306,10 @@ def __init__(self, executor): # will wake up the queue management thread so that it can terminate # if there is no pending work item. def weakref_cb(_, - thread_wakeup=self.thread_wakeup, - shutdown_lock=self.shutdown_lock): + thread_wakeup=self.thread_wakeup): mp.util.debug('Executor collected: triggering callback for' ' QueueManager wakeup') - with shutdown_lock: - thread_wakeup.wakeup() + thread_wakeup.wakeup() self.executor_reference = weakref.ref(executor, weakref_cb) @@ -438,11 +437,6 @@ def wait_result_broken_or_wakeup(self): elif wakeup_reader in ready: is_broken = False - # No need to hold the _shutdown_lock here because: - # 1. we're the only thread to use the wakeup reader - # 2. we're also the only thread to call thread_wakeup.close() - # 3. we want to avoid a possible deadlock when both reader and writer - # would block (gh-105829) self.thread_wakeup.clear() return result_item, is_broken, cause @@ -740,10 +734,9 @@ def __init__(self, max_workers=None, mp_context=None, # as it could result in a deadlock if a worker process dies with the # _result_queue write lock still acquired. # - # _shutdown_lock must be locked to access _ThreadWakeup.close() and - # .wakeup(). Care must also be taken to not call clear or close from - # more than one thread since _ThreadWakeup.clear() is not protected by - # the _shutdown_lock + # Care must be taken to only call clear and close from the + # executor_manager_thread, since _ThreadWakeup.clear() is not protected + # by a lock. self._executor_manager_thread_wakeup = _ThreadWakeup() # Create communication channels for the executor @@ -754,7 +747,6 @@ def __init__(self, max_workers=None, mp_context=None, self._call_queue = _SafeQueue( max_size=queue_size, ctx=self._mp_context, pending_work_items=self._pending_work_items, - shutdown_lock=self._shutdown_lock, thread_wakeup=self._executor_manager_thread_wakeup) # Killed worker processes can produce spurious "broken pipe" # tracebacks in the queue's own worker thread. But we detect killed diff --git a/Lib/concurrent/futures/thread.py b/Lib/concurrent/futures/thread.py index 3b3a36a5..61dbff8a 100644 --- a/Lib/concurrent/futures/thread.py +++ b/Lib/concurrent/futures/thread.py @@ -41,6 +41,7 @@ def _python_exit(): os.register_at_fork(before=_global_shutdown_lock.acquire, after_in_child=_global_shutdown_lock._at_fork_reinit, after_in_parent=_global_shutdown_lock.release) + os.register_at_fork(after_in_child=_threads_queues.clear) class _WorkItem: diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py index c32a30fb..09a86bd2 100644 --- a/Lib/dataclasses.py +++ b/Lib/dataclasses.py @@ -1176,7 +1176,7 @@ def _get_slots(cls): slots = [] if getattr(cls, '__weakrefoffset__', -1) != 0: slots.append('__weakref__') - if getattr(cls, '__dictrefoffset__', -1) != 0: + if getattr(cls, '__dictoffset__', -1) != 0: slots.append('__dict__') yield from slots case str(slot): diff --git a/Lib/decimal.py b/Lib/decimal.py index d61e374b..4d8e15cb 100644 --- a/Lib/decimal.py +++ b/Lib/decimal.py @@ -1,6 +1,6 @@ -"""Decimal fixed point and floating point arithmetic. +"""Decimal fixed-point and floating-point arithmetic. -This is an implementation of decimal floating point arithmetic based on +This is an implementation of decimal floating-point arithmetic based on the General Decimal Arithmetic Specification: http://speleotrove.com/decimal/decarith.html diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py index ab3c3031..ec2215a5 100644 --- a/Lib/email/_header_value_parser.py +++ b/Lib/email/_header_value_parser.py @@ -92,6 +92,8 @@ ASPECIALS = TSPECIALS | set("*'%") ATTRIBUTE_ENDS = ASPECIALS | WSP EXTENDED_ATTRIBUTE_ENDS = ATTRIBUTE_ENDS - set('%') +NLSET = {'\n', '\r'} +SPECIALSNL = SPECIALS | NLSET def quote_string(value): return '"'+str(value).replace('\\', '\\\\').replace('"', r'\"')+'"' @@ -2802,9 +2804,13 @@ def _refold_parse_tree(parse_tree, *, policy): wrap_as_ew_blocked -= 1 continue tstr = str(part) - if part.token_type == 'ptext' and set(tstr) & SPECIALS: - # Encode if tstr contains special characters. - want_encoding = True + if not want_encoding: + if part.token_type == 'ptext': + # Encode if tstr contains special characters. + want_encoding = not SPECIALSNL.isdisjoint(tstr) + else: + # Encode if tstr contains newlines. + want_encoding = not NLSET.isdisjoint(tstr) try: tstr.encode(encoding) charset = encoding @@ -2988,6 +2994,7 @@ def _fold_as_ew(to_encode, lines, maxlen, last_ew, ew_combine_allowed, charset, excess = len(encoded_word) - remaining_space lines[-1] += encoded_word to_encode = to_encode[len(to_encode_word):] + leading_whitespace = '' if to_encode: lines.append(' ') diff --git a/Lib/email/_policybase.py b/Lib/email/_policybase.py index 2ec54fba..c9f0d743 100644 --- a/Lib/email/_policybase.py +++ b/Lib/email/_policybase.py @@ -157,6 +157,13 @@ class Policy(_PolicyBase, metaclass=abc.ABCMeta): message_factory -- the class to use to create new message objects. If the value is None, the default is Message. + verify_generated_headers + -- if true, the generator verifies that each header + they are properly folded, so that a parser won't + treat it as multiple headers, start-of-body, or + part of another header. + This is a check against custom Header & fold() + implementations. """ raise_on_defect = False @@ -165,6 +172,7 @@ class Policy(_PolicyBase, metaclass=abc.ABCMeta): max_line_length = 78 mangle_from_ = False message_factory = None + verify_generated_headers = True def handle_defect(self, obj, defect): """Based on policy, either raise defect or call register_defect. @@ -294,12 +302,12 @@ def header_source_parse(self, sourcelines): """+ The name is parsed as everything up to the ':' and returned unmodified. The value is determined by stripping leading whitespace off the - remainder of the first line, joining all subsequent lines together, and + remainder of the first line joined with all subsequent lines, and stripping any trailing carriage return or linefeed characters. """ name, value = sourcelines[0].split(':', 1) - value = value.lstrip(' \t') + ''.join(sourcelines[1:]) + value = ''.join((value, *sourcelines[1:])).lstrip(' \t\r\n') return (name, value.rstrip('\r\n')) def header_store_parse(self, name, value): diff --git a/Lib/email/errors.py b/Lib/email/errors.py index 3ad00565..02aa5ece 100644 --- a/Lib/email/errors.py +++ b/Lib/email/errors.py @@ -29,6 +29,10 @@ class CharsetError(MessageError): """An illegal charset was given.""" +class HeaderWriteError(MessageError): + """Error while writing headers.""" + + # These are parsing defects which the parser was able to work around. class MessageDefect(ValueError): """Base class for a message defect.""" diff --git a/Lib/email/generator.py b/Lib/email/generator.py index c8056ad4..47b9df8f 100644 --- a/Lib/email/generator.py +++ b/Lib/email/generator.py @@ -14,12 +14,14 @@ from copy import deepcopy from io import StringIO, BytesIO from email.utils import _has_surrogates +from email.errors import HeaderWriteError UNDERSCORE = '_' NL = '\n' # XXX: no longer used by the code below. NLCRE = re.compile(r'\r\n|\r|\n') fcre = re.compile(r'^From ', re.MULTILINE) +NEWLINE_WITHOUT_FWSP = re.compile(r'\r\n[^ \t]|\r[^ \n\t]|\n[^ \t]') class Generator: @@ -222,7 +224,16 @@ def _dispatch(self, msg): def _write_headers(self, msg): for h, v in msg.raw_items(): - self.write(self.policy.fold(h, v)) + folded = self.policy.fold(h, v) + if self.policy.verify_generated_headers: + linesep = self.policy.linesep + if not folded.endswith(self.policy.linesep): + raise HeaderWriteError( + f'folded header does not end with {linesep!r}: {folded!r}') + if NEWLINE_WITHOUT_FWSP.search(folded.removesuffix(linesep)): + raise HeaderWriteError( + f'folded header contains newline: {folded!r}') + self.write(folded) # A blank line always separates headers from body self.write(self._NL) diff --git a/Lib/email/policy.py b/Lib/email/policy.py index 46b7de5b..6e109b65 100644 --- a/Lib/email/policy.py +++ b/Lib/email/policy.py @@ -119,13 +119,13 @@ def header_source_parse(self, sourcelines): """+ The name is parsed as everything up to the ':' and returned unmodified. The value is determined by stripping leading whitespace off the - remainder of the first line, joining all subsequent lines together, and + remainder of the first line joined with all subsequent lines, and stripping any trailing carriage return or linefeed characters. (This is the same as Compat32). """ name, value = sourcelines[0].split(':', 1) - value = value.lstrip(' \t') + ''.join(sourcelines[1:]) + value = ''.join((value, *sourcelines[1:])).lstrip(' \t\r\n') return (name, value.rstrip('\r\n')) def header_store_parse(self, name, value): diff --git a/Lib/email/utils.py b/Lib/email/utils.py index aa949aa9..e53abc8b 100644 --- a/Lib/email/utils.py +++ b/Lib/email/utils.py @@ -48,6 +48,7 @@ specialsre = re.compile(r'[][\\()<>@,:;".]') escapesre = re.compile(r'[\\"]') + def _has_surrogates(s): """Return True if s may contain surrogate-escaped binary data.""" # This check is based on the fact that unless there are surrogates, utf8 @@ -106,12 +107,127 @@ def formataddr(pair, charset='utf-8'): return address +def _iter_escaped_chars(addr): + pos = 0 + escape = False + for pos, ch in enumerate(addr): + if escape: + yield (pos, '\\' + ch) + escape = False + elif ch == '\\': + escape = True + else: + yield (pos, ch) + if escape: + yield (pos, '\\') + + +def _strip_quoted_realnames(addr): + """Strip real names between quotes.""" + if '"' not in addr: + # Fast path + return addr + + start = 0 + open_pos = None + result = [] + for pos, ch in _iter_escaped_chars(addr): + if ch == '"': + if open_pos is None: + open_pos = pos + else: + if start != open_pos: + result.append(addr[start:open_pos]) + start = pos + 1 + open_pos = None + + if start < len(addr): + result.append(addr[start:]) + + return ''.join(result) -def getaddresses(fieldvalues): - """Return a list of (REALNAME, EMAIL) for each fieldvalue.""" - all = COMMASPACE.join(str(v) for v in fieldvalues) - a = _AddressList(all) - return a.addresslist + +supports_strict_parsing = True + +def getaddresses(fieldvalues, *, strict=True): + """Return a list of (REALNAME, EMAIL) or ('','') for each fieldvalue. + + When parsing fails for a fieldvalue, a 2-tuple of ('', '') is returned in + its place. + + If strict is true, use a strict parser which rejects malformed inputs. + """ + + # If strict is true, if the resulting list of parsed addresses is greater + # than the number of fieldvalues in the input list, a parsing error has + # occurred and consequently a list containing a single empty 2-tuple [('', + # '')] is returned in its place. This is done to avoid invalid output. + # + # Malformed input: getaddresses(['alice@example.com ']) + # Invalid output: [('', 'alice@example.com'), ('', 'bob@example.com')] + # Safe output: [('', '')] + + if not strict: + all = COMMASPACE.join(str(v) for v in fieldvalues) + a = _AddressList(all) + return a.addresslist + + fieldvalues = [str(v) for v in fieldvalues] + fieldvalues = _pre_parse_validation(fieldvalues) + addr = COMMASPACE.join(fieldvalues) + a = _AddressList(addr) + result = _post_parse_validation(a.addresslist) + + # Treat output as invalid if the number of addresses is not equal to the + # expected number of addresses. + n = 0 + for v in fieldvalues: + # When a comma is used in the Real Name part it is not a deliminator. + # So strip those out before counting the commas. + v = _strip_quoted_realnames(v) + # Expected number of addresses: 1 + number of commas + n += 1 + v.count(',') + if len(result) != n: + return [('', '')] + + return result + + +def _check_parenthesis(addr): + # Ignore parenthesis in quoted real names. + addr = _strip_quoted_realnames(addr) + + opens = 0 + for pos, ch in _iter_escaped_chars(addr): + if ch == '(': + opens += 1 + elif ch == ')': + opens -= 1 + if opens < 0: + return False + return (opens == 0) + + +def _pre_parse_validation(email_header_fields): + accepted_values = [] + for v in email_header_fields: + if not _check_parenthesis(v): + v = "('', '')" + accepted_values.append(v) + + return accepted_values + + +def _post_parse_validation(parsed_email_header_tuples): + accepted_values = [] + # The parser would have parsed a correctly formatted domain-literal + # The existence of an [ after parsing indicates a parsing failure + for v in parsed_email_header_tuples: + if '[' in v[1]: + v = ('', '') + accepted_values.append(v) + + return accepted_values def _format_timetuple_and_zone(timetuple, zone): @@ -128,7 +244,7 @@ def formatdate(timeval=None, localtime=False, usegmt=False): Fri, 09 Nov 2001 01:08:47 -0000 - Optional timeval if given is a floating point time value as accepted by + Optional timeval if given is a floating-point time value as accepted by gmtime() and localtime(), otherwise the current time is used. Optional localtime is a flag that when True, interprets timeval, and @@ -205,16 +321,33 @@ def parsedate_to_datetime(data): tzinfo=datetime.timezone(datetime.timedelta(seconds=tz))) -def parseaddr(addr): +def parseaddr(addr, *, strict=True): """ Parse addr into its constituent realname and email address parts. Return a tuple of realname and email address, unless the parse fails, in which case return a 2-tuple of ('', ''). + + If strict is True, use a strict parser which rejects malformed inputs. """ - addrs = _AddressList(addr).addresslist - if not addrs: - return '', '' + if not strict: + addrs = _AddressList(addr).addresslist + if not addrs: + return ('', '') + return addrs[0] + + if isinstance(addr, list): + addr = addr[0] + + if not isinstance(addr, str): + return ('', '') + + addr = _pre_parse_validation([addr])[0] + addrs = _post_parse_validation(_AddressList(addr).addresslist) + + if not addrs or len(addrs) > 1: + return ('', '') + return addrs[0] diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py index 2ac872c2..35d04d2f 100644 --- a/Lib/ensurepip/__init__.py +++ b/Lib/ensurepip/__init__.py @@ -10,7 +10,7 @@ __all__ = ["version", "bootstrap"] _PACKAGE_NAMES = ('pip',) -_PIP_VERSION = "24.0" +_PIP_VERSION = "24.3.1" _PROJECTS = [ ("pip", _PIP_VERSION, "py3"), ] diff --git a/Lib/ensurepip/_bundled/pip-24.0-py3-none-any.whl b/Lib/ensurepip/_bundled/pip-24.0-py3-none-any.whl deleted file mode 100644 index 2e6aa9d2cb99232f70d3ffcd0ed8e0b8a730e3ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2110226 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 z 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

QJQ+h3JrzAAd z=lm6?Fy^6y?2d>!s1n+V6}s$N0-tGNmFmAICsAq{v4@Jqos2K$wV0i<8e@#@EYVYBROWbYy=-C zHgd4!UPB{3f}*rznF$GJeAx~|jiw}3!gZ)lO~1;PMPG?pkm-(NvvX0H9cWZ#U~Fk; znV1!QD%Q^qN;_UdMr->zV!I^!JONVn7JSd%eb=fm#f3`u{vB#B) z25`h&tgNa?uxSf7W2j8dH*L|YMZ`eI$WTJZ)OMW} z3Fq!<4mH=Q=C);fB_eXVM_5Qv1S3(q$WrJ@Q`%9*$wATA=jr#llc=5AxU6h)Ztr@u zh~U%$bF1swuHv>B1tw&bT?FECW_85OGm#W7FZZ@tfjw9Apb1#elzShg9P3e&7E$mlqwO#6@Eo~|Ro9%Pc*mOatw{k-B6dTzQ#BjFDzvls>gOW|Dng!Bmxg6Q(I`Yzxuzz#iIv6_!k|3{40-zw%$`hufPk(N4P=2)i5YQ;KGAa%4nrihGYUdF zZBRWZJ7?f_j3BlHcCsZ6JV$4JO+sNF8`R-G^{8C@67g4&8Q~TS@x?vZzPdV^z?!|G z8S7@09yAQ9&Az1G*W;KdQWkT{H0PCD-k@6XQub{(HPf*lwgr}N7l(xsdj9gXo*%9$ z5#iGwu9#Jv4n7K^@V>U^Z%+^TxO1{ZfI_wOYp}`S`SsYy9c^4WH)U=ogR0o-n$h}> zAcq3i<>`4k)=~+SZDjtT;+rbe0#4-Api>SpcU9J%&c1~4?}y`qp%z-_{B^`RcNVuR znMC}o4%%3Lbrm2^F2_aHf#Nz}y5|<;Om($CX6ifD95B~CKi?=@^Rk#fT`y-|v zfnLPp$5%7&3{nS_(t^Aqu8H*oXQc=(!2)0rt5*m;L`DT0VhWyS(_Hc5faW=s?XHc! zY*;7NgI@w8nRYU!e?Wq#fj%l}+cP-zlQ+|9^4AT!-Bc%GMFGV=W&aTzKN5L8F1=@a zR_%5G2YmT5PjoId6On58`j|(E4sR=i8dHQwm{YL1lY~Ov7SyQOXXbp5OXnJAr<;|q zVW?#hyCt57F+c4ns@ESnk3vcN8D?b^a=m7{YOZsqmN4eMFh#+Myb-AZFT~E+I+lF{ z*4?5FZEN`U#eCu@-%bU>rky6WC9Rb$spIeIXZO7(4V;lTRpICIA@>{~UcaC4CY#s69SNSoS;+*S#}mub|}P?!Q18&qFju}{cN%HKCa=C7IeUDt)ldhDv6OvfsZr9 zhMLWVCq7201+{CUF^)G^2;z#4P|m@N`C;L6`2DWMV(RnbQjwVmX^!>Y;h{ix{u)O2-jMbvp0p3jGX4v8|<(}6% z5}=`%vXHq03G_9kIHG4&EOq>B%1O0=hnq6vB=_S`Wbk`b*RNbk}l(=C(lQKNxIIc7$%{d zAStqMazMaSx=C8P#4;&8Y(v)A%mIy9>9w~e@I5C&HeuvDRu61h)35 zTbD~*Rg4}4Z=?|6Afj=y&ACeb$5`Dqk73vG0H(ic-T0d5DUDAJw~4ZiP-O;ZY(&oo zZHPU=g(7K+PS0twvQkO?V?p5mr#}D5NLkC9KZpzSA65ku3unX`zXoBqTLNkQ& zmYJl*60!BM>Zvf;WF z0aZl|T8NF-B1-EU4&8Fc_vAi#07A!+3cAGgDSR`c`>sUleTSbQKt#kr@zB|U{cc`N zzH8|ZQD@;D`9Vs@-?)2BGaFB8gHJXlNbk;D-awQMOW+{r(J15(EF5Fao{h>iH02raq+ z7_OYB(b+$;8R32C_y|%C-h(5O-TCf8X@=ab1C%Y*V8+f{3!pYNQBPco*!d5?Lb6B< zHp~VNH$XcsVFd}Vkj5#`s2^pXd0V&v=d#uzfLwrdxA~n6hMH>#Yex$QPx=z*#Ozi> z`mD|3Aqi6M0!7^UgV7KTmHeWw#9rE?c1V!mnYj~+k;#$v^oNdKmngU#AHF3Mi}y*7 z!>#Bz{Mi9^K%P8c3(k7j190(2+b20wV11o$!?Wj8 z{WrW{gHlbLl4D{1t<3(rl-TyWfqUOLG_dy= zT=|pu4ca`}*r{EgE|?4#QcWM)Fn;kIuX~lsDIa zA0*w_uT{3z!3IXI%Qn0OkK7HCj1hOxD|X{laZeO(8r8H8X0a>L-fF6p_v`QY4c`FJ z3|rb5Aj0ua%DC<4=+b!qg36ehIMdD%5)nVox8hZBBEH0)&}%#%=>PLX%ecW0+WzH0 zLg4?mE%pEZL^C!twlMu2voo01zai#_E`QL15hA5EHMcf*j{fpjg<~goP&CW>iJdf^ z{BbnfsuW4pNQ)BIM z+(aYYl9Z#F+fNo6th!fSFTHa^1NUC^C*@~$l~NhW!J~t#>V@~3I^Fv=b>qibb;4cwt7l+=@k?G z`4)zq@|kFK>nwEbjp~fMxZshH9a|h0TlY5%b$6x=lvkr@8yZ=pggcL9;e<&el~T#N zX6L5Uke)^Eg3sVSJp_=~H-XB8I;(KYfLrIm_;{pIIPDpzHeslTP`>)iB8A4x^JI*v zC#$)-wx_{!sr6*dgx>d$n|aYjBD80g(tL;m8j275Sn?Z8=0@foqqA&*)v|*CQEcq(?Y+yjqN_)) zZIfz!6q$O>EK^C9#Kp=z8sgTkkh=hor?q`_;?%i=lpVtnS`kE6n6PAeo?SxgqXVw? zwt^9A(E%s3V-A6WEtLTvB6qiRY)yL)tq?bL(J)p(65u;dL^~jAJpu`X?Evv~f{-tn zH9M1xn9W5(LrC#X_FzVIMDAjv3p3eq}WW~{4T8NE|T?FgOYho#h#s$ zL?h22A|5Bmocxm6^=k=uR6A)r(7+SK+YeopA$5(oN_Xr19U>Za;X0(eJ@WKf zNZt{6?05GTu}Ju>d&%2h-6ZtUahS;O>g0_Mv{4(h8WYw34m#2^K!6q!eoLP2n=1r) zplv!A>DhFPXgFUDP99bUR+gqhN$;}JO2dh|O;Pi;Fd2_qVlhvNZ6}sjdF!L29g7uh zhmAgPvDxuW+jHl-YT8$^OQRmiTcnPO1*J*Ys@WTG1fu;n>W*H;Wp7)I~DRl=|F3N8Bu|u zCUSbESy4DHZ1))jNYx@x`Ixz%Mc^byHmQXis#7xB#Oi0h3Wt4Q{`p5vEk5+%Hbn&o zDRXQMVIBhxG8{PNCyG{lEpxQ9aUm>E4kx|!V99_O>0R;R2J)Dg>Kp3NrrM2w1-N&+GGZNh{p`2P1df2WC5Uly|Gm zLm^wM9VswYQJ4=XCGlu~WG-?s1|gV>3|gRNBjR&Bmrjzihdgn}Eh&%L_$3uCDf< zJc@EKW+%^vnsDZ+2GID`q6~kg1U64RJjj6%7l$X1Azv2eY|Y_SGvLWhGqULSq?LX# z7D9w$4RlF8B%SdEmqO(0g!chkYSfst^24lIo_-r|+aTOW2h{9u3y#7A`cg4I=rzEs44=>OLGa0z1meQ73}$AhNUR;#Z+=G@1h?+t;#>7vaBbOdg#498p!R@vt<+X?@ z5Six9!Q-^6WiaOnP^X%-&91)uycP#MJ%z*j4F4fN6a-akIFNEL%vK4lF!kJbF8!7Y z>!jO`I|z$A_goC(qG4psQ`k?wDGQ^Pvi^KsW$)Go+tTp)H9(wRzJh>OkRWj4M`H)3 z`h7=s-r^L1Lc?2tHM2Q$*m1PjfQhd&;sv|e%||OrRCr+Dl+1=Us`N&}D0IOe64OhH ziBl}loNW;$bctEm-~G=cv*LT4SM}_QeLuS`4rcDpSEc4+4_7gX5q|FDcLSTJ@*!r- zWonqW&0eTDeA(ls&w9?LTa>^P>rusic-qnXPy^y}4L3z#B!4(QZ~CWl3Gl^O`VjoV zGk1raDw!p2LjvT)tOT(XG1Q#Y?(EU5?mBBRq;Ba}`Ld`@6uL5*@3}ic+F9BaJ^l}y zX~)rm{ohBzsRn&rHWsWIJOZ}+kzr#F?|wJp-vl|IH^uEG?RDuC4&M|}&3*aUTRkn8 z7o6$16(`bgD=7WxFb(abEtD^N9YM*Bq~J^A>UEswU>b)a`RxQ>PVT*~ix1h6H{wwt*i$8 zRlP~RJ7faclfcdd7H~DCArxryeu^M=sJF?KGJjnXMGy}7%ThmM1CN-2QP}jKe#yo> zto7Acq^?geSN}7_Dp^Jnr2HZ*@rCX<{Yh`K4kYrH6hn$2_e{ia$?Ad}9Et2*W7lr& zRP#*p{Uze%dz(1sRwop|5ka(2o&anb!X+pNaUST)^LEtOp}C6cs`vBr1BZwf^s&ax zY%?E!tp}xpu`6DI+}81(VxztuV?%*za1FE|&44&-_5^T^rO%;h{#?7weD~3;z5n9i z^gTV=mHo9lzxk%*ZDTSk$O=gk{n6o=fgHFCn@Q5)va1{?Ob4^oPTD=^i zEK7ZfYy|M_={WG}K39&niYsK%r`vWsQoHqE zTDy@|@HXoGDfSDh?Kn+9B}@W3OxW4-)m`Oxc+!bz&ISIziR6)V0!Soiw2`Q~)RaOx zXI*RBjUsb*n;iLm{sj;{5-hvP4@{;!#>&ZDlFhOOT~;xg`$mD9CC-U{k-BJ?n3Ap3 z{wLS$C!@f=INvwLLvK2RQ;Jc<67ZWLQ$VU!4_0B#p_hn95^FhW9j*HAb;5l4oQPM- z6?moRd8IeR;{GXLEFXV-Qu9S|y-;6t1DejmE;qyfk%N}sWi56mF`u0BZkX`eQX{mT z!$y0RuK7yl56yG(el5?zsoX-jfj`15mKFr66Zq}4)vUe^psyPD!Y#goMK@Bywh!Nq| zdB&1FIeGWrOGvCP+nQZMmptCN-5n#2UJQ{&m^12skeAFmCMG{O7)pXjR4EOCh8nrS zCz&oEe?4}dJp3hp&V=9`V^d1w{uxPpNDqm_XF7|6xOkUDN#LNsBzwPQL?eux24MnK zNv4VZlQiMd@Yi_a_Zo=Ic#t-%P1Tc3zBRDFvo*4uwf)7{l}lG=#}@z{W(YHj0(3RZ z3p>P{?_?=KDs3b%p>q>5r%ClHUO`b=YXF8?-G7b*XuoA|1DDh+-!hx{W#LHS1=V++lg(=JQ9KC(yH>a_+Cu3!EFLoNt5Pz|QUPS-*k3IQcfm?Vwx zRj<_v?k=^Lj$@YVih_31u~81o2P^X{ngU12D=xB4C&8ib8%Ml3jPuIrr)^SxasRC zXN;uyDYf`FUFR?0MOC-3-b%(yLDVTk7$M>VvYMkfaL*&1%oqLoxw;0-lO-=6y^4?2 z>EjB2-P&1drJ?zRX0w8M)J9C-gCXdN1=4-wg!j^TFre6)7p*@Qe~h(m4bVH3<-&s1 zLvwGcv+NOV*npksPGDDAmn*~!e$-ck)H>Wmw%CL)Vr%L5o_OW+51FO-2ADYQ(}m)- z9Oyxpa|1nw`JJBYCU-FaD;kfXxylLE1nxHq=gPr_Ab1X!>L%`zk3RL{KLdul1i^C4 zN)FZNj!Bx`)pinpXpM17w`(VaB*<;WaS&LSAG)+E;LQc#I3x2dj)Uc+r&}0#q}#wz z`1DWd-?vZwXHOnG-fZ*)`ShSL?CNj!JHp8GxBM`|=N8t^hj>*v}Q zA(v_$VTls#Rx?6v6t5XpuX%^c;n?mLR`=v29b+uRrkYqPE4URsD?`nnoz^tGB|SOT z8fdphQ~IAZ24AN(+O2FWP58};(w2I;`WiQ+R$3YPmOF~m3AYy_t>Ds*51}#KY$J-a z(4O5?a!spVELL74)s>kh4fSV;C@g&Rv;jnf-VuIRK%Il?##Prp=uMSZ4YAV>VF^Mr zwYVcmv3k2qS5)!T`dKVbLH%Y+J?5PHf1Ap2Su>k$1TQQ`+cEEydu#tC`7@#fvx{J* zbGEnC&ar~_DKA(RIugUZUn7_%ubGnP1IC&%+b=H_vF*ytge4<-jXNm_;xNg&#&w>Y ztTbnmTRzgO%CTy%Z6T4XFU;r{Z9}yYwua7BOndmWo1{%$B->#A!~ihmXLJ9_mfU3B zOrJgb#i;wpF-0&D5~`Xn+xcT-mw160@W7nag^ZXHJLtExmmK|kTPyT${Tmq> z008;_G@$LwEX`e=3|%bk?S5B=9xPq^te-QZ_@PYtDbG|U z8qK6++7z!dE3T+gp_-fh`_pXEu2}_-I$uwHJ0(0!=cFor)mZ7QSUMsyr0R)E?y2bv zd3)%ZFjl2**s12UE#+QR(R2DheBYgqnX@Pr%&G}c6IUb^mKJ$g`%9C<+C-8 z0@`SC5Hhe=(S@>5<$r8i+Gp#TD>sJm@X1Pktxec>ypoYD6eq~; zs#m_wF+>F5s<#T+%^TM^x3W1{RK4G1JA7lJ_b9^Ry0V-EnRt>&Tis*~(4FsYn3#N? zOFrSklu;e6Lb-=EidyiVJu7)l0P*)R&oaY~Q$e>3R2bY2x*@18x91RYK#!IB$c%N( z-mE$RBSX2k-fK*=v-VN@#<)pAqSP3MVE#!))hEZ^DOVO2GxtQ`6y}?p06$OR0cn_+ zqrO)R2zh#gyjIbUF%{E-e$`X!F=prFIS$j)SkR8e1M0rE-Sk9=CL$)#S}Le}^iSHu z_*>-$R~V*M@%Znn1K=AOeV_sG0TH4hKjtXw=PZ0wMUF*OOby2rNHIrv44I}4*daeH z)KL4pqFm6gj^cS|Pa1f{3*FoWoNC90;{zU;l^U)_`huu4cDv-OiXj9DQm+VhZ81nX z%Fvg`+Gx<#S-bo-gB^?t-QkN|&z-n|C5VkNLdX;5fxVxM7HV2U)M|AB*d?=_5-QQu zKKqK}6x`!ob<{oJ(uSHqp7_~1 zzVn1861IIOlf7bxiXJSiL3(?|nnKe44jVS->i6p_`0@uc;mkU3Htjo~(@a_A*61&r zU>=V@GKO@+5rjq1NLw0Ppjgu%ja1rZr^d)C(M+|#K&8^NDYbdw{)EZRZF{#hf$3cif!d z$m!m8Dy@yxl%rRKze|2k#A-ZXEoo4XNcXg~@`p?GtKGAjI2 z84lg2##zbOCq`XeU8Hp|Shr%eBM}MsA@l4fCV5dudKG@>Z`&->s>GuD#`bW{aBUT4 zBUOo-u+g!y{dB5uccOOAXH;S3DZB#mF;<&?m2ZHmLq)L$-^*9D0C`8%nuwLReBMM!>1z}3SGKYtQstqj(Z@gUI>-Avm4zuiW<#QM1 zyFageTadw2ut1mL6#O!56`D8I#{LB7C2c*@K^}b5X&guUBN6yD&H17oh77G=MVUGg zCH3qK*at6=L))8bvOjPGvQJF(l&q(Zz{PIJi3&=r$?XopV!cJxzT zQq?!~+8+vaT`;^49w&$pSUW`^$QbouC z_w44>giusHFDxdJW6E!om@X|s|C&8*Ga697ZrON+|OgnT5A-Kd`v(bWOxx~ z-Qm}jZDB33tu9OHgC48N3bQC;702WXYZ$N=%f(*h-2lA|dvPeZs7DG&myy&Y(CIs2 zFpL5M=r0BH3F5PvgXfJ+PqFqZMV0OtytK=X&aR3}B^Xw^cT6rjjHc0`-t72OMCj97 zswPmx7Fm@&yRk1q7$0k_%U;>m6GZz&e<|+*f>=>ec>BiS2krXBjNO7;`~JLi(aIQ= z6?jTsvM@!EF3*ra;2!!XoM-0)(d=@SIHk9k!Q)dl^Re7o&sKtsJs8-@*N+ z|F;bPb=wKF?l^~I9qROmfUy^!bh#`h17SKqMd5;@3@kKz z(@{*g@q6?M%upsn0{4d&Ud4_fI+kb-#Z(m?jM2F`GU=~{n{JQjQE-s47%E^@!u}E$bcMnQ`7L3L9pm1Wc`6$014G2- z;apALCJ?{1cjkKzEFj=#%A#wx17#Vw{!wo?w^16v&W>BJUiNo=Fp)K@^49fZK zdbW<;1|IC+ql05Ir}?8Et!$OG`)9>^&bwlsF&`PT#6 zAOa@#3V-s;2a+xPZisUmp*5#q>0Tj}V-re2Z8_*JCnyTDLOS|FGQhuwjESQp8XE_! z@#eU+vN&K}$`<|hEwytaX+H!Cz43mc&uGuBqlbiA-impym3a^s-1g23;!`fMalG#c z&_HX9SLh7e%a;5Q!a<%XF?Q)0AE6?%(7+>d5LJ%*l|x{ypWjdFxt zrs8(krGh|l0Ms=zZJhMY{axUKKljP3`N-Mx)j7bU=jifwf{QlF!TBM7gSW9i9!8F+ zo`60IbQc0P?D-GDyt$%3ifjgM*5*vWm~pb-U$Vm0TEPfT^sd~Ek8WICIYF;n-v#-x z%f1Wc|zp>1Sb8ldo4(6Nb^qUVaj3l2-)NuL)M-g ze?1wfits-Z9XXFO%@e|)>h5%r-)I%mZy)#R3U=(+r~|-igYB@bm+@Lzi1DPDN&aUF z=)9KYIg9lSRvCo2&floAaYLy6-B6_XNv&nAj`(11QPTHY}*Oo@phiL^!Fr$<%`0>%c!) z()qP?z#FRh!AxBLY?-d^W{uxa&H9EESf6vMJ9_cq;S^EJ?50Mds@5o>KNz#cJ zrXEXKy#08ahuCQLK#;o?PMrhWOIP3sG{>XsU@AriytE%h;VZdTzl|#7eFaj(-UaSj z_BVUy`?(_$Myxu39v+MGW-GCjG%H;ohrEXYY7u6IwV3X6x$Da}#N-DS818Yf%Gh=k z?Cf3%)FXFqGAvnh)Z@(f{l=mFJbitWMO#zWU!pR`QO@oU8EeC^)tH8WfTKpXzza;a z?pAS(&tuD7Z;UDLB3nV6psId>(*@CQIQf`4!5%sZt`Lhj6t!1cQkGL#a+a+cG*Wtq zJxPC_0EwALVo?{wXd`ts4F8%Q?}$H$w)(UX+?~ZcFQ_re?*2vfEJ`93l$&E22vx}^ zFrHELwf=SGc?jgnPpC_pO_Wxt{kA^D^Nrz7-BV1{F_~m`Jl@eOaSD1V>_hk|6f0z7 z-aLk6k_%(6a2pok zDG9BJfu!u-jj)1uRDwoJAikVuMVlsaFUBXZ*y>GS21=fDnBqaCgt()A2f`U2)mr|E zq{sj*=$aENfrdfj!(JVtI!;0=@T2420-*b=H1KtCcafv^6N75xsN{1{(?X?7sgP*a zA#eAW06zLPI2i3wtXl2c2MkLjva}MASsdlNLbkd+P}+H&ped0jB!S2YD3Up8Kn9UB z%HlAMG(*k(y<+idr8M}54RyVvk>8W%|G>H>#z(0k&6fS7JEl6&%%MvH4accQ?`>m-|qNQh}{N2SgrD3v`Hv-#&KxznMHrRH#cHjlU%ecnKO3bu-n zAhkB7ll;5?@>!Fu-}5!7DV>oj79g#`A})|0wVU~vow~n7Nol0x5q~@oD@Jk`YsI=K zR^^K}5TGi({C;U|uJH^Jz1p7RRCKQqoWKP8j#*@1eam2c?wuaQ8_m2DO`#KPmiPtt zk1P#58V&wDiZtH4z+xVu#a!V9$_BvHu?0FA%O9c*^kM*X(I@yI&uY~;xa_aVX$LlV z%nm%CV+jTka7T(a?2$RNrS&E=ixNnRhAzA1T`us-7Y7Ivr3rRl?bU7=1dEP^D;ev! zqJW(#${G*}X-49^^hn48bZ^t5+U#9P*rPuiCnX9AqrfU|{9xvgz!(Am+^s56`YG#A ztxdQXlhkn{%CB)~ATKDd!YUrloT2tr((P?a&ZRgQ?n3p60F$)x+B-KflwQ3vm03qz>iGuWn1zzu?ah= z4kRw@1VxGfIEr-WVeDLX7iwyo4mBIAt2HJu@diy4cKR87$l`@$%GDLxXGFzGx>anF z_S)L=1hWlbnFAJlt-N=MPgqh4P9TIxao#=mkX(^7Tg)HOO(!H z-wnBl(*un^Lu_Y#{_j4|TkkVgg(mRGL@Eo8-y4QHxS6F=470gsLEYIblQyZkb$b^7 zi?DO-4lN9_bZpzUlN;N%ZQHhSW81cE+qQ9IJCmMS{h@o!^!$fYRr@`)>)Bk>vOta% zuZ|UC&fz)7M=xYLV$d-`m!co(!8229GMpH~*wYg=q&{IGl6wbd zl!1{nqeS&By!}qZf?ribAEx_NX#GtAfl;&M*RU#W*6j_A4fMMZ7#{1pt2tvrf-Cda z8QYEx%LB#zfkGtz zWgdCR#>St&*X?L(w*3eaBen4Qcl0R^zP+Y(b8}6l9ucJZdtEl{K&{EKB9YC*A9d57 z0VBMzcUYldv~FPy9bs`gFeAd|tY364_j%o%)M`E?Qsf#89Y)~~leGZo4++{O=j^Z( z@zkpUiJT-qL5-TpdIYH$?0nmKy=YLFZ_fsO(#z7r+_94D8AKA??0{AZxQxJN;XQmD z6$#JWU#E)J?RFv z))RANDY)=)k?0vO5qRfuXhu>B?uVA49D%qPap*oH&07L<9@-o_jJEqw^z%0xn;dXo zmjSaqQdkO*yNR?K-WWVX(i_TZ#d)+iD`P}C<6C(gtO+&a{vNOkt7FJ%%N#GYchZ#x zFhz+mH1U6@qS#!7&+m#v&pQGdov-xPOMaQLPN_csQKrn&Z*`3s0P?S;1Y`P`ga0EH z-pnRn*K!mzdlG9PWUY0EWsm!zN1tQ^3{R+a#VblgEp_pxIQ`F3werr+J3fW@spwh8 z{Vo}s?yTNo!({WF5z_wg8OOQOc(>S0>K;lKe-=Y6zpU`G!tSbFiph$7E({e-*c;H3 zO}dexP;|yQ;%!VBdY>_yJ|Po#3p}(ndSg2tdq&fZs}-(+eqxMyGZETiuy(Y-AEPC% zengJdzrj%q)B!s@4^zJ0 zh*lT|3K)PQpTeCNNklYu$E9C|a|+WPJGX~fy75qYJ{dKwz^-)s4Vm6E$f)KN16}q{ z06PL;RV}O?bOh#gIy_qsIhFijH7p)%&uk_!?sYam=Ei3Cn;3w1A{c3SD)Dm_Pgaq1 z<1su=u%KW+gF1QF)c(J}`)g6l!wOTauirn_b_Ca`wEVLh%LbM?40pMyep|Y_yV{En za*wN<^yq4-0AMd>ez~IEu}IneT)kfp7oGBd0+AWSe6Po@Zg4EX(!S3}tI$)g)1dV^ zJACyI-iG)#W5rI*XIoQl9|m{-t7^IcRULf)T@$VTVrTv@e5U_gSQ^{8*;?Bf82<{V zVs)+GB@v46ODzF6N+O`vCSE9@04j_)n?64yiqvW~>1-xnOEB9aY9 zH4ktEZ4R_Yk5ln$kLm_eev1}e>z^GSsz00N&Eyp=EQ?^`>OXzLzyYS4SfoV9v}~>` zh?csiNm9_7O!29KVmXd_`GPe?9D`}_I0~k-IsTd@t@;+*8`%k`#w^|?#Tz&2RRyK8kKpY;FW1+xA0L#6DnX{-OK%iQrtlZJdRuxxn=&e)LNE(tSo^7dH{{}+G*aiGMFm zhi($Za~|YR>bZ<{T*HEP&Zw6Aw96{dNm3Vo_D zVz6R`A6*RsQI-yn0q6EZ@X?bu1gU{wg(2o<;F&lojKi3d{hV01@Dv9?(-_QRIoFtq-D+-W`comyh8vwsc8Wc`aKX)#~I*(4l(Sa?C)PNbC zWt>~#9C#tHNxtT|l!uP!ulm2Q>iKpW-uw&cgj>u0%3wdyvi9T$z9*YPlAUZ_e#E){ zqo?w4JU;<-3c}SLsc`08Rp;fMnE$Ux%sQqtZIn}1?&-3>0eErDNpPTI7|Q@Uw3KZ(afNyY)Pjk6x@)OPh$*(YpC#s{wylL8wb=011VpSVD}%GXAeGv@>WB$Jum>qTj4MyD2EoG?4iLt zL_>f3abc#6p|y{8f=f`)Al#THPY?sKkLBU2n9&B$o_Zv(V^($COqEqDJIp34ABPin z{KNa;p)rjMhi?8?T4^`{z0W)7{aCDmeimvOE3Q=|WlewiAh&m@!;!C1Tnx55eWyHp zgb1+3LAZo$-q|^iDMBO@Ho7(j6)xmr;X?+fZe$j9q-JT58^AR1J;H9q;8hc{M92@hd` zkO>b}_V!kg5X6oM!gqx|B&!AbhV4jwJd6ch@rSe?7(9KU9oTBGd;g@TN9(G&6%J1w z4XpV)0rr&~u~1}O?^uZHgvSV0ZnaW^@ z_Y>VP>4_fS5)SFG!6HcdE%Ob2QZM-bb#mk)T)-mzUNsp1qRk2Z-}@_5M-vmz|1bep ztNx#xh8sNt5kX0j%)`TKB60Kf#5jbPIvn~*D#rv1tCjlb(erJ`t)H2-m_?GSNS+kl zrsmTRw!?J9?D-W&@1f4CXNI}0Ld1(W3cjT?8oMppHrNl1JS`DA zVrd1)<31|7s9&<_oHMNjy5>IeUy*6V3Q;#)HJgNvh|yBvIfqqZ$Yy_uqv!4E>3^G> zRzw^A$Ngc3c7Welhkr}0h`N!HpzkN_Q`_d76_=7d*!L`(Ee&R=xG!{DP@hNC`KvB; z=juYyST=oUEvt`hhtG`qpHw~8qL9@|!p8P=8*kLVuR?vkra8-P_EDyUL6N6! z&USs2PtL21@&7n-e>6e49bnRloGT3O>VhU1jl}1s*{H85YF3wdfqy@KLl7he5C#GU ziaH8Ellik7)8PAp|ItVZ*=_Cq!vk1O;iM=y3G+4x&+8SL^t}!ZjY|<`U28L{gE$?n zy#OlK>@1^)|4EK5_xviG6X;i&(^~ zjKXm{1Dt7g+kd6oeZO8X71WFu9o6Z=e6TpO*@ESK0^x|C@DinJAG)Q7{z$@&k7gF& zeFRZsH@)qpejYDbP`DRN=q2myKb&Rb6JzzYE|HKbkc%`H^?49wkqxqf_JWkwaf#e~0 zEg%YjkG|Ae6QsterPovhG1sri(f7oYUjJ7XLP`sXjFwuw7No0+6;#;6c`{%C-x!i> zvjV%Y+<&oiq-S&TPF^_rO!YTwdJe^b?b03_D;u2iO@)>Q-hg60<4?K-?+aznZ) z$EdKBh&i%phrk=w)^y&3W#mrNR(}$H)rGNNfPDo-(ftK)UpB|M-1 zt)KLcee50nTIWiCt#f$)?|x!#;AH;WO?*@otTq`CepM(!XdrCNno}BdvGKpWrZ{Jx z^GNy2#%h%mZV6kpk?#-L2Ha7L&aSnEZJ(Zxp3W$9E*l(+Hk+a~F++AqomIi*#rd9% zGNumF4kuhTv@!Fx(}uA56J0Ktbeh$H4s!gT6R#!?=~bnn9g`v;$g(6j23baa-E< zfv%B;#Jltw;=o?^m_cMaL^KF^AVi)0%q7s&qQhb2+IhoBQEuSqz#rTd$fCW-%Ya8T z$$KJgA=OF*I+RfC*JWs6S_(4>QWAtxiSoN1;OkdiL4G7C%vAMP!ra>ht)KafCw|9Ui1TXqtn96-wkj6O#U^qxYl75Ke2pm4C?M+|^QdBIdT%ffYh2Y= zu&#q{=eLG&G&$vBfkh!AUGOApnK*#j$J}1V>L!bJEi~+jNpWdE%lrh9obv(3 z?A}Z|NZ3Et6qYa}(SI8@&U&PHO{8WPHRu*A36w-d=T{Ct&DKI#az3Z{)XngM;@J5c zV+x2QJNxb8j~sZj`!UcoY5J3c{^$iVP8Ptl?UWfj76zG+G3F)|hIIy^H$*rch6=bR zj^7dV4!)-A{KyXy9KZUSDgeW$Oykc&JeZbHpOg}EFy@vyu}722SkXjsuiM41fRytD zLZ9|A^TJyharw8GcS|Z5^}=Tk3e8(I2M_0Q$s1+Vua8phyKYeY;Q%Dh{U$04Og+lZ z;BGe{_jHYAHD)>}mTKX_y6Q~e5)VA|XLdxag8js6kXtzWZ{-m&n8bYn2moOHJ97W0 z@-VTs|1A#}rT&=AUt{S5DscrBfr-Mbf*bw3Wc8BPhHe1_hXFvVey35RhVs)c7ub|w z($lcI-OfYiX+FtzAnOc714IK$2F@pnOc*N_&xt3o3Tm9)LWeoXUuF%uWFf_Zak}WK znE^xJc^hhFM2L^OSG-})ea^`uAe%fK-^-WTut6TE9^Ev0? zDG-vyoNJ;z)X}^A6}7TLDAvah9y zUA=jp1{-b{_9#?!AQ#Gp^^~o=hIU?TCY_)HsJY%bV*k#P1_qJsb34x!{kTN)5ipf0sUu%>fk-nS#)09h~X#vFmw&MoCV&!CG! zGF-4|_O@bW?9msFJy>C|O5=;H!ffKH=iiUI2ksWf|8-&sY1xa&j|J|Zo4&K7+^V3y za!&PckmmmrpH^ZqYVht zs{heJ2<#or4A5Y9SK{O)HwkqYclu!-7rY^R|M{=mLgzuhS!BfS${-u!S^ayh z{S~Jp@ux7|Oc!-e)7I%RyFWJBlisWgn+Ly!wuIo+Kkf-_U);5Psq;{KIb4As!{;ROQ^`~ z+u7ymiArpBcXozXM~~i7Gru7YBQruRn3N>svhCYI@*V0ht0V%5` zH+YXo3|}B2k1dF-eedEAzItMz)JEn5X@v47>_szeIVw7!$AsPWfuRf6THiYa5#NZnS8N$E*mc4!=H$sX6z`77 zxy+Zdz&{Oe10z{9%q~Zb;jI9Y-Gq%Q`Z3Q@cP-9DEUfaJ^A;)H;!s2TQW_YwwiJU0 zuZp5G8;8Lxw^-mFKX| zGAqx9xK@NZRC-O^%Mind5FyjY2YAq6={Q2!{2F!q1XKz<5M>G#JVa9nZ_CI6TIz&PcJ7|E0+OqcbASI?8LHd7U6U-3?jz< zj3o?c+>)zy>hO64cU9PeZLq3rfK%d#KO*yZSme+3WOY>egI=+84)N&BOYM%qfI28!?z@#^;wuX}SXo!g@l&39R zmNv-dnSF`kGgrSw*r1aZkay7B;u448uEP31x6e#7Oc>UwJEFVYCD4`a<+J2A#Rv5 zF~oG>Q_1=~B`H4n8q`slSX_7{>IFZg8GU;IKC#G+OySjE*_Y{Jl-rxW?{ux4+`$RO z3JhS4quzIc`EuS`?w%x4Kci1v-Ip&JNndx;>`>58`1zL(S38%St~^&{I2AsiWH25H z88FY+^|(HE%Ixqja6%#=19A#2pOvsgu~(aw<<*32$#idl+H<`?$FbiaMd?Xk7Iiup z{x1lf(M8Z*zfps}U>3=V1-O$uOTFl9&qmf%VF{wsp(2KU{=mg<(Gq-zHTJ49E*KQa z^zi67kH*#*vVFcnsjrZ5qn+fOFRU36^mp+oIDCbiF|qmr=vA z-G3bqC!Am_+BkBb1`7d;1gMrj}%122|6 zRILR-+(=XYj&2aZesQyOSdj{nIR~L^)*QTRq7XK&Rm~eCkDStowO87$qW8xYp2J{UERrI{w{+HFW=8T%55kI zakjhG8X8vjkQ9`#sEKrW-2oj~Lrv;#sw363xxK%bjR{qvN9=^TuyJ}s3IO)95KXe; zK!|-3Q>ja2By!qRNy3)4ORZ&aB6{fP(5!wF;LAhMY!yNPD`w#AtyDdSP z(gvD!{^_`;Ch_l=&y~Mj9sCkwH(zvAE7{wRGEZV1JL~Wi$Sq1!qxw!fXH4^ZX_ zhv}0;=?xgYd(TxQP$atTFfAl(rGN+B`UJyo9@svE*^8A*h#g&bbR0t_N^)}|b{RHl z(ZP9`5PC^>=`j@($pIWWt@}xoijrDHG-=f{g-qYU=N7;T7hZKb|8Nsi9E{g8FY-M} zSWq>;LbHUGT%;yX7I4M1;GbNKmM=1)jK3!8(rP+J(v>bo<(rYVo7aA{+2++^{InZs z@FJDV^ICnPYX(*d8_JgRG71@F`pEAoAyo8~O!pJ>a5%vbEu*9)#A5So7&+^i^joJh zLQh1HsSN~ZWiVZfK6HcLVt$;QT^GYblM^U-Y$FeunW%_S@2*qUrtxN$OI``Cdz73Z zlLblHX{U%F97J-e%7LZs>^jQxDT#RVF&x9Ey%~Mz0eMR#9q9?TwVOX~EN`jkxeI-{ zwV`ZvAU5V2^W{mD6%C4)d0u~JA1uy+e8Q-qVZJdlmC>Sq;e+DK0gBgE445lzWcXuB zIX7`K8C5)r{p#%J1|P%rOsn28g|9qSseN@gd{QJ_Zon1mh9fw47-vNuP?bVcDv)k1 zltVJTsXPpm2{uXHhr>&!p6q~>nJJqjj(y6(DD?OObKG}|O#c~0uq5ZuL^d^+8O_bC z!gKX`iDU-Z^G?#*-36#Bn{>WM;}S3d#GPzg#m!j%%O)4T~az`@W})0{~!a z|Nm=7&IZ=jzs+cx$I5O~JYn~X+7lC`qz;LvvG0oZ@9|zkgd4fr`p}rsDH>jokOXZe za^zB-1eajk$CX;_wJFzQ_Y2I{r0j9weh0zlR`hAuZoLF&nnmY zki!Q6kis@e*J0W)>th21@+r@_9 z?P7D%v6DBFwI*80zGY{Pg(u5A!?{)(@8)OW)J9i(f=$b2>ngyU@UG~0O7+DRYwb#j zlQ+rUgX;GRYV_7bh0n~*>EkD>T}9QJv5cBY`$R^E?Nd}i_l#=sRHZE&UxtiK*+$nD z%2ay_+E!z$-ELR*UuQ2SA#^Tbnc2|}DR>M?1Bo7p<;!5QfHt>9* zK6pz%&)Nj5-l@%XOUkm${1U1m=^Ci2N=1=<-Z+*-_Y(nKp53{OIS!dU2#bcRNc+i; znN4CX@5Bh`n3uz-eBHwGD4ySP361I%w7Q8xMSEUrIvDPAm>zfpT=)o#(S{ysAAH@) zZV4ws@%ajGu|*O)$SBA#K=M76-qjz{Owo-_lt>m^g8m|JqdUEw$T=OYJA`>#kYve zrE2Xv=qwIkMH*I6WN)yaZ8U-!+vF1! z^^B>Dnr)XW0cjvvSN6t$7oJaFz|JP1^UmCBFzE$X56G+46=9!XXORBh^F0NXMcq^b)&Vb zvvU)bQ!$K&B?ofs@&08}UQEFlsZl+!YVfoYP(LqEfg7|#51${UVN!#OS2O`I7_S5i za<<@w#ru57#yF}q?xk%3*U#Y_*VdjM;8lT@W9TgJ&!kd}%+WD$?jAHNg{0 zcu7P04b56(dPj53R7Lg$WIg)gbnzPGD5>`aN`6A?IDr}jIfEQ(hy3*)#ZQj#2K=Fr zk)J?@uDYv4l5`AIe8n&i}cR}ttYWK>qlpwsKoq(I=MK=g9Ey4!}BstS~OXy2sK*h@31=Mxl zn%8(+Hml;7_j$aI(@5XCPU~pGWl_T&>-79NB2G6VJp&^aMgEBWAXc0l<^ZO0nWA$X z*lwZIlbsDRKTul~UuvrjTgALEAfr(ooVE@taHwJXW~O&lLbVmf+yMPG?A51Xf1W#*jS+IA8qj!baqGe02Zf` zY{{>J>XXWes$E=k6;cpR|W`)L96Cx+efgM6KBcmh(|deHe=$j04G*=W*F~b z1QS0EY>5CBP@wLiGb-Ca3$7+`1Dd`-=)ok6k=uzf(NyqZu+b%_ZvZ(nhVxf78Q!!C zOEF+heMWnNh4VRT_p0Vfhq{@kx9Hbdry=f!I13IDTm_1W-Z(bBm zJI&?(5=Ey@nlKF#MjSKdyWIeZLYD&bp$t%+a|0hXL_0y5?L;|Wxybj@6Nwy_7p1c^ zvwGZKKbPmTeE%#i_GEvCp0$Y%+!Q&`3z^(WWf-6`i5)h?D(^ z1ND$Np~J9+;FmL$cvP7LQE8{-1x25z?YUAceT$GtIt95R!KR!r;m z%9vm{ZeX9vr;liJ0V;_-~(5_B<0}`_ECCLR{f%rjx0*k)lh>m2+@edB`{WNqvPSp$41oFs|cK(eLSlsLV zByx`xsn1tq*BFLJNl?%)BPz?gk5t3Fu`G@x4JQR~uD2-43ITJVc@yH?7g$NNRDEgO z1AF{5um&}sMo(eycZ*ep#cxUwNy1_?-X>PFf{`y^Xa|6!l5AoZVqca-QwDZ!14APG zfi44{GJxb2Zw8u`{gE$2B|DR)w+{ewr>=cAp7GhHli6F9b%2;(HzrQOQqW2M5UJNt zR;)SpoU?S%LGN=qA1=d0Ak=S*pu4f4AO^OLf|7UF*?ndQeMHC#w~E2Z1C>65*J?$_ zx>dSU_UnYHzpMv?@3Oc1k(alasuBp*K8BSpLb-l$=mY9Zp#e6iRMP>zFS)Ar#^7K4 zD^IYr1U8yW05#iRt)Z^Yz}!4yiKaUa@Ki_Qhxv+k%ob0w*2n_c+UJNd^)*Jx4l>V1 zs?Ff6>NqbR-A}Nsm}y-x{RJZOsH&+pmE4>+^0#US8SbGW{tYX_etsp2g(0$b3%_e9 z)yRVVaXql|M08!ba5Qs5(f;F@c{v8Lth$H;)X93Ok{oqi6Etk#a?z0 z(?7&#H$#orIJwZ`Bg)s-^8b`sr?bK5U>=g9tn6>U7~>x+m9>g*n-ika-o{>5ly_#! zS=K}rA(lnUfq`J7dNMC^Pv0;~&}XjX-gdSFZ(kB__i*Non*a&S^aUd6h{oBB5Y393 z0^Q)@WxQop)#(G!DBb1W>~xV?MA-XpsTTm`lK`2*tPW#^lrcI9c>pj>IlJ0lodV#c zdd*>?N9K4(NeeSnMcz9G%p(JloLcAg9o122%4Q|r%U@xEOg&<(l(ER18mdibOLQ}h zR|@8#K?6v(kR>7Oiuo!553~-GH#h?Rl-&9^zH(z-Veqvr+P%ZK>Ys`uLz|vavh%IZ zl_}}quzX2n7#Ma_Ypo}QC>?&CAoK?`Ep!W}baARK!VT)W z?~Gtu5;-6ZZNSLk8F2C<_wap^Kz5SVVDPXq6q0>NTZx$G>E{)U>mzEV5QT-m`{xJ` zV2M%2W2R<>teEpPn{ljOO+AS8#>mcMok)u_ThbRgN?1Fd>HSa5+x5y4Z+iGI$Od6MpBGG;WD zhl3DYbx3yG9e-TU<6BJgaMqRyqx<8FnPe|&3-d)CNW1(4W`Ze{;MofXM1`?04UWU- zj(flHRdL4L8x&A^Plbq^W3#L=Z+jNXmK0PdR;&c@1h zl(7M|U5;CFq&X*Pz7oj0-16u)t{K%VRm&gZO|b9#Wj8F4P5ePkJrVuW7(s`&g(UUvXo1?m`R)bg1@|c3;HA zbnP!Vlc$wA_2qp@sm_79ncJU5eVQQ&v~vayb@=W!Jn9M|oM`-5KE<2WwmShtes&@t zX%^fVU9S`+Pk1jVKI}5|zMI zX|$_6sDzF@un9zx=`rz)-iTAMU0)kbM-E<;Z4y8(=<#HS&>UCF;|w6I2tGSV9JuuF zLBD3##Wf6$Qa6Xu;sXE(5ooIeVl-gCoF4|AXnKZYFGz`IP|&HT(FrgH6b%%gF~tg( z1#A`~g%jd-;4FEiN^~)f#Zq(TaBcyn$n8MT0eG0i%C;*yd_Sp~*V=Z$jtTH}`fkzaKSm}pikZCmuZ7Oj(DvCdt zC^TnDN3!IEl1~(YNDLdS4EDwVVk?7)v24*7<5!5-anf2$D&d!dHDX(9g)ZobV5)^u z3>;Zzp7&>t+}OV2kXESP_z7^YRD^Uw_dw<>Q4=f$Y%m9J)HdV7f~hMyY)Yeax*6zzfODPl||9;HzfY151Eg zqk^IidXI9pX7A3NnP3ZxFtP(U!ZSY!0|Not%nFTKe0;b!5L!~0eLyur9)ayK#Nm#>0~=X4MNK+D?;6Q{ z<$}vV^`-Q#l($WtrQHkLpKw6J7b)&IT?y`$_$NrS;xp9uq%vc~n$ScukZ6ih7-2Vd+r#bTux! z1l>geM#Ks!B!MohL($Rj_fhhcN43p$V3!1W=j(TJ=1=!yUMQp?^JPQ}F2fe$K=^7S zD`4;Vew8IALcn_V5nrTpE;&dy(&gdsYGx8`^k`jf!~hRH>@%0*1XapasXD_Q*@5ZE z9KZmZv1+-(qRl8yRLu6iF-G#A|3!|6?#^M_&k|<>K!7-mt!H86vSRbYBTwPs<-@ms zq7A)4(mZ@gBW|NM@X!6{NxdjP zbSKs>H=Ru@vC|R`gh0Zm^#d$7*M@+e8Zd{AcPy}OLyqx4s4-P;E7f5+B~Mtm8kE@( z&j3Y}7W4pmLYj(8N;b|3|FR1cmR98e;olX(d)P`JHTz8v;TqoaSEY-!Wma0yZvb^R z8R|fS^bO7>N_RmXi}T`sj!B&@*jaKdr>=Go?ythjy37s=N82v5Z>?wOjm?4)_ZEtV zsrpFEp2QEx=Rf; zR&lZ+x8&z{J&`*j96oe2pU!&e|2=D7a?&JfCiwgaoIbam@Z8dpFn(55Q+W z2x~zEyZJH62LzlAqWkT0f&`eaaW`Qa7VJfo$3>z7D)$Ed8?9B>8tmQSrT>eeTO58#1(cs2T}t~K%}QnjLIUl7F|ou@cW8qR!vTo;D6~ng{(j=y zGvbM;khEuk**0 zOjNRxGc+$R8Xooz?@KoV4mr>jq8;H}Ozh*i z!bkJi?10Gz)!8|CMUU?!*V}Z7TN2HrcTo~%8A-HX91Rt-^eK)?w$7oFl^%51xLrIR z9YHaRwGR1DkK6W6%H`cbvZ##MFdR(Qwoec23e^Q~~P zsrkDl4@w8NDz&P3p9($TGQA(^wz|^`mKZJc_&WJor_{9$w5Q1LqeuK_t9H><)`#vy z_b_)Z;v#rYw*I6GH-Vd7Kk>@1YN9^8OW{<*=kj(paOLT7x6R&lMpJ>meuFkg6~&7^);lL_;;P<>FEXqK zhd#-qj^oGB9Z6hzoiJFEnZxo_^M&i1bzFSQvo%IT-ps|cJ|%r|tzO4Sz!**Z>c?De zii0RIprZe9*zh+nU~@l_3qpO9iJIF5lGPLEOZ$9|&Sj|JhPVj|uGEzwa>Rf#vE68n zAqI(eVc>=_#r3RPqB(fvq-a{%u7R3zIX@x?^A{o#Ds1$E;s@QzJ4r2pq}iuMR%fR z;lIwqrzvC?XItc8Rc;A59>tNdIY??D#l*0YuD+H=Dvj8G`r8O|N1rv!$piC0GW~N7?%*-)Z3t2<{*bDxFnD-j*v)Jl{BTtxC}>Wb?2G`k zajTB&I>U(0ny(;10+>xdkts=N_SVdjqU_Dc!}_&dN~eh~m@gc#Zl~jpcwZQQtetJt z>bH{x&`Wx;Cps+_$i_>#VbulBEr^P6ViG! z*RAOStK+FBub)4^3K_@{M@_ZCNC?wN%Q>-EY3PWWm357L=jM}17cDY}qKZOzUt{Ss z3av|(0o{4x%YE3$F4A2{?as3JQn_es;65)_ihtdBmkdsiV+xy-?X4u^Q))ut+M{u$!Oe6wv5q&T&xICzw4)oC_8`E9r?grv|U}nOGnUs0xo1jyx^zisG%^QCxK~C7+~-YQ^h7 z1=hMMYZ#xeS+zb_?VFI|3EQ=7TAOY!hu0VH9Gnx0 zt_V?2pjiEnCz)>@!W0?CvXJ)U;pFO#97k1Uh^d3icEdZ#es~zjt0Cd8Zq!)TVruzD z+MlOIKZ886t-4Cy9dno{;m^kFF|Pi>B%o$AsC%MEau_0%)UTaeo0ma%S7Roj*VbGH z(j=6p2wAX7I4<4Vth2#x)1g$;8w8^+psh z{EsF}YYV6UFh?B!qPVtL?|)HT@`%D->d;q}fKT~7%;?&4AgN7ZK?W3CsBWpvs)`a5 z__Xi4cA&2Dh=;Z1$GI{^qLG^fV@< zvO`6-m#nvG6JuY==GCSHKnwg*wdp*JZ)q0tTwJ;QZaxeBUa+RwmlRnh0PHr+8HVT6 z)9rb`B@7w3Zk=K{^r!t&6LcmD>5oq|++=~>4CKb$(AwG2?ie=VCKgt`y48#Q+^PC5 zLsuFTD>0Wrb%EfMAOD8)MDhMZ@M6_qR$+KWi>~8kTrG(Nn9ke~2a^s`RDo{I1~pFG z8>T`wN0b0%ncnel2sSPrDenu_{inaGD6VPPe=dec1x~1)F8v~#sBqn6i)3Lqp1k2H&72{-_mr=GYQkdNOM#6Gt4 z!0r*w5vK*bjie9(Gx8RQm^!-W4+sElN>ou5Ssm97L%8rI&?7ZW@kRGpUm8gzqF%y6 zSXO1QbM5TR48uu)TN2$Xs{L`RCvC0s-|`Ane@s{d?nc?n*@0jc*d3@|#FSgKKoECJ znJTskmMWXfe9^atjG%m$sq&%s5)x&G1pwZ?J2X^CReQK5b?SD(Y$*ovwM*eEkc*J< z7aMYQ&;XmgTUf*=G}{*i7->6rBw2sZQ8Ge$&-ttIWZ0zD9QkS2;1w4WHb?uD?Z_-Y zIo}IS)(k>AbOdumSu|q7YeHtPQ=OKasw}R_j7xc3>)eYzqCfa$BIGZZ>(qBr`o~qByjy*jo;jbo}hZHHC5}hRvma&q=pZfG-L4a*MD6mRP(Y3a3#?u z*&s1xxe~?r4Cr#{b9BgKl(Q4$7c!b;6WV0mF_&rv>ys0&uJRA}7)*Gt6RpWHKC<`e zttA?k7maNtC3Gy*k(pr-Juf%DKK_if!Ku{_`p#=J#Ybt}VRSDcTGoI!W1OSH( zN;gTNGS*7@ethT9@>jWOaj)jE6H}R0P%F{K(tgSIW}xHa+5^hBBmOz5r8Bhnvtu=K zJ<(BYa^2B{cHGGS`pt$7D_a_=&p@JC?=M;L1HP>>d<5q_HbDq zeBMa)*Xn!KdX?pS_B$xK?B&k+o+Ayy(M6IphqkgUvvW}#)(g}xhaIPw`DHHn zf*<^Vxrgn5clC5u;+cC5S|*~#V=metG;)`e$}7)<Q7v-J^3LDgiC(gfiP7I@Ob2oE6jExNl2E+e)GQo`&($U$RnHB+tF6W|bVc zXRGt~J)**oOHZW-uDpLHF|%CS*#t$cag*<9!4ot@M+i2Q%#oFwG1O=45yK!;VpNrO zJ>{UFNBXTHH#PRv0S8R_zX*HBHd%nKOY@X%+qP}nt~#e|+qP}nwr$(CZA?8q)7Q-V z_Ds(Y$o!BI89Vlhz3v4`TiHBn7dspzJ=J(1NLhNO(8b=~2Ochf%R`3WZ~!xk&cr_4 z-U_;#xBNA_AV5-IV_|AE*otB_b@V!PD4>_c zM2n!v+SI(z@KtaH6CUF-2!&z+P6R%qhmKJy!J`ClVuWFB^9_;U#O~bNJuUZ=rW``N z#K1JXF@SrlF_^U}wT6s-_SV@aoFt=a^8h%9C!b0NG9F1!FWGXq-w@P;!H5u+{PgCb zRxdc~xS5lm-I$WA@(AAkunbEJhNy@T7c}8!>io(O+7l;YsN ggRC=hcIQd=i7XZ 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ⅆ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

78MN)zQG0XbOrC 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 z

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 s&Y*%(@7 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 z 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�jyLH@$t!Jq2NPpE(e)BB+GIjc3o&4qu;sZ1$yB?FrFUjP=xeD&?#_#)B*nQt--1i;%BzWI<|FkIgeJuRG@97g4 zzV9>ko`HC&qnO4wld-^T-Tn~iUpp4WRuFW(aQdHp7M?y*?lEwF__>9db-rU3cDQbu z1J9Z{_F;V)3t~{;{dcVe`-SuOZROdC(BUl{9|rtOkuLQZIQ5{%#TjfXbRyV&WIof# zW!vnZssYkRcdrumpTJ(M&*VH`Ei8$fXp27&>y*-g*B(n3alTOhY%|GDF|6)U?w6?4 zmT`egj7M4(^v~(Er78f4IZ5Sv~1| z$1nyzx2R_@Ca?|A<0Ej~lto-G;5gMhj*b68^|!#Q2WG{L6G7Sjx9lT53&+W0#X?aF}Ktqgi3HI4g z8yvq>*L_Btv>z{0KVC*ZbU&4^zc2im-!SxuFu6za@;#gOam0FnjH2)3Pn(XF`poT1 zeDtgayzbXi1QyGLIHJ+Y8~gn7XrV3v~&JI4r*_<-ndsxZvlHTGISk);U%l5U&EG1bPD|95V!pBfA8+{J(;$hQ=Ho)emM`q>ri&;vkV@5^(#Vl#G zp|P)?o-fb2@v|9m#4D*E4^n!ZneL-^jyKfL3Xq^|8`8)+wWGX`l~hli#AX!rw{Krn&UqHRq*P_=e5xW=S>l zz5GMr<5eQ1S%FhnGL0>RO`!Z`mV!QHox8RlHi0|GwER1i(M5-eo}kq<()W10SmKMd zacuw58I9$4Q(N5d-JTBL?Lm#0<`@Nz9wvXEP9e}dbE~Ri*uX(v`;)0%j4qKmDJ9ts7-#n)lB1oazOjL z&CG*2V3sm^O^T@(7<$ef?pA!eC|~>YI8xus@&~&IDHq}Ubt$FDgE5~@7JY7l1{|0Ig zc*SJAO5ABpe&-(z_x*$t>vUUK(g>|F3)NR8sbkBfn30oQzm#a7QoKv%f43ETc4Hh% z!g@PR>+NCU$2cSS@OH$dV$Q?#em%W+>}GW%>20kTo8focTH9sBIJNecNY-ZHr7$U_ zd565QbxwM49lR&6+>k zBPs4y&@qQ(!pwMyhee z;jZ!?co^}8%xg>%=&rrf=@%u4gU+$1GfAKh)9;j&Qr9LCeP$AqMxg7h*^ zkF>5Stk7*vus#)QDsv@w6`G_(t1Fom7Fk7na1-k)baV^*K%DzYG0bzxtCPoQ!TQ)j zyd)Yn=>uw@u|36@ywb1-{=Pz1|muQkfeCB?V z%Swng4k@h`n1f+s-|cKJp*g<1dSO8Z@hIaR+HdfF@J!Gbyy-H9WANk|^oKlwF;In1 zZFvjh_D#8~DG$E~k};oBBIZ*{FWzHL4d`*<{{D*AvIabwA@*-}GyJyShykVm^4lWv z+w}Qp^U@mkyh(W>Z*Bpuc*s24B<6|FEsy5=6;l~7<1NxH54^q8ZC}mrE~B@t>ZROf zQGSZ|c`AGTI(3V|ubcmL;j!fLS0b>cCffh%_YJVuC;oMc$FPXyHXGnyxC1;)vO>{X z)**bQQl0Pd^&ju7NZ0w;${-(uuLZ^oavH{TA+6_w#JkdI%zI>WZ?`Pg(g|@VmP@>@ z@FKD2a$CNlBsTv`J8pj9HSY6luH6LN)-*wnhC_~m4;QI{FHzr&x`bbc&HD|~Ejcfw z_m_jkLQKnG?{&{A*1C`AG4E~XPElcz)T|pM3yw3zQc!0_9O!l- z3m1~!@{HpmR)G1pGKTGUQyGwF=G8kYzDj-jU&K#_q)g8f<|)mW)z^*!Uu9UwK@MU+ zC-kB||M!XS(t4gtY5kN3dYVjmOdkh*s}4@GR)6?sasF^>xfFIb<>vStlJ{#@L(WRu zKQDOooyCs_;j586w@XRRl>Y?Jx-qKq<$CFAN zu;O>W{Ap0X`uYK(UlCuoRcc!2T>8Y&XK#$SPiwbH%WzMPeU@~MO3bkvl#E4B()xDm z@-XZy-PG?DI&EMF`8vt1W|9?w8HVSLx{T=_Th%|TWIIW}O|Ft03*2K3{SwjT18Uo0 znx{Bt_z#-X!0q=>yS6`p()dYU(Aa~Yr6sl5_kLHZyBo4+47ID?eh=EX*G6rPr|%4@ z4my>8F6@93oTo?*hkkV!*lRkEgDud2lIZ>ToYrzBrQN$#s>8kN-k(Ty!221`t3=5g zFY+FxwFG^1JMj%*nt@L^h)*1%wEVo3@-0mx9x^V zRI8i#Llg0bqqd-Y1K-&XsVy;B^BascFU}#BQ~lO2*w4*lJnpe4(q^Sy$8h8K%^zMH zut@4}izLg4fxjDeFTJ+d*Q3V|%MF=3z3+$^U%1ag{4nV7%dv*fYn88m5R4_Jgv1hy zc29Luk2PY%KfyXgyuIlmbv>=uH5-0idR@Q=MP0^OPT)PU2eHTb*~sqDm~rjY9$+O1 ze?x`G4dCY>Y<>CtcD5B~DPx}m>qA}KX2HakT`11iMEjGwr{b=Gaic?a&BMHE-l5W$ANT0XPR@$7~_c;i^jQ( z>1tLnq_yE5rrwB)H$eY^8#1txdAvls0i1&n&sooXxY%aXzI2cEBDLRKU%Q6pNj{Gk zwUOvsU0ZLF9-v6>r z*QpcFPomv3==Q|Bw}gz7^POOqf!!ZspkJ2F3^0@(WF|6`>J+-1TxCYl}1FtAPd za~AeIGCmroCC#;Tnny;wFxZdWepqX{W0vZJ?anukX)Pui)2d|VL%fo9iSMa(z{G)# z(cC1reX@I1+^PNvzASpZj#$S%O);X*#fNn}H(C6@=CFtnjJtjwSK_enEyM3chxOR3 zG`VvmJwB^VeJn?h&ss7kVH?(L2akzj_Lv6M!qRDIpV{It%Ure&wsA%{O=dwhHPzwl zG}KlHv>pGSWvX!T^M>{1u35~7*ljgD-X~jzcx@yfdsK;^p#~n&&!ZakZwHe`?ht3{ z+y(*v2U-NLie~?6#B78-o=bDawNu3za4zr7umNz*8ih3HEy=v)BKV`Vkq+ z6KAmSr+X%rZB2bh-I7P`EQ#=`dyeFucRv=2L{hu{0&E}P$0Y|bNhidEA^v`PYB;w2 zaS8ASci3|@L0orJ+yAM2Du{@`xEI?B?{}TAbsFuytu15z6AX?c~9QJ3bis; zm~RIbC-Fuq8}dvrmXZlEV7Bs@o7`r_8q;2HuyM~-gT*gBocOrXzGv=`Mptd350mSU2oH$OsUOs7v9 z@SaJIKrE+09xvVIE%{Ju0X?46W9Vd3`%pi=|1!najF=q25I(Kgy#qAvf2DRICQ%7P zeR4#7axaaGr&LMr_0zgIOnuCv`Vo_5&vYIaDGzeX{k6HHTW3*wsN8fZy}4;jt4vdZ z@p|TehBl>m+vT(%CN!lzxnWaly72Go?E0QMdMTwlO?tRS?-08XynohbhVAm?ezMVY zsw-bN?xUl}j}sWp=yRGkpz9j2F$wQ~8jtJaS8}}?$!w$>RvNlwG=0=B+nO`@xkQE+ zF@XMbO!z5~OxP)Ogy|&vWbm_f7twDZj^#;;tyjdjPxEf4{CCjvOnP3uQ|-V#gA^-b zP?Li{2XGfm66>|md^598A8VsEZbIx3 z;<3=HVc+F7albLht$q8BfySv`v={Nd`2GJe5qJI-tjz>lbJZ-?VNOVE#=C0b123Xp zk`IW_1Ry(@v#9Pk5zqV6N%Y)zdZEj|5Ei#OfOSmcanZ{p3%+dKZ`gm~T;tj4>{gDC zLUYsfd$x?@i|!V`X{dufg%4gCG1rql1^qrHQD>)^{0KMOlL z#%;O-u|m(UGsa*b#ofyHf+k_Nc4&j_G49YuiGDao#o1mYedg=fW&cTa_gtcO1$Y=^dx1+-mK;h)|K-fxEWf08qNqyKs6|KX7SN2Uwye@c}8E7bpm zif1bPg66_*ht&)fiyQuw49K!7&883L)d6&thHLyeEb4m~$cR;r?C4 zg)VLrp6Zoou8X}?&~K3Fhc(V)x184UUYn(Mn29&fCE94RmCrTUS14IY9yKw&d4-hT zi#2y=y70N?cUB?g4}Geazrw8BaEP+~D;JA2G^PWeiuFiq#Bah*V=zq0tpIaTG zPj<VTR#`I!-U_M;m&Es)>Y9;!+ zXfCxaW}|J%QXq%kx4pzhEmBHvTN>%u)vF4K*2`RJtN`P<@tZLo7tIx`WbU<4T32;7 z;@vI-7CwAOBJD8w`nC#LL*ncEqWw6Rsfts5*|fe8!>h}}$Ai|qMezA00#}7uSgwiN z{gUiX<(oMESWMk6ns-*>fBxIm!jWC9aOigCfsfA-O6QDK3&H1+4)+kvrP+EuOKmmf z%buqe_|I#3cT)X0qyAu5f=8i#z(*@fmz%f5u&sCDJw0EMTpajtSBytfm@kI@!v z03OLj3$jT*3S zFm)l1y4JE~HH)*GzfH1N=?dWYT(qEMg^2Csij{e~?2vRK&5Q-rl9GgUms38}J%!sP zB{WaDGX{19Nss9DKXp#aqjB~;+C@Ch8fk}b@VSr}ZBylr{EJuxKbIxGSE1vd%z>|5 z3gQ_ur|CMJ`=~yWscQ{eN%$hL>l*udPYQYeIPK{tiGLxFd>zem%G3D=tp#Vgdu8|* z*qo2)dSY7~n~%86j|>O(R_JY5BZof@>OP^o1Q^s0d??yvxh^`7Bl_myJ)`#<;qMs2 z-`=2dd5k;QucZk5hScj=U?@fBg~v*LPFmBzPwb}sHZ=Z8yKV!I_$QI}*L5U6-Eu~Q z&6lwCr?N^VIq*i9z1`lh^Ye|~B|f80*ihkK#JyC+irsR(8n~F_EHsuMpf=+_YK#xM|}y z!l7pnc^`$x`|Kn>>rQsz+zS&Mu6^$}#Ht_6csMyIC5%)bo@k?D&my@^O7?hTw1e_VROeZc}!j zj?raH<}vX;O>4^H7|GVS#=e`^s{QTjtlP}h_w6Z?Y_+OI$4O4ragvEIw#lYi)vWWy zZm~Z!Uc)ND7aL8aE9+_a`Dq;UH4yJ^u+#UIte*BCUjy;*hBV<%(?)Iij@ZY7JXYcN z_}pfBdo0Vnm+ud$>}(wc%=_=ZR`7ql;R^0?@=(C>){XA=*Go|nVZRTmVEDRsbLYG0aD zu##wi{UM3kjWktMzo8G34(!_}>`gbDq@_MnJip^j2L9#!ybtN)eRy=Q*yG}hvpnF1 zKcHu?()XWf{M#4AZ5v56HP=wvYv3Kv3z(;u-c3;& z``$>Vwm7G31D(LXJL+9)HqK#dKqrrGN1rHc&dYIUQ$T$>Jp=YhhW-(Wt2`d(#c9Nh zfKS&6MR9()Pw=jqnXJOp?QAyRsTR`wtHB&XY6d3AM{Di*`*7Y0p4NdrCvvgV^;(dmwij?E!DhT9d)=4AD27 zZ}?Nb58J@Hf2Mq|6>+X_AbzL;4_q;MdAo}(y=F7>ETVUZm2_vMUTN3~V{ZJKcq8Jk zACSSr)4cyYF8nQkS=>qc1@5(t{IFR@d7=4#Chq%kQ*``68$Sz4@v@^@i}4@lm16v2 zbbUS58|rfr-EJ>@|BIv%+PIqZRn$9M*S}#S_pj5+#%YyD?{KH`%j3d_W|dwxWYV4d z98lcJ|KLU8N78eIpFxE5NyjsfvJXbLL;S<|x$0?J^OR`!*ZiUP(v8W_;w+lRWJi2s zIb?B+&)t6#GSgnzeJ9^?rpm@De@8sE@(DGtCr+*R;ZE;2YJm0_9>WdodP>KFuY7_9 zw#KmCd>{U$8hD<^Kw_OY3~DWz$*dD)7}9?1@k(?M|{FkPy4`3~}|3Do*fqg}`^`?$3*#f-}zfVqe_x?y3eV*IXD6F&b zfqO@9Kf>+a^4#>B(dM121mid^Mcb*o4B>O$ zhuFG5ejslYw0SR{<(^bhdv^fWo28B%j>oyyxyOn~j$9uv;zy#q^pNuMsk}~F>u##s zC@*a->j1sKM*Dk@+*OY=_wc!#)@vhrHBvo@`5qV%bK+ichf$6=A2=UxvIyBA>rJ9x z49m-or+q5U)Lg=Sa$`IWh1C@eI@Sy-8(TxyC9wE9KN3C=&;x=pcBcl;5d zC)o5ex?g=XQ6@h>62wx8W-A-*+&leM-M=g%u6Mt%8|jO@i*(5x@1$>7#KGhLU|p5+Ih-Hm5g(z7dr&+fvrYv|cE z!Dn~i*0Xq?i32RoAx!B@) z1!a~O2aZx1RksueM)3Xh;=mBT|Fbyo(eOn7>^pSZGRSzPF>F7{be$Ha)?0u_MBkA6 zu`e5}vzKC$0Sd;(Y`c%Lbm%7mWyyYPFr+L(^BbA`V6pdzWEP6^xLUp*Y;n5 zcCNajm&Vnzis;~e{Bh2wzjaK=IMCbMU)aWd)K)EK9s~38IF$>T$G}a?p>l+MV~W>k zXO{3YbDldV{76eea2^i94pNz+`$bK6>hhXXmj}x^extm6PY2a)*r-)4X8Tvsc$VmA z`b(9_b5fggIqncQFwciCXf0>w;%@uej_^C3SI5_hMb+(>BJdzA-%$gvQT+hb&J1R%f|4a1kS}!ocP_7%;QQsq;5K#7?8KQTafb${m zKaJl%5Wi2*?<&gk8NMG=0}Dv*L|fB|cK7X!@vJ63^bXE^WYACef;GzF?KwOI`xP}X zNZ;=D|2f(N9=Lw_XrrEn=4jqu=-q)?%(Hbp$JAc-qcMT0^!AY8C6T%a>8qXME_gOS z4}>4P?EW5y(SoS|$6U)B9npk$BHSt@Lzar(HyFL-J zpnjJ6mT{H}ePRpA0~MsVz>fXlA#n~R0pDV=?6HbC^T*rg6N8t+e-%+~vcahg-+ffL?~P5xkGn1onX;4~OBD zM%YK{@ya;yv~9wNDAhYNS?DnE zKmK;|&1Z0Dvy=})6O7nmJPRPHJvU-RT?03z=-fJ6aqH;pd+oJK4$?R7#C*YTG z3$^=Rsu%V3Oi~}(ICwq;dozT-oQ_GcfywY&rs;FILhzH#(eQq8o|DPKV_%QYuMmEQ zcQ5++8hH!%7jsit@+RO&C0!SAN~YH;=JmEB&HH`>KQ9s&-@soAVimQE@}3SW?_yD2 zC6z}qx9=6dF}H$vL=F?H>%x6;2CL&S7p@lZ${dx9`?ol575_2E;UB=))Q)Tq%VHi& z=>HYWqsK3Qiw$Or7`^yS??Q1d_+8GD;9U-4p;YVlJo~gDcExzP66;`+)G=9{3K5TJ z+*iU0d&?PA9%2hTyMz_C&0=+zNw95Wm2DR46MUhQ8OM5Svx}G`z=dnOoN+w5wrfOO zG50Mz&SqV^IL~oDM{PSz+c^)F8v2dIPFJkos0SwecLsTp!)b}Vc$ zY_*_o4wp+UBP%r6lQs73BRPE6;oy0|mHV_7_&O~jdc&q?FZC&d(!u8mIMhxW(^E3P zPkVa0#IaFwvq=WD(j0hAHobNWjs3wmcC3ol_W{yb(N90*-dRoMra5ohNyfmvFN_|AEcC^bca~vby_AF{U+GgBu{u;5;seGKzzkXE6+TcIg zA#v?j5N`*zWS5S)9Qht&g?H$uYfKyOr)eyn`YHOi$BQuuy9D?R7%^3FX2s;uMSPBSU+2U5Hhe+TWv9btGkQT$~1`F0HFKcA*c*?c~%z6i2iiq*Wf#JbZWu=w-WN-6J=-edaYp?<0Q z{?TXN)mjk0p^A;>zfH0m_)|aPILNlzdAL7dBIbyh())=gXIH!Sn55A~4v$iYz0SP$ zp)E^+2i$!Pk53xP-zNHzPL2;Z?^S^h$ADu?v;vI`dVyA;6X<2o$|AG;m_Omp68D?xn6zO9@wkUC5I<(eh4n$Ip|fuULEZKLTNA3ET_f(2ak9QblM9J5#% zrzf}3oXva#hb2#Sudw^n;)TsM&f8L|Tl0B}gf~Z^VfhTS(g@#d@3pwa~n8xZrY1e?UqsYwOM*X|}=MP4>7X zQ!mmD)9(=_(Ro>bdEC{*{Jyp%l@&Zeaxm`x;L|;i)-vqok04)aS3#+iXyy0SQd+Hh zUrs?S>~V-Ls2lblX35$-e92VYX?m6iSm9TwEYzv(QaTVT>|heB!@X`nlG`pfsQrfz z!*3h5v@{1|IVSZpRjI_EX>G!b4-Vm$||ML ztw|e2d9x)CYz0x?n|gTz$s~)tl-~?rK^`BC=sI$VW!v2+)k3#4GZ|%Vz+EprtD!Mj z4BP$ zGPaz^DtS5l{DOJ*9u>Y74I3nA~FV9nsabh&~A3X%yRt;NtR53FO{hbamgyBRO^YUw9aWf zcOgFcTvpd4ix{o`g{jHFvp1PCf zsQ*{jcMM;u`c&F$U_;aZym5QAL!^`vRK@Q7e$;k#j62e@)IxeEPejMXHC)UN%APq z71@n_H$5-T-@sep+iCDujp~o&vCsi9KUOcE)eL?M8GjM+w4Jf6^3+O!v-t##>#_Cg z`-WG}Z^nDXh(#<>%&8(h7MxXLg;_By34SPM;s*|r$q?HpRZ1%xqw-l&1asAZufwF z%Agy+_jpdwO#VNhSw7JVzH&;b2CarDKWJsr?}4Jx zZ07@x3PH29s5C2zO|1pp44SR{7ijhr(IQB%&)+v6r}Q^b-e;c+(r&W7oZC3*^ztkG z%$Vc(1B1Je=r=1KwyW&Z4C?P0>fZ|zVsoT8M^*wWVur`B*u6-MW+lD9b_3N_EvJ_a5zWy)#7OLitRA`cby|b&H|g|V_T1;6C;w04!rwL^ z;ux+Nm>3t{kiR11!f)g;`7Rt6{?V7C$A`Tkq@F7WE*KY{$A|5HIT#=Iay@;1NEvUu z^7-*$FElTY@22^vNL-#fu47cclg4u4+nub}XCDaah|lQt{Tlu=LhgF{Dx!s5m;YQ3 zJ}{a=G&xQ3-ter9ZIvH(6}rzWN!%BSbX?LWDsLW(Uxb*c?JPSV@vn_|tLq2Q*EHvg z!2dU~T$D9LWgvE^(=?iY$FSA{ENb|-cfilXcu#dW<3)P-1K?S<9=9|zRqWZ^<~fe# zR>pF?m%7H+7C-PL$pZC@^O|v=FYe??&YXd{Iei3iT@mB+le?k(m969Eih1wC%@dd~8Z9XsT079R= zOV45>o)z%(Y!(34y#Hn9QB%3U3-B)bz;k$eb>4co-@w1n?{G@@W3OHkQ#Kr`BK%K;ML( zw)uUUPs!X?+h>+iYl`*Q1=Vt@r6@_QyAt{YKZB-ytXN&y{WDaH8-)=w2|<4qPvYyy`Nexl=Kp}h^3Y4>E34gfz`f8xI_dM8fxSy+2H z>|3G7PoK&%+T-M8_$=UF$HJa2$L}sKBk$qAvl1x3g=lZ3xoKu~!0m(%V+NKl>4sUP zL*mS@gLuvzx^60PsnVSn5Au0eSM^%)1ILvucIX_i>jo`w{)ziMM*_`vk{KP+^jg?o zqJPkxg1j)@S#*%w19i$F&#pYkb(m++=iUDheq_LI?O5li_&a>TzRZ&MX>I(z7H0}i z{v$Y7VShDrP`txfq1%GW$e@?5cP=J5bRcOTWz_}&p2s#b& zd+oMz#7n4PBF033ej|?57D>nrCy7owUdnC0gX9I2opN5+%K}=ZjoGX?CrZ%78U4Rv zk8~V1e`-AY6Wva} zEbyMq{LUpKzm4Ws759bQ!~18Vxh3=Or^`25GLm60UL;N9=blCNseE1+Nim#8MUtrw zbD>B|;IVO`S3}nY4n1(caW*}TzKbLqKRYgxGI(2xq>K1>f!?OKs7~J7h34ws^&$?+-j_ril)bXRRoW}d+)wLEdU-GEeN5nX;7{{80t^Jm95^!< zK3ifuv-P^*J7k_l>+qLS4s7AKvI5SF;adZYyiRG&qLO%)(I%T}FfYIxHoZr4I#%!n zN0!RZzImP%(|I17q~>!TRJznRq+~mtQktcP6)fTyy~&JpY2x>3q+6r!Qrv=Ss<(Oy z_LgZ2KzAqUlQmP&ma2TLsrpSH40{eKL99}TB6 z+MK)PMS(|%c^ACL3Cf$*Av_iQbo|Vbcq(|P$=p~zcaYon*Q_A+kcS>C`iHpx z1U41+Mw}Dle%z5L^ReCicd`D{#5qT~Hk;K89+cudN9&d2C=(xI=C3~he>o#&;q6ut zmyFSV6kOve&e@n_zfX~Hoz5|NP>o`RF+n^HTge-BfrnL;y z_sJp}r#Wf|bd;rL73cr+U2|ARjhO||zx)3#<{7~$V{ zcSPEI@L%8eKjZRMWBKq6s!t;sw};;2-Qbq%bNpq9`>@JsmRPcXiRv4=9kMs+EVCsp z(_AN+oI-9?bbI0HT*f(DdtJ^4)@yTcC!+xqpT=rvk?Knz9*`Z2y(FO)@p+C*EZ@kV zU(b?J#&yaJC+axmU_O3!#&M!Vxkh=|12)qBZp;*x$*#fj>bR{bc zT{CzOe53+u%O=WG#_3c$TFT!iY%BVZ6)u!a`6&A$P1jjT4#I!iTO1R@c^B0`yb>`j zRbcKG@_D&I;`36RwWK%)>Ax{Qe>=u~XMHH^Uhdy+avsHgyH?%uBWiPptm8LP8?tr$ zrlBQWg=N&9c6wL+;l#FHM(;MBB)S$?EOp|HlX!uZ=A}!rEOnn`g$~7B1KDSll#vhG zpq$8gF_-93Jt+JKT||!_l55OdhN1nRO3pWD+uLcF1q@5j=N z+78GDaqL(rjk$&7aueHDzB`WXH{~pK4ySNlTknr+EVta8ws6zsYz>dcMbF$8=Gkh& zopDMt(%*bm+kJw@#Vx1x9tWn&Sn(FKZl6LjdOfhh@jT{lVX+P#<7XI?j6Hl*?xoL< z>GMVVy;J`2c)zhZ!ft-!%Do`Gl+{{qGku$~bU4R&&_&z2XEOr4yn+uGp13HYj@1uv^xw~=^`WNvzo zyLdBC6T@{0BMsz4BaN!x-+z&~%c5TjVv+Bz{%a7QfprVL{aTEr#5##yb_fZ-5#_>2b9N!223M@w0 z?3yS|dm1ZP9K)8OKIk}mp|{GTi<*c>9wwRT5b?CfY0rY~6JoP=&{_g*Vc(K3@%_HQ z@gdO+eyr5aYBNH%NXI)@J!m63T9u@=BTVg;V!$J8hHTD9K{9RD@dd&-)u-mfy) z1YYyD%lu|5t&e5ar>1P9J-R=!DX|&(VEg47tLnFIXF1&Gg8Ezr-GcbEs5fy!y$vMW zxzkwXqms3(O-igCRuY^e+<#x)g1SrS`*Nxuzo*joL1}6&iW7Vb!iztH>I{#CNApIE2%|Ax}ltevv$DBd-hy|Dd3zpI(KxkySJ zd6W3!QpwtzLu+IT?U$G{h$VWdOf=W$iRqJ+n6+m~R(Z+9wj$>8BAnYMv1G?uap$CM5V1dy?jWT(P5+O_ ztAP&MpZ*%h0+`pjE?SNlN!ic1?E|}bY!%<5l)n1R>VDuUHN2^QhO-y{T-Ddky7FP0 zBtJ9XbCCEQ@Y{=ke@$|)>rH`w&DRp_k0S7|-MTNF>wFOZ+9f#_yc;LZvv5X(b0Cgw zlc?J$Cb7CfSzz19SqnVku4ab!l>@{(*RwpF2NJL6cs8=Mz%#1H1Cj^ldrlg^yXTMR zd!F*CjXdsW`DY5X<&63m?#F>^&7`}2W*J-EKcvTIU7n+UHl(n^1bLtjv^Tw>J~pI0 z(n@+xGx~TVZ0;queQ6F$u9QsHpApTbb^X^&6MH)O?(GWftOv%i+tdZ2WqMWVIH( zA=M=`u_RL*%`xI<*gt?*pHJ@&zA4qwdaV2nmHB!cTh>N=88LX>w64uO_Jg%{J^aq8 z-ml&!?95;zr_PuTv^Ytjb|Cq|%M{~7Z zpRa?a@cFutXoq!WBKm=zku)?D?TRSv@TG0`TXdRjq&^t!0aoQcqFoVW73j~1DG@@q zr8<4k9)q5siA$#^`d?D-P7%*?_P~DvWf^ojqSFa<99?%<6VKE4s{%^zh?G#2B2799 zB+^9$1XMaGAiYQ@R1uLT9RX=kKoIFgYUnN0&^v^Z&}*nEByWE2A9qh?Zl0Z+xy{XI z_I78tG28fBv(nD7UGu!zWz6Xo@b@GUr zpRccqYL^Vxrx}mrJZw`-pLm1q-%j3~$;`ySlW+Z9kQ%>7g)d3df-DUV04ZZ27}$jxxr=wk-?d z->m3+<^MQ(Z!#-zWN^RWV$u0Bb4I|mmU&Ai$RoRjV(t}1lleM@x3hX~Ps=lNpJz<`ynyFF;TtOCA7AR= z47d7%NxpnA`tHZb&*~po<%3q9uj`eefWp(RPw9)#KF~d=8T4n02%)?X{4ha)(&lCn zTqJt1c$tRdpf9^x?QcgBQ-j1wk1-7GH8EqeVU8COmI)nC0N)~BZGN zvxrYQ@1Xxix&Hxs;g+|@^-Nx(jY&$Mjmxr2Sks6_utqIz$WuD!!L2MOUFz=5^BHgu z(6kWC1Hf80jta&*eK&^X=Y`)kfF~pcE`Xa&5Rb1Vnhwl^UfByPx8L*=FG8Gv6w;1@1VLGlV;F}${SfKs<{YNeDGtqqhc zMy9I}vz38>2`Z=M%%fb>wU_wj^B4sk)5@+8U4+z!k;|l)&BLlLi;VqVzxZtq+C`#9 zU541QW}g^-v^sj-wIzE&0XjeJC`TQUy}SVo z5*c|XUNMlzF*D@f^_#u1><|By75)k_Cr9ZQhax1ddd*ka%tWpw|)X`MCIzG+hIO|-_i7?g`qRb1b(1mY7OW7Z1AMEyI<;%@I zKiqVCs)4_`!@7%KPb!4VJ{nqOd&1!D_U%gRCCp;+B7eqfw_+kEmfp&fC(ZcV<--)? z+c-4&7K;-vlu!4Va!@3I?7A4CVwJ23UGL8^hN_a-TP$JJ8!S%$B0O!Bxj%8LLf4tU zxAS~9R^sdvnIJs08b2LN?Gf3OyR=Au23@CIXE72yjx~B(*{Hq6(jlv+JRZ<{=eknB z>c0@Sy1&2t$CUMV@HT%(C8Ts!LdVtdH*K#bn(3|He*=8qI{li6D3A#?r@P(nA>Nm` zNxga3PB4YHAKdFS|2mzJobGUci>bkEXkF~XNL1b3V4GCFtDXy$a&&)$nF8eM=4sPw z%F!)T!!u0qE;K!%KJTZ8Bt*lNGk#`+H;W@+M*Uiy=r39C`|Oc() z`sFD^%O2I9Gj2APu3l0dtp0u!Fevub|I231 zlM_uBx3Z?PqU?vf0uIv3QQu-tQHdtmTvA0YJJ6d~Ci@SYypm?jT5=}h(45|L)tvYH z_uc(nV$-^uqyo%J&qSPgN8>v|3H=T8*Br0I-C9$?S+=)Fi|W^;;G=@#t{$u-^*{d@ zxxBCZXBFxFL*6Rv`h2^QkFQ=XSUNsHx6y-)oM3cx8~(R4q_fJ13M5Sdd}Hg?%bvCI zT{F0-l}p`xy@34UjMW*J_-DWW9BtE-`(_Xpm=B-v@4+bSX5v08&=G}@D_>?7XVT`z z0*uBtB>w}^$^9tS7^YfM3(yyqoT@b0GMcIv;7$~t#&J}3gxm&FbN|g({0;WvaYSB3(l)P5Bc3+gyjwdm`LB$-(x%S&d$AIbJ1aK+H+7H)q9{K z%Dog8?eDZE8FKiZdt&6KBOq~B?E^1svd9aIO{(0D+>5R-mq#BB8r#92Hb>dBB$lU& zhW$TZ*uaSi#iyK?Rsn}A{#JX?c%X)WAGJgFJZT<~V_5pkGfm%x`qWz8yi`aPZBDoN zXOF)&N3z*;bvHNMz^saIRfDH~&1rotsvQiS*K-lEMSiiN(6sn{jAE@vlGmFT8T#Dt z6Dze|SXhuKK0fPs$oWf>`>hnz?F`^&kqBdNZN%{a>%wf$KZds~n7+yyT-E=lsHVNA zk$dP3D<;qT8Zv3(88*03=cbukS|Zj-s(pXnm9cqenvAmr6&pYMhX3~&C8E4Sb!q7P z^Rg;zX2GiFUlAxBI}>T7w$*~+pv~Y1beU-=DS|Jn5u?V8^hN;A_jRe-`g#PvuUP z{J8l)*aT@{NyP~RhhMxng3V6Rw!0qnKJk`7nN}2fXCL95lsl}CI_HN^TaKy?$|x2Z zZvF%;ygNI&SRoNiqlfo(A4vX}P&ni_$_y{GcZ>98s6t7lk|Kfd2@v()AVZ&82Cz ze&H+s?jUE{uONqOY1Gh}lt0^~_o2I$Xaz--rU7Y+08;pZhf&S@6UKO}AU}&c2uskn z%Z5`u31R|Pw@eG7H@_8VUj=MF{#SMXYBSB9d$hej{mdcT)XVpLnQWzuJ1EA^Z_}cX zwehcn2#nXtb!HNdk`g}Uaic|*{HmKzqac<4A<7$Z7jF5Bab!AZY0)DZcb&pPd>28h z{~a9MiSLAMd|?!`+NYan?Gk(}=3t1W)ZIe{RecSJlWN$x5*|Qkee!jC8&VbdGsFSZ z$Ktst30kn*yK{)MV8kCXDgfPtbpaW!2eLZ5wz4%%#=m{o>LS?tJ@SIXOjme6X2C_* z{7y&ru9O^nw`Wb?^TTYVAcpHX(Q4e^8ZvjU|9uXS?+l2$ymgwj`7tnmSH$!;HiyyX z)iZL20E?uS*i^X%4QkD$(n7_!sDJ4ODP%L-jm;c96!J2zcYBcwS63S-NYv1q1zvoe z-Yd}CTTzCrp-&OB2U3U`&!%@_jc@uz2k$rX;c)ak5#{H=H}RWGj77|fU; zM!uB3qqjuo2DYB7Sa!8ZB1TUJt@ENP3f-uEz2doQTT-a)MM-v!2w5qLM*k3 z=a55Y!)jNE8#-N{1MXM-k)8usmKpYy`YHOCHScil#TRa~A7tJAHFtO-?n_SV35&vi zj`XWFa{<=JG&&#Pc3VhO{kj=a2f0q#l2@#W6;(KMy;DZ7Wx#@j=;WuipTfuYRrewY z@mSVZV1OppX!wpz#5)2-WBL74zPvG^5zJ)pXk5U#AU!T)lQ8)}I(2jv7ri+E(gr>> z18cwa#jZ#w|MYIZQ^ve|q0Vm~MZ}ods@9j9 ztq{>;!6Z8H0{qsV9?#XL$ z$7_c%+#87xq`h-@uUH?a3jrnuTk7XP(~~#hLe-=qL;5Uot->K)7i>N`GZdoKSAz@C z=_$FZ#O@W$&MX-#{X!hheTnScWx<i7&j!kt-&t3)%bP{( z9nsAQZoY5SJ&nSVarcj3=Zobh_*iM_Lc;qQEJ+LXwrATJgEHebj!^;k?E0?37Rtw&UZ)6E(o%z|(TJg_^ zXFti_L(DW&Z_#eD5726_)iX8@Mdcu0K!xVVALK2&&51m)%-P?5yGy>IT^}{_hzZAg zu=Qd7LD*`jUxnR2&NqxXRY8rC+F~!EnQzkmLrDC@y~{FPzUYqw1h9M7|NgRYj#mt| z6FMEA0cjgbjJ~saXt`N%Z*wQ6+NcHj^h)4t&ZNe-dAdaMG+Nb*!qttZxL)VUhYwQ_ zj*&8MRE9teR(wuVdV%A?`@LwB9Gc$QnUQ>tNg3yc&($uE;P#6QVFLYb_P8h>o#~bf zo|(?~kL1(zh917FR9+Z#)iR5h~|4%n9S{(7kV@o>_6{P?!^TYAg` zY{G^c?GT%jF*ULELEhW*<%*kQrQVslO3Z1>5jDX?x(9mBIcadQ2Or?_#YU&V2JV) zc_2C09Uub*f?iJX)*$oI+aL2lJ-qJ}TKxZhd>l6Fywt~v`-_FGz6nIR{ss;7eIU(|X$do&8I*Z`? zG{_J?FkD!Ia0uZUq$QBBNWm8$nr-1qZPu*6DruvtY~?3pR*Oc#>suKDckYQ*yvBOP6Ico$~tNeH9G3X z-2ePGvA0XNdy5p465Ee;iVP8E5F3AKAX!~jRaW(y03TNJ_Pe|@g9}1j5<`eYM9|0U zeTTds4tZev(Hw7k`>osi;YS|*56OMVLzR>yf9?bYJ(GV9*s3ivCe-0>ZWbW`Nw)#b zN2O+OjJ?SZOSc1R1GO#VE7^X~`MK@gz|ID;_Rw(H9?GhJzsRTDqJGr=n2W1I;54Mr zy<73h{`~J!c8HHDhZIQ15T|tKsxED5Z%mC$mS(lKV|BYBSOxyerM@7d@M7|t`~tji zk6VpbPf>gQ$eW6zZS>G>2bBQ{$vr{Y&iLN9J!0AWuh||>ok`Ys2MG7Ay{P%m50Xy* zQ9f<&^4RphT;7rK0q>ik{(`4&D^0C=y4f7ZT1l>q7@bUw4ymFGKIHm^-B|37 zC#>8}n2+arBvj#OnB2FCd!)tsE&JHAOH|=P@80=ven*S7#IzxJrM>M(6?l^c-jbgp z$cZ~!-pUJdN8P@#6*fHRtA5wDg9F&Ey*JYPMiUj_ZSSew_#}uaSyWucHKEgLmR&QWL09Qj{^}jA{H!=j*#4qfqrQfn{ zO->lWF*8p+ds1((^0KMor@)Jk&-V&EVIj{AM%eE#p~F9^r1Z-{nu}fd9zx*LOf6v= zLvuMY;pYu`?;L`vPHC%Zx#rlPHJkrQ3|V@fZ-zES=?3-$VOXbL+G5|j7uFkOcSa4@ zKR4{yC%1Mls4u_iZs%$2x%eQ;ZK^0dGtAK2TY3agVY#^d)a_#QZX=-ZNUhjqW@o{} zx9|5@*XE|d;9ko2r2N8crb@Cu1KExJmhAJDW?LFz){*Ta4DhIu<6ozI1N(%kv}K~e zvQK+oXm>d7uv_wM_7TzTzryB(TY zv|$o0@u1R)%eV>U8&^1)?U32Y!!t{CMLSbIPU)~X=>Cf9NcvrCqSlbueu3XqINeok zXZZ!}5-bL7P;Z@5Uf~!meqOS5d}Cr-O83!zI`8@CBTG@L9U$KDM)1+MwcBm}UB`aM zt+%L*TY_p4B@I)EF_*VRQ6QX~QxOs#dXz5g8(HT}wZufD|M|>SS!r&5Ecvjq(CT?* zsZZ<9qY}~rDi`T9ny!iwLy39PN&kN*I;v?FT~#fn3HL@JfE(`isKMBETGk(9GS#5g zRT*H>#REb_%>6?q?Idq&v#lARBfw%$qKSrrn4F_gw(R)k;F7ao|+}!u=qz5dj_dSlO1ZT$^%mP?}2DSrz$P zse(q&gj+gq)BOxC1DPD05vp#;|1;M){cr}}69cVlK|0&`2nCn)%Z}LWyz-CMww4p! zi3A`@WSwd)xxkm6z(-XaLP;Y?&#jo%R@$5yNpS_P`6&BEFrl7l#PQ~J&r^XtR0EsB zHJ6kD%al@QS2J$h^YO{jb@ot@nMX*NPxlS4hy`e%2*N|cT97(m0t z!Lxd63HLZUQKIhdi?8_Mzh`VadECJWoVZGS9nhNg2|1gSQw)14pckxtXt>Oggo<(aPYDKREyaiA%WxOD zw5Io;4mDklZV6~jckr0}8U`$QPM9juS|?>H(O zC-;g_(j8Rwv9YrKfQ9F7-zhLD)V?WyS2etX-tJJ@(jrvJ-KN%#x`=^L___#&GGiM z0hL?f?du!xHt0)IRfaQmy1kh9ZF=up9}gphMQ?P==)M0EX}|$p3r#$%ZMlK9ZU%<^ zch>Hc7)drpoKOxlxgT@Q?W~YnN!hiPUgE>W0lTTfx}&0byGvRiq&|IPF$mKsJ=-?a zK_z^&4-bAU)Tl^w6Ni~BtvKp?+yqWr4&4A|SGWuv9y;ugY{>le0rdFs03J8x^~>){ zDx>J-DKXjf{+ln+{~bhZONYE``NY893eLW*EUyZM(LCWAF@~T1_AGH{wT5p*RB&{Y zr*K@NeR-#MuidUzlo^6ORDgYh2z{7O;5fp_QPZeB&~hk*GH+IL7|_kC7>TjTTo!&A z|6cA%8U4b4bhYTmR&1=zv*eaTeHRVKe69dW1;iY%U9_#gYk6gfLY7qbN;EhQ7&j3# zC3MkZ{8WJIBy{LqpnS*m+x?fz6dxX;|FhHqdH+1@%YL-2xWi2wE6KgxFEZ0bk%tnQ z>2#n8j$P$HYTp~ZlrkvAgbvdjhpey#SH$eHiz9QHXBg&^e1lRKM=g) zUoaP=Fz;SboBB-a@TF#@(?RRgyCWkSWRGeR4)xQ&oQfP=d3>7Pd9xd4FfWg{^mesM zp83&S>5ljvCH1qM0n;!uc!~NGBThX3GaWpfH=^~dsh$Px6+YsVtB_0ejk9Q|c!T!8 z&Rval|DU59v+T-qie{HIpS=~Tq-vdbujmhFi7XGaOMP1hl4Dag9eP9eWw?}Z(`Ofj zm*p&%%zih*{yhu@W@G^Wy+VaGnEt(2>Aoo4CMF#4x5^sTN6R5A+1)BDX<+6{twa^9 z-!GH@^mR_*<)dUX;ysBg;H#9U>Lsd2v|paSaAs?InnCcZ_nbGL!!Au`!lgB#aB9<0`v_G5~kEsy`=S##zyY;K#x zt%(2$?>GlsZ~;w3$Ja>uxA$1y+`mgoG43eGKnwD$~i+!PR%BtN0TT-tjy0r#V&xmrFB`TKxN`^H%myv^#UhxzdFI-$ATB@zrOa;%Wt2`?)lfGqg=M74anlU=k6PaXd@$ zy(bHsdj&BDwq_Da#3{Wkz)0;4bRiBE0(;wv22xKI zcT+3$O*Fz>=o+8#8SgGp%0I<&0pV=VudFs8`&&UbV}P3aFi8eF?2{Q#cqs9%4^guC ziNbxl(GAM}d*OBEg(6KCo85M~o12@16L*%CzjNC?K!wZ0Ur+c;K<{48-cr$&ywfEP z?r1IS>HoBosZ8VGdGrNXcPosQ?R{knQ<$#@cZO9Qs!?yP&NB96K{kKRp^j=8k=M@I z+I{QU6|hUq-|Y_UsUP3$@b@J)kG@o2CU8`A&t+m|d?`|s+64g1sSg2)QnH#(z=XtY{E6T%xVyf4n zA$igt9qhyLq&2VITTyY1Q>f=sa35-^bgcDYDK5ir`e0FS4{`_*I=N<&o@*(`5Mta= z*G!Aehmbp{mre1YUNAI%Wcs_g+0%>xVn?@sQtW#`k7V@SX!{-t26>)zzI1+WH9Yr; zzB;1w55QBwMq#}*nmrmEtr2ZbkI+<#zLK?3UYCf5&~{%%|BlY4pXJ%)E#m9r{mOTt z>Z7G}Z}>!J{f+t&FDH&KLFJ|Tu&Tx9MoQ0H>u-COqmM{!L%(e+Ghat5Fd9VNiwXec zlbuNR=th5t2Jp}DD)j!0X29KWARPGaWo=d*K=?FWJt+&hE43{O8t$@9G(M$Xw~++$sN_%E}< zjv{fkDrYEr-E5{(DY*Er2~A@I>X@;VwcesfAy{a9cuCe8N>#+__!7 zv*FQt#v`O6GxTNWP(uqA_fyrXWX$?^lCj8@qz2xM4D@@|7v{O1HYI|jp$s+c!KfQiUCOonNXWxx2z*ue4h%4ub45T!=<>L(_%((rX-ej7q=vV=)eS;Kw9NZhC5!uy6bH%0p?*D$@gr_u#bvydr7BxvKYFNm@ z*r>&d_4BDd^GN5RV!d}ZplRw+Avse2?w%*A`-6MEsb=Esx_f1Eagx0PT?Yao>5|KK z&p%i^cT$lNP^+jiPj!Y#%~9Ja1Da?r{a=z8Toe(e4{{ASch7&qji@JlgfawY-A5w^IwtIO!eB zK@ zoNCVP4fNE$ZhE{l=yMr=Ac%3(eeq&Ia;sreCM!{Sx~Te|t6yBq8>5NB=PAq?N%SbQ zO0Uw7C^3F4GeDc#yiMH9f^!7Cx+k|{Ok0wK-3=SMkz zzs));E6yf%d5dG+&xvj}lNZ?@6As-a?`7ECG`F9m-xJM}i53_XMh0f{!X3Tq;lk9mIqCd-Iv)R?YImAvb(kaHv&I1dOg66y8EUEv?T{jGT==|dM#`2) zo?G3~m{nJ6%0cT+WP82D%s=rfCEx9TC#&X?miv{W)t_Nj-r@CEMQe)hQKzzV<=@Xf zm*#ZkLUNUI##&ikH+&x5$)%Gg`^(~)dtj74@`EZ{IPmHB@h2W|Rv-HH##vUs=(ABj z;h|O6MDIX{pqvB4bTv~*IhR|`t7S@$67k&eRE5FAoipC@kNM9LS@DBtk&SE1DQvDy4p`Gb-gntC-r`ebpx((^Q+d~NjK`~E!EnXd{`+LsrK=j0ZF-#$!{cI> z;Kaf2M{ho!(o;!xAm~#DgP%QDPx!!S(QYI5M3}skB~RY3CBdIX zIG|5HCxb6Vvcj=qZ96Eg#3Su>q_*NsA}3SH|-mccKEtIlLEI`&cRa*uh464W7=-CQr5jOY-b(P_0Y{U)7*9D5g8)gpTT0Brj>BGuWsaCxN_a-xI*ZcJ$LoZDM$CMnQR2g^mJgD{=YAw=nAg-Bz74$hQ@!5&ti>#o z@>k%D;p8vf&1bR19N-osl}B@)#wbevVca+sf6nOC%c7y%M2Ds?lQ}*Anth4mucW`A zo>}}2pGnI7-TKdXy*cunPr|r$(Cc)MS-DH}>p-8VTIReXO22Xa=Y-nh`oX!3~`aA7xRPmB?GcbAO^XCgp$eb;3*vs{A+OZp& z|KMdSZUqMjzB1?~B+_x>k(2O8bRmSwzY=Xq79oY3+trnAK&zm2qIPq!{9&a3qIp6hYCyx6Zz}qVjjq@)be9vyt;?Vz>(V)NR=U;buusU09 zv?XqNeY8K*ss*?DFKZ>_aCfni_^BgYC4!uSj{Uxr>s54efhK}05T04R(dQz#eKsIm z^0n@adZTN&%+)9XoZRbND=|7UWG&@E2)UGa?rcfunD{^{L2@KcY*!=_>xkW5`~rGe zN)M%+ck8xyB&BT}`g#S2vy=rr4_lXrBozN2kVP|dP){6wtGzjl~_GuJF z5JbHpl$Z2cl;BhRenm**Q-pF zqJ}UXX0%i!RFyX|_Q%U_MKX*`tZFXR-Q;EEP3KAHf6Mds|5eTK%JInY$?>L0j9aN&tB3VG zQ|GeTtrCS@~F(Z|v2khWkgW!Pho;FpWR)7dKX_wn^D>e>Y+#60LY?dMc`qz$V| z9bn~;nO*!N`Uax^Cx=&=C+|CBw97i;u~N4?1M|et%`w{so@~l3gq@nykBWv4?`X2e zke8A8;)UAhnaa669K&{+vGF}fQ2{0zd@|+4+!;Mud{k)&MLs-L+(K~Yk$?kAa>f~QqGtB@U~VC>nik`lF34N2`soDs5< zYhz;)7>rQtH_p^t<*x~kZQJ%S%oDX+cGzx7#b27E;Y1^L_$T^f77nJLCp$*}o@;3> zH(KSbbT)C9a(12nu;_{|L*(CK!93{-Xp<>&ftGZ<6m1KCAgy@j`cn2={438q`1*;L z-iKP+*Y1KlFDt|2dq>}G+#jn{eZp!4s!gWQD0sp}f zt9J7Lx|8!3Z5=jP)$8LDTaG=oUD<|5IiGx6EdBOy-=Bt#A6nhR=haf2`fGLa^%V#) zkoOwTL2ZoPxhhUpL!ZzsFyZ6FEo#=nM3S>vklOuf_SGjJ14VBWZ>yEqCQH2M_hono z0!hvPS(K4WI7||(^7K)B{yl2jpQ9ah9g&$q0{WYlFsIR8i{$%FnMY?@;+p_jSg(Z@ zkC$Wv(`Sp}tuK6RdjY<%-laDWyd-D1CKGw%7>lx&GR+k#uo#I| zL)%0SzJ*?aaU{q2e#t(@^2}(+{jw-Cf8e0Nw#PaRL-}UGdKYeoA=mp}L|ByRP?MTh z{>lURro;?>?8Sxt1>;Xn)Z~uCyCY*@y$Wv`(LqTLJhOcA{QdC-&$&qwH<9mQRLNRA z5~@H3uq1i_rjw+vVijvq=KV+w$O3+Xc7ll{#hpSKG1SOum`3}nxL`T-Q>1s2JWo3t znBQx>R*pC94)_fP0r#J_&kf%>Yo1Gu!><+*OI%=vdI>rtuaHNCMbr`#Sky}v{QzmD znt%;X$~IVG1^I+L=g-a+Brxj`;BY ztT>7_5YnHL$a^G!kA$`yv!S`W0I(p+pyW$Nf(kd!zE%YTL1o4KiUJH+10enH5_yh9 z1{0wWArP97kB3o2qaob{l{5f2iNsO)A14mYPp6p|9V~>VMs_D}@d9F?^cW#zFHDPH zLL*e3lwSQJrBH|nC@bb3k_Oh#=b>7mQ2|W6rtu0xK1GI;5Ka_d;xq1;;QT)x$W-+Z zeu(HU2Zq@I0W0_)@rXpo{EyHG;ZI~Zj}QJz606Q{+k2A8M55|Rls8GP-FQmgE5h*z zCar-qCw}u)RO5mNw*_Paw)X{y)K!Ii_4d8Bt9F=3x+flVHOU5@fCzTs34VR% zon(jTGuWwmAReXp>vXn3__C=6b3NC2+DRUy0>NhUUu7<6Qyemw1;k{`h+gO$6$1 za4my7& nPr`V2f5Y3)9{;jp@{;zF?rV70NOu0=9q?_iW_^lAbR7G_NA<3+C;QQw zDX}Q|cfkhSdHSqHaMir8e&T)T5345O+)90uoL z!iUSS5xyJ!2 z(atolb3!ZG@yBAgR*ESsUX&;_&&_ZCkWoWE)Fz7LF#ckBl^7v5xTU>7;&+sNI?!Si z(bZ?Wj=W+`56j63Bd?V=OweBhoFim@NZjNW*egCr9*hLJDzq^PdsA(wLUK<`OaX3{ zb-_#@zyciBUQ-$2^C06as`%ei3|mU@MdP-5Mt^ zg5PG8X~R`#AKJGLV)xcP%F_Ot!$8*c)lif~_&d?nvps zN9EiUdoh=aGE9U5JRMiB@49&|c|)y#k*ZIbf62S6rGGl@oe(%|f6mO0Gfli0RUgHr z-oXT~ZIsgDs7*X#VBj!D@mZ=P0Ot;vxSEum3EU!d_KkwH6xV*oy_pgLRdQWto`UH+ zgHs|;sKvKH9u8|Y?YWEb-cQ#Wv=wZ6ucfrz!|;JzCENbpb}dbiE~H=oHS&+vVey?N z?wlcT>2-n^Ws6O<`cj1>2D;|gJLKoplApW(xCuFQkhMNVG_lwfxwSX>-a&3jQNj7! z7RbOIq(t2D3W>#YUH=;R-O7F(xY-Cawb<9~!&0{VCNy!Kh=*n#z7`L)((@V+e4AeU zK3J05>H84a1&B2t%;sqTMC1cdn3rioM`g4BteUKhaSpKSr?ZOFG3N8W?^4P#8tlfU z0^i-quO+AT|JhyZFN6!vSdYVQ5{d@{)(Q z#kzjVUPM1+^MQOdp5Jm^3pNYp2E8;u)FRQ_)!Y`7{g05+Ea&$QUjs!>;jV1lJ5#h} zW#83>&ss)B#!nypcMU&c>s6>e)+w{Gu%7L~@F8thv^lGVDmC)H;2(HNqvey?NMXt9 zORyN45gC=7!AqnBlcDdEBA~UFRa7vfiVdUk{#bTYpZ8oteAhApN(sJ$PW%E&GUlUu zGo0O%j|U^!VZAS{Qf;h?Z=h_#Ycl(pfa0o6jYJWZwwG5F7{&bHKh`T@+*+O|%;HK-(qrz6*LXs&(yvUd*Tew~Ycc@s%Lnut*HcSwk5ppB_$5PZxCI$d zrO9z%Z7^x(RUDXIQeXI};WIiTnT?NllN89gU^>YFRjUNNF!DPL!9q|c#2gEvmGhNg z?W_cB+^O@L1aiHZI~uB*Mu9OP+5cvENHZTFO^T}?kzq*yHo`MP(=i3Ql@w$zsls^J zvgg0^BOc+ygNsRAX%ZL0N_b`^i1*Ary(AePCX5fqmys@csAG~LtSGHe)ieO6m=EM? zZNn`~hqAHKEzYD6Q*Sas@N8=LLY*ZCdjs!C(ur>l=opAsaMIeQ(<=tMCm@ zk{}#~O|B~W;G{YxsgeQ9vPVm4kQWcVhv|m(Dq#bVzlFl6n=+#SaZpZFA`jahWzW-z z7isN0XZ&m&7cx8z{2r>}d4Qg$%+-1t%flG*|2@GrS$a$@thbq^y5b=-N}mKsnR}XJ zpQnL@@C7CmsnK4Z0O6U|XkSToA-2m_Ff2|3oCM-M<41ghGJ{K2V}0dNr1$xrjis(J z@;gbS*CzKiZ9%G88YmX}AI1fiog|@IA%G|NF?m(%X_f7rXkkc}FMl&}V2Vb+CgCHH zI(H2I1_}3mfJrB1@Wa&z639pxhzVs}CjCeg6KnwF><1-6nNff^G%xYl6&0qG1YAH- zB(Tc3mpR3l;lWH$5x>}A*mKmpL;M*WGgfI5#T1KvLo$lJdQ^}RMF#7AdcXRR)Zd3R zz|4DPQm;ZmXeFco(#G<;Nz|KYG)bTtV(__uvsf4D`}RJ`kNTS8GfpwSmM9^8Rq+}2 zH5tYdbxd3r5J^XJYgtconLygcg{^w|x)Mbb=zn0H9`l4`OI(r`U)WtRA9}e90&BP% zM)GDpWpZ}%sptGd^mz)Xe;0)l98E>xc$En^{bH!(VY3vY@#s^5Eh-e+D^K{cJ;!0- zoHwA23jTI3gWnpYU|pDG?y**Zb@jrnDl^+efQi@k;^FW@;2-iR`jqc6+ftCsgIRQl-$va3fu=ahN-U6U+JLW}(v)uud} zs}?8YYx}0)oJAzs+dboY0K*umtb_D}^_!pRp*GIbHoAQoo=1xuzL}L^K>N|tbufnX-8^TN`DOMqu|~OgZ)hg?sUOiSk)%P z=BdL@P5V`_aZzxn-6JfQRrC4F`A{GzUHH=6w2}Xd?q(c2+d%{zr!cAo1Z9d{ zY6Wu-C4&HBqkikGkvR~L3MF&*u=&R9PgPNHs%+#%_f{n5L6mo@1w>#U#CcLKejU!f zSgO5gx{rsYG{x^UG=8jgP0TcAQ2x5Q{*BEdCpkE8fp4*Ut3=ETSN&*z?NlM*G|F2G ztk5us+B#i$+XTFV)=Ud4LqPQRZ?oO+!AI8y|5A1Ls(C&vsBpzML#RdKdoUY;mcF$9 zZQN!j&2H|JKsx{Uc9S(oFJ&0A=Hg%#BkoTw7uoJM2T%wgZ)vlGEu9D2bmJ)FhTX)^ z2ez&cyn@^GIz(sbJh(2*4;6E|bBBhu&e?`8PB8va%E4`)E(G6_H8g!p)xlHGbC1@d zE_$2Z90JmRg1kPs`wv(HcS9JjOzJ&e9A85|tSi(V;s9=`rSdc@!+k%_+7A{9<1-kF z3hI|@mza_uk8fuRCZ_=lMzc>7N4l!L5lk9i&m+216LnItuKNpN9n{$2zedU%O<}10 zHf1Z^Y3kYji@lQlT#(5&jrctA!|o?BVF=FSx(RVhtL-r{SU~z2?wX3~D&DVkXER)a zwLS#o7SN%rw)8sn@L=|Jt>eX1B3;hemv1w)!f&+pSL*A`k7S!AjIVc3QJq@kSNN*4 z4s57m!S=IH6^jjmOmfB{g^(a;+yw^mFL(RIJTT)jv8VN9)cO|0BD*e+PVU0JWw*7$ zd=@H+J0CGx__m^a(AG>=ObKmRcAd&KF*36p6FU{(zHg{j5an^@I@)a=sb4;O3BK+L zKzIU7LR+gwXTa_nEyh7sqfZ%-L1&6)SgoLuN%&*-2=3z}Pw|T)ua(+ zb>QW+o7KU)Tk)jmk9(0~NrP`UZqKi|-z?A)w+q9DAB9LtxOFF0o41)>6u;NP?<{RK zI1a8?hMetOgzgpVf{ygkDF9b{&c2YwxsHn?JXWXw3729d#LN$&Yz^|?S}NlHrJr1> z*m^$Kwq%^X?a{W;@apK+%HG)Nz}c-@+5h(X%eW8Dp$m?LRkd!L5jqMSh^VR-=#Xl> z#YTQD6>QM|BN-6dgz746jM|>8Itl{s5nsI_6$@86bP=r$!;b9bUgRqH_f4$OD~mmD z&{;m32UNyog0IG;Z`r$nF3&$5y^wFk3UH83=$5wy|EoT(hyo5==nZ=kh1NSlI(3tG zX+h_i=4gj^8`Ba3P$}eSiiUMN@k)I|YQSgYGID+yePBMz=;e3W=6TV@qVNCXSYtC& zSwtU1$PYvp?y$RAUvKs`7vu7F0-o^Ob@V91ubJ!d2e%-ljFrQ~3e~?6>mT&RW5Zd~ zu(SSj2%HWs*L%i)&ivWL1??1P1qOLlvwyepER!(GRy-n+!wHx{T3!&Rn>t#ZP-czc0LibWV=QvOBrDjynz$b1pizgH7ml+h0rk{5HRvLvC>Mb|hRbo#0{yBKF1~Kq+;IRT%Pb zO)I?Uu2ETG?+^*X-aPrn3BgR~Igc~nZ=kBG*WkxKUzH0Sya4$ zl@q`Etu_-Lx>j1r75F|k@jU+b2zMg6RvP<3#AgbS)YcmWkor?;4NNa9z=(knq*bqdk+wM()d9Z4s;X}|Ni|XUP8+vMJ1lh;Q zS5Sxiycoqxh{b_M7NJL~q2CspPxNOxc2$J5V3J9SdA9;bf=D(r5*97)7=sKgx0BbWiecPr=zqNOx$WBVY`d9UbH% zkDm#_r7H^BjbWOnvWI}2yP=L|^NH=b%Iv2TW_$8h=h>lI$t&*OTeIyeEti*ya$n45 zLpaaXrfVZum85y=u8%y*Cw-a~k6=HJ`EmM}<9>PGoAGa`#PR7Z*wZ)(cpS&BTxehK zM>&Z#+`+U$rS@em4WiZs25Yby1!Lmw7Cj6PBEXhG<;^t$traCc#@IPEMMRe657cQF z6+G!W`LwSR`*C-ATyVWeKDc%}bw#-XEC!MBeSc8Dp;G|=E8mKS<}xRgZrKJl7bjq> zJc(l|y9htxc0X|;Z`Ns*L%I@ix=(lgG>SU*qN)4fclCxld0SBHV|mH-UUd2SMmc~e z1txv>c5}n6_=nc+9b`o9A2PQb3>;hr1At!Lwf_gOKu^D~pE)DlJo;-*fhxa*&Ou1e zZ;HLL^VDa9ca9Ied-|u=>h$dI+mt>(v*{PNgImtVm5jN|_xS79M<>2}!tbz~|KsN8 z$DE35h}(T3=C7`vLtmZ#;o0Ncy=VNG{KNy7_kG!0mv)Ri-1(*N?B}a~894M2Hs(~{ zH8=II-;ORCzqsVm&`!(JqOXn^a;5y&HSOAWG_H@fmbUMor0Xb+^DbOe)jRl=yMI1( za@C$;?}dj&U;8@CV|8V@a$mmd!>udkZK)b+@g4Qh#1}p+@Az?P%<$+#J4d|u z{<}AKEFRuFddToEI%@ZO91@|REc z?Kog(&0X)@`JVg1K~-(u`TU1Br<|JR^}^?>Q=hDv`Q5OB*$38?CJr4L-phS;rwbq5 z?0CJ|qkVo#`i;?Fr7ey^_}(5AGR|w6J6Oma#P}t;?N+~9~4-7Xev88ZI& z%<=hADG zsCh!b3rDkq8`}CW>zcFPc>meKYf>ZcdFh!Bb?rwcj_bN-{qK5!AF?IlG8 zV>`b6O>j}<;p_+9>-#<@CY$)7f~s_b`yh8OBDuFCl7}CW+V~Syn_fia*^j8y!Ng5H zinw`ciJNyMarcfR?mqVs_qImj(bi5p+N~fScN7ti_M1tY_Pa^Iway66BPd~zV*uWab&owaA zMZbEKg|F5hW8piyeZ}yDBMeF9V_!4*@q3Ol-t;}gf)N{Q8DBr;1e4$OE5m}zn@%#l ze@y&_@##M>toUQ?DHeWn__r+G!eb0|;kMHZ*ZQ4d@e|)*SQ6K-j)iM24C^c(GA#Jj z>nziEAc0}YcP}#3Eok83A;Zow{rBfHth-dfP;=b#JWC%K!?2?6X@*Iv6AbIt_N+%g zFw`||Wk_l-GSmbIU10KSnGAKhoeWDnXW3{Z_UuY z_-Wzhd7s{|eQsz~!eCXRHYDC}%#s7i+NYOVjXUS-wU-{<{pP}c)3sZcEZO(|s(IQ| zugu+W*T@`gu5>i=hNnsU`_<>BoEe^}ZR+vM)%t;1+PU4&L{>iLs|^WTyl3{+Xl?O` zx33Q^NzpF$$}D{KJ3Z>j)W*$vdDYrEncD07-dI$5k6xSlrQ~_^D}y$?_mSQ2U(D8~ zc8MuoW6su&9{Sm(Nyb^)lk*xn{(erQ{k`viJ$3Jl(|$HN@Phk}9PNkU2X}RP{(f!$ zMKNv-_ho92&fR@>&i-s|@}{pBdU=f1ejEMnpIv&-*G`#ttzXrGG;M6;lTqr8_iA$& zOn!69ciGyWkNxpL_t);zCOupBSjIxFHudMS@9iW<`+V_VEBri1Xlp*aavzBT|nymeBewFD^daCx`%j2tcW|MaG=@sE0eVDGDkoQBkH&-TWLw~b$?YZ(^?Yg}I zANtNn(LVh{m!oGlWoyF^zJ6!W>=bRZI`X%j=MuC_4pq*-@I);7Aw>Jp0M&civTSW} z*`~62@94FC&g|RXB_~Ro+#~F{U*9rlXT|?MSDTrr_1kgw`@xZM+Hv`#e!k~VlQt_S zeHiUO=n6u*7Lx9BNav94R)b~4@FA(3c3zbfBNVzS<*&(ch?Sm-MbOqyuD-IS7Hpy~KX^kls; z%aE$E2beL`;P=bk`K)V#5$cJocu9 zG)qo4q~L1q>P^^6Qu-@`NhFcY9gF$wSa|lo)oMC_pTJT?;YzouImwz7P)&E0)TA+^ z<#3}ZEyt40MT_hPOFn%+3dT{&tp=OTNldc!nUq>>so))>30!03Z~njt4ms38OA+vJ z#4}hdw~03k%Bct6(_MWvY=;mH8$~w|zNf54v16}>jp_6Kb~R)G=?5vTfMbC1@BB!~ zG1)9RS(*&JDK*Prxuu+rdQLakH0%`|DLJVIO-`D|EcP;|#}GnyGIi{KGL+?S0Ze9A z3}rJ3i)HzwJhLIi#x?U60(!Hv!3qtu5^4eXb-)m4R|DubYlb0N4}n=mlVOaeUzW91 zJ-Hc18-E>zMxSPb5)Bw?w_1iK8%;wEro{t9VnzFOv|pMVL^N7*O!Vz4BEBOZu}dj^ zmrjlyQUouu=hzJFbtJB8S~7YZ8=Z1)wF}rBl7(pHxo>(TIAz22=NfGpv@Ka}dW%!= zKg-ss9$9%YP7D4M<>TkQv#wkGooZlB!8wk`Zl$KpN|+oR+H(C2xN87?I|(ZVZAFS4 zZjIl20F*H+D<_vKrm0&p>(+Fw`=pijXGyoy3b$$k4U3^iGp1<_*=Ae*z`xHg8JZe4 zCOzGQS5M#8gN>OvCEJjl!?%ngeemq-BcF$w7Q*-u(ETUY+0sWEx(=+sUquR3Di;|Y z7o=-mPJ!%{LPpn$ZH1slkTt4Y-wPTlk^i1U$LGzJN7ELm#c=uf@3QB==qQb8xm^GB zh>M>XU$JRh!xQ5>MXkQ_`0=gXXAPqIBF4<01($Z~{Mm5Q<@DCH4lL>e@7U*z(=~qV|m27 zgvGKv5?_|sT0{(E%d#?D<0aCFX4f#LFV7_`f$1x7(U-vD6+u`dIC_YM`i`Hk{%(Tz zU9x0JYBF_Sad#EhXR)R9<;5i>E@AgFeWlJ}2|Qj|cNNc=04 z9U0akTf*obsAByDhOuQ${t)I=*KFwyeNXnMZR9Y%+)f91!h`P+uAaWTmxOi)o{U$2 zvx+qM05@ZV0u_m+dM#E&!<=88@Q;q3q$KF<^7H49xL2+Ss$b6G z{Q2`;NZFld0UxigD3BhnKVSQVM9Q0+o1MaS&f)iv5Z|+vk5sB2y*`JAFe0CMCTg_VP}^glc+rz zB-VF62zWPd6hGf6mcggOiF<=?y0#y(IX{w^scx2*_7RD9Lmv;9 z(>#bv(Z?xnclh3ws4vz6u_PJb7p zQ`5C*v>2YOoCQQxucG6;YA7xNT_JZ6o!dF@sh_J4Jw{zKxZdgO-^r;?ceK+Fb>4&6 z5it^RAkl?_{cfMPJ+$hOy7I9~_i)d87edzuh4`O6RCuTjt;?0XE=!><1E8!v%>RzE zY9v>cIdD8XZ%JZu?YtIhb zL!Thz5%_4H<~DdiS=(S)wV-1pD@Ucv`BSw9>SHY-6ERI8d@ph053}}gtDPQ1qoyZj z5a?z8dH9H2Uo_>!VnULN9sYQo==?jebEO8`ZczPH@a+U<6Hglle2NqALAS}m^M4e` zLa6L<&LbdSEsN_~57Dnd{lTXY?AMgib@i@3YN88SL7s}`10VXHeYDa=hh_)(1U@@3 zP6vgK#+`&*-|5hyl!xx3?8+@u!XG|;c5)Q%j@{l8*A1$9E?*{r~p(BoSXB3U|u&WP3PQmpKK8>hnn4*m8 zZ^0h;_^#*ju~f%uR~^Sd{>W)UMq(U)mXE6~JL(9jt#jma1nPOc)A=aj83Y+r21Dn2c_`Rb-9($4QqvMeGP{>O_cFIW}ppaLCZht4a6>OWt+9bDaDE6~= zBL*RkLLAQe9^O~4f%Ab~UmiV#HF*B~c#;HlRrxX1^^hF5PkjapKjKDnc@okUusj{- zQ7VM-Ytj)}*GcGO=x?~r9=WwI4`U*JxxlKoo+<*MM<0=ZmcK)0t;KbAv6 zG-qqP#T9F{$fFqY=nnmRSM;ICqjs=FF2g5pee37P^`US-90EEp&PMQMKi+q_oNu)M zoH!iH4xe(2`^X4LH^RX?DcVpp=*2A^u#SFQVD zq|~}Brj@#mZsC4z!EN#w4Q-=s3)jWM2(S}Ab#fm-@1OWJ=>@3EBByJ|yHMXd6!pCj z!X~pYM|+3!-`Cfv9j3d-YUsXlt=aY$(RJ`8{5M*3MaM7j`2#)@Z$jriq*x98eN1cV zL&4^bc-{_zHbvLg)9+N?0P>GXtfuTX=`AEg?HoS_;?udRv!}eA&d&4l`FSU86HaYb z2jP#vNB0azdY`IBAGX1JN(pYBA>6kOy^oeI(_3i*_td`dm?XhHczt+1zsAt;6vV5D ztX={g;~45-6?EiFI2)8`#}^g$ehn1EcPa|GM^d7>oFX9-)M8qt_C5WpKHz00B+>Q7?;xWX_h~7idkBB1? zb%=3@_aj;mA4A-PScdp9Vh!SH#P1RPLeLM0gAvCdPDGrIn1PswxC(It;x@#05vvft zMm&f3Q;4J8GW*fb8xVH{yUL@Hk3sB@*adMuVwNIZwQ7pN7EcFZ?dB*`TFxAD$vxg+ zi^wrqbFvH(HcM6{pAjHKJRm&EF%>d3Cz-zznuNK}q_ZY1%4$Iyo#=_x+cM^mV5);F zbc#*L326$=lMR(d8%>5eq=ws-$|KX?Plj2o#&nZ-M_7&{3u2>jr{|>Fv)H@R=u5`n z$>w(&nqbH_^Q=jO+jM)D%^03#a66=|#wU zZqYeZo5?Y;SR12F$IYuJrJe5H%Amo`OIlnZv0b?KsEjuOpayPV*%%D1{ zC+NGv$#}|W@`#*NgZ$pvX_Mk&CPj;x#O%yJP{rn0ojkdc)~ZZr#ZQV8`Hd&EQlP?+Wa~88I zj5ixn=8zduyv+jtq98_mWb~Y{*eI5KB5!Z81`BIKrW8X&j@@K~HrkDr6}^l_jY=iG zoI(@Wo7f?cTw*OO-)b{t(<#z0EAtq9Bgt-#x821@8?ClTNJ31s24|W01X=2&ycC0( zHeN_YbIxQK0j%qfxg&XnQX3moZe_P$OR;1p?e%SU^1JH ztyP?ZrpTa*k8HNACSdDC-d% zbDP{O+K=pD{YXoqPPA^E1he%PBc1G;L-wc~uWqE?C*&n)v36?)H9Op%mS(V6=^`#i zJTRpg3)9UfxZrcAVN9!-<E9Qp6H`@j46 zzr9^3j{lE06G`Rna*5muSBj(+`73%Oe-$?ZdkHtJTE4mNIz`=s1q@3e{{ELwzN~3Q z|MHt0b%=ZaVf-+}w;}%FE%jTvkqcWIw#;iazV5-7*teM;@Hu(^Nex+Wa^cBar{|X+ ztvy|LjgVmv@{|qOZ@0bozXl(|<1*^?z4!kNhv4TXUSDtG_1I1~_L=6PHNnHr(0jTauNMFD@z=8oPw$a-YfFXdJ0Am4n02To50n~IO8fQ^F*304_YnxWt);I+^t zjHBVh>7G&rL_LCH9np;7JQOgI$}wC$lCIgQBY}V!5MDWoht~nt0*@Wd?J5JTr~Gd4 z2cRaDt_#siiJ^2aPrXzUO83yzOAVo1A6=yKElE~|j-m6FkbVr^Lo3PMcP!m26v_$M zNXs#f?zK@b6(iC)ikDPI_tG#r3ROoM!sy;@b;LKEkn0e?I-J|rfT)2R#R8~b9bjjv zUP_!u_kPn$)f2g0{*$Qx>WFy~-E+a9ssn6*_(_u?KPg$NoC5u|bjhtSijZmuFPld9 z-b_;!M00x@0AqVWzSC*FK)uC469G=wnEVL(LT1vvMC(WeU~j2G)f7j6<6bY7#1m2o z@sbkgUORfJB7yF~mnNL6sW~!3dR>z2~JarIL9GP>tzimKp2nopXlq5$esby1~$nC71>RXj}h@H{USJVMBC^gMbD z{0#bakJG(!Q&mlm)AR;aMIpz+l~AAH-|AHy{huIYDJ}mKbT8jJDfUTPALk|A8d~qr zz5q+9d@bEO^t_Z&#M@yBU>$^)KgG@~mG9GpGy%_hn(j$iM=Als;Cxg+Lr9D5! z;9tOTpr>vNA<=+=TlslifLOPcwxeVz?-jb2Ub3WqmFhL9@?NF+)l0R2C6LblHA3R-fF;l zs%IA=?!BSC0)7Df44r_Cl8kP7Z?f}HYJ8LGO;SbfrgO}7ByTrA|B80AcdklxyZL!f zH_oO0NqUR-Ulnih^S9wGUN0egpudHDGWPIx-2fN~JaR8^w~KC-<%C>nbJ5Mef}b~e z6?B~$)Ei{gH&*)ZC34VfjwTGa+xnFWG z{F0CxB)v`HVP3B4YVaq>>7s^7)ZQbs9i5kaYk0oq8d`7llJ8M|9+d+2gMO*{E7~tW zy?#ymGrd&&HEq8}x1!@TUa~|to?ZlKMy#u)djmrIJ3;+kFEyRu@f%Ole&W1T`VG|w z`JN)=AlTCY*Z^4eE%ft!px#bXdy-Ui!`i*H9i5@^^-^FR-BU*|6#)*0c>ZSz@qqqM za}N9iJmUgA&(5m?zoYe)Bqahah43=KQ-C2C;ra$x0Qf#&<3+lsaGk2WfyRe^yn&ui zNvhgQyj+pr!}S*8h5i7~{51X#v_CvA)n4Z9DDX#qJxKbI?&Sv8zn^%%A&5zUcImvT z?q}%7sU25%yP=ck6k`Dwxf$Inexv=z1y%9yaJ`4?a&;5!htk{%|AhLL(%nk`g7QMR z8Sc)b0W)quyH-KJ)=cZ8j=s+xt~=*djezTDKQ2k+11N`1C6PoL-(4ar!B34I5=jMK zF_5e2dN+h%|)Q6u0{hnSG*-?UeO_r(w`$BkK zXNhzIjO{9s%Mjn+Ut;xN2-utUM}WufqU&)bxDG(Q^pr?H3Hs+=5?pVfpAV48e44%w z*aN7$OM-TpB$WaN!}XxHuf+O=jD8ZF*XO13el#6i=lV;e0OA)8gmBR3KS*NN;gZ1; z*#zOf!4m6#3ISh&_7^xrf_|WmWB~4mb{#lWg7yX1-=S15Tz3E~AYDiZ+`{yO_820u zej{Xoc*lvux20Qd>mADJn! z>th4pL28E?$_ZEp*a%p>NP>PLSruuKh&#O>v`cWEz3A3t=k@BpSYquzV=>hS`Q}Q{ zUnWUrz@4-o&4=~@=^BAV-~Bt4|7wZdAB8+2kpu{*Yd!7(PS+`yz8s&|Mbe$dzABjlUYSHjK#9~Cc zZi(7M*Xx9UKk1qi+kk&M`t8p4kqm)bJo>YGxYa12gD^#e-Hy{eT?<^}d$KXu3bwMH zy#t_trf&qK`&FpnRH5sMHGuR1GZc`n&yJOpdL;G>xr`RV>At`PErip2i(3e%N7*d{ zqCB9YmGJ6T!s}WIZ)_#})=35)?%PVZrj_uJ7Q*R!bag8Jdw~WgdFZ2XPCMC?^q7j2 zI*q`n*TOmI;o#==D)!7H4*z$7`#N~V=d{mu@W8_=dCw|(6aiN|js6$csK_#>{OLa1 z8p8K~m57s~7LFl9hL9;!rjR*v<`ARNNbGhyuh4=5_*X!Ri;Kx?uf0b0?b}BxDk{kF zPs#VHB{)KpH7)OV(Buv?c97%gsH^=;7v{uNSnvo}0ULDUI-RbJg|3%~gMZ z__Id3&pgN>E%4l2${P+>RaG(0rXbYt-_On0)0jMWX`}iwByRo`dG29#6HT9%cAfKw zX#A?fX=#T)Lw=phvmpFB<)HsM$ms!b9^(2r&-#PKuc|uyDG&IA=|4mB=N$5HZeD%3 zikb#t)V}M7ublz*JC!s0S6p9Jb-n6$s)O>Iar2`f!u2fB58UJZL!Ab0syYlsNTdEy z*X~^2@n=2;)I|A>M~8Qat~v}co}lhhUw?h$uuvX>@un{hZ|$?Aip8ZL2)`UQuDJ=4 zvw1PF|I3#Xs+z7JE~sGf4>vd8nDtT9btb0q!M~R_H8nFa^FLM5z{NCv6+LRXnCWM> ziT9Bf;=#q_dO*cPb#4U{pa}#xeca$96%gK0wepcLo^!eht$ZGWPjdm0;Nu1#Px!Ql zPe3zm=f2q1|E`^n966FqpFW+$$H$W;OP08_@uH$4vTfTovS-g8*2cg7`fGCG!UegV zo9WM5;Mu@j_Kqj5i3iLNG{2qp5qapNpFc{=%png!6{UUD-2Bi-KP-TjkonM0zb$wh zzC85eg?Y`*f2A!ubYa%4Ss$fEkK7KpAam-X8O_am7c@V(a==IPW-TBOHNX7P-dR-N zzBN?;L(R=U{_#f{VXgQ9LLLkVX!i9CXeMs>A-DO6IG*@v&;3Mwq+@=%{p@MKe*MUx zL4)94D1?k3Kc0kzg^{SJDCWDFGiQ?7vuBgJbLW!#?z@jXm^zuHr>B#J3m1~?>}+DO zSXlqDY}qpMl6?Z%zGOUk>%p<);q*!5iOdMHJ|~PkZ_$zWmX9Gj3!=!z<;mooVl(-4 z?KD#TawZAG&BO|yS?8L` zyo=2wrLLJIUv4JLmoFzPSFR-M)~zGYKKm?r?z!j4rcIkjNl6KL<&{@h{g#!Lk-dBO zvcBy7_unT+50sG=SDMM*#%A)#C!df*hYpc1zW9P1IdX&?J9dnmJb99Q`|Y>n=L@yu z=r7IW?Af!dU0k|!iCq2pdvg9-GihvWB!B$z2Wu+NfK>83!KOWLYL;AUpKE09d z1K)wHg7ljp{Vqsf0qJWXeZ5oq{zLh1f$oL$Hb}n)(!UPrKZf*2Abl;QKMm>6L;6dQ z{%1)4yHon1{o(o+25o&FTxb5D_O1mks%q;WG83&7ueU3i<%kbZQZQfmWOyl%BjEhXC5YeyOA#M8vAl%$b_+9e-VDqPpqWydqS=j}qLxxwl4+4etmlT`1Bp$ zcs3+7Iw~qWJUT2mI3zq_fS<2#pWfrg_mU%oNAYR?KZ-wuhbQ>=!v*8VYh34}W5Ob$ zgL(Lfu#n);kc7K&L7zT8JzeLcVzeRAAz|TR3=g~p-tF%{HsKPI(J|4ojl09UYr?>R z&JlY1^wjhk4|pCwIyx#iI^oVPw|nz>zQE6QLEi+14-NrvSaiZ2UAo-vJTGwU?W18N zqZ-Fgxb2T!y4*WPT;MM*=&1pGSUApx;QSxE+-_LKr1jRXin3zIxEnze+aPd!!KWJ18vp6OqIz|v7W{~`6{1d_lX@NpC zkI`-1xGr6~@CA+M6NcTCpbd!N3GUjZce6&})fK4Cab_abiMPOzrOx@S4iS(MJSSs6q-lu1;j z%%KCy8ak|Oq~jdF>s9a^5K*Yh@WCHsD56-kSIh9x3_q3O=P>+AhF{O{n;8BbhQAc& z{*$NtCr|mmny1M3@^tIgP2AFQyLgdMH}5_H0Rebyb2m-5ZrD&opfg|4@zz`K>fW=DU%<^B z{O)r7pwamC5AgK7#gAe7{h{Nn-MqW@54hRWvqSr~ZExw&hz_s|D$g&|9}90 z{9PQ+-{0TAx4(Z+e?eb&Zn)Q~XHVxHJWDz$%4lrjwQ=>!-F)bwx(3(d1!+B;`$Kq+ zTcWr`)1sekMZ-=Q7T-6idRyhv>u~RWH=i`yHXV0GIb?LFghYxRj`|Y=%@$m5QA3b_>fQu$?*Eo1xCHQbP{DZ6!nE%kX zZ(qEw5xnZyGDu_do;r1E@Gx%t`Hn+}4n523Xxh1RCw=qHH^lLj4jw#+4JtZvBs4S>&xwJY@ER&S=D4#97s$1PtK;*nu5)<( z86HjFH7zY|a6?1GFN*UOyRF6lcINk9wn03Lrt9$G!}|h1#!KM;?z`{OYp=aVj2~50 zR0zC}A3siCfBiL8S69=%efz|9fZ-egzaL|m4I4LZT)cJb*2SE%MJ!*wd}2mMMtFXH zek|wJzzwgo_3zrX>)=(ZRy}mjJ@%T4ZOO8#~Lqv8#VazZU%8eDlrKEJq*Ki4~w>_wL;Sf9S`jpMEN2@a30ZitoS? zHo-P5jt34L5FNGwdEf}S!FB-i-h1x}{2@cOe}Wu-`%T_u=xqG`0{?yy=h=quxf=Y> zpFd9=hJ^kH1qJnm9-{;Q4?g&Swr$%+EOX+VS=cc64|%-v&O4$5_o}KYVJkH?HR3a9 zfDeGa!A>9};I`#^qU2ABf?O@5cC;U@mz!ya0Yly-=X8wZ)mcg+1i0)w;(hm`xzeqG=A5q|r#?nNq@c-$jpPf(?`KXLLO&uJ%eanY z8iumoWYjqEPdz}?dwbKrhq)5|95YDzf9OBQBSLqViPUrO6|#U{K{q5FuyN=a^d5F0 zkFX20DPI!Z$23H<{*OE4q+v`o(TES6Gz79O+`XH~Z|BwH&%Ss~pFVwtvK;bZXYeh} z(E(k*oPL4-IFGmhIQSWLi#x_P3K~8qieeffn1=FG)SC7K_ZKgR|Ia`FOdMyLbkHEX zq@y{RG)KpU3m0hLYwO9pD4JfJ6HL#~)(RvZ`kLteuZSkq62*XqPh9rQIx||@^E*y^ zhEM9d!)eb0wmWT_J?{IL!=L56ddQF=KJ3p|0DtI-I~~w_=(Rf?k{0MX^ytX@o2h8Q zXfn=lE4QW1 z;qT+))2RO(;}Pe7ClA;!;(?R}>;c~;4ZxrM9#y_Dooow7lV!meGB6G6nFh2Z_MZqY4SJjT{w7gB(7^oHyvFulC5HL1IsDn*3;kzX%SS#0o0D`% zT0jHh!R2%d_`^@Wx-^7JpBzOcOoN$e(9d<^pLLoj@g&nwNA$pPr#-_bMSph5ozh%cOHHFnS-yE`4t*@&bCZR?T|v}w^uDt%%U6=yRI^T*J+ z`V(~M7bgt~OvBV~mh9y)ZW59cT= zfIs{qj?fv)-~{(h*gMfXgih# z(Q8b@t2ra7e9EZOuyoczEL)C%?b&fI6 zm1A5EfA;r6{~4cr;0?TR1Wv#k_5i%4OyJ|y`7z=zXoUX1nKzc+U>YizhRuta2DSy* zGiWflXjto_p#U^I7D_8qn1&hQlrud-(0~S?G*Xpg41KG4{fEy$3_~7)Znav;X0s9U zBH7h4X~|B0{qemRMDEgw$Xmog1(3$HK@WiES$PtwmDOY1YoQej3gJ(sSfXJ>`b zGfcx%Ov5s!VKLKy=AL8xoZhUIAL3dg>{%+wFp$*3cno0c_pAS7`T& z;Z(^qY-1XPJu?mPNz$Hm?2}%~45k+{wDb?AA)je@nrZke>(SEWaDga%Qiv+Yc;#gC z{vY^D{U0@IRA1l#{PObh8fkE+qa|8?{q-V!x$8xGYjqgyTpmQ*T=u+4WzQxT4eMMq z{GIhE|M3u7mFlDcP2?CHpC@o%|BZ;h?^Z251_%G_gd!B#b0>6VVvJ+&oakY>$2wp zwuLLiunz<^;hX3R*RK7IO0_M<`$27`enPMklYP2i7p40sa(vh**d@_B<0#`-_18d3x70|5A=I-T z%#H#2S6qLM9zA+hOiavD=nw1q8eaDgef8B>?QFxu=O{Zno7g4@-|xNmUXdfb_10TL zAAmb>g^Z+LNqK-i=pNQN$m<{r*aK`@*fYyPZO_GS_Wb_V4afu6wMKbHj2Q9U+O=!N zJ_zP^*)rwk=2Bc-9QEqei~9BJN1R&=T!05`L)}4x?C!LnL#O1}@U0)Lf0VZWRm<_& znPVV6+ZKn>)_=^T&)(ZY=g*xx!18YO{zGA5A+1=k;>?;gYiQZBW#=Ax=pmXlYnI?U zuPcQvfd<$G=mc({!<`oFK_Cu8?-8S6E7*^~IugGjM}q7?OEZnh|M?5>=xX-XpkK= z$aOE)V#u$d_rMcJ=n!aA>lSh^I{#;DtTs zdGqE8`wa^VBdu0T0|yQia=>}OxYN;`Zb{paN9Ym!0rU#~7_yW58;W>5Ypd%Q0)M7^ z^{`>Xe3*wTV9#&7@rIxQ{K38<+lQbbDJh92Oqd{a%VaVM{K0GR9G`(V>;V1;zauw= z{vg+e9l!=)6Brjhm~sD&$64X+?X6|G8}{tkQ>Qp6}d!OTAJ{!Z0jPv!Ph{)r5?f# zV3&{y^aL`1Pgdtc_>6HOBgg~soax1r2jDl`UI}S;{MEXu)?u}712@nG9fB>aT)C3i zXNfqiZoo};z`)PI7okCauqHwW?x1VKh7H(b)ZK8y4OfeMBmOe~XMV2$4bm?*M+f)~ zAH=a+tP`M9h_%h^=?nZJ8<|6(t^>V?E`jH;p+elufAxHCg1=h-;UnB*tUE0@Vvqgd zhaaXFUU)(1x0>&=<2vXPbRFLj1Ax1%k8obQ{@=h|;ICf)a_q^6ULpp84!PeC{{dfz zc%-HSyxp>83%&T_i$b5J4Wol@xi^oz3E!bJvVOomv#3p*HvbOpjrgnMqB@6B=Qb_L z1YM`o33$+j>p>gvg>J!jf)tPMf}zKKXNVAl1z}_Bmcp7)aB5jTR8sfU;h$*7d(Ky zLf?Tu?11&rbRBUQ_^bCn*-td?|9}R>PUJ7}f6xQOBg9Vd7;8@O9&(WTyO0CE!{@`- z!jJKqLew>w=If2Sz#qEXlAd2q-_^bd=jFZy_zW7M>#Rq=agI>OvO-+#cAarY!&~S7 z^xxbu2kv|LcOSJU8s&0u*|}iBMWr467QA3Vt)c|iJCFS7Iv?A(jvlU~a-EJIZsV)w z&2=3suLu51Tt{*qJzU2&u46mbv6JiA!*vXH9hbO{6$b-%r8}@=xQ@H0%qK7{uI{2f&r6n9dYxlNo+YaZo-5j>*2KY11InS}b z{g(aGckGuw<^0^hx$R?|1LJQP@ct(s&NoiaJm##EVJ{SQzEQ5d+>g!>?fro$c#oL> z`xfTElYO|6=WI~d)8)M;a{t_w^Z&;E4Ex*z>^EP>z^Iv`-iSIE>MPh2$6oBmXNjtR zY*nqd2mJK1Wy_MDd+xb7;DFo->j%U~_;ti0_-f>`$Ww3*pV6k)U8)zN#)En%_Owyo z!Ja&7Y*(5eYXDw@rt^B?F}c3SIv4XIj|NZVng@B4x}je7&^OL{A8KWr>zmuUXwpu* z>4TVGeeZ+&JrCds;@7F;pHk8CII)kJ@7e==^b}FT31{7O%28+CSKdFM)<@KbP-h&? z$B&!pWDmp?UcV-Bo*SpW4+HW?4h&onf3~en6MJCT55}InoFDx!C!BRp)Z2tU);Mcz zsPRA_QKLew6LrD|-xHu!a(={dUhk(bUcC4*b-i2Wvp6ERF3kxOdx_Z3#Xh2Xe$-x3 zKYqYXAGNL;4QhR;F+m^w-*EZ|IY06rb*YlBUo-l?7+dBwto3)7b@S@M{=_6i)ZZvtMRVSgR9CWouuhdLAXL!pnTF`>4x z+*My%G|kzcUzRFx5c*hssrKzYzk4m%y#@^V?^+ow>RqT6VNVl#<5C~7FOK>OY7?Ty z<(hx-^l@UY@hW{B^L|tLBPUz6YE{xpFTE58Tf}-F`8ntYF5m%<`;DohZispn_El}J zz3mOI`T}eM^%2wxbCbgxd4Q(&(Wu?3^&htN#1l`Xv;Tig)(5aIz}gNxf$sq?&enZG z@BSlJ)CsUZUGCanH>qp_b*5)rb+RQc9MFV5^1KgoKm1cu`7z>5n)Uz4u@@~`l)iH1$~5rd*=L^>eh+>Zu@C+qx&VGa7csZG=Jfs1 zkLc9VgKQIS`Zz13u~yd7{D>*o=fIvWc#QQG+hXHhx_d25$_BD{YfUWGANz<-e|7MZ zKF+#1^8^I6vn2d%o`MUkATP@~)0|pGZpY2|(0}<;{mqBfb z^DLS=b*iBIa(m70vXOCI-doATfEV!F@R`7K=gytaDy^$g2>V~XdUcXsuaA>!Zpaxp%$zxs{Qdpu zzWeSIxXFD#Ss%i6&>QJ5a9`r4O`G(JbFI*tCj1}#&+_HVAH#UqlSj;l&p~bBkw+d8 zHD=fau0;b6S&Us&Zcu@&d0xH+=Ge z0|zWuIk%V}^RTZG{=YdqWDdM><3?J)e!bW$hHu24ldLITD3bP4pz92~YM z>yp3$I))kt_Mf(H-74=Byw2J**DEth3ALLwKUJm^`#k^RhIQLJkwc&3~ysojs zzOLloF552l$PKRbX!5tW=vVriUG?AYHo_^+?*9ChtN6QJ&1LcAc-Z4|=U5-ZHf-3i z*nlu zn`q5!XKpynwRXb#5$jj16|hzbM+eC3~W#2D&!@`7_u2m1(Evw?q*6Jn6O2X)(1 z5hCA0zK2{7xh8U5tT*g0trBBk%@N6XKz^=DcZ)Iv2>#LfZ!+AP=8Go^PiRShwj1GLr)>g$&)7wp2ANb_ zv+t#MUoQgus}g?4jvXRbllSAmZzJb|Jm62&xZpElxmy2my_CPaCkbOAPGWw7y3#_I*R*r> zPWatJX{Ts3UgBv_cmkUT-drHQ;rVMfD0m+Mo*aOuueDL|_5ysvv)67^0t21i2~S>Y z>$*}Sp1XFF>q?Dy>RLO+vklU{IAw~G!2d=lllfDWGEupYzen-EB>wVEmfJNB=gAW$_zY$SP2!^1S&z?M{pm4 zH;VJ`(Ht5*lrX*~P03J_`1*y6O%k5fD#o6|BjF52(2unJNArd@lbxn;}~>W`vT>pQiDzbNSq(;ySc@l=iCe9rC%0Dt#~?XEW^!Krt|pI7=zZ! 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

    ~))ZW6JlPo58a7LX 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 DHcU&Vn%QFQU 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 XtL2yv!IJZ!;e#sAfaM>+0>}RWe*oBL diff --git a/Lib/ensurepip/_bundled/pip-24.3.1-py3-none-any.whl b/Lib/ensurepip/_bundled/pip-24.3.1-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..5f1d35be6dd56b0e9f5ff0b6f555d43cd1853dda GIT binary patch literal 1822182 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�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 A`|UG_je%1zYm6(84^7}tyK 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

    );S(@4l3+v6hCQr+ji`!vOXo|E#?65ct# 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

    kp!Tmbx)XMh{=3k33hF5ORR^bbV)iI-k`(lW_h? z%!;?}z^byXcO)JAO4={mDBrESZ~(_nwgbJN0YZ=8IbD2bpT1kpeeDfy+^d+?ZFOZa zW~I5U7-Ad9dT`P{4*tS(=)^JJM{kgWRoh-K9;5ObSpW59H@Nz9`a$R`WU%@d9tSucYiCnYP#wE!3i@U1?;nY@-+$BowHB%$xy zOL&T1KS^)ng^EQcs$LS!NMw*rH;Z->Bi53W3zgjfSOiX9VhRUivqbxlG?FN}Y0N2k zz1}RI$XXyk4={l|Q}B<29KS6aQheoI3{mm!(8aqHpPluMbfIYyzXro4pFvXBpu+^Lae(9?5xKM8H+Se%|-<%py?!^KQ!Lg>a>aAe|ww&!#EmC@?BNr&rb>yaXQPLRd z=q79`oekfPgNaAqkykYJkX3A80VzQ^syJjhCAW-b-HXHhT%S=*txXkj#s0;DOH}yu zTQqXnY#7HQ??odpDE`Ec$J+^DMyC>4-6PUhJUv)qMu)BiUj^(0HEFV!0D3lTa3I#V z(W8IeO{|x#SGGJtJRRE-$$?^phj6)&7E^$Tl z*lSP#W6ZDKV0pG{s}ukA!FIa3f}qMNrMcJ=aPkj$3r*!;_e*AmyO%SIYMho0mrjvC!WC&B>M7X zfYXHm0#h@BF_=zYjQqS=2}JaDcx(kq9WG1d+|aXQ%u|Uuc%oDYZHrK75*NZptrt+@m7#i(k; z;qQ~Ua97xt`NkF_9_*ab;xn0Ef2uG{BIQ~fVV#NPXArwSr<*-K_*Y_c9|L*^9(Xrg1oKcS z*pqKUiCq6wb*Rq*^^&AqMD>nZ&2Kusy=CthV)aEkor+*N+^1wX3{?pz*Bb$1jx+~a zPSw4{3nr=_kn+VJ4>-$0^udguWVe)gs~c%0;=)>}16mq<)=o-0s;&_>CiZBV-)ORZN0B}@dH*9~_K!~fjF|m=;`hW1AqWVEVS3AU zrXh@mNdmzk5=RIUrZEUZ2@F9#-J9Fea>%bedwds&CdqE1m~AOKFugAnlbc}&zJBWS zh8dl2Bj4@i(bk+I(ybo`CA-VVZu+q@yg1!h5w?4zQTu*yhWvrjzZyZHn_??ZcK}I1 zw!cSWV(Z1NHz$}$rNbYmHQn|wox+RpK!82w}ijvWPj%a$veI3>%{v}RLj+*?-xP62?Iiwx51&* z;%Ixbd$>v!=yXAu7y5zG9ZW*)n(&}0cJTIr4V`7BT zq_gWq0V^{}8-Kz0yTTZ(LVHTHtf_H|NUfChck_#(K)$y#EQJTQA5g(say1_+;`l5C z!6Yd-!sLeTH0GH=KlMJ!fO_2y#pA}BP6nzT@H~cjxD=O8Wq#p_^^2LV;8#);_W+Db zwZ~Ig!$~^FNXYwz3@ImTSUx1hT5B%)%O~a+sG{hbOtUQYZgASj0>*4J-An~yNGhro z3T(FaFgwV*tKR{fob!}-Mz)5&vVDB{?pLn~QMdksI^O#oR7Yj zXKdScH+g7pWL4?DI;#4u`aBZ-XIlW^t1rOY!|R^H-_v+&9MvOybvZ(3PnhaMll#cSL`DRf~3e#@ooj76y0c7Ol`y}*;NN5vD=1Zf1uHZPhWBr zQTUJabH6v3+UBF^9yPsU5lU|J(G@e-v(tQAdRhPXi@*Vock6+8cl5@-bkh`j5Oa9rt zcVT!Xn}2VWyLFSGKcy57?d$lpwU6NNV9iVLF7IXk`3zM7HqiSW%=^;s`V;ej4fOs4 z%$pSZi|q-pAN+!OlfpH>jd{QddV6#5w=wUl)F1eFTK^BJ|9E4xNo;90nCRiGrM4xj zGsvL`_!1x6*8j|M(1#12S)OmnJYfwS%>(;Ae|fRO_gvvVMZJZ3D)_} z=nlaP2(p6*9@*0?dpX%cfjOUG?75Eb%_ZlT+!jn%d$~0AAmD03yW}Xo+?(d39_kH+ z;Dtclp5n#2`FZ-(>C0NnU(<7VytabX49rV-!129O=qU<`M8F<&GhU-Nuc4~L>2e}) z18@q6_XNt2hm8ExA>K1AB+rYpvvG>)V?RQZL)53fqhj+Bj`fwG9%0Z;Ctg^x)M+}P zt1md%dHsz*!L;Z*L(>HsL&a;@hh2M)q9-g|@oP7X?paqeNP9EtTcUEz;rK`Uz5*!U z9P;5lR~~}AaOHJ#--n8NjD>^;SUUO(<{;Wdo_eNL>RT<9d^H&-B^a8g;yrZ^fTrwz zpW5oezG^s$%dmU+#kFmO)d%`MSR(AklZ`X)L+!|3dV`iHV~dPQ0gP(J*SpEQ z)Go1w^ze8j%h=!u=6RQJJgD=S1rG{CT4_!Syyg;Jd!-tB;;OiNWeW==MCN$I(^{XX zEu#qUn}-eOObFb=6yXg$>Rb$ zOsu$Gd8swjew3SelGW$uLh7F90d5ZJ;9*Q_0T^3}nOu_8VLCdmXWvT~-%iUjsF@lV zJ&lRG!phCcK~j64-_oKEj8UJcv^#^>DAWhw201T524VZyHwG#xG^JxruoiKcQv@UI zI5ae%Z0SbMfiuw+V&E&v7jsF#(j?Z44BQn`ASvB^WbA`^Gm!i+9m)25CY|yVxIO=U z;^JM=j8^+aRkVog)wH&~_tlH!=llky+#?~shu-a?PO+QO_0oDX!Xl)GYJHZG34IzG zhQ6MTVG=vb=%xZ*%i>xlX#-Ozz~ixAoE&tILv&^lZ+ajbb4h2MfItn26)KZM6MMOm zWA;YedW`a9Vs(2yL@%6Q#Faq#iKaVJB@c6yw5cii4@H-}8&L{(jUFTY>_A=rU@q!` z>5g52qL~9lXU2HZcUu@t09yId?Lj;jK}g=T>tyfw2|wynig6|RPNGPeLMMU`{waMt z(^ttta{Od?!Q&bgzdQrrM)EVMwiVnS90{bzac&yC$a|6uLgJYpH5QsnnW6Z3d@kDI zk-h^c#Y{bUTI^MCaUkXFEUgdLxzQ%s?qXdB8~q+=xcAIJ`nCQ^TijYTK?Bic0*``9 zqzcJw6OGj=e4p^Zttyc!=H4o}NRm&1!)(NQuzocjc?$*NiGh-v!!dq2T8LAYcNy?} zHh!bF+*uDZl+jPZg@2tk*Q7r`YiG%|yEV6>%!W_H3I3}KeT%jJ^+kRVQjja*B2XB^ zAqYb#93^3brU@L{MHCc_VrxAL6YBv4Uq3~Dy34kgig5f#ysw#2yQvYnZf4|_P2GX&~J4o_RVI_3H3k={q!2$2XfTz!u9f;%J@3f@4s%50Gs))SA8O0_)}A_ zh+lb`;j3HXv=e&jEpF){M$#S#edW(A1CA*_=+g=Q;UqCW(PiMhzb_d@WnnVlD?x*m zig|y@G-y72>0rgKza3MA+fP(V)wV_<@L^WKvC|imf|VO=nb+>gt)dhDTEB7^dG501 zxqOLpG2T+~(On!J;QNz4QGyiaqI|l;_OZeS{J6u$F-jm`>!;m3+&kLDqw{sP@i>=Q3IH?w3!$yEv)6#^Z5LV-TA*L!0Qk&BANsF_>K(zP7sHsbI zovD!gEl?Y}VGe_jc~9McwWrupjU(MRF7bo9fQYclS^&T)d?zDMEv9vOCGYv zGYQ4-T4(f2Zb?Uy?}7XMAl&OFxL@e%#+4@i(AyNL_=9x|ua`l?a_?1Ub8~^2B4shl z@RdwfyYo`cSI_ntU}oWyj0jN$HY$Y5cz7jpA!M$X934wIT%U)%tao&;m~uZ&crtf4 zyF64a?J@cyD+6#9!3jJ)s20jngg_)cSCQ1#eT%TA66|0DzUnhoaISP{u71IvUh1+k zXHj%cIZhWouw3s62R$g1H*fB#Dh+!%TqNtHE{m$qhY~sDsLQCim+ENkS7M2#cj4*E z*N_#Gj(GvKi(-1~GRLV6XDcYYwqn(o)_Yi-5SD*EP{P134|!`hp}0A2+v~OL~&gp^C-mZ5Fjd7AXeyCbhsfWIr@Bh;8n7kki!*Nw0PJ;O6=M?j18DA-bBB>5pTrsuO+tAWD!vcd-3 z5ak{GO1}DYkT%cNxGq)XQk{o0?&qL%-8M@hgq*FPS|bdu*|T(@u=#O(x+pkHHsh)4 zld7vu1=FGtLuD5dM$S-2yBFQ|eG_X5m#;bq1uH^Zw)1?>}B zc6@J~7|~Iao84a?QxuJUc7Z$bc37+{62~KK!GL^zK?YjI*4yS|8g2D9IGl6&5{Z0y zB{*!b)hc}|>eZKdsc}G2Tzc?QxP)*a?iEo1l3l~8)V9$e;fJo$S48M=I`qImS1~Hi;PDjyI37mVj2k%mrN0X^{J}mUD7LxEI*hA*?avdt`Hh$n-u- zU}b+?@X0x$Pi@X^s9+8T&%4Py9M*yum_*NI?<@!fP>04^--~AvY}!lP^^h<^Uhhdg zvD`gWdUlb}*#w%IT3-1x-ReGk>sBTRrxDwfTa%H#q_aulaYK>wBRYpQfjBd+BYe@i zn_FxOZg;;WA_DvtwLkE zLRax4HC)C^|60VwL)5XVfZ}|*EMZe~)cJlV#WU@#?{^I0UAbN2fw98z`sQ{1q}nQX zm*3Cl)tHtm3yM-)RckQ|9K?KRiPv;N^w4O)BE*Ec&QJaYoSyP4SPrTN9~85^FM=r> zGI3DhN0_>!ZF5o>_cuT|d4v2Oq4ISW{|D?2`(LrUe{i9{XLs25><+_Wa_g+Y5JbW- z3Bkl>;Y33Sjjlv*twb>hMd&S-kKRTOp9b*ZdjM*@TUKtJx{*d(?A!g|q_j$$9a!<#gL+=LGKzE8JlDCpg; zGx^)8g1fQ1^jnwBv1he@N`xQaShudjbXu!tkTZ;VBj#<0qR%lIu@y z#iZo%P9sZy9Xksm#&=sMDs~fC_BqOjnCVelADpubW>$+ya#;cYWZCIs*Qt-kb3+l!89mfWO85ob zazNkG(@bMOE<2q)(&}?_{! zJTY>rQzsYPkgEVN?p@-Y^A0hf_YAuZr4R=aMJq4Sm2lhhekajy^P#hnTc3SMvA$T? zeJqsx-_UNK{_&!pt=50{_f!VtCA z%fyPT#3r-F(NBHZ(P-NY-dvTEt)8Uz=;;-VR`fygZS)W!+XhLzZ;HU5TjW8z0YS2F zD6jau7Rl?!Tl^@s%`w)0r_g4zPDa~YVXeEPePL$3F#fASExc`(z;UVzNB|((MbN*lw4X>?cB-^}u=-if%WwJ|WgBn)>@FYjO7= z(7r*cfgX=3MXSDTPxBp{FH4TnA`RbU?5~je+2+W1K{d+J+3n-(0HNQZ%|Dc5{jo4o zZU(?W?5b6avdwqGuMcm%@Ag`t_Ya=!RWYfH0;`-F0pCp9za88Lw%Csl`jcln$27YS zpM$6`AUQeT+utct{oO5FtdV;15P8ZsqvP-PTE@*O9{Bf=XkMR4hBnFp@ssk5rvNTlKI0$nv{9z=a57td%yH8=YjNb+kt0pQ1eGJpEXDo0|_q*%>?yYR}wvRpsjdANZ^N9nW-}o*S7`-FXR-`vmsI*8_oG*!?yxuIVNZ zvFJJSc10Ac01%buP!BaV8|7<+voQ2LuTV-&J|RIc2aBbDJJdLgH>KBeZhk`idl2?- ziFDK({(dY(^^e)@TcUOXZUxHZ?YP}e|^$fpBYX55Ip6@0q z`PO7aC5HE|U_@<;F)P5*>Be*uWLuKS@ZFc5+WigS zZ661V{vHLnA5rkEBjJ|y-WNPEUrkaxfOy1|obN;bf1+UZGYT4zYMVc!;C4{`{}KhI zzePbzk;Gdtkqvu^p5YdPDgpM2mu~fA*mAH_R zsUOa&R#~;{T`D(5!DoCt!^4@DOyf@9`PKnmn8^+5leY?`I(g|mriAB<32>D@Nz&`T zMnSthi9SdoTy{O%usP(J)%cZCg*a{h6$L-c0@?&>h_$M3t=y!Y3Umy^dKSFKg}#Sh z0|wLR@P*6T>5hRNP$pNfMe)b+D!V~+GcmC~Dq?<9{L`R|JO|&5R=ipmwG1TsghTK& zDvC&lOYQdw!niJr!sDfcj!}LjFOM+Xl+YHot`J zg1j{LC$^QZat$hHWb)0=0&S|4M(qKuAr!<2l-Pxy~C-dAMc4Q5et`)q`6D=QoL z!5gpLcA58v!M5^DY*3uQI}ZP?U9u4GexTMj6x0h;!1-|JIq*S1jA0xyIcD+~VGOnUi!>lyW0e6(=!Z@baypZ^; zO=QZvI-?!kWoWLz@GM7zn~A5xpIL{B<(sD)q|1zfZ^ELO6p*;kwJ#RuGw;ahX}L4X zbYfS4gG3LC8i0Gqm!2V-Tq7~~ByrDBy_YNIBzo~I>Hw48I5Z(6JJQTrtRl=H;%JSi z$HQWA8md)*SMmq}<;022!)F^GYr@h&0jVGPWJJ9;ypF~K#fX$+F-*tua=y{j<6X_C zz5wrm&;UAhQp&{h6!~^uK--x)d+e+ORoUgqIS_tFv~z$Per143SoW0D2=I)z8o|NI z3&%*{EFmj^ANmfxl$YakK~Is-@SM>Lme#^BY1%;xcQQv%AVU;rvRp51ZkIW0Ww&M_ zd%#J;fwk7>MFIAw6FR)Y_X$3yGA$TFguLHWHgIruqoXc9&eQE?IWQP%9C4=mrNBfG zs11#7F0ZXOl_;&QcI0>~;uG%?6!Jpz=lUc;t#GtRRYtuIF*^r6Y8F~QZx<{EWepGu zTEi@7XfgY0$|iW`*ku{w_Wq=VN=80Sh!T4v5F&A74m;W#Vak(2I%&KETc@DT;U z3g|!Di_IDtr1*Zpd9ZIIt$1*={(1G0S&+wD@=U~oPi5xC-6y7#SdF9DvY#kXUy;6f=@)?@U%&wD^ou{mz^TF>+ z&|>lOMj>o!;eFs@)vI{=!~>aG3qR|Ie7DV}yZC6~4PJ5pjN+A_)%N`ei{e$Q6y##j z(M;;fAJZmlA8+sY@TO~B=+6;jLRw7v@TsfV*~?Gv6?p;U!-dXWbk)HTR^)@@SI;KU z^^4CeB{ww1L8)`$c5Bfr>GH$S^tU_xJVFRB-zSepA|T@F!qt4lylPr`o+-(ZtVa@_ zOCO2fX)zLEz|m(J;x2DSj6qMG-EI`mmj~w2M0w+YidsmWH|pXkvAr>dV`ZsIF<4wS zbnh3;!Vp6xb+DFV%l%n^6Wc3K8lP|Ui87DUF@uABx124wn55tSK{U+IU8K=jndyh857;T|BMacMc60&VO z;cZSjF*u8&J_$81<>8qIhNt92@gntG?~BPc|L5e_f5U|S_~gGVzrHb{7zIJZ?lEZ! z#r8jOge3QWVS*%R7$Qjwg;5y6De`D%p)mTpOL4o7LFkXrK|Z8S;u!a$KU~fHBfrv* zv5c}0+WZIO{-5Bl{XG2B1w+w?1I3b0%gG0Rlz!~vuDuZCIKImyDmol%l>G?Do*$!a z2Mdb)TnjliJFxs%oZCeelpGB)X!?PCrbl!F}w;z1Bx1^yt?z654U-@)FYE_+-8{rR|8noPa zl_u(Rs%6MMOU@|69MA`RPp$XI75xMAybAIXDX)`RoQs&n!EOHSEf)%1eLgbwaL9jKzay7Z# z*{!=>tfUM}1kfahqUuCkuP+55Pf?^%1(_~=?>_m=Jq@OMF^u{AQt-aj>2eFV?6Krr zZ{;mEn8^UVPFL`S@OKg_+ETb=tbfMD=j>|dx#=0?DewNRn8Ug$EK>**4`zr`D&_n! z!1HM=C*bTs=|mRm1-=r4mmm(F1qyzZ50C7zL-& zZxHXE;Refuq8ruiyhwUvREA^mCHX=D&=D(t!6_( zFOvxum^6X@j>eCzs4VzR*URgnU(Q6LHbpc`59hKOm5!0GC;ECa@{<OS5SO5jYIOt{`I?Oi*+phw(aCUa>bwfPyY03 zzZPmFax9L))DcuoAt*v3I8H(+MPtbRpD;n7D20D_#4CZ1QPE>rKRPB-kuUqD>4#nP zky9x0+4sahyQ%5-BVVCorn`NG@PW-F>-Y%Eb6%GF1zRt%l(tF z^J7{&^=TT}HC6g~^#dB89W!0W#%p}UyzZiKSCvV8JlNkbjUDTA1oY`(hCUK7Jun1l za%@P%$Y<&{KK2o^KMxbLKU4qp&m&$&(FKKGB|}vh5OYqK%n!da(pvm>>VLoXFS)4P zea;-whf~QYBJpx`a}2j&JjUpMof{?raiGXQC5wHT6H_j?V5y=H3E-E=uHRDuJ~Lu7 z@D&L#e?bB;sImX4e?bDkUyjL};gzuIH}iG-R!BO+WdW3psebO2DV-_}o$ZP|cCqMG zvFP_P0^NTd@#-M()8&6rnZO}4fAIN!hYa}O0{CyK?!fPG0XlIyRax_I)Ga^SCG-M>$DPZ&TKZBCbb_eo}@Ab^wm;IyG}VtbNmwYYLf$4;V0Rd2ez=?z(e zIG>b=XZEqfItc#+HX_%gyF43^sNY7Kjp&GH1c}z*9=&MJ3v$;cNmG7p=lxDC@-Bl~ zTb^F-(P_v*=LI0-((H&W~}{EIyzk81(NXJ*poGAAyL-r(=#xKeHOqQ5f^@ zZ@uE5>D%4Z9$O6QVP|pT*l69W;X$&?j_uFnlRB1tcmYv*5b=&svmb3bWci1?mmE)x zAbY<^J0 zzp+234-ZF@HvS7KK)x*(Eh`XGI-_7oHZ#hG)%M-V+2Xg5yT4spfupwm&C>cSC(Nve z=iI)Q)=lU2)#QcU7GELbOE?C095c2bmsa4Yt^cI70zWzUKPs)iCggoe>-I}n8Stlc zJQISOtH@B)s7C&q17VTxpD~RE4Ey3>Pq9?mj`swSn=u}w3xGMguaU` z0$gq}i{Df~>{X+Y1*3abCoV_aT=IdWB^=PTf<&4~`u1i?#j?b#t@7qEHdicsk(vj6HDmJF$PofHtG}wF7rU?OU|MDm${WNyt3Tq|z1pq=s+`SpVc&Z>XSI-2Zsq=(tXNW~?4ihYkFdSm`0LV~vfcLG z+4XW#NZq4={w!=z^5mhU&ZX3m46X!Mk}<(X*VJ=Ssp)*m)n~rOS9K!d#(7+=YVt{3 zYzbF{5uj#*3KgNue&8JP=tnSJcfSUUnilqB4bUz+RS-j6r!j*cUQn27@Py87 zxrOy~tNLs2KF-J$YU{CB`pTr9S{pEMV5btX*OXl;QV=;I(8KHqGwDO#eZSj03ziy- zCv0Nr(Mr~ns|wULR1EahjvjalO$Qnp%DLY86cEMefrLX5o5C4&26t#*5q|1^>}0vfiUc$}O`elKSlAr4qX%~qb^U>oA_HjuGM6;;tP^5A4I_@Sat1XN z5*x0Kf-UC>*qK|}dkyT>rM4Yzm`=e3qvS;;(3cFyy5R=y0RIg--dT2Z#&XQF;L4`K zXdg0(X?p*g`BxyYyHq$1Z&-+y7{>9^!TMxbK9DA>Mcj~jf`WAAsadHStuK3_H=(b?uFY3Dh6If#SvoYZuE z3-=0x;72H!XM4Xe^?<8ATYh=IIKDpG-gVu7F_6w*_q%#BD?iCS78hM#F>If8J?M76 zK$Yc{=L5vY0=sCkJlGy>mkphZJbwwB*xl3a#&o`%bx%jWgiR!~zUj-)$BO@NKf<51 z>PZ){8HC6|m$mOG`j!J3tqY~U5l{X4oUXckePx2aqAi0J7mT-1GE4@y<~v*j$2j&d zPwq;bJ*h-VVeXUQfMk73w{}nqflG3^N2sE@4lgoX?-QV$S zfj^q@D8Vy-g=gxOUiYt*Hk?Vd?bi)W-}j$wIq>o2iuJG&Be4`TP)>$Rvf0{2)Ig&# z_5*$J^S2WCO}KZOs}4D16|92-*Ma@UeG>oM(l1|ELh zN}X5l{}-2rVUBQb8hbyteu;4DWeL?}u{!&@=2Og9G?sYeQ_(i7cNywNW2p#)Ze+LD z@H~ax#cHzVZU2o5>;-$lc=eobh?r}5dXgEI5Rv(T$ z@uLh$G(QS_{D}|W%k^Gvf40E!2XC-nBLBF1BK>%E=&;Yphdp(KS4PLd15t$@;~d9| z=qE)S{g4mvKL;KZA4YueOB@;_K!q+dKmX%x>+(A?^T$5hzqQX7e-qqe#qDbvj^gh> z8Xr2F+QndX=PReuwl!f+KTs;*6TavSv-q_T3Cn&F=tyZaZg%OrznU-msdO&-hf8{e z4PM59ueI~bLGSWYP>=mr-x=_uxAs@x8F0L{zp-g7f_jr7c6rYq@Zb%E1z=FJIm#xj zLEV|vh>XLs2y$cVi3=n}@!KWjO=UJ84Sm{P3xZ zzNm&BrsQQzhTGb3c$#4CHmYZNnz<{r2s+0{M0<|?>6%JLklu#m1fW=~y09f6S7ep4 z9z(g*YoPpbO%{5L`TZT4&XV9;Op%koQV~0xS_R?H-tsE<-{KQc$}qetuXHOZ6q8P` zD}l_@xyB&o)))cr86CdZv$sTnkL8x0Q&iKu;O1Th5wykm1Qh7Abey79o}f{$Wiv!B zYSsu2von^I{&n!lp5mVIh-vC6IR*L*<{+MBgR>^Dsm+0KoI2F^TAdS`_=@8c8n^`) zgQy-NGs)-9x#Ao0%B$8@*44()LFxTcOG%!LTL5tufHY4uvY*Yk>XXA%Hv@i4*pjdE zG)|_kozcpD)q17LN|-oJm5;23Kit|RsQc^e@(ke8o}M$yU@&uCuh*q5))zg#Y?n~V z(>C4gP-8KP3n|wnRmy?nUL2xTUKPW@)M39sOCxbP9QP=HN@EEpCxx5zOYyD`R86 zQ@#3|1F-gWtm! z?Jp^Kz+Z5<=_3#>xqg1ec-r6sh1#Y#V!M4bHYNpr?WbQ?|8bT!_F98sWIC1s@sB=Z z48KTz$TI*K(Y5w(#gp#?dD9B%aVH+`BQ_FdLR;*j4QPb$M1JDrK~oa2fn@_$`)Baf zViH}U5g5hFlRZC#o61N?x-C$yxF&0aEJTEHJQizHEVpp_;KfLj`!wpLP!(V5>2>q7 z^7aAVh{T*(uN~t2T@51N(FEZA|JE%R_=Db&zRH<06?@lfJc+2taO_SbKbPJH9 zglov8!iZ#2YiL5s%(=H^8b!j9n=O=HcDKljM2UM>>Y-uJ$voK|_=0uFIWMsc*bnH^ z?IH#$Ik6F_Vr_3{zh=ZOPJJf2vXvNu@%^Gqy<2vZ_6{_HR^a$bqQ(+H_6AUGyAnN{ zSvApKs`rqH2>ie(G%QyArIRJ4WBLt}^z9un9YpHhIfm!pd@D&CY{w1*j781WLMxu+ z{jq!P{$_7)c_d`j8+G{9gClsB-t7!pjYVF36ppN9lCNR%KAj`%wS~Zvx%?dT{nW4# zTFql3#n@^F(u3;muSlxohy3Cpo0fvDgLPHY5E}1L+HME?))Hp|81WdN9r_t`3eQ4p zrVP3%_ z=YRc68`Ixn4E{Uk|0;0tcjtba?oCn@iDEd0!X!i@2dRKK1}JtbOcF4GKm<%5Q9cJB znZ~}W(Gucl#M?b2@zF8|XcIYRu`v3WNQJXQP3?;7Ko0Ew^ZRoZWOQsX@6Sa)+aYj# zY#SeVf{&=e$O9U%`&KGD+-Qa$c9r-%C&zxQ(V$PGUW^|n?+OdUK5T{0F7j^IcTtHz zhsE7r??`@(4<}4RAJd*4_8R_Bk&_RIIe|X;-=Cny{W)0nXBv%94i8*)zd)(pFKLcW z!(53F>6;-wMclj&Ny+|>^zx;#@8W&CY2a4OB5%y&>z;upmIi*U{WbmC73bFH`5It% z8=)pZ<5)cv?djKP+QQ;|-6Qb5C`hMY>9pnN=02X;jpls@jNQ)~{Ot=J`Rl=-j_GIN zH@Je<)?Iy;zsN3CSXv&)0;Nh`UqA`6&^{9JJRO*O?K$5)$tkr$NOgAj(u=t0m#)(P zWdk}+z*vSLRXABso`kq>&dPSVfZKbcb&#pujph5Y2V2%9=b6IW*m>+yuRM`nZP7 zo52wOy(=p<$Sg3fz~N4kbm;n~`YcKKKJ~zPQ?S+)z)Fa~YfZ#x88w3wza9YzaRPf5 zA};ds)q31zY-qUOa0rbWc;IUWXAi}M_!JJxpZyc<4*JsqpDQGI5fmh2- zDe?;lU$WfT&Weu8XU|>{|GF(c2CBe=7RSXA_7BI6KP|5R*;L){qsqTUA%(`S3%1$O zU^lF(3x{aJcGI%@-hU_83ivFT@9x~{-|>E%-8pMJq(-J1%h$^6 z)^X(SL{BH|9V+`Pp`}1w+h%=U-sqJepOyX8E{#VKIAhbJRmPbpPBSwKBHIclB5Edi zK(BK0Y!zF#ycr7=pk}%16;QX4d|O%V`^c8}mfWs-n`HH~1p6ymH_JHE;U&U*wwe6t zN!FF5Y{BEv)(k*xhK2=GsSMUTJy%24DdqUUg&F4W{8rMPXDw}Rx$i&~dKpW)1diTb zLdN&zIa;<4;Q0Bvc&z~8mj+4LiU>6oVnA9VbsvddMJpuAYvMKI^rqjp+>u9D{`CAmxS3(!5*Bfi zhDZv-VT49#3?*qC+HYhqdCUf)Bn6=q@mc7l@gs!&dp9!@K9*j|4@v*v=6@(Pcy`?3 zpbyCg{?HZLhho}vGh(GZsR~`8` zmjB>pw%^8}4|5xaJ}URsM$)GH4^knNNTH#T8iwx^7XL?Y zW1d%ev&@UG-Mq?T74CDTRK*a|}sPzm8d z>yuZ;fh&DNO-qsJy>OK6rMp(uelt}UBTK8H7FU31l_kpTmJ&erZrjw*`7x{qO%SA{ z?<`7(cIjSWHZMCFT%rm7qQ$#^Ei${5OhRjbliXVc#fpkDV+zReFK4>H(Yr60ljz;s z=#-vzccy^k&?9Ol5lJMWPw|<&EY5h}X$2_LqBGww8WJB10@kn!5nNf*wFL4rDs00# zO5OCbMKCsnQt_M+!#B}kQ)cq#HeqZ4Vp%Gt{Hq(gbKLe(ehcBvXte5 z1+QOW`EJAOTe@&ioK$pX7XttV9TK|T+6H@J$3iGQ$2^^-@a1_Q+MKQ(BD|d5MCNOB zmEWa6m%++t*XM=ZCR1iuz|~_ZwLG!c4aRkDkCa>Ag-F3_6^S2YzZ-|FgY$ zwlxc`!kWm-x~qfs#AzPm)hYpsV15ioR3aw1mtx*-dO6#{L@-2gQ_OMMwbJXn2s$JH zeF#>L&)ByTSM5mV5$9}WMTWbeCKj7gr*3$xSD%=*tc&;_NclC_5nRTn0`o~Z2C|eQ zA9Me_X$`a1+dChbfmnx!BB^>}6@2HmwI7a|NWJ zttDvQT0Ws3H6+!&wj4EvoryvF(WlAGO5%>Jd zm+Em)ADMnlkR=XfcBb?@BPz{abo{jIc7a56uOY@MuJV= zr58g&NcZj-N&VK{8)jMc25K)HDW~WeFlc`!pM0j%&HMFe2_R+32RST}dH2#`X@rh- zie5`4p)sS_3Twi-_@&bcqD@>JGjWTjAK%5~hKi;qFk=O1O;2#Q)g1uiuZoGP*P&xq=$B@SmbpMI|!vCTE`qT6OK!4%i z1dJdAM4>p0;WS3>8jPSZnkEPwhB1;LU=lmJCLsc)V3?$E=(`*0FnZYSUB4vQv5XKA zhhW(q`mS`6&yZjA0T!mnA#*VD`)%kSNkn~MGW$up`oTX*O*ws#9fQq(8D?$0;W<)d{k`ne7La(;x;Oh1&C#9LnOWHM)GFhx+S z`3?i|pJ=Z`dI5h+dwJh#FO%0-!0>M0Xs_eoaqO>XuS0qP|3rKJvS;O8{$wBA)-IB3 z>_5(19b4{|d17*diz&BYz|4(;7Qnfb)RPO#_xpxmXA$-u2$vmG^~ij^R2eU+7MSk8 z=Z=a^EzV#|gWihUx(;xYLXgQe7BNSnk{*F57@`hGBM!BfXM0mS8ncwU)Xwy9S?FnaGVajx$A1^Xix`hNjXO9KQH0000800WU*S!ylB zTLc9F0EQ6&02=@R0B~t=FJE?LZe(wAFJonLbZKU3FJo_VWiD`e?N{Gx+&B<^_g^74 z5AnjrQ2NkgA%zeQF3{eElH&>`xLSL>t3;NJByX~PxWD~oB>88yCCS5agDv{1^JckD{7IG3H46bsvB?Zr-I@X{>w>mn?w2nOhd*I43rx8c;1D4Ji zUO1t)o*;^AgeDX+V=;bzAnrajo!0?zB$v+^Z zl(x&EkE_(`)b-IBIE$ejiwjQyWFkOOBt4kb6eZp)HMS8xSO5VitdpkL9p%JFP+O@t zT(Uhkf@7Joekm@D==t6fQPi(tpG>GjE{0D00Z(^a-5*wAN{%$p#r2i1jb#VjVu5CG zHCKG=Gi8MYuG)sG;^>gjaMqWj)L^N~Jr!X%M+FIR4R^a0ZRm!Vhk1N-@g#%T9N7|B z>8;p9hzd`qoinfpDnG5`I0FqgktD7TeaQWj_gda z6hKK$%(3CAd>or2WG-Tucdd0ZteAb*U^L*kdk`jylNNi?SQ2F%4?NRNHU*nO{{@Uo zEc%WT!G7LpSzs!Fi*mAR>E-18=P&g=w z_Bk04uzYY~COnfo%vtPgiMaR-4k<`EO>`<(QP5JaXX&C5O_uLLmD*&{8Wzj!P76hS zkuC;a%a++6)cnf=}7iuXnR5J+~$a;#(l5I z5ToK{P7J4@3QhfazTmbHxFtzI{=ib+J=am_R3Zu+AP-a9ANt?3ml2Skx7XXt2q_xP zYwcx()a$@&?Pcto!DxO;dzmY)eyzP6ms|dFdzk@^&E|#nas+8?HZQQ38PZd;d9J<8 zfc`g|;WHJlPUDWN@QO{u_vdn#!6}}R+ln2v6B|_^DyFvMZ}iK?4vvCfsh#8EpY%&7 zgnP}4d!qF`-2CGAWgq=dxf{G*QTVt1(N9r5`e$(k1JyRWMv^{=dsy5C(5OchYQhHb zLsL9xbI&ULwRe4RJDi4SgO)W$;9YFqx7oXNol}tLP?tvAwr$(CZQHtS+qP}nHg4Ot z`?hWO^vv7*HIu63EqOVWo!TegUTcm%k_KA^XU1Z_n$74Rr-lJI&R!UHT4d zA$F?FX@^&m-q(^fE!WTK_UAu}=Wo3P0Q&FC?}77s{$It@-hc7~p>w-Yami z4^uz@0EgcP;Qz)C?p-I%eA3e$U!@m&hs~tls`9 zLPn3l9U7nPuxs3cDOYBHTf-+%!Y`c*VPk^C0$U~k*FNCZ^I%XjTxVoA6Crndpfoea z;9dZT_JJm89e+(S71<~xbyE+Ks5&*u9ybIKAG2B3utD>tb#kw&m5C_U5N^nU0TwS*s-k#F7FfP?f8lb-IMC%{=)>oY85F6dK6u)h>jbmo zd;#ZO^Fmm&H#`qX(y%PdR2?z`XBq%ZA!&x17x=H5X6kN($xtdOqcKYC_r0DzAI007+oXN8RIZ0rr4|NG>cSgp~UA!mBHQVy0_|W>&`K5NVs8n*oEQ@HF#8f=#%ITT) z`RO`o>m5J<0ECp3*J*Z&_X0nH1SmvEwV+o4z-{<@r#F0(gxWUtZ)3)lUu@sy<@IIc zp<_d3W7eh^$SASH>(SmB-{(WdD;srT3P+sp1R5cWSH`fVVp)WR)cjWI!Bb@iEwqE) zOlDZQ)NqueCW&IwfZZ)&jR?pgs%(lbeHK#hwu&W}d=!{rPFaP!ho|@b`6r3>4l5BA zl7sj2`N8y=x*h$@PWEBkoUOT9iW6hbOzL!_RGD(ZG`cD1blnA$KHFJx-_7ON?xdDa zrP5PHuP&QrZC}lKPEM&7?iIwVGXKh(+&i5ddJIR2zFcKxb!_k&Y7|vxhPZekg(1_6 zrRa8kPkOkzX~N(bb1>#$5tbR>bfl)o+mY0#9?#W{d=nS=1PXhZITYkmj(9%(qFIZ? zAB=OZO66}$nYgS+U19kB^~N#(8cXPOZpm``MxLJjP(@m^+YHYPr#!j3G|e3oPzCgj zG5VJEqjnmz_34Z9%7hA5N7P>WQ!nnz#)&iXWoaM$!!px(-|vbksCNbW`|5?cfL=AqDgGXC1b+I-&|~Hjd4PNc{K`*zMAkM@7WoW?UjF3+gv>YxM_7n|qMEt8 zR5Nj)1wqAFR|wf8Id|=Xyj%K32S=xCEENW zXsd+e!1`~}i_N)kI)gcvl0A~XyFupjJJO<1AU>X_r8y(&=;`!+J0LBEthz$3s65)N z%{oKO)xtRjTUNt~WRtLpEA`aIz%PO1FC23t!z@SxWYZXSMOAkwct`k)ezy${ z5BFNDu_-6Ij2JMQ=l4l61TSvjy8RBvkE7T;BLmUV;rZU}V||0gw&s9Q|`i zZhIZe6BN-xG3*U58Z2JE-R@Aa#7KJprRX$xJt5e_{sR1Yo3<}5=ZMREMZ-FmBm5e4 zvH>r{k6YR(w%doD^G3vp9xkw=z$bPz4nS~qRoYtv8_rAFEcbrhSbn-Kf}a6p;pF|O zjYNZ{wbPZoQNHS_#7R}QsCY04;&XF$=u6D!&wFlbu8oo&_MG_}x}0N*C1cYbLaN}` zDtcS_H->>v$rP){FXz~qa!E1YY!js>a9v3&dd2m1s<0|dSfO(c40NU_6}LG*!E%ab z+XmpC%1Jz|$kuFsODH0&c$is3IrvzsrdP5kODjXGAux~PYlka!34dE;J&9!uMHNJ{ zm;-Dq|KYG)GNXC3GY^D!MsSXcA<(YKdmJAY97NUrVn`;bPzU=x^5ajWReGM>15@nR&z$8NI?s&N2^>Odkt=@Hh#sA{R@^$m}EcQAg(Bbiw zF@bSv!3-^RdD{4B=+FwycvW}ZDbEW_7|Y2*fmBZ~BUfFKjfm1(UYhC%y=MF98udv& zGM+_-0S5MmTHbuRTckv>i|81E!-FI}Br*VM3}MRTuzzLwSCL*497uQ#1uj&68)Kqxd33pYKY zMM!g~+L%Ac@;Z&MtVVd)CQUCZfKhTSC}D3*C54zz2%Zus3_uFS{VCV9C?qX48s23P zQ%{`GbewP!kJOICIl*NuhM!v&+ABAgO#&JZ%4T)NqBomZMuErNEoik@_O=v>X;PWX zmH%SmpRd?=0ul2viNO7Tc|%q5(V}U`V5x-R95lOO)g7>*H<4dHxAFt`mbotYUC0|_ zgJlJahw2UU0Z#zlk{_=SByuOKmWco$*+3Ei47cmOM-|W)HJ%JZW|%NKsLk0$JRi{h z5>hID&FSysuyC$gqw_?tC=udhXBSH)yO@zH!lAuHks)S21)6lcyA2XUSqeNnJeNLW zr+Wr8_Yi|ORNU|1CJ`N1_V7^IMh39LNla-#&-5g^Tthsgae>jp1?yATS7t*JX~m%F8^Y})$=c7O5MwvYj3*d!Ts1qsOjgij(yL-K0XJNef_ADDWj zvu??31g6y>2ryz;@)FLytoC>r1ln`q`1xP6m3*xnTAZ|xDRBB@H8YBYWanVP`c7Hz z5muyW@rzQyK0Ow z@Dwb@JbRHbk(t%g&(7`fd`1GChqsga{<=ELN;(Nr11dp2do^LTNP(0E4!$0iQ{T-p_826LS~MnSy?n+e#n=h46^dcpLtkx zK4e~c8*E@xL%k5jOe1dKq8cb2eJ4U4R1Vmd72Kl-`s%=0eifEHwbm#h;L_Ov_$TQ& zdyx84o4!9q&^YQ1-JWeBZW5+^Mo=<*9ZcWP_ZJM%0&>BjhAW{S-(g|A5QrP?L$>aFS!kgUo<>xz$B z3MghF-~lTJq8Xz*Fafp14^K&J#`hz4VNItA z>s}~tHO4852sf^pR5lT%#}o>$zLeYV@99)Gj0$@6d&KyvNQH^&N1hh7;aNfc}C63*(u50%JNK$a03YKRBry#+Az)s zlchUCo5~B9t2-o;vx0~?;_hub0J3*YFXd8(AnHq9T;os7V!%!3Z0XN=YB-waoq11#+TZfLDN+4 znEtGt-`fX)W{_%pob`i(PGVpcZT^Lb;asw?j|)-3v=K|Cx&Zp4w-8wepW_ z3IRQG!UBjAc_v{1W;u@75jB1zar1T_-OGe?Gy>pe!gJ$kZtM8~IdB)Z4D@K41C=SS zf}{_v$`O)8m_NxfK+v1^{*rDvG4xR~Kya=(DJTjn)!&md%k;(s3@9C$o-qLKs8;$8 z8H~#WTuO=1fc=>{teK5*qn}fj(Xm!g;R*nAHOY+@m4VuuW1b4ZZ=l;%plW=-%!+Q6 zEOxbo=Nn5*5@~Fuh|W%G3b9NiG8$dEcp!l&@9I+38gcJZ|6{px!*V%kNz_^DuF#z zFObz_oeHQc_OjxlO28fWU!6rtGxw@9XO8n1S=6NnQ0FM6Kss0Q8!T|aw&x)m)U#fFjJ)BOC?Xp$BCn+mA zM_|8we)KpHS+k&EC6@8vDcJF0{7i9Hp2bf-vr4(aaDWhSP{R%Y+?zGDO?zow99$?# zqP@!?-&KzUqWL68%L_3-jo1jK=KzQ+$4jVUw8>H_o28mgaLI+f4Msr{B3`fF?^u}R zMXPF|Ucz2#tk-0uGf^nN=*#@v?#(U)d{r4^YRj+-6dYpFm8~+s&e+{lfHpUUR|%xEY>PC8zi$4r(D!j;ZwC!A`)qO}UJLGDm`yvSPlbnuDs z_HJrpCN%T9PKDh)qFrG5FDhI1SaYakI?JrM?YZyu0Kx~j@-OfpD)6gdL{XsSi+z{QpB_1k!IcU&f(+T+rIXW@>1!2K!=EApJW^gxNSz-&vf(fmSA%JFa7jatB zGCJDfCs%FEaCn>|*jx*CVPiP`@wo5L^tdP zLVB!>(0$++f{?9bAZ>UDsI*YT?k+XqcCw2{8rr&kb6Z9+Y&558xt{`?TBQepzg(c7 z%k%W()o|1-=UcOmL>)Ar`B}46&h!Hyyr&0C$9usJG~J7zJ478HCM?XiykUSmV|s*R zrm}+CI&9ð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 dUYNB%UtR&{@(!zXGv4-LEua=wCnQ{uG= zO}D^sUh5RaIn!y#t z>Ixp9XE?^GYi#nsfanAqv*hywqSg8Lb=QPvtqb4rd%HRUYAio&<)pU)CTzt*p51yc z$L+^H#+Oy_65qAzhp6@9E+`N)3TUmp3#_1Jar+QXbU=ALG|17$p7^5%+!M&x*4VT) zcHHBgXY8*M3^YSA@55dE=yE{At5<3dPShUE*B+eC@(jR3R&Ke^?^VCTLynGPjvj}m zy}OcZkgwF!YBLPU->yRA6u!2@cTM{O52X0~LGISTQ;S^OGPddG97lHda&>hff9o<$ zEX-xQ2Mqi?mr~h%?CZavjnS~mIJmfxz4S4FMGBl3rOQ@hw^dr| z^@AQf5wtFOKKBQlfTRL1d+~CVqZu%+M~BODgJz|SSJGD~W%){(HJ+``S2pp=Jf%8c zskSyQwV6lK4zX(`>g>toRkB{ch57^(g?PnrK2`vI+gNMU{)T2xJ||zn$+bLJnal%n z)g`9O8zAR+bQNJHYSez(JaaZnX>yKM71h#Hds!Q-mz>Rq0v*TwYCWz|gu~DG(TQ`s z9_YmD_E+hepzBe(cGIL*?)q%xF$nZ&yOkLLN}6 zeoz3pw8Bv3GIW2D!`L*a|I^e8YFmif9HQ2ShzcQWZS2cT)V`WQ`6>UEEmBJgwAGA?#q67dzo5qBGi zM-pP9LM)9?c3*@N-(z3#dgBu}iGDc|5Xa*BRKG_U=?8m9+f|yF^L8x9YO{tYPnP*A)a*Nf--jK?^3bP~}I?PNR<~fAH z6G#S(i(pm>O*hcP{X)|<^zeP5X&OC9ph(lh2BB#*J**I#vhd+KU$J`Y$MnevClFLI;;|Ycr9r1LQ@1c!%-ujfJZYn$!vjW2d1cmKfWj`ggynSDmNFj z5{n@sowN0pyJYGJF1#IG7inKg+1^DwheJUK|2w3#QWu~kj-7(nUSi5(q*$np8>AsB z^Ml`{3?p5o(JS|9QW~Cu*$iyZLr?`nxB-h4ntH8x)bUHCtZ99dm_s`?Cjl!cr}%kX;l3Z8qXV##*X8$ZU$sN3-t%0km^_j z7ETX{Yb4SuRwQc%)XmXTmaN|H_XmYi=octLZrl=T>%-l3EY+jZttEsTJe;=c*Ql}3 zcaPx-%4Xh`TvZa3-8i`88MO+1(;@UWD!Z|ovFok44VoGy(2#GdY1WLgUk^-jfXUzd!L5fmw0?&kc1vq0ET~M>?ndH)(AgDYe{J8M4K;hudwYP zrQat!7QJ6zXv!BrlsnB#! zS~6RKXscC2$jP{<$Lo(udMk-Ks(H6H$wDr@h%D3!D519*$DYviOMQdbZAnPMtXCBn6DG0rx_Fn;kCv6ajUR*asM;%(LhT~ zv^)dT<*`Aa387<~$8H1#dF{yF4*3|@`=`Oy86)9w=$Z3shh%nW2KDM~L-=64OhUO= z-)A4j6KZrstCW5j&933yeRyJl(lwfbLXpks2q9jrQsbYw)#LZF)3|WoT&!&0M*N|k zm(P`KO1FfO2wQTN#t(!;h^VNg%%~npQ4&B3i7l}Pm@GqWX_!+i-loy;Rf*$tDb>Oi z$4g1J#>82T`El(!vt|s0;8n%dv0dCSL&V~p>5Q&n+mnv zzaY|5^{6;D9m=vCK!D27@y)y9*T`WiI6h4uzIux^>c(WdDB~kH&<3Qg5N>oB4HB<1 z8gvQCUhBS?Wby$NKVac&yYYcN`ZmsXlvb(g8s=VLTGB#+f38)Ze3mLib7ouYyXYgC z)0I+m?>P=b_Q1cSTfQdQ$gs-;Gb;XiRbIp=F~Y2n5HHeXL+4&+ggFG{Ti#LpPjFY z3csxYEB|z;M>3Ux);rL-ezY&h4?U$1hRjU46c6ZgxJOZws~;ISMq5H+dJ+|wHWhX# zEWOo)31F67{R^0*#Hli~ieqJ#E!xUOiz5=dHjl^eF14Flq>`;um zFwyT}jo(7d!rnHuS=nSo!)cSP`7`^7=I|!_i!Z*opDSEIeqUu1i{5?>Gj7c_ZLzy< zk$S_APJ-8i9HsG)wp8k^sZN?c6Vrwrq*m(|~a$QBs@{X+o) zw8M))D+s6%>9);{#q>0r#GHmD>67eRx1}N4_{g4SvzUiT1(*bgwropBg2gko{FENB zt*^yz)yW9+4WRiiJPy}>B|WQ8;x*iqgP$!&!?zd6edE?=H7v=QWDhSZh-b^^$E~;F zYe9Hf=N5b1(!y~IobS}NBu@(l+mXkEwmvvojKJO<^teoFq=&rhr3<4&9pwCNGF}M$-C(KP>(p?r{(R_SyyNrKrRt8 zeC*&GxK4;b%Hn`Z(2xy4Uk1=&`+JY6(n%=b^RYvYXxP2bGkC`QG@wx?O-HMLU_hGO znud=ks@#vBz{~T=$A&}GLXwU_%VJM^Jb{-1j&S! z)Io_;1;fsq+Gw|tt)f5$jvkDhFd*fqQT9qd?IYmQJ~Ye`DcM&HZ4{b*geALA%8}wy zjLTE^WuwL}pz!$diu$%mT^ZU($Zg94LofFv5B;e``@9`+gf z4<5S_x0@ceDr;>e%bD;fj+ut~zX8hkQ0hxxZ_R0H7n)j7UD;CxBc(m|0yhlJPcW=O z#YsT(-S%Qd>I}c+()%V}w6)9xgX~IS&pa?C;y|*_tqn8aBfrQw39y+KI}_`^QtQ#9 zwP7A79fgk5+?{d@FV}Zk0YhC(ZH2nEF67BlyB|e=y0Xv~UT6<1vjEZUwd!@XO0nFG zd)eQSPOE3wN2oHrjIIMqER(D*XY;xqM865=ar7MvFPyx802|5kuA8KD>Ow0UiSzP8 zo8sl;7G*7O$Shq{J&d9%{>zft*v~@fHvMR3O4#4kLIWW;kUt6r!j!MzYelEVwx#1> zQ0h-G+`v+60?_B|K|B-e=A8?zLX#i6q5uXx`!+g{qql|7R0fIraR&p2gxYuJIr(yO zgl8|4TQD7Y5<=KPs&qnI7f6kgk!o3>R39fE_Ealw)m8_*YAKEk?W3NuHD)376)K=< zI66&22p7mA1%j)-~?SotVnwrrXHE&TR{Mx!=W?a?%vQx*TX1uH%Y z)4bY8$q{YFp;Zi(9gQ1JovJ2=*!DPUm}Aq;Tlh? zn@3B&@!>=v&{)i*FevyG{S12V~7kNuxd!G z|Ieyby^_KqCFvyb>Z7Z4dSNT@E!mu^=d-KW2eg}2cjmi{_) z;~vb#+VQ}7rTXa0!vOwrI0Z1D0JJ@bj~y9IKXe!efcj`e&$tLOy3|Jx!`sz3ls#+* z0H}}RX6S2Z{1vr&*khD*)Oc$kWSE~xhshaIeH0s7IvvR}q2y_-6V}G<18KYGeOlwB zQp1~4MBJuCd;iv(^eld;p?zIMxR!v?us_c zrxrVV#p!-!4hz!Z!ya*hkNpjo4d!u`I0-&}l|BisB~Pl>YC0mKpZ7w!^UJ@$NXaJ; zd3^#dTLYTgCYXRHG7~1RS#8Y1g}goszw#HHg>CGqk%kD+W~1w`+_KuoDm7i)oE$a= z4+1ov!mR`$9Yw7bT>_$7UK`xVx7Vl5UQ>j_`z?xc00mCaW|z-Qp8i+6QUFKswWT_` zV>K3;(8Mud$9qzc+EFTgw6{KR~KHWly#r<>^pWVjjv! z8BG=MDt{J0%vDG86Co7Q;zU|W?wb@IC&9LO5hAr zR*1&6hb=~AYS|3^twevDrN0&FZ*%pxN&1^he-re#Mf#gbe=FDD&P3?#j#BIz#4if*IxqkLS6cyT#68!Iva<@P8O%+z1)agItL$=2sg z1|JI->yqv$)vy83JF`QiyP_&{)+MKEc`lWWGsZgEN_5;&H7Ohy#AEjf%2;dk2K;AD7t*9IbhhEwRhzft5dSool5OfmKM_n`nUkz*^O>m z8o*FsP#;XHWagVdP2G4J`gj!{wAn#31K_;P=MOx$9a7My-FF9kJ9sBtD%FIuWv!rQ z02(uh@m8yIpzgF>It$CGsTL;$@QHQkVFE;3kR$(}JWQo%9R-2sQ5b#n2`KtJJC|jM z1K@;`v@NKBQ{c6oP4KwYZT~s?-plni(954CHlL2iMQC9eG@%Zq>S*Y=7|>=H;#rmt zQ6GO_sXBq45no&3+1XcjGn;u%(@HYLzrxEr?FP)ora+RCp}nW$!=xmNlByF@T8Xh64;06L#A06GT& zItf6RM+Lb1Q*Y;_D_g16DAj-*xTS~8!VaKj0N+JCa@dD6dX&XJhIz+uj@F%Qe>*VL zHyTng4%_b6?cd{-$^k2s>Fg7lR^!mLu+w*ttE)+9 z%Fq)!@6gw*vJD3$q3Lg^jSckE68iOMN%d>MqPZ4O{~n)-q0l}%W*pEGLa2>WprM0@ z;FHf=yYr1%3yg?Sf9NyQ5uPc5w*Z0H$6iS06KzS4M0+caw|Ftfxu8~a*IngfpTJAl z>P88swiUe{w7h#Ra2OC2{n6`T_pUUKbV&ySuR`KMtd`HuI&L=(sY%aiyRpfTb~u&x zqkz4@#0Azs20vS%d-lbvz4$No5S~Wr*797WMLExiWf-Gyfg`fjws_07G=2bsMNM2R z@~%=mb5qB>;Sd(!35W2TXG>KdlW=e+6MR}8(?h1}M(j`bk`ZfR>sIQd7xUod{*^k} zrzHKp#srY!Y}x=uX~m}rq<#!K+wPl_a<CeHtViU0=$PG$9=k;>yzt-W53q{-!dT5YRK$4fJNq_1 z<~XjNK@>zbJPW0XBe3lBhNaeq_=7EF*2d6rDJ|HuBAyjqsG&!z969STSTlj~G;ajm zYo0$2i*_AxEiHAEgcMmz-xj4S#Vjm*MM`(tc*!AYrTCLacq*B`& zKC?KEH=Hv|t`~6qPb^W(c)vQY2$b$kGyEPO>w1k`p~luE-Dm{J*A#h3kUKA+CshUp zl#t)lY9OOrYlY!ZtwvW4ao7T52<#<1hgTWD*2gw#qzj7VO*{n;Z@Hk@Tp#Jw=^tw3lX()|GEMA8vu-jDJBo|TIjN(#bHr+uBZB&%8M*sV zj5?0ps4VYK(o!wA^)$=kwI$1WX{3jJM>B{3fIxr0J{gD}A6HV(OS!lU0R3^T@kz2| zx0l%C{i(a6Lf-TQQarl3m@n`fqQ+G_<)XIy2a|~ zd94k2NuGQ5)gto$4O`FdLmPMwjbN=nc1^?kIsV7ScM0`}3+HR1QMYZhaWyyGR4a9d2uXQME5>|}OFZ*n4AO<@p$ zA;Pn$!X=YMtJ)g>UNE2iCmM>N*7ivP>wRxze}NF6!%GIV!cJFA9Oo4 zd{i|lSCNTG9p<2U%2?lBGXF%`(ibjuy{w141Y+ITEgpAQfGPcEjv;)c7J zE=pylXa#H*ynlm>>A^R_mN_u!V!D`(KuvJYRH>4g;7OSi_mGPz0Y0Gvwk(>baYG$U zKYCZsGmRaACnY~VF%)@dLQ6WQyO-{J7wbaqrP&AmNB7cm!`w@OQlZGE5g2Tdjpt~U zlv?3QWzg~xgK@mj`O~&;6e#Ezk3!6J$<1b`+g5jaFmRXgZ&`RrAz#!ce2)$GDlZaGkolg01D_b8_pJfp{aq^v3PY}xZI@Vs7v#U5;rMJtXQ}82paJUxvc<7MP`3Ut+2`GFw)LBjI`4%cTQ2?Z9bny0d$@m7C^^ZAm#?m zUhgt?FOcW*Ll`g+_<9@h7+a^kt9UUu5$h&>Z}2Ig;|)}WM|s4gcF5FA*cxKAm|PXa?sVE5r^j{=S@c{|09 zz>4*09OuQLyBm2YDUx+lSn1n1MA_vjK(=AOE)(G>p*eCivBfnw^J z1E{gn=rH75=d#2)T5MRYRoENq2e>UGR3W_3WcZS_EXqmC5!Q8QQFLEwA6OS~gg4 zx0!|7g)QGhHMhbp{9qNPWtb|u!;8|bJzRs(gdshkWV6tOOOT;mh-Q~`A0sZ6O)7=vj0fG-=wx zEw^2l2KL^@%&ntUVashf(-xx1mwdZoVNpkXRBy*KLDQ||>F}I>m=`plqN=WU8H!4; zCUph5Awjb-q+CRrm5hx01fB(vD^8&=4oqvfh45d`qn_qI1=2|fsbtxA$7KDkj&-y< zqr#KTmIxqHmW(Nmw*XI!sFnXYQ;<^)&=_Mk0$cnM2hh1}ab&GB0^`C)%+T|(-NZTF za`OOK|C2FVv|N%UWz$-MJ(xuSsE~=!MO${;%?6j4@fSe;5tpnaE?J)BlIgW_eIiTz zT`+q^tztn=Ng$`-!#Q}Ere?G(O1~m2eid>~h7KGe))_zoFS?Tmtfyz{NTB{n1{#kH zG!DkJm}BipM+V9<$1`hHP6vZd0g)E_cT`oWe!;YAXA8{uv9^@tJl%%gZLuJ#EQ#+4 zq1*A{-cwxcjse;k!HEqF&tlZb`v5lO&AzWq7uVa{hKlPw+(q8(KQh494Ho(4@BbBV zc0I(Q+dd)Ug4y&t2AXTzQl|y>dRfQbi~QXUCCtnI{aiBkMSLtf-^eM935nzpR0b5gn z6Y)p6Fy;rs{sCau=CHdFlM%1scfm0$s)wt1>TQKK^!W-M6YqCKwk|5g2{(@MwAe>r-1^mX@_B3Bb-jO-KeLFoqIb7s$gL(hW|Df;w&qUW(u_Ad+}@Bs zw=~DhV)~gE0dbZN_Z7lH0X0#$T8$8HJqv9vpW3BnfZ8Kw%MU~A!5pxe(&O{wZ_(oY zreaWlwsKm9O?{IkJb2iNm*;6xjy(S=u;}01HJ^Qs!6*TA^9Q(n2WCURl9AMv8c#Kt zFAD2t(|12ou28=i5|R&t=P99=>DootHo7vpzD3tp>52jR*r8v*MSC6JpMZDh#Uj@A zdTK6qzl0}3cU>?}gwjtE8GcYVj36D#B~|;_;@<)E@u5C(4)LJ!iRKIb2Wru*P&>u4hqVVEKjhWEjB%adQj zwdt79^jH?hEp+rK+cDx`$!-J`wmpQdRyTIeMMtZHhc0onYEC&?RVtxvki*%Wa9~e`*G@%Ii|vM!}+9}6-7uy{}-%_b3h2M9>my70T^SqlTQ>rqEFPp zH*}vU`ZPZi9h0zSu~`P%D~6+G2HHGAOEidO5<+$nLc;Pl9P4-xr#$$GfCETFu=cG+lxB z6++WwTeMkWfGIDJ;iec;!OqMbNez4i&V9wp`E; z-s^lH^O0W_Hdptn`WZKj;y>huewMNZKdIEKU?JyGcjC$Q-8wXvYumH&J)Lo)x>1C%}q7Yil zeFlHqVn|c)XIu21kIk^Ae4;w3MmBV~kL6hnpQuvurJH6pe4;E?!zXGlnVR>D8__4~ z8uE$yl6<0QbnB$hD^H$LtBsyP&!{`)5Pr3)bW_*#v&~oOn(f_qT$(WG?or55hIcM#pb1@C{CzddTF|o6ec8{q&kN>Nzt#649yj$A89ch{3sY~=vk7l$Uf*igLgbU z77t1z8_wS+-J>T_Klw}O8GUH*-biwV{HjV-LXh;U8uKMccj9P}!}~5Iy{o9a-B_OP zU6sr}%)6@Lg5h1&G&oW<64)@rG%7~t0!V$9KrqK}&nj%{FwZK?MV?iJZkT6P!vU;k z%CRa5aEW6T^{4Jwh3)XhnyJf~(d9}Q=jixVDpo{cE#u4R14|kF4Zob zDIykpHxZvc#JzM-`o%MDYM2AcrHg)XM`u?mNj`w%5D1PT2=w8GG@K3nfEzuTdS6`~ zACKFe##>R`hC3c3^|u1O2kE>Q&DuqTxX94po+XSnX_}gdPZ~PG>?*j0Jy8baIe>2( zxeR@(5oy%}sNt#G37852F-w!u%(F?kf?ihF=#N%FegMmfkJC|urdoUpyWt|_f0hrR zpyc%a5v5RM(}U`6ofJ=BAZH{kj1Qh*I{mz4=y80JTg>bppCR0(>q{tAyhhvo_{BA) zJXB4Ue4!8*S6M0jcl>gh)IlviUe5pnyp!5S&{eeOp;wjLIMZm9c%{*(OQ=@uzKCk_ z0hC1KXoU}K(lh92MQN2P&G1_-TSyIPiio4t@HVPBj+d=RV|8c0QE}D7dI9D0`T`Ve3Pg3qZKo_cIsn4dBNBfv$F-S46!Za6@Eyg zeO`~2$DKB|t#SDrZCliPaTCkKu6qR$K!ypI25k#t?Baq8sSQ;R+O?OzGQ_U!+^<`j zukRmf*FJHvUAx}^`&kN%o%zMT7Nu?K3;)P!?HL$iwJsXOyk!4Bv|4|?KWViFUl@$s z{*O(!g-O$GHkfY0UbNjjYLv}9042D2Ggxnxl7Qx$JvblI#~;ADqWyOCo9wsYp)A0D z%QfsbXpvfP3x{7OmrwE<-;REJO6b>pgFzhhfDYs#tcSZG$2>h`0y6^#vHAOwp)AOL zE8dr~-$FZ)4I@d9zE}GO?YF;XVIVr^fcTEEcdSD0hPo%SLVktHZVIsRB)SdOIzJSe zenHVJDlO-f1L#m#LOFzO8*~dR8O-94u%}^HX3EA=3D zI)|3l@qZG^LK7YvnF?i*L7^;AeCVMpt}3`Bl*Iufl*NgpdG;xWvH;WUNvt=^5SqF% zmPKbEZkseLmc?Jl>^^cyEQ>EM=&>vwK)bE*;#d}-L1MXg4~b*pOH~$nk$o^xx70R} zrFL;33ri}Hg{75*8dbY@Xdny3pOxYw-9mc?y;wg{7baA1f9wO?^c)4!<37nhBy_>e z&bCdw5vriA@thvKBK(qWUhVxO`otn?Ft48P`-b2ZiDAJjEQWa%O$M)6mW_^Z zz~*$5%)t3G1L>j%u6VegSiI?{N&D(;@*75|VSy{KWZkmbcv0XA1RWB%B8<~e%#Ws3 zC@D{c5WWwNZE>Rh;L_=XX4XP7vlfDxHP-kBq)nPy1Z5=up9yB62Q>I+!7Pv4Pb!7RMr9L!=a3BF5%StJK|Jo6R`W|3}b26ODp#jz}KK>a_7WpSb} z8Os7E>SQd7!N6k4SQa=b4F+bo;`f)vvcNpaSQhX1T^!5e2WOMrdvPoaEM<5si?-ig z8q0zN+c(9s7$S%-j%5+c{|B)wsCs%Vi#vYzefNlyALSWe48Oa71G1COTKh zN#j}juTyIF27d{(`r@Ag6+(E7 zz@W`s;T{qj1M^XHpQE89y+k14-yQHdL?9rrtwr2~VipNzA zDuBNu;CG-^Hy%y4?HuayiBi$D*vCq67=^{M@ z@4Y&%_-r3DK|Tx`Tp8YA5~l{ue)jRZRC)BAUf}b4Sktq~=)X6?Y!;ri34b|CdR-$F zYz)*-o`#Q{d^y*eR*-TxuUuJE9o6VZ4p`R@5DFh@RpMmQ+vMj@kb8|!%j0ovqRY|l zJdGR2)zR9L9Fcy8x`dY!#=Xm1)Dm7{hUusKX!7WLHsrNp-qxCx)lsj{&z_m0ZzF#( z{D&&U$y_DpXy$r3GpK zF;2`Yy$o+TrBm^iQOdcVF-d9cBl@*v3>#Qlw(x#DmFjG*`?|52o|@NM^`CR58Pdatj*+N2i^J)Bnqzyy6FyiRS6H1wXN|S;@|jJl~XsZDt(OOB2s4S z|HaY$frc3$-4t}77)MNR z-QL|Yt?co=x0l&dLCi;4YIe)a%1Z0dcoUNZ6W#yy+2@>LKrriezu)ig|Gfv+?0xog zt-aS?`*HSOdqO6*YP(lPtykYy;XOZUgZhqk>Yf{QulkN#7u}PhD%5xEo^#(4b&vXv zJvQzkQGZt7*WmqzsI5NAdj;M*MZJpm0D8xc5xyidSI0k^>0FuV4gi5u@G^JaEae_2 zRj+}c)PrOtH3iAj6mZLu*s?TMZU}eahoYqp>(Dcp|USy|4kdz(`8d!NkJ(Qm8s4E*H5nLfqSqQ2X}kf+F_B+tkXKXkT@y1 zrLP^A)R-Gz>8ro5assw;j^zO)=X7iQ%YDW>rw6XNLH}BH@&u`ua=ft%55Q6s^?yl$ zYy7!6uv{~NGN9~AKeyd1?mK(7{r1Xa z3fxZ`t(>gvxW=EzlZoR2O_aJjO5KzozT`n((*q~eq+*o$ku6}i4?~F|LQqX7ae07l z?kt3L7#P=h-CKv-!ynId@HFT(rQv22NJ)Bu->}Dwiy@f18(Dp4v*Dl=9UN7zECafDFyTo;9Tp>0|eqh#zi?J>)`H>QzAE0!_HA~F~s z#r!DX@F+$lLQ!|x21$!HsuWJzs8YCjt$YU%)d58n>ahaIBIa}EpgrbVEIE|zv0dxx zID=YD{h@wI!KM3_1t^zA&=m2SRY_1grCpU&hieWTNvE{W3Z>S*?N-!oG1%J4{yKMu zEkU*b`6Wn-CqeFbpF1&*>mwa{LVS8~-XOjD1V*#L7|lLQRu`+8C(9XERLB{V*ppnl zM^?6FmnzKrsY#upR)qm7HN4}LS|P~>oawFXx7WDW9!6EBvGreNsl$j_M5kC3_wtCN zTqE21lygblSZaI%M|SiAGiv8GSy~`+Ts_WckNwp&a8Uo}$Hl4s4t9HFIaVC$VejJF^UzfIoRD`X66fv|o5@E?cb*Vo$>qg! zW={EsQvN&8MBflsovaA5>s{t!{r1@X+9d_KecPFXhza}cF;>}PqrhCYK{SFSqi+;0 z+z@X*@|%{4(WREzZ`f_Vq;UsR7xg-BTM=B)p4@!gTKZ*5=RQ@#>|6a+8i>zE{?<1u7^@!EV?V8#WouQc|St%sRGEcKrWl63tLYb745e5d`L2kluFm&+ssBRvy60o=tYH)AWm&38oks^|AljLXG0IID_MmFvMYHaVT>vA$KSMvGg)PDgyC+zS>LtiNxkYiF|! z(w-@9+*see`fbr&Q&RQYZugJ)D6Jw^7Yt2Yt`&i7qQ-VW# zN6QGnU%riFIwX2_=oWGRw{+?j#^$Jrw!A;&W^uJiTw}yuX_{T!9}?tB4xQ>s4w))- zg^=2%yX^W9T#6DK5;Q%T3Mza{%ezoWR)lEfvY}9+xC;fhpm5t5$DJXAxy|2b3mLrR zri$T9T!F7R6GH-V4a%LbP~UK!d=E^BjDVB8fx!ZuYLalNUNfZ7psnXFB<&a+ARO!Q#=4bS_mw2DibNjfe*O)>=ipTosOC_w#N{^K&r~N3Q z4PFVAwMfX`MnW2W>Ej}yXG-H^$&ow}3 zfO5}?;E^k8SBCRR+GW?c{MRH#)s^d9os^@4ou~+->Qa-Xgm=XfJfX37qH#s-od>h1 zj@$;v1ns3|9bKKU!s*mF{C(UVq1TBb{Fl%_?O6(6ZN*Z!I0Vo6HYTpJhrTT5-LTWt z%fUmf-_hJlo^$QhMC^<73!&Ms{=O<#6&jRiFIC`rTgV!XqY4U9C&>=>)8b;Dip?Qj zhD-A%zjSG(??Fc`kJ#y`qQSOCv&ts9q8lmZ&7~)7AGYn>>Rx3*ho>Utj)rGL#oS%O|h@s)iAR_DtxjB%XTtn43|6m+K{;-knp z)IaT05#q%1mFHC8V5KUaz?gebmDH z)N^Rw$YA-)C?uT7sS=0GDCt~H^W5}hWAG8@O+`CW(<=BsYyZQAJmn2a`C`QKOVNl_=X9N~7$rv4!n;<7`fJ(Ma1w?YL*d{lqNbp#TU z%vx7as9NAt`VP;O-HuC`lIzn97mb!J=bB^XUJ#n&LDQVoN-ML zmam9Eys|fqAYAXoj}Er!Ovd-^=N$XEYiC$hoN?z0jmc>ara64%oDh2lu}i^U>uFGH9aRxKP8Wqa z^3pESZB^)_QSDyq%5nRyIn+tk2 zae)C`&{c3jP!kvQ1Q!qsU=6N#<=9oc76+(@d)NKk9hcXAGt#@lioLVao5K1atbZ5QM`7J8 ztWUuDkg#rsb)B$ofz=_bLX+?^VXcI9v9O}ElI9C5WV)0ltk41}C8{W6X=Wou+|Csg|$J@ zFRViK+MB|P4o&rA_ZmWevn+kBM8VGV&bURXn6y+v3D!x|y1;jo4Z>u^|m2`euAmaY-jv9JaRs|nV|Tv%gaJtM4f zuzr`Tpqz-eBf=vY)(?br8mv2obq1{4gmpHoF9_>AST~A9g6B5V?PQzj@;CYk9n}HJ z(#l++bXIHh8>_hF$u2ZDHz_W+$u8kWzih=NPPi-?ZXA&}L{`B(5-!a%(w9QJx@$t9 z(Jxks7bK??Wb}(uTrTAZm##*?M8)Nl>=JDBOIBQt$}T;Pe$y0}y|RnJ=r==gc};c+ zG5XC`TsF%tqm6!rip!s6m$61ao8nR;yO@lA%M_P<*(KKKccOKd%jOpP@3MF$1~N=y#33@Y=1> zZ_@ui3!CljJscHBQB`fdgBHg`4UEuh_E*3Z<u`6l(|=b^Q@yt00$7=n*=`Ha!nhY(T&#$;&h{o9|g z^{SGB#zgzryOU$*F&V!0AR2``c52(7uz%#DQDyb|>njf(cT{Ss>vxJ7aPS%*qLq^Q zo(QB!$Le=t)!w!_%Y{`7^7xQkcO(6GDgAdGRX*-=ukuU7c$~()t`$00mFtl2ZsVmT zI%9)=^%Io*s`C(-)}HD~?JjAlj_>u3@ASq?bJOj9HOmJxR=-Ek(zU9_$MKD??vJw6Eav?tVhISf@g5Zt4I zZ@G6G-;?n%!G3~W1aA|(O7H@~X3!A3?u0Y;o)ctBWJ+Y7BJ&iPwPezai=bf!9Al_FV+0 z2-ZyS?RThrqOapeQF^CE>AmcgG;mYGG}YCQ6jIbexmU>bUg0QEQ=R?j>o^UR^{eqE zxOv(pGU5o531$$?BgiHwByhYb>ZT`^bx$&b$qXj5E16x%3?h@JIO_t*q{+)V9ho{Z zwPb3W*Nt38kJ9gEf>#OlzUfsr6MPA4ueuQL&FjJ2ty$f*(06rp^2)`9pbAt4)tQP3 zT$WV1y6hLRC_DTvnt(p_B#9-{G8$W6D|E;obklUkQH>Et(&Vl*9RXo`^x74Y-G2` zNHaI$6A=Z(@l8yn(E)D1{VVB!63#LS3F zX;i7Iu^CJd*R0kzB{sc^t#<3hEg*_QYFQmM6kIpb6sp#ER=*m1lw6m>E>uj^IvTWA zdx~`bKyo=k?=y`@isD`u%5RSp`M9cmtBuuGeKPhZOnzR`=Y4HOOc1%=B3vUCSKH7k z?vq?G{B?zEMds8tqJ+lyPo4gb-P%D*%WM&+Cd}aO?()^NSVl9_Bkfy7Y%BaU=Ej5m)WGZdqI?28w`_*au>SoFcU{4ZReWI4t# zn?H?`CfnUU?wG+4M2GaoZjEqbt1(|__jJvPv zOxREQZGrw-PGxVb&404Z_g1?bn@Pn2Y8ls;Ef*`0NGQma6quWw<%~_ZG@}OBeo-dU z3&kEvYA}syy6=CcKa}|AcPb%K~ktR4HP!tPZ!A zg^Ge+vt^a#cP->d%OynG$tplj2>MJhG0`8KI%X=7!ZMqu2ED8!co0`jf zzeZ#gbondV0$rC6?Pqn# z?pyWStCFP;B$>^|xGIom*!#XoK{Sdo?$zJ*l-N*FQ5Jg=8Y!eHlBig*ci_)j#$vcY z#C?6PCPfaEEZyW42AU2r*30#)NU9^@SW$s6Q zoRxr6xp0%->P-zN%P0y-UlxyiM4~T=mkI@1TU_*28NRgj@ z_4$j0mJZq%JFV#=hbfIZfOYu@9^{8mzgIUQ6Bq&oF0&oHSPFWKN4r zBHp?PPJTb)T$o^lin2KRH6{fW4Or79CffNJDy`&~_9Ws29=lmb(}eOM(}Y!*co&)? z|HD-)M+vJ%d56k%C|p{v#u#KL!f6ER#@+h0Mz~dn34vgQc04TK)%5qE?xQdJpgGcU zI9>Y`%7bv1F$c>c+qpnKM!&6#@0Y$G%J@47{~nsHz(2R+tSo1+OE~-P)@(%*@^6+i z$anXucVN8)%3lAil;vnHrz}I$g0hLA>{by{ZtH_plI%h&2VNDzyvRDQkY#lJMKJre zYczuEeLnhHsZ$$_`e6%OoZgQDAo{AMrEaEm#-y!-CX3ulHBf{8j%JrKYDVm_YtF&#Y z=iC2|rO=q@9;YZLf;GEAif!rVmjJ%MA%=pNz|Nr<#m#P5mt#Y<&n4tog!mp~*; zG>TdB4Xtyfy(!{OkD%Zk_1gJFY(aSMVh_Do0g5uX}Lycj;R!RwkWr>ZILv z4_2)ZHgbtdSRK->J{KKmqOtID9kYe-cIy$NBX?ZC183*nQji zS9AZX)`0lJ#g-Znw_LoE21KDTQPzN1NsJ_2vRYA_Klui$`M~tlp{*NQ#m4T(DNuq+eSv%q~XxX??XxaF-rFKMF z#{G(BM9XJFWlm|ruWLqB3+U=KBYpwB8<$)Y8(e9PHSJnzMpTppwxS>r8p{4K)rc4V z;-wn#iHpruBO<4(SB)szDHnQ8FISED;Kkpn8c`&7CDn*(fL~XQxJytY@Tow@t*Aw` zDQXdCscJj6d#Oc4xHi-xju2`Q5uk0gh@HLEB3}3V)grd0r=xAXh)U`GM#YF_SFISa z_y`dKB^@$jc$9RYD1Kcr;({i{h%+uzjA)7%x;GTfh(G;)&4_4+|3=M-4_>^2X2d&w z1_rHYM#RXkHO+{@o7>Wihu=usTnb5Q(Kx51yPrkT5Mg5Qga9uib8D%ERt^=CXK@F za?OZ(xxq%9TXV1`^JkB4Ola+ZB|u+RQP=7ayM?aAPtA(fj@u5HSlS0PEg?8bFziDU ziz09kY$d8HCaSKGV3z-dQ@7txkGedt9Ho6U0X1#wp@_tkAfK4VQcDUDVqS zZ0(Yz>TJw^545dnkusZ3gzm$gYsr}Xy_zi_FvLBq$CZuuJ*DhydCr>DghRFKusk1Z z+J)akGAZHud%{U~&^*U|NStV?7%OHOu3BYYNV9^(VOq!6G`CHbo=s~px9!>N+NMwC z-NR1vG3WH-?(S0c!lo+=7Rsj}1zhWj0--XR-RAO+on z-8e})XEct0baccA>h?s7YjfP4=|x)+-Ict^2?E>|t#f2(nNu^TI!k}La!Lv=GQxGh z#jc%>Z;Gp=0NW^K%XyZ*SVIsUgdYQb!trCmPcnYy;is^|i7qbAez5E#+bGvgng!YP zZeLq!0Q zj_RPW!x5EJU56dtz)usMVE?7cjX0E&_EvktZ8g)WbaLDCZexjKHev6Jsz0J>2Rlt~ zgN$eGosAckbd>j|`#6ImD&2pQUwj=pzKUajx}=L_%<_EynIgXbq;h*OHg+D5RX4cn z%dp=t%VqBR2CieuGFB}aX*_GwQ}P|sQc|Ut{wmfkq*{x*?OZx(!E%kf``k zys*?Dy=%c|9^`sG<%)1+$}V+rt82NxvZY==@+x+@kLB`Fc7zE>ca{`5B_%C2S5uMH zbxMkJPN3Ms9wbhn*}6u~3DlQ~4@gNmH^o+@UYSi6P@zeQ6OFSM1(} z&3GW?yT=46HM7)DPc1GVyH{{=*QQ-=UCYj`?1+0Qq(|?Szv{ZoJ(U~Df~9idR(8(T z16v{BlG)VV9Dny_jX-E4NEK3SY_p z=@@`B{Mc2Zaw0D1!#$66#@$p7pDggKi-b*1_?2x+L}gawQXg@IykR3KF#6eWQDJ*&BvsEQ;j-JlY$McVMA`#w5ysuNq0*-` z_1Yvf&YXE2vOfzE}Tc)lr56B9d(9B zisH9-A+KkJmz=9@hcnzIH02QTuY}?3VB;a~Tv01cxFm=$Ued3t+`cf!lsTlqi zA1PfEEi}ns=e#(@N}ZIm6C{@=;v6Vgn(H$w1zQd7!`&;s)ydNGHJ&oLjXdDDOz}&T zy3FM2ZO$i!xU7xXSD~Gl<2BmM1Xh13|QcT9o|(xxdodkWU5Xq1jn zE2bulY?Q2>Fkj(Q|5e3AALAbV+A>NpN=^eeYA5Gvl{CWSG_Y`#fn29IRs_E8?CiW< zi{cq3r}-IfhsGn_n@EWezE$H?d?PAr!Y(O|wrO|z^(JvPCD4^rw`O|R(rKDr_8Y_{ zG1oLZt0#dd7))?VDz25(U@O1QDJ}()eyGPKfRZ@Z z?3{iIOLjAHA0C?UhxJgk*zY~uiFcmcqOr$uMNnAn^}p!LcN0FvIucBGVN>>7=)zKR zNm9%c8!EaLibd5%+@dKt=6S9$TQ(2ERtVT^%s`P#Hx14jQNt8D;wpLtg*=>G_*`6%C3T^E z9i#p19i(&V>M4H5hnyO{`yJzj;@j_}Y>O79G)d3H=Qvj{1Jswsf|Sa++)V?Q~AB!;bpj(&On(AJ3isglj*0o#PUv2JOx%Lbrj0M6;V^^_jSC zN$`(+m#(rBEXGw8UFFs8_VTF4_ro>OAwHF9`q!3g_1i1u3GAVURTspix5;FZgKa#S zIG8^GrVq2-08`8CQ6=%(5?A|*#9<+8I+uL2s^mRQd1v>)=B}$t-t%!wB^laccgH55 zl0GG6(8*#C5Sl#ZRHHEZvr5MNkag20D60Q%l4EX@{e$4n#5r*xiM#FaZK zk5BZzld`)sajy5Bl;YrEO_WBtmGZ{9o?9uu-lDNxhYJRACndHewz!iLR}Vs!O0JLN z_~}_4sy&x04wg*gxaVTZ;ll2@n6l?!H$6`(tCAHEJD*^%6E<~%NgwMg|G09 z$j)^^IL&F4_McSq#TAtuJjLb?a8(O60rFK|KGLyb3{lfuyTzbVUxw3Du0xKmi>rPJ zuvy&x6_3ax%L0FbNi?!7NTrcw!CZ_i0|+K#u$hLzW;!_)WYJ)=AfE=C1xskKS+KH@ zJQiXAT7UuQQVc+g3oFFgk%}GoO|Wk&+h>a>@_)e9R@ZswR~%5WB&eb|D8YW(@wMI- z;;O<`RUKW|IyI9d`9jm>6%bpD{OmPW78u9tk@b_TCiNPBp-_ z<=2S-RZ_Dg;_PQ<*5H$&wB{4h>FRQ?mDZAV<~hG7s8gotc&;Y98)K$iUulI|lq%V7 zU#aT15}S3pNt^gyIXIf$({`K6{w z4^L5tVYm)CP}WVr&Eifs<>0&6zn}0m-uRhNfM=;^=u|NKl8pIK6FehpWlz zzup%C+A-I_!kzg*t5`uLE&k?*$ z@DYJTpuJARdJqgI7)y{$Fpr>+poCx@!P5lW2`2Q^u;BzD1nmiegUL=1P7p^hkHAW> zj^G7?N`iv~#|i2PbloW|!FYlh1epX@f|UgK6a0<>$U=6{a37#bQ8$l((QGz;x_Sb8efnW?l0>M0jI|#}N9wd00;5CB11jh&( z2&Uo$6+N{?^HGAv>ok{@v$L;>eKo_xQns7eV@FLa{Xvt*ukt$+8`IBpSseB8>GWq0=A@u+hhu5BX`v$h0H>7@eW0k6Sk0`h}`ickUdYy7xsJ#C+A&A;d96jIA)N2 z0rYB6Sy(77D}{uc8ZU$5HMz+6syM26sraZksCldT%K0q!*>W7l`_^%(vPzta6x)d|{=0kUr8y znn(-jAPtJQ9BCjv;vx=9$*|e2nHeID3Dz88o0e_27AbCNmdt#M@-odX+mZ_Mg+q#6 zF*9t4i+Bi+a0ml`b}O~2sl+{IYH<b(+pV)|}7L&U{v{tJKXApFBWbGBcPNepfLVw<2WZx8$ zN|V^cR(#MVClgObix92(PbK*lPNf|oTyCN;(S(gGJ0L?0Lb4cytefUG(7KmKoS4e+(o)~h9L&zsyP${Rnm|Tm*J3=m^ zbYP-MPCbuInOe1`WS_-eCE7BdVZXvxm)Ez&tGr_jx;@?bT3N^l6)aZPr6t7eYCg9yWdie|3P;Irs5!M3 zFUNlvi@aie7f@~%1!K8A7byOaf=dK9ww`WtJ_0s{V$@|*WQ)o(t;u@tbVmJ3I*S!4 zmm^x7Riv8fkpYW-HT~biFU@nx6y=?vq^_ph)DBUm1%e+!g&fTmeU3qlcrDGi;qvwv z?o~fmj~_zFJcv45EZ%L+@C)~Bz)t--{PbB1ATsSkeh1voqWqP3#)Dli3CC zWI`3~6BkUZJDJI3_8{~4FD7<9nT2Fxx3z)H8{mH4#Cnq%OeRJ*FE*H1A2KV?nTY== z9WpU?EG6>}ZW-PW>1UgBhpT8mf9FWbEudx zfhz}zG(z+3d3j{@$G?Wkl==EIf1e<&*=+X1Ga{VQK|sUkb;D*u`|;9vdwHTv<_ zmHxcny#214WQFeL?^jE26WuLc#0?m%WYua%Y1v(Ompj+E)>f>$XZ?mh-+SL*?tkFH zhaP_9(Z~M!_!AqS+_d?rr=QvK>~qh*@LzxX`-?BV{K~6aU)%Qj8*je#_B-2mR95Y* z-u3S8J$v`P_x}D5K0I*n&_{LYu9{KF(=f}SI@~h)tfAj5$liz(W)%@T-_0Jzq z*Pi+5Y~9c2>Ko4ga-s3!CH^ljOtii5a8(Nv|I_sUPv`${Ul?lJ|9?gKLzi&}MI!bh zyH>H^?`6kLJnFb%otOO{FZ+5g`vx!jpS|q&df9P1k80oQWrrf4c5-@Rm%>Dgx@MM^ zlb>0zG{u%-%PGi*`}879;KIX8 zl1s{IR24dKbaGk=jk9PlmYfXTdxp@G@)C;0XgHRgovqUaEGsNrT3Fa@9EL9klL+u_ z0XqjLC^MWq)_mPhUZcn(A9;S8EqpP4>`&uddCWQ?!6q3hKy^C6Ewq zIZah(xZQ5CF3-td*p`2h#b)#JW{Wcx;kC$?NfhVg6S+Bp6g5DTe}UcBS^(yq29;eK zVem|EW!AnxnVs5%n><%oAl8_Qn7l%&&d3H*P36)1K&965#Mhw(1^G5>L7pKyBR@0G zV!e#Mrn*{au~Aj!*bEB_GA)LJEJLBXjyy!n)#YzBLq(oeGUtn&hbl8vJmzJE)KKKq zSOa799YQz?N)x>kii2~+W3-T9R@@<}sn&oA&F3!o%5Cuc^NU?6Z z-Ckg$`XNqlo>Xf{kG-tjq>D8uE6v$vlm9fYtF= zD`ltBCAU}aw3>y@w1_JA_BYszfY$VB6K)!PdAbAp4K!pZ*n?A=rQ8Z01N#gl+Vb)W zmLgHaZi&w2aoR42R`|@i(2mM2GK5-|ki^N!GFTQD+LjNxaz68kr4**gz;~Psssfc^ zMIkJlgn@ zy)3`7fBW()<1zT@w#)7FXH4wJXWI5pe#^wBz17^mWjRH?bLDz_bNiL?f9Aa_`hqs{O8>rnO5HWypZf3C(A*Ou{l=CipCOYSiz6UD=4xkiQQ_RI?0?!eRXDD9%C*B zG^f(AV~Hq;6dJ6gF|#JcW~KjliakbzpsJoPs+pz4C8k9u$BXC(eBvw_g<{JJdtcb) z?I}Mpb3P3PV`$cqvmhfcg-{VS8tI#8$yj2!%sodg4=dF(D5P8tYp3VSGl)#{vIUkx zgd_ZH*bej*=xp2DH@+y=GT**%p~aePwG>fdupbB?j5w1Ea)1|m54(cA-Yd20h`EVF zDg}qjrKvi8>l2?(sAuHm+|iPV=={u-!kqk=0z2h*SBusW%?^vwY2GFn3)W7xY{ZR@NoH&m%5}0i z3HJ6>E~$ihrf3J$HrTt`X`cN=dtmqMGun$c&km&BcoUTz+|+7hZlanhLTz~Q?z>*) zHZ2?T>3Ev;nSGQskLb)yt0>?8erZ&Kg6UX6lLU|pkR75L%Cp!mW0jY+DR~x4A-l;p zF(!!$RPYR8QRzFCauSKLETjgjTD>eo1N6;JlQKCT37?}vI<(@!x?CKvKK1HIfla1Y@ zNDnxqv2nhM1sTLq^Q{@8Wq%}iW~xQ5#D`_BljQ={_zPa|Lr=e`U$}2U)nu94#8cUIVGAC!rwUFS` zw8{l6X*40X0ctypg~+w9V3*cwKC-`|&F9~a+JDQ__Qy=wzwM80|Fd}ik^p}di=P!%ht5AM3`GBeAT9-n+$CvyXul`niO;ERfdmN%-1OV zfhSKq*@K;YQhIV$+v%^|C~Q-x1DSGk?ok6vKbm{==F7t$KJw-9^NbB!DaXY66=Z(g z&n6a2U?LbxFq&XEK{!Dufq@{HAdr9&G}M{cDFTV$1i^8FV+2PCJ|;Lwu%BQr!7hSI zg0~4?CD=mn1i^z!`1J(k1SJGEf;@tG1k(tT2@(lR1cM0-1nsm<vlF%x<^K6KpkL?hlQ{YLV~Lt%>L^yT-wdJ%sA{sX&ZhkB9zSIA#} zr~Em09l%FbxBmGz7i` z0R(!2-W+@$r11K$@%ixK!&y>N5=%)*VRzhdM>8H@zkWS??z!jKtFOK)c>I%3K4B+M zp7ii}A(m}kq;~t_wgA+`p9=rPU(4FTig%pek+rCR6;l;u?clt4hdZ4(VNvmqKc~M& zmg2vjoW=QttQGrCPM@uv^HqRd0n{)73h3o>LK&GvIbC_hsek|eEG#UHg@=c; zsHi9w9UaZ$d$5r0zUNkUaML0d zx}CGZJ2@M+o3nAdI2-XEXJbF)Z1xA7#eB@!tw%YV@)c)A1k=CaY}WUjEjZ5E{8OB* zTD6Kfoldr4!v^-i0}rr=9(ss9`skzVi6@?5Pd)XNsNWY~e35P4x>d-sx8Hu79j<_WqefM3qZ{I%l!3Q6(Lx&Erk3asH9X)!KeeuN??DWYa?C?*Vef{;-eP45j`enK6H28Xa}o?TK$XP-E{z4cNf1VNrY-o5iQF z<@|Q`Am6~Y@|W1h{E#Y7SyzhRm*R(0{3wc_NbzS<{Dl;M8Sl*2Q2a+J{@*BmCB^@U z;-Bz}KY-$!DE@5}-$wD*QT%5q{!WU2h~gii_+L`|Zz+Ba#Xn8)&w0fkI)M5&nnD%Q zG=9B}`tfx%w||!U+iGfrA9ZH@$S}sgn8Nsp+Zq311LL(XF@DY~epia$m*Ud^X8kP` zKZ)W~TD3V8e>ufpL-8M@_)` zU+alKm{PcvQplkc?xqx;q7-&f3SUzSwVgTpX&7g9Q#da(2`j00|Y;1biAOx5=(V+MzB*mB$#!>R- znCNliqtgc?K>z-I`zZeLNv7z8=$P0TiVwVo3=RvsCA|sBgro%ZnQ(pZb?HNf$SH*M z?PKUS5%DSggoOBU3F*DMbPpzf3J|IU7?4i!$3-J@OhWqgUAlCa{RNI8eGP*X|AxRJ+a!|{k@K28&W&#QcltzyU6S{Qi zLIFJf=_CEqO+(F;!6fp(VZsD~LQju>jNVT_x>LA0AvTFhc|vbNM6U@7dyE?s9euN} z-YBkZy#+yfsY2odaJ{3)T^q3ajETQ?6)WVzd%Hjrn$++V*kf{7)#&gB3 zK&xZ95;m^Ic<##M6m>i|b?Q_x9$9Ib=ox!Fv+NdDo?~VYT4UI&tIh1ihgY&ududET zaxU&u&QiaT#|+EJy#N0D*&~lU!XA6laW*x12h8K?Yb zobvzbIHiXo1A6r6AwGe17pti~g8L60Iux3wdl-832=3A6#@<1lI^95g*1d0N|NaB} z5A7VJAJmcFd-Ulya3F>49MpSg*w8T6v+s?eLwmI!+L;1$>e%syo_+d<4(-rB^ajPj zUtZPX8^gjv z!ovE53Ho}{gKx2Y`p94WiuH_*#Uh@s0&Ok&YrMiBJT_ePme+@f?b$pL#BfD9dliqm zHN@Ww{FGe(JD%V3$piReD@M28y?dij0XR-Mpk2FmBw2(`Vk#-2f`lZ6*v_Gr_#gH7 zD(MDZWq6b;x<|0T;qk{GPosY4t<$GZfA`~$KYmYr&o}@4=RZ%9`BhzA-D#Sao;Y^w z*h_o%>~U!{ny|5B#|~9!3Rcp=))th*Zz(_2H9F>N1`HU`k4%(Rr>l$`JZsjhaUyJMA z=&w~(RmJ1SkB?w-Jz*=)bxhuB16)wA?G=Ds-CBe#JiQQh@#4i14Gj&rKz{IVz`r|{ z_W^2y!;!|QQKJR`Kf+7k|K5A=@i*RhgA;!I_19k)c%M9Zl7IKzcl_YNgZ$8;Ln0jF z&=>*kCn(P2FTM2Aif!Art)L;B+2L?ZE-WmJUAJysGL5T&8@3sRU3cAe5l*M`wwrIh z8D$q78yg#nbbl-UXV0GHG?v-WuV23rREFz*_~8d$Sy|~R=K}{0@XtQ`OyEiNBXEcP z`0?ZX^UpsQ@1RKq8uJK~c&_funKKQ6c%A;XnQK)7gLg;~#H)`|Y=1QC{Z} zj_ACX+S>@iVIAWBR{Uu^g}gif{8a!ADxgkO0RAc+s$GSaw5UKhdw}ZP1K#d{--Ca3 zb@f`R$G*f9rJ!Nw&Yc2(@W;`kM@1cc{q@)49XO&*P#YHJ;lqaoplzT&V4~j8b`aj#D=z_i#GDVQ#DczJC^L_}ZWg;LN!^>7(2zy*8+ z99yFU<&H8(9f5Da|B$;hXA=lbCj4*xT&7|C$DH3nxQ-zjMiAc=9+C0SIm~&;+j5(@ zTKuWc;Hvxw|5Ja&0WIr9<#UuP>H>TP-cad48wa0(@6j$)6YT;|%GaDvA{r8i|0jGZ z(-3u#^T-cm8p5e94Bp9k=#JlxKgr?^{rmSHLG`c>?F_P|H9ElSZSfb%AO7eU5D#+3 z`$;`PZ4@+o!FfEu^FFyfLnaN_F1P2K-j>@m zN!!;OmxjsI-9B!AD>1f0aM8bS&RwkK%tVx<$}{ zXHE_0GZh+=zv4WRaEklPt387Tr9BUUOd^@upJY-WqM`TevTUViRcrY7?c3MG|J28$ zpTDd=(0kv~T?JVi8Yw8{7vo#uR=n`n?YPdh2MXUL?4&zssaXi(cTXi(cT zWK!r`BANP@_@kYnf1z=f2S9@gE$L{jji|KX*;X9MU%qn;|Jxl#{_HZMVM!GKx%LPC z=`S)3=|sbvQqG1cs@b*ImyzX?(RSBCK zqH{6T$!N7bD`Sj-+gryU@Hay!` zkLGU>4O>@^;V<547NG5Gq9L?7*8qdpfVz^^r3@^@%!1wzlFa;G`vnUyt;yD zptgYa3>uzPXn07WVLfQb9nbI1CK|G0`N~YQpaBnL(ipEX#)x-Y=YPly^kEoB0Jdz| z!k>Tsd5&?B3f^^crFL@h;zfS&uNl0`F^a#vifEv=@CwoJccnc;CT+Ce!XLBV!XGRg z$M4HG@q6;3xr=DHi)dI)G^`*R@U$Fb%st$?`~m*N3xfZNuS-G8U3cBZUwGjKLC@9D zq0)l5(xF%Q&eBo5l4y8~Xb|n0Xn;&o+w&77lODB>;|~;?_`O8KI-+3>(NIQww8|px z#S$_p+G~vQio13B5BydBHyVutfCKO=FE97d(2|ZT(Q@%(BmcVUVgByg7{0?Xn!lyA z=a;?O^JayHM-&?VOnkI%Q8ahv$TZ*)V+`t_6A2#sUi823v&*0EsB`LnH%yr_B_TgQ z|2^P}_J}sHa^*@vgExQuTAjc|n`$}7YVG-S*WWy247BG8r9HQJt~mYy{;2!7xH!}U zfA-mD#n=mD8K=|9mn>Q0q2Wq&T&Yg*KqkGq@+#Uh(a?&VY3u2Za$3KBeHF=0K5*bb zo}Ql0pL*&kj()kQsEFHaHokW4TG6h*_~Hv8cQ6)ejTYdIz5%idV>PK=J&uCG@vg)KcUirISgokJOv-3FGL=@T(SJ4 zXMq1X{@&&#O=FBD@)!f{88YeNWl2E)SLa`2$BuO-B_*u_{}8Wlpn3m@ty{OgKy8?l zA78d?8K*YE@qX*Aw~8^syYId$_yM>BSJaWpS89ELKJXsqIT+WWF3=v(rbTkkh; z_#iJWEj_zo!v?;3_3EE*yX`ifmzO8Xo#vH-mp}vB1?U8Bpra)%Sc5=648BJnjkbdI z2+SklhA|TA4z#rL5c%i7L>c|o^&dp0w);e3Vc}PQ`qQ5-0nfCwGy!PSDh)T@cq3oB zbg8HZ^cm{fj!Fmc1^()qFXjd?(H_u7&>mX0cl6oba}Ug)*>7BbL)!xX6EAICwQAMJ zXr~DY3H;7G?-ca_8i4=!@#Fc788d`C>HsvT02) zw8mR%+fYsL5##~*3i23rr><`hPWaq*wcjrU{zUiMkt0X;r7|oTM3_@k^*=CA{Av;)W=xMOSz{=rxq?Eq~6Z35{+1{3a=D4o*a z;9wKg`;)tN?UI=M%_rb$@khSi;~%wL0hliWAF5kUV+-sm7VUxRn-jkY9zY+3GFIcL z>xqz~C{xJ)mtTIF|Lt#o6Mf*{|NeIo4`of|B#~^JLw)3(g!@i%yPL`1J+AiqjTpaS z`~&$!N>ytO0+ke28{{c8NLxpP&vPlfB17 zup?d65$Xf|Inj%gijbRrSBbj^e{Wv(=3#H%25z7WJcPDz_uY4Ml3Ajk_I`ky3Wx(a z16hOz{DV0W0Jwv$#~*(jYm86$`1t%*+&%cK<9{meQqZ8v#n$LRc|!(K-!0||;3@RA zt*q$_{82aR7y{pQ!1v%KlsVeagV@af+snNf{@(l#8PT$jZAlAEtg+9YJ)1x9zypH6 zy~|w%gaa>u*YS=%0Jy8)M`&F8*uQ|gz~6iROMTBe@Fn^n(4nsPLw-Qkp+EAb17-W# zYp?N#AAVTyv)YCMpj%y=$G8da;2HJ%0m;l~e0_cY72G}ed-sdpV;JwT&6Vl|@Wc~O zi1?rj;Xxbl1#dxif)*8b8lOJ>JNf-G{DBL#FTwxRf0wHBuPf1_u6e58?@%{zLp`Y9 zGoJ;~%`^yBq+#1#|cA-9ql74A5S| z@4z4JfcSCqABela-+TR&5?ePcWjt6Q@ zuKhOy^1!}_KSTu(FQLw5$I_*ZEP!7cw{+=o#>UmkCfWXA(^oMyipl;UQ_~`SuY5}s zv+|F?zgRK3Y-$wKS1|(=Q?Ho46?2?o7Aq!~O%2TE=XMP2cRbkN6QF<}yTVuz>wN_K z2+p;bFXA0vR9dbFw)G&dU>f^|Q=gw;u~??ict4h8KDJ?F+Zo2(-Iy1jBJD34IA8J& z=W(CN-`KDgjBg4zS93o5L(V_>N#JrN96)PNKR>@wG`G8*+H?ct8I3uACV5*!a_JPw zrK2=Hf0D+wxikjG8HQm5eQCULdf^HAI~mqO@tx18tmS@umh%H=I3Kr5(R9LP)rjP2b?j{=1%Y1-i^?ii04P(L%ni_UH8}g(3%rd@yqILHjtKI2Oe{fwu{M{2+?80pkHb z0;2-f37oL&JL1;uLHn@d6z><6mzVd6$GZc67H9a@%ZA=3a*4?2B99o~KCoBd$B$Oy z$96G{23Q|3Ch%j+4N?6Nv=9F$9xJVmzoRcGRWW>G?to}M_Uy@Hk*7{y+z0SudNqFZ zW0}U+OfI=1W_awoNTihd;_ixK zZIB7zo$>9%uNX9FP|>hq!}`Qyujm8vCZGih^6S8wUX9^>z?qN_1wR5~0=6+ChA$1t zjvg;PoiF+z_;Ke2?7MpV)v@5}7%;|v^C(~7UBHTv(?o7O;78=efv*6Y5Exgi{qkN9 zh_>3t@uR!r;_-)1HhT2v%xTl6r9&1G@54XGbE7Yy0nWSU<_p{qcop)hOJce0nK66; zG68%9SmE%Tr1LaDiPzD=ymm?b429VSkkDD)omE^Ht4KX?K30578Lc+Ba<;k}XLhxd_8 zRO82j#Pe9$&$SPmf;&G@_k?AU4c#K=jTVpj2R>1JM<~g1%a-__<%NNj_!}VH@k1- z&m$7WT!4Td=L~uvvhu}}$Y)0mL?V~*e>~6A+O=yp2+uKe=+NSI$-RgJVe5g*09ztIEAsf` zkBjHNT&}tL*aUVwm|IEJW8U-6zu-^wN899o90Qh!ym4}JvdF)p5B>V}6Lg0@2r!a> z2Z9`Ozz<|6&J`3C^d?>olaGWKyAktWDW+-yS`qCl^YZex0^>oBzDt)b5sU@!HL}a+ z@dD62;KN{!NN^@w^&QdkNvdlm#plPR=qnpnDouhMKk9&Q2YMry3m!x+9k>SMBOXV< z7(g%JKJ*2&fZm4AL_gnnP0QmpOa(?DQb!#yF!7y?ghLv~1Zj(y?Pl z(YGM)7vMv<4tx{n3(QMgxpF0z)@*bYZHxBNCiKsU5hMDbKIG(K^PzKqEp+eRU0}?R z3tWo=8U#6B_{+dl;J4E=O#20GpKrf<4l6z<0ee(hS}Jq{=BfsHMT{3{jpv3=-m_=V zf?wFSXdms6t`YkGQvC>g;1w%YM5a%lE^@`tjmS9#nBuQ&TeOdM0{aVI!t(|`IAkxt zCD8})7%&dxpVqEj8_W~@wQZk&{;SD>LeD_=VVtX~s=$B8i58=!X#V8a7QAcH@K+v? zuPf=d%a(IZhWm$VT=ecOjw`*h8~^U^`TL~kQGNZDU+~^;!e#qO_OQw2ej|RoZ|2OI zug#e==PS}tC+5$e|J;HF3og<-OP4M^Np%!2Uc6X*PuJ9%J9lpKtXZ=*zWVB`Vmt#I zhH)mD-WPvA@U+dFHzUvbJ=JlD`0p&_5V0}%bs5DVY5$DQgYwD0o_bhRwKljP*Mg_v z!v+3KAXCs~J^meync$!9CbuTE?IQnJf(=GnkhLHtiuVOGk4IzRwO{cfyB(PlbL%Z=oQDfxo!w#eSlW`10BJ(VPzQ2#DE0Ka3M> zP%sDe^=I!F{ucZ__3WUrcRwI{6WkS0j`Fz1iw`G#dmJ55`KSq_IaNh54#%l zBfB8<7BD%?9|&wI%8H?0p2-*OpAE(zya!zmKE+se>eNZl6nYwC`L8$U zL{>iCUd;cTKJcN)+kaVz`&S3|Z``<1_-es?9O!NMTo@1N)A+vNGi-T0|Ks{#{DV13 zs0(%y?ZX}+PC(tz%Vhh9#orG-jeesZ&;nQyo(VP^`6S$nI2*Qm%a$z{-HS4`&eFt& zbVxO0hx9W?a7~@qaU;I3A=Qx*5*mutp0EO24XkV|{=)ie*GX8f7%K;0^|hK3RyW39 zSbMFOB+F6lgq7E7$F58e>#kiNyD~wnx>iT3TNCbHx|AmMp#QPUXPT5O_TB73=Z?|? z^ciJCt&=}S*TJhH6nJp>^(h+ix{>0QihVwNQT^F;#nq1)0-t(6xxYF!FGb5F z!H?-wU+E<{3`uyn8=dJ_@KIRoco{$L^=ehs;+f%aPGMHTpoD>i1w~=EY5&q9JDi=D zQ7(nkE!x7Uk#Wgv-)%O2hfZMQ&52joj4xP5p!f zURK&aEcWNQ%G$K(eRO9yC%b=Xe%YYd-}FssPQU)tN=~oT()K>*H(zMH?d4nN zZ7=F8Z+rfs>2KaPpr@Cbn3|ZBl-#j>Mh1O=^K^u0USCd>ACt@ECGr;ei2SwOL}{TU zDs|O7b&&dw+CXcpwb0VE9$K-sO531q*LG=#wI8*%p>ZKs@2Bt7|I6S;2jgKQ+bA$f zjj_gLW0A4USY>=*oG==ht;~DPQgggH*<5A5W$rcin}^JL)*r09td^E+c~+A3u$5-@ zv~sP!)-Y?l^_=yI^{v&MJ;$cAjqCu6unarb9&c~7x7qL6AKO3L|KTJ%g-*Hirt_ua z@Qyr_m-6TNTK*yL>yCC8xNBU^JM5MFBm5VAxP`;%8E=$tlUvEAoT1cEWz|scS4XO2 z)OqSEb(6Y7J)nN9exd%T-k`PB617LPURsg%g0@ZDrybO4hSX3aeWBHfZDsGWlk6+@ zls&~hXrH!sIsbHyI=Ax1{2tzlKg>H*PkQrj+ybwGKh&S(&+)hUP@s4z>pHoS+**EE zo+WRWKazit|EN5wWGR)(3}vD6sq(F&tB)bcI z(_TZrt^b_A+W)(M*cVDg?2~-E++6M?XUiq>f6JrfDe?^Y3;DN-q9iH(lnKgVWxcwE zDEhV9QR}ZgrHu=n2ub<|eSxvs*l8SRvNM=(=EwPs?h#KCn`ty4W7SpZu4F1XO1@G^ zwe(j;5^eS=2b52gC)IW8-&8-88X6Ot9GV?k9$FWAGxSxchJJ(IOmCwn>N)x}eV2Yj z?`-rl{$jK+JD3~HznTZk6U1jXS-&GLOSW>XBCE_Qx1P2pS?jEitS_wVStmA|{hPVA zkF7-h=1xB3{PJ`Di|oPv+D4D||U$&$sd&M4@l^Z(Pj{yMx@h z?knzc_bvBBx29L_&GHr#=N&-P#SSNd!H z4gO~0j~)JQqV6aDIncMKST~n=rM?V)Z7esFTgbBP%SrNsa+(~L2g#G+16wYh4mNoum1qZX^rsFmtsb+x)deOKM19#QYm?$I9BIuk$l*Jf$=hPs4$ zhn9u5hIWQN3!Mpl8>*u_dI!C`K0#lif34qTq!?X|9>!>6IgQpqqnX*#Y-f%#Cz za=$QdwH~lCtY@uPtmW1}ti#p`>n_%Y*(}V4unP7TdynmBXV@+F9d?raCp+ElW&2JR z$!eu@(7Btp<|a?(Jq2AS^BE+u@9p%?w{QGM8)fg-`>H}E&_X&6;rui?M9M$ zr?x2cgr282Hd-2UsBa_931%Csz?xxgwIqAH-PalIEO&0?e;^+3=tJPKhi;Pmf%1E` zJ?XKO&^*#fON}byHDjHz-q>VpHGVMan}0Nu%mL;Mv%(6qv1~b8$IrQ@KiFU3Z^w94 zO41NItxy_=5<<;F%|oq1GCA>9C|l=7M`MHWol(zBF&{NENyC+!Q_S~G=&?Vu?M$-k z+Yb>1dfNT$AvPzT>cStVXV2xk`3L+gZ|vr|W$p;Kg7{~dyVw2Nt>rcJZub(rR$dpc zyC=-OXasva`*F zW@GCq(xbIm6V{yNvvF(z+eUn@+E3c89M!R$4o;f$49WO!y+^%M-X17q#`<^cMOfdZr%MpV24lujsGq@9GEj(|S##k#Uc)n565h`Mp`ws%tf{8d}Wi zL9#W{s<6gcmDUT^%hoh&mUYZJWu3LYvCdgptdRI)B71?o%%-so>{IqTJHc*dH@92a zvK_K5o7>OY3TM3YoHK_c^Y4O#T9Q=u;r;jklFO$_bDiej zafxU+*ov5SUtUjn_si)Oc?TmJFsHWbEsBy-4*PL#> zXB{ElPhuajn{CHlP4*yS>yGcd?G*B{dy_>#rmU2clv@C6emaFeJ z_mLg^mwDLy#5_iNs@NK0y=bknPFlB-PMU2mu-7{8JK1~;-^kzNmF`RK9CwMk(fz@# zM?BKZ`r|JKr&(fFC*zMP=j5WsV z#%5!;ajS_%x*;EVN`X?MlqmyA+g2#+l}*YPZ-=+nJK!DhKKIUg=e$~e1OFDkvER&Z z<%a|XQ-oIQ;2OOtyEEdPtSD23m8igO;aNX!Ep1+7|LJj%syD);fgp@L&lwB(Zg@Tvu*R zUO_7+vk&AMrUM!Cluo70r29iD+&PEc?jboKDuA9Z?u|;et zt75OQb!ao5%gJ-foI~yr z_o(~1D|xlNx?Tg4`desB8nkK$pMbrFxyc46mD)=M@kymw5xd zA>MFrq*vipk8iJ)Yvo$GR<4z6<(HKI2T)4`1QY-O00;mBky}}u2zmidJ^=s#$^rl% z0001RX>c!Jc4cm4Z*nhWX>)XJX<{#QHZ(0^a&0bUcxCLp4SZBrnLmE+otfm$OaghC zyzthU1ZXD%)B;IJYHMynUlOS8lBCtGyGsI9CxF@%P|{j60bhouYKNqv!8OoY&CFV* zZK54*CBV8Hn$;~(Yt>Z}Xx)U+77CP1+c3ZHbI!e)o5=)F>;C`0&u{Z#xNqk?=Q+>Y zd7kt7;kzGUCdQZ&!Vnvc8g+x%%)!>3(0-BIKE)MxJb__e92ws{(iXTN>s{`bZ@3-sU6 zH@@w@$gdsl&+zLm_XS*k==zobp>Pm zy;2~a|Czt9ZdmK3a^maqcQ-S3Pbi5UpZUfb{oQGn&+PKFIqX?f)GhIMC58AeO^}Gc zp?jIJB>IoVuFPc;M8%(p)wSrE^vmSu3Ae2BA7pj|-RzZFZY{36aZNQONHejUl2FVF znblr`M?QQnkqj?hlvuAkb^2>JeSFI%To?XC5(rV<%@fnO7^}PXzI*C7)id^;M+Hpw z4P2j-CZtpG?^=jD@XY4~S5uE5YcG&b?-;uRT9)IhEi3JDkQV{O~ z1dD!pd1q^W8a)3oDR^P69E_|t1>fCh4vsxw363q70vrEM4Q~EudGK>}6~QL&^56sa z-W05Ns}Yrz0iThL$JfN9{$?hR9JI08gA(h`W4_30 z7dwMGhVr3$Ygk&b%N0$nbL~rA!<1qd!#$&WR-Dh&Qd~=o@Z$d}eC&+L!fNTd*34@2 zT)s#Jlg=D8vD&f}^)0AGZ8NTQ603E&j@>p7zdY3!$*c24>Rg?--Gg5Rlh5QwqqS?~ z>x!YW4wqSdGC!sK$$5^7C$FBp{K-5f2gdW5*^_Hhq$lrj$WMM^w&}^W_(u8HTtt3$ zT``qGaMv(*v1>Q(chkMA*mW=N@1^@(x=+D<%3oV|`U7sQd8a!^iKZspZv{;s1Khkc zc6cp*E>|7kyHXzm{5%Ek@N+S|V=ht7d#g*q7=PPdJ&#dDpD-A31Ya3y*@26{~gt%3hxqA}4Lv^-37C;IDo ziN-{0qB+rCr}bl?HI=hgE0f?q2Ab#jP)Gb+yYX%}y>k`ksd$H<>t4LOm)_+T=eh9C z#ovJ!EafkyS@fWEc+Oy zXSL^dH{OCWZ${ZS0f*(lr2_g}9t3WI%gK*yR=2E4VTG>&zG`O6_Gr5D*g|#3>fW+5 z{{ea0y-B@I>T3LSKD+v=e2Eo4p|Zder#`>K=`#I#_oidx-yVxbi}3C6ewlrneY5U% zHaqWj)^+cvWqhkpSoLnk`c<>9m2e`S3?{eqKQ>R@a)7bIJTp7<1L)wXXf%i39Vb|z zJLO^TmA6rzWOxS_G^UVqMlB`b44GI~2HBqrd3;=xLml^r@s9X@!er_<)r#wZIZ^+A_N$P*XEcF}Ht{IIMqM3B;VXT{Q zuXrcQ>(hn2M*KN0$=i6H^CKb+i$rUwoDE3(2h<%N#}OmXz@L(>cEKOwjVkK*7S%5W zHg5O5RIkONUIyOmzW3Ppdz~-!oG&hoFV_jaq_FBIU^fU)D)$Mqp!qnDP~XQKYDq;j zI?khE;5mI-YKq-vRg#k|W)lh~{L0ixeBgL)F!I5G?^faiGYLMZIv;LoGvZFP9Or{> zXEeN?K-*$Wd)&we;QUx*A|J+i06h5jQSse38sotq<9HBV&JOdo8*TQPwTt`DB(sQ- zKlJT%veu@ry{_LWr;or{twlbrd!!=+rnC?|CkLe`TQP=jZ;eHFl8(mf=PDcEZ2Z8; z>7|c!5Uk~zKauvUO*w z_KENK;k{WK)|4n#Yb%qSFMF~xX3xk zxvjv$&Zv7jZ~G6>q9RS*v2`@sb2)ognX0}8S*TUY+2J9R(qF-peznnmTh)8Fv=Oi3 zf4q!5tqg~{qvG9YH_>;&`DiVbP3_|TbAlI%%3BS&-jK^`mtV!wyxuh>YZaxxjyYrg zk$Zoad*1#or(_zDX0zHAslC4|z)zK|BLm5uGub@f-2~h8MRnATAEg@r{%ccuf2SZ_ z9q2J3-A(GVZv4j6DM)8ckPhg{@f2HO8we-16z5iS|e~k>a+h>k92?jm5!fp+VBr6zI^<< zeW!H0BC$ue!()jl2*o`cOkOa9^3ZZEd1E>DD#3z3LF?O zGl!RX0%adZxr6X$sUB$w%Dj-NMntUmi>^PHUf-L7Uf#ceUTv45*Vmnwr`Om6&jpW9 zmw>YjoK3upvuN9+CfDHsi50!N%@sHS+z0SJfbvx4t6rP}xbPb!DI;(k?>FOpA7iJL z533OuzB8%pW#kVGb06VfyF`D&)uT)L-o=AbFlgE+PQ1m16T`HtiP_5kGhD|1=D zozH^aFQ{#(XaBl%7G5f`)_LUjZQXsO3wfeD9eF&ElaWj66@j_kH7bir^~@?eJh$V8|})5yAO)(8ff`1a=TKuRZ`6Cm^FFGlbXA@l5S5l|?r9r+EH7 zp7$lOr>HEV?LOHt^4*M@cYG>DQ%@8E%7Wqy^fnVVfxHT>2*94wL4@R&elkHCkvjxhcl7i2IK?{5L!KZ`V* z)`)hr6LeSu{4!0xBmOU|qYCVtGo3x<1ug3?E^oUDKF7v<7NB${*f+A}#K(Wo+wKD1 zrx@7n674r=y2_bqZtT)|aWmB!cvIWHTnW7LE@bs%6{u5rkZi#u`G!4=F3&%#_e*dX zRYInSR=Vv0zh2DVvp68y)~rD9UFHaH6VU#UA3}B_6Lx~w~E;p)-hTnYE!cWN#{2O3-GlZ=n7*z&FOIPu3CY)!((`1Oj8CpY~_^yS&`M!-O+%IDa%bc=lEnQKZ}@L!V?} zs>jgBSdf>uN{u9g{z>>*cst{(Ccjs-LpkH^f=^~eJbjTtmlpH3#KZHV9eH)R%-a*e z)2-Fx^xK~sIDv1+1-$Cp#xyz0QzQFj!AD9v_(90kZ`7s|@rE@# zYuuCUi~c}O?(^mZC|@%2JY$2ee66~rPs=l4Qappmr$(biUcfpFc^fi(`<;MURIIhv;N1zFOheH2{1U!}qUW+S0<-P!Tbp{%JFAi_YXRPmc zwC{R-kIF1Ub(uyZUXGc$y2Doo%>W49~~_5=4T%&_Aq)2Hs^WfDwn==QP~xDy<&npdtgVB9 zIdIUy;hx8}OYUtNrq~blbT8`NGK6|6rrxGShyhQUa{2p8?fnqa-X`Vt55w*o)A!;1 z0x1XSvnQmlL`-WPD{u2yT3gE@Un?ySw{Eh0wbcjP_<{+g}G*OJe8T(|aJ(LVkj_6fSxPI{Zc$6>_y3;dY~`POypLoey$D&s!6 zL~Wwz`{CoUB0XYYHEc|8j7P}+-i4UpM-prQ_B_@elz3d=X_(L2Ga2K)2^z_EWj3qn zGO@xL#2ae!_Im<%BW)*s9>iI_Xm`<`wEsln_Mwoc*^?J&0PI)5v)|yi1K)B0m#ze_ z66tP6-1{(|!}!4;Dq?Z*%>bVFN`ekL&X4ftSd68=e*y2C@Vk0`j0O|?y?#Dk=Pzk> za@$!UY((|G<*f7`yvxM9LWw=%ued!-F<_mI>@_QLBaOdeS{Uv8i+SZKWXE1)E%pG# z?W9WsPG5Bebd26h^>*?HUUcQz1Jm)nQp-#BtO)l#C<{FHyn^x?1-(Pi+ejB;%uWq2 z`0a%o@$OB?0+;jp@`#85eMid4#~|NbE_?aohWtp^{dFxr$t&8Dhy^@-DPP2YzInt` zHFEzvqMsTTeUq6X*npkH^Sd>^DB$y*;Kdujo%)H0UO!_zHiU^{4oZ86mUakub}d&+ z!ONmQ&J}6K9yl?sZZ&SKy9ebDr4B^vE9$_|gG zHT}}dLmTr*WqMO7`7j0eULg5rR;8Dg9tVCuk;m!FWtGaj>T2=Muf6*@(nJ7rQa^wp zKIbwf-(O0!^qN=^;@(E+SM6rfAL6~lsLgzYm6ry-IA7=nf8J9X@XZ%#sH{|!Pwy3^ zE5Nk?-))HJZ3Qgo!Ov!85il*ni`4y(?m(Y(;Rckfu++MUJ0k;Hy zK(eiuEUb3njcVAle_^XVj_2q~eDiJ=D$tgEt7kM?Dv%N9SZ5!}h0*31 z^YL_$1nZ=yb;h#TK{JP6$-U#vhq0=eE}^nF9hBr+D9TeIUNS@2*I6=XSI22z*}n zHCE~`i=5{%9qK1FKMh+KG18gKLKexr@T&~(Uu1h?<6Zo@CH72hFWn!BvooA-Bz*`%2*HHHp4&Rbjpj-$!MRby=a3R6_{8q+Lkck!egPCxKC$|dAM)LSHqPu%XLf2 zN~e`I!d}#(J;*JSl=Zu{z6_(Sd0OH=MWhXJaF2FB0v%Yp@lyjXOWO>leoGo}uMwx{ zxRBqZ)ZY*Q{JljjHv}^C@D4wxlr=(rJu3C$rZ20b-Dv;%)|8{o6#Zg8w2#z}I2Zms zAFtx^(1D45L3}xTv~u>pf8~%oC^K#ra+4gB8{+e#8(7Wj7FN_Z4L;MU&+kZ+dT&fA zX8~IZ%SeSCPwS|=J>6D!`+^VU-X4;3mlb?Sxm`(_Q`0rSufroLCn;8{O7Hz0`4(PW zt&)^JESD5NV%dK~I`Uq3{oYS2$m5SjyB7nFo9^LfSdo_6j>TdUIw)TvUM{!o=P?IFnINZ&ir+5^+yCr{zlB|XgrTEBJtlO`!+R;`iNclQtWqn1Ou>G^@&4Hu1{>+A1zI!gZv(7TQ zjM}JAq1{&yR}@TRxnvvmlWlmqJVLTnw>35Jnbl|$$&bN1-G6;k>wgww8o43zU#VOg z=QxY@!NtqU4EazFy+4jLCKHX}WrkkMS0k@xtC2jU@kT{E^&rwwy+)9i>fD~h(y88C zL5E+6xog}fr?I3T;Cm)$+9{{3-mQ2LOwI=9yYUF*h5YuiDWBRv@?4^d&LFc zkiJV+-p(i{{yox%w$ch73{$*0Ta8Hj3tE{&jbx)tnom8A_fe{0zvL>m;(eh+Kh{nD zQKoe~w%V)5R@7fdG8ylG=iBR?qVc z=*suX39 zA7lbv9q|J22gJD3UPZFR$|ra;1-$t9z~FbBX3~uU_j-|+j|-e@sdkC6?m`>VR5skf z;lM{uuWFbcj>j+2c$QISj;^~Sd=xgB%5$JR!ZoYK639VphInCB@Zzz)y6T)=Ty~Ha z<*YiiZhCkrVrL!y#Qn;o&p#g@cYX%#*HXmgk074ulX;9BMx01^W>9RV>lX3+PLmjO zhQ78BJ)k~K`teK9vBi+rfqdl0k{nao+j$;`=XK4Wjvx0vi+HiokUw9Pz2i2(p!`WQ zSUZiY5xh#Yugw{Zw?Pt@Lx<-$^8PpAeDY%SC*Eu|O!1-9GV?x~%S`zOdfok{WRt(3 zwyh%{8F9fvDLG&tyQM8POWombT0c6?>N^t5o3_gfUpN1?-qJfHrN2RgRc2xL!OyQ< zZ5DnsrKhx>^J-~`DaC`PWIk38q$wVBjDH{OEqw_1*2`+}O>X0+w|)|I9xzQ0WsxtY z!B?zu4SbfO>kKsL1+Db&;Cu0L*RR=iTs!t-)TNv z#3YA)n9JHPfVM-R57Fj>pv_Fs#tPbaAGm+i2HH@pxFFBA3;K4X3coF&ku#Y!7Q?3@ z8hd$+?FbRitnkx_jvk^R=>448TZri<21{%)Og|lC{a_obq=cmj~YFIQ%S!Tf5)3lX`KuB zq?a^qLGV9H@XaEYC;7_5_kFT*W&`;`Ixl7<)leV*_;a4Z+s5fCja@RwXYzgF7)>Bc zpowQtEwxE$#Z%%UDXn_Fhf`nfa8G}^!zx+(U6P}f^lPeie(ZstjgRMFSZe|g&75~O z_z%-vz9aK+jc)uv|53 zrQmlK`0XHm-@keEBV*-l+w*7c%A27^?4TLFi=d2$@U9B)%1qXg@+8f6?zaTgES2{o znE4z^7LeK2>cP39&w_zRf(O|lD*FQB$2#-qPln(pM&UE1z;_r%+J)ur)|0r}sm+o_ z`#TMG`KuOonEIb8AQP1mWUh$u_!<5>_uVQjcvrw0_fsE~g$2mZSHOcqhlWa4z`ua+ z7HF1oM(Epq_-{ifqZ0LJ@Xxhadq*@`4LpA~x-+u=CeV3#FgE8v@S$=x%e0P}(mjBC z3UpWv{<>L8zXF_Ka|0geU#BFEys_<}4#FRC;E^}r7x?F^Tb{&s!f$<6YsWrm+6b)$ zsf#oph0o!jJj2`k9pn#Czu7S5$?7dxq2*x?Uk9H*tgV-L`l7I(k7(Cgw^)~vXugjG zelx{)WTjj5H*bXeQM>LU`lwrvY?77MX4x^~qdv?7EbtM@SDg!5{P+NkL1c&Y_UuLv zYkzjDbJRwC?q4>Kc2)mF$v%1ZmY?L$F8Rq4{3>RbDCu)Dx~gZF^d0cDR-vsUKh_yx zrDa*HaV>D~0!*jm7|8?usjk)T*u16qIV_3%C&E9IWWs>=dF}%U8O%nT*msfqk1QUq z^yEtcnzvNX=b&VUirw1$+DZKhM!Nl6pD*g!XHy&30``BvpL0vX9zRHZhLY&3jK`Vg z-%(#V)r)An54N%ddbJF{;R82^_rbSc0C?G^&rZqOJTB?Eet*^8SGXmN44;0JYQ9hFU+bw(-6#=&c8OTL8UPn%0fl!E;xheOEtd z(vW8fi2gxm!g;aOkIm;pn@5*%So?1dHzO8X1AX*r?Le_+7jgi<4>ll|Y+iouE)Vn_ zI`EVP+4<27Zc`g2=mLC*Lh2W%zNBUwYotCenr}inNpn&7d^lW%&n0WVoP+yv1fTpO zf?t@$A{4`HFwlSXT;8^Zg-?=LZmx(f;{kg$N3me@iguuIYeBP7xQE3 zJ7`fn{;fRrttS()H*|#7EBfW^ek(A8RwFtcWPr!kErauEZ{RH=k{8^H>8p}jkJ7AEtBJj+Ca4a0!`R0GVw-{TsmNI@F(HvVYcKKVg7NHU;Tup5-RMA-|-Q z#|xspsY6?|+bv)OFW%A?%2szAUFRMhy1!wxDsSel1)zi13R+v)8OVQa6JoU<*v6Oh zSzzNDDbS9%sCz6rJ}y1cuM+D72p@&;`Mi46W+&TV+a>5WvE5mSw(pt(9^*bjaaX2> zGh(wB``*4aQn$`KIv;81z5(|kv_Y=@ETBTRXxh^*VJji_m zJl;h#qhB@UhE5=!JB~Jy<}bzi0Vn$fgo9N=9D}QO z?A8cudjtLk3(-jYPHm5UeIKpT~!|nF-!{jIwY!IInAP zekRA@ym2ux99oxUj4uh^#?y!?4`v*GTjR?)(o4V}HCebGB^zY*S-u9%mr(}Z!?Eu! ziblH!!9N;j-iY#lBR9VlZIhn;u1$R>dQ{pnl+!sg+RRFa*0R!Jnk!8Hb`1+c{{urG zks~yxZ8&NUM%S}&^kC9xbb0b<)Fd@U+wfc?mqzbEni@Is_FNV@d%_ZoK4YeSJYLU7 zAtz`Di-AYaMl&m-F>i`FXr9_L(&)0z155eb_1VDnBPQ1EfWNj8dQ9^JNssmPD*TIm z>)a&+H5CyzV&9^gjkftKQ3m+WYDo^h6tpPz^i>6hWd6RsE^?$Y?6Cg4N*`^E>*Kl#$UIP%x?qG=K@ z?ssn?Ui@O-mGPqg&A)&bN#MnxbIYH``zI%^yHwce9ZtmRWUI(d-U8bDHQ$SD-V8q8 zQxRD@+I*D!o@P1i%yy*n%M}s$xg&VT$8@G^{h6OYTS!VY_9 zv&@uvjBI}Ouqh>^l!$pHu2-a#d>Lc2d)I)8(9tE8#LhS0lq8oo^bWz9&t+(;cvAHy#JfxNy*CR z+7j;Cw}4f{{c?0p)##jx^wT)rsi8aIqZ@F4r`Le{9a^920_8tD8oo4r7mcyHftL;V z--c_aMsI)CG>-p5jovA7^d17v$90Z`0`R zPe6CFTV0o+dm_IJ{+8#MEY|Wa1K#9AkdA*Cc;@o<2{5vR-|2?m>4(kb?<{-{TK68A z)@tQ=iax+&@x{Bj9Z_ivDt)`m_*mCBakY|vU}1}C9G&_In&s^E3&zB}o5|~@4RPzN zm|dF+*G~c02z=Qq#`i<4=3CdY_OiLI^?wPzky&aaK9-zn{0{B4ht{&bt>JuL#~HSY z=EjS)=h>m6RMt*&A)FJ+bgUn_sL|+B>q7pV@=$jwukwm`QO2V)}Z-#1y|Nm9QU4EMmP$jWpO;U2+PX)g2XH*_I<0%mIIPdJ zc1U9FWjAW$=fV%aNg5<;ci0reL(q96rs2KQyqsBJwD$UtbIV zWx3|Rm?ru!VvH)wbLd*pjspL{H&KuCv<^FN{bPK6zdS{KwCr=!g7EunX` zM#gT2UyE4YtEGK?7W|+&u%TJfsxm2c9nD$u&gm_ov<+wnJV>{CKWn5hW6#*J61wk= zMr++-{AvBdbbp68tG5L9x1<}Y6CB6EU*o2%(v%=KAAS?*k*S@<3r8wY>adDL(N@Hv?>x@<$z{!)L7Hg4P?H4ag`^q|^iZDEHO%y{tV zLm4dasfKmW65gqV_qAxVQd8|7d|TPD>Dl#w+nmQ5X$?j59M;%Head#0=C1me61P?1 z`=*i2{D8g=LSaSOb7HaMzrQPDM`K?V&4FqDLQ;YE3&{n|vQ*k!EtM8&F~Mul@9Svn zGAR1o>yLdT36<=!1@dp+0e53*$u@k{2z$(yi3&Z zNmI(ob$GT)S1oB+!ooDRKSLv!=L80a5{`eIq$5{vxX$8l@|;}{eCPxpg{hw7iCP6 zlR}NoAA_8HAc345y%^nD@K?&oOifN^`~`9%WQ2{&$SF-m)*EEx8=8#x-u0QL<=t`C$BRhC(UtkviW_MljiqHPF5M@NvSrk@Afm z%1DVpMwVK%b(e2VmXSke4KiY|CDNJ6wnR!GGe6L5iDKSg>TCgRWL8V-&KX^w6h48o zN35TB?ib_b%5}7EZ_W~$e;A`(g19yTE_DW6(l3FFj)N6?Q#M25^9gAUp+6;e*)aJ{3t5=f#WTnk?17`KRO0hW zD2>;iyUZ$yG&dQ_J3lJQt0jDIP{VG-X=OpF@l+D4_2E}GA8{d#wJw%;A9mR)sc|=8 zmhF)mX&sO?h4!@TEp_6V)}Xkl4>E;CXg%|dfLVnrWZuz5{rNYrFwJKsJc{X>BI3o> zzZCNz-83iikl3Sag(TL4tp2T-yUf2G7U|aEn;Z7W26$8!t;MRWmsWBA68f!}S#5)v zebha_ucOPviVGxRFS~#Xjpdg;rPblE#QXBg{vdJtTsAB<(mI$vr294R6ZTaf#dTO) z6FgqmrzX~QyT&h?k7B(crU&}E4k>M`OES#2xfK8A%a`ZhOEY5p`_ljN?|+_uXh)3v z>oV}~D;odmb+7#m-;7rLsd^7SdJ;uNJg!}o<>Pp=Y(|A}39xC$>P2%AnuaJi?X*@hKiHE@D zsfqQy6c7I#{++)9{+-K>@$ZQX|I5GsDgMRJALB6w+G3kUTDAHQz&VrEZqJ18{`aA0 ztun50{Q}*Hd**5W?T1aQJx?FkPGap>Y4^MEp89jh@3u;_xxZa5@wqe{hTX!~lRFyl z-A!vbXf2mCV~H2(Xx}56+r-!SKt9glp7PPYA67hj@x38GxnNZDw`V44aabz+8o9i* zFNGCt0NkPFv=*E-(VTpzm6iI_%{5)Lx7Um$US5|)@OA@Z#a@e;59zl^+&@yx@Hv*V z(gn!-DbVKREMIjO^&i($|FLb|9zH%N@V-`~`81}b0UaqlVg}po@Jm7xD;fqaN)m8y zC@9%iFY&#s_E{j`(|y&{7p&NQ)x)<^|4l*3dWs2()$n=5NZx8S+-bS$KEzrp3#F`; zBzJ2cqrI#g9tk+|{uuZ=@jf2)c^iDZ9`4ggS$6X2sLuCPuz-M*<)OY+g0m2Q73W8) ziRX7)(esu5-bs*tx^}&A30TJRS%UIef;_oQ94+QZP`=6VEb* zVtV%(Ii`1hOHA*cmoKe%i_Gtz-rbDu+eC14rLkJqCnO%LMp81*Q=e3Rjwu1E3XpSS#p z?}rugA{N(msV@V*?QiCr2n-tTf*UT|py6-Z&bkg+x=~9E%m#AoMm>+G}deS8m z*QKyc=u(qc(T5<28=@@(nUbf`04hwLms-&c(5kd5n5^JR2s+l9Zf?J^0S`}Zr< zxldk*>D&&>mFe8w7bfc5)2~e)qbB*@rpf)bIJu|iEB(EbApLahdf^hVjOEAc-8M~c z;`12wF1~z|;oT&?)ApD4zBXC!yq9UiJ|@TXZivP7F4>@W?b4<7F6DjHyH=C7SEAO2 zx$XaV>)qRNdRHW68}u$~T&CZAJGyfdt~5_1rcc>ipSD;orAt{{m-znkZ^v}Weo0*t zvW3Nu$xE0eGL|2&OItKuh|goxrTFqq zhIgb(@$+^`hsMVmtP{r?Hn*%EJuk8D?j$wRjq92ZsbT6jt&YmeEBKAa`PkX`jQ~zs2bu3Ptutw;w#S^km zcxL>~@r>^q`;3r=sb-Evw(F2fWjnYz$@hm<=$^fC*dDBja5? zV6I(b4Op~q!zLv(*Ie0}k2IgmSNUA8b9NT~IO_C?>$z=<^v{L9lAgjAk)G1L3D~Zp zdhoCAYBh2QdOA+4If7QSwo%Ws-H`U1NW1Q8nnTuG+T6n$^>nn3eI4p&m1c7K(|7ND zt$*@S#5=Utk}UcsL9=DerP6rb_0xRS>yxBXYt!ruJ@2r|7FtiXUXu;CWb5~8GC_Og z8rQe*{zgV;%uZY{b6NR-%$_7Wd^!0*x+|5BQ)mA#kq=u;K9*lbKFUcxbXr|TKGObH z^6_QX^uEYP+_;p{#vVRPdy}gXZnyZJwsaQML_Vx-S-pk$&|;vs&IcJZzK7^gAqD(S z*6xxu+b2t%LgoBH4U}{9R`oeEqMSBO27H>u!N#>05 z?2uTK5&zBAeBPF!4hIsfb4j>=L1-Oty}ic|WlBuBc^o$x=L1UZNA_ze~$6Xomcgd9)=9 zaOU%VvGL0g&`mtIdxd#A3>v?a1#Y{}p*3 zWureXfWFb3_w%N#ezJeGM-i7T*dM-sBy_5r&WAx7vR}`=72WwLWSisBG&6(pQhR(X zpUy(h^&IDO*)u~lcb3*rei<@D@{fB@!C8JbL)bbexn`LB=W4NEp7&}ouc~anSO-MU zwj{n+*5L-o0c>n3rRC$$nhq0g|D6#VGx+8iF=mixEx}V;15Z7Hzqg-w>WQh=6-*^V z4gV`cf3^&jQdV-TU46d0A7n%dnfH59GrJ!q$^~kz9cewGF0;a<$Im3qK^I{iC)5 zu@ljX@bgypHsQXBw;_-9mg2rtZ!`2d%s15G<jZB zaV0$Wd;xq1Z+YL^Ky)Y7Z#*shd7c(mN=Ip2gVCMvIXwO=j6<#%f3#!q_`i8Z;NNwH z_T{m`1Tc4C1 zpglwyveX?ZR^O3@c`3Un-u{7P4ftQ{Ev0r`&pTC~1zMheK_2gUwRDKFVt;x}=1Nab zo?oNmZG#_BwMPv)CF=<7L0ws|mXf|!GNFrAEHI#U zDl3cdXV6kY+hAwn98j+$zBfp*^?LsUX7AVHsL z9Gz<8=tSq2=yalWiI=0(UeIZ`B%+!P;ctbqdHSQs<&Q`tt?iL zr3vbhXdfxP4t@(_KCKRmEU`M|pv=)|XEpbsXzz@M-n$IZ)h6G?2jiEbZI-#rIdo_Yj`EpVfF=Vps=c z;CE3XeosZCmuAIiMC%*}K_7jNAnm6SU)L+;cZmUisE>n_E)(z1v4W@tCF!b8+A z$8C>ogwG{`U7_9EOl!=3GhM7PTWVsF(E}x|`Z}|yoIB!!e$E6A zeY93MySF4>*ZQ>e#04hSP3H@~?G$rn_rSMvnZ#POebc$E7HiRhtZ_fh;YqMIxzDgR znP3eh`>KyS6R)Kv-R;nD%zIayeMZld*RUnt?<(;=u!2^!-%h4UoEI4Ztu7d7^{_^( zOw@<=hW)HYt7XYbYndr$q*tTYyRc)l*4lNAx@D?0*i|O62D{W5n*&XBV;bEWQ5K7% z+ZC~5yp09uY|P=uEy1A^xE`eYq~HmY6ga+ILi;4~ zbC+#z&{;}-mo4{dL%F|sAIkmR>l4eJO0Pz>ea2`n8d_g|0kRV@Swioal0wUpS$7X` zBOm#tBys)^&2inB#JX$oqcek{%e5D#vG&(YGeZvW`Bl>l+7p)cUkW{z1ia}SHQ++~ z=4!uriaf>~62wpkb2iilO=J362 zfIEoiBY1}Y6Q(r^K54WVGG0n~XkKGKzEzsV-r{}JVsvkMJ+^K#kG;HD=s04a zV@DhvzhR(b+hyqZTcRWFj{{h=M~;z>UyP%pZ!#U5bUHQ}==fO!9k00}I!^A#q`lL$ zeUUsh66>iqz|0tjIk7LX)5aS6E{Z*2=bno0q%nT6=T~NEC5!CrKE?*5=C0l=)#Yd8(742@MAw!&P?3NrWy%}uc-g*=EADcWb zNOjivq3@+fW5(~M#`r=!p>q$`RU@7nTkS7snw?QKrue(Gv)+vScswfNbT9np&Lqa? zxYGN5!_l4O6K1ijR(gIQOYCt#d&2WNXtbv>Yw}sg%i4U^gtBOFJDpDjeBU;!&1uob z7vlE*roA$~`7EsSPRH|>X<|QdZSSq|^ONG^_&o6X4!+NqwofQyXXfRq@6h_)XAJbY z2XaUI9XiM_h5jR56U|c?27OmB)?eAsu*E%}ZK1gXd1iLFB^vF4Zt-+`QiXmIoNB;P z&6CfP0**Z@ot?$hCR$J9!Sxh)MrW$n@H~R+u*vRehTM=0ZC|8r88KNs4YWrB&1+bw zZt-8FbNke$lfbDGv1ow?gZ5!40E|>TQ=TCXCzZqTb2wsO1{y;mI9|XZ{G9XH7ALdO z85{DE?k5Eioj<$~c2E^-;p^MS(Lxyt*FR?#f_^DxP7wGI< z_zB<(>7K5Kq=Te?q=yC2LE6{-A;yZY*Y@$CIOo>X*uJZ@pO_E6#PQ*&_SX|wCj4N)`LJ78&4Bzb-S4F5`G;d&6#(#on+}*$5rK6%s2Rs-gJTR6uR{5PbR*@Bxma z?H}C80?&&xuN~91a&rvj_KoOv^59hcY@Vug!6R?ciNjL z3-}Mqtefg~(qxT0YuDPpFUimM=BF`4Wy|I*&hx^4i+ztAv_}^|gSFvn>gXGE&V?-E zM3J2=~(BztY4VEix_QZ3KChxb{^ZV$|(YXCc z&(T?=2DtB?6!v+87?kLLnli+3tt*Edd-yMc@=HAUQePK)%Dsr{9OA&I&=2M?o^z$|sZ9G4 zlU*%?PkDT;@U01-&%mw@Judo{PueH$Yh*l+ir`b9W;ELAABrCHQy(INHGXcx>onIu zJ1dpqx6pib%Yu38mP(7X$_W{%f_!*!e_PA;nGLw7cV684BxNPq)gs7YVFmnvii^=6 zW4p=QjF$4S7q)_QgZ8V@Wq9RD(v7_tdK-EyD#qEsgCk}Ze-5*;pXm8<8%g{1P`gUD zahm~lp$3~|>@L9G$YSx!AlhJ}1>d!&~w1W&1h{D+nclh z>cH-+Rrm(xMmozeWwv^B$i@QJrVU%R)11rgYQ)j7p@jPI9PkrKE(XD$gR@yX!FSxi zYI-k|->T)e8uCA*<)?j;eX^C)c@yZ2`0H@nyV0IY@jSkd>Qd(jMl?G!3Oc?E+MGoU zI0`xbJ$_->jYXjA%b+X8Q-2&5e$S=OgnNe0EMvYMiuIL_W|K0qU5nFpYj#)6)0`1{ z{CClvOUI%U(ssQUofOBwKJ)WJNtdl`Yqh<3)~=JtKb*L4|*dUu9X=$HHWA|0szL!I`Lo=;^u+F*wUK3u+&0-xo#TI%@ z@d?R`tp2$_fyo3 zzO_S!?oMWh=?o=RVx>f1qNh!=wVs>~AL4wpXTUTo^kv##Jpu0uL5J_#VmAGL+M_~` zZ=~5v^!O&p7-LCumKft6I^S18JI=uS4O)ErD&+43 z-v!An#o{|r$IbX<%B%-|;Zr`2yMyDN1iYJUF+1TIm*)eMbcU}hfg z>y#YpeY6G>?-5&3fAo=|6xN+(Q6oLL?#pIps4v`U5qpWz+E#ZtJA6U#>x_1;RK~|> zJOwiJ*(4TmSP*CDv&I(4d)0mxSWqtWxnX61QNY_^`^X+D3-L&mjpcqeL!7DD2f3yF zj}KYJd7VDQ1KYKG+WWRjyQjU*tlIrKQ?@71g1V&nstfU>c_e+fzLX~XRWGia@S}L6 z64zS%NKgE@wx@~xfe$4a%1bhomt-g}DOMis>D-m>tL{!0`}FtW`ck@>qtFGI-D#rF zrxNdK@uPkP|M>Z$;=CU4*Tdi=?3T-3{%i(~$09BSed5zmTTW>{2fBVwJ1;cR*g$}> z-ml{KHT=Gg-y`_#z^@IzZkhG=;79U;c5*MpfqHuwD1aZ6w({f84pN#(nLL{sh6a(Vq5-ueu8G8YJsV zW#OR?MY6ph%F*|IO+4>ul=nB9Lhy^|ocSYeT+bQW_0PfvABEkcGc|H(Z9;Z$3GX|E zd`D&0cp;~A=ACBVHaQfN7$3I+MjM@9_13Wx*vwKoujo}>Mf;rr0;~YS;T^k=Rp@bcXq{tQjG_A0mdruxBGKi{fu=df8U34T_&1O#fqFh z)@aVH;(JN2lvyFww+{Iz4du-<(2vTTiiXBADBU4Cn@7Z`lfLi8x4ZD|80g~G-V;5h znhQ1Y{Lc4w(Ake`WIk@Uqe9!$Sg{`HD8qX?+os_2@~)xjt`N<`D8RETm9^$U-mXp+ zwwT(0J5t5j8pgOUc8-T0pO5>Vp3Qbv*p(#q{T>GWPbjf=rTxD}Y+gh21f7V(p$jdD zN4C1e9_6nfuJGe|nC9>V`JOR*mxfh3ucVvi?o@&gZTSA`Hiqz03Q|9c9y=3`)c(Bv zmGWS|7PmjAwMP#4Yx|W6d#xXtfqGH=PJ1P8otE87Fi-IK!NJ?F8OVz^gYPLYG+o$- zO;0g?h7Ro$eG<==e=mh;O_aX(CE0_Ii9IqsXQ`h9K4>(B$2cMS{$2|2*LRR_YNfLW z$?l+i^Hcr4s*VK^x7)&cD4wshuAxCzfMnZ-H2XxF+Y#Oh&`(|0= zvbHxxKO1L%T>WD9n`8(u`2K79K2v`O*=lpe&efx{U{W-{?*rmY;2!;a7~VE~i$#22 zV|*?HmA4~B$owNImpUiLQ2vfs`NZF!Pf_;WiOPNyW$%cUy-_Q>F+tf=_)j6SFDD@r zBvaI7OUg0u9a4_)b2h=>N(I{mzW~nOM=UWg)L*%gd1Noa|^F()y9kp)AB_h$WOz ziN=5UzCBduLXF=`glzNvun(jd&LWKSBNFwWH65e=v#IDrec_G}t$Xj%=(OI_+Cls8 zPwYoa;eCJ})cawJt<^8_bC@{o>hSK5cC9bYB4|f&hd?{!MwV&2k<}#Xmm_$~kax94 z$8wF1{r1Up{9`1#GoFsGBVBt^PU~w4=t%u7Mmiq13px(iV|4t3{m-N0HOD6RLvlM3 zP$QYNpDx)D$WAiv@An;<%4TeXE@r`IY=+GcvXd41nqBn4!uRN2!)->EM~Cw&XkfG* z8=Xem;RxmBi@F5?!;3mAupNwv^_}$nal3v#Q=L`qR_s|;h{T09+9Gn_vTM@PAbLbbUrG{#Ww(ZGhoAK z?e1F>i=!xpqJAw(N3h4oM-uLTt?$(>&L4V48%N8r3%?_o@xA-QrJUyR=TuD|XE=}8 zr7QpD(xD_)M0+z)EF;c!@AOmu1o;Svm%>4r74uR&=l0lm-Ku!} z)Zam|lAm+}aTC=|voXA_qu7byv+^Xq_KnVEru7B<-JYbtLo(z>EAJ5KL2#tOl)!de zUG*t}hogLaYOj=+D&9${fv?cJq*xxBFW!}JDfQb_zSophVx{r6;VKi^48{N}m&W$! zEE;;hcH^f8VtV-8_&J%!zakf`F$sK>a&hK8)6T4uJBO%EfAvbCJUL=c@dY8g`b7b44m6eEt(3CtFJAxUc2wB1?yI;1kzC zXW?%S&ou=rQ6JhjYxr?f!HJD5aQt!jukd3BZe@Wc(%~GwCa{qD(sesPFl8p{8@H~` z^DCD)w{w7eUQmQ(b9OYX3)1vQHpgljR?N>nG@7Mb0bUio)IQ~7cxPLw3 ze$oeud94fkJ3NU0AJWQck;U2P1lOyr@^vl(SGPM~6p!r)6m>#c_`;l9B^- z?(8%=|FvnuXtLFJu~bm8h&fkV^u`&8<$W95x4{Cw~k zOXz%B(#arTyf8m`SLJK0G?mX)72imvsZXGC2Fsx5B*Qm7&uZlP4BuDw5kCI9p5OcV zm{&7w$ac27+Krz}^3OEVh0DO6m<({fhnbM6{cPg<=S3f)alD1UueSsyJh#N2C&$C4 zP*0|?$In<<`##cP+V8pL8t9uNgiNRDJWhW;wIjk;IJDKq&;6j7ocfpdAL(dcx}opO1^>zC zX&ji;pFsBE?&+*u=~^CMfwTpDZL9OXDrx)7<|MY5c)n2krmMu>v66F%(q-avifMlF3!q8m8EbgJWc9@RFPz?ADi6o%qs`Ybi@t_FLs?B) zS&F7Jw)CVx<=AS!I%f4B()!xrn|LPi7xpYs`x-w_rOYb)=~-<29LI2-RUhZS;`1QG zi!?Y*1~|7*31{*;+Y7LNLo%IpsYVdfb-x1orI^%6kgsb>c_C;~BdxGScP%3OgJ-K6 zxm~;eFs{d>)R8?FR@)_I_h*hRZ-X43v8ui!?v}O=tCaaKHnZ=@oznJ>eRAf=T<}#! z3?#;UvqLZC2|u3NzF#P;ozAx1oI!mkh~XvCKhSST^BmGRl3DlHre(IK@cG}4&{wBr zwNgCxrfFKJOPV(BhY?;w@WWtRyVoObI`t(s+AJx&FP`!ap^e{;df8xWSHR9P-nOI8 zi(cqhiMsVmEJEq%JEf~anv>MOaqXcFJHGeju>jg){(XU#meLU{D_~IC1xQz^rLkK? z8b8uhN(zS+T-4X0r?FdEMC-Sh^8E8l&GV*l8ya(`b4%B2XEW2eoxcM=Z$r5a8b2Gr z&#wW8I~V;*@H2@WE=y%k)#AA_iPc6B%U%HeM?u?Nuxsu4>@dwqrExYtw<|M7;49Z! zk@s7$C*HN?k)_D1x0}>v(%J$lbAcqvqBT@Dq^JJz4l{ z$-L$_(pZUZZ^^C=z}|8{NV9E2G{+i#6ZuJ%nvI*yZCs2mbsD|-zMTr6f5+`FwcFIT z)45BEiv<-$;AWhsGG1=796Ww-V!8b6&TC?R8kIeAk;)eRwH$VfEx>)}GiKi2#LW}n zb$ms{W85eHbyV!nGjYC*NdM4#6TcblH9`hU{`-izk(ws)#{nBdo)yeaa1j_~IjWu}^Lydh>GwXsrnG@%*ikO4zDoyI7l)q>UHpaLy!v zW311%RMwuEq7t6n@i7zWB+Y-x*ZlTG^Hk|vV!iGA>ENV!s-+X>sScO8vsj6D@;uej z3vz7yx@$1;Jk{~@*YkLPW;d1f!90Er`)Q@1JY30?;yU)Bm+FwG2(r}6(w4a-R@{sC z3fo&b>&RY^P8P$zZ9@KRl=H@Pw3o>&P-yBc{S@rrDcG()=*RY}SdHzs z4O?Ddxy3&~yVEW8mc9;~x&dj3hMhlVjYG0?$%PF6OuDDOLmJ!a{Go_l7a~s~@=*FA zd?Va81D|~rtg#;U`IJcs`75+Dg64~PX8r?g75TvaFUaD(Hvi23Ptqzr?szfw-v39o zs!CsrMg6prIG5?GD6iXtDbmwoR++{RxsEO#7VD3-@e2oSs`n6!YcpI>o&zZ{h&>5SR+FbY{6Dz#N zpg*5uY#C%NgZM-6cS=g}mBHW3$NH}@Z3gXA^AYIQ+otT5Q_X*h&j;U(j~gW%N1Q_c zsPBq=2s-a`v!;I|5^Mjp%*S2A-v%u|BQeJ}$R;Mxzq{a*e+&6(%zCLwZF1WgpKC!d zGv}*Y$mjKg2ee1v2LVe(d(j15gS~Ei7Bc7kAzKxswP})dU5i*t#`960WB1RxkML-5 zAoe)G8V^px^(1RtL+b?~hxbz3e!R1~S+=e}o`P>%XEZ*Zifd?wNV9dus!vk$cDw;>q+%dm#F1`vr|B{ttWa9v@Y8u8*%hlgnI^K<*)^L*SsvAbNlV5_`!Gs13x{5~9`id`pmH zog{kBiJ&DaCO|I$czyaQUgJm=O4g{MWp)7Ol1?#JVtb1lXh(LCmyW9*+C_xFdx=iD74 ze9o=HIhP%A&i!bdb8c+=jF#>a_0wqocOBO18pXeC)l`lL+xwQq)Y&`mdq4KO?ro7d z>|4-|CslZ-)OdEs(xZLg5Sy_!yY@+cqBv=fZ`&Yqrn%EK;s0|;`sBC+k>wsY$~6fu z%f!l;^w)^;!e|##qc@swKNMNcXje3a%SE66=Uk(FJKa0eh2QYOa5p-X-xTfC>A&bo6FJe&bXm@QZCqgji38$D(!dg*EeMkU%P2P-WO|$-btDI#>w>Sy7!wy1=A)= zo$`Q1%q2W#{#E)DZXERu`1WE%KRrg@3DPDx%k)unXBfUdd|vifWsgdIV7F2JHxX^z z@pq{&+(@0XFb9Iv^qCE1}UzHyg?N1+yXqRnXqGZ7hw!KRCeB7ET?>J~{ zB=1br-PVRkpQ;sT;{;l$zUF%&ojpA6X-=7uSjF!2USzf@#hzpUKpN#|#@cSAmj&@-YURcFAn+ z1wPlh=)dW3{Lo@)r5?Y-k~Me=bEgjc7Mwv{s9Rbi>U(gGbS4OIX_1g|J8LYW!%aJYK?-wh7eJ@Ggh;TD0RPoN52W zdommCH;lP)UN(DEC2?)3W~=2L#=wG}lBESox7{h_4N;)%_9Oir|9M`y z=92dzgm1YuT&LQSQ6cen9KG3pcfFHF);lR;y>Z5T+%P{>_0}7>-o4-_ zAg4#JcLUe$no;W=?uYB$Y^-;Ac)c4+F0kJ7qt?4RUadD{JehOjydu{-FpcpwA%CJ@ z+F5s@-@s*}fqk(~Ki1EUIt%+14)kB&Q!)d;Yu+(&B54cPKL3O$N#k6`!HGNrC#a8P zpGi?Tkrc*>h7}Hl6Vpyd;zZJga6;DcSd{J2lm^$53*pAc>8I)2HUu1?UGiCLobQCP zy^ua}%Z2i71Ma+31l-90?quES6kOUH<<5;sQ++)!=`*^9^ggqU`bm@{ZP;RKeK7Q>D#Pw)CrkR%6?vlkYCizK^%7_``*Ml&IqEejx>oWnubfYu*LlCT#Fff>^`^?gS$G-KYF=v)s2Ce!^vvU(!n$cvpM&|sh zQD^YdA{D!UdGtWX2ak!-yuqR<-oUQeTWc9#7Uc(V#+0JYI`Giao`g7tF)svO<>TBe z$GPdzvgJ8hh;uSm$-HvBJAtFj?-vbISB4tT!ykqB_)iTuGj||=XBhSeu5J~3KEv=| zx$h%I+gO(OZKs8@^>!HdEUeS|k=mb|BHF+DFD9+}-N&5c(fV5zr%KL2Q+6)Y$I7++ zh2GFfp6E(Fh%>S~gK;;+w<2nKWp!%+#|qK zlisua>}?h=Y0o6!MbmfmA<8ba4RP7Tlv!a(l@&ECT(e1yL4z_rU-VTJlBW&Y8U>FU~kOu_&BkeV~?PATiS&{hj^*?4c>wQZ%o@gk9S zSC$C6>XG5e`6NPS3t!`(xvCOv_jfJO+2w66sn4O{~KkmO1r**m44Da?Ji9lTnCzA zyHDFvfVN*jKU-6-k#X(k$k_M5{k%kp`}Aq&9fOnyEMgbGW#C)jw2a?DyG!4;NjTH+ z%r;oQ8Mw+iT%(@zp>FE(9yu32<6_0ch=kuUtoKxl=$1N{aO#f)Oje)#aUaVt>K4jDj(OBpIWD-+>bq# z+ISVtIq=3^7Mp*^c?I`40|zI{`{uE>$C3`9AI86NppPlo8?_ks!n}BIK5bz&*SK*k z@!_Sz==-oH@6F|SIp@qZ@!o8-g)uGe0<5bmv$t^m`%o6+Tf86Rn-dBZnRpQ^-sHIB zDvKW1_Ft*IK-jz|%3-2>FsB$Ud}Rcp3Yu)uIP$m2cmp2+f!>&~lkH+ZNPJ(D0C+3@qu1a$z^`_%w~Y0nT{vM< zt3z`5FU0pl>+d>b^7|7#-b!dPC$QotHHHRtm)jCvmzuOZr=g)p?tN|yh%vSev1 zzhI*9HbK_DUFmCmb2MW<5q8Mb@oh!_wBaB;L9=oq=^FE#OgH?UBk6_gZ=0R}H)wn9 zUiQVkxY+1R##D*&M>hM2wr#o4dC1r&koTnS#G*M&9|gDUH_rk2#_C=$1-t^P)^CGlnM1*IjYF*;=0zKokIpNY zrfXwiYWjG~yBis|B{9N=e0)D3+23BHzdi|93CAYR^ZbZkYD9k-Mt|vU`j#Y^{q-e| zvY{W(Z$_=3Q}vhU9O)0ZSNXe7)8DoW^*8$bRWNmq=)o0ionH3agMJ@EzvOd@M)f-q zQ$Wh<^mR!z``(*q_!6jZX8#`-7mW813f|7q_}iz(qC>u2XN={B7-La)1_~cXjc3`& zc-$skitUH<3HR5sq|xJBlQgownk-}Y*Nx}@_xD%2xxdQ(H}+QyeAuhzcxq$~k`z8L zCYynWg)#7uc|9>+hMn2Mzwg-fQkN#;(9h{F1nsY{ z7+Q$4m-1-W1QE z>Sg%sdVS7Nce*b5LFT;Y_#Pcrdb8*l>mOs!9^7>#)K*JBJ;TnoAWn1_m@%R;ZsrWg zj~8i_X($ty#^>J2T$y&uO>;dCS*N6*x=_ZZ(<0(a$7{@Q#rWoo4av9)GJX$r0_T}$L}W8dGLtxYZxO>$n|;3@YgWr;!?Kx*A7dWcSAa4sQt9j?fZfM z?i5?=PRP{s``gO9OtjsJweium9C&Sym}|KdD>ma>9d${u;wTw> zob<0Bi3w}BNSoYn4BOFhWkoExGAh5^CL`tx=R3imMT}p{*p4Ip%yi0JOVWNCWA1ewQ&u@Ub02>S|ia^^RsDL6PCk@IT2 zUvv?Mqxe4APdFws<6v@cZ$Mkb8PFBRhYre^T%>WS!tcryl$n{6N9~_Uie7bnq-?|G z9x~dOb}#pdE?bW9+rBKku8FAMqYb$-P(Q-&D2AN6!Dj5K0_>^GWy<$7KUo}n0{e^i zT#Q}66SQ{;&%Oxw9cEw9nC%i7X9-)?iQ<<$8v2bN4Y?A zLLQ`_3FPRlpxxyEb1Fv`ufSoFEv}NcnMH zO+S77T_fWnFg|dK`)%t4+Mg7}$>N0m<2^|+`P{GY1T^N!qA zqRG2U*Fvp+nL||l$s&qYST35)JJ1!DNwcM0m?ihlZ3*-h%bh(Nzc1sR0{(v^K@?p| zyU+yNyjq)>!|`s46LWZ%{{z8xCeOaom`ev}4|7zz7Hjp4-{xw;e~#~ani`j1lRm7j zgPPPsyZW^HKH893vhU;>xx$h)o9*-`cI5JGZA?hJQq^h>EJ95c4t`OC8?S>9zg(X9NBaBN?uXAEYd$N|?+W%pw zsM8MKP>A|&t+}0d>0IyTEA&+^W4(Vte_OmSw~4~EGvPa$=YVT{pu4mSiMH=h{8qB} z7AePP_#R0Uo2Q%)6}99FFKxo4oy5#=AB=yIHyo-ew9EW?W5yuc(^9&auOYtgyuMFQ8M#@Z>ZMQTXvYTbrq!{{#4BzKbraBlxnTfOaqh0_o zYObx3{nF=Vy~W;I9x+baP^jqCa#8Z^h~0|0kHWD)dyRWb`oLcbTHQBI_ygv`gN1k=QJ-pP$D#%THYIA9NXK^N9)m@VL#x0U@ zK{wb=Tpgs}4&%*r8h%WsACGOK?k@+-UjY6!E)qfVB$Ga-|LA$Wb#}y$KS(`Lp2ipu zdhjPkJcIa8+1}x^VK_|zoSHBn+egYb$@Wp$HwkkqlJhB3en~p!^L^B1pMkTZ`y9Ua zX+_8B^94K$xP-j>2@v=24*!Gnt?iON`f&vkZfh=+c|HQ*AsN%G|1$c&H&r_Gh5tBx z#;z3f{eQ_`Hr>m(Q^$^j|JtN{%D~G88K=@5UqzSI-;dw<*Qob3)Ri@84XkJXwpIQI z4GjJV_QUZV)In?BzMZPAZPEvBte)TCf4UQu9^ZHUSrxZ^w4ap0N21N%9hR<65>b8=_QVPq8ztTM`_x$RWJb%U9_hC} zI^H@M)c3b;obRU$#4~R7IVD>&P6^|CGOq~a%|o3GpNe*`(a~F zmByU@6W`M0-EO+?i^iOcb`C8(r}$enr*xm)n9~nXXQ#1Nk?U0Y!PxjnpJbiVKfyX( z8nsUIW31D~#++`8Sf`w*b;^iZr~O(v745Xk zn34?@A{^WMG?lJ9wu!QU5*ZmuRi4kg+Fa z?y?hafG1~cVa7ts1FRP(iOsA-yv|3xJM3Ciw<&nn%NU{)7;h_FpKugt z(`<)v=(e5>6_tKC+BWbY^8sM~uD&?K?|dx(#@OrIq+hBD|KE)G!yTU{8X)tX;2QkQ zp`YcN&^ExxJ0at<%#(6~jQ=h3=LPQ7f6Y7qj9D@H!!U3E!Xf3iJ43EnoUa$>QOhgp z{3^hjaX$1-*k-L zTkH2*WDbH8Kg-q6c8!W-4SN4vsO{9rFr0M!4;(lAEz+aos{d{jyjEficga|iqJ*-$ z%8M-g)T1!Y8*RGY!WnGFdgD6L7M^`G|3I%W?6E%z6`AuP411Lg&M5lo3TX9v&xXdG z$CojW=Qt0;Pi5sH<RJnR~Fomd8X8`uK=+?wkS zSw)b#gg2}i(x&yeHOB`z#;;<6r^}oHzfv(T3pt*jqOEO7>K@|c49KSGqI=&ZA{~5f zrMqVGl8Q1d)hR@YD@l}WWWQqQiOzUs-_9}6256r}ROVhR(igfWFPVF>NF8cyI@Eyo zOAD_1U~&RzC+2Z4%2S8BAKzRr>K_!RcC=HL&reWoeG}zr8@-abjxc^1ixYdywpz&t z`C3m&zE!nhe^KAKFhO)%*tXVth`P!<%-n~Xwtfb_d!|3zPG7MZdqrw3{x5w)`FxdY zSx&}-ET1SA(?-zpIgu`71%Gt)VcH089}dmE#X2W$GT*W+B8?|hSLmlXE-+)M^tkTS!)__lqrfk7ICyo|F#!2;@ za20dxFUmcV;not=I(+xpP}_?6g{=Xc8;{1*7FyJo*G*nhm-gd!JJy5k5cap*g_k&B z*K!WnthNKCnmFO!*4)nj9@Oi6ygAnsFG`kfn{Z+a>I_!VpiHBdG|2fZ^=cI~s8Qzp2Qn}yG zV810!hHRg%```E)^Y{t(aeQBk@2*{DXJC zkL$UDLGqrAw*dO#K4p!UG=#ZmZvP-mFD^c)=!NvPi;*X=&zdNCkXH_e+U8nho=`vM z-jBJvwT#wABS&yK@SQRLJ@jKVV$kMmjsuo>`b#-{I{sUFz<;9tAZYwk#Mxcyex)6- zX_YY z*q!wM&Gsbcqw%&1Pg+ljO-puq(nLwAQ^?$SHqle!+N-}uHiM#rBD^Ps)bmn~lU12X1W8}Q?6SZ5z# zk^?&PP4H>ufQ?Jbs$;CfQER`~-C7PDUs^M#I0rP!{KoN{w4XGS@Fi`!+$#CiA`|}P zFSrJ}^0BRKW6o{-twbGpFJvJ;rAOgY`T>3?PW2jjH17b6R*^=d&dO)=Tj|Hm-0#h@ zenwRN3zbwD(Rj>N{Kh;z_)nOd*_ZP3$ngCO zWKBs6@%_>fS~v-`FvlHP?sw;v95tT3u*stpV2=5z!aIO@H458cFW|CWNcpm)Nej!c z{iFkmH!gu3^SJ9GQB3?>9w!bqqYd&iGaFn>zJ$5`JLpNjcBS`WdrIr&4Ru3|w=!VF zn-0g=PCCH;0^bGQ#eSZFvH{eg+-5EYyTPwiOnfh9bYtFn! zu)muPepuRFV&2OP*w8NW1@NtQ@QREf#`jGIkJ&uD;_!eq-wk;;ty*)3{GXA! z));jYRo!>6mnffZ1>InbGtvnc=)^IUmHJcEdjb0#a;9J90sxJ`dr2QIQ}ls)uPLDU z7A@1+4EnGJ^x@yL!~6|>Y2UzD;<)G6nR{O8C6=Op=O>)!hT%|~;_*h?u#CztNO}mI z`N~UqY&F4LMre7Rmrw&>Yy`F~Kha4ID#$=fjGkFWooBbBMH~$Ts<-bSD)G5dNrs;^%}^!2k(+E*X?vJTDV9T@NS`lfN+g!i++3tHb6@(R%7x1NcJAx18Nbau z#|r`LAEk`8`53FO9BmKtrkOK2K@_s=wMLtg*P#zW*=1hp+1P)n@lA_2zAd}V>!Tgl ziR;66lcrt7k1$@%R=drr>|`pw+*BFs&Qj4=>Sos-dh~3lt;x(Ua8likaZEPGS-(?w zF-93PQRST${+g-E&yw$%Z;s`I5jmd5v!~&FNry+-wM@55yB4VjIBnRqe0dzZ7WB*e z)mZT^)E!Hif1i;@vHZO-Z4bVvavk#inRyhcb6d(Y_I#*n{qb;4MQcP(#aQ>sr;MCS zW*#V>lgv9hGor7*8+}cqAEwb46aRKH$284115~M!#Qi1Gh~xpGVgK3ypN=c&7>8HndBwY-ETs^1TFXR zES!qD_oDpLOVs=izWYC)f2{bqN^fSBa<7p)(@mbiw8eb~^I8U)%JJU&41My_>(b*y zYWmhqxy)H%=)ewz?P$~8Mm}ISbvnTh%`<3hOjuKoYy&;)2i*)z6Afm5RMJt#IU)>f zfPF9Zw&01@N}p5lm~H>1Ugt&nVS7W}D$upLGH+lD@T;b-m~@ylQ1S!xtN4i?Y|%vb zbgbP!Duj1L=Q@Qlh28g5Nb#5KgK+J=Om7H0XTWvBSbcBIc%RDuVb^UD>y-1N>8}{3 z4^g&UVVb~m_IxO8Ul*?}Azh#?Uo5-70mfpI@5QM1(RnhL8T9((#VQXypGnhR?+dlv zGFA7}*6=Fugf^^cHRv4kR&{EU=dWiBFWN-TNNvs?&klq(Apb?(w9&6C-gW1iIMruQ zpJA74QNMrFr_SzPP5s{8r+i`gysOX1oedgapc(nIadsCN`LoNXCv73k>SC;X&F;1J z=_Ly%a(s4&%Wjdfe|U_ON5f<)WoKJG?|LF_3klni-+8tr9;pvqTj>GKWe(3;nfF;N zCjE!}?$tGU=M#Lu(3dwE|6M{GyhYssN}DPE?rl?N>uCNwESH=#;s+G~SwN=0^1Ruu z^UkWU+Mx&Me1LOrJLIbSHQF-n8X8jfbG#3%cF@+b zBbVz)o|FFrIPX0uTazM!)alUP7(7k`&gJaroX)&6qW|yX@hX2!k;Yv1qkZ$%zY}VE z_#Jh}!o6C9@$IqL2Wzn2kz+i6LXC0j*~Y_v8fT1Mma$_bFZQnv=Et$SqsP^XaWOtW z`q;J5@CW-dW05i5Wm-6f@|e6}pz~)YjL!LSQsoOBvlcI%7`+yiif3yWZ!Lajl;@rG zgP&q8wuaZDgliEyr%;A*uaoWmw+pPvbgaj<#+qDqfi?NDF;>#(+E1}2dc>NT?b8%AE6u_F>x!i>3s^E*bEMuh$H#nLTi#cGRp5!cl@4PPc%K}3_jfh(#3zU% z&6;uGIN*5<peH<_IKJwj< z}r>B zCo&F%8WX!{s~l>ybx|h(`VeGWq2-p6U}AIot>EbbiOL?qmaK9i%N&`@4Svx&nqQoX za^y!BVt=p<nvW= z=4S}-<2?`W9-`qh%ZRo3b@aXOQoXA{vmKZRoRV{HjO*h4d8jeID>O$0Lp!vR=`V)u zF-FaQoI6Hy{&vp)c*Ojp%SFyVJ;wa4nExEBcLMzwXVA`2)c2-8*e>sT{Knl+9AjaL zLjGPRW1jXf-%KIrtoCJw@09X&bW9@tS<;*mZqnZ8#bUrPAxRq*Qr{J6(uPOCGa zqUWdTU3Sps8Gud5;*_{Xdob%ZhgVO|Ze6BjAK;!Vo2+6)$UF6j_Mb7^Ut=?D&Q#lh z|=dzT4!zrmUMnn_ZD%@+$9sEU%K~USJiQ8IPbK2Cs5SD94ni#zdG^ z-KQVkK81XO<~8F9MUVT10V&s27AU{cLnoJ5B&|5P#M%`CtqV=lO1}2Oe~(U-zW+a@ z6VirP^WGbhGIJ1f^j`54??#9}(fM)1w&JI8E?Rc)CAEgMk7`a#~@VmzFC#Z>#CwnZAcivNXYLW7VYeS0i2ilq< z{ghlUr^tICsjnzY_PSn6sVAMbEC1@pgqG}0FrW7($yo66c}UuO~LMty_q9BH2`%cY4~+alT^zn2c2 z9Z$Dp=3I`Y=Oyjgbc>AT>mz;;AAaeV_OctCfWHU0)G=QSb);#*0(|dyRt!0`^aCAP zkg;o46a&_aJz1id>)7&*IIjn|;?(R194PClsbSvp#mwD7U$8#W z@Gco;-a@-?qR#&5`l^2LJvH+$Z>^}gtvG)f<0oA-JAaudAztyJ&X# zGL`er6K|2_@*~QrGLvW5Xx3Dgy8`vtcZ$@-C$*;B8b>>))CY|IAN?p)gmw0w0v$T( zjP@Hc>0Cta$_bXPxfh8gQnw4bx5S9oG@ZV^>CD?I+_r0|_tE{}sq0MJZu(A%Ynl#q ze5m;SlQ`2)fqt=$Rj|>sExYaJr?>xWwP}S?aJJrw6{%H@n$lw5yAd+gBG4x z=yzjJ^WJ1H&fCa*O`V3%4)Zld`-{|rf4cE(h&HN{w))W4Ld_C6-A7T*HD z*(Ys0d2idiNaYOQbgdq|nD?pZ&xbMdH*E{4Q{M_&x|6XI&a1h5&WGn7P<~31rpw%c zhMsdd+SrNuo30hXn)3$jJ|Cvt?B|JhWSqwlpN2>sg#AsPm81MI9&1kXQ18e79!tj= zXu{e98HvvYWfyzpShPuA&!wX4fs>)OW9l9)ZTWn)*Lkna^=MAZFNu!rW%f1yq@S@9}OwLqw(%*XYE$^wd7guHew29q=`a~BWq2bjOp%7XgYMmYW;BM{mw1+n!9(G zY8iF9!-(siX~cC0UF@*f>U6t77yA@{+Vpv`gmkgV23grCBlV{V!rutm-I$C2SBVCk zKmJD0@Ww3V|JQ-BFqgw98f%qyM$*S(YrH7DOP&vzBj>}Vm<#VxR~l{8=0J-BuQXXN z>7NXGY+)P$y(9p-J44e;zz@`w%h<@yidxLYiNDT8wZ(PxWz#O1-MPrkb0W2l@;zv9 zK4>uIyaHLSrnq$2TF;nqor?;JmjeboA5t-HmZ?VnraTB4*uS6gXJy{kMSfeNyz5M3 zyxwohIb@H_;nb7rj7u!b^O6>RAMgHv|9`^zcg{}OGMH>@t;N`Dc@K!Wa8B5Jb=0+g z5#!nuA6Gx0{NbWICv|uxMs6%RkCBL;3xXeQPnN0nlC2z&~QnDR?Gst=ujO z2xrC>CEe#-Zl5i@2kpZavW0LW{qAb;tZJDqRuN8K!|x|q`N&lA&SvYA zvG1VA`eA5pGsg{mP(QR<-COo6+EsgrSYq4jZnfX4mjM52i9@f@#(jbj-{SS!RcnVK(4!6sCTggMcvPC}Ea1R_&&s+|~iWVO~f2`atWx?mr;Ia7`-Hl9N2^EE8}{+uOUpc9w+rt)d^>K< zc1O#Vre6bb2AaSZ&2zWBIab|Ux;xIj_+>~)~yDy?@@4<`>n{k z>83Ov{TvddoQ^fg@|8~!o23rQDo(_u-*~ny}wn-G7a!OTEHV6GS2P zs=SxElD_vpPJm z20T%(}=9sRPctkt56F!slZLQ~Hksar49vJNykB>!{h;DF+r?^1Ub)C(|IiEoWV z@dB;Ku`Y3hS=Ir&meWd{UuqTgOHa6p`>gBRS>|+(^ieGO{+nUnEX7A>`rbhMlwbIK zY(T~rmO8j~Z;s`;|2$yw+~ddhily70`r8=y4bp$$wK+?}8|_{nFsjoue;89805HmQBl&7AAs*Mm>W zT!y0i3)~lJqML1)bp%wJ#eGtSI*C#HBr9s4WWNUZVV~qDf`3b}wU*1=?RGC{Ykg^-YgM1M zr9JYzVocp<-%$I7@^R#z$r(`g<9yB>Q1Y|6Z+5*gcHblogkz$`@^Oi^XKr}L@Dq=) zf8belSlLn?ioT=wSY+I?Ljx)YYMKFYTI2F-q8Yl5OdkD*>q?Hn2V=ymzLVrUBL-hwu^p-e6F0s}W|fQMbfAvwN3 z^(!CpBjen6U5xqNcg&;<|GV@2mNCzj#ytDO^K2NIr-4W1m}e&Wfdqv|cSX$gr!nUG z?N`HdZ87G$*_i7q6JAf5|>e54uzJV1-@x4~n6A zlnd?{kn(`^(IEe;8}{On`WosI%I%B%cF`>PG}_Zus5j`R*#byDI#ygzr9&cb^ZxE9ATRcsD=%?n=J97VoYNzjO25 zBD`A^emA|}h*L67JXQ%WYXrQ22c)NF{Y*VXgAbWy&ZfV`m26O4<6!wpB{WE zV6?L~-h0q&^OgkfA4l3r^d1;#-^RVG+MMt3{+?}CmIe2)tsBdN&+z|O%Ysky|JTcc z{=nF{GPfA^rIhs+#)*TF?YbR8Z*VYW(T4WueZQVCeD&c6InEVV9>BVKAq#Xj|M^#^E2`C+8{%yH()ZyD~h=T!U)d4?MCsgBWK!#dgU z-=5?)Vo_K8C`>=>isSULVf4?d6nV}4t8fp04>@U3b5Z=@B;c@w>kUZq1S*Om^s zv}EaXeI0nK7f`RosMiuvuYAqdB~NzUnx#YIm07fgGObu#HykPw8}#4}(hhs9oCI;zDL@YciV*SZ>BvjrKU z{DyX3F@7J$f6rPK%arXlGv?)Y^q>e@55B-}>*;4@xOWP*N66z2CiK?)MS(ajut(F zZ%3vI@8-2K7s%oVhgB@dhu%`OBw8o2Rg*f5_ibxt%XL72g7?}@dft8 z;tTAF#TVEUi!ZPz7XLT*#Ntn|Cl+65Py8BuSTx^L@{ZyOd8g8B#LnQI3gxFw;0KmK zPNTowSKdRmLq>xlUeb zXKuu2F@^_@jgCi@VfbaRkN=mc=4+k{yYA20qI{h*eYKfNW@Frxe@naJEbnf&gRkb9 z(PT+)wftJ~!O=W>gkEohtuL(C;~YhDJZ+Lr^d@%Xn)fz*@4|cXxntugjGiOyDjD00 zI?S)2{k!S6O8=5u7$ZDO#t84Rlpdi!5!x-}nMb~8FJQ|5w6SMAZt8|tOce(`pdG}w zyU@-nBkibo@8mHU=N)Yv^i1X1n=!Zs?L_-=Mbne$Oy=mfBIF6#r zChB`=He6Jxfd2^pidBUj~0V?5iAD};=r+wpmo54HJ5nIF8qQ|YhVPhf0k zu>N@{yX@_e+zPvtkIi%A<}d7$w$I@4>{yFbTPyj<{CL`AWz-SA1(Gjy3@!`NuC(dU ze(>RU^@a5xm-d9(=#xDU@TP6w9?U5R<>;GTjo%-=0iKug6xM!{CS$r4=7R@x0tcSA z*q*-;YkxFBoT$eBJ_4DQ^9+#how}ydHvQ#X@ECJ3CG-j_R4?X4B~T?70r$FpyO2r?f4?}3)ai{K*6 z@f_yBaRn?g{-PZFNsOIiGwmFHi85@T_jErURJ=CnkGbEt*Oq~{GbVPAkt-tlJJ*We zI8V=TXk?zY;Y7?+&2QUBp{no5`3e6q^l6UgPjB#Urm6C_zYq_NICnN>pER*AoC}UR zI$;@_*KFk0<~r*26({pI zY{=H;Nqks&5qZ0Gr+sy~bGt+35SqJMOMeY=kL|tt4r?{v9Gdw`sEv82s>RUUm%+P{ zJ{^|6!x?omd5XGzqY`lx{ zr0mO_rY#tcnbR~I<1uqz zp2K;$YQfajb8|$nf2w`UP`1o#5e!@@f*!nQT-=4!`{#vWEp4@@34iZ#&HMYk%Kkf) zsC+M|Z_DI9hRo`qjBd>t9JoyQEiRQ?mE)j4oekp%{34-i#xot2_gZ>NXgju4bJl&I zxeHNWbBd}N4W6N7>K`yp&)%7>{Zl7waR+-!aE=wy{$Nk0sILHx41mV&(L{ZcmVV&H z1eF_YtGhz zODE8_!MijlO1_A;*k@>mwTn4UkEV)x+IJMEHs@Lz^~1-HGro)_{r;~?kUss7S7(Ag zV{h_qs>Y(1a6Vc4`-}H6XW-ua!Mcfz^)Bi|e~RmJqb>S}-;~;-+MA|%X*10BE;ZWg zO#?6X?A%uROv}8kfa~C;jxD#J(o34POVZfZI@)~TT`ksRK7D-FS-f_@+~WdG(QJ-^ z?^;Scr$kBrI!g)p+gbggHkK`COtjYmtGcwIxwOT)J3)Alg2%Qbiz?ZU)L#g%cTo9Y zHl>ia%wk-ujHwadTg>mM*E>!3oA>5Fm-dPluhN;Q_=MEO{ppO-?_?!Oy$Sf>c<<1a z(YaHz+LybhDP>44{4TAIU}=cK{C^ zVLVJFe$UVxt!#_+eMWu8hoH>Ea->WBQ$d&TeGz`QVBGy^chK$J;yI;q$#cyUW6;)K zr|=Vwfd%uGT})||t|?IuGM5l&k@vA*URc)@%dTt->Rg!*dFhu*|3=zMA8(VshR}aB zjin4g{8%}EYAfk2dHi{xY1`vP)#>FbKKR2}*Ar{k9vWCatCioG+nzbliBqLU4qK-t zO7h}FD*e&ypa(ASWX#E!sby94q2Dn$Va7vRu57UgALjK7d{-~%2aIf*-5E#}kdHI# z7HCR7+Ho#a6$`F?PR1al4Vxb1{4w{|>R-mTf8sf1!i_Ndk^wW%{{Uul0WbQ{ny@-J z23ESvXCDEphCCZ!We2RLi&ZA9`ca>-vKjY5v0%3S9@i2Dv#gjfD~->rBiu}wE&miS zO9u?X@cQ_3GxTVv?RwOm6al;O&T?t%XuvCAl{#aYhlsgDN&vs9iL_xC@8@8?XEDF0 zHRcpccMmRSOsmP>fHl|0^7EtMN#1ud;28Qsu+GH=|&YHRF zTTe?l#J$TR3V9yCLRg}VR#w=`oVMF785JhndyU*>65i>|A)Vob++Vj2ebrd9EBXO* zj*q#W50h7q&SP!BnsC3~fcKM+e!M>UljOZO^eiKJ?`Qm708_^y{e16br5{GaFE zdxmlVlQZD=2Bzk0sd}TQr1^X}-Vydz)eXam^O)N`FT#1^tNzZpX1RaEyhS!q z$hP{?26K+PZ9{Vl1EDtN&|sX4F8X_!-_eIVQI)4(5Z~n+`PQdosxw>qJ|u|3s(2Zf zuD1U&XzhUR{#sT|ZYHmn2VNR)ArN9t`juk0Qo-@S@=@lo%J zr9N8(nIk9gobc+I((jFNxek%$C|D}mdi<~%r_0FS%6Q$;^O+<3%zZ(-lmXyafnE30 z-)JG);+_s9>VA)vv9@%76a5%7L_K{rEB_Y8>udf-y{>xxSHP?Qzi(mujS-yC!LR@G zT*g*()hOM{e3WUnsyamm?%p8t+-Vi290^?a{_K$p(-Ov%Gw&!Fx5k&L7thGhi_7Dc zzsJHgBGrTE>(;d7*5H}%Ja}%>Y!yv_$L-)(=EsSH^UsHNMe0)}J&A~8loheB{_E-S z;~4!l^vU8FoigIYQx-mj_Rs${-2ShO_8E_{Dk^r78Sf`kgk#9x`dbyp$kCz)JG1m+ zdrfU|GydD~e~K|r+S7usIhY;_?fP`_c}C~QI%$pb?VKQ_PXA!UnAbk7Vje{2KY|>X zc9%u?x1JAm-%3BumDzWeVIIu6xCeXkO>4XnU&-P=Zq>-w%X?1dLi@S0nRIufTqpTU z;NNEENVYWj4IRNt(K-S*&f$f?xBN-2H0G$Me)9|dP+JxHzRU1|c~$y_#I~0^gZ}#O z*GJl>o`QWbK4#>(e_E}bTgmc0B?D78?3T}YNvQ7t?48*Ac2UoG?vxSj%<%x(I}b8Cb*f#U>9-iNzlu+q z?QTGDRT(0~Nj+RrNZo;a8vC}N>;ydYMDgC!dqk{w z*(a?wANLjGIyNVWJDC@jeAcUgkJR_maS}$QnysF=P^u->Gj{^@7Sts$ zKN0i6)EM-P>GVWOl3}2Z&^D!6T>YlYK zKi-~aReroZ78PG}kHsSWVSj40_hn;_Nz&iuF^MCLHDi;0uqvltxv`%4Mql*Nv`@r7 zd`K&x&(UU4EYCXnFfvwhx3+3td7{Yau-Iye7o-gXuK=gx6GEzt)>$@5*2&QH zxsnDgT;%V!=DXcmmZMe_&y%?u(uBWC!+Dye`)fIOEn#*I`mIUf**$SK;qHdKUYo+P zRL^DHD7%(3n=zv{3y-X4*Aiu&&EV_Q@A%oA(`GTn_#G#|$BI`T3+Kd66_=WL7rrM8 z^Yb+kG?nypM5hayN*ZdjH&xE)lYUgS%fP=^#1)(T=0^Wt)crDJl#=%-_zTwva7(tx zwY~B$YX4^`JyK<8nrKioDBXQG&TW}r19V8(zj_b-lFeM!*QcnsnF8lgc#o&MfASZ# z$Mxax-V5Ic$MQeeZQi>vPOCiEgE-fFW!$-V@LzFm@@f}@HyFVGQ>9p^>3SDsz(sbQ z_banJ(?wUUT?9G56Mt4XNS>$}XV#fNtNDFIpTs9+j7XWAhqUX>sIqVKx4~C^Ao$lcU~dpO2S(8&(r-$paJ>uJWG=5n78qyCgz&;=QfBmwsDPhvYUOJ zb_u`KP0DzDs$H`^o&ha5-%VU0o)BM5T!}p2XQ2HW@UlGT^M_Rq==GR?H|BlXr7K=| zo5dKv(#2F;$MV3$&-+j>R=?(%&-&54MFD-+`@-!U{vcHJ0NSCxa4X{_+mv1;u)L=v zQ_G#rvxMhe_}#^`Nk2~EnRgI6W}C~lFA5nt0q{ZmUHPJnz2m+O{SPc>u5+Ea7fK{vuG1u5 zDqU8(yAQuj{QUK>j8WicTX)GgA~yFsJa1R)n;yiNyDUbWJd7dVh?Cd9pr@n)Tb`IR&_uEm`EI4jHt-3B2@Zjz!IMPv|Kd!~9 zj7P_5_}bGvD^(1EeZ;{Lf5#Q8rf8{YrrdQQ`Cz;}#%%w#WYE)z;skx{d9L*v{8tzL z7p!T{W$vIFi)e_RS##E3Ay&yet$5e$5Z=uW-pQx8viuF_ zLc2c1x-?s|4xD7{tl_dvcEkP$JbD9j#_;|9uaC-swNdJb##wv%0^UWxDf-8J!g+7E z{BUI6Jg+}WQuEfq$M!PMG}etiqMH-c*!jQT$Wcdr+LVjIr|eoPcyHTu=nC3ApfASa z=RJOD^(2{pSHtfi{{C|2ouqYc#$m`&{;Q>*op>kDIKnfZzNN#i`hLK85zAbpVz!j# zJMW~N6d2xv^F*s-Zn0W^zoe=1ZL7nVpMmoPd{Rrzl;XVm5|%s=FAm-gxz?j;)V-B3 z9|^}uUXA}R8w1<%?Z1uuZEot;cF3H$fZr?N>!0k%y_7K}62xZ48#LcPBJTu6RSn>E z18t(U9w~p(-;6mwjGVnio)4B5gQrf*G;Eo8pT{`+goSKtuVI7o1bA+Ir>%osmWh+H zgjt4sqFF{a>?30PNsjgVpe)OH`^R4k$HCeBq>|gO=2~i^8}O>9Tu|QAk;|CYr9B0M z7=P6f)L9az_+G|uIuy~yx+m4$`5b)9!k%bK(1UlQjk^+LenJ^Xjea2_PT54;P^L3W z6wi+ni`gG#oIR9VEkpCxfJPn%&vXnl?Z-xJ?sCAj3ww#MrEX=eCeQm~*BgKt;{{-x z`FJN`^m~=BxH&=P3vK}~OkTbgW4TZsn`H?qKFpUN3fo+aiPH&qGQNSdeZ52!UdEif z_@5Ln77t=B&O}k)*=~P6H-DRB zGWV)24!l{LlsWv21sq*BnR|isBVNU=eHU|TUacRtGoRC{n%xy^oW3s!+FXAAWsm)j z?bsiSosXt$!5Muxc};RF>(RE(GhBVxxm6TMpBBuyg0cnZwCXo`Ouvob?V7Vh)%P@K zMTeGLH(*V256U55ggy8|}$T!d$iiSb*WPwn}tEpt(Y)JtQmRjIAHHoVW$GAgJK>bmqu?!LU2 zbFTo;x@+poxgqdfGWK$9W-{9RN22h*Ed8YQpl|w-_D3;>qu}rI^ImSh zUbFeE%;RW`!D);kSxc6-#P6Zb0%MKdwLjNB(5U}<-!s-NM>WTw9pj>&C9tmg*ZVYE zt9`n4%e(j;2%L37irD| z1=u4gI4_Aa%rSqN1u!@8#f^ED&qN#Ghj$oEwOGI?K{i|l@0{NP4AAbOPSo|GUDju8VmsQHvC6Ys+G(I(e%Xvxhc=B{al2L(?B@4H zMhuDt()L352eG$_XEnxNVC)9IXFLh+?`WLnSvd9`?S96;hdJ{Q{Z%eMDDQm|#qeo) z7i0CEe%0E=*x={Dt32Tpn*)=nlft=^D$-o5)tz2woyq~na)(jo41S+X)Pr3(pZ<~{ zg2Zb>7OiCN%>2ijb9;Bl9DDvXC|`4SLpvb*M`>v=wD9wg%rRRJ&4~j=~&3-jO>9eS#p&m%a5KA^}KvPA1 zpGCzGv*b~Z<6YQfU+K%BoohuA^?{)EGH#ef)4W4Qo=8g{;A}qc6(jX#p`P9(^TAhs zU`4&N`bOFxFu#e=Zu_ZYc;(@K@LbgCEG^JK=(mcJBunoh!ru0xzOmo>Ks)4|R?hJ{ z`ZQ?Gxr+)!T9syVZUoFG_WbK5Ht|^6?dPix2XRgXciIcS3OL&>t1ijcz=Jfn?mT5} z$?X7bIhCmTp^j$;+8KnL+;M1P{qjt}dd?-h-}O^pYqM;v9BNJU2R0@8FL#PU+6cXk z@9)gfyj?ff?rz2(dEYWKwhdrdMqc3giHlqCm%KWD$z{L`u6Kf#Sb;td<>&pOJs!B* zk2XAvDR#4GH*I>}hRpsC>vXprbg(>gVMU8(uW*1CE@jLNYs*)=G^exlMXf$*jYzd6 z0LMVjcz!T%(Oi5x`bVuE`?2a*X!C^xvA6?txd}W=GxoJz<^Xfntz~=<^!ufol^q}L zQA&;X0lc@}tY{*2T{bPwv0saKIHvz0H$U&cauvccty@S2Uxs~3Wzgxv5ORi&FJ$^q8IP+|m_j-8#5&oZO&;vX0yv4VblH4(50m6L>#hS4v)m@-uUbMZj&50UwUXgePI* zG2qGhmp3%0t9J#v>7T;3OgO!5z=?3!_Z{$~;0adVAHQVn{r4+>yPXrfJAV$jH%+9; zcuRTva+^V02Jrq2&b);;7w#sWSytbFI524SZ%-86y(?_qrT?6G0gR(~>>bOI(%Yi-ru<;7iaU$jn*apNurQ(O!r~0m2LrFy5`5Z%q2_zsDizp^Ukr` zT1^-yF2J>aaDkt& zYG!P$_oV+&QMSC>xA-5T{DW^z8KUZ&;1lig4CB7G`QE`Ab>3XJ+qODsi=(Wd)pzrZ z-HgH4sAbnJ#Q5`wyJ_HaFh3XeIPdcZP-h|b5Z`5^EZ6-3^uhU?eX%yqoY(SM>)YjTJQL2h7{C8%R$DIl`!~{B za)~#jPd`f(h2Oa8-*zWJ2004eX)o}+|74bTALYH9uh<7Fo9@{CR-8x;iTJwa)emj4mtEP~ z{JDh5Zt#G1?1_QNB3N+K%-!$J)BWTR15aP$*M>t?S6Wm*y-BK{Z4v!+%5w4k0sJn% z`HtOeb0OYeNxl{J+0K>cLq)Pa=pXGSk7{vs+lE3_-0S8(AG3yN@6h(qYxvO5LT!^G z*6{hA;WZ>3>8E|CQ)m3r_e-p{ir|}}qEm^G3$btPcU`i?o%~hj!wHUx16G;)a)XU= z%CT=8*xQZ-QAin)d;e8SBwjl{5ndN)VZ7dM9gWvK9|D-?k*N{wf=+xAMbrWIMB6+e`;;`g8xSq826-6&d-Ro9oG z_Tv%qA)pnf(f;fxTJh~sv?A+M(TaWdJpx)WqjlfqNuU*1f>ulzLn}@jwBmY$Rxo}f z`-w#>2JyQFw1V<3VO5K7ls!)y^kRZRFQ(YS^kNO@1=sM|`y*(DxqfKxzqXBDzb&Bu zDG}?p=hs+2;0*DEyc2lH5n6G^Vyno0D^z3~p%XVbD-sR0V)8|9k9P5YpukcyfE`_ikj{!IMZVl$i`R@>7bKi2Cw|AQ6 z{p`6=+lQccu6$9y4R~LWfN_ET)Ic_)&HIW(;e8=)^!fHB&>%JDl&CQ$g=vs={4?96 zZ4;x%h<9>~D0>ga$T`sFiTT{=gCcDcdPJ%RW8=62Ev6Tuwi3I zuEXMR2BygzO9xBK+=J9N6wGRFFVrSWyXPYO-wIrL7chg2pYtW#Xgd3%L);Xb&ZdOt zXc?c*m~{3+>rfW44u3uyYU5avwWi8Jt8o9ol3sBXd-$#Fj@-8}U(f0%wuB%rB%$y1 ztF24Qfphlc>zsA*_KMoQB9*z>Tk)PeCiTm2iH=a1bP1EbGa=@kETP_*^y6e=M{Z!9u5t)07v9E170)=d?sD&A+b?X- z7t6Mw-xq2V&$oYudYKnrc;SWEaa*K4tjwii+Q`YgjhfhX+2OFR`nAVRJGId|bH+Ps zN?URkI9_Gu!+UWnU<*2G#`xccu|LRohDLkw(#|S9oI#j*$d?TAl%ugn3I?rZx4rLtszK}KM}nL)v{&^FXE zO-r*(wB?JmS!rpDVYXl{DO#DDVp8E!X<1>V{Li`f+&42%u)g2l@B9D$m*2zjyw6?E zJ@?$@-FNSK_p%)mp^f9&X?W&*x!4mr0?$f$PZyL^7h5?L=g7NYThK$_4gE^I^V`G~ zjoG&2`X%lEe$h|yS($y>IJER?Kh+L+@?l{oar(~&mvheC&xA9O%?$reCYG&Se3{3Y zgXer|Z3P>*Hw3+OWyPqM$$zC6AB|pouGdStRxe$R#h{nse^D<78`F#5KcSaVq?h5B z`8jk=>&0cgRUbs>!?p0h^Wpfn<`SG-yx z*0WdWcQxbd*(kd_hmh~H%=h@gZ)iQlp2-V5_Uz+O_bz7?;`&hEYUlH}vACC9&I5#uqTPSR3k?lx z@T@=#&(DB`=QN%vgms9=FAfWEP20&gY(S&##T^5*=MZYoK0HnPRK$Hv=g#7uFo3rx z(5C|}31xv-t_eTf=cTc{>{QQLbh_;TH;5Z>3 z{ZIH0>c8%^yZ)1;{-asSsee`f(T(Z9@$*e_KWglweiLWN;d*n$uO6Q8{PK!;31nQv z&o^yT5nCqqQOA9*&|RE++O}dunK(0OE9f5WN!`yq4UDLTFlV5@!###idjv}Ff_<8TYd3ZKRFz!f!zUZ-LZ16q0HaW&N+-_seJ};Jv?@qlvsE?z4-($K8 z+hqQ&W)MHye9lDZ2jgITj_VxH;2P5~IZa>&Nwtq!TrMZIT4*F z%=Za^aD9wXdMJC`8{iR??Qinx>EX_6b1Nq=?8_GbFXujHXhYbR&X{Z$@l##HntIU1 z^pkI)`wXiK=7_Ao}q4jDd># zUTYg^ueEbW#6H~^2G89q)$GSs0%1-c5jJ=DK4N6f{a|K7e*o=g<=GAY{C9KG#_I~V z2NQN!_0Z;i!}UmLi@!j-yA18_XJ~iFVO;thKhrsgpXm&JM1(j4FgSvr;|R}p+z07K z_Fs*Cv!>mbYc`#U{xjbfrKB3)_wjslJRjY01ow0l`}D3q!fm&&@cv(+y{(iGx4s?E zzC}A2;n&vv3|%@C9s4hSJ}&U$eZCI$;=YgJjry;9H(>wO3ilu6`#N0#-Te;l4ZA?5 z;DgTZ2KKzn!>zpMFUo1|wT7*?!f&LWUBWf)a8D>-sAGSCeuFJ-pZuk(e&sJevdy?2 ze>3(?9wB>ud_G^t_m}R>F2%w7beKoT`Lpd=>S0|7ykiBQzw8l$d$OmBJ(I*Yn{qF8 zgU86v(Z1R7{_1syb%8uQo&#_m+UPlt;ED}^(VqVyUGQGCfr0nYLrW~@qDn0hQSogU z?pv@e*rV-UOtbV)jAy*E1?}9g#vBe@*!D@8rUPVgrW>NBi{GqYfV6Pm_?aF-JgwPE z;9jvuLgi4j&w~DMsO3^vR04i~v&1IXL<;^6Fi!h`+8nMjq>_CI`|pn_=SfJ zJdgH&LYG1O+uR%JeLv_LZH%Pu!~aHjc$r=C8??b~y0&}aJ>)!|laQUEjnhVr^CEsT z1#)@lWS-ho;2v9;r(9i|Ci8@Qc&!dtwGQjqCoo3&!w>gMYj=JV#QP1>Zh*Ao6?#UR zwCT6w=~rHB7=&jdahZ9X5Pl}<_411FH4q-t@$m@Udw!a6bDb_^FTRKDg*Y=k+VO8I z=RteGeKGEW=kZ$)uzG9{=lQrH_&mz0gM9uDIvWZyqZ`I4a*6Z0OC02hXIa zB#4i?*w%#|IzNqVhVX~}fOpDXUpKt@7K|B+pni94koyFSJ`3Lax4}EjwivN@Q!?fk z?IL%_4bC}@ggO(pNbIH3lNpCv z@H{aH*9Yw&uErh?_hA7ROKwy}=c_i*t$Z#9f0ykqB-- zMC0S{)$uX3e@{GLHZUj9leG>kTNUCu?v1k>cSI<7<|EEUiLn>Xzs0m(5+cTEXkXJV z0{8vLF=G*(V{FfUf;=YG3j>FnV zpqxa7yC{C4Hye!SC6)h^W6{UfH$D~} z`Q?qrqK7@$R(ILjXvUdBzLXI z7=PYt+@T$()_JfUZe!JF*vhUA;{4w7M$YFI@3KvgS7pCgQ7hi{vE7KdH|@Tk+f@5$ zJbxK&{TlA^+04%(PGML0cfQZ)hT?g|Sl1iwX~yRx8-}qf4HR8xSX0ds{uHH37mql@$o1kr1`iRd;eki1?IF$*^awf)J#HspPI#8xA88)N*(aCEq1djG# zX}4!p3+ZM~Epto!Ql_?XcAy@@nfNS4Cci?7jX5>;SZ$_}>-HfW9$H&?oV8tlcJX{8 zBbRI}f&(Z|FL@!+jL82F!v8w4F>*buq2Va)kJiIWd!2II;Qx>2S zzqyK{3Mdkw$le=7f!$`^@ij{jHwiykUVTh0&oKlmha81PzPx0yqQn}&ds1X7yCS$v zd|2P5hQxu0*!*F3m#+CFfFevWq`rTs<%_k$u(%R@oZomrnpowy+#a_1kwp7ux=_0H^2eRd+>N9hhxtL!i|axq~vK+Cn;g^qpNDks1= zKME_EYVz;me*Xjk<3ZDJYNEQ}IEbxit37i_Gr#b^p4wI?<7g#qTOa(K(amn#q|7=? z2mfWf7v@b$%5hHzk&oB+Z=X3-WtP1tpf(5Sx_L#0tzL!CjaIQN%&RmWZw5B%iy-_n zh-Le{IIBF&^{Gb3`gfqFWAm(7@OSM{6@Op@Qued_%|Bdp;8%?w6Uk*hK1J?Cx})%T ziSp35i5h<}L0-xxt3C6j3%F8bvyw`Laq_)oMzKlnrwKm(@F7r7tJ#}J#LkjU8*R1} z_Tm?VQCHpbdmkB(6xjmKd4gy2P3DusYDH12wVo1V^f&&bq=rh(hmwoi>%p>Z8vP$@ zHM)gO7CD-Z9?~=p+mE?;1#1#DDe(14i;3jXP;ICIVU8+ZS` z*~h|Z@<)_X>QyT7Du}8& z%8AFWtH_GXYm|6x^?~LDM_=#G!&Ijo>!~BG#h=Qui0WHYs~JgzL3mcLSHAusqYPS_ zU0BcYt?Ua$e(U-tj{G=BFR6468t zOu5XZH{ZV_A)*uJZ$x6TE9NjeB^bNHV9shwU2xpSc~L8xN4sUhy6E`Ub>6rc#2pf9 z%F=0*n9FVqsumNvx6Xef{6M(STXVju{^)^r6h~p&_qmyOMW0T^7gKh3=HA`h)G~3J zXt=H6njqKuxdG~tGDL5wU!>zOi=sJpTvY8ZoOeWE=kXbhBS_UTyF<# z>>hM~vmjSXYyUVmJ!otAaV!!}|K#!w$v74L+aAxD@LL5}EmM{_zu<$0S{vns2eHTP zgVD2dHK5-r#NDETw zT(R$qkavFw&XdtNxdY2Jh=8)mw+El3sDYYZO2Xa)8$SXsYGL7S#=K2$!~5ri-E-Ef z8Yq9ApZ!HNMcQi7!Ed;9Uekwp3*Pq&pVayaBDJLJ-Z`OMziH2WX^=7jtWYIu#5`97 zlr>PuA?tYVd8DJ91wVx=YpK;zhyK^C@$@>5LW{*a>?4RI68@<-YUxUgrdgPxtHVfq z#H``abeH0`S|6M;`Q*LKIN9eQ_1sB`yIa&G7|_YMX8zl5ca<+={93mTPbn<)Ai5~*`oX9_nNWB!8J?`~ZHAJK z)DDL3mx^w{yF)Qqr}feZw({2d6co;bFNn`P)hehs7LkOzK7X00c>{kJCm-9$U+@S$41aj$zH}q!~98?=a1c-^1h|Vd=UKZ4WE@^ zfe9OSuR$nVB%7(Zt{!>AbK8*05g3SJ5=s_5GIUD59oD<~v@0C{nYEPd-^|i`9Vt%A z_48v3)v?y+%PGbHmZA#u?flzPd-9>bcdm&A=7@RUWw=F6zW)EmL`*xK=`>BB`GYT* zo>thmq`SwOC>^L2>poIe(O%Fo^AdBm*veQbBZyo;+h#~wj@X$+#Nogu?>kQ zzcdu;|8L{pv+*1+_Mth?P64CjMsLwAH_5g1XF)W}lD=M)SHjI<875+Thu64QyQ5hb z+uEV$Odk~#w@RA|?pr;9D)jcxk^1g^2Ykey;@;;Bw;*lVLsR+=;3pAC)PIjY9=|WD zTYF-W<3kE8!3!n29h@r?uU%~yiG#dTSnTdym9;2d3ha(`D!aTQBP4%5vc0pqY(;%E z75h-4hlcp}pVkp0b1kLVk>Edn-Wh72CaODfMFKnemL6HvtEk4Cc4w2o(rS{n&k}$p z;{$!`N~b9|?EH+ky}7e;fyrk-r3e1c!+JI2LW&(}_r6$1dd^NYlN8JGS9<)@@Crn+ zjT=xVp0A!eSkB4C{)44FCJwi#j|{l#MmGssm{Hh2_qmifLc}-zH#Afz7NZN)A0a|8 z?W&%%H7sSvN?3-!%!<9qvp(t!oK~~(6-cy7>hf_Tw#YeS2h@j%9SH={w?;G76tB_* zsV3eO-%aTXKK5w;e8a)`ybwuPjIiGOeEzoj+}+NLr1AULteQgIa7t)IItoH?1GOA0 zSwCL6prS_ox5L?e(&jU+T$pp27wdF?tOAiQaYPaFXjwG&&swVReDc+ItoN9+^qQRL zGBTbr?&?L5au9U+b!%*@;>OYM^022ZH-uyqY^7oRzSP@Cs^wvtM^qcvg7A&j@tNkH ztzatq_b}4nM@ayZ4MN@{oYwb(%$qoGz=`*1Y=xMm;GB0saPu<`6X3>u0ASAhd(ufB zCpx4phQbYO^J#5oLh|l)apV9I?6)wta%Wr30R8TtM1Q_zh15J~g2mI8`)$q9sd-(! zNj|daU5tHU!6Jh?yP(ssrJQm6dZCNtcYLq1ZU}4iv6t9?b8OtZ9S%ysth+$O8sknc zaZHaQAH<>pL7_&pR^ZluAD~pj?49?%I?6giA+95^GbQ#==gi;no8d-=d#B;4Vn#dF zoy;+=5siY=l^?SQR!3fR2w}d@DUZAR=z$E~dW9pay(*;ey&elN<;aoHKF>)D^IlJN z`Kg#y+AGE$E-&^~o^GO=ircV16-{J{Ucr1*)@5~eqJiQj?EenKS4-ZO6?nr3VPYYwNfs{u< z=&wFZjhsFQSYt@BYgQ0nUTkKM*M02txt3DzDmb)54*HV{>VP(_Wa2tb^XAY)##Wyf zoP{LZ3~G+gf4S1XaQ7fXZC7gU#HnZvmnt(prbeEYp@kyu^nFzs2U$EU(huikhj0&H z5y7MTjOZU4PYg#F>1b{NmYaz@_9Fy)vU;zi9`QFkSG0mV1Q*h@Q#?46uFW_dZ%UN9 zR7#OqYJcEe_&3^)dw{z`#X9!CP6mtiXkrC3oMv{l> zM4G2h6G@M-T4Nn^`PWpf6l0&!yt}5((R}>-Y1Kx6fo!ZAQ|aG03*wEPZ`+KFDy=WX zt&`68(kJf*XHZxR-`p^pU-DSX;o_svXltWME@006^{u|z48it5%6@-tuLZjqHPhgf zdGb@bo>O)hBUlbXq5Kxz@`^`I^oy-bb4H)KkiGc9_`4I9Y0K9aG2vDpGPuJzQ{L!v zXh0%|Nz77FBkfvDt(^cJcVfAuEqLAAqo~g6v-F7?F)j}dw!jC zb@?;hjR8*;W>;edq{=6BL*5MQx~=+X7gpY*6b09LdiCJ3 z&Grj(dCs0-t7)1!@6w0WpD{Y75=Mh4H5Z6Dsr{Z`en6u>HQ#a`sedDTuD{Mc z{4}e(F(wH2felzecju4Zf7aUV+F!$-0qMPyrSuH=VuPx=K!CrNR#PiPdv-aq&lkfB zixvfDS?=%a7vMplmAc!60RD4m-I30t%bVp#PiT)Ko~D?B#zODGm1y=eMg(UWgs6oQ zW`{}4>sH@~K6SELgTFXco@3dk+3t9e7UW!1<#+0?F&UPj-LZ>uQgh{K(2s7+pDp%h zI&y&Dy*PWe%gcH}N4@v*lO9%;KN~i%tu?$o-gIfhzQBkAV^H@Kok9*ElV4hME~0PU z%o0k6y*YeGG^utgKl*P|pOJtexpGYYv8Nl)gR(_O=y&Za^tl~kw;UsVk@rLMs@_o* zwEXhZ%l%`^Hk+1197uLpvZ~oZ!c@|oJ{C?*v}_pWqt+v%Jf4$iS9e6iz3rMf}c$sJ>L7Nr8{Nh_s_R2qGkuFd|f?UQ(4 zmQdTgR-XP=90fa&fe^_W$<_F0^z6y(tEYf3AzP!~0BZxP(z}!~glz7z^d?|W{R56h zUZ4MV@0_zAbu~WG$7YgD?URSRC`gJ`YIGykay^1O9(9bB;g512D{}R8oqqxJe*~SpS`J!t7-j2G&8zYs;}u|V zIGoQgId%}FoRfK%(a#)f98#wm*Hcqa-YrRK6Ma=%xE3pQcX=$dOEH#fmfYKeWF=(& z@}$y3c-#HQlB52k%44DK^=w^A$4ADFP^^rL9iW?+H-h$NJ$CXpE0 z$r;Fd74bd6#BhEnbxtOoOWIP=XkVcw8q+7nblJ`vHCKLFfS9`vET?+Us))<^8DLHX zyUkN^S%kJT07$%9&IA@kyAii*EGI%&8xA3*S2nQ=ryG4gdwvM;4pN5Ua{Fs!NlVH? z0|Is^(f2-!{gquaeB``*+C}-H_natY`PHmgYTqhL=^cl<8)97W?BSB^Nxu&qDf{)# z;&Xul?PknN1ZR!U$(Zr#So6kxA<(j{4eiag(^QZLTGzra0FK>0y4hA!N$~n6xR5M} z&OHjWu=mKh1qAnwPWyzi7_dyl#%0n+MD5-wmR1*~^C;wVW-KO(>!a;R+I25Zh_B`} zf9bC{5uu(!+wuG&sCanv)2eR6M`yl?cg2!ApT>BvX(n{l;ZMwUFSra~{;EWAfln5* zcD;)?;(yYO@`iH!zm%&rW!IqiuR1bb21X+VcIKHdP&bTsq%Y9-7ntae_vE@Jn}Eg7 z(%r`I7O7h}lDl#;zxIDPpGh=?jZ+j}MTb=S1`jJ))0 zSKGf~a0U8HQSw=J@JGc=lMoQ1@Fh-@pUfPU*uB>)u2pjSRfP_rWzB%YrLpXYisCT} zN6={J<_YESF7Yl+{bq2jEaGhv-n?5yf&&~u<~6tWtb3GoZmDSrQb%bHq|>$r>Hj4TL2-}y#@B-3V%b7 z=Rz32wc%eu9loB|-aq~k7TohX2=lVY{}}XDuNA47*1*%#g@& zPvxglG<1G|iESyY946~@wmb{`U~!-qnXj_l@4~vQ|>2Qj!Ud2B`l`*~>Qi)jWSHEqKztN}#>P*8C zXd-s!N(RaX+3}M?F=FCSe(a<7tZ@zhd2)3^8L`)$H5}Mhd!;xj*2l~Dt|-=m__34Q zj`BKtE!*ropv7f>%9p&C?_HAD@A?5V{T*FeFl)B8iaJ!)B`g}#6CtD)h>%CJ!t!%?$OpDEs<xv3@&=S@n6g_4Y(#a;t`iH?1S{EgcB~~?O#N$kkj1Rg!5Pu9CZy%xCg@ejNKiam-v(Lx013B6LPCL6=?^ud}j`n$Y+Z#S* zzhnv}(zc&Z`v3DisB{_|j#^f>tWDghO6|$B0_{mnXMpSxR-zC11C}ajmmkkquRese z5q@~+Kz?q{*m;C2yJ1^XA^7AQyd~)PYe0<4ui2FV*2)gcrFwV8MKm4Ka@lG}&vMD! z@HP@cw$BVlO*U$F@KsiXFSfVX&EZrV{X7;|D}8R8XZu-D^yV#|(>SXein-eBmnTWp zEGU-imrvcmp^{fPRh%h(w#zzR{{|1ULW~TNn~7ji59iIZ3BEjgDaa0>2tx7BrGHn7 z+eyzyt6}>VVnA`1pj2=vF`&GwLMpgojLmE6y}bUDrJVe%LHoeWuCtt^97K)i@TS6h zAsM&~abL~rM(l(7l`+#%>nn`shDs1CHlcGW{*ii%Vb6V4!T9P|bmt@)uaC|j3C4N3 zNFspg&V%x~bNtL#-xcx2Pm*Bg+Mp23aZta-Wy?7kza=4+1RKaBXV=O9hvpB{?Jk`Q z6XEP#jyFxKKm3#pIEo>gJ3H%hnd@908sWEtlsmC^cVmwV1|!4}kGt!@X;1YeTFPh& zUShpU8~g^9Q{v_8?(%JCy7Rb^4YtPZ+WA7W(94>q-wV$kol7B-c>3$p#{dJjx?hq1 zVL+<5rqIvwU*CHWyPU4(jIIVBLcI0TLW`*g15|wyEn>2Sdv?AZ?Ua z_<_I6Z~6Qz1{^HFuRndWzSZUSyW5@SEj824kG$^&Hmu=-WUFsOb21feJRrS(BVAj$eU*HeEiS5M$Z_7@~I^GbI(S8 zW60`GOT?*E!tBY(zn=LCGxc&(Qht6r+NhK;10LbeWm~|6-+4lWd*A%;XYD(gM^X

    BE7kwXzw=<;G61o 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

    ^qgspcALo@~ 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%0Dt#~?XEW^!Krt|pI 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 z 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 z zb{i)X$5@N)ZNRDyaQlf_dub&t2CES_%k~e$_Lc0^9*JuohM8K!X4aimeMBmnBvPaE zRpbdn#TI}pKk6C7PT+onTf2d=f|WN zvVtGL|4eh(7)#7tK>+}q(foI5j{h%8jDJ~vb?Hjo!(pQp;Wvi}lt)HlB(XS9Bk1xh z885LeStCZ~jK>r%vJV{ZS}ckK$?nW~WpZ;3w3|_%X;{3Hc2A24dI{A5rR(DhGjK}p z$^tj>H%8E$Zr|_^u31DP&K$c0#F&~CIc2|i;?w^sD^tLy3kaPBFNJ{(jAyqhSKFU-vnimYzSC$fWh z*h|+ZVqj=KEcsFkv2c65I$A-4MV=dpZkvm^&z^+zGRoWNVDGk)2RB+qwoujX+2qLX zHnQQ`4~@;^DdmF4^V88tf>PqL0oE*9wr$(CjV{+;wr#7cx@_CFZQHhO8$CVC znTQu}ow?4;`^C+33>_xZsf%??jQ$xH_5njiETH7&akwVXBbd13mv6>MK#$!@a19Py zahy;f6MfELkdQoaB3azf=Hna@b9qEY5(7$L<~4`g48#DE-MB+yTaHdWaB6L5$nHQA zpB{&n{5Z>$gf_-Xp*ugk=WV2*CoHlEG~wQQP%04wb9cUn!=V}l4U8&IN0NuBt$whRBIY5HdXIX< z0DH>R0F|M=E+K@j#q%jMd8`?;t3Ptnmp(LcKocCZLCG2JCcMhL-((2K^!gn#*QB zC=4yoMIWc1@x1J7$gF-$SNaD+D#nu=XR71TI;`OKDFZ>VDMh_`0VW1)_7N=>zx$5@ z&im%>O$#H~{u$aQRNwmQg!%qq(dyTrcZE)zC&eTh%`>($aR@D#eq+U~P|yGoyN)kA z7n3y7rdAiP1a3z*Q?&VsU1>I?Q%W0h}C$=hBS^?{Sy);mBobG+q*BgXK8F5GI zt>LK~bJ-dW7obtQ8#>QZ_`BG)W@W8b?P;*9uH-zY6tToxM6X?7T^)gi#)fGEk@>YM zRHwruO=CpJSjOU@fMKfwZASb?a1hE)H;SerJORMc{mM$xB4{9P;$N^lw8ax~6_e48 zLj!1)zR_L>M;zdu(gXa+0#ri|@L-l3-$B@;vY}e+1Ab;#BsbRCL{S1P|~qn}oYzlOLES%XM`Y zinKr0dtiemCWdkBp=gr61;a)xXbU_}D@=RI&X9@$k72f)0_1qby;ns#gNhE6@Jse;WldLS=9uqni;}UEgI9_@UgObc_ST;0;BE^JaPdRoo@Y!bSai<{8J7F+y{nf;}cOp zjzRoFJK#kCX^mBeYP&OTBANm!m6>xU2W9!qU`?(BVUyw%#%I{xqmTw5f0{s9?_aoS zJbX#AlE_9TsDpOoH%Z6{!k6h8p~d`icGPuGQ$j_pe`bFFRBlP%12T)QYJjSeDy?>+ zjC@!v?O~ttg|tW+MOgO65h)0ar~Gjo#$Rz{)6Gxp0_W6|ai<|FBTd=Z2k{mlHIY(2 zm{a)nsU`!x3_H`~WtFLA=#SSBQB@cN&02VcVkVs7qeo>y01<<6OF&oTm?`BM#KvTF zH5$a70hStLnIDR@=+gllmKK|Zi_o~)%$RDVwd)N=6K4zkI6H`;{3*ZP#=!@>x%hi$ zxV`?!Pcw3lD$Hq~@cBJ(ai?ZcDiD;O%FZlO#;Q2yTn~>cjLSb$bI-mW@aYr9{v>5F zz8vV#UEKS;2RT~#B}0Fb$D35t-K2__60nTV2IHJt^s><)up9fz5Lh;%U;2fs;#rS) zZIsWR&ZpbP#*U(Hyw2S03wEd3>gFu&a_^^5YRvRa#HYK-Jm_Z~mWtl~v@fJJ8kHmM zvB+Mnc(~~C--E=rf0d)x_50)Jx~@CBsR@i~a42ygcbE?3$eZ1F@zR-H+Xdcu!Tr6(=sTT)Jw)TwBLVQX zaqy`_5A&df5{%gRc=?6>jd5gyP_=D)7sQ(Cm*=cX`tySmA6w_b#6qkN?b!rxHZ^jyqSoQ&lXk$@i;*2tiOz7*jp4|M5RW@^g=qcl<5 zA5$yJuvQRazh?;*I;n!mq3yvv#paS#QZ60ej1GWp^AB*_{@Z8y5_EpuO%cILgZ8A?J#|&6D*YU^ zaZM8)bHuQXaHNhX#(XZUlqL&3yCXj-ZY!4$0*#@`NUXdq1Ysd zokpeu&v`6PNr&H^Ubh>+s+MkuBG+i*4B@yFVw7+XkT}yFF4g@KDFZBZn{x&@Q<^}9>4Z+LG=$Om)c@=n3hbU zeUI1RMPpXiW_%aaQ%0LflCX64sx0P+w&NDf1zYIE>mxa3a~~{ z7kKH4Tl1*!CaJ$104)spk;a%)Z8LgNiz#Cv(YXHaKWwSj6v<%&p_wO35*5r}!K60^ z#e$zvp){QD5KE&eBC+|6gJ_*0PQL zml*yvSNm^#>#`opGj+7l7+S;`&?D4VK+1umw$l+=t)0~nV4|~78 zDcE_Rx-01YbGUh0Fc-Zhm05}6o#THQzOmdDc(GJ?Zr!t(~Y`O z{?whS@(4O*em$^@g>HUw>!SL!bHP? z+E%Sh8O0f!ep1a=Y3u|6#dTe;f(D67wRwE2aO(2>rMMbks_|Ae75%QXiP=%j;q16B zW84s}6WBj~v|dT5C+JH#GX%NP|Ma|L=lXmtyJ64)^?KtbkoHhBzUq`*TPxu#Is09Z z%2L}A?(%4h^~05JqN$gn3BfQ^N=7N5*Ro+=ly$BnhG+;)H^MZa>?mr@Q@T6*S8m%- zwlz5|g$J=w6I{&Fi?|1)n1#cUCp%c1G6Q?<@#&Gh3M=7*YurFwjRWvy!?HdmVj`Yg z-!GkrhF+w5v24@N*KfBgwaJm(wl2dZHmGN~(ZP_s1$7`kS8vcTkci|*h#ZrZUZ3#E?B7XK_g2pSRC$H?lT$25T)DFu^GETddR6Iw+9OD)+)d-h(BT60gN{OE`&YgmZt$Tx0!mwIDOhuaGkC0ggnxo4`s^a5Ized`ap)G zAJWyx)Uf;ft1~}cRt);p1{$YalDlXFi zpOHdiZLD9J#0}5b#;(MI z8zN7-cXDhYfThXn=NX4Go{?LEf%pJjVRUdS0yh{=VldX?nN&EWOszV&EV@lq3S1F9 zF@lmkmA*J6Uy3-x;Hti#VT3`j&aA~G=RTRLxyR~KJ`~xH2pTc#pBJ@s?Cw?`0C6%i zv$c^gV;4;vsQG%2s13TyszeMx+xh-1zJ~tl z3WIZs_7==~{QbFK;9S}CD7D-J67k`kddTI)X|@kVxK|tdy}HKFF!nQe`{M6%ZNg5| zPo=KS)M={sW_<)5G}pu+RRzzWRBqo%W0NhezHNRQ-H9Y|y$nLuwNdh6tKvC@J$VpPI4b=y zUBRanG0qb~{kjEAH&xA(fkW%Pf{|yJa7eG!DB9nsP72+-1M;r79M4g2uOP%xoUFpL zBA#!|`RlMvT)Vok>@Lx;FD43+Ez&oh^L4ExUR?X7P8r||o1^ZO-73K&B5yZyZRq~j z0$peFcBu&<9wvN%tmvaan(~9&fX2#(<;c+wgRq1Zbg>_S?c{J zX5XvN-94#mn~&H`@fJ0AmOQeAUBCLC0ZZ-o=Xym&J^s~|u#)nU(s`axLerxo1z^&- zXvUr$9}2TFCTSN$IsZhgy2|9H(rJ-&fm*=@%u^Xk#XTgII(E)HKQY@4?+0X zaxt7|*e7?*^WJGl$()Yjm)AT*)}8vy|*`XLC7l*DewF)R>)CkGL%3BcMJcz_q(Eq}C3;#P8o3be5d0<+{0fH4~~KeQeXitCH60gDxW0F(jr zN|gfWI*1OZ-O9c=eOPJtxfPk~1SD}aVNwnVof(naI4`uUi;W?B7E@TCh638Go4ecO=sn>oa$tfs@I#KRG-TZjf};OZe+t8Bf@ z2{t%`Afjwf_-x#XJ9t8T@YkTMWe;k&7+{>p2H_yJxCc>OL&beOCCvT(_;&F1bdcB9 zP0EcYzWRC+UZdix_~Hg|RR4Pd8D1EBm~@gN-u(4I@-}_C)QbRm(sIb;zteX5gw2gi zTEU%wz1@$khikrtI31_QT!VCY^(q9$6#0*)@27RWlYR3Kfv#<|^CZMNVleuP(Pad+ zr=z#^0jW|8rMzYy+s%L_cM0&`&O_s7qYRqjl^8MWjaOhYf0^mMiOZI#uOEyqXsmw- z>xGlMlm%s;=ioKT-BU)3Y%vgV{!qslPu*5y95XGq^ZF+yilHk{6vL=X>17?YUqFr7 zNB}=pq-`q*b5_X@tF>)!%Wi>NO)rZvM`!53D^1|`R;hher?ts9wp+p(whfNIWO48P zTlS3-HM(|I!$(?8?md(pxsmvN;{86Z!Yw%EXz`j(mLP3K8?@HnY%3MK=x203%T?aEnFGe5{V!tUcQqq1G+w3AG^fz;6AD8cMYtT|d2 zr#^2Fyz^JV;q%C@CwibckwYJ(7Hp6)ZnP5&6ydOF<#M z?>KCbz0d$;7-XQTeyA)Ct`)3>Z%Za-Rp7wTIkG@nkn_VDTbH>ZkgQqW$@+_v-B>#@Wl9<9t2n)eTdMoI|%e?jn z(Uf}Hy9Yo2r(!qOtXGK8?aX_8BW*r22sH$Q^KDqMf(%7vU|k@5JHfB{#CrSpVdS}b zyA%4=w0br-+u3P9?%f`=k&d~64$qIU%`BgnYc_`yZ2!tBxCgXzk?DwYi14O!2-xk^ zbBr?3bL4mX+T(~^Wudt4TN#PPoG9I^;gxL+ijq63E<7_X^|R%hRkZ$u2lg+Dj;%I( zuIZfK{1B2UPbpu_M46p81wPX1=k$4aQourH51s6$m*{RiPr>%#`Vp0*qU&Wmj_mLB zj$F?+*Q5^Zx$~NBcfbEn{)eLVdOzX^0urVM{_k1L*3iMh((Zrzq}9Hg3AmgKC*OSF zhq&7VVwloSO}NsHi`Y0P%)3S7rP)8`~@Gt8cyQ&udaTe?Fps ziWcDu^`MM!Fcf`|U=d(wqWjZv%Uyu@lBr|TX>6jaR*BqF@wmx5m*pWvW#^0a@K<%% z1t6vLTKe1Lp;STC|kv}KM@Sw zmk@8L@eZ^q0>VrW%W6iR!!YziPxH;r>^fDCt4C1wB$_~?EukrqDKRQx$x9fes{QvQ zDK>3~S+v|16Gvw6O$La>3zT!eNx4cf(a7lY+p{5=GKc zFbYG)i#eAleLBg|G?yu=R$he30XOOOK%MhWxVIM;zdsDXMSzfV=MgC+88=}Sph=^Z z`JiBDPsc8R{<%0M+$Fs~$h7Y<_e~_{7%U!Yx`UBuIyV_*J547CnX7G>QUm)SHs(6`WXu|UCk+kgzp zl?OE&LMN7^9&3ms4f|{?M&zAG_1X0-6F46Qpkqzm*G<|DeaVsN^Vib65|wKUtb_CW z9$@0J)66bSPD1Ng&WEq)lgIRHrYYD2!HH z`a67A2th8-p^G-kmF*vf%DD{-#k-3iU#r+Tvnbl3cm~zz1fS9P zlr-W+?V8Moc;|u9Dg9AZ1#)@W%GVjnj1~q=G|!f7m;o~lO=qRTAB3>2s_YLY0*Vtc zvBC#8vGgow5Koeb@gOM!ilm~%7i0n9x;hd-L=QKPahjT%SVmnzAqNCSa?w;L>XsF5 znM2ZW)LIlBCu1D@Q{7!^@Nn>X+xs1g+b}N|d1%3nTDJOpCEz;*arLmsVn=W}bH*KJ z)98v_P9p;uZ^<0FSTd=WkvMZ8my~R@F_*F%vZC=$uev@x-l_q}7;F{;j(4y2x_38R zw|6gbQiAwr6kids>6Vzf$GERA<7GcU$U#}nqzl;z5kuYxap`Lbmehxow`e|FwOk_D z*~Mn|mrPLnY}Rk~Ro4xfQJY5!Qt=}Vr_xOhCn*1Yo*aEZeo=Cv3d#?`ZDc8NnwNpR z?Tl}Kn`X}+qS`ZF-AG%Gth zSKJn3?UT+`8NO(U!W`>u(xp9$8KNG2(ECm%PX;8@9hv>rH=0Q%f(cG~kh4PjgjIPD zieX~)yn)$wZ=G8x3R+Xgh0AP;eu#R?p0i(PKI*5NkhdVM!l1uTL07xIm{9|FI6a+QLuOOf^wL2A`MaqaZQlN;zUT zCNcGJ&Va*o_zbBgDAUSt>aXt5+}WYQB|vtH+%EuB{6C>&cphI)cG0B3Bx=zipVjEcS{0Y#8*Cc}(*XztXR%-#*SSkH^cyciLUKzy-4^ z;`mq>WUJ-Z!8p-o`KZ993zSq=H2S_28xwr`WtWE9~izp99FH1giy_BB3$Qdy9(h-8rnQpd<8DNC;tG|2I95*SZWP7%y@Gc)7QUB zt5Pn@ZzGn}&bc-TO5l^5B~z1>!GFurpn2Ewz_c=aG}$$$Tr6s$TX1TtG0~LwjoAMIQ+l`dHV5oIv6XkQ1aDN*Otqn4 zd$ZaaKqa|itT|t)w$=}*Bkm{B5#uBXjnCOS;;>I@KRfQtt(_N1p~Z<=bm%x{4!Ncs zYpl|lREd1^I7q0L8Ct}IBsJ#l(g{TqoJf7p1{4ukVP&Y|{7RTni2PKK9JB^H+Uvwc ze>L!(P59#d)39YuIn`R1pMq;lrFIS+o=c&H%aJ4)^7>b6$G*-|MJ)C6& ziB>61m%f=UaOLS#MPs*_rs?zCeI0TsGH~`a)1ptA>7U9fK*4s8GrI(I$nV}Q3SVT4 zpja(q(y(TD4cPz`4zUOiya5cGkz7Xk!Mew);L>6;pjJEE-$tMum%|6AmA3;dw*cIa zN@UL(6Qa)+U%R!SxfVP$EU)RqrfN_@zLwjFq$xVP@fi>{T<#10nZC`i^0abz6>z0b z6P|*#e3|UO*pc$I-1oWD`hKIv_T-7mT3ctKw}{rVG6n@^gqHPFix9i-ggvJn7T-9r zF)FX8ep2F=PUhLVyyO#o};)@3CAo(};IM`v7VLG1=g zaoYMNu~=sHdqJf8N_?ig>kjDo?km+z^&kMjSZa%Qst`)IlL`HyWx1TUM%+I%S?~LR~lLRtCCA~RciUoDv}j)Zs6D9HkWobBKIcY zxvDRRO4aX$t7)%xfm^(Cj!*9$Abv|>9h!?zh8Y4ylO%z~Ql#L`FlfD79AeqH4OmRE zAlDKFf=Vp@W>6rFzylyL!7_z&3cd0$ib582qVphbQS@Zt&h|y=>YD;f3<~-Zal&{7 z=(#%)&~y(}_yjv2ath?V$@0J(h0rsuRY81Wo=Kff zdOK!O!K*1M0bXmOhck<1WJgM@(?|+4LFNL1gcLzThc2v05hvpns}vuPs{s^{trz{F;aqZZ3hkdgHH1&RUNtNWK;h-ez<~AjtiKXT$iQIbLBa?o$s@d zg@m%ms6xQBVWJwm&6N^M*(9Z1B5$oRyAoUhj(OQOKZj+$4!7o3xL92hK~RR{Wg>wX zX+XTQkA`cKVsqOj8JBvcxdChg$N1^2lCT8}&Dbmm;Ydi>TG28di4luo0X*wYVYY?n z5cgMCF^J-BlNe* z%!5$X*mcrO5|`kdmTz3-If8Oae9SK2;PeV$WbHmc0IdbI5P+Eka3E_4s>(6U++qRz zq~V^g@8Ku}dW@80A-D1HUZ^NT(GOrGvk#5mNZS&`t3px&_5eb~I`!2(|0{tk; zh_Pr0tDF=56oMtCr7aW>fqEPXYr|O*^RADcaLof=!tbZUm=%7zbk}Szwz9~j41uO; znr)?+!MRarVXR}FYl`t9{s2+W(M$_h`~)=eDW7VuHNtl+K-kHZw*B5*hESF|~Iz2Wb(~MpIe@pP7X8Cz?v5hX}318yxdJOXoI(dwU02?e*f~#(Lda@U}Vr9{FB+ zo;h!S9Q8_sAP{2ab%C!!1~DLmeva>H>T}nB5sfk2>xW4YVKQ2Y^?tLwA`m{JHp)ec zZ#Omfw5I{}QF}V@pS=s7pR&^wIU5p}-(tKQWkrE^eO7hwZPc@ea_A{S}A&x`X*hqHCt)sh6ya$`iEM z16;s2$|@e$59XY9=hsK3JJJ`J&K#%Tj|cajL*a@4f!%;A9Va42R@%I7CD>d}<9q@) z_~a+qHc48JTY3WdI33y4eOobSnW9T8%B@KmVn`T@`tl;=lm#$O9kyI83NWq=S`1_% zDFVdDOOHZG%84|)RIhGJ>#l^pbdKXVthPK^-vYE{ftJPb*3$cG{|HIgLxG5v_}z4& zCi^qTm#HRwO>+<6S3vR)j_}5ZB8Ny#WWA%$Kq6lT*Y&m+U~= zgDnE31UcsxfhMEUyl~4dZq%gN(WlBuJ~U1 z%z;AASNvRK*X)4x5zO+XQo{l?2rKWi64+3YxSP&PPfmb+z9O5q>Ce|(sM=M^Lw;7M zxEnvyK1ah|Hz_Bs_#+qZ#gPdiMjK%>&c0|mE9xh4T#yGua112UZS(Rgr!1TSNHUu| zq(V`=t?)t-hbf$3B(WFxW0RD#2uprlIi4kzvPHWjxjfN;Bu~K3l?l0CC1ez17dsGL zC<=1WkozxT7c8awm$MRF{%br~aHxCSTn3bP%^;?91bJy% z46aH?+p!i!8THA+{@hriuu-c|Zm782zJvRJL;Sj(} z?D`-%-3r*~;#8*~1S@b!ER6Z=8RHZJgLGXnK8E?^OT%9lhU7sLIwRmljn>CtN!>h^Wb1t zhj!x>nB=Qq2sot`U@d_{wu#Dr`@+`>*#FV@%U)7tM}YyRn%db^m5m2`{wTA(uQk;E zifA3KU2C3)(Qg4{BJcYF)P4}&S0fo*LX6I0h&rbRgIwUShjr1z+F2~& z8I)kKq(xGM2gq{3=@0vu$?3zekio#LIu2Y%&~FG?lw8qvJH=OYR`)8LE-U&N-zJL0 z@%>q3!bnmJ?HQr9RQaQzz?P-qDNtY%G%B-fw=#kfPQBd?V#~qZG(%zt&l}-bpkj_( z01xJ>i8q%YJlfz|&gwM9{r>vF{&3He@8&-oPpg`p+HQicE}d}|LxDO?aKn52DwK`IPpj9MO(!%dpnE7d4dWHqsJf7@R_PFI%|=OC$I zYCPrrA|m@h;_aMUOmkZ!9Kcj5GJ;QGPpw0 zP-d2H1wDAzFEUd#K>rFM!qkR8W+=};mcj*TeR`H9mH?VZqos+0d61o32dd39bpz?` zYqyo-G9I;`Fw{76dYQVtpImV^Y%jVi>fA5c6J_8F&NFj8E>$>y2VYG0B+`;)EP*~z z;E0Aa?sr1bH-vvhX?OIf5wu95*Xf{AGWY0? zv9i2f6t=v+gpgO+3F`RcCJY@F8Q!_SV!^L{=pjkzc+Y@vKClvgT_S~&Cq9%B?S45_ zZIwQ8ZOt`8<5mpudt4ZH_bfw3`j4i4cB@-iyKH-_HAzKwlhckP{a%dB4xJwi8+Fa* zKZ{ZcInXv!83mU?Bf_(1aAc0XJmyKdV;yc$v%HnXBa=CE zyNH&yf>ejt03%8vUgz~O{Eg;3m6-f(|5GI;Z%Vo7>k6OELX=NumH#AXK~0BO?({s( zrY?_D=nSeEgcM7mF5gq018MAX#U+BG{xKz~@nyj-r4J}Q|dVRL^v5I+!ocjZi7XCji-DghqiT1Bzdo!ik zKU>~_EpM2u{Z79+64ZpDSRqQZ3kZc4%ErPh^{)A8*0;_=)WcH9BcQZ3For>f1%^)_ zpd^`T4Ixr22{QEB_8ND^-Khen$fJ;ETGY&T#TuCHIs@HTY+_ZIGD~SOy0}K~RfyoY5&v?m90kMe*IS4jDafnACL7J49JSdU$sv@+s6dV)Dp= zh-t*;Nmk3MV8HNTRV#4xCFDNIOKdYE>5nAtG;rg8g{D4?%?Mc;xl)u|3rWa0M7`u3 z?nb=IR~b^H<$)c&x*p!r5b%roMT#ww<(Cl4?&Xo%F(v zHN?5%a4n|Js>>4F*t+x4p-soGh?GhAJ%unm*1)?3r@xNa!L#<$k7OW?gd>E`;*|j{ zdJ9sN9zt=HL*1If+|s|u(?KO?MR0jRn9_*+DunaT22UrN&g5H$fP@(Mim z@E)lTK>-ArTt<~s54@k@d_Uo&6>d6)!vBJww**aOCghw0^~rDl+~zF*@;oZJyf{KE z(EE|!a_>cb?bhBXMC45aiCje3!!>zo3&b^@@7#-MS)6NicUK+VwqR^Qw9{R3zI_+% zQGmT_yj}@_XH3wF>iZ}#O>Wf?jcwBE*$=LYcGt6GJvebD_3`QP)#1?G3te4@0sm75 z8CNy1unL@r@WkY^a?G;CsRl8V!Z5$8Orb-M4ciPpi^nOO>Ud@u-!o;j*6f45xKpU{ zrctnFPMLaoYp;WQY>J{&ctC1WRL7;E9g#O$AzdoZ91pG=TGMZ4tr5_zbNE5a{8U>b z@TV&K+XTs^P1!phiVq?_dE35{jzS@oh&KQf8Qa92$`yE&FRMRqTs?O1mhZB_eUp4nu@Q<5ntZhcf z$j0>*l#8g>JiS&9D$R>?LSP$0)F*MN0ibzR1$q}KS3K!$?L({traAX#4KS|y;f<>F z{zP@L?1zO5>)o-gxn34>K7e2zmgL>I$<0S;z3TgC+pC=QP_}4JCG)9F1UFRB*!)e4 za-KhPzQQY&z|bIUkQV(TfAPZ5!0^2SLnQ(;d9SkZ({D2*^j7b0K9-FLf*JnWMXKiB zu+a9AL0ga*O-eqt_Am~(M^^S}gS2>&y{g9nfeq$G+4@g_;Xy>i+`E3>p!sgw6*hmX z+F4pkcDA}kq9$ABd8SE#OMo%M4HLC3O2tc`cWvPvcj7GC zIBb5zGQG{PNvw;95#NZT0`KEZd;V#f{5lKIx?|u>n}K$>KIn?&17}daTwNjX$E-JFtqymQ z9}?7*O&YEv$->GNR9-8j94qMhS=e3?)bF(&UecsGE`A^dp&2mat%6~+Bl|RT1?$G8_FO{5*2HZi5-ftNPncH4OcRz%??+{RoTQ{$u}C^C|beG+xETWBZ` z;^C-0#<@apX@ZE|zyl(b^imo4V!r|A)rsy!pu+|w&Ty~%yu_m?OmI*RcfnC(c< zSl@-^gXN;aKln94w;gePIRr&MMV4@tT#14v1M?aGm$CQOIEk&BC2P8*$M4yeYVfDG z_pjF*sog*LgaC6VBmPYnDfVuwod zDEW-EHF$rSPCR&Bis)^)vz5*mUI-YXux3-#^Of5js_<7JIPJ1|*M4!gP%H_QX5a+2 zc;V9J#4#btgT@;K(7>vvSi=vi)!;?K=nyyiv+mb`cjhJ74DAoXdFTyalU}A24y|3u zz*W6QIu@)Lgci+jsnR!gzD1Sfu2y39;G0)g+#ZEYmTB_^wcz)($o-sb+z&EZImPnY z1xfDUO$M68GHEj_x1H1SmJM!|gU?_0aLe`sT+TwE>-90ZauC^AE%P~Y8V0tyP_B>}X@ z9!TSXSbpIbl(}BshtVGRZn#4|%HXO1MbANb@-X5sg}3|TCrZc5ceidWuo@FCQT~lh zlGYXtoXVN)87K5+Tl6bt+dZABFx+3)!gQf=ohuZicuS1yc1DiV$~#nbQP}!EUx#DA zzrP9p=5$#7RoA64h$Je(s+v!sxsIh|rDM&SY*Pw^YBd;j`EEgiGllYOQ*RcI5Jj;9 zw2arkIDTQPR4)4!IlfWKLhebcat34yJ%BOHb#!oLE94#C;wCn`t`{xNu|Kwt<4*Yf z0iKkw@__E17O_YNpP8?UNv&1NpPHEz^Y3SYq>7&ClhqrO`-|>*P8srZoT(dh>L)T} zLh|NxL50NCodV-CinFHq%=P3hZ@KxR2$?_?=rIsk1jVGYIiq8rpuWE0!sWH(c=r|> zlxyRSg*Zqge#j$uuTTe&MrXD<;cTP(ouzKNx5cGiehKr{kU(Z7hO8 z8+a@OA4dbEq#S1OFG#G*2q|G)s1RO^j-H!3k%l=4DLaZO?v*hYCGhKpdM%+9GNa^J zSO$U3(1FBUIJ5V6SMPVsE+J!`xmNu(Rg>c}GGp40=YF+Vaox-Hq~f1@S+h;6s@{qn z_aHI6nX@6D`L@jvT@R=ky*@UOyDmW(IoQT;7lnpYo<`OB&=#m^*v8y4F)UW<&2AeO z2{qdx%5&Wv+P<5KsPw_~XhMDU*3!TacyEkpv?U6l zpjf#m5qP*P@96s*6+zBDVXc}}4?-alqBcVK8mwN(r+Zx~d-Kk-H$nK#B?WH8YQ+B{ z$rs-3(gioqg6kVtC_8B%xhw3-7BBKefR)Sxf$a0qyR|`?pX@YpX#bfM*ry-{rt0B^s#u$ zT)3qXGKEWymI1j#tz+T}3p0&brnnu!**$VBiF(WN=k<0raJH4_8jc*ersA%ulHz^+ zlT+211-7@%qgSJ^{8k8m3^oKgo31EUie0_P?F54*qEH}~0M!1Rj;cKX85p35TOiVN zr(by{upD@zNVkS7p&SM>HNa9Doc=_=IV6VS5fsvNuroOnPyQ2L&(qWXo=%!wI*8Ih zr*AMnzhE;*{mZ~&R=7v(3&k427$@Q#hYei^H3TP(H2=09}1uFpy$LQak zbDMM)=2Z94a`KCnbYt1Q2qU(&iRsDjZO?~y66kFaS-nFy_aI=F1f`T;yid>yRtfYk ztbEg4dAmYI=$t)m?f@D0QWWUopVi;6Prv%>Z?u1rh$M43upJ{zHse*y??l2_b#GUW zAv;KJ$C({LDO}l?^0U2s$p+Xdz&NPPxua(_gR0Mn#d2u4dw%g;JQ3xoP=iRWthk27 zi5HuCXr;}MHR(J+Sa(q|$6i91O2r?ngkC1;BN$I2!^Oiz{H?BdJ_OWm?C?v+tZNiE zu<#yPAte%wW{_)_llhx8L~|G6NOuAfw@S5bhKqE8x|&~Nzc zvn@DiEIxYrTYH;9m2-wifmgnV=KPYE#w6NjYF8dEMeMQ;5n~9GjMB7ra0ib4_xA7C z?O*FsQf(dX2A!JF>#>9EeHhz`PsQE+$+Br9MJd>P8KDLak})eH1%nU*CK?yzpeqYC zGb)g$SyWwhfalld*Z>_KS6C zb@|jYaYYUtQo+Tha1FGuQc=8J#7~|6x%?rB_T%8J+oTA@%<<5CD zEL7f|u4c{gBH5RhAP`XZy^WJrDwh?ar*oz%0-vDA|F*ST9uezn@o2ObE2#e-y!-mD zQI76iw3h#f?hQS_E~jRIpzQO3;MWtHix>F*`gI@-Bj=+KbO~5CF?F>%bj9h=M8o(0 z19v7~RB|=C<{sd)J*xm3itSWYT?|yhnL4lh1Da`e2Yo)4MmTJ8N}4nH?{^oTA2T13 z?{^!Nuh-eCy!70lchk((QJ_#u@Z4mjzJUkxLksV~Uf6xGk2RO!4q_xI>1GqzqCE!@>vTzs2L2vTrnN^In(KK^A0tDRHAXjQ2S4T3Z z$A;XyDti00jM+D0`HusJN7VNymH=ANm@`{@>w(Hy{8ZbGkj2gqduEQ<7X0qDaf?p= zO9KfO&;+xSZi6bG4*@fLHt0k~fUu204B~&|fI28m9EbsNmnbMB_L|>b)HK2(@HLR zhXT&-G4*|W{tyyU+Z#O5Aki_l`Fa969i~dk$e>>b-FJlGr3QDdYB#YPz@}um8$YTS zQed1!{)_cf_C|h5`SX4I0s z-G_UI0Gwqb!B!1weNL^LEBM;Xj+f6EDxOp#Wv%=v-QB#T_^7yxH#2FD{`<7N+cl{K zsj)T3I3zz~p?ma`Yi*dkinv>l5-}A(r>pY-qmqN%pC#GaW3>8u{Mi;Ma(mxMi$N3| z0mR+%YrruoB`8NJJi{aL;?Wc0<^To3T`ioej0D6#h3nLC2lI0B$iRE}^O7@BmR-n3 zO({#BVF6GgK=Kjkg`RwwGsB@a>_wq#md{yjPT5?tB~SvhC8duY7$uL0G=ODn=@pUu zn6i@Z_S-^?9qY4lW8^-Fw&FmC%Z`c9AO(G{Q?tusn*+BH(E6kUREZ zKqtxjEo?agCu{?3xD5@`FSmC;R31SvLMF5dYI2EZ-75+f%pJ4$8~mMEzr$Pb84|qjpyXd;O7FKs&93K z#^5iErh!Hm1)__W`r&rC1el|L#>(BI*em}l&Jy?{+#%}n5aQh@Xz5!(SXLoS1W7?3 z)mDIYTpCTq5X2KaBuA2}o@?SnPOQ?Po7M51%sx*5jb{bLnFMI|oVu+JYyKLA%ZRGI z!35jxUKTV~nM%j+JFVf7bb9bkFX2|&qjm7WBcEiv>OU%gsu+0oAi3|_)Lq}dx0E}P z(RhWkqOnGYz&qRo{WYxj6ed5Jdw3B!=J`4AS9c~k`OZBXNN_H>3#6|U%V{ypx2vb4 z*{tT${=NE-#P&=5{{xReaKB$NndftT2hKrD4)d$8>ou)9)Oo!gU3ah%j8$c2r%#pz zwjoMxFhxL#*$@@1%l*aIc~yqaMpa4xDIYQa(ptf7KxEx?{W|m@Qmy7J@YyCg1fc+# zVsktn&oLfo+Z}W%l(GgSH2$NAOi<;^5f<1%#BW3@^l zZ_&HT@K8k??`wIidiwvEYHp?ePPI9@?3yU>g>stS`wzDfy;eK%R_&hX;SG)h{E#-s zTxDqm5nTm2vVMSDELBO`I*3c9%=yNA1!SYbg zB=+3aoG1fh-P5X8XE!9L+FkGub``B&{`X1Aey?tD~^_MaxtE!psU|wfEW@_j{=O7(SLGHjYm*lio{S9Y0VL_*J9nNx z&L4vvFo}_nmYZBrPxn|qVwa{#E-913;VE{UM&iMN3i@x0r#gTSv-n5zvy48&w%E3dnw+oj({+iTkjDoi(9X8S z7|K*zZ1wL#*JRi9;Hc4rc#`t$Wck^^oc(&Kx>*q_eyruD#u3EJNdLI&a!Gl4*;GjsQ@ZX1zYg}}rXJq+0R9{dULxHO;q zl6<%eJU8%ZXBw^&cn^8*z>AvZQ|7zD*x@HNj0?;^&&*T)34Rp-GW72*OCN}C)3QxD z;5fVZw8P2%r`>})xc@11&GR8$78$(1KjALdPw?^mwB(`NCmMG$&wZypja)J{`_$>= z&p*j~rfv`FY|S8+M2u>U_-Hm&&lPc7_5LoD+ne+As;Hw-@4XFNpnj{y$NSmMn+Xa7 zY^g77rtq{Wxd}I=Z<4#6UoV1hcXPKFqNstCH@uyQ0CoyZUCfZnz^ZFF^ezUFfie;~ zZSJ{V8}f{(h=eJ3c4Yd#F>IV>GtlpsOkWUjJhqnhLFw8D4DrZg1pnc# zx(_|lAy%%H;H1-%6LbpBzRd^2EXZSKQp;KWZD5my-XHckHui0}O}w5^kDq1sY4{m) z_-ug$e*78}fC!+u5^=EGq^^%5DyVKwO*0oIwCx!6Uc#$R85$W&er?M$S!;BD16ap;%^Q$rbnKI^qt z0@MUpOJXr+XfnP{_kkuG=Xj_w3Z22>cc4_=)eOedl&_+~J^GzUZ_e z%a1t(g!kbX8g8yZ9mTDp_Q())epZ<*wAnQo?EJaSsJ&&Pv55ecI&=IK-DX|jSFy?9 z9)(-@)j*y2{Mmp3!Z5>B%Stz0b47e09*P)Dq$frm(2)f<$Fm+HGyuQU(AW75ltXPv? z%T!&^VKZDDu$jSJ*0}yjnkAYMGkF^r)rOLonZ-xzz(lHXI6h#~2-5VtiR^UIcGWB& zU?6CHh?z}UNUhTXuPHZa@zarDwr|pcgg!*7qba+At1;5Rn@lI2sEzgsIz74FsBuo!JVKyuDtc}ww`sY{no3sHVn#VaP*&T_j(3P9 z=vybLz+@gl+wxuquH3>%Vu2TFOmK+NiY@&u*|pjXSCdw~>oSY3;TSV;i8!m=%~{~} zo{p1BEe6_^OS`@#0?-y9%ve$Aen#9sw>Z7UI*1xk2{yp(ugM*p13i^%0c!27!13Lb zBgf+G0)5N0DkT7!Uk#)Q2BLt?I*vkD;;F8*1mq1AWiCQg3}gwg;JesyxVwny%t`B< zIgufY=FBx0aT0p^p^X#R4MN0Urjj*fP@L~Uq*sxfvZLC+&MwL$or-^3oi}r7Bq5*2h_A( zMqSK)Bxp)zk%}k}{5&R6zJs+yBZR{qL-D}JhTyeBhD6K5U9CIk^cNxkz#P?n>fr$Y z)Xw-??;dj@Ak}HQH)@9cx@wBheUf;)rzZ219)}%EcMCoB_C2iDBkRBuP1n9#u3f%@w_6m|B zSPT&Ga`2i|d6oqCYb~ZWNS0Pe93Z4>h*XtJLNBpwOP zBLQF!x&`3RRA1>VG%V^Ybd{miNsSUnXdRGch&(F!W=D*19ucw_`cwWcE4P6S&+QX` zx_WM8L5olM^DTr3o$e`A#L4!Bpmnkr-oW8Niz*#+YDMk0zD3nND4`&-?l7k!2-X_O zmob{}Feq_#*q(s#bnqgrK7DrFtz9gM>ZlMI<4xei3E?XsB3%7g+G^IsS-A?_PSrwU zqZgA3k7xsSvba6Jym|fJfBBBOFxkxDyL518ax1&0C+kUJQN_rCnn00eB1AQcECCt1 z`OUV&h%8%@{6i3k*%E`ieUQ?;rZk)YStuMN8JXw zS&`yK3pGAqoVcpJnfl%7JhUrnX~A8|m@;*d?Rc2BIo|{tjyovS-D6$hLA}XMUo2G@ zcehEwdakfa+itsogSfl*p*D2!c(f4YT?q>%1oWZlnpOzvD(#xble~)Whi@?XXG9EjO>2jXJqI5jO<*Wk#})uIpJ8|U5w=v4mmqIvDfU}bzO{L zlc!#3rPS`HNi&5`2OC|q2Mo7$ za71&&_(w@Y{;3^oTbe3Al`9uYBzXT$gino{bQ)1f_aK90d+DWv2*oq!iF!IiU%WdJH`EE2Rh@LVK`0 zhVD4N&4trCUTbtt{!$dRBS$jg+mi2Frr1aq5F`q90x17M=*S#q5DhIl<^-*mzIyTB9(A^?Tt_y>w&2c07Dtqy7; z_$8kB?;g;{kl8ug$%&^3*uAx#JMp{=p60qE5<;~YV?Be1^;mzw_0d)ufK|{&+O2%F zlh0ShO^)r)GNqCgz?`@3MX)(XWmP%4x|xv5m?mypICL@W1z1uyiZ92fTs#GIQ}{y- zz6{wzw5`%-*@saL92%+YLRS$wofK7Q8NGFY2Z+vD?L$xB(y?24=5~1E_UG_Z6MdQC zKGB{}O!Urq33RI0qd%P9Gphe=GB_0MXQC7uk_eZ@&Q=SK6?pq29i(Z|udlMQCtvKw z342Rg?8#r6z8YR7!r-8_{@g6HL#`3&ReA%jenmU&IU8BkBmIbz&?=F?D)n;;w3N|a zvA)SukV7SG@QEJv;o)JXN7OSXE$h(+D$uuPo6ye-@Y{+(^~3iXBFhkw+sHng9nwAU zd2tdmh`Xg%+lm2rDwzitdWFa?YRU|z{vYrfk)5zw>|$^9p&0J{4oYfKX5nr{TtF0U z3AnXk5ghFP7Ew|YJ*Lqs1AVwRA39Afg;5zj3Tlxtc!fT^39Mk6B`5*NcP$n|Yk%v- zhv0ph)`0$jc53c`P``CXO_F$;s@;QoJ9pdWhviM$owjx0T+?1f5-FM44rT;Qv#qVB z$z~fd6*IMAsvv5gcuiUBb*N4s&Q8jd-Wntog+yL0VOx1cL`%djYx_veZ|DVtu;aF2 zhbIA+-nMnlp2K1t=|h@VarR~RM^PSj7G6!c>re~d4pT$fnbu{e0F~VvA&CSM`p`8hxjH4*rFdCtH$-*U zp+0OvUDFdH{Qdrr374gBx7*Z)4uVlXQ>7nt8uj ziei7Wu}mP#(c9U=_`$s4;A-y;_@54JAz2M2(DD<=V1hYdk#r1r-&+%(i&(Fl!tecs zD#z>Glsa!C zV)A|f7UnHNHv7N@}9S01vr@C4v@Z9eVKbVcinKoB7X^#U@I!a_!pIAPwQI-Q$oLX5@{UaRh!q z9!y$;PLu*elHg>JPMZ^tL9_d;3${C3%P7eKunkNL)&E4s4C)UpJ=^Fn)h~CU=Sv={ zhYn7Y{8BY}GO1RRU!ukwa+=(|heH6AhL?|h|2e-jp*#K`8rZ@AOM^T9fkE}k0nYm4 zx8H>2y#Mwa^X)Z1>XQpW)oHUc2*Z-q1`I~JzB<${pg;6v8_*wcX&+GGp^4z*PkMh~ z@QX$p-9ZdsaEGBP+9&*hzd8Ky2_1~q1W9O`esdz6MPyFu3{8M*3sK}3TlFdiE`be( zMj-sP-C(GzE-_3~hJv;m+M47|hK9DA3etu6b9N9swj?70-DoQ>wB6Hb$bCyo^=-?XjwqbsKeRL~dT5=?07s5W0xK(2fBSX2 zTR$I3qoBsvQCAg)FN+#{kHMg_$qA~iLb!|IsS0*)Do~(D9}3X8;$VQzTpkV>MIRgs z_*jKrbhF1RZ9c-U0#t4r|6FRVsF0SBE zEVMq#xy=V{vL0JqZu7AQrKP+ErMmS%3mBdaH4>m1P^6j&(Psf!7EJHF4nw08ZF?hQ z@btu?sH-LwnEoL8*Qhvpv-Yp2*K)V^W5k`Ewh=^7;cd?ACTQDvcA`^q$NDJg$o8@} zQuMl5Q7#l8wi4&ue+@oWi>|3mX}BC*V-P@920Dmm^=t5xdW7er0B_zPV7V569FQ#$ z*%qw{d}5DLgT=c&MKoZj-zj4@ZbO7LjP}no4LsUK_B$T zO%^zVLLb&3f>=N@j^C^NGjtK*Gb{`I6IUQVixtn$?tvEFINk>$+kLcSW;nnV_6z6gN*Ps4BP)h>@6aWAK2mk|-TUpjZ zni+5_006hq001Qb003}la4%nWWo~3|axZXsXKiI}baO9kWq4(Bb1!gtbZBpGE^vA6 zeSLr1Hj?oF`4p_PT}igg*v`J(dXs4L;@svoZSqUf?LKEIGDSfWYl=__(y|k!pZ#VA z011*HB{_D|-KT0}0wgd127|!>m>KNs?A&qSx44?lS(FGjWS1-!?&2z$@rXYCV*TBr zZ!ameGvTrGnsPW^Gqln zUJyc=JJ7Z}!F<8v#5reIOCFE!+?m9D?ks|ZJG@}gn8$9h<&H}KjD>9KB|$W$CU%`S zY|1WGIEef(9kZ^}r}~VprZGAGvmoH&^_7eb?%cWKhn^6QQPp-%7@cE+xub^E^L$VUp2j`{Iv6vj zeE}l|FzVcQFFR^rxUQq#`ZMTdHa&L+&DZ)Cx!lvJQt8n17Qvo~_c;XX8PuF>p`sZEZudh8AR2{S2(TC71;>izB z|51#;c=@dI!c})X%lh~7OOXC8P5>Mkm zcH%skvjqA>5=8E7jjP8(hh)Oc?WP6fG;^L|~{`-*hba2k5!G1MHW_P{+nXi3@z z&NEc>J=r<^2vPSk7!Q&7l23#Dh0i0H08;j8u&YJ|3_NH#@IlGOhH)A)(N3^=YVhMP zW`L8(pje4U9JxFk16^Lhm~4G3TF$pl+jZTJqqri>UcldR(s9~y3}3*28bgu5NbYwE z@Y-?f+jhU*U+(ogo!;sG-2-QDu-iU8*#FC5Z*{sm==9os*Nk_1ts+`mr?c?opm%z* z|KI=e_oo4mg_mA_J80?oz>hpUWH3u0fmA{efS`>r)IV|<$_~Wf zoSi7#fr3C@%rg!0(KflxNP8?qI>+iJGeTDDQwyg>Bw9b@D5E(elm;Ac0v)8<=ZFRK z1E8?jErEOMjl(M`yE${_MMA<|GLY}0R)PX2^CACLlz5l2Z7y(Yn2M8@D8ZU@z{&g zq(6+F3_jvGX@i{A?j5_Ue$?6RL8Mcj^7NXborBIg=<#F{TxPLn-0xIM-LaP1YPIrG zA=25o*-~5m$9KPR_kP#PmK^Tifi7_2QcZi;-8B=w1*o9~eLx0?VO+@AKH5L21zNkM zmVKg3wOIneC&_+YDkz~1Ob8~W-f>^7pemxXhfFTRQ?`tfm2g@USTf=KWCKNOhi!mS zhB|1t+FB3H#r2))NDHE%!T?6{BU>Tz%MBD`FCyy(WHjc-fgzOAxAMrl>%`vDne0oZ zROGU4pz@&8jwh>0Ohc`Hbk)#yI;xOjwuo=HV#NxX@Vx~sX_E2JlU8Ls?3mSP9B$TX zSVu&2HH57iMQq$UE;c~Lts}yQ2bc_awBJZIr<3OcO)#H{myJn8mMN*@Gx4x7J*alx zLMxjac?(Un_cZqM=t>JBO*~?>8pW&6;u6%g)v05r2><%SpSrOMzg+)o*M5`AU%Tp- zn&;!NZWN|Jz{=`ohM{E?3M+xiGH+xUT1KIz%)Fg9-^w+Oy!j^DTA24Ujl@dpK`OnW zPA2#p^f8rqBVAlBv95<@8*jXY%?-Tq=IPd1)@X0l@~lY)kLWbPCR~5>aP{!v>cNB6 zqerXbhpW^5U-s_pe*5sjqu;+@xwxp)=M|QP-{9k?<94U}*HcVq98}nZ*k~1q70d)H z9zDb{SvxRsKHha#mUQGDv1TO)6U^6`ViB<)^V1ch?!SQ95G^`bdj*sVVw1X70xfevZt3lgJ zk=)l!aU)6id{NoS_&bOPhtz5PgMwC zp~)G~s4iTecyjm4(fvQ>exd*G-;3FV#VqpKJp{%C_O5Ve$viB!fr@Ciiye=3@WfT* zBW2S$$DNZI20e_=1QuVQN z8P}?wt#@%s6?pEcntabAR)wj-xO9HzMM({&YmwZ97{Ovf2BD~co>9!aa}4N%ADV0B z$s`LATUB@(rR>sY3xYBUA|RnF1JBctkGyabj4z;im?HK92^K`Ckoz*T-0UWKBPQ_6 zSrD?Ue`<|^U`~KAF zCxhKi={)Ez?m3Ux6gUX-a6X}7?(8`W4#Nyj%Y$glqJ(%yh5b@ZR#*)bB21upeywU! z&fEJ&)~MY(HtU3PGES(-cIdpTkbv`h!n{6@l0z?mzQl&reVZ z2hpOjAx|jqutFYN1R`oB75b?8-E|gT0w5!YnoGx#BbfBDm+xWU-=mJlBNcvLnW9!L z_a`1i?Q>GbIma1N)yh3zhJi?&VB(yg9t_+-V3Xr^rvq&PcG@3x>Q}K+lO-d}64g{E zgjxctnSSm%e1To=g+yDnPDHALIiu4C!8aNLX|;z?WmC8}x6MfxsEydqM?zU>SBe~M zHA7h|p9zxbGU^8$AoN78PYLGULOw2Sz~*euFlv1-R6h756XC8wlFs_(>X5z8lvos0kh^+yySv{oUC z9L)li_b31aDs$r@T;S)_B2>zBE+31sx|Rf*qzg%Nc=Cr&T0Oz@Lx9qr1A>#BjM}{i z-}GG^s7-Soo?y67}GJQw4)k<_QTUfmF140&Qn;2H^>g z-XFafXF-fVgKlL~nI?N%g?jSpc?RJmx(H$(VcYX}W{J;n@ByIL$T4aw`aDGqBBLgx zXoxHGlS?U=y?B+ue?fe$7MA>MzPOP^BZcAnmO%!i@G-7gjiCtahmX@r>v7!sY1~9OEgB0z0h$2I(;@t>Gl6Ck zK#eGF?1XM3&w>mqh1nr$bY?;1qj4Ssj*>+J^~DM;%0Zy4ltpkSKu1XTUWakAtb^v0 z3cF0Gq}e`u zKpzAbS)8QiI)KxxerT(Z2X(uQD9I}Ia1yh1(+n00+d3Q={T`?ew61*0Z3sd!3nm%N z02(w;!#v9CL7C}LXviZu{6bb9uonHW^2ifK(_}WB8TBnhXlxu8OD@H7;)xA{u>vv(NaSN&6vwzIj$cvF)r_L`8aNv__;O8kWNp^$UD7o4 z9QXfW7IMGC`KDBRx=Fg13kK4-QZEVcXNcJFxD>yJCTeHWD(^LVGXD!)Kw|2$f? zR5)cPgVVkJL9dVt8YT_rTw3^A&YSYoHV8khhj4JpUkxb3>B0V=2c5k<$1C5Oe)L4A zKP)7FV%y|6IKBLrO787X9`8R#;}J90-`Qnjv+|TEZckZU*Hw6wZRw}K;jXqe&r#bb zxU{QL0{C0YR1wgtA>gxdaOnUKO@iEDiK}!)7{#(`YMbfwmTSDh`F^Q{j4^fXr;?=& zVS9aYwcrX0OQk)x{D_# zcnITgAD4FyEF1xIXl3H;(2=2YDHr~jXb1Qz5Ga#5d@m}&ico$*a}3XsQ$f|P3TlO! zsb%G}yt;;L*rOW}dP%X@W_|I|v|Kr%bQaWpGPOb~sR|w5SYkHdOEs&tE~rUVINvdp zt!ypqw@>?hZ#0SGeArPACEq*Xg2tG*u76CSjBc)3tfxXe*63WM|Zc^ z|FlZY!v64S^@ADzFH4Cv$S@mfua!co*cYUr1{Eusf7Pk4?LHkatq!QS`F5tK7_jgvxK&I3M#4RM|$HXV-G`3FbHtVA@B5SC} zTKk>WPD#VCw)Q)!_ARRY&W+bzb*H`ds6F{>#Qlb-w^jb@qkbdICv{}MvnlfH3ANfu zQ5j}UrRu1;wJB2T>94U;ilfwF%1)%)W9lXmWv9LE5p@%I`ji_9dyyAj2{uF*0d4$K zH4!fPPoY#@Sj$PZyJfF^pG>?vXwuzrfa3dwDk&-1kqV!X_w@Mi;NSo~f|zbJoQI}s zkdnKQqs{$=9J!aK&yX#=gvbJCo&d>?MbLVb#iRhM>dxt1F3zrbP^AJ=5P{-ugorV+UTW)ayIy}pfYUUD30p9QMA6WKZ)}A zx&_w}8+wkoRnG@s*zrLvq~FZWzo^-Hvmwgu*rjh_fO0Jp_Ujq0l#FUNwy0TaF#nq= z{FgF?|1!oz$cB@^KeyPG!r&dOPHFtgApDWhTQQSuD()7nW*b{~!$!1?O}j~(T4_xR zaKD1xtSt3QTh6Mseo5O|)zB|vJzHz_SNvEtt-LY&nDy2$RqK~3JP@ME$Yyh^7;Obp zg_Y?gXXY_q)g2;%rq92n{=S7is`~trXeJ6iQ%b-(UeWEZ!d$E2zfPmS3bLZ%kINe(JX6=dQMbPe zw5sbLa@oVC&VQ{|e-&VZmVccxzqcG_ZHw7BwVN!&3~((q{nu*$+qC_w5VzF+uW0*M zA*NBFs5zDDxfs+Y0hd{erEx$d`|TME;0ao-#Q+&nt{@ey_2vOppmpW~8<_`Kz}1)wY+@czg?6jv0{M#uegCa22&&mPF&BUpE1)IU_y5g) zzzS}A`vJpVpbB-p{lGPiqQ0z7cdp`CP^_LWa;0h%L+VxPuAzZl)VQ{REo)$df2P&uIgZ0;pVM1)w2!C*hmB03c94izqJOo4X7xMZeis7JdJE6 zYU|X$3I*+rw6UACudV#QSsS}S``S7SE z-3|K|x-z;-$b%2|r_|?zd5Nog3@X(^O$>Qc0?Z#gW@TLQBvWVDe%NiGbX-++u2n;> zY?hVul5a{$`fDf$|E8e&)f7~JQ@i|k|4y=}Hc(_rBrgb5(7!q$TLf433cA z5^d^$zP^nNGwiDjt+lsQK^OW76G=;{X#p`jPA>xh9bY-}(mwI4lt#-d5Z;9qw6qt>UN#wj753FBpw)u zy`&KdGbA86o$Jl`zm@<(KEOB3V#`cHOkr}809d4JD2(8U)Sn?SU>AzYZ8+H6PJ2yT z4YfL(9oqY+onD4}r{A7)kpR8>P?j<=KOZ$II4mqb1lH-=J?nlmY%yMM@)J+B}_PP72cBONZZRN zvxy;FV}e8Ho^z1B$w#++a2xZS9)=G@G7h3gdLSN>)c-&(C>~|0D@QUY7t*5N8LQXW ze#*vC6&-h5Wdk3N$AR)sDIHa6q@1aX56`kveh`Mjem+5wC4u8SQNDv5R~l)niTc*SpyyGcb(l` z)eieF#yEH17>i(QGCA{iA^6tB6>lG1X%5%ke| z*he+M?>av+GWT$jC3n1{a3owJ$Pzn%lmV=9ae6brjDrcCKPO6t0djr!>e;K~N^UXZ zDVjc{3o^?oOppjhU!Dg;$n)v+5-%NgNQoptr@!S&(#lsQfbRuh0&}Nhpq(0N` zxLFp}>)kpz+nkq8(06JfDkAAtn_`hf41k51qexgA*+|`YFAaIJD#tqb@Z{~wRsd8^>`}GD6QMEc-cxc*CL}SD8taLoQfdmXDJy3k$q4g-G)=2qKujo7~alI?);p} z=2VtO?pek_bp6O)4NLLws%1G#MOTv9LG#eMNY$%SymT*4`+yq2HsymLTDRWlY>7!z zw5$=nDXWD7-nUgHI&D>rPFq!^Ll^b7N$P^N$DR^>i)bi0=P-A2wQwy@VzLRjEC6rL!ULmp$Lh zBHtempnb<1v{Ta|iPp89SigjV!ir}nP;76D0@oL^(c)8gKy~SP5)gMeL&vUv`s1IS z2Xa_ZF9U)k*WZQpu-mvU{4#jq9ekm|YTUlv#@IOmynPR3Z~vU48fs zZa(BUxdOhF4=B2Jvbj|2;LEWN1Wl7q4!!8#L%pwY?{VlJ-qH#ey(?I}I5fIYXmr(J zan7(ku=O4oie43N!kt1BqHf%&Li<5S^MZr@zqmc*K#%HKLE-vAt=5FbD8;62^Xvfk3m$gNM>%CsvwX9M{)0bF@&@K{Op|N`{%mD|?LcCsQ@FZc`T%D{ZJ)bvwG9 zi-|>#99FCa;zP2k5Y$#%%pSHU46mdl@$NMVkd%%cV=Ziw)e`O#{IwwsLEy3$h*?)uO2q8&%=g=@6me!q5>}Rhy0y ze3T@Rv2?F-g{TbmWU$VE0$rbjfoWj91h4F0LE#94xvPbUQ||ocQRQQy3T|_s3pa4l zD6pJoC(lvW53e&$`10Nu=wZd%wY@S_L6t96+|nyU72r0v zEZV#>R3X-SY4|etE?T`ZRN-!U1Eb9=Llx+C?p`cmvrG! zcG*w`x4jF8lFNoF$ZcFWm@XTtkp44VI5c$T7jx6F)?~A{#%8m%*7#EDA2-`w-l{oe zCF$2PrtB}jkR|1&W|CH@wDn=5hebL9DPRTbn=x*3tU#y%$!g^-f>jXV2}Y-2v4>Z5 z#uv;c$ID%e6-tyVnDlwHlD^(efAK!gASpBYkJFC=oy(v+rGHofP zyA|+tTRFI`Vz#utE=B9l>i6STp{#~R0iMu!ZoS5MiEhk&N{dQ(tFoi|6-{bC^Jbzg zO=R1@=Ie*Dy}5=9h#JPg_9mrgXUH~Cg^T!9s(2xdV7Vi;&*Oj=r)YFG zjlKCC2U_Sw)6|>F(Ho~xL`u#PX@Wh?RKfoFUD41~pWKfv$MW#begvO=u%5SPUkwca zQtslyod(G)9k~I&H?CJL|I>92-bLfVbNE*;gZSuRo1OPmd0 zVp_Xc!qmo!t?$Zbn{DfQrv!+pt4cR6Es<|;q!V%a z&F{Yb{qA0W-@SMIVE=FZ{`=K0f9(>H8pRcJ)oy!c$0YW{kP|V|Oqam&t#q4{<0??g&N&7oFxo^f@BGML z({@q2_YKHk{Ut02x7ii{oRhNrNKAH@ax$*ZtJEn~6?C01@zUwk7*MaD+2NycWK{*6 zA7RbBRA_(V*$GuZ;3hmAhlf2GL=lui!rJ>=commtGNp4X`$l+vp0$Bf@gT`g=uqXD zo;7~Pvy-f5zvA`hR5tS0zWCQT1kX;Dd@oYi6_NcADL-zK=SYbs&!+KqF8$2t~YIC{M z+HEe#wn1EKRt~gqYO|`GoU95b0;`?U%6cc?;5S=et%t25v=Py1OD%|%(tKFKm|O*u zm1I7sxVIuxyJaBQij)(omC(axMO3pwg@hF;DHQ5t*~Bc@>XbH%_6i6t@75Yg2Q=^6 z%CPRO?NIU@Vr8Ojch)LJ;`SWT#edXBO5Hxn*SNawKX3b_DhuA+e#d9-JbeBhz~?XI z>sRBjo_T#G7v!cPWpPFRSesBu9||$^`7{bXV848iqDlahvQDBEmTENPsXVJC`3uE6PAord~>d#H`D@6yGWaezLmV7Z?!%M(rx|AGkEY=BM{*j(=EN>i)qBHnhz zrYz&+U+>;L9{%Ix|NZ#t&9k?~Rk;=+M}mi`6lgr(Pv>c<#2cuzlrg1XqGio6M1Q`f zyoc}5VX^!Sqj=1v=AIIGJSFjXK{YId=LOd@r?h8{WI_AUdVQo%dK6}*z`5-*ed zz1a7;$V0ONwAdG_WD3nx5G1@jbd(3x_o=QngbG*w;2V^d)JIyf$*>l@vLzG+j&f}^ ziVxY(sTURjs@K6qo=S^$GA0&bkQmV<|E92DfD?e(ybhuq9Qw2K2};4T+JZDErzuZ$ zN)yz?$PLUbfzpgO!0X~bqDjDf5_+;)qI6A6%S%EAZ-<8xKPq-qh~1Yl=wVOx>d1@X zQ(_A1r2UtnW&{GRTIzUljxmV(&=rXa^LbE2_b5nEZo$hAWD*&Tcw$C*Y{o8CG=!OC z?iI*kq!ufqn0sSiEe3G$JS24qp`&?VDHj61=}o!?68cc*_L-Eu{Tb&{@6%VyBp*iU zJc9mL&LLpYHV4j9#y76zyqG~x!yv)#5_<6$Goiwf41R4EF68j#1rIM& z!i7?|jboon6| zXi(vE5_*Xa=dj@ngk&GV~>S4BIPYVp2 zJp0Q}5EyFgLR@VcK$T>>aR$o?5@T95*MJ6ZGgVd$tDSTm*K2SLFRt*bj%iMt!84*N)1z0fatM3r< z)x0WWeDsrwOte<_H1@`LbRfgbONuyCuZ9_&O>x(kLNj^FAcK+CkeUS|p%VxbO7>E6 z<}4~jfLS&+X4%-7T`lCm2@Xs^0V)axa(^yRlo`zBc$F83D0+ZM;7isB6saD(019op z@xa6~?D26{S_5nX!` z={FIZW-nooQrH9qJthqVD5SbPFs4xqYu1zRLJf;h;PtqW$jFnhxqj-6SKKpDdhWqx z0n|CJ;;G#8SdO)DtU4)VlVq5&l2FYc_{`}IkR^qp9AXGPhB^%NS!qY(Q|Lf)sdT-k z>H$)*3M^FMr~r^pQEt~0w~nfbTSp})(y_}ds_J5Z6R;w|k7@$Xg&Dm?2g2uE&P6IX z)Y#3T%uyVh;bbc}uPHT?L_luHR7lLGvD|>1XMv(z3DK-LpjaqJD`_h(3J;>ExfVY` zN>2i17ZDYu5{M2Hj{Hh}%q3bCQTvZxl)uj3(G+Yz8yAccV9?Ih69+Q|$!(gH5hAwK zVmkz@3?5&C9K_?XBsgQjfxgUX3dY1yPR?AT4VLVt!2-pziI%5oc37}@o+g>f>>^-3 zTPiD>g&O{g^Qk1v92hxKqi-CBlgi5_it%|k)*-bp!k}sg1%raTgRdr%X<|@q+hP#< zP6uJs>Y&;xU+|>@8S`TGazSa4&>&Hp*6^5nf_QRFX9IYfPj+K#H0JZ6a&}q3o%$ra zxjOQI7ZdfAz(63UDrt6w&tWhbR+fJ#q3M+Ygab4Y(phpdiMfX)qc*J<%v0Ogu=a^d z&|pw4R3@RsHwYyhpveIrqu>6VFJ*h;yeR5mT$3Z7L90OWmjfA4i#7^K%<*L|U>Esq zjwbo2C72?nYUc}ET3-Fm(9T2CC zeb8rxqg*Ade&+K=9|3qRzZmn;~ilG3x?ndOY;m#qC1kh6x~U&IIMR-#BR6gBBt!tUQ6*_kDIG89rkds3b9hN~7%?f1XAcKh()CdZ!^ZRr4wPu4h2>q_z0MXXGK*8YkrNcb< zT{KAwVvpEG1E@ZFzOXO)Hui^)5ge(K0)at-(>%lh{1mOLf@9Z2Tm>{Ka$)8c3o4=U zmzG5|DY_^cpUF*GERFozYI0R%hJmqeV#B&d>5W+qhXR|%l z(i+mU1fh}6br#~D1gid6-{$f58NbHkUK5&}8)+S`#j;;UVNn?dL7pmp?3(WOO8M`pdNe7m+4ymFRUB1LcxzEmT;F)@ z6M*%cwhDFvGNn<$LUmOSud&3+r3~*c&29sf--@EkG|V52Jm~Y|Aw#SKAkQ7PRPBJf zV4}j1sMx?GwYD?ObsFe0iPRCj0B_QUKDvqnDaS`eVxm6_%Udnr7!d^;=s7NR~|h_dGI2jg=CqsOsfly5=h5o_8|_DBzI~=cu91p zLBTRSS(+xbu^w=FuiOQ=T^6(-zfHr=yb2~)*sohR8x8|{aB$><>39~oAw$Iik(p}u z7O=>x7!h)DhgY$6TAT+oncPR=v-{Y&T43aviZ|`pzX9COp}`7VA2$P#9Xl!iZNldL zeTj?xdr)s-{y!Yl|7pS&ld3Df$$%1i^Fd8>RY)M{-e-wk&lEZ=)lz7CS;`TSrQv!x zjvvBs)i;M9aj4|PMR$9V{o=Va%qO{109_;+!#cxgOiKkxj%2NrUoA?N*1T}u!`oi# z*i;Z*uDLWzb~FD8M|*v}u>5(9r^}aLhaUANP68_)r^Qp`9O(5!T&QCi7`1NF*y-2a zqg5b(ItQ}ecP1K|m16hXks?68R7z_-*pf-CUjA`kccgRCGC z>ItYYu(v<~{@t`@1L3f^wTg?Y3dKyw4yMuA?Huf19v05IZZP!dA%qA+XAlob?`Ves z_G)nJlML*qdZ-h#G@OFF85QtJM7a-YT}Nt{a>ckuX2*5WdD%mEKT{O;HfFq3uZ|dM z#n8VDyi)<#TYIcwH@4rXg}$FaO50_1KU|*3Tl(Wo|sPj zTxcgnI7VDv!_|w89BrQl#KHb=Q|wh2YZ>5UHwQB{=ApW+J=`U+wBC&}U(bAHA$|C0h%^bE{Ncdj z#5r$w8UJN?WE!i+n2#GYzKE&Poi6i8CiT-MEbfLgz)V8{-_VDAZBoNP5@V!3hM?SL zR_+`#zfbHZj6tx5m#xqT}lebV(+-ke~I$u4% ztkmhC^f&T$H4b?(#`i(aMT77a=m!og1U-K4PW+d4#qUHv{o+@%asl}NbiN#%?5#|V zUGy#N?XCagA#{zOksD$_2)^-+OrZy?5cvn#-VX{Ft~>%rXpL+?P-Be!BXV%H&caAV z^khitXB=a$CiRBJ2oed|7=~99a*JEYuaLKS3GTgQNCd0Pm`eUE?u5nH!(XZg7D^1}Dyf#w`t#>g8IJ$YeNh!Ndc8-y{J`_D=t`&``AHaR(>>fOt9p0FwXHLM?3_Z2pHPNy|2FlMU(nT7N*AUjq(j zzgA#jupB;(rNesO8jB_CB5Xvcl+-FsGebqv3b$z7uMaaZQ9|(_XCBDrvn2&5EPgBPERI9Tgwx&vw7YqCh>Sf91t; z)>gGzNS({C&Q6y(M}Z2mR-XqHE=@Hl(-|wY3t3Gkecim;iJy`GRyF0SD!=HkmD$aX z$x1QN*A1*bD3&@7S|+LqnluNb8r8SzVPNCOuewMF3P?RaU%lj)OZ2MEK={1j8YeR& zhGFMk9!L#|(m>JEE(w=yq=^DO6LG>dY35zn5*|jGQ@?D^E0}t>L3uJU8?zJZx z$O(@XXnBiTGswn+FJIA?hM;sZ1T%q652Kr_Q+OFQOoAK&n&)#10;qNC>Ysr_o ztjp&k6tEt_`PS8ZwP@nJ|H<0lx?d{QMzR&4XmMk$Zz+zqN>dz1PZcgSEpkf59O?Io z{MuoF1zgd-LX8*Z`Wvk|5{Kj#_%YVGA7BC z6Jcfop9>o2;3GQO+8`dr)@X|S80{Wki}f-@Nr^PhA&{&~Y?EcZ@^PFS`qe~l-gRu} zg{=S_4cC?4h#!#G+`JjS{!Y?sr{D*ttZv*MKmw{2lo%+s;NQkoF+hFVCog3QQ5}4| zILI5<7uuLV_3nLSmax>0M5B3b)TuzcvTeo!_5^hG;XK|Y%W3u!qF?OJOdZ9M5b#%y zaZ5>h%9U26@Q0w9JQBBwBPSCQ-v}!(D?0BRBeg5DR}f4Nwp3;|coaQ&H9gu9{e?nj zTo@pFCOS>91vJF2pD58YFU$({?zjQ&*zkx7dV+ix3%u|6X0ch64!TusWKoc1m(Kv| zRE$a(-pwJ>YQ>6Li|OaEAgad5oNmZd6ntpl^)Ts~#ahW-M8F0Rv+<4Q4u*{oa3%rL zX8p(<6oIIFKsEYIAfEt!?e9f?=iMxtIby4JqnFMyUU2KMrV=(gWXAc4JBh)0Nf8(@1`Rsq5;Fne}>HW8avRbE} zT>Dh8R-L-;kft$byXJ`PR})Z*?2%Y{MwDslel_sd#U_sU&y5kQ5TQd}G(UyonlB#U z)b@bMUqZdle$C}Dr3u0*Rp7+KX~oWbI9KlOY7-PGk|i`mMkJr0Fuqy`d2rpF>OWq# zWeKs!*8oAZ`dAyIX@=x@?*zj3BoC0B$I|y>VWRZsr0t;6>?)`^fJn?~n$POds(2&* ztBLw%nV7)ofA`&nt?%j0Ag-*12dv`bBXF#P%wEykoC?MViTCjnajrRT#HC#3xVd;$XyiN9=Pg$sZ2q-(QD!Adg zM*#BIr6{Ed>fs3agM~X_uqB%i+iERd>WIWHj7dTEqWQsR_NO!xFj0?Nvwu2k<`6~S zm1n;&ISaPGY!Ekz)u*e|o~IugA^t`nR+6V@ke$(YiewFs$)=V7t3Lx_0#KVyY$Dtr z!&sFayQ;ci-u9hj8!6@vLcs@uL=G6yJ-bQcGhk*QQNUWoxVGPPpSu{XTt&a@dAvsc zP$kZvfIWMoB1;wkdC!J)P`0i{yXIjlD*y*JmcD}6*DdQ$A3_Ig?;!)GHwsaS?Z9YI z)IZ!J8v*`XfO+^_8uFq0RETC^cj&$bE98#PjEBybW?t2H+CeeeHV!Pu*s3Tt|2ct( znSA{Sqkp6>vJk{RfJTb?xlp;17S|Q6+%w;-zAsiBTMU~2ZfB0HoUz;4rXm!!r%EG- z>Ul-#v15rqbq&g7pxH6K!RfGdJJh>NnG>TTbyl)RE(tiuZB|9~?0q5Vcskz4A%ecW zU=U@{DZV|Xm<7A|P{rEB?kDnb%dtf+4UT&ExiWCc&bLi|4eVB7yokMlp8Ro9Z5+R- z^u4M+9@T14f55L)f3FtYl{C01zf$gMG)nQTY7UXY(2Ibq>chKx&L_<>p}PR>8pDI{ z&#YQPEq=@0WyU;3zO;?^%6+vUt5e?sw;!%;o)F&qk_F>K|XX&W32F6^kBnlE!4e zyS17&a9`rg#>Al#l23BN<=QWwmYVQS(2KZ@uS`}O-n6sMGWfMPdF*F$*Q|p}!$Dic z4h!v~TOyfpeq9*f5Yke=4@~%N&uSgWz#^x%_#_jIdNmHdXvn7DFGO|N`UZnCzqtr^ zfMI774^S1$Dyp*OFkcLOG7sQ9H=L918dl=J$05a;h=%7n4%;sGZB-6PG--%XG7pS6 zCxGZbVBoRHArG+?7wQnd`X}A+o8aiPpY85fi?j2LAb^Iie1VZHnC#!By&ocksojH& z?#=Y)in?ULF^zqlSP3`dxqH`!pH}#rRImlVTTg2)TG*Ayb5M4kbmAVyn$3%{P>Y%w zc*k~mbmN{3JOV~6c>|(~%<46s+{NQI3A$r8=AM=s;cgy415ynR+{*tQQ9;S^=XK#@ zrn~que$f9XwJv{(G(q_dLx_L?0GR)ejMYy6muwrGI{!yllB2*YKg7|od6*Wj7uxPN!iYO0NU+JJ(@Mf>&Q~{aaO&-CcvS4CKLTlv)Z_e9?nov=t z>+)ak_9#2+jAbvPF5rsZi}4jOj&JSlJQfaU+)tW=QJTdI_d(oR8`{QojHRBXpQq&v z`+tIb^vE(y1PuUCM+E@D_WuWD%l{kj-#}qo%iDf)9Pvj#&!}K1K!u7q4P^w?PPJe1 zXjI|=q&7&ns=YgPC*62h|kR2%-r{3P51fZYYH?C z0%Qc_CLj73(m!@xxAj)hQ}tIJSR2u)~fynL0L8nSCoptOc& z)_Qc|@d;i7_ka|86%Wbgo~mMbCF2S~#P=nBO=4dkV@J{`qWXQ$Ug$Dv6}hGSN-8C| zR$^$?)sZxM3n*fTdwPAlH@^jl$V3V*XIhg#B`8g8piSydiYYvwG^f!8%w7*d zG!w2=rNiBW)?X_85*^+pKf}@qDwInsV$CJ5Gzh?nM;;3oUjis1$2_LtNrg)EfW%FK zC;#H}oBUXXS3zf-)yDM`n2<@|Vot;pX9pgX;#q;sc(O`V2mO=NXvDOGfk%oASQ=iW zXs2i<+5H>!29Li97{7Q(%AezTJPUbQ=jRuEXEo8zR|mK-kWyzv2AeJv6;d9G_`!j* zhqsJkD9S`6Tc%kLJI0pBYoCN$xlOi7#ejvSr9ou}IUDmzP>8NVVyogXbro}sXo3$n zF{h;In26yNTm(CY89DeT8~~{B#&`}*afB&~8R)^Y1Z&WGBetNK z?(3HquW5i49!&boa*4=V_R@K|XbG3*tyfmYdBFZmrz{<_7AL#wNHIM5s+Ldkm5(ST zQCHV6vNDD!xJ{WM7~BH2hAQqgxP!IP|G~i!^;Y9iN?Y0)v%#6wjbY zWv0@!z@M)e?vslO$PG1i8(-71=Uv;|O`OTs2&bW6%iax5iapbV9k)=~#UdW5L>K`x zGPF%nhMQGg1~;`+XGmJRC>T!s$J2DVJ9|9VNF3z zuQgd#oG&S~fTJifh0zi6U-AtagpRh$v=w@R@r!u{iXqfObaSkZn#dP~ z0g9-NUQacpjY$J&Ej3Is-Q7xJT{cDBhYYBk%wG6`(0sYD)ZARXtYKs10#a=x0mBnS z`5iKa2Pm`HNOK-pfx&X<_`V*BX2SRghhZ^G(QUFARR=8_Tae&XK_p!M7g}^y0eQ?{ zhTWGm{P8afv<(3bxF%Y>ZwXwDGzLMVi?9>m8P+F!jG?-u=A_4;E$!dcMsT!ds_J@q?(PZ$(ILr2wcmDtU5wf1pwdL^PQfs(^i^B!({vHW8qbFsF7+cZu{)uz?{33JFjP)@4GSnK}AedNQqu2TzperYibdSbdJjqVnh{fbXJ8 zc?p!tOw^`-Ff=4JXe*!RKnw?zS_?HR(yXFTWaw=-t!*!fU-vXIm4`7>tjbS_%FjY` z=pENkQDMn1f42E4biY5o9nTsU3ko2wQe^A71OL{Js^s%gNO;5D?UE|oBo*KzRcTXI zQc|L7O}d@B`rB&1=PFKb;h`MNvZnfU;cwMcg-wV@v-ssFIlp;{Vne}TN)Yk2sB~Vr>fYK==mycBY=g_@-A}g0%uR=HtdPn2fW^t`vSF%{qR-zp%(>> z_#+vG?E=!K3T9i$QsG|W7Wr_+U+&5}8J3!|(LDmWBGsNgK(zozKvHuT?vA*04P;IM z5!>0U+4v6yD=ooz^^|dIX+mDzt>A|Rqdx}}_mwsvG2mkfTh(PU=Sn7~C=J@I-|+C) zZ4x6Ox1H)T_mmBbtKUFswROBkVn|oHXW7KE!NsiPgaaeG_AJw%emc=P;u-#-w2yUF z&IYzK#cB^C2_3KK5}@uM9#4dU2!jR1v4_VgsB_?noa(_m*lOsC0N$W3q%owEa(SvA zsI4~Ka4~|K+_e8^49_N^wPp!v7})gTC;DmL?QQfN=k;PesIH?TDk7woDD7`Kx`OZf zVdKam%&e3je-~(P2{u5yMFxLC?h0$j7rC~ewN7+9G^7u8S7+@|lSH*^`6>q~iDK@U z4#>g178BG9y{9au(~tI;Ym*R$QTJFYL;eVR(2x;`ATU~$jzSH4^`kJ6%<H>qXH|5^*gmgifVQHL|cn86Hs`9aMXu7B$$ z<1@Ph-1C_uWN@$LLFovlR11)+CZ3UPZ>T^f7Dufc<6W&rC=pA4`OR~g$VaHkxKMqf zm1F#{D$fR-zpXWl>0LXJpEi=w5Nm5-G$*anm0k0sU-tO^e9QXy-rIe`r{AHE(5<0| z1<-j6=<~X>6+j#EM>|5Lv@l07rbnc!1A;*LXMUZXp-=Eck*@ahBpPu2}Z{P)oOx7A<(832IbzgV}EsiUi@v&(@kFHS zj?Z5Gy79w{4x!ne$05voM1?$YvEi`~K9S}x(%V1T_r@Oq|BR(>lX(h`*1q@%r(%|U ztU`w798pFbadhwWwQFNa+1c6gPjfV=N?RBD;J-wGo92hl<%-WmlseT1G4ztk&xTg2 zO>-7&RGRJB4RoCp>s-*jax4|+`RVM+mu*JS6+u*I=jJ4Buqt3E{e%dpxh^c%BeP6? zV}XUJ!^4k{k7~yg6QvrmB|W00&zOSeBy5?YZ?5dyM>B{Y!Q<%KQkN$_zAxT6qk5Ld%Y3p0dRq; zu)*!hbaG?R559(Y?vHh6v!VJ$r)D#fnXKwLbL==2sr?F$i?+tRW71wina=MWZLzEe zC((Lss-h({8?XSTV&hzmr`TS2m)D>u=A>|dO|!u~bA=X)<7QRER<>x#D9W!+&%Cs4 zkMeq}^8vN(41MMcg-D=vtorj&p{Vn&xjDshS?>1wdOCXg?GjrO<=Rd|A|VpZ1Nd*{ zUFMaocbKAWQg-EtvZ=dwox$-Z7OEiv{7*2LKQ((XEu!F|@mO^pz=C?{n{nHviYnC^ zi(5ym-Gfwj-0EvOmJ-Bhbfz=7;3%8q;))aYkk2Uk2s2q=r?jG^(`>Sh)O>3Z-j5TlmBJ?lYn13RrebN2MxC-;yk=i!*mTNzqN}TDm4*wUT<*~2j55vU8a2_64pOP~Zh#p}nwT@` zg*^BfB3M_rC4GRhy20payTA6?c}i=`k-27L`$H26WLuhpjX*8}x_Y}r1b zIkS50Of%i)+}8QIb1PP9EnI!Ynr!%{%#6j`akrEJii-dO*8K$xTE#Vv-)vTI!yNB1 zzz*E_CqtFtHao`npvvW=mgas0U$F(xZPw)pFuXEzOdgVRmza67FAo#4OM{UZ^A;bN zrQj_5L8WpzOOvii^gKb}%9h*w9X0NMqNj4*ZDBM-40e}-#;1E0{3528bWIez#LEhO z3lE%QY#3CWk9dhHm$xd0pnz%jX!P2r2*O!8cGbJL(s){Iqk9Uop4c$^E>)S*Ikke_ znl4$q&r_o};39E1fc({jv_-N&AWFeA#NaZ$qIAE?@-AyU3zAiaC?m7fmKF1u!r=bM z<(W|ug5>$)fqapI#2mb+uB-EQbb*ul`Q#9>w5l*bSJWQ;p}e`EnZ2x;lUcNXO`qW% za`~~zSq~fTD~Z#$D$i9cC)fssAWsXB?tcQ0l(>l&X5a9gn7z-p%l%Pb)&8q_%$wZp zpa|RPtjy(<5tpmGIhzywnx$Px!V0EQxHO)Rq7eP3@$dp*;))f+W zh-033pECy~cmTQ}Vr9A5{3;W~Ev$Dsmm4aX_)!o{cY6kl)|gZs0~c##A)|oW0$aq@ z64{KLH=Yq6l&j6#1!bNVq->W?g-ZqdH2800O|CXJ7Jo8et(BT-O+$usk$4kf%)-R|3lMCZ$kuIslX z-iWK()VoojB2Q!A>#E$<(2AY<&4ZRIcgo>0jxbifF#kv!;=2G}bf7QkTrgs-Zg=Gz zYzrG;_imnPZcC%Q-8Szc^$Za&lFV7R23VJ2QcL4kPEgn+RZOMwlCaj0)PilnZf&a* zCN+*FF4S#Ob)F!fAI~s<;4ZSfBmd_kP3q#}3;dgZZ2J9(|KA^JH&Z8POM5$g{og#8 zX`HO}5Ccr;%^NBauT5HeuJb7d44WI}rIMICHA!yKN@+ySn{hQUzpvYNZ8QhNM^k14avNjvf4d6$zqXV7PoiUK=VIz)XK17E>SAf*{EK6Z%7on}147ROHJA{*li}%n zkw4CsmMtuctpPV^B!`-XB~C+%M2a*{!Bm@j`G_PAcR5_5MDL54IRc2xp?uhACI#wZ zVQRNb4r+;^Umj1iu7xYP6U$y)h^@heiCIV@n9TsKLrna_q-y$5zA9V2rNPdoL6?vT z=#fUzw4h|acU6Oskgem1IxQp=jrCtJp+ksS*fTZOHe$5+p~A|P*8GHq8Z}grZNkS7 zY;q}T6RT=7nlG+5maJ0zqzRUcvOMw=NiO-tw%t_7>;xfcRMJo{zLlSYNrWnVoq{`ZWvr z&0BN8gjy|bR9?7*mJ#!w%rJ<-F_(@xtW^)w(E%)Y}gGH5qu z%npsNla+~Jkus+_3>dHr&H4?XhQTbUQ!p=-9xUX49={c5l`y$vx*|#j4#yNPs6&H( z{<`BWnvM{E5OGlQ(4msqCgFDWV!=!15yASBl6dKRfA#_;+JSef)082+=Qjmf=OT`Y zdo7VNuk>m$+9Xru znWRkyxLol}-tG;oY2&%p&al(Y*Z2`Zd(6wCn41K^@L#O3*Nlr;Mt8wua zcb}-xJ^xpautu!cbPd+;Ubg<alCXRA(YVoDTabw@tdjPrMq+8|oY5B^^>d}Mr6W81t)ehU!{XctO4!+-^T#%Yk8DFmW2xTKJ(@l@y zq{<@(f#ffMtUL&}o|<$deBVjaZINk`bAE~VyOpIIo^g5=S;k$AI}hxt>&ehT#X$>y z$N>NFU*pJa&3yoPLR-JQn83*UKSye9WB*-WmuAO)D8latvoNNG_JqtbR0E0gJrFl; z7ZooSfx(|S7b9lUOt#)LS^~@T7by4V9s?3sgt8gBr&4xv zHi(y^%gpfQv7TI?TLicwzLiUa#mvY9jYi=is`PnzHod*IX;8Ap>8`oNT#$Q=+i<3bFGst zVH1#R!dfUXTX#~UNU2QTU7-rIO-IbSMfQirDo9M@Kq))~U|=m!?*WMf(J*}gSq?Zn zS{>uhT@bUd<1v6jEPKqI=j9~mXE50Ed6iI0d(zYRAH)8l>i?akk`}& zh62E-MP~>M?gEh%iWlwK-m9MgP;-f=ZSj(t{rQ-gxO@#uI>eXP|60&Cv;NryKr<~- zs^J9;ULRtw)9?GdCWRp^J@C!|j(D}7mHRmX(c}4Jl-JA4>F4d`1O}f6LTi3f#-G#e z>kdb+my#dH+l_6ieL^cMZEyIXqBj^jgclS&KM2t8A|0`BAzufAKX9$K?!-RTVpbW3 zcBebcd0A?PXZE+_?DaU{)vhhUH71L`jZ^a5nAbg%Gn&RutrEfBZKjgOg`7b_1=QJI zVQ+Or7(ss%#%tGv;Bo$1kfwn*`BFS?lxZ<{B!R7irWPX5mjf{f4HYKc7(@5g3ocXq zvku_bjfco%+aSTb5+J`)h#>T~HA|-_tkwAPwxBAnY|Fu+Y<2HTg2$H*Oc)ks1a@c< zJ~nb2{G;gM%A)_Hp31PNo~ol3kh0IWk$5issynP4Ln(^5AG4bo%D5cANM^6bJOEhs zz!$O)*s2SV5C4p?sEaTdl&uoz4FE$=pbY31-rpnz%G#sNeV_m&xYj1q>a+(ZDu6l594jb@(I5`J zJ@IKe3{}aPM+(Ro23)TyV3fMX1&li9Otn>j)9tF@&n-q|BcT-W)_xps(^B+wF$_y| zRuBgUPF}aD=d=Ee+-`0+Mt!-Km0Q1{1P)gP?#rL2_hrZzWzYGC?v3}&jW!MNP2#l| zz*)Y2gKZ0kL$iE#hX-`4ab<$k$4A&^K^)5y@`-bnDi`HCRhGCAlH58=q^&Kd8t?!=5ak>(#}aSs}19S52n zxi@(}r#G%8ZreGzzH33P;0G2B6x7YW;T;KYQ=n_G1h^(}NMNQyqPccGiqItWd2O!3 zoq^z%0mLQ=N!~wCu97Oh*-<5XhJ`}M%N+xBj~&9#TUo-OQ4075#?LW%eoIzRFw6Zo zzGrjTO1p%j-Y+CqDLHv{bg z9Qn(SgbQFY$8!=SHymt0X`9j`FR4Hvidfo5%EVKRq)!ylfpj)eesOJ78SeLy!Uo#q1HO|RQep=nekBAQOg z4Fb;wWJa0^*~B-APtOv6IBFs}FKLsCu~H8?bb^>NfJJzLQ_l$=2jZqs8vVvF71tVZ zfN2nxoJq04;DQpQv~^ZFpDxUzUFs1e5HcGCt^*^bihoB&!W9akV**1XNx<~fgI9>lMWPwhZxF!0 zdKjC5JB|G$#DY&4;~!kWsv)IO{KOzEWA%8^)r;X|Eb1T(2`*3031%i~<5uFxTQ*Mb z2MO8-&WcmZUaD*c{U-#?{zS^L6B=;(2FbOwNC2aZcJibwkqK*LN*?4%qT&Id{p!ZST+ySVI7f%ERwA^(g|oEqW~lsDGjK!qY-@8g%Chj5}D$?+g3? zhN#mEx|1R{w|r^@NzTOYiMQ_5@`mpikVMQ|g~<*+8N2}CJ?0v^M3;A9XZzA7i=;N! z=cF2%1JJm%?D+o$Zxnh8^bngIt2G^fsZY)yRlYk|#tfgk|Gi>rCKPSW+q{y*t;dC< z5S@(`DQHb&9{dNvkEkXz7;0&oS=S0E1X&&$0Hpdc+4!c`5_Gkw*fuz{#+|P+)rsWN zjMVKwN8N@=6*k$@QV@d+yUil|!7WFr37Hz|H9EH`coSWyw7~IMWc`b~+w=Fc)lqY$>FXgh24>jLh%v$5Lknq9IAOc@&!RSqy7_C0u9!|^(!G3nI zS%#|R%hpA`bG8KDVP!f=?m%P3lb7s2Yh4@Z+C-Us+O0BYj&5%WPv;U6B)9~ah1DB! zXAF{Gw#cU!|*=>65b$SRakXjDFeu3y1Ai3-j+}=*4N29X|iMPsMT0RO&P@F;m zZI>k~`mYDOFOMi)Ldz+nqk#4FEmybZ5Kqnrfcz+`!}sWxwtTNICwe-ZU&&ZQu`ts+ zFxbTL!;NAvtIOkdC&;IyRRXFvD>g(G^knHLq>!JSZWum2kV-@apHweBGUkJEyClS3`R2%PLSJNm!#mA+R#Hv&P9gg3 zd4_6zZY9u(X~8&dKPJ=G2>@k%i8^Dl@^YAf%rF{K%=&Bmsno{? zDz=I5EF)5U2&cs2vOvZQJxiSQ&FI-Vpg{ZDpn({N_ol}bgPPt@#-Kyy3=pVoWNJY2SR%pAEb$(*fH2V366(b10wptI$>#$+)8cTw>UkK1tqeR6r-M^B!YCsSI zbEu8iJ%sESC<)_O;>K_(C!lVR?PbhKLI} zZKN1~us+{UhJ80NR>SX!0@Bg+LB}1JaUC6Ut=kw= z6DBq&R~SWrjdH?;jj7Wyt`!^Uhj5#H3G|3v4UIAwK&kIbH4jDb?kV6CP+)5TR4H2- z3ijEE5}yg$1=%r=#{yA0+WP9fEhFfNXGGDu%tR&2t2N5en$_B24`?P7j6bGBWQ!nO1hns& zq2o;$lETskRKSDN73MZCFmz7Uipy$w`aLlM6Ed*iir?AX4rN5InkV;!r-Z!GfRCx= z(gu(@Y;0BwzJz$tl90<18#Ar}GaLqTXg!F0S{=Vtbj_WvJUQhI(N39`E~LPff&pfV z#~9~qg91_Gb>QB#NNrgWR zX{{o%5mrVt+~9@XbTw{v4%glnmzYSkl_*sypMevsie=pmAS5!&FV-w~1PQz`_D_Ee z(sZpCAh8vSzSOR^d`ww|GI+x3S}_8<(ur*8XZVQ#CDGYtX#R)xD&GS+Q+rcSJ85qG zuvQ3Rew!{nM<2Z|gqHTi#G4e4ZIyM^yVK0L80hiO-l*DD)oZJ3a)@Ijo7*mVw#XV~ znD}qjJXZC_Kl0YF=lCMn(`Hwi^a@&wJ7*C1dLa6|sS(uKl*zC9Tg-<^sNf$ba0Sj6@8hV^r**I;`^R}`Qts_cU}KLn#sjmvtM zRTl!`!oOqBqX_)6`OR?HT>ojfcBqX)U9B-FV~RG#>U*csdOs#iS!K48nyGX^FQQ4( zWZ4^nXXE_KZoipS!qo~hXlXda7p&%1py4{^riS{Q&&d+ymWXJ9B&fv3^?^QGNXJvU zi>Iqs9PQh;Xl|M>QDe^rrb=5mLm{asugr}F$)vJIfp9~`*=X%w(_esOxVQMTDs%w} z*PS`i*(3nMqCx8Il`=U&S}FwaH=GVBg3womft0sv%XyPPhW%42DddgVnL=Pw*2O`shQu0Ii#20Nmur2u3d` z>iF$OyC#F?2GGOis_EdnR_iD5-M)I=ORP-A1+TC*YxEE>qL;9cx4IyXoXc+b>p&tF(S1l|JRB5L%?kSg zr4$=-m7sz?E$oE2N>bVuhXrH;82>+F^$e%>z+w7GG%&*Vf_wGc8W@^u4eq{mi&~Y8 zQFA~BM&MB#oC2hwOdV1r5?!n`_9lT#)vPuy^3WnYMhGKH+kxXFCOFknE`#BjUzCKf zz?88N&V(e1nE74Ksyae-=7z6pFR7j)u#vgJoXE+Exfcb_?t)pw?0Ub&9$N@CT_KR( z>B`JvemQ?QCJ!LON7V+tIG{c0G!5}CB5Jg^)Jumy3_@$l@H)ETCv1-O0GWtstQFwe z+c5n-Nx>`G^~&dz&SuEfF9Zf<7nveXxj9Q5Zxx}FPD9Y>awy|>P`L9p-BuIx9am#XUQcd!d;V~$ zs1?dS{lMi{w4aV|D#!MGWCj+{0Tdo>8=$-_pTuAFVC!1?;#Rg@ovG;R-?qA*h`1xT z--5m3U=7)zt9v1)C!>}XL$5N8C5;GFZttH1<`L&pxid^MlT$gGP1r7+yMbEhbPJ%W z;HC>CHlo6I)}XU3B+#b|cmF0E-pk!K=<=h@w_WX$7R%m~+bQ3~Zw|mvW2+BwVstB% z+xz})ZH@xMEtl=KaJ{Ve3ETH^cs@KIy`Fv^jfiv?DOY%HTR&C_^y_XJv2tYPo_h|M zGFPI-HPd`CD{+-s2SU!3%_Z9BlFsq8c)?Q#N^rBG(3F2*!}vu}!Dw>;F0GQ<`1m(; zFWq$zM|F?6HUYO_YGsHa+qD!)?zmKcXp!2xD=-{aR)h2fH{&Qj=Zi9-d#pjUg2iW1 zAyh&$`3n;1?~}?{agTLH!LdKx&npb=n`NDZ{oLir=OH|@;+e^+5;Nb13tJQ^EceWx27vx# zFkYjVX4>a$@cq5-vu>}w{+Y*uYq0p8@;!%sLC)8C^MCR6j!l9^S(t9xwpD4{wr$(C zZQHhO+qP|IR+_hZBJPLjh@RiDPprMqdhzImBlVBPwZ%~A-UcL{XMfg6&dU1rMP72H ze-c$Gpe2pQkHpRu297V03F0gt*{CR_`&b)>EYGmtm9}HFVI7Qvnw|$P>WwLGsu@76 zW1*LSEhY2RdPKt#OivEsq-?&bL6T*+n&UehTmS zR(}@_(_wWr3`<$A2RlyCSc4juSKixUpubIC{;;(-4rGFg(VWZ~7Kp}edy7!#TNj-- zq@=l6L+$f;>jeK`#+LLLRs6*w^_fX5%fG}75;rTimQJ1um+Ey06ZqLuw$f$eVDZ!{_+K7k1CrS?7E^Y_xbZN-x>L`V`<}=g%AiL_sZy*R8m#WjSvB!Sz0v)w+q* zZ~CZ^KEd2#0z+f4>QIF@Pel5oz?$_4-6}u50<5bXtyFvXq45~30*t597O!uh9KiVs z*D}{;%yw)!;g)pHoMKygcRrvUgNQ`y`FMgj{L9t|W8_dDX8Oy?jq9`v4meikV_gzf zu~Bm6CAyQDA^WXm2o10GuN?owaIHX?WNBVDOEusZl?!_iZm>m`qmk&0CUix6B^#cB z_eS&5xbfc&W7?LYUXoHe>1$ug~}S z^7w6=!bx%BcewdHhgHa-_%-sRL8~AZAkS;n2)E+xWMry14hWKcJL zywArQM1Hc$3p9tnw~V&C+AV!9Kea8({9awx$9HGdT>GtLyH~_@%~H3J4UTtCRDB@H zmyhD>O~|*9Ua(7>rFL1;rUl+!ULOrU&Y0zg;?Rd54N2kU4|xdk9{q1eMfN<|tK8=U zM_<1N#^z@CfB~4&gqY2u|!O=^qJD{+c zW_9ZbYDlR3me!SzZmDx~#AKs^6xbN`4_;q!V=Q1}riB$%oY36hDs>E6rl;1{BS`o8tye;U9pZLX(6>^Ub$WHv7 zBG(Q=^xWl8%3E>^UeY4|!h^Vl%=&sIa+6m9fqlY@1)PGCY-D(xzv@zB5f$Kv zU(Zo%$n**vkdb&G;k|Z=WD`k{C&75!pF>M!3Vm;HIoKROLKI$emZ8Wyb?+}U>~BS6 zJz+yQw0wTVcX!QCu}7KS1MH`FhR$|4w=3O&yzXWxep99GzM0%!qi$kB6RIRUPR#pu zc?R%+djZ~Be!}HzFYh?(ySz_>&#whRQ8bZbyL!Y}JF}*GjT{8J7l(u-RoqMou$zr@ z8)SVRT6Yx=Ph$Zu^r1Fy97n-^;T3Ml`75}i7o3Jt@rCOCY8@u<`kGy-bG+a9|F>-G z^ur3I00scSfC&JA{lBDd1AB}As9fq=c3Z3{zOQxc_juOmwL2zWNSOc@hcp&J#O1ix z2Dp@(oUI$;g`$cN+XkOETw%q>6oS)>cOs|4qVtlKhMUBWXU9zI~E)}8WEq80I#_}UBOSW-9tnI zTt&7@eE2SfGoanq1_%Zx9tMt`IRio#i)H^5n}m1#7Kt8UsyxPAA^T;+eVg2YqO zh{ziQvnNMrUCtmdN&w13*P{~Jtoy%@E)G(n(~?E-HQH-R#O(rrs-R7cCTE#8Ka~we zido`&?$E+OXB;d^>lzvbyw}@6E9V zJ3qLo)W{c?^PxDQIWTAC3?=NXmTO2&W`Ku~N$N;;(_{y^?(g=Xe3XL6A{~(S5=bfmSl2kPMixeuBBJ`*c;j$2nJ-pydNDBix z6({dJ#GU)}jd5is7AOg#!LYmacDYRBBSP8OrMxZ^lPUx*J5CxWBSLRTm{v8_$n^m-C*U*Ldlk`xajg&A7KFcm= zy}OfWW)fT3NRuFD3EM$lo=$+7)5)w3ZGl}y&QK@MhH}ce$WA{7>IMUqK(>GY66P*o z+$a=hR_uT{;*+S;E`3i5Q{fVBqXI1le$QP!t$Y0q^TNfC^*6^G?XI<%DAmOBTh)k? zrA%mQ30=~JJQ7h_dwaBknbvoie6&C;x`QIR0zX=Z3gZ)v{q&jS1e-_z&0*RHz9g?(Ty;)ec ze4k*5{&g0xQgBDvQ$d9ZfVkOFjHAOBP(!BbTY>@KG6HO0ALT&q{IHkvPdngAWJRjr7^;%WW# zS<@5~o9J(LKH*doY_X+|{lieR&fY{%)?wLzz{?;>@C3mGvDE2JulSP~$!QQG4xRq! z6OLftm|cbHGp)lC_Pj$y5N%BB;xc^OH-Y+Bx9-i#k}!M!Q)GSy_LYsVekZ+Qgu*f; z;qKN}6?of6e+%0aglk*krADpTdw*+fHH{22-rqZIv_BK|F);2;;c4!?2ZqN(<@anAuDn2V@yd=uNn(3dzA74kag0 z!WU}qF;cXN5=2tkOYmT!nUU#mKPT8#Ek#BLHiUN?`sw{mlb!et2Wy3l?7 zw|P`RcQYGUL_D!dEd%SoT6jeLT8pl-$m{~U5VJv%!|A3fdl40w!jJZuo{gwz7rY-q ztPnZP}h(2(;1|)Vxzb-Rvc9){6Q41yfadyb&SZW;e+DyM){t?uLl&6 zjun?LABm~yZ6E&d>+_};&G2i9;p1)_2jcf%wIz+aFgt2P*fD;Pvm#(rRI_tZuw@&1#;7CV{plqyW(@vSn?oKvKcJLGZd|7YZMd zc*EW^VgMiJ-K}`%b7F9p=M0D$Y^9t{$-n)js5nEB|f+Or>J z=^$YOCsoOmVkj`G+)!jTToV(Q+u%*4xY|(VFz7U6EZbDP%&mkc8$}ErP^VGYEX<4M zNrVQvg33T(llBSn^CCgf6eu}DY3?whA(FIXEnah)_F zd-gomG?mmeb^M5*C!46pm+L3)%jf6k`0{a-mBeN&Or(jDvGlMzqu-$o$3GASC~o|k zB`Sl2@9XF1k?GCJ+b4W2l3@X-{hT`>Sy8GVCp%e69H8?k5oju`<17_&saek}Ua_n= z-pqE5@a7LWmqAOio|CAD5P<`X)PNNk6M|?PCS0apq@9GsEgWCC>`#B%6fo{O;D!cm zj}BB@C?YVNY|qTL0;jg1WzsuDci+yCwPZyrDX}l5Njqu`bDSD|99;&je$ zJxz+jDgZ?aWv@z!$*$@O%}AtFdo(^UXvV*rrlzd$Ioi{g4J;AFW_B+X0W+Vl29%A5 zi;rXE2&$V-X^0yd=P~+RGbA<#elQ>;FWSZNL)!hPf|n8 zt1GcwY+^#3#|WmV|E9-;TpS(#z{a|8teV`lHtil=vfT5T)qPj6s99Y87ad3vYtJ%% zA_0JyIGu@dq8WtGC|srvRBnqIieeN~tDHS@A*Z7DY59tcfKYc`dVFgE8_d_R=zFRqW)^5o?=2et>}tSG7qx>pb&$ApqR>M;7u zzLiN=ivlPyP!Qg+dFo zib^e4Y^cJQ%zbwkt;4G)Lm`?@72cS1CiSg{AZEI;zkVVIy_rhu??`)+1`}jPpc@gA zDg!;ev4auy_>^>DG6=Me3aGS&1gU=#vCc@NMP6`aLNf3JQ-K^0O=_+1GIjYS{6kY|7T1LAg7h?2qogwQ0p~&V$u5b z8B!YmaJ&2HoD(t9@=b*{`(Q|Lq9(C0FKq#Gr=nGEuUi1n1pshNbE=S&B9GR;{lQ8h zN|+YfkJKT+n4Gm-i5#z5^bnQHINv~^q64X6NS|4Rt3RWj2y)C?`hAVQMS4WQ2rCnd zS1x}70U;22ha@cjxWjOCVFQXQhq2G(pB#Gr_^YGU0KvqI2oQR<8EBRRz{Y*sL*(^Z zo9}hl(;&R@*0ScXK!V2dc6;bn<(XU(?q70*s{Ydlpbcq@q8ua-*sGKwFNQMrU^$XG z05<<}1{1Wvvfybjxz04ozr^Py!F`^stOZ3SMMasfTZl*9wu$Fq&p6v@3S6>-^qk6c zO~CN6)gNS4j(|i4r3CH$+=m!C8lmndt#NjF2ms&IQSKk!Jao!ba(rL0 zLQccu^+?fOwCcdY<>A|`Q&fMIWP$$hHR{mauHy3Xv2WKKslQ9P!F>4{kLhk>o#W1K zSW6OA$}JkiEar&1UHZDG?TYb8<8-{qhLO?b;xRj_&luRiIT5ib?ZLf&y*K4hErSy} zPC45|Xb**Ms?>^4!ysz?v!7oZMpQz=7px65WfIxea*>mW89i*rAp82rz{SDEjyukh zIn76qH!X()k|iI8{b7vp?X?=*0WW!c z^CuYBDXIe=$%2CP!@k+}nfZE~Kisf{^&h7t{#uoUOFh1bGjhC9%VD_#^FLU}0_EJgdsC{Jd4mAMOD4EzSVakLK>P z{00%rtJc-KYEbmDi%lngQ7p=xbKmH7z*WYRMF%_fF83L{_fh)n95;*u>6l8pXWd3D-`}{$HZ^)Q$_kQ#%+JU01W8 zW1Pio@|e`?0B|P#tphLOpx#nAlPTe%c8;*fRW{F`dk7P#OGVKFl6SQex*0e_LFZ9+qeF%xW+ zA%Q-i);iS>Ug6;3xF?;t17l@(!(AYH_=or=EWGHbL1{u3#x~)^r#_1Q4ow2}Nuo?M ze&ExD9N)qBlr&46@tHJ(OePsm(s2546~3J4$iV|_E2&W}CFvHE!xgbdJrP~CEpm%z zZ?T#*XcFR`GKe@L&4cH{riuUMP1f}gM!TQ()j}SB74)`~nDMuVb6B>l74JNOKBt!} zu#N`hbW_J~O#vOoAEz27k?IZhOL(991DDR8CE5@3E2LQ4D|sm99;oJ zG^HkPw2BUJ?ZY1ZsDFHT3#YvZ^u*X)B{?dY(I1w@C{!c0D@*!t#AGq1p+7~Q=VtI5 z?(jI;{YS)XmMfLxopBUYsnXdIB)P#cQ8p_dRE}>!uAYmmD7qCv=hNDCL6KdHkRtrM z7NTaBAW>y~IX>Kc9zNaj^i-<$TU#w!!!I@AavzUtxsTWw(^{uP-aQ{?lx@p z-dlD|fIZ$ypdrQ~485<}5#+X7^jE*1`BCK!ej9ZX>0+JQC&)*1lo?|dislpx)jagh zY^_>s+FBg*n3BHhroH_RrGP6aED557Ef$8+oPVt2owUdwvX9tbSxZF%<{d%%vF(kG z&#R}{BE0LnHnN*C-z}${@e`d{0O7(GP5E(>14_xS!e$Ppp%s6T7CCxCp@4HEeuMR) zn1-iN>7x4rpR^b+OO@t=(CM*#1XNwq9FAbBw!+3^ko7H`Doi!du2XlU)e9yXLOD5U zS(wnHZ=U=t?OMq&p5xE5+;Hb@4{h2bPL@-R^}vUlb71PVQeb|yN;sXeGWlh6Fw=iQ z8_@B5s2Sa_`HRsqOko{U$_lMoFX*7#cU3^N@MtuJXH^$xjzZ5c0GPrN?+LmCZbW-! z!nbV{b`G9=F(%y9d+?$2z>m&;(MxWk7XSOrp8eAgsPQi}!S~PjkNdyg>_#Sz&i`>q z+r$t2YmWREnec#8qRnDCE$LbKn9wsxc{vER+wV1I%$V2|3L9cvF(R(R7^O;&g@x1DGw2CK6o6G3{c{bxhMQV%rGPL_F|~t8{m0wSmt^?OcKGGuPu!q>rI}N| zVnr5MEUSOSl2Xzez?O9v05$vx5EhmGekyynkjyOfO%T~s{728hc%{m;v|)$XOB6^A zjL-@euf8VUAA}|5wf-%0?yR6T4hLcmoakZo9R-siPnc|>QX$Gqa4Nj&s5vmGo{o+4 zu${|WOBXLcx09(nDfNotn@0@cnTexVAz1S_hO3p~usY!p|xvfrYI2`9_w z6dS*dxL+x55`mhHr*al;T~Uo4Y{QzU2v&%Oyc1BT=l@Ea(uO|)6#P4nnSVhHy#IM7 z|9?NF%fDXhEqa)qD>Z}-1ITzxAtx$?>v>!LwieuZKrWad!Y%1SJ~q<9S+xlwkinh@icKumO%*gM`mX(m zf+*IIhEOYd2B-?kcs)eiuX2wgTk; zc5eFXC)IwhV)O2)W#QZWSdn2)%4axUZM=qEYvzl@gncwjsnm0}dP$Y`z-)TYuCeaq z{_abo(k3fVN8&s5KWh;b%pE1jC-M3KK`fvaj2KO&v!t~G5%{V1`?#&7g0jb+am9QF zyVQr*xkN5JF=niYd6r`z1faDnCX{KhkOj@;Trae2wkM$OJkw-c-ioBB1-+Jv(ATeH zeD&IcD;$;#`DjMVg%Th8m~{u}y?axw=Co{!7wym4uJbQj%zF&cbtqqVBXZZ*qy$7^L{VOrEaA$bwpEGIrfF!$s$ zB-OSu6GtQ1b`Glysk@uCR}Eymf7<(vJITGaV_H?w(a!AagyOBjo@qUYaAfbs z`LMSwfpFs@uje7tTv`i~z2p#W&e(d}co`r+caBc15Qf~euNp(U(6HzbY1D|QJeu+= zFlEL#ZQ7nmCc@9i7~ok)WaVzBJ(Op6j86;_bm1vGO*w-)pGRROvpnYw;}c*s9mVdf zm2V!jSZm#4aK`bA&HnyA;q2_jyK!xF%&s+_%H%m&8QP&Z=b*dHGw5oL5Zi&Tzuj{91%;$|)VbmS0Qmp=Q1F!|5O+2OW|+Zs>UJ5zHu$M|DoY@7J$n881O zV~cmy<+5r&szIF{Fifb0=d3lMBpXuNVj6$~It?j*pvsq1LH&uBpOJoN{(J8tunXse!)Uu{%eb-rQLU6~F z;w!ZG!=Y{nA?1bQ^IFT|B!aJ9|{hXpP*R&V~65mVT zr!Pu!MWl4=wv>DQTFX5i1r3yGJK333Ia?{yPLkhS5l|1_v5-S~#WOb>q04olQq)|n zdZ@BT*i+Zo8d5=JAYL=Mm2$4KVoD#?`^@6g*M7cyaVgk8cI#SZth&$oC`7v@+g*I- zr(CJ9FkHxoBa6+ZW6Y`U<&dD3vFfkt`#Va%NDbEemEWiuC2frx<}r#^;!F;25?ka? zod1o@20e(5FsE85ZPJMp0s;}%n0n|=#)ZJAKd$t*T9jqJQ7eK+ydso`B!D_oNOe_{nakVQ zMatMkpl{~Gzgjfq6X_pikhSd&Pyi5xKu?d^#YGYpxKeSIJAbQmmE`iRRso>7QXh5_ zVBnCqg*$N2l)nWHp2Xgjt_zlX`+jJ|QHmWgO_RidftDLWo@k}Ha+))O>v#PL1O;z5 zFfnJC0hkyfyC8(nHbIX|UllOABGbr{#7;bfp#e~bu4~2=P_j!)BQQ-=>^^92DF(@k zixmU%K8ypOZ)9kvBISPF@++{Q#oM2!>>O^6bP322=TGAfCDGO(47YZ>g` z=@GDc1p`{0Vt=QCm+c&L3+#pw>@=Uyi~mx{uLDE>V^-gz38@iG4v1-0V(&)x%dF8k zU)*;j8w&KT4|6{>8&uA{Sse%#`Ep>_4e{YZ=V{7l0ICZM_D|1ISvQ2?&`yRx3hvW2 zJw`U?Ozf?4E1&;o1le}GUO-@~=h7OyVoDcM(PFf(UKKBWZI^VDNt07~QxFc_VA=UB z_#h}5Ck7PvNPl2hR{YlFN2S(pNd;MJ_M&@}ZL<>nD192BR%2nfTVGmPiu-t_zMOp; zZ9Sn}|EVy^D+w{oek?_XfS=sM4FF*Ug>RVsf~jrO7hcWN@)OXuJ)wUl%1&Jo8I{4i zUM8HO7l}e@V?F>rm9gPr1vK7A?L}3fVr3z~Rem(M#f23~lwyK{=3weXvf%U#TnK>o z`3X4+$h1$`U)z3m3sdT4`r4d_QlpwTIv5v47c%f$$V{pFP|4nG;J1ujUv?j~+q2+U zayq65{p@rDP0$XtkDKS`D>X$c@#s>=CX`~0)h;mKjcaO|r6ZlyZ(Z-43#7+gs3$BO z1K`Wh-Gm*=K^IMt4Qe<+0wCH>`jf{rBUda_PXXVxeoi1?ckY>e8Y3#Nl${_!F&x6F zO|Y&3+VlX1gtrbNbW1{AK!3>60;a&`M#~qOx(0c9ve}yJL4<^W!Ov^c{Q01_)cbsC12x%isj@Xc=Bc0@b_C8`xJ`3l z?dOW_r!0RlU)qtJHhR_dc@?K{I%*}yJsAg7f?ShQ3E4+qB>itAPt~IgCV$--Wt_!U>EZ6ocC(toAk*KZI6GNtGp=3i(p>9BKh{I$t(;TM2Kw9-$Yb6Mkb9r zb`2bzj0$f7rC#RJKTl^;FHupa(>~}lXL5;c5yuK0!*E&EYPC&?wPZ_j!}dm=0wRHj zJ??|Kd}$V7(q&(AxPUvEOTMWFA&oXT1QzcD-F4ec>ue*_h0tTKL4^IVwtuSKBxwMq zo|&ds7};{sm9WQ}LajV~jq=P8r7l!}DJsXmlUB62)EoprnNT>G0fdQ(vXK1tZ6IYn zq6ArVCb#y&q-7-kLu6hi&Sfwc2M8m?0*@CKW*nElAOsKX#|t#^mq4VdCTfI8&=_@4 zGo*Nn7@5QLEK`D&?4_OuX}1JxBU9PT}dy1Gi=*)vh(|mL??d(3PkKjN!7{B(1sNJhB{9z-C$YxDzH%q?L}44oHKTnnMze~ixg}Gr z=?)NhAvR;)G-SoUh=%{!k!;Ne99hG7gIulPB9;Qc>iL<7(?J6oRXo%21}Kr`t`jX{ zBB?}g6mLXs!_>8cblF7Ty*#j5jEQQTlhj#YF{0U+lU)$D`E$e3-wnJ_%mX?yAA73s z9)MYEON4pAvBmg>k!}SsK~C{=xb;bSDm)w>BbLI1_s@h!RO2H&Ht|cm5={Y3mt_*J z#-00TNOacBO)N@(Pz)NMepd-|oYV6LykK_baElT9 zrScm&@+oDbwFL0P=8qjuZ1GrT(nV|C5L|vcJ7`AxsV-^HK)gzLr|%0GS0cVI6^?W_ zb6Cb2(_PDeUZ)CnhC}WcZucBICsGoC-w;+!RZa?fUEUJdFlexO;K141s8W7|=y1-R zNthVwf^-HSVaFaKTYGP11n=Oe5{wM96=zBU*y7uNhebm<)DP8C+&hEb?*PtP(pLrX z!7%3HT$@DQnLm(EJ{$vLmjgb&OXr(7QPT(UMF1vGF}#D=N_SiA3>S}OP$J7B^K7uj zaTNjDtsCBV$HnD!2+>Oe38Aq=xW4D{`<0m6KQ}BhT2DId-LzU%O33_hw3x4-VMgaJ z)ZMTD&0FOf0$uu1Ngh3XMv!dbf$HyjbC2$hlF-UioYygXRliRv3VW(6%f{-RTZ3F4 zY>jQG89aIi+rGbAR|3UL(pJGhE0R^<|K|HpT*xTNjqkQ9j3&OjIzI0lPYUU~HzZ5w za#20JVsRR3Uv_BG?+OY!dBQ+D+G{6Bzn6}UbQ9noDw-!RhE*P^gOVGqzX`uQl^p{U z6Kqm-ypC3NFZO&agI*2?PTf>(fdxoigTs694qfw1TvLi}0<~5@ z7mcPgeon`llyqfeCt!H}Wn4vcdThw)D{1d}lHRl}%Yu`##*~HjweBMB? z%dZ~G^lj7&{>Q3Q@e0S}%uEq?POFeDf`Zw^6c8`&sL1PRm!`$ffO)VpysTeBtj1{X zSC)X_?agL%rvSw~c4MAhlWkZtiT+dl)R?&n zTI0=K-O!3A$$tAjU%4+>w^jtGbr>%?HJV_&+-tF^6!}Y!oO+filIk)II~3OMJP$ik zb4+%Ob?cnJmKrb{ts{nqWJ(>7&aKo6Qu}0bKIjC;T}mf`q>j0*|JHh)+(8w;$Knhm zG}eYTuUCSCyt}+xSr}D^fZc6&HGeX~F#K7?Ky;Kv>}&{G8#I^6(R!%%7)Hy0ReRJV z(NNE^;Rpm$M&87KF8|04A*nr-_eqQd<`5=&_rG-1uM_dLJBZ?MdTn zo#wPGl`qg~V3zeBr4y)J&3D+>C!d!s;LYrJftWEO_J!_CD&&ME{5;1}TZi3US6^an zVN{sOl^-Z}&%?$-Zf~@yIXICJ`p2@D;rPSm1Cq?wY!Vl#rWf9G% ztMp80-hM#2mrLmkZY$@F0aR}FgmjGfLj7q#4py?pZxEf4Y1#NkX9MhiH}uJ_vU>p_ViIFn75YeKtJ zI_h+mxUIu!{w1`9P6j3)(*$A#t4gVlU;?~-+xNKnGr?YQfjw&PsevA=RD{}r7sK#L z$Il-XtDA}Btdrr9yl~QPtF*qbo6*;x)F6pu*`+8WQ>V_VvA(pT2>}v@#M}%dw_Bk8 zB<1%lfjW!Qt|mc3t{fXojCOB3`=IOw5|X`}lO2A0^||QSDNGDd6t0EUNaq!Lf%F3| zfw^J$MBdjR&bdl(tnqcbGmN6KXCwdy%&)*ucc1ee% z0y2@L`pJ=o8GBo~eS>Bv_! zycI5NaozRR^0y^`3yCy1y+=0_P;dVe1S zw1qBh!5VYJScEJX+|zIx;prNCq-|%jvE3o+zkzZDBY*t|zY=q!^=ZV&ApL}zayj`i z$j@hi09B0s(JPK0Pmz!3_X}-jz88CxsVVoH$;LBX#1RO(0unoFq(#%X=Tr|p9uD7c zqR#jt&-QeA{9K;D>JI1XYLlWEW?oMG3O)SjpM+>Ok>EwQY7cJ?;}Nm7=k`x67(79jW(dP#3hPpDUU!%XOn*#RnR-+h>He&&wRE`Rpg%_Zw4uQ zUFGhUvJIHEi)zt z@eN}>7~B$!3A5tAqD{of$o8hb<)4V}NPCvHZl_~<;X~*{`JahcXY)@pe0Xul)u=)KjYE?gv zK4-wc&2~M)zq=7c{T%C5wei0tjudkI(1+$jHd_5g%+Q2BY_EL+t1V z{b%oQ#>_1ga=v3H1)`%_5hE)RJyp9!fNsBk@(iu`$Yd9krIOjJoO#P%jiaeW zYQHT7$kNK3xch_K+bgcS9B|bA7^rppX(Z{?u1eL0q~D{Lsk63pu9)u{D#Uc|^cho+ z3c>Sg?=_2Dzb_)7v^rCMe8$&W{?Q7}9% zK!13ZMApyuwd`N`l4^c^L=dBTCyMgrtfDV@DYO1mN0;$K!>VY!w1oikn-~`y5Rah? z%=%wXiH+Ob2-qts^8oP~$q_84XQfOm`J5!+lF846?C$NNVpS7d(#uYYgb;!mK6c!(u#M~5uMD{&UH zC_q^z@kyE;>KB&+s5B`-ObrwM(-vk6lIPO0#U>`|0yOO+zMSq;8U^AWI!;rEj1f>C z%PZy=Co0QeU6^PyLY6<;bhy_27r75g;;^Lo48?XvV}?Oi=jVE#eyRBX>(; zX*vZ+iSRL{YIccfx#|}1WqZfg-Mx~5kC>lBcHwK4ZU!UQD|`h?%qhy9Z@lj?jpYb^ zpKm>~`bqb@)LEo*0y}!Xo#BQX=P9DOlnSg4A2{M@%tA?1dnwW&V8TnzxxZ5T3Xv&$6GngN^?peewc3i&SWeF#WBEQeqYWiDRfL0_9tdRsScY%(19!1U4{7t z@tI2s*niQrmgFuK3JEBQRSv-e(3Cx2+HPN=<&u_eB>^l}AYxq~_g8yz%{w_8WONPV^f<8Jvb!P%5cunKEMA$-~SWw+Ge z?aq7XubOU>0D7M_n42JvPag6UYX$XVWuVm^jF1zacUKvSD}B;>X!oe*-qS|4n+kUs zEzbGb!o;F+jvvUZ=>#KK0%?kRVZH4E!6fd5;;2@Gpz2?YTFIDz|r*gVZm ztnL4e?iMwv|3G*Djc)0UAe(;F%~LdjG}=Xxz*-yPt{#*Sel6!|VN#Vu$wIK7JKV@( zVTsm*!t(g_ReQWWZgwFg!QSz1N(}2_`ebO@Tzws$0K*bxFxP7GjLb_7NeBs~Uc2%+ z&B*&M>hcZA7Wg|&^qVExGI?$(gXyW_k9_G*y`c~nJL*B_n8`QbzE#P}vPx5k(dvgt5^-^TBgHY5Qh)MLXxv=#n*^E4MzW$Z3_I7- zh$UuQ;|W{zy+SLPF#Ip3FZ#84=#?k{Q5<_2?nh_freg;xS-B|k>A;ka_l?p?V?t9B z>$uJ8Q+4I%d92>9qs~A(cxskAG$}%Y3&B(%wX`U{A~j6!mLF#UOL#pls-DX5m#Fs9 ztQGWaX?{c}#)h%-w1<^cwYx#xujM2TRtS|*3Qx&zP+=X)(N=nr zRS}78m5-F|ikC^KmPTxg8hX?7d5TG)4R$18xLZNHSgqR9=Y(#DdWI{xFFlr+09z_! z(Q+2Qfc;hUd#ucwZuq>&L@~$h)+iJA= z_(#=9zdmVHzLP|2YfrW-G#X{Q^tX`_qflY2ygf`py}{vbI0{6KpZv8=deU%Qa9ic| z!$Hr`^FN%+ZTx%D@q2dx{)WdZL1l{JJ=$A6r+Mu<_iMz`y!6-LmsB^{8+rH!cFk!& zXx&$+7TnQ^K-aMuMH$aqtFUa&c0iMj_Bu{ zBt;(;qg9OC#vjLo^Gc25Aq3IMQ*qkUe!%Ik%{#_St6xw_%%ud37(3iVLM<9~j913V zb5LgpatYb={dxbsH#R;(Y{XW=_QO%b0XMSho4Or(+mv-|$LM(vA;|KYFHnKr<<$kg z%4i3U`?^UuNJ4DD8%XQ<*9CE9#!@KQXtz0xt3034r`99l@b#~wOIQEh_3KvHSl0=W zmiOo5)XmWIX8?>8H?K|(>;UpmB9kQ+wEmxPek5;_CS9C+W3L3oDR)_ozbCCKr?Dw- z9)nYWcMXpH<}NU-l)jmu&+gVpi_98!Smc5nPuNCh(&wNGLKf1ZCyRScN4XsOcm4!d z{R!bUi|&!rn~jYxTSjij{o;n*J)N+Ipx}ZgH_%k9^n-_;(rb31FuHzb7Z^hd%3>cP z)MzS2s2HkF*`U=7*q`!A3yST$2agjv9NmT@*cCO4rpGrAw-_1R4B|)l2O~xa z>PbiN1|SR*gbNW2VQoWjE;Q0MbiKLFL=ybC##M`v*aFn~UVA^?+arJoE|^QLZc-?D z9*DdPLo(EnfELqfW)U!Yl0Y*aPyyj!ZBJ@(P7G1Rrt5{Lzo)M^yE?~!eDD_3IEuye z{ewm{1+yVaC8dD|y|3x?TRxDBg6XWxZ}Eg^Pb@~HKSw9=_yH)j4q_x!k1B|w45YWd zO8e|Is1e6{tXZ@#NTx^|I#-{U|gD zoP++|@IgW|e*kp)cL+VR2ba43W@UcVqu@7Dpd(4M;NqP6mP9L1RB@Kc11_lWwi`EJ z&Y7dy`q%NhO3ceKryyf5@dSenW`)9hfdd&XHi&tqp?2w?WRCq+hVU*J^CLSasGqXt#QPANjnz z%+f@v_77T@Ej841RF!KkXwr)ReXNXd#>xLua--D7h*iE{BLFQqk0T`Dzaox zG|IXRYhGVoRv^(YEH%zVTnZ{bOiMd8P1alzsLbWjrV5o78-r72CTF_A*+kqll;>TF zns7ohb}CI;ZCXAWYU^6F(qxp_E>9KJDsLJo=Q6cZMm&OsLNx@Yq`xnYXJ820woXbW z%dby9w9h(bSF*Nl8*3F^DqA|QJ7v6{?hinp+Ii&Co<9ysb$FQ1z0{j&yglBIv-Egn zW`bv~H=D<+q$_;VPxYGqJYQak>D|<1de%g4P9N*6*s{IJoYk>)PIMO5zO*lvt{4Bc z(m8QSvduywy(eD5PxB0N(F7*gP`dXhD3Fr*o2xJo_nfHTGm*JUneM3aS``u#mSqkQZTg*CzAS$igs(MbSbm5*+Oi6@$RYRIznpI`Ce(e%FndH z9&V$ST>1`1#vVo%*y60K%+I2tI@^$mtF1Oi)j!^n+ol5?#iX=VnV%cwn%go}82_@- z+Ql5>%g*KXcdMEvbuM2%7Z}pIaaQd2Z#8w(Uqz-%U%!u!GjjpoNmlIZRNri~npA`P zI~%~JI(u{N`fiZSm7FhtLa=PKGgq2Gfv=JpDq=%wnrE>u4t4nY;q}~uHMAFHvAtGQ zgN4?CTk6BpDNiS^v%z=0MpM$GfI25@`nf0)|Bm^b3TH@=66^q0(S|v?ww07wy-8gM z`seOi%6;njVY+MQ6-3SN%XZP(xui=@swkW_0$QKfmodDshw;D=p=7L7G;S==2V{B> zjJ=CT#k!^iO;e{1p7h2CQC#~j7J|Z^T0jTc9jX4Vn$#;5FfR+)5JkXt{WhC3c5kgX z-}SQ@*A1Jjp9`mdMC!^F6|MbJ4?rtwmmZxIh?dKf6zb1x1RdwLXm?`hZ3Sscek(;7 zCEK%cs7mXa9Y$i^^$sdpDt)Rst^M!L6QJGOMHLNYHN{w%j@x)d6zzGW)>Dp}4II-} zz~KR>-6ut}E&=k+!@Pc?+9w)W0D?AL#mU{D1Ww?BwM*F*szR2LapSLsCo0NyV1g=T zur2$o6)SyaDSgPcb?>ER`VX`X;AloVto$42yPGL=GCMt9zO1}l9xg70F|Z^E6ywL1 zSu=9>T>s(oDYfTT#*?_5N33JVKPPh8kFrOU0n1rgu_cRiIgdpiN`8mZaCzg{f_rRK? zb^%VO)oJ`Bpx8Jokn*64iUQIy<}lxVzw>F<`)vk+Am}Ai%O0`&u`8q_bgj+m0n~Tr z27EAOAIAlI7Es#w#%h6axcl@j@*)VFK28Hl0q|P^Oz&|M&exbN&YTv^*XL02$v-8u zmBo3xcJYBxCz?T-Nm|5nA_zlpQ>!+CNb6!OG^mG|xmN3Gh2l0)JYzhi~e z3O#~{dNu}3;l*x%@sX{7jsP{#>IS9qspQ8|P;LbLE&F)*u38ATHkG> zc3eBMWj~J-obi%Ill+-=%Ov1>_ zFZbP^!C^IviVou*ih;(DkDKr*@Wxno{Ur2?I_w&4&}|!%HDp+A-&s4IbuA6Iex_i^ zHfhH4bK@VGRhR|azV%}7K0jMLN08Mt zWiW)9R?%zws2ek%R+GmyvVP`}+zHMth_Ofh@GmneTX?*ES=2CA7!3OgRY~A8Bnd%W{Hn1bmZm=en}v=3xV&U1i@+X@(ETyy zOdupE364XU@@w`yTMnv%qPtw9`};w|uAW-l4iVejS(HEHS!7+fLZ?yfJB9fE z5RMAU&wwQwq?w}*22=eOVVN)!MMWDIp9Pipf9MI+6wW>fk%#y0QGaVt)M@l!O=ImM zL^pBj>490zQmgB!hZ!;=YBP#jcy(NTUQ_N_sZFH{T@4Fq1pNZyy7`juv}|Wa3WbVa zz@2_L(OAz7V*34bKpla8giIdhQu@Fk{QxO%TI<-2{es0zH3HQ}H7w1+5J1lNQi-Ut zcIDh9FBkoe-q0~_#p$3jm>OhWudpT>q^$2E{Cx6oWyWF{FI-J_YXK~ujy>c8_)}2x z!{OIdU>sD|#t9$B;slYu@o26)M-CbD7$$Tb?1Dae&0O>i%{1BKx@fOWu4qt>(ve2n z9i;tcC{=G9#6O!XTwjRT02BJA6wDd~@ftn4XK4|Ra~4lJpcbwa=%2UqvT$VBF5fKS(gp$&I^s)r7KF4*b;pyh(2xd^g7B#!V$^^etnH?RJ_H3FF2 z@S=pdij;{cs-whcXC4fY(F_NJ<-=g}Fr5Gt95z*S0E{$}f-1Go_(c3Ijq~b)7530g z2ShS?7}ZfGr)Kn$8H?3D>Ce-m*`NbZFpI}0BHVzjCb%OujC6N9tw|G2b7#%S3{ zSziz*{z!`F;0o$`n3?|rLYks@8oM99HSJVhxeE9>;ZccG1;39R&Um-~&X10K7R0ZF zF#-gqeoR^qmth#BZ7L@Akn;J0B}wqNJX?&n{9xA{Hf{|h8Ym?RmKLl_x|0M4h)cx# zfJa;JUO6k5iIHawb3L@x8>JT?7c=eY>vcDqAp~-aOTGYtq#D*4d&cpuE8QHN+122n z^X;{}VxhCc!=tb(xDuWS)z3gR)8V!172s~@HSF_=2bV-#)#cIC-ULCtto9F4 z=^q_W$`Us1`ax|pC}7j`0VhxF{&eblx_Wk$P>Nu%e11dV`!#FgAb@IX?7ychhhHN| zFEZSKr>+9PjP~~u%R`V$T;7$I-jPlL6eR_rbp=~V$XgaLq>+mI{c3|Xv9f6*$Jm79 z%6d2s@qk1pze)5Ag89=LOh3 zzc+Lt*H9nY7@SDgMy&5G+hh4SFuvb+Jx!^w@DauG7%`=DmY>vBwH{mJsfaWk+4W3G*4EulX2ZhqXQW!I|=XZ{NyB!fx+h z=EJ-+pl`Dw>YOHf{N$~s=l%X>Z|Tyo1Jx1f&)W6=T(Fi##x2tbm%@aTnl{eQofKZ~ z>&!hnZYTiXKv;&pQziilKxk6lD&$XNFd9^uPdEW$r~tY7#TTcM8U$B~y>qB#Sb?L` zgkM*7w4PxoQVAQAUfL(4n-giW>In6&YPO6QU%3<3I9A%p%Ggh7K3z*z+Q*%=Si``A z3stCO313Yi+`thaJiJ}PYuu{Z?l|RHZcX4-vf55y8lVR?B}5gk@%X$Om7E~|%=D+g zG?tx4;ym}y`+rY!!w!VOJ6Db%iY+3Gok@6nkP$vKwM?A?M3G0s z#n{ndc~A%WV_jJ`I*m@acAHSJ2Ab0?GRBq?{R@GWY41!#xv9MY4Jh}bOsbvGf=`ML zzKxqXl$ZF5FVHE@)p~5pAyA8fzyNO!u7m~MVpbH`;F)Csv&OG4gg&VjiTY;WKXp(M$* z5lHu#MJdTDs?q08aUW}^$Gv3Ps8~Bo)2O4_Oo(tHRQVkIL# zUOk+rgb5Uq#`|*b3$oes__aB5T4gY1dC;ulcGk;HifzwB{#<4jZfgFm0^?W<&@->c zxsq^eo9M+c2kc(Poy{#TyKSz6VLE=ds8|L^Dx)EvIdth-KO@V$kvku}lAaPwH;KWK z$gr7cbw0r?)5Pw9#=dd*Awt0*Sz&UNqyd_lYti?gv?M9sS9bhXI!s3A=f`#eP+r=@ zJ+*dfwXQE()9tPxlTXk{F)ex3Qgd1Cu!drKSx*AHz;$b%s%iCNwf6g6*xZq1?;{~3(k{gft_ z!90Ab?jRgeX)#RnvGsivDA#mS^gI-D)K|U_+wy|+au}1aEYgpB>=RV@t^N28q0tu5 zyslfB1;gT3oIPo?_-E4#nhB7`wCfXL>GbDrbNEn9WQXze9uX;=?J(QJ`=A7g9Khxn zyT*>`9y_2R=&GH+V5D%cwOF7!1TOSFL)j2cV@q;YE7PESpq!+G(Dd$ z`!u7@2ou%Yz=#;DRD@j%xQ?4jYeBXk@C7nkgBZC`N~q@z{5+Nq(Z;Or(YP!$zVt@RtC}^#IcziF@_HnDL>an( zaLNe*!*tBDLJ58(;iyEYPBdGMs=B4@RPVFix+VHa3&=1y3}4*8t)D5LpzY9uMY2nL0ykqgn(% z=Ox>ik0HGLN;B!x)XVD;QWTcUY8LXLh5pzD)MY?Az%v-$0zz`*1lg6(%Mgx)HU$_s zRF0^QSggEHshO1pFe(I6OlQfF6gG?(l2Bo z))#`ti4q&{f}nL-rX}NyPyXSZT-Slw0vyz8&Ql}LDaet0jXdB`)v**a77Dq~eJCEz!ZuV;JfQCrjt|VI&#}k+lPVU3K`aL5^P8Oc-Xeh-X}w&Zd}_?2 zaEK!vLjxMebIHzenS;yBq?lb!8=hDK7s(4lGJKe?ye`E`>gXi6*XOc)^(@UEAq`ym(*4t_o7LPgNT!|fq(6fz$K95Mi0 zbfbJ{EU=5*OIvY8jbZB!+rY)L22-r~*mEAd9P)T_Czzi*@jtwRl2=>02@DAg*WMDz zj{|vzbRgANg^@MLN8?Gi5NF}|LmTS+hFJ%M$COCA&W%RdJIL>nIdZ(Pse5m~(P}da zPuZcTE3V#fxE(mQ&ck1p75^)T(uH3bOGKg9VK@$0fk)EE;r{gWG$AR?25`71L1%CU zDzLFq(K2L&t3L0f^Wr(7Yg7i{A}=xb4vs`2K_U((bmRaw(@nm~0Z`5x<#nRgZ7k0Q z4uwlZz!#2hT_W*}F)dp^;AK-tB;mE{d-g)bl>{c|MIxCQr6Xt#?I0A~^L&69>0-d# zaVq2;*QlrjJQ_iY3mi7&tqMh_O3&yfv|RvbQkNNN-~%8+e+sdfV@ZhQFww>BfzHvr zgb@=e36v*E@@@~0F!^72`urXUxp2a~o_?$f5J`@hN=eKs)Z&D`T%fEVR4@@9BIHQK+9o7Xz}tf(~Sh9y?uk9G)oTla3V`l&fGd z@#M*$>-tAin2mjZvkrL71h)F+@&ygUZ}?3hO7JDVS?_+zu6cH)$qbB~#7}!lu*J|b zIMPKuCa0Her9JIf7XysZc4}8a6Y{_v~!zM=J^$)TG>vGS6{-p3~8j=v*=~%;+w3fDY$oYIw7qjPvT?r&6VFMTu-CH5fNm+5yEF zIy!&#Wik zPkukJ8CT)0vJ(``ZF?&?XqxB=2Qur`0Fj1hFR?^A1=#_r21cMCkMxklpz!SuLl*O+ zXN`@Ao#mQKuze3E&J0Xz=mr_QNSLLoICxfA&70aue-5q4#r7GdJ0Cr z@28iUKgp=v-Ix3Rj^Jj_#UT{R@Hr5-xJ8J@twRYezEzVF>AYHY2;)UxO~3vjk>o)i z*h3tYq)oCsiv!}^Ovbr>(4VLS<0=L|b~a4(2|!8W3JYOy**uaBYtQ%=N{GNm5crJ* zp5h%A(5)EW1H#_H@DH6W#yb=cZ{Q@)wDy&ogy1Z>*jxED0=K-}OLEHBul}fZgGP;9 zI0JrQy^DzRG@qFa-XU5-8D<2M`Y8@VQ<6Ww7;pMI;^bj^&jIP0Yqm@5Fc{1rsoI59*{( ziv}+Cg6+KzfTgW;#3%Nc8eUAllVK}FYac{_TOrQuk~X)^_RiY)oulkmjt8{U!gBR1 zFR`;oIfx)X_G>Tzr#x02Saj}4u6>Zx?%bQ1BIE%OqD03yC9{ip;nZ&lh8Z^@Oi#Jq z(%-)z1PxC<(HFbk05RJ(#hWE|H|%b%1Zz3yCX5?M=B6v&^re`mx(=uZPGFNY z1h`@L{_}vh73~{o=d2W-AswM*x4e#ChU1ZY1*|IaF@b>@6&c7 zse6*+Dc`q(@eh2i-E4l4DRQFyANIAwG@xij55sP!b-KJCn2|^5xioTAPT%(siH=(s zbA;|K#+kD-%o5r7qb5r85pYJAD$*?+Zif$}_7KLqk4?kqmGVJbJ!mI(tolEo30bAE zy~)soNMv^FETFov#F494Qr*dr1ZQ2hb(S5G6Fwnls0?K_foM95o4L zlQ5-}a(qbZmaEa4sFx(Ax2CcdNRC0ePIJTk7STeI(Ie$NBjLB6Q9MqVgrLS(itwEsCsswA!r z!!p9_bt6rJ6YI$Gxg1|2mP(L2>62L3?$6XY0;afcl$ zvbzUS+PEdfqy>uwztK*jy+Ns@Iy`>XaJHi8xZ|7rzI?SoY~Sx=ic^2geHeW|kwEY6 zX6qSZ`63oKZ_cl{$=D#FP7=!yzNi(w1zrJ)uV*>Y+c87lbFp+%QNvh5gK2a)-1&EQ zlyEdWN|dC+upLHvU2Z_sM~GZ~acIs*7%Fw`^wo{HI^7r@0;}3mHnc;Mn5LIR=G9Gr z)PLNI?t2uy3;%Z3gy0JjdP9RW4{33)34*1RjJ_G2AB1COo^QWMCN}R{gA=VcZEF<2 zgL(^bamb)&F|}@aI8$TPWLN#Pfwc6@JYa*i-veZ0XyWdL9^_+V={F5-8OV*-;A^lq zoRntslrz==2(b z-c!%#Xh?$V(L?e|lJ?L>S5IjT?%t|0JuIfIQAq3;wDXhY4pfhRUfO9#x>G)g`!dEl zo8Ass4yT+d!v4x?@b&yg110SPD~Ah9iU!+D^op%bj(2K7!?gLK7>dVHNhb)XLs9rb{^V=m?dh9G`NrI(4*Ne}m!9F!K0ch<>q z3e`~v$@^(|HYBRgcEm2c8JJ@{2++Wiy2h57>>P*|UD>h(D1jwExtO-K5>T~+@A!z+ z-RlvvIxx-paI`p{>GF?r-0h+AbP2+Dqg#NV-RY{o2Hy6@Sb$r+=JIh1hSC3nG=wAH zye_^?)BL20;2N%!XHU<7jHKq^K{)Xp)l?crsNIl(7NFSa^d4>$#&p4l0MUnFG3 zmjJ+tvVZQZf8tj{ZlNZxzgZrf>gdGbDPp@5DfWx#a<0CwEU%hn3$|GUjePMj-9)U5Z=H6trLKqAaU1zo9 z=hll|y`L&wX!s=hMVr#CgA^6n?=lYwRNR9~*_j_s%22A{nZ$GWtlS>%zO;PyD8wjd zuOe90+m);7Qbj{09CU>8)=+xDFVw?@mYOz*1&p!b-$kQTVXo70V5mfJ6cJ9W6ac)Y z)N-fR_|3af>n1iXA2O8k2>X&KqW;jufKADEBf_iH+OU$T#+D(C7OR!46H8Nv@z606 z-VMS)@Hdft&+gPmDLqdmxaFNQT&<{lk02nE0HGmaaD)YkgfTKNc)Zo9wtn~?jR63V zZ3PwssH7&r-fw;m)$z^I=lymBX5&Dqz9YDA&||eqv%QdYVfb108b(Iri{}v(;$gQs zNVc^8#AX)NBBJPi{1s%`O%Kt@hYdeVbK&nAB6$nZBD^4@qmPSc*dmVz#-C?yMSTG9 zRGi2(W@u2==aA$)s!jIc!@i85B%T4}REwYcsFwsPPX7$Yq?^|a#yu6uF*`kRHM?hv z*B56mWkx)m2i#OtE!KyTOJ#EhXX#w3sG7Wp5PQSroP{HK8%_60_z_(4lm{cO>mCqp zOtT4<;gqHk&vpTk_JKBtwj@oaIe95ATi^qd-Gc25CP&1N?6 zsGB&n@B3IWQAz0>LWex`nUA-xv6&b>Z-lnuuP;E~DC0IiOA-@@H3Skh zIF&II>j#bpj9MEhYB&R(GQrlF28*v(tXe;s+Vlz?b#!2!h+M|B+$eO3U6Hb@@Rax)x6)6fqJ{mqZHC)_anE;1 z{BIYJ+_*Z5gp_{Be2o6H>Rrdr{j0`?tljDg7*%xAjFZ=o=QhY(bu{YicTqiqoC_CN8$7nt843IMzA!UwL_(o1Hk7+{M!t>jzE+u zZ7L%0?ts;OWtwx(6vaErGItb;1IMp^`lOEVQ5R^TK@}aFdWy7u`jY zki$?N|7P2H08+$EG!ANyGg$0L(CFm5)`R}!9XMl1#@x7O zqX*A=UUy`C91)5>h|)0c>1x4ZHU-blOl+`ow-T#gY-dl)Sd~0pZV)cD3T@c}weMu> z7b-k5nxBxHx_(GFy;18y{10#cJ3#;u|YIpZ_2H{5^J^x z1Hw)_X7YnvV9Pzq)dpi7xw5CbXWD**dGc_3cerUOzWO_1Bj>5C!D!dCbl2%I zbB4)+lnSl+3={hf6nfUd1pja=qTGb?yz5_-Jy>)rpU=lrwmz=k$av0O#F`Pn&|jD{ zD$ZrC9?zpIZz5{J{S2D0T+E8feFF zl#%c^j!p1?b!i+7jjavM|C^>$lRRs8NPsYU>lcOSUB6x1enqQ{i0#6o)M$?wQo({KudFcLl)FU&LS1MVz|WvddhlsBxeui z_uoF<>yXRRXz@nsE)y#xV;XASC(W8(cElU%A%sv0*d=jiGJq`;lEw|A7zTN`fja?v zFrC&?)H9bw$+f@e2v`h;TxAZ#2RBjRfr;k9D2e|FvTd?kgp7$J)e>WHcP`nnGak&? zFfsmyUUc(1YieuOIEiqCnRjr4w&9OwkHVyRbF)+3ZpBqmj;I@$t@CWhHqUMg?aJoz zpo%IZ~mlG}Sg0iVU()~2H8e-shwU;L;3f&cGq|1)o0 z;7a(*Pjdf%w%ys(`9H4v{}ibH$8KFe0WM9MDM!|^U2T;@HFke>L|508+q3x#4%P~? ziKA2!PH<~hUf=cm0)hxgIh@*QvQtq;&IG{{=$qR<3j+%t&@1(~Yp#?vYG%~b%;@PG z%kSxVteUED?XYpGVN>-?rfpHI5@Um5X*>s%F`sf~}i5wKQ?oITIyq z(N`g5ycJ;8PBD2YlieVd{b3aoz(15CB}|{4RM@b%m>H$$NEW(-z>LNzKHS_1L`3 z&LC8YOP5T$f)4AK!}s@3Vm~wOey6L=by2IvUsE(8hGhfAYIbw0?M_KHY(GA=m_(j# zjH>c6f2yXSKAWX!^Q9z5lWw>-6kmDJg0a{8tR-vN*w#yVbC%)mIugSm{nKfu6#BDF zz_dXr|GJ#DuCCRmSvPx<c-J?3|`za6LY}m22-4QakJ)i`aPbmGuDo?Gc)ls`u9z*sbEwWr3zM8 z$u+uFm5ZH>0sl;;4L^o@>as+)RjxM=m(J8f=R?O6l(oy`fz*1fA#Znc^YZUQaJ*ch zm`vXGOKUTIBO?QFH^(~L$Nw~DL>{%$L+PqdJ^h0*?X6~gnz;g2J|WN)oR!)&8*y?| zq-*=vuahbZ2j7~#lu=Jxf7P-x6Od@;Im!X@0i31Y3B*$+sz+BlCSX>=RZ+27W#b5{ zF92OY223Y`9$f~s9AK~P3b{tDFt+5Cdu2-fFU#hkSu9Oyu@b9)E6;~LW9|%_dnRU7 zQCW!!vZ5PRp-#}X5ge!F)<#y##vVR_PKZ3qi2`fkn^&zUYZIJe0sy9->3L~8A{_Yo zU1D={}tD;C!pW;J|CpT?PC_*x@x48)k;5M1_J7>KJ&Unq0Yc2PN=H7qe^v^g8r zvw%bv>`hy4@BH4J`kmXK)#F&TxiyC0_Ou9@pf%8aeg*PQP5U@i6-7Mc8`3&6SFL@U*co+;i;P(EkAO|(0ul=^ zmA3N6Jdoafn)^)9V!oVSA(pArh=lhorBKjI(_+Olh2DNLFldofYJwBnNrn1Jg0X%M zG@=P+yVin%Nm5HUc!IMxQK(k#2!|S{+#rSYf+dwEO3zb@sw*boY#mJ^gvrj)XWP~} zJf5>s<+XiTXF~@m(e2tPK@6a;fe9Q^J@KuKr6NXF3|Z@8rUwyYi$_Iu2C{aZ=D6pkGC^W3X&T;hHl(_{+$i^4xbImt8*}rPUl7M@yMT(TTve zr|K&9i^a~^d!A6NxfLH*4zX6Nsh;e;Sme%<*Srt=3^THVmQK+o5rzDQ>Mjkft zjG_OQSpOfC77*n_HsEK_te3sBtG8w9mUbyeWdi_0O201Va+}AR_v=S%?&zAlPi=frU$$QA<1!r?I7a|KwB465Vk3FQb64=ziT;*BZ&+Um@cVv{ zgz;XG{)4A{^Yq5E@;l-c_OT?wOF%C+Dq&GLr;l7K0JQiOPYG0_S|BOqTbhp(avv1S z$#<>cErs>G7n;{Kp3)P;2k!x33gZR@+`qy2mDz+_mXO|%Qw0! zu(_Zl>hqo8J3&cR{B$U+YR?T(Dk|TU0Vb?&9wX-Sp-7y?yoi&I9P&x7@vMY?8U`>d zP_+RLhG<5d8uom8>ll1v#M+T4wXR`@;vKMV!ZW!+`%XuQ+nWBScu_kiPJQV=MVA7tH1%MzVIX5egHVr{F&2VyrT}h*ychL**73Jp9y7$5a*hgr>dI?MU92&o9 zrc^*WtDBGGR6Vx^B5KBI+~-Q>Wbzk(0=!PWG&(ajEXjk`uUVX}A$f&KGc%YTOT02H z$MsVSM%JhilfF-o#*vwpq%76SMp0t zCji7vXe{T{h5`O#Kpg;-#48hs3GoM6HgRkgj~DngRht)g+5AL2c;xB<_5mICiawAx%^u5fv(q^}k zv1?q*t-0R3U*S0F^oJO|UN+RlI}qDaf$phe@PVpVSiC9b<>2JeNxNjBPU6yc+l(jb zA2VP$#eDm+p&5FU|9-oAJ?gh*aS1@rLl2)qQ^vR^91tzE)-XgLh`WqTr(KNyGDb1V z%kU7p4MKf|X~4HPfONn3tI$S%UMr=~f~f(AbB;MWM?!&$oD<{N|4q8r(9uskKNPEp ztMz!uzzo)l!{_&OWf>zh7~!rV#vxkO)8xg)D{U1!W?tZASOww3j9 zD^;@$`#V=Suk<~{OqX)xss`YPA72|Yh@Gc73%GHnNzH;4rISJs_GGizvD~1A!9Se& zzU1hgc-_Z-Ps)40a6;gEE&#sGOiM&=G*Re%P#Gy26Z<}4^5w8hts#b1Aleu{L|Ap{ zQ;`DCa}ZF-wdKABCgJl&DgYFfc(O;WkgPW0c&ueE&`ytqcCsgqG%HXSu6~2M;T3Lg zhpq{}`~g!!7mZ@(NcTNQ_4USG@My+QXLu>@8}YLc_j2)D#5LX*zoTC_5ZG6bUJt$q z_P=-$ytn*sGBy~(pBMI|3Xq@0-4G*`x4!RHHa*0WfMI;3Sfy}>u#XPZp3BSHe z_t3Dwe7|9V*U+(8qjB+rU$bU@fmte}3gmbg34g|h^f|iAB`)qR}isNhtj`n$0i))^^KK!hp@12bUHFa~nK&1t(eyOrPl`qa-5j$n10B2&D*+q*@BLAQhX*9zA5 z*X)LYuK}Cv5Q&H=1%1$S-RL(ATe-Dcr!STo;Rl8-28BeT; z5eiiaPTi}Ob%l1_o0k{helWI&r|QuR#Vj4$L0eTSVV~f^^_2FW$aq(|y-nitk3Nfb z*BeHl96vGs1AsB#99^E|bqGSg4A4FTu2C}X<)1_h6o1cA#Nrag){Ij|BBKBIhs-kU z+TNLBI|yIv zNn&}`GYQ9&zJb==KDMF|2#yc#%iH>JD}XK&16CF#0(|`ZIDALNgti6&3~08jn%b9l zufQ#$vEQL{Vl3pcDI}S6*`=zIT6(zpGZ%lg8gz^%AH!7u?ms@yES_h}s~1Q9QPy0k zmNj|9+6E2BIK-&!^mdV$c9PE=Z}a^m;1nn2I0ZMgGP50h)CcwciJA?x7fM`DM4Q zq7PdrCtupSSqlmKq0JZR{Eh?QmVV$JBy@l!AUxwOXQ>d-UYa__sB-+z-Pt*Nbqcd) zcdC&9{;BtD>Wu-bg@q@b3uWG^F9K^d??S6t$5029JXjm&-@x~3oy zD7{Y1x3_mmHJ{(>*?jpa&qr63^5xmuturmDlqv_OQQ8eoefj380NmNGJ~uWYAUt=r zp;3P3^qo)FGFwqPc#SX@!s>#5h}Qa#c1rC}gpzbHn`LTkF!@zHxNx8z%xIz#`46Tz z@IUeypF4c8)69nh1Cd_N_ycvH6MRAjBToYT>==_CPLmI|%ffV{?=zF7= za(FW#BgRbVK4Q+Z$wy9i#9d})-&~u{hu4SW_iof*=Db!i-Ji^R_*Q^D>2V+~sNCYt z^`jJ*Ew!2Pdn4T)d&GI4;r&P(OpLyft*k2GxxC6r(agiU8*VA)PDM73xUjaXB9ost zhIgB5bfkc<$PN8eQ>R3=Wb*hv?^b@da;u}%!tuQ}&yTZv_fLJXd8WXaSexmTVeebh zHnv-O{UF!;ErYpvQ*)^>ZwVneLwM^6qX*C!aOa9vACxfBP)mVUdjo+O0}vV6M1#Ya zUYKR(j0`@OH86u>LA0QORfgRdE?Q5es1odGzXR3AHFrc8F{3TKsI_6(0Wpx!P`rZS z4rPF|tCkODE2POyT!Pal& zvq=LM2NO^kGaJhB95cG1#+q2h7Z*V};55OF3)of8U< zwiJ#sN)Km@1*Gbz7^|g?c?Qr7swIdGtZKg&QS1;Q^`NzEvau)1IMw$%194ziPXJ_Y z4RdLkC5+zj3wB~Nx%~UW`!1qgCZ%Cy#Hsp4*o=Y3^n{O~DN6E=(P8}~Or|(_N<+ZL znHdSaIok?JnV9j?Xm|*3TsUIARQY+=-TPA*@{6f zUg3Fm(G|ijp)tvT zfn_vzUd*tcMBzz*HtKGqQ`^A|x_4d8LXpZZtQ7kDyqH_*A*CvQd5&!;I4FHZAM$?N z-{cUyr>6jdB?e=BQ6JkI3HcEDkaUqDE{P=@_D{tf0ESq$7jZcKycFXN>lZ4Uz-oWb z82{iZe`cdY-F^IB%Uj}NeE^F^Q2rT!Ax?X#prgYsDk5Kr#q||~jQ6GbNH)f2t>_YN zC7SEWrY_EUG2CGDq5=z1PJuPsHD#=vj$n=J8P8d+RO?=Qb_dy-^k`lVk#n;@xC{XX zlr?$8**>xK_+6#0{aZ>Vm5*2j4F0pa?{Fl%;k&qh4R|q&57|3j4=L$9Q70+s@XB?u zw@vdl?KCdT-VJ5>&PYpN=OHY`KyI0%TE zzk4iW9*h zATM14dDbWf`H@m((7n_!3REZV;VDVZ^pk1P{GXU>#%ik(GW{eYMRK&!E%3|teEhlUQ4_d*XzUn z_F`7v9%lo(3Ul181hCn6fnb4$7nHY7G0Fcz!qDp>GO&9-Jm=>!fl%Ec2`aRbog_`x+>SC(0Py5Cd|^C8SwUikc2JxKDX{lh9@H`4Nr0 zfA<(b8OtS)f;;D&!UAxl=_x?J5FL?%xq>;pK}Y zusudFSw4E%AfoXL;tv>lbZRowJQK6H#si6l^0=Crvu5AHk~!^dSdDY{$C{M(h@N7E zFr3cBDtC-xDHqQlb>lP)=WVO=w8531#@ZWjb$b~?d!>7geSwW)d*ZOyEtk~+;)zAf)%}%7ylA6{I|}M+pGoDVq0`p)>Yx<$ z8*+{{%TgSgIPSkOGH%och%`I_-}+@VYDgKe;pu=1!N&c+2|0UiJZiB;SVYsSS7k~vv&5U z_)e<7C8Ii~jz}+ZEzyB|*oR=99p?PWs}tvLK80P>w@X#n8~6cU0^OJ#!|(*-#$YbF zo~1{IUF8Rvm`$|LYTRjdg}v?1NA=sCyf3j(`=TI&YdEO_sc$eQ1FJQA77I%Pb@VMs z5UKJ_*+5xKAk`(X`fi1p)ia?;_a9}K_ddM&H?H9yy_w5nA}Q4;%@ClCJlv&8?Pi=nd8r!Lwb3={G9xM z{OjZ14U-t{#`mK6bhQFkcZ?8&@6&Pn1n@EFjXd~6x4@Mu~JK;b* z8eMato0Y!XcCxBep8_5#IrmaGO)DNPk>6paPYX$JDcCKaa|H9gB*+TBI3tU@yVhsU z_;GFK;&LE%PSZlywmF}#ylfyERtlisHO1Fnm*;iTi0kvGKgVU!bWghMdZ1QG1?+@$Kvse(&r#h`*gqHceVjk!g< zweohB?agMCN`Yz)4d_pVaa7P;JrUKiju#|1&Dm^ViF(g2MAcfy)vgrR7kr6AbR?zT znzjNEb7N5um6UIa_MV)#<7k|Vu!}%bx7OIGIXVbj*PY8}fllnk;q%xui4<9UPb zJXm0uQiNy>H8MoSRS?ELaB3^tcsExuL_v+W*N*=b2JPqGXQ|B!%4@%yy{UC**uOi> zOk&jm&n&{~HpVQ%l%vjWJh%9Ik^O=5K)fzVYHj%(K%cA9U^OXwpvy?-me4B~ZMAf& z1cK$LD1v_I!N_gbrr*^e z<;N5``hqD&CA$B=_&Ue#%%UjW#&!j7>{M*qwr$(CS#c`1ZQHhO+fG;ahdW01y|@3u zI%k}9#@^4IkF~tk6(9=9I|m!#l^3+fmhPVsDqEh~zmyF*&{otI94)GoL~CV4)B6@} zZ<_2lvYbD8mo^vfVC%NEONFevuHk$me1N~IgZ7S?aBYOu|ND@^-diecg@xRouftN6 zs@o&em$NKCur0bZZ@v~w4l~@4^F`PTHVJUPS^XDDliQ?c}rR zQ$L>-L3^u}#GP!+9(gZ*QTf)8($|YF8B=?Xk>rZ=qh6gO;&LRd-cg3%`x`vp+>)L4 zhqvnA47KMG+V^Tm=51ADtB5ya=KRo12iJnNsyxpT!hjQ`O%Hmc^@i(@yJTJMhns2l zv@>m?2#S<6?QXO2f6oK+fd>4ox50boBkkhN`SxA zKGJcx?de)PbPD>zoBzb^xpBD1w9HEbe6FYU?)=BgH{D{?tpWD6>4X?w=)4yq6+j-Q@k`Bjs z<^AZQ8KYEST{3jEUrmV0?B0d^4z1|hsIQ?7xpCa90J4wh=~ebq^TBlQL!!M7mlUDT zLCsNuR)dYXK4r-rz)<^^iyaE@Jj?$xL1(nNV&F{D|Rh- z-YOV`#x!->}wk?DW7S@}3h0_$I zP>)t-hNNsq+!tbU6&q@E3jWc~E7@0jUFcUF6#~L*Bq*y+sa`@ar@wycLu01&;=!T9 zed&)QNu^}_Z2K)Id7=Sf+$RZ?TMB-`fjYw1Znz$5(*dL?%9HBO{1D(-kf9S}iT3D5 zmT5gFzX^k(aZJ&D3)ZX8LThJa;RKcPV}s%Kfy8oYR!+r$H;ka4(f}BTK+Swdm;dg6 zD6J|bQcN-+fPnV@S#L@He@PuDX9H&!Cq1KoW~={T@2BacNu9}c`m1Rv!z?if!bP8e>`7pe3n@c{|2-Uykf(NHxA58l1pL2g3u#K63Ogt958*d`AkzXcn1@H~j$TnjnFrwFktg{&doW1M|{vyUBGx9+@ zr0TCObPRiq2+FWEqAxf4PY)VZAQ&kLl!)f} zn*kqZaKHv_=q<5Otn_D32E!M3L3@}Ln(_c$s7n7`Q5&^1!a@R9fx{BC zp1fUH&`Ehj1IIZEn0N&37Sf+tB!NEK%Pjpu@rhJ432wg%r!X|qTHe<|a*-irxEW<0 z>H3rt3)I;!xZo`gvX#ZylzPNrRby_v04u6i+T)F&ELQ41zERguCPXW*2aimzT_PDs zy7A=nod=G`f&(t1+GQl-6NuHJx|lEWBl#@tWNO>Y(zTBM{u6Q&_g zd<+(g!~o_>KcoXK3{m96$*Ik68jr2G3@x%5qr@%5o@H$e~ zi6QN7WL0Qfh*&1=iL3yfDGaR{@F@T|u5E`3{QJ7cDxzzBu7}9+`Lk-%>;cyj)#-#= zOcISnoc)<67OH@X$B9rp`gK7-UQrLr^ZO5(mW1PvH}}?eW%=1uJU&swt*WQa!nlN8 zf~T$uTBjc7CBgX2v0ABudnLppbkOut2wRM)a8GZ^u`t^lkqQCPeKZ{3YWl#23p##_ zxMSe{iI}tHL@!Tp*b8dqoI%gVj48{}!Gk9+U&<%N8LT(Q^zj1CC~CB|Oi*wLjwf%o z>0aoN-7R^#&BfDu!M9Ua^&D$fj336g@2I9wBB09j>EzPFYbd)toyUaf9y>CI?S``< zV1(zyp63KAa>w2-JNDNlta^nD?oYg=#0_d%Zqh(-PQ2|yB|5ufLJ`jUqnNoHG!2)# z$Zzp*zi6MQ|FPT@P^83K&*yK^(6=m(oBO|FJ_Z7#)z`EWA?~WqaUgcY0tgJJ^^H3L0o7?k$*w9YVW1u`v zn;d2e9v}s0%Jd{tx-)vb>)O-s1&6M# zI(n`Fo-nZXz;49@bD|O#ij3OyypGJf+_znh1b^vQzQl#c2i>7h=kVYvh_jNvla2)sAzlI+IN_NsDO^7B`Hh;{MG1-rIb0M+}@ z_jxdbkK{VELI}HwXkR3CepYNIT|xsA4+3asnGmZrd;Kr{FrYIU>c92zwr$ch8;8N zI3!cJv15SW$waU^G5sC>ex(7vmTg3ppW`#v>F2qPzL%Qiv*k{Ca(EQx&`@X!^t$9S zQGv_RVeV{iWkj35+)H_9M6p89#Ckk1eNbI%mYh0YdUyx5(aP0YPamo01QslA9#QFt zC47!T`{5BW7n!HkLo^Z~flt0kY3hO+(OAuVW;L*ogvl}i1mPW5{Js*bACpqRMCI< z%E9Te)?7(;1ASI=Z^wO`wmzRM2&~*A9TShtm^Ed8Ekm;WaNhf6{P2Ffp*aEn5Y0et z>07-!oi&TPWzguDgtB%m8JKAtqhvXL)(u3Embfh@M73xiA2L~U>jhI_`QlfdWk0qm z*C;)UMjiV7_oy^l9Bgh91rU&4(ErkJ?c!|lUnbctpAWCi=DO3HcPjbw#(hqzbAyqQ zHTOi$=FL(UYqi+J#(G2!^U6fuRz$Bb0 zM34az7MUU3Ry#WFXh6Kv`m!Z*@os{4@RY5K=qk)Na~Hqy|t|M zZ~5d_y!0P4`fu6HT}z!O>Zh_iBvipCGFa>=_Onnxyuhj%o%H@Y!Yc^ zZy_{4Gza?@8j}Wa4QVMBQg0cIOGUDJ#z0wAH1#5=dKcU@K&?ecd^erF2f!IryShh?#Y80fw4BHWs*Ofi)tQZyP@UO0I z$X}!UxZR)kcgers)+z=tW@NWZWTN>PJsFYueyWeDfw+yS4P6zOOx=XfHgG zXX;^~x)d3D2E;UuSU^X%Z}uNLL=?y3HrciWzS^lRr}zvaKaJA3>;mFS{XQBekJ{4s z9l(Dz8;i!`Co&H2vx{&ZN4~q}W8hUir0RiieS%fK!8*abIH&6UZlL~(C%f$8f$1w$hRII!fB_@$m0nM;hv<*Qo~dPX;{4oN-Q|Jn;1}o9I>qI zCm46pkqyj)G5ls(U3GW3y`vtaA%RwpLnT|i9)7_`il%Hclq)C8Zk>^RGWf7wn_(;cHL;139E=65!4lsWC02?knCxxn;%y$i z6w=zOndkwxFh(R3QIywPi0y@9&!|@J(Rej~k-rV7qvE)@pA@{`9UyHnJ-VOw$EQO` zU=AFRydN>azE=Sn?EJ&wQSxLjD@C+7zOtrLKK9tn4q%0+k9cs?t~)P(uHk3JB8)-3 z<0g;6BYW0l93kZ*kL=v&n`8b_1@J@61$~VcB;HPw`N9lR^-qFx>%sJKi7aAC){1Xtj11lhIM zX?MY~6nMK#cEWg+BMAoL!VG_7bjJV(B`ZCbECMg}*Ry{0#}Y+s-8*C)qibwWMLQ`M zq~XrlEO@xV6vY7hq}>28Uf>c%6HfVs(;-6YFhAzyP6%IJ3Aw@-n6IbkGGhv09&7YD0Bto=UJzIj@IXk&uMV6S>(} z+n=e?4*1SBN?sWWGZP`wKOa4RZ^Kdor0chz6WTcX9Td zs6UJ87l1|Lial}-r&+KU;AkX&`*|$iT5N&bH-knq*FPDhpOrqS0)_Achg%*OLr;~j zB(I2JeH0L?L>69_=Lvypq7VFR`zNEyaDB$WU|b}^yi0x=324$X#;$j=4NStjpoRbF zs}<~+IInU6U4K5AkDY02zs?SxS6H85(LWgc)BsK5WdD$e7iv_}>xjXS<< z0t%tOjpE<2!r`60T~KQPR+vs-^TX5kH(UG)oQ5GhXw%=a$YOp8mr-I|e;pLHHM?ok z8KF01XU|?ROrS-emH}nZhe?Cm&L?27A^)&ejidDF5cFJ$c)140>DKbOBf%?Mpb_w0 zh;(X<)`?8B!9XWF3^XEy=_^xZVf6y4uoyk!etexOjGyKFtNBI24B z@Q}v2edfTW-N8GsRUsTAq%>T^b?c+>P~`cv&@4~!nq_~I!oAb!rfK+Nc}QSI!a`s# zVa|GVxWEn09Zgur6m0+t1R)&J5N+KdLJAAvKr9KFg+ZbxE;YUcGGJs`q!>?B-xg-0 z|J9Ufb3l@ZuG#?RVi+=Y*g|cayWkr=sQN3=uWPt-rCLpK*^^a^s@k*A1=*mYdKKlV zizW$bDR(3?x|c(B2nQf!W&#teNGH*%63#gbY;e?9JwtQUn42e^!JoKxi4cN)eO^0) zJXhGBp0t(^VLi<_yI+BoWT8n&a=?nSW*VNiK(tf7ghpA!HrW-rlg9^83rL3mn23}2 zoS~Ez(GZ$p`J@O!B~F<5hCJ0_5Y!^%c-6xc2Xn__8~@$%y1il5B}UYuf=Bs*X%u8+ z*X(+E=`8y*#>?(46ywW(gZ7nCLG##Ft>>I-coL{*atC`89HPdoM`DtN{FO}3Wxu*1Y*&9%l_6xt z5}@kVk*GN$Pery>Du3}$hnhz2^l*qice%879ha*hEI? z^@DM;%& z!!WyeX+%%Vu^OM8s)xuV?(s8sTKYs;+{R|fEzAJN_(t|mIatF$dvecCj=N9l9t>zX zUq^lfNwR5n(I$w-JVzUxH?q{Hm@bY4$^TUd_ZL9a0!j=*Q4Uqg!3#nE$-hxWIxs~< zN_bfy$*80LiN)Xfbng9)$B&c*@npU*f9JyErp#!wlQjnGPKuXRN#kKnM zP)bhcDlW6Rv*qYCE?o62(wA$*ZBRex4596#DC~m;jDjYdP1C8FX#zigh>sGgI3(q~Rk6=;( z#PPKE3UKrxhzx%`@zzF5C6z^QuaMxL@f{~qAZ}fQh_4)}RpQ9HB%_cUfVVS`62RDq z=yhQNq2;M*o*ttRlj0F-um2a~>zA=GlgPbRz!GEuFQRBR+O>KpiG}w@?b7OJwBppV zp`uLvTvz=OvWP#uWxL^~AXegpulcx#gRuBB& z5prNITDe)U`j@zjUbd0-6ST^N!)V(!x&6Ho=4D+fc$xB)k`FIJ3ywcND=1f^WNV3> z#V2`$+Kp}~oN~m8iEs)im#~d2<&iUaqk{uq3#;%XPFnPR)Zn=3lk?{=BMZ!J-u^`A z6NvhLYC%BoOGYb(4ATCw?bUt65sjWtR%WamIcCOFs8d9A=O40y@q*K|v8-0GCk#d5 z-v8|`!O;e$%z%wq!&RZB#QbQ?%}<+X=wMc>^_!HyA$+iW>JDTs+aXkM{WKzJ7(#dy zL3QqCD$>~v#;jUe%UEr}0rnn9lhJulQvZ%*v=zYb-0y!wk8&U=^Ov+<9s6l@c$WII zsw_?xnwX8Bq26$v378Q=AFOH6S2YP=!XjP!%N+0+!e#@2f-=RNzvTQ`HXDok13So|NoNxNX zTEt_#^qn|(iKI^{5)WIeB#a2_>K{||qU_(juJBWh83^t3aznYIL&o@Z7vY(xwZpY` zL{ikZ!fe20D)YdKvYr^D-Nu|lyXcQMWtIrVk=8e@f~8q+WH1-R$78gzwZxEXX510;0wvTqy1^+B-?9yg+ytuWfT9_BTmwW+?8!8xwk&=BeCOT# zI+0CYX*uU!kovv1L{8599PKo>WHTyP`qGL6B ze1bygoSP#GOwVRDl)~KE$p(pNyte08c}IdyfH+sySxWqFiZJu>EG_XgiSZ*GL^Z|v z3lR1genxAZxbJi#cN7Y=BBp`tl{1_4m9r9RO{}7bFq{wC`TzW1J>Il`$x#(u!>JgoQZeF9R zV18DkeNNrIr4JrVhgyF%Pf;(iNZeKtrfV$T+yS2mFcqOvD64Uhh(5}+rFzPbg9Rg* z>YLTtod@z96H1LOS|Hl@bKP;{Y3hV-+s7md)mKp!P=L!tzp{89);^TJtg3Va2Bnk8 zM_ITVr6?!=m6p4kO{zQluT|>V?H37yU=o4oDsKZMJ*)AriRYHFB}E?t_Z)Lp;_QEE zDA_ayO~df5(WpXHN&5Uhpp=}&6_x4-8@E?HmMqGIqT>>%xtw$`^dJqLc&*q#W#90I z{ku8*(!2Q9?Y~Uh(d%oXew>8;P8V&VGKdxJYw`nXNH3nv)e@~bjA>F;jPK=u-+HED z@YeR@zV!-Mw!2B=md~O}7?1tDV()P+w|m*g{+`07o4GV~PF6=|Ve9CA75~McY`ok1 zBf}RS&cVshVDn6%2jZea!5KIxbAz*+wNqB`cV_AP`r!9@s!_vIH<&NZ@uf=+wV4D( z-ZJ2nTdtW3UJjZOX`nDw{tr-^1zcyTzk>TuSCTv}_w&U4m^Cz@IDErdiztt%DEqC3 z-86Q+U_L&#yO&2vhhD9vt=sXUVOjz_IaLtMFuSN$MQEbO5t+7(17A8NH<;vj4 z5n(XOuvWgHh!(B4v$cGc1kV8K=M=P{dmiEef7O$8J@4q4u=nr|hn8Z=o1=p1v3q3= z2NEg~c;680w5 z0;42i;wnzpPR0iWBFLtU`zi6GNP?rIH(p)tz>WPNKw{Z-Nx}~(E6~uz*k0Fn@djR{ zKCJ6ru>!V_US4*>h+2KB7t~1q<{#YV9}R6RPV*wVOk^>PJ{Mpk$-;e<8TBJWDBvKi zhmKM^)mO}bs;Nby;ep?0FoWT5RpTN-hG>}LE$SW4k6k5{3piNBU0ZG>9|n$pWv-wF zeN0I{0Fo=aJJl{tc4bpPrpG1VDinRHn{!mp%Qw%S9aezO3)2EZKGW8>h1b96wY|%_ z0=y`ufJ{LHb4CJayqzK31zq}t@w|J#$|eH0FYWnK#9_!F(`HMu6Oe7(b8cq*R~LTZ zK#2~Y;KY5r;8L5P6ej$0cz>ec0MRzB2&~pQLj4S-4J& z(8||PO82H?cmDxF11)S6|7Cy{t*fPbdxh*p8iZgFsrYw0jaEmLLvC6?CC?n+HIlW} zSR<@22+}c%K8?=wib(`$QcM^JPvi??M(l>4vm3MwbE(BeKT}Se@oSwnvBm3NVx)3E z(C&|hG(GPrBk3H_uynyM7zk@Q0vz%PPMOaa_j<@yT;(NMyz~(TP1GMvo5qTVF;e%2QZw5QhS(EH;>!2T7 z!)dm%Wf0Gw=q|FP4312-vS;qT4|6MWpG=mh;qVv-9+Bb|KD@l1kbVMMs;uw-zFV?r zVXFjy)fTPWV6K8S&#hwHVCFW~%c55M`#S7!L9Sy2x`baiG9T*s*-9IHpvfNp{RlX^uh=4AAQR_noSAXO8b^t-*c zk_f7OpD)19F1=koA_bhwQ{#GkS-dCo;t^y9!~+P+B+d<{(9M=ZV=<=|Hn_>A;`_H}LpRGknklG|La#cpPB7e6Fs&X#9D)qX4gTQr1SM1J?8 zGZV&4+;~+v8Kv9z_1?YUUc?^CR7GIMqqaeFq*gIA31%pu&{nlI-sM#R3-< z&PZ+I9KTLJ^eOjO2(HRNXWb+m(b>i*I@Rn@w`qd%)ADeeyK$Tc5;l@p^iTPxEe->% zE&jWe=gScI8-V_goOQ%<7l+%h5QL%v5N$Jv3ET~*S(H6Ja}7WEPVJY9YHdR+SwpPt zwfrX9bujR7mDWKJa@^7UCOlzZAj6Lpr^|~rPm3w&-eT-4^f#=TG55W{ArTa zaA>S-8TB=G@y|P^mfgG5YDcgf_PVXw;e@lneH!f$pYER0sw`7@S3NP<3lML$Q+F$~ zgzVivO+UsGYkJnUt!#V2Yw@QTw{2W`RYkfXri(p?6&Ol>)3xNtgQ3}48ng3wcK+lL zWBYkJIsGze&sLnY!J|7MaMtDOTK1=$1ds~bX#i>(%v(9Azo*gwrMVK3D1*Kvl2+DFIXB#kUk_(T^G z0e+uvft{p=TUXuwD4EU0%vT$9!y}!HWs!nu=(o*oH@Tv?zhJ6l%U{>?@XsLTrNs6M z`Ll^SZ(L^q#d@iLyJ{uSPAzhJhaeXg$PWrK{5Lh176)2*geXYYrnC-tfKkc2Ax(CO zs~tlFBI%Pq#<~#ZBmSRdngkvc4c@5cKx!kx1>^O1l+DO=Pu~2C;oT2$O!u&e1sn!1 zZeD_ndTj??WdfS^0gILkX4=$xB)5{o6c2lRe{B*FKPTRLXjbo;l5R;h)vqedbfy%D zgvsY3Lbf)UD+Kc|{m^o~l<`?vAgw9~%$Di^k!&6A6RqRpTe&Pe-1hHUB)9gk9c~Zq zRdydAXM1n^$A`YC*VkPzCH|x#JFFM_;?vzV#2G!D&d-I|Fu(7KiX7b@kB^mtgT#d# zzqgv6FCLB@fA7}TNnYKlV~@Jmrpoi9r>UzgJK*p%eK)(Gy@DG2pOZwp=7LxJzEB47 zXwWuH-B#)b(WK1djrMdB<6oP3KbQqjlT-%=1&M3H$4kb%4M0^sV-Lv_NWBaztuFOa zNt6g^^f}$)rYNQ9c6?mEzV4$b-8hFC1q&)5z=$nW?Pc+pzYbrfAyW6mrJ}LmUqVUB z%L1?^?8hPGnFcyNUY+=vi%p3t}bBd4U? zIh4I(A-gbwGXc>EP=B1v@5MtF`0-R}rp0Z1+CMwd8fowPjLE{`at_;Zv6Odb=TKNv z*YLYuMz-5n)+~A8eSgNdeQm)sTejX=MZ*%~GR^YLPOY8ktsz84jbQ8aiS6FUIE{* zN!p}JG9#gN)YR#1JsY2~J3j_gINYz6txWH(pI`Vh+dl;=xN?|Z=wI;MFk8xwM1vV} zSFqG(Y_?dLxf$CQM(!)g))oSyNGtW$*FYAWc^e>FJv&&9A`~nLYNKU@Q(l{W$-j%S zZ5@7pMj6Kox^?ousAbtw%{X_d5LQq2p;l7kezC{BB4G{)Og8~1?`umB!XRV2nqL#i zTapl>`?RREk6=XA`%9=(?irE#lz{zB1e05P9mi!r3^@~~s#P_$f#W!2F!$ah-7X$; z?CcH}`(@Ca+mR?sojpPVO-5h7s8d%M)kF4yR6DY##c9jX7MBDRJeEBmSNsafn~OE3 zPUTn}Ck3X%;k9!q<`tVG>@|mX1KR$)eSLk&cYhQOEEJac64KBy5yy=;ILjCd-2hGm zS<|OL*$t%xDO=sI|49juFVH#qc3S;I6Y%!Pu@$S$^*2~xydL-WvB z!tJN1HbxL!_Vr#Q)%wVVGm2W)eCrP%M6Ssr>BCywz{>DVSvlz*#>Pid!}FW~B}D$> zh~I8=@~Tje6?JUu>Wazy(Oe8<1Jn{C?SB`9qEDUQ_I`P8 zoO4nzNn0TKL`)Tr-vAa*Or|RX!CG2|Gm+2*UCsOKX(KLO=!~o9>)#jFF!#O6pY03s zcXoi=KBXuCYE`B)y>1<#H&Z6F8s>U6?;yC|d!phZ=mbTOKo{qnuKiXxIjPkf|LRuW zD`*z1Vc)!?3UUELBM}+I%7$vAdW?->=gwNyapuZB)%hTkRs-4(N64vw*)q(qJ79Q| z*deOGP{uM*Yufaf40f4Bu)f(EwYfH6Mk%8MUprC_dQeOB)-roj7@w1NF^OQ}X6xA= zR;NhSSTV^AgDPpwgmaA>|LeS`n$)nXMR(n?Ed$0z2}Abo1X~huDIm-d^iytcCix9i zx6B+BfAQsU7eg^`P`imr@&+s?>Ny99kgI28`61omBg4MrLLT{t2B^tHxRhbHpocJeQB#-#!xP+p9t!u!IJf8;GHxM?n1xJjI)rIO-lHhnwx zNvxk;-8*c*bX z&FA;N6Y-Mp4yll_Orbd~w%kJq*B%T3_79dkU2JI)*&*q0#4RBwVrgRR%Fn6=JCs*5RgWGz zv<8_@9W~RZ>o|blLj#&)*QFj@GIXPvt_kH4(bJ|Z=byYTH;eJd@yuW8c-<`4Y!ez$ zxOP^IvY@s`;b^;*!eat0ELa$a;C^;mZWiI!`U_tLyOmyoAyMpgpRfM<#}WQws)mcp zB#2Ot)XfkPO7BZ^B(>h>u?&w)zdO}aGLYZm3_FYd?NXO>rnTsky&>-QukKd&SQR!F zcH{i31;QF<8DiO<Ny6A)$^x7tC-0Hq10z9l{JT2Qh!GPq_YDqvXDg{1 z;-|@2N<}oNa*hhChZ&*dWWBAcg zk(|jkLjyRTAp(JE_$GA5_mH^JvYXVC=s?^Fz%C%MrktQy)s~B>`muVpvIqMkFH@_V zu&7gb(ipmqW{=qnb7eslXLTjOG$CfqA$D}^m>rwcQ_FsOXbo02Yl7lqhF;+oi&TcX zf5>jP63Js>XR{KhZ00q&N*c)!R!B6_YCf4e)E#B@i{rfONc57T!5?aG!R6P*De7W$ zyd^F|#D)vMj50$d3T0-a!F;~Re7zozd%i_IaZ6wd_B_7SsuJDtPDV*yg|Pgz_Hkvh z@V;j5QvDmk@yhUft>|a3(sQSnoXn+-^s3{srm;+4U81k2Uo2*fAYocuK1sGeYU!d z`nWoDr&x*6rn+pMo2nt~Fc#IakMHKwsf8L`50vLJ?kPudtx{{8hE1Arjw zmH^Vt-D)Gq6sW>gE$p#D^-VUH22?D}9SP*OCoU7p4$r#>#CzlI*bR8%Fo$0O{&5=>`Xz8GhW?iZsH5T*H}d3@YlA$5Nn* zhH${%duYibv#Q6MMNCiorB00QB%R0N{#s67m@x5K2#n)!w)Bz!xC?1%78U$r5tx>b z=*PSilMFrYTj+J0+}9IRGgFxbOA~w|)7~_<8a01MSSXZL6`yWa-d6VG^?g`( z-#H!5-IS}eo2*UG1*xxP*y7Fk-fJ3=>^&{)KTM9C{xeAyFkl=rqFp{cP8LN-6(Gg1 zz^0`~MSmKx*pPOGX1t7O=ZkgkEAfG>HH5a)jzg9CzIHn2WpzL1GN~Pc(hqxe@Xz#z z_;R2IDYWGAHt;WTRgiiV_5qB5VwqlvUA8l}c1pNq{3O787WQo1F;2?~6n0)>q#n!# za0qvZ1~)Ik;KXg@TKC&wD(D*FVG8_9W!Cu8>L=Q2*+}c2B*QZvK@hJ)OqpS++iFWS z+fnn}ZMK`LvDY{(xcTu|mBqt=hL=Kd5)*(TNB_F8#=9bbxZ8y{`oVEz`%fsX=Y=@R z1bJWV8DIBIA>2l{_Cg=-ds9b*w^PjD;`%6yjg07pd{>KkH83}>z_Y2xvGdWa$5kw4O}2%#<-g%|~So#$quq)1HSa<5Sp`6ZGZfeC`d$DXL;q`9Nle*r@ zIZ4kjQuBs~#>pM#IPtFbIl74yZ0N{vBF_+N>hzr79AOoAv|MXBXk>yIY8`kboS?Je zF}^|phL@GG`xeU4T_il zkr587SShyZDLq^M?7l>OQ~{Ac6|B*u758o8g@J88b~hab2I1T{ky?fX`S!k&q*`d( z%tu?(N#(qf1qIEEdRnU3fiPPaLTI^)VJO3GV1OWB>~k%&8ou)f%xmw#vcXFJy1C25$F`RhESB|ZDs7E5@EX5u;RC}?7F=M zX(6A)fV&G_{Uz+8%f*-0WAg{g>*jaK%sZFiRq`~u+LQ3{*w;tDot|GF(~a@~yz>cc z_IFjb#jTN$KIP|O^p)Gu32?>7{j<{r%nWmC!Nz^&L*GG+?B^< zgv?TxpM;XEKi;78Hiz2OyDe&|>fY25M`r|G7{3eW>R*_4oo#>MEGM)4X$#=JTB$1` zXmgqzj+P5zy%@LoIDWlzD^`Ku+7GG8jAMR+I&OF$6r13;6Q$SaG2mmv4;?01NZ4N9 zNaa0tbwGPzzBA|H0n6-gDkk9BhgiPt?W{jtu~O&Ekq`OYiQSK7t~GMKY}05xzy=C9 z$${{3;^knR>9ocXhp6MEPvw6GQ_&wq#U$m8`kp}#m`U*j;D*(+NJip6C=iQ!?2($u zD9Y*&OMg{DA-WIH#c>BI5EtdUz)6=uC zwQ$zc`v+0k#7)5T(<6zzyhY9?3sSrT(|XfvN;v#RnRgB5PcLJt+p%kGiZxGpK|aPS zYHX4mi|K^H)Xi6h9fZhIlvtP82;@1N&w~`l zBDt_muKGndm{psiu`pv|asC3pbP_j_&b3qI^EH=^fJ>`pG)B)+`f)s0{VchEGL<%T zAVJ~ciH*Rql^jy+1p4n&k;CXb=Y#|Tx1%#6 zNz!1Ec~Ln}SoLWZ4Nw)d7tB&Yc^nk74G|gY6zr|<5Sw+q7I;}0V92%_z(ScQ-Dclr{MD-X+*zB}km%E``T?EzjI}0Tg!J)Hu!e@8L zADU$`U0NJtS)37N-`YMn9&8CIMPBamp7VdoWAZbbt5gsEWy)H&|Ips7reJ=D!#xP0 ze~LY8qvEp(P*|^LYN!ku_SBRoQw@<WJh@t|+EmcF< zCB?nLOQtJTeKy9{>k}J0@<-GwmI4e@#(xQ9e58F+Y@!<5MDAz}K$t{tI;Z(6tsmn^ z)Aou00b0mUiL5cuji1rT4x7@eB9`IJX}i&C==b+RN5fzvK~1t>CVx?-}L2Ec3LZ=Xk-l!^ONFa!3GG~JAZ zuIW6JGq2<6jcU<361yPziWoj`qS$)?Ka|SXVA!@|(Z-?Nk1m&&N@V+NF8vFC{0e+b zb+zO!nNXAq4h^^sG3*iQHgDmVl<+ze=e_t;a5nkshG4Cff6#+U)qdwH+K6qtoGg7w z{{+08072F#E-yv69%S&MF_nrgWYdvN|H`kDHULpEp^~lqWrHK0wFzr>vDr`RWuR5q zcL?n9Cw+{vzB4w}9KcCKLNDBJ+n zY)rxxm&f&L#s{VXCMd5wpBYlHzo^aymbKvWk_#2aBJbX6q`MfU?L}xEC$5aX_`rKQ z^v+vWuO9eQdo)?SZODlx;#~hczIYfi)E~6hWbh-llgYgE1OM29fO?8k`i$S?0XYq{ z)Jn(&AaAM!oYHwtY|N1AVPopyEI~>MvL&b((GukHGXn>X=?5+$p%7pa=V0RrkwZa{ zSlC}o%^o&4xa-YlLQyznYC9&b&DEcB_=3hsKXEn5uoHw)aa&GrB&x65*W<2dO6_#4 zSkXc@*)RN@-BFF|Sa%m7_{G15wqst5bV1h5`g{E$QLPlFVx|zSB!k=ME|dNQ$1aTr z@r~dcD(w6H?E&Qx5B^H1*QHB{ZqhSG_+Mk*K%`swjbL7VWpzpZy(0NY<`&1jgPN>4 zO2{(m4*KaT)d}Lcz$BMnH3@(2ZPJ5_N1sF0rq;&F3XyD$y1MEq5$SAW^37FkKf z2D?bBg+tPjGk!Z}{GHU89Oa!QV>Esg>|V&dt7I5*z%GvTBRl;vE_>! zX*6c5ZRwpwi%nFDafoIR%%{L=(#39uhL(gPbFzv&3Z~>^(B2UlVanrB z#hSAwS|;0@K=nv)Qn}D2p&}yGYYE+!Us>SX7NyN#C|~>vsl@L_hRkV_Inr{SARKyv z7hwm%3cTvP#!R(5QI{-2ptD^F3e(!g67sFq@l{OwAB4SQkZfU;EZVkh+qQk$wr$(C zZM#p~w%w;~+jhU6xp80InRxSVMeO=f5qsDED!$mcYURpIy6bNk3SS2YaTh^1$_;xV z#LQS--*~TvY$vz0&!n31SYr4aKygE zr6!>L(%Pdy3t}{By`&C?YC3F~{GZ!8euwUyyGnX*dOD_5#4=JO;sD?xnF9v?u_-A+ zARLV_(mC9?S2!{gy%Cf$E$Y-(zfOiOa+Qb%4W*#;xYLgR$6Z zZ6X^C7Va{jDOvlHc!iY{sKOe75Rsj0tO_$$AIEzC6?%Ws7T~uQ`Og>r@4LN)J-wc* ziLJ4nBmJ+`?SB^}_8xT39`+{2!2b=oTg3aQSbxtK{FR3P{~))ciM^ep^Z!Eb9OYl+ zW`ODXMeghd|19{i`YR7;nwFEy)KigaqV~jWmXD_rJl8`OizrqY^3*X*M~;TMQ(kWo zIeHd#^f4RjmmCrI^=kjxC(o}8mMcbta1?ABn3>#U67-)-+`B@l@rlcVR=9xx_hBs` zqE?e&mB7TsAo%nFwp?dD3aDxF#Y__CAqeLXjGzWE`QU^Xdd$8Z@UP=bbK^i;0n9(W z-y;GPaPdri&#Y<%>eCgq+ERhQM|&~ZUvu@kj#@@~RfNPh%L^jA0yk6sq z9-s+`%6`-uQ-CmCQwfmH(0aUrS0k%zALxCaGz@u@mzN(iA*PlEA=R-`$g*eDRbN{`#ldW{ycTf=7A?vUdgY z>f^me&OFN&oh0%gF|_%*0!;d&S%dkg{~okzS%hco?;@k!g-YuGO-1|yJ=yby*7BwX z8I1#>u6G4hn1EPeb#wkb6|fJd z_zYt;>6u&}vK6PB3Oj>lRoxPHRZh{#rhf&mh&cRhfnn9daTb;~Sj&r=Y^ki%F0pag zIS#9hEA^A}!zH4)(C>nnPP~yn{ml5$6IyQqFl=>&k<+}?m=(Uj|8>)PX}5sCq5S4Y z$p2q<-GA=i|Ew3Ac{XA<#!_zHBQu|aNQIA0+1Ap)n$$;K14nEdfNKMcOXuS$>K7|5 zB8}CJCnNX#cAR9l=#|}OrC;@{#w(RnPJD@n>#aTluGTw_I|Z9!vLRihV7ls^P+X}3HP-#l@&abAOQp9h^9km`Q5({~Og zZoxpE>rK=kPk$x;M(?UwY5ROpyjrk*4E-<;WE0zkW|{6hk0QN{tA3Y8mGazMVsvKC zn!(gmeg3T??d(3^B7Xg-r1tuBVb_{6ZPd|`9G`;Z^If}xJDI+!9c~Wvb9sujks8m) z1f;HOsKI1EAi0nt^cZe2W5WqH9&N$0(w#DY7iWiIpup>PfXd}*GSWdDqcsa_sIbH! z&ICa7TFHjobltSI>chLRzqa4~yF$+34=^_OfOI<}IWC#*pqC!xKH3tVaI;~m2Tiib z(;qq_IQ(MWjTVEke9?aR5ZYV`XS-=;B{;R z+$Mc9pw)3QxXKR53=sHqzH)idS|wCJvMEcL4WNd?-&&aQ(sgn26*#s*{6091GE|Dk zKaCz$0($g%RvI8$5)TaH0pEmzD!(u4&YDD5z|kogxrb8@v1STEwDI{(dv+J3h?^2L z)8o71XQVPoYPBBlCtkIkUrv!?^Y~s*s{6%spljshj38f-kibcuRqx%cw}CTty)Srg~ZUcu@+>U96-KkTVlD%u#z3LN~@<0z@7Tkszt!T?( zX)Ztgxe9wy!iIP0ybD`>5)1=B&v8r;Y+=7XWql9jI(XdoQWgZTe>0~Y5#Ya6c2Bd^ z0X-ch8c=?+BCE~M?FGUw0vrh%f@bdT^$p}@1rTCZcRA`n(Q2Ns-Ssv{l+JF4vHh?p zwwCR%0hC}oTM*F?o0Z7wDG5G7`XFMMVYt2$9Z(qGBb2m9fcT2Gt#?;v&WMGx^)Tx% zNl^yLTdLu~MXhY|+l!WZrkFte)>OBFcu14>po`LnI^%kov+UjsK#MSRt-Q8sOW(R2 z$e~rp^RVGZ52>}b4#m?Xmm#GZ?k4WV$dtPZ8k(a+cVS zXEGMP4lNmAO2abUtfXgQE}62VzpD^WwrOZmXiNjZ;#UG_GV|JQ!*9RM`{VD!&9>wT z{sV_DThUJ@{%97a^_1J^+uf`GueJ-8Ibt33Ot(^D`0@wrs^Rb;klHgg(N(!VbiQ^M zHb`M)?#Q4T!8zq1XXqWd>r4HkMK|WIx>LZ5XxPU{`=({jZsSWAUPVl~9iRsai1dTN z72bWym%x0vT8%njYs-N$#f6Oyq;*EDJ*+5aqQ^7Tlr;fIKE)_{8EhP$r{6OH#g zLDp0EG2A@Z+s&&C?T6kU@YfpnO4VF~=1|zL2d*hI)f4~xYUAeS62pemu8+@$a3rR* zD8~3EdQCxdH*#0o!_sUk=DyDM)gosLHUAbI1Aru$F!je@UcfY5e>U?x_1<>zPdSHe z@`N{0I~k8iu>o+)QXtSjA>Gh@2Rr&__K<=qi$e)o^r6~ z08m+M42GK*Dqv$1n3@pK{W%yzdUrd>In?*#HSkv3kLD*H@73$mjQC2L>o*3ssJ4E? zn~|`tTqpTC)2Z$@a)9k{jW9OENjI^sWWJtI_- za3Ou(E!t#q(k+!7_j_}y-1f@-Ogh7SlS@Q7?@L!#nOmMgH$5RiMeUHKzDZw2jWF5_ zbJqu`xtqRBM(+@OT6(*5J5sW*6HYy3rkDjYo%9dcr@F_oe*CTU{^#{|^d2+7a8G$L zSgHzvjy0UT24J0^6LG4!yXl9rvVVX)82;=d+_(~P!sGb@S;r8$T02cO@RYk9L9G6R!%=?Kx5{UP(%_q#065e}uVarsNjgb7+)en>{ zBOBx9o*-x8Acr}VOeDhizt=O za0Nlab~!koKm{aDo8ib#C_7`hN;>`*^duy8t{Ne83d;LUzZus$g^Vq^X=OM6s$sYp zaW7QkW)#QM8fx^{r3M%NFr7fpOk$r2KGp#Mcww99FNySro$m~&MdaGIa$rInC&Hq3 zDS-by>C-o8?ed1xX}=feU`p#h=>eJr^glWTQQ|1zC396nml-a+hZ@{<6L%4CB|tit zWz!-Qp{U~YP(ujD-q$%yjWxn*IP5yn={)L;tW!MvB*1KZuE2rfxeaYo7pOaX6T3oA zG1#^XYOQX7zS^Wj1Ut#>$@X@!R34S4_Ir0u+xTW9hvVnZVyqt{B}FRb8I-4PFe+;$tcEBIt_|1`OplF3ly;`?GXbO zhCwQM<6yb|z@9VNON;bk#|dcFp&?O!1Xb!gsYKpJVt_67;9Trok`~Kyc@*-jH5lNa zf_sYS^Yqssu{c~>4)mn?E8gmF>UtXpigffvuk{x6BAmsFB2Gkmfc;H4#TWk_`Ode9 z?2(4vLlsr`sfIq+(bVEKus}BOtg1>7XNR8!x0RjWxJ8(%G0! zi4mcTNDN=p053o&C5?kbl7q_J>1B_hQB|aLGQ2??6_lm8`BqzbTO3dxQ(?+5U94PSC z7ix9a7eTPHLa1u%vV2eOn%4buF!a?c{sP@bfOcsmJ%8rRlFm-nhh6?=gc)qNgD#+8 z4ETov>{~ed>vs#++gf%aQ^?W?>%P4Ne!)7U0x0igg48f+4foY5;8ZU>ozkU9$XsJG zf?vFZOe_spC>#C+&sPMv0(CYV)iKMqfv8J1XI{OXl;tEw!T<$1Ay99nwIMF)7Ng(A z3;6&W&XKwz{{*tQ6lc@|KV|?tPx(?&yvi)AU@VdaaY(lE6#xLagvw`2B(CQ9!+c6b zSo)4%4-+qq*6R>a6!mB|@FRKd1Z^P<68axIR9^aYroD>M}?f&5g zxQtGGAQh*4m3a4Eh1eF{2M8?firp;HWW$Oz086$tw|ZW^B8(}X`*&uh!5SjF+X$_J zwPVJO&n+r32b^`%xP~#=LZsh(HoU~*fazdwH|C_}2@n!rG)13`HoL=*5oK9FzCb7j zdwpi6a&^&F9V+k8)cq4&BskR`1}&Xy)c*-sEP>tmM2+W9iCEFWHsb-`zS5 zzypo6!ZC>$F(1pnB4TE*;p5Qxv5ZL>Z}aYJhr-u;#gc^?a>n6!*9}VaWEgqfjcLhE zUz3vo{KX!6PThY8uJmRl=|5I#DFU-D28#6LZ@z70ANCX5{Cs@eJE*>4Kn`t$=PbBX zD0)b=mD;6#Cdej$)g$=*r#obxy3i1QCZe{FnDio}mP$PHHkzoLv`?wsA-VY!V42lC zon!W9eX`k?-U+OcqnHE^;6CmF#3MpuZ6>Dk6*+h6fA$8gQk?tJEg(96XHHw#sf`uA zl{S1!9w6C*1gRCG@|ol@_IW4Myg}z?*U3k_ta180+sk@|K(up<82)nNZ{(6!kPlC? zJrwWgGF6x64rm8Dem9hwa_}REsNeCdSfdX?biA2+{!Cz9dbqGrtEk~QNLMCl(ksN! zej07D04c@p=S?u)Y`BJ>p|JCVb&fml?U``heI76UTv0zl^9iV9v#;%$c-{AyE~+V# zb#+Hs^&hLLD;FTlh`%vMQoP+O%Jw&IFQ+XWp3zg5X@^6(C#VtfvGRkH42@}|#+53i zHB7>SB~?qtgyZ4xdRi0}<+m4rWP!`Jm|M6QazfC6x;860ilSwxw3eWl=g#6WDpIX$QW%witOq=G-Gc%bKbS5ego3?nL07k87 zt9J-Ne5_Zp=(`BWOY(YCP1cqnMCaW#p(1K}I7@VE8%q)lzi26-F=#K^c21!jxvVGp zu2-o5otVz$fUWl5>Wxz2yk-zwaGpl6=14h11lHa1Tkvluy!(U4ag%O1<9d_Qfs(?I zr@Gu(PgX?u>}5mEA|CoTL0ct&g&+?*Z4q?TA3s00;E>)N4p;}vT)umfx8kkC>qXpHn8nUc%PZ>OKSQ|lT ze6if-ORFter>V&Y*7W3}gGJJF_`6(+wXH#cF;|x<1?M3U@M1);0WoLRbZe8Oz-A`rH-Zhp*_th(N^v-Dm*v^H(b_0lc9 z#g<|E7UCPmg{MyW76n63Bs#GVe4j|Z6 zcaH0LKzgROnasW9jDPw`&gCB;JC~Mh0cR3;^i7u`zqyM)sn~S=M?KvF6ntuvrq+OT zc>_}26*j#7=qBTbP29KI4Yqp}`wSr`KtKIUn`M7(m{BZkSzv_7j zT1MW*IW?*#{KK|kzCRr#l$ZBl7uT{IFxhb)w_uLWCvhdF>jQq!_ln56VO7|kOhMfYi+9gw1t7K3*TNQurZP`|HiHT{XwK4$*{n&tT}kN5gQ z%Td9#`sYTWOrGcot;$OOUaMY6ueqA0U(ah`)4K#*ETs$SXTfCo^mXHl-Xi8Rq8s$e zjK1mveuBuN<+_U*L^D+TOx2ClB|8CIaf*xn02#M?K^*i)k!5e3mBsZy)5@HSl9%B@ zE5zaaR$hm7s|~a@t6~P}%;mMq0DBrB%jy}}>I8&Vy) z5Av|xpY$Tb!lI55f`4$4c6aILm!TDzV#(;tIy7i9+oSQ7+O?=S5gf^Izte}OU>I7g zwOqS@i1=V%05O-y3<*+u4Zx9Z ztS*EU*^yX!A*?+I7eDizxX{cl9+mL55~1v95(3W%;dT#?=feqQjElMkcUk}xJ40fw zUZG+39H1F*nkV~9HhslJ!n5za8164Kmwg4!N*eE^6qj;OzblO`1MbQCtcl?cj}VCB z;jU}!l%pRJWe}a&5YG7{B51H_E26bQYOMywzolt0%Ekb zSeEj%5|=Q9e*gX8bO2S!SSxhvy6~WM`psF%0zf&v5r1JM>H2)8kNc$l5k^KiZNqba z(t&v}0ZTht>L!AdG>~2@PPi{3YK3N^;mmV={`s$+Q`HBC(lAf}03+nz(B=QR-T%M5 z?*4;kuU6Nx`{mhvUuroXbV;U`>UhDV0;;vb4AdD}M9~Q#j5W9-HKYo~6kVGLetg1E zTnI_Y1+|DNtaCry=y+(Tt>{n~LWCT2$CjwjyMif>OmgNt#AQ7c^eZuHjk7NomMl}y zB9d>Zk)5O0Zip&g0C#)}_4bCLP8)S={X)5Y;1nasRAK};7@NbUpa4zXD2NTUF(Y7{ z!i`iJQAY!Yh*~or#ebsri8;p=lkNY2Q$g@L&J0r`W{~mo0C_|6V5R0O?X!Daw}!E4R`e_^#SA2E+zC1 zAm!iZ1lh)>3ed-8H8S?s7uKP#2&Lu~t>n((=2^^r4YJnB0PF|pxJIEy}p4pDgE zvft8*WbEawQl?!RQ_=)?PN{NUa3^!Tya@YV?DBd5?JP!0q{@0{QJ=IkLrZ-^uCwFf zDo4JtlrS^!cVn&VDau?a_EB6>|D#jG6(LMd&N7@Nq@UPqq&&a4(6oT6tlj;0`Ddu5 z%GssGmC~f6%M3=T4n~|WU>n9-$@2S<`Kd9$c{Wm7-^F*R?HUes0lLHZ%K{TE<4@p; zIQ{)1OrAE8?8-aiQgWo^IC`aH7B`OVEq^$vg7&BATWJ^gwhaE7Q5&%ctS@kzI?fi+y)H;b-SJG^c+VVEzqydtGq%uDutU-#_oRG^E8*2nd@w>|8; zwt%}GdtAhOlfu9d-J1g)0$2!|c`h~aM5oRh^Czy0S~4&?ca*xKWvZxyNVT7WT?gsY zN6RNwCm$alK)+VYS?X8D_km%<{SYVHoD9oe;gT$KWj=*!k&Bj@`Atq_X!bA%y}=I@ zE7oX8yWpwwt#=`;fsz`APTS;b%KJVUyelYd_T2D52y+*R0S0ehR2oj1F)0YRtr14y zQ5t}2^``lrx%q;K0;l=b$qmvuI!|?%wuLDD`#RLV7)D~dXOqyU_NWn-Iv60T31^yu8G`EV)*BFF&igMP) zP~Gi-RVAaeH1`zKx|``rW$_iRja~J3UvlzrHC7OT@iyr3N#NrJg^f2Y+PeNllqoD8 z;@B1t>=bi*4UAyNhD6=2(l@_gcpU9d*>_=|p)`tO-m_7Zc;x*d!20}5Xy1HAMoGJd zh4w)>w|%fL+h6JfPOQSSanz$Bk3mZpJC*Ujj0F}Z1mhk38&Tc2+Mw1lr@P&_eqmAD zQEfT@p5K}HU4A-_Q`BR#r$p?Mw-mV3`bBK9P+&BEVM|;?Jb4Pb(Tr&zEGoJsgolvb z6fU_+H=T9$(7k}2$vU~)f7JKjf<3_cpkd`t{`q9-?i(j7UENfitDr&dv#4U|#Fsiw zpV?o5Jk8Dr9``Qu@tA#skGM!di5jE2zn1aZ;lA^@*^TAY`e)ryS*ZT;Fy`k+bAG9d ziiRH0iY%k3-OZrh4{YWK@V`FA|AVdl-=yuYH{kz7+8Wu}*c&+ipTlJToxa6hp))i3 zy+HQw!SH{*kdd9WwTY4Qe}uB@85kPb4<$=W zBQq@}s}gy%PeobTw66#d*i`tb9dh`YoxOONIQ7|O*gaHi95S^T_*sYqTCR%=nl4+j z7<-w_ zd|qk^c;KzTv5IKljsHR!|1&0|%>-fAK#6kBUqCW(5JOW*j2!)_>-Cu>t)SO>z8nM# zCrwBTJM2F3jemIi43dU69afukPpOaDjY;uPYS2EzZBeRHDOwKscyh`U?lwEAy<`=ts)01l*pZ?g$(!0Um7QO7?61fabBi%_RGK_0Zfzn6( zFbhe`5Z5484=;z&)GSxLqe*z`N2|noY+(PZ=y%83`El2IW7bFl=$KfS-aXYiKvq#1 zO*PD8=tO&)Flke?Wmausawe);idJ#8o;WL}@*uaW!KeG-IdXflf^NSty!AS}b_wgH zRtZb5K|O~7XoH7AU(gb%^+uJRWx8Brvvsy>f@go6R~G=T0yuXbl*iuwb9Ht%=;ZkD zF?*_Ps^X;e_jP2>DZtK}eakHB$dRn4w6Nt;Hg#WcjeALXt$JC~E1!MNcNj`{1!!VA z=MN(SEtsje7MY}hC>ta7npbK>Hmq`|dP6IJz3q`N9K%5lK+@{6l~GRWX8Kd!&%C}y zRhJ6J19`X!O|4?R;cN&Cja}s;*FWsqUY`IH&OpmMHR5Ilf4CxIc0vaS|?nKHCp8shz4V#Sh5tdvFn5ZHI1Fs~crCHNEGpvPQ{XEbBdC{waI2JNW~Z;_#go zpGA1?a}GcY!6e`y~XOF$lPSa7OhPGlKmJv?Sy_g+xRILFs2phJN>)@MabEdLo%5d zMY3*Cs1$z1rh(y#YcI&}BGX2^4bw~|W|W2w_N(ZTnmvL1PF0Rx%OHXmNSGqTQx?Z; z5{U%nPf?kz%MeR_pm~f|^cijTUvh(D=5{B>nbM%!B3SDO+aL5G+G*dAlod#~_-hiC z2IdNM#}yuDYE5+_y2|Yh(}FXDTm4;~B|4FTR5aYH6OuDh-$%JE1<;KQ7TEWqrDZe9 zDWAx&wBA}J9^=;^#!IFdN9*?|HjaGbEmt{RoN=Dfik@C%d<=?;#${T|qaFJu-h5$D zDM=r5x=h;}6gASle(Qe~grHKQc0+-x#N*r+6?dBCKM_K4$^jGVG67O@-j?8H{GtgX zbOvd=hg*6_nlFvL!%u)T{G<7geO zZc5TRIchE0JCof)|M3RW^${rc*Wr0bk-DM&^7vBjaVdHFI9^u|?8ni;!C)jW7aJjL z3h8HT_r0QNkJW_3ILpj@YVzn^F%6iP79F+c6R?&=gM60ywG+QO(x46cI1v;H1xcl{ z35xQZOpzyyom`7O8&2DVaN|Z_LFm?6YRbyVC&a)H{4INn=uHR0_dp-Pf+hz`~?!62zRQNMJ|fd&?q zAa023{QauAzPr8xL~0^n|Lt5ejj(G>u|}+B%6vCjj$xq4PGt-E zAU+PE?B;mx%lSzPwAxr<Iu@%Gjh*)j%=eW~F*!^o-t`eusZqcN_(P8-Wn6ASI zv!}^a4lii9Sv+vR51>hhmt*b?X(YG|UGXvQpm$o5n4dkCQ&3u2)_p}ZDiIAiQh>sQ z2{I?~QblIOCxcBj+u=h99IBAqb3#~YvouPJ6FBkxvbVkMDtJ0ieYtBWf@EDnbZr-? z?~en1-}Y{gZ;LZ+@S}VSSMHjlUWMv$Dzz%+dxfgp^yRr2xR?|1goaV!d$4}Hy}}*S zB2Xwp<0$MJdG zCwVMev9Xf?gGpj#>vr*6>A5{OHFcM_Q+%V5_!(}vCsf7DbHX$Z`%^GBGmN`Q} zz4iw5P!|hiNS;%>Edwb1Mc@I4_{q%uZOs1OW#VX4Zxapr37LIpN-a89YwGhO3kO=W zo&MJu>EPp&*n+3Dm+%F@*`DPsF&~Kzl*2(>boE16Sy*amP(+SV5l5?Yw!FR<3T@;IvA_yD4q)mvSv|29L~7BlC$&|2Tu`k>Bu*u>;v6k+&O3^N@0D0 z(aT0EfN)hvquIjQzb$6+a%R`S>i|PGxkOwz+CNNsNurj)>A0~;96n_z_v=G2@o!!M zSRuB#zG@v)H8sbRYkvQ&W} z&jN}CFniz%ADK-|ac!)3E@R6pDLK0(&|>>~W@>uofW1-bIz*5p9JfsnMQ$HV%?OVL zOko$XpI2<5odL=kZ4_;Wbp5ut*gIiJ{CFp>k<`x;f}~r?0{qf zwIe?i?*V-ro|tTiq^Orf99qJNO+*m$Din*32rX%V4x2+=gyRl$Ynt-N9I!%Q(j+L9n5Q_(4fr3ylu#{@(O<;GkmYoPpK=N6WHf zgdT7r{S_=H@o3A#S9T&DeGM|^ zCgx;1`I>ZE$LP~{5DwKWV@R^)Oy*>TNdn>5N3FiZl59>#!ZILgtmmf$LG7TXsT9sG zo81t(ULOehQviA}Tuo}|p~o;P;LZsHGEa>LaoV|#?v6+-Q@O843)Lwi!Ygfw??pR$ zB&NM7mj?ZnW;@%S8ceEu7s_7hA9kjk&NH`0stTfE=l0o0(;~cJi+enzU`;Hib>d(H z%9p6VfKOSX-mcQt=(StGEv)i%akq3*bsCy1u~@pJi6JE}#ruV}|`$JjKzy?>gwn{-WV*!V6n5NGmj$ z(p{kji!{VJ<_gjTGKhe`uE?`1&1Q>S>eKLl9YlmFX9?7j)NlKXtJd@((E2-qt813w z`?L_9nvQ`YPVQj?_nH<{7VcC{#6!pn)}8eryiI?7#@UN|{`rJJQ)mU>~*_$&npvkvuba>vWgn}upRI$ z!%tZ+60T#rDu7lFJ+D^s2gh^MVK9BLzlL<$(%<9;M-=Td!Fw^73~O9PK7W}ZBf9O= za*c$F|Lqr`6umh1m>SIgl|P-H%4`-85VlODT8?hWI8i)yWR1Y-Q=H0n(GmJeuUZWX zPSt$58J{1WiZbo8c z0lX;LaYQ0Y?3)9p6&RA0`-Z13Rb>RRPV-3jJ2?V|KNup8ZL)?j5a1<4v1ZgFI7B$V zjUQz@WHq2eCwuc4I7mYdeS!;5!pNT?WQ67H!iFLTAOgSadkzjVmjqB@&;dr)BmjGp zG}w7 zh7Y4J08t%@NGi3+W3k9sp#1l$587hrpl>CrVdZ>^W_2AfgSW>}?)JM%_W4_!6%(yEDL2eA^Q>zcU=Qaq{U<*Du zA=|Y{_$7=sS5rQJ%OxU!Z&>_I&+F?(Z?DtO7X9_k>c`5~?9I;SH2jP0rr(c|`|I-+ z_Kx2pCC_fJmYZ)|YwHy{P>o_8Dn$CVA6K`pSBD=m{xg5pwGW_S&(|*gj?Z)1nUxpC z*)s0a=a=|R@q?FN#`TY<=hws8Q*GIYopfz4Z}<0-^UvVfH!se0H~-d$amUNM^G)8r zZvNCAOz;Q{4Q>S8^7kP4UJ`Kp?V#GAPIfrH4yW7koFMicQh3{+y&XND@7?1xF!@dH z*9{$a5^%pST#wh^Kr;cn@AFpp?XIue=}vI`9b)+J&-Ea9-=EuVIrweQgWc*46?aug z(|Vor5T;5=uv%4v%RB}x#VVs#G^g>VVXv43_nS88VPK}eWh8dAFJAXuiDd?w zFVrCtLJ|rpUAt6%(dMMBctK5Pa|}bvEy4wIq&a*=h`#d%K;jCfPyOa_vLy1D%^@7c zI`N)@r>d>F>%_RU=hJ9xsz)rzvTCeHY7wB|3 zejPB?sI=6a8HGEXr)3u@MeG0YC?yOJ$y{fj8tggDD1D9jT_~Y&C|c+E6Uvb4v^n*Z z>Lt`NtI?6aoN6Ba)GR4M{jIZcz;vQ0OrtC>x9*AZBV z)XYKZJ2?#xnc^^W1KC{3jLxt11?kQ6%xkN$sHv%6E2i@N-&8-6=Ph%VeWMl8PeEdv zeoJbTfcRnT_?q~1T*uTyssSYg89bRHX7cD|%SjFg$18D*U{g!VnC0Wl2p-(b!{MhV z7n9lt7PLc;ti5vmf{IuecFcgJ9$;b9+rS50?SN>rA6S3(Yq+AO z-eZ4pXegGg7_TWWH$KC-m)97KzySS*9D}}Or*WA^DNEzVc}LJw9|XB7i8ONQJa5pV ze>;aLJ=Y-U%%FGCK=|H>8I9t89}!zt@rd9RIz;zJk-|Jds;6=JveAfR#Tp%VYWNqv zcSecjge|;Q1SIp1P)Z8IL`n)wLov+P-4pWa7Adhapj%j17N|e|gC|b(ZwDQGhwML= z#v#5%g^cZcA>vj)&0AJSYtu=w9+mE%_n_P5JFaXGX8+^@f{-KcAY|ugz{(8JoEF9ad?~6vMq8+=;(6L3E ztuzq!_Z-G_xSn&RAAntNSW$|>D*O-5jg!lU(7{ znHE&{UMlfgz2+*WUO0v*ia{Vf)8P0)^G6}*Z9D8iyhecIpCQg*4VY$ldx?YpL- zvZ={HCdOfJ1b}cCJw+EPf`@IMz~721)um++9=z|1?zX}(%d#{N!U@r<4dR`fsZoA#)h93o5JyM)UnrBR{tHK{_7zKgUJFbnDgwK0f& z?yUp_gG~)xJfXCNM;U-ZlLV(HIGt+aFJcPdnCSB7T_;w=NZB6iDV>$ZuyF*0yYMGV zVeon+P?I#;E|?_ILnz`R0%Kz&lHfPBAjm(4BD_2`!WHqop7s>f{@Or%2tEzeN$9$` z9Cc!aL1pjX!PY9zOn7nA1Nvm}o>@nTxB9ppK%E5Wmu5$7EY)3c!a;Q10GY_N(CDV{ zwJu>QG-iumnuEkC$?dczT!0c0mgotPRnn#>_mk*;cLVKZvnuF~xcjvxSDN^Qeo^NG zZ@_+xfsFu9ZiZ_iLRnFK&`1TJrAvAkfcENZgxbeBq_g|XwBX;f~9v9{K8voLlx{}0McCsU@Xj1zJA<%^Q84YMGn_+D|`5Unt9 z;1WeUoQ3w^X+HDBD$&DLwbOaKj}z0Qa)RFdA#Y0M=gq9H@6*ogkLTM)89v|F>)k_{ zo!&ClCWub=13^-Ay8aTdJa`lwe8~(WjD2R`8e~a<#(c@z;lmm_!6Eje0t5CS zYN1q(%e%AC*XCRMl&KCVDWzN+q)B?!!2|0F;*;xb+-Td?1*oRPfh7l;H+0dVmGTm zPRWd~VlKmajBm~;d16c*wX+cBM|nEw1TY(n(^ySoz>>6w08Ul>!kfiw_IseIM;)iHEp$j=zFO%^r_m0AXxDF|BNuk1>IAeg)(NRkLG|ko&|EW zI-A=2TcmQl3`Df7bw~~#)K8qkhH@GKvIKNvb>gIJCjnLv!YfWyu8SmG2PzO;GOg<* zkW}9`>-sw)?&3(KCaSkQ(8GAlDCwjh8{Jk%=<5atUMO2#cUGGSXSqg0tD!3p9++FK z*X!$1g>#d5pwZ}zks*W`qj0V?=0zre4gF@QbTXUp2!BPOR?L|aZ(!UsCzm>eBYaQR zGm!W$vJSGP2evs~-*Dk?**z%xgUNRG^-rW>)Yn>lv@1iK986A9IlA`no`{3{piX!T zAp0FJL|XG6#2n`4#>dkc{5Acf2|s`D1`I@N~KNLc3$7CB-}#m>Hli+rRw z>Ro!No+*m{9XD_yRtLzdt z>_?E;2HXY2iBObz|H`1+<=WIwghZSKXf!5(xeBO*q0{dD+h&BIHr2!9rSe?_lDOQ6 zgLw#Cb$*v@RK}CvSgaNjQ%9*CyiSU7o=m* zjVRgbOeef`eD^>^|5hyPG1Tb52yD6oX7u!NiDO8!qyH%&k&Ku(LVSLqZPZf4o5}qm zhxg17D8ck>-b9wDJHkz63KJ$w<(PXR{iaQ?iRH?(d8sLg8oak=0Xmhr#*GmwVWcFi z^J_Cxf?Ss@UCoIif-#=W5R!t3m+Ma6ZUCDXTy2FAIL&vMo)9CACN)liycQH8xb z=65ZZf2!2vsE)a(nmh$#mid)e$ZQ(^WS#Fc4J=ffTUN)owhIGQQ(AJYLTZCfq*M{Or3;f`Y(=tPm%bKxXXBDZHYV}m5l*_%KVrBg`YvRv zE!c0c;I)v3td9@_m8trmQ zCq>*)uH;}3-4~+LK|jNEp#S&|niP@jP|iQ3t4Ndfe+ME%7ksg0G%2>o6MXH}qA_E3 zHDSbyy$tV6iDFvvn~*%&uYGIB@vHM{ zdw5;j!V{^NBH8FXo=;Ce@eb1MNQcq4Cl)-5+?>)C#0B2FwmM|BYLZ#+3nl8kicm{* zyol!Oeq68aJ)$ptOmC254ic-2e-g#)^*EH9&f#S;d7(tG^n{CC)R0!OoSwO- z3mhc!QuZcW1td+^sL!7YW)|5z6lZSit2NE&NDs~Pn-m2(=QGo_f`_#R70${U`A=T%g6i&d%7-`JCDmR_W@0+oRjR{AgM*{qcp{H+;J1xj8|Eu|{OTvQ z0gLM+!a=TF*9(P7A%=u~7oNKJU(v*V ze0P=as7qNAl2}>0AJ&$ZeXpm`?j3S7?B5% zf6uk6Q{h7jK5`ONn(J#}^fLCi`j#Fz!gAF@k2uO_qZ7(pw`P5;j^EUs^JigdA3O#- z*Kf;U**lp>k{n_-_40t9NI3*%b&v4XvM~=VK69VVEZpYVMf{(P%~dc7!faQp&TKjF z=RPLJa@t0hwsQQWP~W*M0X2Wuix8x)8$lF6gF~O`(1hQ zZ=a+66j`H`LH(&p@A!CpHyw15Ydf+rR|^Z4y1?{n?Rk50%X_;%`2TC2>PL6&PvZap zFi8ybKh&uvHg=X4|8G2ZcK3!O4re08YmXkI*@(5Zsr8cT7Vp2UM$?Zr_)b%+k0!fO z8X6|#3`|2~5mjvo(ic&;N|NnA5$rmZk|autUt$r763uHB{04q~kK{B6fPJ`#a3Z(K z8I{VnQUthgVS|8eKlnc{KM#Iic|W(kKZ8Fny`R88C-{DOrrR8kom1HLx%l4)KhN+# zuP@}_&_A!esk{6lyg=UK0YB;TyLl+9H|{w+llx;IX|fojy!2VWnv_)a)-+aCw)+Kr zgp@04r7c_Xo+nk}CvahYsD-JtN9eH6S!h@|Zk%)CIc@-0^+G}M&sjZI^C3bV{(D6~ z6r+9Q7{sT2lKy;R0N8y5VLl=WykM|P);=cwGtt{}iNtaw+AWH9f#K$gP+L5^7# z*<8~Ie5~wVECJw0(V%0Eg}b215r~WW^VcoRS-C{_nqb>&^KfCmZNRrV{I`ljo?)XY z!3ca2h({=ad4fkT8eF1NL;(*!FGkbKl#W3mIuV%nSb-n{e8M>=5U69!z`ofN;gHT( zFo1Cg6q88tdgdvE4(a-GZU>Ahu=G=6f5jRUZQwAP46`72G#1HSTp-=lnK!UY6#X}v zNoiC>h#eN8{aJ9rKyNUKc+j&s=tA8-a??$d&mBxDcc*M=l3}Z&!9+tg39x_#DbiOv z_kHI?9z($Qb8y)4!GJsrAizqVj6J5?cV8^xS7?w~4>Lpwxo2An6{XApR@m?ZC<(cP z8vgSk-mR2Yb==MY{ozQ{Jxn}n+Y#?-u-RJ)NC~D2h-22=dYq!k#08$spb^FgQ;h|q z@H2Lhqf%zs!bB)vOmw3%VlY}mOf|yKX-YO19Y3b~s=+6;S!7#_VBEV;UyEX7wi#}N zIngZ-z&7or_J!D25TMDAO@zTYwT@TN+5KwchZoS;PKgT;?D%n?7O|A(n>3=*}6!Cl+7ZQHhO>#S|twr$(C z&)Pa`+k5xB{`0=mX(v-9Y0@+g%j;@nc`ha}M%Z0B^4^Xw$Qp&55sl$|MtYs$4ynA% zn1^4gG#vDSDQb*-kn?HTE48>pk$E^?FDQq8XAj6qkGcDbThiK`^NT(vfks5`en@c^ z`L~@izZip!UuP2I+Kzds+zc~cb$UT-{q`=O+4Mz@{x+o9A;Cc6JaXq)VM5+CfxggB zzg~Y#$yklV>Md(Cf>#=_Em{-6Kr`&kND%?h0?t08Qhnw({=T5umfuj+VJ(=mQ?CfA zg^)#wVbBDJFu=AdnqwG6wx~0?`#Ez18C8nz+w1PnF23(;z}M|i-gouSGx%5A&%B?p zOE>=utMv7v{RiId`mFA6K2^!?VYHwRD{s2}j+&I<5^pL{jN&vE+mJwa>;6Zk@p}?H zXzdj7fY!>nhSaCGBUad_P_VcC=y+k#3w?u<(+|mM2oPS|uRTZqja>n+;ORl=>Yy(X zjXxl7(OlRrVM2lRbbZ5WN<`6z_DBsXQ%C9jk{z{<53qmg9`Q?_mQI2Dib!9OvNi+a zU>2pT7l6rFI(68ug^Z`u?4o~g1R(V($t11-Sy=ok^eDjr+bjv)S`dG=Z9llG^et&> zzQ4gh-|z(>cp>RCX{+y+`Aq}E>{$8*V_>Yphx$@(Ljt~0sy@JYNnRslU=N6fX{3 zsyS;Pb}Y?Fp1w`f!|9vgQrQp7npjS}hm_E|i7nxQayL1va&L5&y-o6@Lo3*ti?R$y zdbORU0UdfI{;8pZEXsrDwk~bfOTBp4L!Qa$UZ0A?5km?W2agUg+GuWk%xld1o~DUE zZJ{$YhM*@}u;wV@>kQfM-{m`9bF7yX&t^XRUh*>2#z4$Y&(F#+fpvcpR^yOk(;SoH zOUVXSu?E)UIS={|i{`8Be>B98cW`c``4!BZ|5@UaM}!HIkEe55-gMU)l6~q=Sfkd} z5>sA~(J-qRhY3iTd9+C|>ed;{zuHpMfR4OAGa5OLta)n>k&a1aB~8%){`msK_MdWC z{Oj}stM_I8>EUMZ|3& z-I@dD!7FTodHNC>0IBy3dT6rp2hU3zhy0LkJC0L$ULIhk1N=6Vv*pJ>&OfhaP z`;2R6H9i2+Js@*B7y00s`9d_aPD!}bSgEkpG?0ULPVkoq_8`1B()MJD;;%%&?+2iyS}nh0MX z56OMi5JCW=eM}~Vw~6r?sxe$=^9$lHkg?`6g4;j?hIShNiAphZ6sx8^z${>pq@`8p zQ&q%uDj;~ZC9L;5NG>ICc%lg}`Y{Xke`e`--~;jrx|$H@aX7eR81EAH*k~?8-)vw6 zXlwo){f6Ny<{tfnn}_YG>=}*D3};ZGA?QuDV;@aR_A>H%4K4@=$TaICFN0$2o=N2Iq`SN|8#w}On+$zf!Aol zPMpK+855c&rlZzS)*AxB3ER<2TliBj-t<(%36;Q}#VeAP@JX5&iBd4zphtE@kXny0 z%?^=Zk$`4*5Dd^biMdtaN34JwMp*E1ThQcZsUjzGm>>AF8~rxm&QO(mfNHR9X@VpE z`whx!W+T+==Tm&U^ym4+uP)3>d7s|$i*KMQ@Iwk$7}KzOy_nm?u)J&^Qjg%T0EZ^t zu6{Ybe*Z2Y57w)Q>+$aFiM1AVF}1Y9C?#~6pP#1(C5f$<}9_kHPs23f5ZU;q9}ec$d}Be zPSxh|0f2eXjc<$EDSPIl0y0R#h6B-G&n(9)=8v0*H)|YkSE@^}qp#qnsx)26_0*($ z3fxUIlc9WQtLUFq zP5yQ(bddZZgty$Mp9Er8^aVbl0jm$7a}aQu5FRs>H{Q^`=(~0YwtuqX9ZDcPdokW< zu3tyl`v^z~k$T%bwt29O#5UYbyx-(t7rX%!n2Lxr!`SVs+UZpgpS@tvm6JYr57suC z`SfqI#~o{XHHbX#rv1iVe70VLkr5+UG`&agsS#?>`I^6G#(riV*`3?tyVUpAy+?pk z=fbB1U;>(_+s8#%l&kacutB}$>&U+dbNP|t>PCX}qUC){QKQRYT#M{{$_*es1{ea_ zT6KI9$Uji$hP-=+qBZYO|9o4Ifd5Un*5se;Xb}qhgvzhx2)qWH3`Di3#q0%Y^sr^{ z0a-doht)tk`+cVHsvb$03^$f&mG$t1w7X{`pxt&I;NLcY85*E4<2&1e_mQ~qJQrb^ z6Yk|NtiSv06l3z(kunN^Q95&hOt-o z$V}GP6JD3?DGAZ7`_R?_`N$j8w!(3>RC#BfV|P1nMc{09BV&OAE;{&Fk|5lAX+oIe zcsHa$gYI_~N4y zdXs;Z5bp&!6z`-;W^F?sQ3dge`CxF;%oAwIdKASvDK2Ar=U#?&{ zx10mcxcD>sCCc1ah)vW-u92obIpZIMCv2L6I%R8cs7JZ%GvH&=BxN@Y=YJ(N%RazD z&p*ntLe6RY%O;13lVzDI+4rw1NnxT$c~*)2%%13Xr?V&n!vyCI)H@t-!!~yTt5GM( z4q6sL(o@z0$r(Y}-yP7UG`Np+nDpsPw#P;{GSnUGqb375$eDuU?~9=|+m=Dn(BE>{ z1L#MOc0GT^Zb5sbZ{0Q^@SGalN)>OzVJGqxZzEn?NnR^ZnP}hhHo|+0%lxk8ZA|o; z>>+>3*aq3x*1G;u_)Lc#%~O1P(=^zz8!ra-ZHwJzr+;U(ZA#=QcZv9R#f%4p^$^G0 zugFL^(pa|?aSOx>%j19Heg|raXLktc3&I;Vb35FEvBJ4`g)@UY!ne6013K+Xd*lRH zY(9a*18BY0>rutBNtZzmk$mraZGo*Gt>k{ae8Tg8&Q}>u4`?oLAVv&*ans|DT48%U zq76NMMEv6xa~kChr!Mi*{O*I9^sYB_36rq}Xk7&$UtFb5LsPskJv-&?i^D3BZv=|7 ziu5Acl24(#)de}V*Z0AphBwD`;WM=&x9^QgX8Ol1((&irsvpDO$M&!T{*ovVnizRvI#TE-}m?Yn=JS%j8fl`NiUv@|#-uW3mmkUxdky%7(4c@^^ zJ@%3d1B{G(cL$2a;S1~Eed1pv3mE0j#*T>1qt}pLPwX}i{GhPAHDDzU_G<=Pk71m| z-2iY;>r~Rgd5blbF}$}_&&6eKiuALA=x&KwT0kCflsOGgz16g-=|^?{VPU^q>Bj74 z`2yaA0}WmgoAvsWhn^t*qSnawcLQ>iIK(c&MOD|U5XkeeUX-Irapb_z!+~B%s3_>D z3ioYIN1qOJA_*T!@dGZj!Jw>OjJbXeR>s17Wiio}nP;pE@HuJ-&~XR?+d=nWhovr- z$Dm+C?(f>>g%j@8p9_zB`1TvRL!InZ4s6tFE*+T+}vMQT#vPZ+nzr4|5YP2s{U`Qg`6Mp> zDV0h8mNqno8a+GN^$e6|zHZhK^ThV0>l#Yl#QEwHug)A^-U;;KNyG3dX(nEiP{AC?%bbClRI7F_PX_ziA$O0+<@_hwjoe&MF@UOEQ zhOd4%LNZ0OPL2_fuTiznc_2JXIboJ)Cb}{ExHy2qcktc7z8 zZtIH3>Sc~N-ZXRtZZOBe>tWs2D8ik{|M|cmCRKz3ApIK_@|WA}kA4p-j|e7CXU6$H zQ8DVRFxt~nV5n#rRyrpqN5P5pQO`|NgyQ`wgb6gJBxCD^I zzr8pW4eKXRTa~eD?7W#3$DL=xKiv+22&0~$8XfR6it@7lA9nUtI7=mI<%~$;$qv;A zHs$h))o@jcxiP`U;Dj3*cH0d8qWy}l&INFHo&z-OV&@vJ7hFOS56K}1AR3w}|MC!> zr_F)%!NjCY)6@|d6aia-NkAV(P?*Ha`;Om~1(f9Gd5sd-Yf9-WAbF&5mfiwtZy5Q-}QF69=*qh zjfXi`lwX8P)e)n;d5mtw=b0#%?V z>M{@s4lhwhnvTaS(+qvSpjxxl9=i5co66{JYKZBNlU0nPkfhj@fgyZL(98e3(Fy)X zc2ug6nH*NGcr8WL{&s?qoK1!F(KiS-yZ9@BjRh?|4Jr*VIrxA0AXv;dNnuWmR33V{2J~g2gB4LdeuV^L1UW-cm%~hdcPAosW+5^s^0_+ z2m~-nSAliJY(-4A4!u6eEio?QrFHgBv)g(JP(tVP@0ze2NN`e+J^*?`I8PmlFgzS! z+PzT$4tP(~+6M3p9P+YzJ|NYXbgpG6(^*kTm_BDWO~4^+#(A*JVhRhT|C$V^Aehnw zKddoWxEsFymdz}Y;9@OPNFU5+MHrznYVQaO+`)vQp3G$Uo-_fu25w^U*+$4|HZ(^G z23WB|Jj&EI9WrJ5~l=@O^RjZw{qwJrWp z3%*~<_jL6Aw)p9jQ(J<3+hFGIfLT?GTc)4%=g6q57r0MMwRvK-8r0*pMMvx?*nhkk z5+lAdC3wE2vdW_9;L`|Ht2ND7U8Y`r2M3Xg0_P>h{n7!^C!@60o{FZ0m29EE{=GS7|8zcff;HsMhzg+_=b-Rg! zjZ!Mee_4uy{i8(aaJ7$*of=Hm?03H;E4i4xY|(C z6X`~EZ0r0{hspr-6)9jz=FQRrWE0qVqI;cF{%;@PS?UdAwy!HFl)xEtKpJoh&r$>Y@>FoOiLZB9xwS_|pf8?aA^)djjm z%+lW~(xr4b=r;L2QH@o!rm@dn4}DWmf$jXXsE@07O6NOZfhW*fQ446`YXf%qgx%ZvL>%0K& zqpwDFvEkSFs{qA{oqo|VNPCH`1p?n{;;tBlfk#~_!`~Uo*uTmvMxOpwobd&|Uzoo- zFw*1Fix(A3`v;RjthC7eFRd&F%hTUvcgvj(1}^(ROxhVnfhf_8N?rkrLN)< zVvAL$J-X%@(X>eHnRlIMoLow@`FjGefHp=9Ks`DG|L{_++-YlrZcbZ1>RgIb>jQX| zi*tE1YCOhqwW%)()Xeq3Q4YA75_>;y#+|H(02+is2M7s_W(U`uMHHu zozT_=jM*A^=hH^^Dk1cZ*(PbCKmzTjuylR}x~+X$3l;6Qi}Hw_O5HIw8H0t7qKh?8 zNS0N#ORiRJi1pd`=2+Q-97CQ2D~02iW9US{#aO?FEzol!`p-Z?o6X^@;VLdx@<#;5 zg|m%p9>3QG5s9&p>lyU8e@CG|pZnm*E0bgHbVAD}^b=RlhUO3e*NxEn&$eb&C zLrw8P?Q{Dv!Y;+_9pV0mgx$uQVprbyR?q+DK~}hcCo+e6n^WTyka6+-Of1ya+C;|i zF*8x0a~kf%L(KpibDk`5vxb46_BS6H=nh9t;QcDurbrQL%dIUgC=*%L(}2cdXTA!E zJm_5un^ld@5w9zswUDR{g0aA_O4@P@vXt%pJY}<*2cM(5lt*Zu%z#WY+S*`~m-1qw zGGNRjH(z969H>;cwvNBf|9rH4&Gu);hzo+PYU^S5FPenELg<4;_3Mzqi@)e2hU=uK zMT^gWyj*Aq?TSQW;-p{AfvDk(yt@uKx5O$GONrucka^M(PwGtL)?|LnLGU1Muv|CY zY*iaOP#?#2`y$14Q>gL1KJx`=bRS9gtex(CPjQhsta;@0V>OzP1XfQ<@9LAsA6Vo! z_SxJl?{(vcHuDj}lrJ;{im@uh{M9W=V6*O8t50!n{#qX?tr2m?Y}2*gf^p{lP=?AI z<^i6bzp45F`ny@qd1Qrl?~|_sv~U{@Mx^1Mftv*SNh!i5|+>Y@Z2NK&03 zLmN)=V@d2cC7zwv^ySzFqvL2njaa3!b?-1)UemmV^oP2O2}k?6wBfk>HB$+*f&>k z(iAOC;Pmj;SKJ-Wr>*-^z>6_M`8O);RRoE4`ELnM&8axpd5(yYR=JP>HUozh7aulw z`>e5Ah`AOC&BAN--T{d1;hS^f%`@gCHY|(%>ssS@jx815?ic{?_TlB_`(Uj+cAGWE zc?8-(aWHwJ+`ZO=iA<<>3m;vsevU!$kg?(^c|f+Q>6wc;43*8!^Y(lWCB&|v0u#^P z7r=nw9l_Bl_&5bGE|~qw`(whuWO#SeJ+Q5T_!}VlCk(gsBgh$HkWQl7WDs4pR3?2t zIUvb4r>~BESFG1!KMe%$B1jxt3&CHmF#Fl6h>9%+m^taXxC7Zu705wY{UhQd?~$ES zzNtFJ5HZx9i3uKKCrEDPIDV&9;jhGhQ#sL87UboF3Zds6kO`)Ahi2FcjXgiq)=R)m z8Jcj|X}tBuG%v|{gTdYl<2_b>jq%b$LG>{vhigIt7;RY%2L;E!-^#cQ;T39eRT$Ti9xXPP9j-He>jE%ZNb{#M&URAB&)ql< zyOcx$oLIWvQhr)E8W|+K9emF%ira13Sp*!yhHg;s-l@IDx}Qc6njx1Hy2nB9`PLgA zj1K)}$FQSAA9zpo7*T+jtdillap{n5Y3RV{s7bGeP+@mU-Z`bSLT?tF$=bQM3s{!e zo1v!{#$Tc#=RC!SAzC@5MO0qlI_}MW~)I-fM12u znwvw&C~eib?qEa|dYX(1X0J4m;*qM4C+hy`Iq6@YB`)>f)GT*nqP&dYjH?P)!gyOk zS5!jqTZeMxaImZSXxRE5&N~yp@pjn)ybHpws1dtUQ>XQ_%=O&?`NlRpX!)waWuk_( zrpoFv2%WH9rb5v#ihY?3-h$SvASJ%#NsTHTSn_50(YWl^B{@PDpVA;PLePX( zV`GvrAa`9-K&ED?{d-PB0aD)2rO>!JaXXd!4jvQUJmp1gfHf+zJZJ>BIM-Ra>{yoK zkDZ1wP&^yN-L~mPKnwre_1G^F#oC(qOKv4)(iuD4JIdkT;Pr|9b33NA07HqEO$+PR zXl#i5eL0%nrmbmlQW|tb<_zaT@|{MQ=yYfE5Cb^`hc8%?IUko{VO&aRQ0W>blkW{$ z5EF3bz^mMOu9}YsP=R)#Rv>X&z@XqCF-ZV>?R8K3K~&_a zR@)%kDMD*F`Gp{wl9>EZaH#mUSOyMU5QSI@}0F$G-mA*5f7CBfn^64MJtjlXa69LUJ;+_PT zuUY*`?t5>DWUBIq-16RQF4QgXVdx_SRQFq}+y^)2z;tk$pQGLS*crF7VuoaLg>!{n z_YD>J3KzWUfzwR{m!^86V;+_I!28%S;tn0M--wqtg|F&hT?CH#=rSkUAD6^acQE{8 zxi0iTw-4~9cy=9J^TB$D7Hcrp`6>U85Lj#Cz>SisK?*&}@}MeH?a1kh6Z8zw@eavaaLO>=;xjwY z%`ScoCahSyf;S-zGKVNEY@#ktsB0bxEg<)seml^^#X#Lof}oZ_-tRn}6En6v2O|>A z@KpVY3dmpV2nv}751I^NsJHQ0qE37nMi|imZ>bw8V3F8`%iR%`)pKwYoXs`IFbFPQ zWhBW-2#9;&RT0)kK8X!d#_7MdBB#Z&i6yk_aheMhnR;aIeh_o^ul@!y4*~H+Ji6r zf+v~52R)4=Io$<4-Ibj8gP8Y=&*z7n&y$$X13jH1Ii&}BL`Qne1A5FuRUk;ba_Mj? zI6PKhu+EH3QtKfBPqc(K>cDl@!zIk)R3sga^rHQYEKNKdhuS~Uv)hWLxj7~VvM zGtf$rF0-%I3noSwsLRcSsIUfT-79T~7+Ygk=s80b{r!p6JOir7Ke62M1>A!*J=_b$ zQDfB*;yV_!+6i7(u3Pt@fb$!0!X$Y_YH=ewTxFMIV*JGDKl((DbD^-%QC&jIR6NlJ zb_Vskp~dQ_qx?cv={y;3`~s--Z&b;uHr;D?M4{rNL?tZjYIl4M5G_v zJ;Q-s?n}4bZ-HC~kt~TQ#ApqMnZmwO&{9YI`6VD)@$zDA|BkqWr?>ZqErlDhPTWh24$ zitT`ou@$=~j4W|Ujr2=CBi_aQ&bf`nv0i>!Xh3g!eRYf!g_BhXmCGJI8Oeejg6j={ z2r1=;Fy!9dB^q zMFHKIXL*ewhFgB+3?T;QzCCqSy=`kM8CrLoDpa*RJi9sq2j0kSr}Yb$fY7(GDp_rb z`n+B+rF}>InK;04kNv@No^9_ShK`T-mA}pJt&ygyCDO@`e~Eo_`_C{~*-St35R8iC zDdyWS1F$Mq8m7BZIv{k(S5X;kG06fZ+5N5B)3|?fZugSP*ZpAns&Wr6EH!a!-HSPK z|IUETYqoo5Qd4EBicixvS`Eg79LRoX*bym`>3kgkmUt2+|-)A!@r=+_Xp-dA=>}NOG z)OHn#7PP|#g|@_!*oId5uY-4dd1ioCE2&jNzV6=Fr}*9#7>#meJI=4Im|r~jNS=yf zV)!I{k#H$6SH?rHtj*0|##PT)ATiN$b_#pMgT!ueJQ3YX|1q@zFbAsY%Ew`Hji9Vh z7qmxr5v+%IOU=GvD(k@LDq8m(1UoW7_}NLTzzuCne;%|) zxZg<@N|(Vt+;z5g9<)NWT-UZUs%z=i@wyn6?usY39mG2RFW+{A^fXw{R0WR%gjqBaMqU0_ zlyh_f2ND6Uh;*^Z7U+h5(}}M90yBtBH%2-ZD3>n1mr{O_;`U~G2QBs=5JhOWcmpe2 z%FN4b_K!3pw!d>ES00EtVEcYj02VxKdNa9Y`b(8(y;<2a{jVo&9+tQ4R>CjyxLTAG zUd_pRWfftnt%L}|fLF=H6_{&?%@vp(jNuAaXmB_~HtzGCVAjhOg&@Hri3ftCCKK!j zMOV`O3qc!*2}PM%bMgnp$cdzk`EdfgT-Sh7o@e27iAI*1`F|0iY02E)%);mpk!3D* z8zMVrLyFxZbV!gGe87761kD1tY@<>pC3lQw92eX4dN%AW8)91w4)qo)VH7ICK2F<} z+1t->DsZ-fV=8d961bIkn+wX6`PV3u6m|X3`&J#aPH81qg!CmlS3J)PZ42_?9NYBN zAcBIQMpn-kgQs>;huH$8sBN+oN>bW=>Kh|Ov+PZQ<3jyQBx&<9ChA8LRqK|WSeO_2X-L4SQ#|qht+}%y8kp0M*y?jLAp$spQvH$c(T}b zhz${xg*Z&H5`p#nQTZ)~{I||7CJ<~Sz+qU1w#@7?sr>JgcIKQNC zCsDR&ZYMTw%C61{VmK?5M!v@(8|*gKq0vYsb~nJ162#QQy^~ zFEzDSTQ&2*Xw;EW4yvGoDBsHvlQtR^PPi0hwkqX;49`BY8{U;j8EPR>(dn=-sTw{9 zS4jPtgWo*EbvhvJHaKihEN8per{GXHviBvfBdl8v;=~~9%0WdvdgD6510nqNSDY=) zyUwBU({wOFu{<)LT3i%_)M~`&*!e_4&dyFire`9I#NxU0_&s$sIs4$p7)d-_D?Tz& z@~gAVM|ylVi9P629ArR-$@84*Ka=?clu&oNlTHYV>Q;EFNKJwk4O7cbv?^-ZHBVKS z#5N6C-N$RyW;srb{68G}*2=p33!W$43Z;^kIre&Ff1BxSob^bm9P8Z%tthE~xw|R` zCdilZ>m;)H^IY|ocWk9pNYKvVx`RaTpTG_Cbq9#P>Hfz3mea)U;P?*d1;c!{1YYby zy_`*SXx-eV2CGh)TOw!eD)$*y-DX>Xt4^Ptpd6CcKVGB4_LRwJu-UESyxWgD(F>R`x9JrXkxFl%ZJD#k^6c%M#WGyo>fwMxavGDMQs^2beAa16Cyj_D=h{~ z#+S^FcJh2lez?K*d-tQy{hY~m6p0zW@{rnf@D_yDC&BHb-%`@fS$a)96^{MdN>;&K0eTLffR90lDjyRVc&M7Y&uU z>;^%C7DQ6XRk2hOLodV5@lA=pg1ZEANlfzdq%~P;PqYiCq8Fu3=hDA9rQ6T4UlW&F zEViBHy#DL?v!tCpf#sF5FCE4}RaHuttb4Ql4Od8_x}Dy6RI1=5XfnL9PkWlsIn zs)-Whw#6Ax2!-aQ#XteLmq<9>L)w4 zX|@D&ZilS?rkqZnt&Rlota>Npq|ovvNxbN><5BmoOw~C=I-iV(%qaJ_Af;|1ptvQ{bryc%ZNChRg=^(@f>cXX((anSL!?SVmoZeHZb9w8mZ&xVwTw!A z8v#zCk>}!i*$Q)AYYzFvd~crcXN$$pzGvfXr+ES|Ta)B_hFdR@|J{jezp2gkGloTl zGHT(?^fF$D*jXP7ZEYs=Cs#JS(BXL1ZhrJSAT@}KK#5L!InQ(siT=N{lf{;NdYm}! z*X3=5sk4g53h*ZZkMTZ-L18FRW!)=*0HGY&S2&i~BLr)nKsL_H9G*xryu3gv z%wudv3{cO(MHpS9Vse(KgWb>O~VBoAwdtN1#20ah~6j$ZWYOS0NU*wlStq%e7HQpWHzRMvlC^Gpo z(sx3z`qW<=|HI*dBx%trgKT=Q8Go-%vE6rVWCaE^ai7Yqamc_6kn5@oGio|2*JuGo zDG&GyJslJ^)e!)AJ#7DVe^l}q-PG{r&-Wl!b6{7-5x>GggTQ+y}ya-n~+pR3Hs7!s9c9&xn$&@}Apldj~?f zmlCKrqkl8B_{t2b72nFJ<72WRl&ON(9ph%U#W%Z4W-JFtRM$hr_vp2|L;}trXK1Zn z7+J9kTZ3xwMO_ENZS^z6|MwW`&u_GabgC|f?FE2XN7Ru$)=P!he2?L;+Go$gs z+YXsE?H><8<|Ej^Efb-pEe>(J2Je0OSlaM`Lqu(0(;Eh1jAoo23lha{&j+U9U&UVs zCqWTMCyAB5qq6GGXA;B>fFNd33wC?V&gw1$S&l$a+ai1PI@ztx$20aQi}3&UF+w0m zWznhJcol8vQ6*N&a!=L#;i+;#0^^#CEQIvFsiIH8%gpX{u<{g~zylHxFSd@vYy#rA*Tr@W5 z_E0UaWn{zaP=mP4<0zq&*kX>3qRzox1$dm}ul@c+O1s{6Pz7k@%Mu0|Q$@red7jJO zu#m8(0aMKAN~4y|u|**8gl|(s3>htLQ^!U%v~XVKvn?WurAqixE_0j zjZ`I7_eR~E=>R3O4?)4fNpi$bCLj|X+tkZdSfjioe<_;dQxOK1&2!YAf zA}z^oRIotP54MPfchEJaTQRElH|B1> zA|+gepLt$<>jHJeD~h$H{ELd`uY!#|yWV=kh^P_r8!3VLh*%MNab+eJL|t`Ic&J?& zP@v<5pWpq_2~>UgCLQWQ8Wauc6C&#V62NhWmMI(}0rn{Gw^Kge!E*takWY=U#dMQY ziSbqWsFP!rF9g{|*8KezvHVdP zyRAX_;y3v`hKMHl#4_IX0Fl5T;*V;j(fffojD)D^0S#Wg%x?I)pPguaojul=j0@KL zY_Y?r3b~{1ItyHSb@B6DF55z)in#!41VT(R6L_4W*WB0u@FT8ftpeNz6F{N}FAQs(nxp*$&q@a6~tk=uE|$cmDPhS-+8kl(>pjR&53F_Lum% z-QO0doPQcsk*d5iK<-4d-%$FLih~-yA^ntDv{BuKv-~5s?OFv1{B=+6a|S%dgJq zr0QOIs;+cSVNye@FY-)@3Ea82RW$meTU8nG8%~wkzM)cDIge1nbBPfPg$G9@z7GeU zBK;Q*vO%|6Mx2;YQVkhTcscgDPpu$j=?<-)*tk1pFo9x6?4Z$2I+1`XABDVROj!K-(4Lw8Jxea1Lm%+`8nN`vpozTR}EuRCaxvLz`EOPfXGA!>8FXv?X(`ROHDXzsV1r{X8)1`cm;d1r{);+Ev>EXyshQkLyjzU< zC*iyR#@dS*rL67fDpxC^;|X!$3ov|4OV7Fbje`)P*;B)-889r6dd zS0boY|Q@1#0h~@ zse!XxXKF@S${Ss(dqqMfaXHw$RP&earPVK8C06K=sr?Q?$SM~o*8fRYiMA>Y_FCfD zl+@wqwsEl?Eod&do-VPW>etIz2}yJ4gwcI#_1Tw577@zTNURBgBbh*hLRZoyInm$( zMe-ksBtz2u1klTICzB%kV)n*_b`X~|B$W>nFn`tFO^Iy~Yl-4^5dfV!&S zeg;I`*iNZ&808Kj19iv-#O7ysby9V5vI(m}V#gB>1sqBz9hF!aPC6!alXooA{-}Q= zmZfB8l|IVg21)^I@Xw59gT z2XS8rrm{Jelp>j>fgENvw!A3ix?1C)r~}WvsS!vzasX)i4J|9L%2Pz{EwF4J!md_5 z4Q#i?dwKH}zs_EbLy!oiS}`1fB1$L+$x8QG8VWy4lchrH>kc0HcCWq`qc`+#@2p!L zg9WgcgV|otd!t~6u>Of=f`|@cQD*04Pk=Z%`B$_|`Zb?p7ZjC!T1W-fiPssqhwT0F zFhCBB^ibn;6-c3D1CybzlOeLIw9h5_WH~5?t3=fm%wN?{U2$t!PW;pp(w}g?Beb8X zQ5O^8vY_%TCzJ^C$Pw!$)ua}u@aObvBq)FLo*N*hqp%X)NrKCgjGspJniA}-fPF~? z+m4~Uh;G_0zX7qko9`y;bJpt@^e)vqD&U;=18{39=7B+)EWXCf5;|bmSdc$6Kz;cl z53xDi)cMU9X*=UfFN8SVH;X~;6B0iVZq@p!5XB^=Uhqg9(-*YuCpC0&v!X53C==wd z_qe7Yoh;-J_0x)iOycbKfb#FEIEG3zdXO#O0Fb%RYNH*EBc)A01)av3QPYY)tT;wU z{NOxvI!2r&W_if3_qX}&C6f>+&dDsPY@_p6wEj)KD*hf)-fSvOdY6~qj?0ug=jXF= zUvyUbd8>F5{41#nuz|+YAISv6C0Ke5a5)H+Mt(rnbGLJ92^zkGUBh49AN?XWhp5oE zv=cPy%%N5X!S+ZSjPI0+b;CZ3f2K-%$Bp|GYx`8Q9?6RWa_;(+^*tnB-jPkN#6&#> za0W`%u)W^? z3S1YeDUbrMz(wR5uvdYg%xX12XwzSp2bF@#v-kQyQ!t^UdWbHU0M6*6Og^hZva<;) z#}mWr`<4!{V27TkTN+~enWS~Nc5>niueG=$vTUExT2dt?@`=08+|O@??MShYts%zJ4z7+0y6Acos;ER6HY7*D(e*@ZcLrBxIWsAoUCn zn(iTUf^ zZsJwB&o$|v{$Lzc-z4enoBBOi!aBBLdITK~6Cb$PtD|&5${tI4(-xUb{39m6`!SlwxSh-v9Al(46Ri5_7seB@aLg z54?;>G3*o5+$CR5vsxLt*tdbfBYA-vpqLMteo?iqG>%$RQT#`E4>3p*-Cw#-mD&Z-ZWR;Y0+p>O3XMxtzH6?MCo{{TacePSz?9_H&90S3*d~| z%J^`yU_cx=92wYdXi{~YE4v?9yMLoYZAeN~&kPw7EvOKwOCLopzVC-NbVBt3LG3o7 zU3c2ec4SobyO0=p1M+RO2>sQ2Cce+(Au58fi8X_R++W#MBc~<#Od+ynl$1@8)1|df z^==uSXZKqwfCO8A+ipj%-uP=_Z5^lE<+jT8&qM%plkZ0?u51fIsT=MZ=PqcZH!qYM z<~|uS>enK71IuDXi8{JsQDaWk?QfLyF|`=%N+d;Y*V5CNal@gwX8Ie<&M?P_j7qEP zKQ6#RJ6m1$XxzclIt5+!X&fQ9?X^x@jCQX7Z9V?L9KHxsUOtGkJ9NQ>W!vqRH=`Zm zI^k=7`dRk-GpMl|l+IVQQ^)$c_-1Z1{|~y}F*uXxUH6V{+qP}nwrzW28xuR3*b^sD zJh7dLZ9j1`C;$D{eyjGWeZF*8b#-+u_gXi87euz|Ycx`EQ&JlQ^kl~tJ@>xCNcYcR zyUXXSiu=#}n~!*quwtJzI$9!95jOM*V}OdSrhbK8_oGu`_B0;^=`_cS99azKRnIo3 zOGiLtfKTr_&y+MBgqAp}Q)Y;3MJy@wmdM+urI$JJ1idw5Rq zY>O86y1Xj9x9y_L?8foMAIIoRc?NPV6xu?6zEGiLjf2Y#b$Ol$7?;3i2nz~?@yCY3 zjZqMoUM@qcqp4Glrad#1T+T?r+`xn7)CmT}GDpnGSw2RBVOHgtR_t+DPOOh+UIHMw zoHs`p8H`ddUOSpXi`@x-Qn(2*hQL{N@^IH;uB?f|d1J)Xd=cq#Bgdq_9UtuoAKwPp%T9iK2!I&K*)=o{uV`Fxw%6 zex$WyaN8VNeuH7*KK4*jT-%tAS@U2@WaC1%v;zf%Z9L0`bVve_?s(e${Ch z-mjD?tRf&UJ5<}e(XPGv<0x_pq}mrthT|*%p|J3~&kHL#^=jb35B*mBV}+{Mdw>JC z3e&*PO=tkA3MWHCDQj!p5bc+7&IFWd;U1Zv1)ZVPPCVkYYq22w)-vEOb*Rc7B1K8{r6 z_K^kam3rM2OL;2zVz(FLOT%dAZ5(gXieN{3CBd+GxoM&H(D=?u z5??JLaFNSXbUPFDCoR?jGE%s#&g2m{R=wA>e?XZC;n@p<59M4448*Z$b)GuzW7bC+ zfI5S)jQ<`*a4Rt1a~R=LQZ$+7xds&g44+JOR63TmK{B%}?Y_f^PPrevZ6|S(jFty#y!9!+h47Rfcb&eS|aK*WIiMmE>G1=VM!O(sBYVh!}fmLQ!3EWHj z+9~aNf&~E%iD`Vj3(5b9- z+;bu&YY@b3MD{%%xlSqAOuaYNPvVI|=q?W-wuJP{L=J)M2lW{tibnA4PI|bfiSRam z1nFbP-m280F(Z)8jy7=cfs0&#tj3TAF{a4|L>cYN&d1jmsB>q1xl2mv1PtN zPgG7sQ&fvvuiVseXutd?i}sGsZ7{^b5lMoB5|xl);r!UX1sczBKRCHR`hUlw&Vh5E z#DTN(s$&(k@-(TSq8o%cbceE|WJcU$lnQ{PO9(CrNBIT0?>|Y7D!1CVwL+0#o&~#E zS&}6wZQopohb-e$B{#77CH1~*qsEe2JfQ%5eBtb33zPvN&=amX>o1AFkcL+ zb8W>a?Iy4}aH9S16n<$uHvT=~4iEn?FCgP@s@W39!s(eP@#@_ z->>`P7!u&`_-)djI(E3({ue3pv2NIt1}#ONJ1g_W;Y!c_fjBrZP_}#;6de?-BhvX( z!r*PJfjQHn)gDdoP_Q&+)ZjhGfdy-bssfZRiGk=2UKwGecOU_;N_DlaBnwPr&okL|1oq3wxq_^^rRH79>T2>&_^>$ z*jG4`8uGi^gK{_9kRDJGIk9S2O?S~~F#5-z(4;KLoLBx_khz!$yhVlBoElISFQ-C9(ooSd!>B*uO&Kz1=WN^S5oDId7rBeL=)@C_V^+GtJ$*dW{ z+h^+Mq?Y;w7T-UCw1%Xe=E>aNPYA^z{Zbc5l}hIH=q;qDTfH6=@9nQ}Is^dX z?H$Zo=~rX{GDuE$*eA-7&&As98QM&jSQiH1VOaD=-`T77#{5EzS_4|~n-`|}l0{6( zO5TR%Bl9*b&40_DLsJXZyA|=6Wek5=w#%-fg8O6V=^=ePg)4%nOS_DigDM*JPFo@x zBZ%~A^e-B60TJ7LxE;V&DLjf=W`IuS<#iWktD?`c=oVG~If*l|nWNPL)!4>ZIq8&M zc>~6@hfRR{=M>g(qFN4PrJ-tNIh6Z6px^309W`Wwpi{POuT0!McfQQ~*OVX5v&~|+ za(z8D%s$?!bM!PcLx6cW+G3BO#xHQzYb{Z&kP(-sI;ib%7ccy;BXqGQ;~e~dJnhgS zwI~}o{i+PV1(Bt<=AIM`L_;E9UPo$TjMA~k%SReD?Bd&~T+;C!XNOdMe+#0oHge3Q z#jTL{(lDpS+3QTvmCsZvx=$}y=}EsXSedP=?~Oo>w=>yo{DhXhO7*B`C#p4e7Aej6 z^b3oIm($Cv=Z5JZ@uYnMLfx4`Ju!8J$9AM(MgDiix$A(aD#f!;TZJ#udZ}@o{*=(1&2D2I6M+Dnwb}UuPA%$D zI=*32b*_$SDpwt^L6TroZi5WQsoaqe)Oml7>|?8cknp`8o!cW%!uv6Gu%cUIpv*p- zU!&Ah_u)z46n_lynVHGp@?)^}a?5SH3qD<>-JLd$UN^CERhe*%@mEPMU?jkU-A0gB zzsZ)B{qL=-@+@7HYk#{8=D(-C{0$mRo9VB*jOO*e*3>qjb1n|YdpjaQ-WQ{!KCK1w zx2@x{R&DO<+Pi(cinVxa`o<|&{b2w8M_+eBVnSxGIZ}#InZJ6FU7-EPrp_ZIK^5tik(lz0O%>Pf=35pN6;hv`98v?fmE zOjQ3Z78Y#ATpv*_3iOj;3}5)8^?f&TvOu-&O%4c3#z3mBO^Wx_HBX`LO$v{&?|^kB zTXQ0cR`IEh(4?}CRis=jpCO?w6On(Lk&0ad1C(!(gnT2T+oVw+uu>H8t0d{lB`OOG z6?MsHy@QL9q#}>M#lL==LZE=J67AUzfh?`BbswbuNI)JRp!{l$y*Wkt* zX0km)nM;65kvG$pIF}0RP{ew2>X2}}C8;7bQ|bndtCYUXWoC?aEFsa_;4(#_cYWuP zL674KNroaqOi88#vW!E6!}#zQ#Mo+V3^@1@KrQ{gSh=M@7&E-K7!q&9L-*Gv@H0FT zTj=KCkA?zP4&DnzEK_lVE3WV=k%@xHT=i}vwZj;NUK6RT{j55oNehl?)84!@s^DFOMHzA;CvLEPPH^Ec*PuUT| z2Exj`vLiZ8Ae?_{U2}bdBmjR&Y$O%_4R<4^YArFT?l_`&Mtp-Lm~?Z$K@w5lyw@|* zJH9i>n3ZGQ)QIM3e+qcp_b3@BC`Tg_Ufzyr$^16{_DM>TQ3R2-N68U;Cvh{DB4&6acYO4)u#1g-&UVq_ zmo@%F7CMOUpV?5O#(fJH86R64*CL-=2N!zx%%A5?Fz3RPRz~F14bo#?VTqISLOj&7 zwNdK!EKEj1o0mhZ7Ba690in(j15?wRNbxDE?>8x}j|f_%6OP5p48t{_|&i7LSN8So*K< zSxYSl;4|0KQ&M3Y2{r62%%Ce8cBfaDP;H}~r(l3N+SF)iV$k68FrSzt<*ia}Qp1lr z@$QoALORWsHht+iNYIs)3lUW(ZA>Sp&gbSkBc zX0dj~`=di5WGsDKY90YRcdErPeVS#iPR|%E&>K}(*z>%oKmat7fg);Qnmp{BzHnwbPTwRgU_8r~Goi;temQY3~? zFBCXmXj>RcBrK#?V#X6(uCq7u1{ztSvJvz7AN+lHzrn5{!$=-tFS5W6n7QHsQ{4~5 zTH!p*UbX+6#G@@z%K!Z)mGOM-MKsco!NU2`W(FZ?n=ZV*D>*d~Ya+^9@3);a5TYEU)CXYQ`d$`VG10Fj?(jTvb4=Wf8`MN&yIbuxu z@XY$^W6S1yn)YzI#SVL(_OX+x`-=8(uTuegj`nb8APhbBilo@r5zlqBhiJ{W#hekp zPvMF6)n#@}_BuF6l2Z58?cs2b^j|h}zG?JnD;RE;1}_UaWSJPo`s!11vCeh0#}p&q z#n63*``IA{mu+dY=l@-rIVPLj%4)+nH{OBTC#h$Z6s;68!Dy>M!&Fbj9}Tnljv9gz z+KIrubjMHarOJCUQBhabYC4&yYKA#34C7-(UnYgU20JumQwWkUrSJx3|kri%!G~Sh0E}d^PA^Z z5|3%%$0m=()lL0fxAzcQ#Tt4zAZTKcMCv3y!_gi(*IP>fKe-bvNlnK)7|5_EHekBm z)TOZ!bbKAXq$~IH0`h(UJeNO0?=S6I>3`#@a#F`0OZ$zz2UNpm+s@ESQ=K$_tw!+w zo46GC8VpmuX3nZTdOkPyF%KeDeNTEARUy}1!pb~&Yl$>1fsdu@=&`gz_m)S`G4nIU^Yy=;e zMOoA1i{m-Gpnfor;5 z(2_J?Bgjv%&78C7M2UPjWhPJ-7J6J!s>azTzZ?{wJX?LzEIQu@Ep%@?O=$~#^C3%C z6iI*gZ7sJ6T5grq4nDSbZzN*dkGw{5ksGRNY*xn9+HZJ@qqeHH9vSajb()>-p>k`691t2dn3&G*Ye`${M-AE{o@dv2-gkX^uOZyA6(y0f6c$$;JwGJGwE~3 zul!qDd$;O#*y7@^Y$DFNYW7^V`E2>~wd{~thaA5mYbb->+^ddNG)AY zy}hm~l9sygKd_^OWcXT|3Wq=OE43TCg-00^S}Dn*4+LfS}jiQluc){VIKa;`qNAIgYC$9|{C z=mo+Qa;c3iqk~l^V7Pfkp4yQ|7@U#pSLZiP8=8=D9)1*i9S(b?U9`~nrk=~q&^z1j zx=ww=gv}{qN>>9|8x8D%>0MA$4K$O4Y?>5K`VH0&g9u@5zk1{3as-zJ#*g+J>*Ni7 zZHA~Hb+-e(T&ZLxSE*clTI%vsJd_$z|JwAG#?Ht1gi|BA_;o?QtH|>0{jF-^X#4wK z*|+d*^uFTVAwmA8LSZie`~|`$@vcvI{*)W^>}%-*uU1(i#GPVQD}cLYxb1gD6{w`% zl|}8=VUwDh2cg$B58=|9dZQ7B*$jY z$9!`rgKPpG=@Tq>1F8!v`bB4dGLir94G& z&nj1Ub zWr>%tVVg(ac^AWtk_-p2k+{mT ziyJ`deXGp%sP@BJ49n)u*VKZ*;dX9wfGk{BrLR$y((r>Td>s%hK@#Z~^4uFKI z0wecSCG3bVjssYg=i=*XSn(A!C;7#M1@^sceDks~!$kX`Q{is`Q5 zL;X_OVGjhGy|swESV2%-DGo*anW>K~QkclV!E36)ISz72V}%Bp>0@;BLfzhRkrg5;z$x7s}ntjY<+uB96wkx3IE3%{^5i)yzu zfqWms%iu{b{0QzSXq@til~P=AtJ)>#YFokQZ=B-C8DC0d9L1vcndwp%!i`>2=@+8O z4KXCJ4?h60we$VlXBN5@-=n%XCVj7=XFYq;jrKI`)BbqkJwNkbM(o8WwX zFi8BX`kVI5-mz5o8ZUe^i=cXX!g%I3)o2s?ObT?KhS>c3-0Idxc{TlCuxCv^a-j1! z?AaZ{wQ9B{Tb3AaI?5!YuUSO0O=EfYvM*mnZ$xnc)`nfcPR{pRQ|vLhdl4i z;rnC(7uQRUnSG$ZBDLig4*HDBj#Z8e?^1XkiWKIMRcf-uuZBAG0e7H3C4fuv`^|&+ z)zI;EJ56txRR@`u=VrW^@D9^#x8jXXKSYa|+jQduEL?3BB!o>iVRpHEB*kx_)@WrX z4SXu)w&HxzmqJT5Ts4!-yWw@45`q5bn_wrC`(ZpkK)5=~Cq%1Vmt6S7D8^atcRd@W zUh;vn+5vYAyQi-89{(r#T1F8*IT!Hrgk~3?%AwIX`KLWbRId-#bGOrybbu{8K2mDEGK+F*kn#0zHLYvcg4@dV-uC}R2Q;>{i5_l#6=Ek z9K$qu1ULnaimm{|%J9qusOsQ%R6>6dq`6y7agq?9!ulv|thh3jc##odlJ~r6e9cFF zZcwW=$IKxJq6(!=q#fGY6)jbOY4=w~sh(G-e0YVEBNWP39XxcatLdxtP5(!PbV*)j+BmpY%4V4;x+OcUU1rJmM6)#IYjv^p#}zGoj4pcaaLd9h@X9 z%OZJa?*`Z`T87KKT7Sw(XF|xsb&PEnlbMUyBWcbT^+}4whtL<=ev$pg*IqWKf%2aY-)-56SsZbA`Kvl6HQ}OYJF?qhFs~CnqQ@-{=14WxoGwpi z)&h#uf(|#+G}L3y^BjKfR=e<5Vp27*4&BDQ_(TDMFx(vdkB=cK6@5h(BAF}LknF@5 zGF#8i>9$5>#Wnh`5|Jw5LG@^y3td;(VwhwDCWXo2EIFWw1s}B%-avd|a-tmHs2>#h z;L0@Qdcc{KY>)M$iV~VR(lU0-V|ztY=1A#I;!6V#bzg66*8tAH%Qv{x*MU5&9qa`Y z>#w7J7dSxj{qC*r@9+T9krc#0h8E^SJNF78gxG za+=cS=Rkga?yvY7<++ClI}6uQZh))|2d%{sFrXn8>l1oc^fE=;4)6ihV>?7BKyTwqZri1bAJ=RTA^q$qCQ2Gwo(# z$Os@tFJQw(8RjFl;ZWyJ`(KQlWhE!kvH)g5QUp|P0w3sC282tAl+Q^ZqX8?MGzGuO$gJ(L4A;aScj#}HfnMlKq2oV^G9`JeEp$g5O*9D1&O%=lK-F%G1OSqNc^nAnTnlZF z{Og^*0c!W!YQW<#)zO-)UG<2}j-eAV5@*&}8S-m_m5?+R zZMWu;;g|}aOlZnZ#LQsYo+=94Rsg+gyW4L<4>MjeW-?GnEJ*PY{a<48TylcOPiq&3cO zu@-z%V42c?m>HlRQvk!0^&aAYlgQCzeHeeQebSDKnKyeG$OF7;YNLU8i-PS3={G9d zCZB@7E@Xj0RKPYM09rgNz=fOp@Q|1vfCda-OfRB{yHO-^9wHp0Xv0H{4WcQokx{B~P^t<&MYTk?aDnk`48=`P z-a_t6%V>KqYj06pP3@eY^ZHd^crt^anVBXYd6(T)Kl#y#{`E%ojV36kK-niUAt|%`HzeQ5`4N4FDsU8$QbpG6!g5R1Sp9v zUyw2nZy~90Nl6Mr9>?;1B|`?jVg(;%Qheo~y3gAD*u>n=HqN}OIMM7tjT8>Rn#kh{ zSP&bF-`D#^HuNC*tr#ihSrjBjuL+1F3m8958ThkJ7=w>2sV+(^SEUFS+!@>?#sX+L zMk>E+s=Z9j^WeOpPK|vz0*@i2z(X%4nrF?~n3(^~>CZ zY_+B^=!@1DS==w<43M7mB^!?yOq4c&1~oI)gw16|PNzE@ZR)>k8air0u?{S?Jy z9waWQly~W{BlNcD>o1TbovFZ_ZZ)=|I_Bm`WOXY8WKW>c2|~MPhj%6^>E&FvN?-)z z+5$Xt;q~qX#(auR-jN0LP{D7?r3-<-15&i5)rL!MYXMbCDog(1Ef_!ek&aT@uaYJl z@DU>18~je9ag*@oU$k7=NO`F5xo;4x>izG37M< z(?tbt0&NQCU#CT(lcQ%Vh^QB}^w^b6z15oe3e3|e`-xv3-@tT3kVXjZ|6srIMFK0A zH^5?YArTx?Zacx)Q;JKvpbJ=mRz-IfFsFBEqpE+@>S0^bsXEgG3F%K%hx=lfO^;!u zl+*dYc9BXb%F|}|i^QVIvEERz(%9BBRI?GT<~$SAP6k5K#LLlpIE^nLCUfrW^GKwo zOT|Eal^=@__MDEI7gp`&*U!m8a| zL9{>zvUY8L=P$F1t$V2KLaP^)8>;D&K4FiFn<$qq#j1GII8NI+-aLAQtdxmAo|kdq+bZg7s#^zedNhBC7Smll z{0}kgLMnEuZ>P{-PW7%|RUpRx+g`#Aq#l7jJYI7M5eOp_*5gE zQY8s1Zb34_^Ls|$d_VWAo*i+7pVpB&%^|JumvGdj^C>7}bqjv{6s{oYAk-epiq%VV z%B-PfMBy-wXKr3fk`}_hZQnhS`A`aNw8Z|Z3;WldT)J(NPBEL?n#ZWC=x5dN#GJdus0&Us7&$vhU zWb!6i#Y@W*e5x`sZbNLoQ$hnhrv*i4jd&+{*4+_t&-CDnVE2-z%*m{9|4bJ__o?qp zw33`TDP5_So8Z|VTO}zp4c*In-h5SfCYZ}r#;lW?^k}{1eT51Jqx?E%M$yWIzLZiZ zKA2qEOva)($C+N9?UH#6@C$VB8Xs}<#GflaeJv!)AfSC;OoJ{o$K^%0Aj4MX6p`N$ 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 Defc(OKM# zp!?(q4@@2qRJ^$&j$*m_ zZLyRJS$%V(eC<=w0b^8FEupO21yZrVi@np2h{m-Hs<*4_i9b{f8rOfujel8J{;UGh zk+9}as1;}D1qq6XwlB@D8>qQb35D3Ig1ebv(=5mAKS12BR&pqd=iWoy@>dO}sgZ!d7fhCjw-{3M|Ntx(^8IAjoDR6LLi&+sHi ztf5_|DddCce$9d0G{SpFn-M_;we%NT{FR~HDysik++VmT*(20aGsMxSo!;K0nQrc7 z;Ca?*`pD_JGD{L(R$gSpzPhhDGpkE7B`#dAUk9(hCHvO(0W4&n)SirfQ7trPKw00w zvl?0qSRp@i4w;2-swy%wj|`q&Qd&f52E(aI(Z7FBJZ}t zY#7ZWizc(Vh@|-d3XT0gH|kEki@S%N@`VSR;g%v|yd}1bzA>H)2N5N$L3lF?StqG1?X>CGiiF`Ieu50&0zy48C321M^XSZH*ab93ku9}tg>UHAViWQW#shlSeB z8nvwtSGY&~wUz(~FIzGTC=B_*J%^4!hBf1*b8HR;YSL|N+fGhw+qP}nwr$(CZ96BnZ9BPVzD(VEt7dN9KhR%y zckidyl1sp{k7jtpVbzjb^U8n!qzZ9{xvs8&;xRY}{)UDN{={jVay#zvG0~uPKwuV- zi6KyI*#0#6Bd(nD{60Dz@7O6$U>Ovyuli%&beZC+3x2TRPEC(EI$D00P#wO^{mSXGf z{1CfrIep3={A6_{v&>q zVxI5MXy}gjyn^*DL1#&8PvQDlkh6}GUx#%pWCc0fuJ?8g-rZe(2zWg@dJZN_qLoYc zWLa4Y%*JywcPd-CSpY#fjRsf#wnZJ_Xs2nrA*wj|*|9@`tuEmE zsDU%I;y;R6AZoOaH77~9Jj8CZs1XSSO!))9|AFrK*Nyx)Mw$Kp(VFP}M@apD<0{k6 z(a78&008U>0|5Mg*EO`THMX!d`>!@=1l!8)K>UHLuP|=Wl79?g+={Vi>O7nQxfuk3 zED5(pbv&Ky&Cogz-{Y#TuhO<{`x>0RsjG9r9L#OCtE#d}Z^pE#VQZam-79OYfCSD$ zy!vb=?3XC6+Qv;t`l0bL-wwBHCDvW5F$6#1x`U9RU^5Uu;arq(9c-u9K%NTjjFEnO z{xz^%DwRtTk7tpP3rpURsnd6lXA@hJ=*+1*Ee_776b^HGY+gf>uy`268Y^@u#(L3V z2ctGsUsZf*U=9qR*9X9uFJIwF6c3orSg_lD0NJCVNT+SUM&ARQEMH=U3;}}GRh;c8 z1B@_UbR>Zkc*B$7u0iKPp9`+zerqNy-n{^|`#s;^s1BIP{W38?s{9hviw}%T1hit%m65ui_VqRSSF)U zf6`yc1a|Jq>RN=W(U;g^&!686Uod{EkX94PI1G;PHtbHSNMJAS3l0z-=;4w*a1;T19l(BpzYH1UEI!a7AQG07gqEz> z_-1Ml6c&e+?69}%@daXvyhJl#qSav!=--oy4KF>;{u`!=*h=tTbILzmkh#Z&oi!qJ z0Ekg_f`t=)KH@X*OoWgX6&Q42R+Qr$!UZAj%wx+RnJ}P|tPCv=gO-ZW3j&-qVkLWQ zOEgv^8@+D+POpAuY#sk@_+rDo6jsbZzt^=+2!D8dedQ|wV91b8+n2N+4pX{2F?V=g zFZ85$0=-Q?Zapv_b9<810C#;@!PuShfdqROh zJ@LNP9>b2Y5;|sm5q?T1aAbscimM+KR;8^xaj6psM>iBi-|OEM)Bb#WBcV2Vzx1q> z7KiLqs~f`8z)9V;+nSFws@-VUh~m9!WPsrV03Dc9Ik?^slCTbESm031mx*Ux?Z9*p zX~=_Dy5E4@*^{`vYbnaJ-HDiQ@o08^7Q`0UTAPN!(%mpcDk8dStV5J>vQi?SKk7(1 zEHU}U1>_+{wG~1RjYr|zDAasNznv#S3w_pRjQjXxA1*sE6c8?gnvn#b3`{0kCo#k! z{*;xBKjo38qwJ@9{@}^aj5@sHv|ofJ0M9tnuGatD@?Ak-S_=gBJ(ng3e}LxIqCOJz z6Yu8=D@s5hW&op6~kI`>^NQ3~wL1HE+1I_N`GH^Bt-dn;tz9E@vm zHUBalkz&Io{GI(4x6l+Eq-l)~(-tN3{oCqqY)^9%fo5k_WGqjsVR{6LLr}7mjtPbm zCcmi{RZ*Bwp7kfh=34pQo6gP#n)s+o!-&f)jyry9Rh3#fp7dIR!!q8@mcTDWMfE2G zFYMivlYu5=5MhBF#anCKUSW0?s4_!ko7OeB=^b>v)h|YTBBat1Jcb1tgi)fePQs(AHQG=X7qZarM4G}8X+x39cc2ePkk}2C+?60PCjSGQ*QGqoB`=K?kzB$Y)sdsdLh@;|1om#9+M3bK?Brzvo>VoquOCR)S zO;aw&xyj{n`cXXmmB`fubg~}MJoYEFhCP*>5$7vW8eLL5qpM~ww$X2@M>PEIGtM5v&%zEE;O6~!{|-r}0GaKX~iqju*ikn4b!y$-rmwP5BUE<0OfYX{%K) zmBhLS9(WxG8W->E0}I)~TNpx_tmGX*BMopGZe`w(ZDq)Tuc2$0h`XrkBlO61B+Ao5 z4UDhs&mFwbA^0!W5C@#N?{~pWBVNRZZrEepuD1U(C!@b(UF(}K%hzVw%2dEjCaEw* z>W_5jXgH=;`zgXs{%LcRunaA`IanFiBkt=&)x(tZK!sr<>-4K6pCsLmrtV(0Pa0}*%v|M~T85P4RDc$z8>Ls7n4}fxi+w{~VvUw*mBi&N zFIhZ4d0j))lCM16c%0f{cJY~*?gx*M$ z6l9#10>?1={W@l4TaS`{MIjGQX~GdT)O6#{5x|sNpVd3?3n2PSi}SQU*pFZQHN!8peVe8e|tS8 z7&$q8(Aj1mUr~=Nx>{kt88tv*s}0}kJW!6L({T0Bin++sB$<*V$aR$RDWg)eD^oL) zmW}+zdlShUk*<0rIPh%u)3Vc!<_;TqC`yL8g=-&3s!ATQYe&0jJ5tlkSB=s3Er&hi(ca1nY zl9gwspGi1I<85Wg9XmE9b`;A$m9f;nQ7gt(OcVZy${pu)YJNqc#5!?%D%G)`I!fLq zg`ss#uFou1f?h zDd-I#!G?GIvr{04$A`dA@_mC@Ft;@F`HaZh_31x{96UG;FuOnyNmhM$KXOU$x-_KcXVjY2W)qT{wvWI zVYW~@*Vhp9Me%Xr>3%sF-U)C#1fJ%L{jMk8ci(PFx1Y-~xqqzHwf;6fEyv~>$&j^o z3WT!Vs{1?@lD?SM7A-sFd3$J2erjh!y8n?e9@J!x!6DbIhIr9cUmx(R5XKusq%#S) zn;JNK-#u#cCa?Y95m@=A8a|)Uu!Ii$o9PpnX;WG8qx6OGpX01LK#+M>v^8{4{|dHe zBCpR;z>hRg{{gJ+q$0h^!0$k=C#)MI6QfxEJY%FQ0n5Ml8W$K{-kTH#R8}Fz&uY7H z=7J4=xtE|3eN9AycUM!M+g(=^vxARom_k4flmgN{+GW;lT6EEOiQ_rAfpc11aE`P= zdlXupi@@NiL)p2f`Zq#Y=48Q9hY&im#>CwGfr9MYy9+$*DNNlV5}Cld<75+#|IB|r z-Rx=cT(?s4XITTLVDVaGUJ?K#dW9=&SpD*GZ_pTLeP7PYU5OuMx$F#41S5yqzxPiE zPY=>S12RnYd|5K?zZpkK^K(80$+H%nJ)^Cvgs{PSWmm znzzbRgfy{*+0Sr~=Xtu2B>m{#ws7|p|MGB;3%1~Qugz_lb7Z@pW|=^BEUuY%K^# zXH8!isqGrEpyocV(=(Ced6tiep_Nayj&DEf2KW?M7fLiB2IbM-uzt9yz-gbAsxln} zPwRk_B729)phqJLjgZC3bd=12?zdF*q+~$pi$J)r`n8V9w2}qN>5rrTxtpn_EbG?z zNBTBo1pwgq|J}`4+qvmko4A_%7iV=D+s1CQ{k_W%bZ(^JVFvYY8g3-OdVJ}*PJJuI zf%C{b6^Lf3k&dx~n509G!LQF8G(|$=cIkF6H9vL)5kBv&o$=`5{aMQnH|25;<%ncT z3!^G^3*wAqM8>36QEg1Mb&U-1iAW21C3aS<=qi;-O1x-<+oov=RfBa^H-)o_L5cO5 zR0(zidGutKBULn|NfBD%0*I%|R`phG*)8pr`A#PbrP_*Q(?|qc<-mlM_m25LwZxh$ zRU{?dCg>F{E0qoOeF^>ZQ3GK50XvF4^|zji((xuJf{I+1a|{LXnHur{TKl||Xc zSr^bcYa$ExYAFEkeA-H-i53)O`?~1hD4|ob!_~yIU`Y`JM5THYO0fzb-=m#JQ%%aV zok)>%k;^*l+06v`ud&TK4{PZR_U}r$OAodG*23Sj7V)0$kWb&23mA|sX_4t23M$D3 zYq28meo_4_1vVRs82LP_pl)!?esTn9D0`zL?QSkVV*MVJaS?>vV#N64LJ&_T_leor zx>~dKq0y zgUUyu3DyA$bPaM{zWDN*Wz~BC3QqGB!Ye$)pZYoj^#d=0quzc(vrOt> zfhO>|CmOwpWK~?#-C%dsxcdxn)a~#hO`L}Tx5Mb%Z{I&3%T9B% z{7o2Bu>--#kC-dQe=#~_BsaI_gsx0J`enK;usP_KDFkmu__4Qzpqlq2(NqhB`rXrK zP3z`j0I5cmMbSu)cz`Wv65tSqwR9-30>=GtF1Y=65|H=D4IR~Ai9S>r_U9D7E}G4H zSu8o65oc*JfbC$De7}pmC{vSb7*NL+z`))~cH}jMs3k{lsYrqx@kCWRnoq+V;E{BQ ziixeB{tfLI=4C6hSPlmynF~fByN4scu&P{vTm)c$+7>%imjkyX2B$MPlMUmg=GPm$ z;nmBMBp^h5W>vPs(dm6<;vQzM-Wx7u_cJvetmp+x!kV_7DHmuXkiijwN*9rnF z$UXEtf5FL+LCKy|Le-%izT#R5*mN#Jtq>)Te0%~u$YJ$4H7e&CQjk9~nlVovG;rO` zEU?LJFT!?obh~?a`y@GkXROF*&p5H*J#X}s54B&o=>28ofniGZUPc0_z+fG;fE><> zJ!LZ5rb?iMV7biy@cd+Q^Ljo|&!d|RJZ^!1u4P^4&&`(s4eW-c=Mspacmj@^=IM22 zbC{Uk=3Hh@HZ+Nke3`~mgVyFFBNU}0U366se;c{FLcbI0kSl&WY*OR%;ESORF?Emd zLj*lgS2>G*WY7O9nf>%{Q_~qtLf)`47o-5K$_Pwv5^W%wHqA_)!HzV*!65-C6`0bz z0pFJ{1OST68*s{Ta3G3}1;Fje6661vORgZ^TJ@sf&H7)H__L{Z?~<2c#_|@1QTZ!hnFewB1ISj~(Xr!{xYob7ZkJTGTlCT-kA+32fb1RXl19TsMJWenw_FMIqBVH~!bg()kD_N4BY0j?+A>$+%y0_&KT2}_>KQ~e@c zM7A)ob0ZCI=y!95hChkd7Z6A&EA+c6)k`;CPndLN?UR=pEyk^hL+r3d)!72h@ldms z-X_waU&z6CN#co+w!PG`NJMsnZ63jRM9Xy(5#GrwRkQ}(kTZjNh6(@Aq`5O2z$gs? zJ37uBT1++0&emv&uqD`}26E$~pnOW;>P5{=y901oDqw-x-$=C$w2M&m6i+&q%oqel z;kDF%Zuai3px%g8n|E+#U$S11N-mcK2pyOB6Z& zYBEm(Mw3y&wKy=1Bt~zB$L|iA8c2zC9(3eOMaFp3O}Q1{WJJ=f@m`b?Ybi^8<_tAw z#s0aV0&GRYdI>Hu`w68jv8YN=>&OM`W*7#aEVOMAe(1}$ejg!n$X}BZOru_YmaI^F zsTGyJPw5T%t(w9p!W*whNt^Gf=*Zww&w4=^eks~TTwW`(PIoC`+(4WTwYhCeRf((! z9^0}ww}xU80ptZ&Tdv8EJFI$sS&u%MWJ+j6I1<1FOa z0`(MePRMx14+LPF4E*Ps<`{M^mMFhss@7rn82OLjX7h2u(K=$5i`a@p8VB!>hDtI= zXcZqG-!JpJ)}jm86AQ##9G?urA)D+WMGTt!0q+48ddcF{aWR*h)M^{Fx2(4Rv-N~{ zQ8=Zyq#wA)AH;YIu^kc@443k_5Bdr=9c!mbB!@opYRWW==GT4;u$SYllH*Q`-{$=e zL1Dx^Hji4_Qrw`j1Jtv`gGmRhKaF^SeA$D)ZctXE6~y0a9%8v6@fyO+atjDNa+Z`g z_2@lMKSb7BUH$WPF~WOB{1wMULl6cWN+JU!-&iDH{J3FaOMBDyfc0Sg>e3?XHkit! zvwhWk^3KONC&142$CK^3?N9Md!?9dP^z3dL82-{U?vvo&OgkZefi|t^<3wOZ1!RZi z3Zs4I|G-BPkgsYBEDKzYwO1^r2rsFX!DDO%*GjO-OO2ZH=IZk~W3CWjA5>GprONY9 ziZr$@otbT4PNVqUBo&8Y)RTn~`(UwMRrr*EUBOoAF-mLmchH^*^Nx0ofjQ?Qz2p!D z!b0)(Io<#MI6>A>THS66y-k zG5@?|D6O`^1#VD<+Sy%I0r03wbH2{PuK!nA)QH%-Cg(MZ%A-0p8ymoF0d2{j#Hi3R z_ya`PPaNS7DbCaDa|oSX2aDmrGV{eK>M{JF;*kHtz6_3dCBaF&-5^9$>ico@6uh&a z`ejs&EnrkSKX_%0zg?=Se8?oA5KTM4qs(nP+MzKx6$*?*@1XuhetIa3nNIz$@CuV4 zWR9?Js=KYYSuAu7wUM zwZCB+x#Qg(=VH9)WD>n`9lO7mrI03Z>KuDXjf=+7o|?=4Z~@NT2Dwr}eFhs1CzU49^D85{c$a)= zf9PMpV6}dc^68_mwSbdAEue-pozMEZBShR};k?wal~ik0(0Uw&#@1sXJnaZu*i!o` z2{l0bk}ViUOh%$JML$R4u3q-=Z@Zj@7(X{wQcok?u*`Ntv{OP$$Sp3X?GnlU<-8=d2tSHx@q& zl$W-#IEM-Rr@SA&k9q@iAoKlWVm_dqx6!fjg1*)}c-nsAd$X3Fg>a58Uin41tMPA5 zZ4!rN;BF9Jq1U=3({VlB6t?uY zFb#QzwoL;pKsEI2{SJY{52I{B-*f2j4xBDkE;%?dM5IpR@0k(sDZl@E%B=ueD z)UN1J-~na_j(y1kz7hPTH%QunH&e(qBQNa&175?EqAW<6$iiPZnR z2M6LH73$-{va1JV_l43Q#0+x9DEHdaXu6KXVnk6P=rtpecOu*~-2_mD*!vNf$xufC ztXcpC%(-T-xilP~51`&@0$rTvJ&=enOP(^&jhTi8P{P1fd z+Bp|r1$2H`WQ8e(jA6||`gxYy_u}*Gvr(Z~l?o*pj(rj7 zrdlB5%RF+0<*P}k`M?$wD*VPZLMg)OMZO%N}VEt2tJ%)mSl-SX83!B90TD+Xk|I8jrNuWEU4 zf5r^GDQL+~`(k%-`;fnf{sENYhRg1k!ye<*fC$LK%+&g#9$ydcuH5e1?$^5#*nh4K z9lbp$X8-V8dwV)C@`f(muP;oDxg9p?4QustbM+zpIb6I)jql+sBSLMszb8%P;>pGF z@n0QkJ50J?z9lAj_VsoNb>7XB8!l*P&(@BKyqy0A zDUp*1OZ(#G^XGS*214Lyfb6sY#SOAM8P5}`c_4UddXc8TnnuvMh+*85Ek1%*j|ULc zZRaER6!Li|k$NFsKyRr7#OU#ZS6$iPQxE2;19oW_K>**%WP~6}FOBT8S7)2X#%IaW zp4>}Mj=KbY3-CfcCy#@%3ds)-kuOdM$44dn`5OX!=Inc2jyhj^T|roWEPN%7IiX7K z{_27g-9*WPy#cl9(>>+|>3PBIosnBFejs)y<_Ut#u{=FrL~w9J_{P`GrdNhf7o(r7 z9=d}vV1_mPh*cqkb!~vNtXzLSXVrxmDI|a`!0x!vWMqHzz66N`P)JHEv_Lgl#yf#y z;|Ibbm?L5-avLmR-Nu!QMVHXV(dfmYUD~lCV70&Rq|b{7}}rSeApp)8PloCr0zl65w9i3B@aZuy4L@t~$OWti4^P z`@HIHUH97>r7I!DhCcA(rX>dX5bAumpaH7;!#Km=W%+J|y7VDIYH8zWKRH}mF~nC zzX*`U=wQPZvxg>Q9WXG;pk1(`0*PdJrjE&B4)b%IkJ3Yuh$O~Irucd2czFtkqUZ}p zLruQ!oyZmVPgKobm=U`TU0o)X2dOKzLH&!Pz5Ql8Nj1k4!(QysTsmZ}6e)PgMc%qY78I^Je)?B)tR!4hc{lgm25k8C>WC}hBs85B#)!#bs#O;3T=ndHTJ43E%vLzJhv z?tV496V9p0E^#h!frHW%+v4h5i5P?n1I*=wKTp)%*c$nO8uU*oA&?Auc&6q<;)5Zp z?A=L01tM6(S%_jqh1m&$IEnvQ+xIjWb(f{;sf)Gu7+L~%AivzrP6@lg2$X{I5Zj4& zHwXQ44Yx{(qV?Dip#yBHWEdvj# z{x%XZnTaO)8@DKeqQA+@73NbnqQR_?2GR%ELKGC*Efml*gQFJ!vUm z$qGB--8Yr=N*2*M(nvtKBitUl`-0T`<)I}mnsJo0iW4=4o|%*Ng{^DuqUvvk3X1Kx zkzS`E94AzQz-rh`3YF(>3X|aqVJfv0E!NeQ4IP(9=oegVty-2wQA?q$C!JVkrMfAm zmoQq9zVS<3l+`4zUwNNUz+lLC;UWW%X;52k0O4|1di2IaY&cu?_fkvptBa*cz7>-( zMM-kgWm&7H zO3cSM)-mdiWg?xE51lng1)1eehs_D#1Ujd#1T)|QEcAhXE_(C+6;YLHLP@IiT3zX- zns&AE0p>}TDZ4ST)9!hyYNdoJh~{+7&C^>3a>m?~CU^Ew`sli?dv8LT0sgVlXRq?q zfCwMO)&+so(ZYtv_Mq@^8}gEeqTyu@I|3s(a7u-~=~JM^@`e~8Jr5)IBR^9-4DdwJ zqX;>`Oc;Y^8-``<42{8q48vrW82ecRm5)4f@*#vzRRWSiS}Zq(9dMzWY^at@n&lx# zRhx)6%K4M@Z3^D_71mEgzi(wKSYTH~tJ$dQrx^|uor-16)s~o2d zd?Mgsey}_IF;L4yo9c#TOrjacp@^$)PL{SSH7pZsy|_?o3Jp}A-q|{A!?}>@#7p%3 z_}7DY*K4up-WkYUQOtm#7i=eNy{XCtlgCzrPom6pC7o9Alwl^ASC+BXxEm8o_A+yN zB5kPm(ODXw2*raS%#_U>`A@7yrcw$xl0ts70!KXig#0Cqr0Z4O(@HxjgKEP|j1L7a zYP;8K+!hyrHYN^tgDs3D;5M-CxETUJJ1Z>6OT;-xw1@rxBq`3Q2%V(=z zB##waW>9DGJrWF{ru3sxM-Dq%{B6s)-h+GA-T@Sa`(DYcp>3I|-IgNgV4h9Nz_O8d ziPw$vos^Q%R5;fl>XA;hLEJ1FSxAFH@6V1jm;%4EU#_jT1~fM4$+apB2|95Xf(Ndy z50c^%xCe8KH>Vwr)kf-C?o+nwNxyioqHWaIzZG@T{^epaA%?AOu{Y?|MZf zmyP=6V4=h7S}2=&8(C}y=9^_A#fLCTL#RRmg-B47;7+ozI!31JOu!!g)%SlhNSd{G ztBh_7Xw6W#t|C0Px~L)#k|g|+tpP;On9DTJYAI-iDvOfmZTCBI5Iw8XC)H3+kA=@( z4z$rS84=W?=PhOQK%XwRxH{Fq2~8|@(b5pPL&mT+SN`rMrF<+)h-#ym$M4P6eENlA zO-}>r&y&dnrKhcR6GsycW2@xfsAK6-WYQ(Az4Bxmm_0DZ+p4yYh}$|x?9sdP0v1#N zm-?z@%Xt=y(V&@tGdv@u@Y3XI^LK;Ly&%Jh1vK!1rd|@o&fTQuSsu0B(p`=Xbn0bb(;BeC2p$!hX=dVC_H10J;qP`)t-_BYMq|QnzO5<^S)oEvqi7GGZ`m0ARI=`bQE z1L1eV_$U3hFpMl-xE878{%s8+X|zczqXhK!$#;FW+<~i5kNbR>EchxlPy?h(F%DP1 z7T?`KI`%8aL(wC4@=|aN*A+D4^-lGV(SUP;q#5K3Pp|5t)N^f$auU^m3ld2WdAku$ z#iLr_B~dyk%DK*coaoq+Z1q)Y|8m@D;3_RO1d6$v_9U!^=Q4BT@GM%acWD8h^rdJH z6bMeR1Ebb(!^7|THDc+%E5=NC=*Fxg#|UhgC^YuMWY4T*0?ybo0qQ43pjlELL#DG5PlT8z;nv`MMK3xJo z{pjYMc3&t-?4EZNW2O0*9eAqoRCaowKVLoHV9B(EN!ZbolTEr42W(I%U9pkRsXgij zoj_VK$(^oEDMv4uq4rDoDoxghc{RFU|2-(`<&1muU2fKmLx+Z+bn;=TxrFzc@m8oc zt>$Z1y|B=UO*qBlFim!x82x+_;Mykx|&cAFZ;BJE;^a+h}cIqn93&e<)exZuJSNm+_RMd%0ITN+Dqji&l zdjF=lK6t&Ne#ZN{xL(p|1ErPv)HleJnWB1jy}CXEBrMrfPsRkbr}1y)@bxm<-9bup zCW{>ULMO>T-~_#Mg1@!G4lId1#ke07;1;PrY$y0$jAtJpe*Oz{jLw~%ajWD(SU#!# zx<8M?de_odcJK>r|22nAtr0M!GxzP$R!{*1M=ZSVQ5Y91$lpxyyfqI>T-~LPz2|4# zORzQg%QAXFr&qb^aZvW)PxgB`yI!amIe}LBYnBAv_N|DMedZY?yHtViz;%OMnq19^ zI>GSF%PRT5&tB+znNO?bd#eS)EMK0|JgC196d?9M?-Flvhri=lG)Kr5-qGeo*GePe zzK<5UQ29uZb`Q2?co6xf1y6`nw&W4qUeETabC9OwF}; zU|g=n(ub-)9&NZWCjgx^4;!?>s%u=J3s7xL(YA-SW&9h$jWq?%A_vF%nr5saiy}L$ zfG(YpMRn{f)sU(}ma^NtrC=NvGFY%5)syB5qWw7`4wUE!K-ZE0uP5A~Z9K`e^PAE6 zBC4C3fJL|FVA0(JaGDrf3kc0%uIhpsM=DD49W$-^jBWIxhBh~s>p?9$YOE1NMqX9v z1V~_TBfb?ishC>KH9;XXDK+`^S-q%lF_dGKO|X4y-CgE++eg<>>Uz!BZLN+)Sg8+e zmWGR`Gn$}rXF_26%gQmmiV|u&(s|~@N*&n;YVL24Q9pyl{u@6`fFMLCQFU|*qbp*# zGD=Ao^$5||t;0%5V!>sc4KxfgdKLETXKkV@Hz5sCtsANSHF(&4plW#;-Zxq2_DvoG zPg`&0xN7UeeNV0nkFMJ{hiZZ)Ac}HFc^13(hEDGo2y}x=F{y6>N(G@GU3sI+9v}*{ z0pk^nXX=nQ5|pO_(&S-L1xd0OpeelBi(+!gk~F-!oAx`x*Vx=oI@(yQhty8nb8$bx z_1bIs_yNri>w#yn!)y|I-o)iAMTC<>KmOYzbmQ7z+5qs5j^`6DpQ?D4sHgkLCk|u+ zhHpuK5+9eN1k5153?rNNE3!`?pTsBMKWbo{kVlp1lnE|C2_xq|CRHF(pVpLt#|Ot+ zq1J9?Sm^0&RLDu2mj-;tbT`g|PIvcL5Yb<64>NS0AisrHlxFgE_$|gBF&{Jff?5v$^HNjB@@` zxdybzy*pb(7r;?xhFJ74Pa8ftEJWfoQ~3C3vfz|#v7ljNSX;+i>OiZ1)Un$ezkyIR zqYR$f6NFmATDsAceGlx(SRfvF)fI0L3) zTM0MmXrU(cXn|t^DBDw)t;UuGP_~EAS&OOA$GpVJUaHnE0^*(BeZBNf90C&V5)uSr zq&8TjjhK3at_Tz6>o{jY&?_VJ&T89?nvrAw(#F54(`dO@GneoBFO6;Wg3hFvhn;$3 z2esRZe+5A_vnUASWPjliG>wC_5e*U-w&Q2No$pK&S=^%xNdkUL@9Up#2TR$1# z*9mutflnh*Xue-Up*1Y)_>Eas+?Dp+Z2tG$#_w!zPa_4@lG|G(nWw*{1&p+g`&!B; zx10{&oGKRp0zu)zG3_KQ_|%6br&3zMdhol0}S zyb%@m97RzIeEvpKJFSKnh|~|2xb5n(59&5K2ggfNoZY?kl??QET?oYN^uW#%giab( z@^(%|*Lcnd?T{U5xWu2`-yM9&uYfSZYcNs_wNfTK(v}&Fti7;GSbaqW=#rx#3t(u6 z1EG)8G(BrKyC)y|nNwoK=KSNwxq#6ontpHfxUSv1>f3<#JuJRn?HB|f^Ud&v(8>~& z)B@zG)I|eS=1YBzkwX+;D-*xqLTowik~hptGC{{4!fwr6&NA;Wh}z^j(?CiVRk2*| z*Tk%3FEejN8C4G77y&CmY`Ds`l1A$DEA4a1oEo*?7e@=3h#MBIku(rQg&Wl-yw>q|Hh+V?Xg z8-Q}@0z-TDwTcu)OA zr6rW1iw`Dw#fV!0G-ox=9mQkSRHSRVMZGAL1zOS?Iy5H*kJtCYVf$IMtPT2{1a|q7 zr9%(w)wU+dEU71h(08VxQjKkR12CGT5p)#GFl5(!wB^kw#hoVZ+vlA>v5WjUo3kFdh}0 z$9ZzULxsq(w)SvAzDQi`$HIcZGL%d#<*Ako9pGI3m%>;GIR7?lqN}JfJ$WCSpET>$ zy|05I&I_tro})bsPZ?Dxlxw1%VAVak>j-ttsogwnVgdL)wJ%hTi7SvZ0RW_;pCfS!;Z^33MGiu zJay6omP(~>LMZ>rAfIn5*A59oCyG}lAjzB4 zw{~_mbRek)MXu~?OrQdb@PWW0MmuYbLuj(xGbXxg-tq>5iIDLDPbVJ_PVkqApOEMm zQAxfl;EtD|S#=ok$m={1cbfl8nL{_Ndvn(CV-MNDdS(MGa6cMZ8vj4 z-_3)FQ`MNZR{@P6-ZJY`4dbPxDleOm4VmuuP#3>yP6+5U3j6_{0=G*IvAU=}XaDQ9 z6&++}M{n)n)T4RZM^Q@kkPX_|(j*x9>cqEp2p?_$i6g6fkMA&AxN25#)1c0A%F0z1{fYEj?>l=}A2 za%qK81IBg-wv=%7%%T>*gG_M-#V`%PQzEZ`agBG6(C8J5ZTW?i*q)6tnC~R7;>@lz2l<+pj7dB)G%$eF6 zD81ywaJTo409xG|mh3XvnOQVbdXeU=FRHm*`m1!@z)F^EMl)4(>?k6dxfmqaoT>Cp z&p2JKCnOJAru-^ek>cpNB8oTpe<*v$?ogv;9?9BaES;E_rux~t|;u5#0lDYDz$kYNk&lo^W z@*89E)qn~b+H+rVmswJqoZ|936gtN~6+b7{)_Y$j?#7M%?E7?0f{3cNR8guw*P(50 z+x^tiPp}m3+U&Su5EQ;VaOS!C{|1?VstNd&8WvaI1<*5x+|jDz#3G|^{M^f_%qLp{ zpd`4YxEX|MdD_HgyFoOR%tUo?YdESv@r2K_z9?j4QaRtYPb4#AcqlWJ-gvu53Uokq zTpk`5aB|<>M`g1?*rEegFZc@{yF$XM9JIui!ls0T;HQSQ(U4k<7!W=)hzBPJP<7M; zGCkVpYBlgOUsm+%V`C=GCH;Azk&Z6SW0))<5#>l7Ktbq`i&4V6!G!K-pL=E#1s0P` zri;&dvWL3@qe4YC6P9p0u8wsa``1d++$a?qw>_Ap!*Ci2ru!H5uCNyd(%st4-DA0R z(il&hyre=fJU1Pffm&g|o!j%y_M|BCRu0PC^}~5V`_edL0?lCjU`Og`L1N>YVJwRd zv9@@kTah^I0759wFM!0C0Wenem!6bTBC$I1CiV5Ci%=q#;i~1aLygN429&@!C?mQORo`|d1vnWOb-=&4vwB}&dU6vu=9oBBLr0M4z}>&OeZIBr6kBNLlvi21 zT20}bVRXZ-SO&V#=zJBCt(=nvS&|)f`1h~{?HyBgzOy)sWujJSXe>WvAFHUhiBy%H zjrG7bnl!h!FyQS+umSHR7wmc^dWXNJx?b$qso4l+Ew5Js z&zy)pe)3c+5y-KizVxc&2}3!;91a;@r9`N1?s_C~pN6}3L*Vm@qjYh$jU~NLtNl&A z7WbdJQY_ZVSQw@Q_ey$P3b#9s>o7XTR7+6{dKscq$5+vC|CBqCNTi_97vWaQ&GA3t zhhAK<%y%)9r;fkxDh-Np#?oLpd4(vkyCy$@hz-1GcY1jO&C^^9VQ-}lBERz}8;B#8 z$p3>b4h*N2U3S)1^g!1^;daVTjm)MsVv>>)zAwsYsWp?9??&(I?m2?(y;GluOS)It z=fod4i<74THwt4{;m(Rue> zA$qjNR8dDSI?N}NDsc(*!m?@v8(5!wq%oM?3uktjMbY~Jr6Uh@=XbBDbK*N#O1ONT zUBF;IT}y3Qh0kuOs9#qY%xH-F4}Jw2Z}0avssREcL5AJvZ6HZcw&dl{ZP2R+;n}D9 zPdq7JohiFPg)5GKzO#I6YrjCc27JFut`V)2v(gz!Bd85q{w4v;VkFxgQzijr$WLV& z$m3lfQvoj;uoMV1sM@x@1`*hkfH0oeM6YIwi5@V06H0P_P0-SR8)@8R1*A zo=;Rw2UyGqm@<*`P}VapLwm@`xK8fvUIs*tUE-mqmT2&DuvnXm-=#?5(&xjrQ zG-TN)W??EyyBc5mY`{2qBTvD-r^%?uc9iHJEHlAUEH<4*6<19ZlCwDaH_fR5*+`1k zce0QY(odY^u=wFfOq&6kC4i<=9=kh?z0+)C6Fosm-oJzz0i}5C-HHKllc=2#v zKfwR#%JzTa8jSxh%);=O+xV}=oc|-ZvD0SMC=LVw5CIAR@c-kBHU?HErWV#FzZ{24 zvX0dzJxb`!6BQg*h`ZF(2u8G`UKMpfpSlzu+L}z^&}gNq7E~fPUGi0{Twd&ITaP(W z&I|X+>2keZ|K$^mYs2CGC`Z%ZOdn^iU`5Fm>zB5)iPJ8FIQ2WM@!h1b_(@{m2Y-7X zdU(Y?uQltYEuO-&BsOgGIWVcR;y_g*=PhmkWY$5|*7d3QSV-{1I;AlfAYjdPZzw=8 z#}8yT(wDEhkrYr`i4x-^6o;3U+ElgRcqA%uGmTPPQjp7{`kKFUV@S{yrzkBpDg_PO zD0(G*6!{P<#U+Z0XKe^;%i8&R371U*yenWoTHu8bV45OqgQ&I$$^?dkt!~M%PXB;zWFaVU)D{L zX9tYRHBJq34##wc4yXXqdiTVwWsw^RKOxq+opwZ9=#DjsdL0+HMjALzf+~TFt@9o< z&LG5c^+XXzeL84}A@39}a!U`Si0Q1z3GB#?Xd0B@{?n;gkOQ@cz3zy6 ziY)*#C4xl1b=96S`S$2}b^bZB_3`LcpR!wNoxFKa;#YuybYKol8NIp_Fc<05hulyX z!iJTpv|$wmn2zl!ut>3Q;qC@d}qp&r=ea?cRNtQx&`Nj4V2 zkRU_gvFC%^vY*g3tf@K%{rm8dQ7|8i|JVuUm&M=J*qf?GHT>)a4U>3~M(9KQej~I} zdg3qvPM2D{Z+M9JpOFr`OXV5`1^}>&0sz4I|2@*(Obo0XO-%JnEo=>}Ej<4#K9|+C z>^50Zd{=AnaX^xQ#ro>f2y{YQ2BA>MLk-C1!tmwIBN{ZMiUkxMnhHOzxK84ih8q@Z zPA5MRC=T1bPbP$P>Mkm+R8JKvreUpgT)voUh@*xHH69FGS4Y+_@n2`cDQk=On?JRP zf2MpT?l}{gT2U`&XKb1c`Rc>M`f^0B!@yS{)@Ya%l`yyKxN9|6u@X+CS;<50nwMQJ zgs*?(66T-K!wr{WsxG&bXFDhw3Li}w|qVB4;E18ZTmK#@&Eckf0545^Q1TZ4f9 zO^dS@NOYFwzVA4aRS(Q0TtJjZ8d6yY7L^cPYjMT&QV|f>7ujeJRJ?Tz$tDI|7AP#} ziK}+${$1*agsI@opCv!Ba~iV;i!6u47+DDyj!lc&@Pg$n+~uTAk8TZs=FU#E8qXI# zkfHjx!&Ggk7|(dL2=$O0e?sSKXN5G^~}hA05hUet^LZM!b(oG;a=d7;y3_NJwBrrW06|AuXm zb0(hLBoHl+7720Chnwi~&#|OQsPhFU5=h>@D*B?3%Caux^?qw*LxVDDX_PbW-r#J} ztk<};nhKDIx_htrY0jx!@-Ep(Wx!J}TcbehsIX2EYgJ~w%iBOW1Fv}VxPLrhq!bzz zH-nF64D(cdGYVBp|9c-989k3T#3ID`A9jE)bvITxlX%dQqerf$f*RGc^fVlV@$g*p zSVB&{8UFL#8@~D=7g_{GqA}ZfVeEo=kjq3tg9-t@EvQ}4EEofdNNY%NNaSINI>VSV zp7YoO4Vw&2RSx}djbvToc&gqcVc8OPuvNGvM*)v*@(D~>epi?wrgsR1H@3G3ppNYG zJ|Zyl?dpp(F>j$DKYw7{8CWP7>n+3ftwK=sEzlQG=QQGr#uTOr)Ft`dVW3%PG~QfH zQlGQi>kZEeaQLakaZi+sfTdWw`dk63BSWu9Ur|@k&I1}!ernv(Jb_u;y1{OrDcAXe z5EW6={eavJ4211`adcB1-6#@CBQKs&bf^gXx zyE8()TwYp{CQZn}a4Nlbl-dY*gW791cOxRN2w2{~GjFaolkBszA*VeIvEBmOLf@Sm zGTd{Ui|r0WqShH7&NgSdq3bBPFTA&#PL30jDFQF{#f}}7!+7MLz;V#(+*m$gZdPu7 z0axzvQaJX?#EnI@vnH+Wl_PWUV4?uHZaaJ5zK+m`Y$!*LA${-YE|`-r)R~a-Cy2+$ zJ$nw>_1X{w&k5%2#Z;Nwu1^PO7DGEh=r6GDAC{Y$~K1n*VW35y8WBv9ZZEGhFt9%D|-*z5YPl~RC%%sO74&u;F( z(gesyiQuglyk%SY{wGY-g>WfG=ZDb;8GX%qOE zbYwft0?L?n+`$W{ED#!WWFuaN4A>F&@nNDLz-z<0xuE!91y*@N7V!M5cQgg!rZJ2R z%y!i#bXw!-X>2@Z<`ql7`-I_~4bl{{yp+A(fBmy&q0JF5w zDwxv*%PDAq=Jbe(NZ^(B?G;>O2U>j&w*e6>TwxX>&b2k^ZNuW&7!sA5kOiwO z{b_g`jnGj};lTc0<+R{owndT)RquA`=IP(^(9@VR&Hbc$q2r1AJxj9PDk}v(J5bf{ zeHyoEFe`9+asA5KIT}YkF|P*K(H4u1r|F+mYj?Bnh0|WpF0{QPPc3qq;tp88$)+VXnc9R|^^u`y8pwrrap6!%i zlAGB)9>djhEkfS91JO_mi-hcAQ!Z9S%;G%h^$UgMs~CGB2f!SR4FL#Z8B<1fENJ=a zAHrXDiJpkv%pn2Q(x~E%NJ%$QP8a!VN4#?S;@OIkx@{=8WLX$AtGy=ne0IV;rG@A) z9+i%pdPm6@@5~1KAo(O#u#0$^S2z9(_GWLLliNfZKNAs8*!!bdncsRlQZ^SMmfVV% zORY}y1+8ci3s|Mn#yPwQekF| zu|nYqZrzJ}=lv4))>d`^f|eLoT_BMD^XnzZ#4oY6)HPV%GBb^i&kH9%`e@x;3 zaW#c6y3+^`4Js+KV(Q4l7;(e(_Fv_l`QH6r!r1<*jdDQxzsvl~ibMEJZ~y=jWB>rt z|EBo)-;rTtXKQO>nwIEKe zhvAzmY$p$;6LJx2WqyBD@0V!NSh&_-fKTq1)RfAib~AcHi_}|c8@Vg^udQsb>q}Ld z9JnL)#ECj=pWmk(tfJ~nJ}6R|4KZ$0s_Qs4qeY@?Uj@%o;vVWr>T(sN$e8h6B+d^Y zGo|ig7RhjGHQuLGd$=t`(m7bo21`}Kzw1@y9MJ9YT0C4{-5dVpAB{|54cV*0iV;QC z3#bFds&tp&jG8cSYML;&U<7XSCmYAnUH7%J(v3_Z7xU*kxLfo49%0}%|JY*28G_mh z6{3R+5lV)TR?%ncNI<2&i(X1qdmDq!Se~k@?qz#`_N`Bz+E_O{(9TIyv_HDnJANpQ z%XtJnJ<@wMOTN#?%>(R!abaE$M5)EGy?CD)^^H6(5b+`)p>H><20ge68{S7wN~J^l z*Mv^m{?J3LP$%$l)Wv;&&{E(a6Qjyxjf zLz9(wwwh`3DWsL<=TBT$H0*l84lrcfvR`u)#c)e23vx=acc?M~n2-L2cOz(4V?J(4 z{g4MxB9AY`fA|Jjv2^;f5gII&!*&%{fq)M$s8Kw0Tk(^_MwKpD-7j^%fz`tx4E_pY zVsH;iL&s`SFNm_|4*s@0D5VTQXwYue70-kHDk=G>qz08# z_kkpXTcI3l2MIZ7>Pmttf1r9V<((mCB*6UlP^9Z80D<$0vLsGuD}73lMFb=%OYQDHr8G5N{3Z>Zff&52^#Dqu z_%O$dqff&DGstbX5m3pAM$;w9OyMDU-~0ZjbU(2AM&pc zEC^#mg3Ug!;J$pFd~h|Rzw0>SV!Cr!xzIYn0Rv6hhcBok9=Txl+VA&{QS0^M>r*`= z{0F)kL_1`uH1|NkRuO2&K$)Ocs0*3Iz9ZB2b42p7qJqP$ub1^;m9VAp>2R#EtH6o< zzz8}#K?%ADnsm|XPXcaEaR{=~BShwi=St+Q*R3L5;b;4FTA{>wDLT49&S94Dcl8Y< zExuw#%@hMxKJ4b(b34EAx+BE*6g&#mHzpZ)M%KISv#dWy-4~RK)V>LD84E|g_(l^3 zqx)$F+~yns>2NJwr3sTfCkzzNd1@nBkcT5}LaZAl4DqlSU(s*=xS%yjm!w`+yy#3hmmqdVn&fQTgzig;<+xD!*i2@_T_LYFV;P60>juYC;sx56?vwJ=JiU z)1qmQ7Y38)hle`GJP|F$9T|m}Qd8r`j*_gu%ZKeE7tjiLi_5?@E8e0v@DSLW>acm| z$Z2XY^?r-#&JHw|q79I&Dj{c&F<7?b3AO8DNwOHzPDH6Dy~WC$MR`O`x_1P4vViGl z#`W_3e4X9*_}<*Uss+C_sI>2EW_e!NFfT2YXAB__d+y^2Wf1n+4q-Qik;WFj|0lnM z!`r}AQ7CtI5*Ufi=2}QdTaXybLiq+~go??fVloh-c>>G;s!JV8jMw>Te<#k>TqUkF zMkYyiq<6t6l$NyFUdm2K8kLu1#3JnbuZqYUJ8uFza-$fY~cfHC`dWr?$cTxHyGf3X!;V$kA!Q6L4nOVdny>U z6q0tzDOW}gg5zF)ma)A@yA%1H;f5OPrJc2QtD#xIawZaI}H zi0O&a(MjJrQ=B`4EcYr?ZM3<2;v=ln1L~Zvb$0k`@rKPOc}5$8H5M)(8?FS$Hl0Se zyYmiaHSB6@lYS;!+_1j3@|2&v@bk2Pi9tg#z{)|jbQwDHlpy+X8%OE^?#a@TiqpWy zU;PYg%1LT~KHZOPqn_PT#G+!IwqER9#cdXTeMj@!45yIdHR>2c8aR?r@IIo109KEh z;t9QgPf^G$f(-TKHMmK&rM!UG=~_?A)zznaBy@{9fvIIRCgC;swdMn5g>_4}*XQS( z^yuml4~m2L@IxdDj_xVV+HnB^et;}7&jadaud)W(qe373L48DRHh2EQTnjoPCH^=f z3+3mNf2sRn{mxjh5q+9Oh+ke3&JI}ZF>oluu?8MQg_+5YV)N_?*;FzRX=R@w6R!L1 z#-Ik9qSkJwhsViky^4nSW9&*h%VlhA`sL^KdK>=7s0cT8Z#tu9&r1piZAUs39Bv}t zD|%7R`j6XLo`jH)rFT3Gqwi2em<>T8F~tCq97+J^ha}#tsa?X*5A1(R8&I>_;JUw( zo5-)c@jEgFU~gehr{`*7Yi#F8=i+E>ZDGhn_rJ5dz2omv(%;1Hqbw7bMUT+^KqdNE zCoHJ#sYOv*wyj#xP`UjWje`+LVz^i@!TQr-jALi}lFngq>V7a;>+iW@a`?wOTZA`Z}(>ke>C#i!E}2_ zKw&DYv5GqkTF|NO#ebeN{sb(>N~qSQ6QejKQO ze3r+l7H3X13L3Px{{}4fRTx523nN;Y3xOyoTgD!RtS%Eie%c6KY=`=#7*QO!hL4Hy zJ|`frkSRS_vIi8A9~jERd&cJXIi7zeoZne{gTLsEye!vpX994Nq&Qah-Q_K=;3a4V zb5;X)y{M@=?0N4^oR8L}ZpfSrVqMu3DZeeyaAACuBno_gPoN(wjfwu{%x&~Fe0cRx zxBbmI*>vHm#eiVyYQjTn^w+7s%>+)04=K8ZE6n_ZYVQUJS(W88wYk_Ts&4;!qbFZb z7oe1xYAd{;u?VS#6a+!mA~r-7kEBh zdzVwa$@~jpULh$@D%*<@s}Japh$9z=?fQ(MuC%c8KVl#6k$qj92H6443BqTN;v6&= zOy)n8B~ce1k%W<2Kh%Bj2gn>`KY;%koU*{rd7r;QdH>s({Exxu;9}zPU-Fub{Iui{ zJwne31=#ZfD5PdrTb-I56}cCJTnTfM3H@|&j_7bHn?z?*Spfg*H{?^mC?uyVTxY~u zl%nh5pC&k)mmOVsf76(`RXa&C>6g#?$k1@a6vC{d_qS?Za&a?ox(t90sCoY*h6orS z&8!a4wZTP9-Er)16j-wrnCJ}yWdIRU=*G8~nl!4@Ri?J0fFcOcSD-vb zqbCBod%L?$Suh*5VskC@xn&4Ux|%3YREfDKpAj2&Yy&7VuJRbu8}Ki}A%EWiMFeAK zQV)60HLL%Q^=NjhjqKZvm_*9q!JMw|!x86-^iSKJtloVb?O)xyxeg4l+3mQKy`peN zUJRcNH}G}|a7Hhg#e@CwP4Q}y1*%xG8f_vWk2;BzvK0eyN%-p7IW)C)2S-Qi%bO3A zdJ?34bLS3tcwLeq1WQAZaxF0%<6Al*2B$rC zE$PX{O`$f)re*NVZtbhLYLFwW5z#$|w9{0IB$`OOj6p-YR>>L3923K@hX?fe%DU3}$u4xJ6oM$g!u&)c znZy%+>XFN2*^9aM;<#`%i@OZ93`d~)R^cMmKMFWg8wlP%%OGTC&wMav0$-c?#F3bS ziG4<+MY`?gslg^nzHECO|?$ zf0K74#H8^iyuAR{-CoNlz=6P+my$~jghRND^V~gQyyYhH*ISod*mGxM;>MT}keTl| zmjE>dzLNzoacw4j%bHs*aXoRo*7nG(L2)QYW)OP^C^1WGCIp|2T4SPD4`e5dkxKr_ z4ldZ5_Tpz_tBh9ms<`LZ#Z_LFSn&Lbyh-%jDkk#DkIL8kN+FQ}FB2*Qd|_X=UwXh< z4Ra@ww=IaqCmXTS9{vl12M&zN1!o3}3e=T@tdv>_u1_2iny3{G6O%NjYhL?&eUYI-VZ=!VR$zI3y76 z>EeT~ImW0RD?V~q$6xspM5wmJ8_q{~U9T2l+iY_1K-D@RyS^Or!9eb)NvNPg$%;M4 zOtX#Q_EEE`k8z!8DHfvDahChrMSvr*Z`wyQ)x@X3Qi)E>Hg2O4XIzrjRTS-+)-%2O z6YZp~27&La%(-JJzT@$Uj10(?DM<%Ej%fgGI1+4vsQuNpN^qjF&vBIkC+XIhWG)6W z2=KzTnJ`aAqgP)L_e9@t!-&%$y)MvIp#oUZY8UVy^vT0bkT`Zms=>aU&jLzZWXqKH zzXqOryCIhi^)FlmleZbP9Ont)-v)G|5W7+@$||*SEm_KeRhX6DNB+Tc`iZl+~&-b_c8o-5+WQJ3`id z3W3KBE{G^+wk_iXoB3I^P$(fnQbbWP!k!Wnx<#jcH`s}ZCS+rU{4Vt*j=ZnO)7Ysi z%!c*kTDzK>)WMc3Bc23lGfUN_BHnm0k~?BC$}Yctf)^b*ZZ=oTnwoxM z?SyF@Pb^kbp`KY2A5Vm}s1`W=A*-4+Vnqr9CGxfk_Z1Gx(o^@fXWqoO(W3{qA2o%a z;}JF@J%m)n>gBK&3Kf~MR!_n}q+=Mi!jB0tf!jD?X|T1TexKaRk6Uxt2~N>f@Yvt( zotxM_5f~>%EY6+IGoFrcv1uv@uIUIGXNGhoLBAGM!!!i`X`$Nfzan2*@-;Hv8yiO1=klqI!hESOIN?&|`V1G`L91F%(#* zL}Z19edvu>_p4?0xK}t%V|p`Zes7LfDVN=uX|y`b8h>V`PG+X_f_gN-#x6E8i%NLo z$RRK8MOW!57X+bQtO+K)p2wQ|p+3X8>#Y)Ap`>iZt0Q&vHG9a;q}b@(fN&YVH@-co z*_pt3EpTjLy#dx2BNXVg6Q<%Q11%v?q|pjm7U(f|*~W-`0Pc<1IXJB8ZB1%eUq#RN z3UML?%q()Bg&1YC8mqKlTml!$HnoJJX~QIwdeJg`L~dOt$&4nT$xJV}EcMyVU6T)} z0=6RoQQ(}G@Wg@$+EOf~W~C*pX#$7INuoo-uG`Br&LkklfY3l|wp6Nw)8y<|pn$GH zqY2D99)$@8;^(uN=Qlklo-CnyuAJ>6)Si6@Cs@FDx`;8mi!tT<=IAtJM4$qF`h3f= z&diC%JR-wa=E^TxfD}R`UJsG5#e*!qWJE7+xT9$jLczHPWOr_i?Tcjfd)lGHXyH<{ zkr$`YUvCytbHgQ19LnHn~1c>tx)Y@Q`- zro~IU;-;5d3gIKO0fnd2!X_!-?**YnmQc7F*Z^y5w1(cQ$R`qkA`A(!RypSa_ryBy zg&GXHA}$Drg;gc>wU0Bq>Q@20Z1mL;k)W99MbmE2rG1JV+0b0sd-@V)h9z%(URsxU zFVi+|F`G$kp`@ZrH$!@BioS^y8wb4e<#noffI0WL1C)`$w51iAq%!MRjG-%UqtIOJExHu|sw^cDlF8YKseV8BcHhCnP7h~GD+h48_> zqW9u??-StiIT^rI6(`xdv>pDDm8D`Ijg>E>NZPG1saB6Hdmmi; zj88CQ3f9Pu^fGvLdcqpMEZh{EH|kXR$gIGk;~+alF!vc?;1cmJbb!-QWcUB zGG^d01rROv1N5Iav>qzm3lus40HNytqmgkmad!N#F8hev%4t(Harcet@2M1|G$$VDl{TqKgPNaGe06e@x-V+a0X*HY2GIQ zke)ESCmyMQkC@VVtIJK~_lDxIY3n-Kq?Kyix(;vWGTwgEmHYkYPc37WII5>T9j%?( zz`>-iR=U^v4B9aaKDFS=M#v(ax2bBidkN?QCY5=2Z z)aYEe&xO!Ev53`>ljwdSn84YhFp=hTy8!X|o@;mg>GJOnHDhjlGVqT!!>gBuzcxSH z7aEVIoL(+2h+psLj;uaD9!$`w78KxnVhlFn@BzLu#-3_~UvcIGb#orxd+W_5de-d#KiO4|WXH8cRJp2Og#pg9QUF4O`7Ebvar z^us&GF!Z-Td&$aHL$uZJq2SKY5naaq9WHs)%f6Xp8X|6IQu zOtS7XjQl{x|N7oAdOAJd_$3e0AjnB`qTesx*MMp*jCdY6m57!60DpYpB2)%Rh9-IX zfoV}jt5u3)!v)j>f-O+yqX*EV5tqDw@pgksF>8^vx(G-?f_|0WITBrxpaI{ta?$G{ zewp+KaO+E%c+>eyLJMP1J=uyZ6*c$IBy$J=BVPqX|H;?Ito3*YsJlq4J+y`(2Rx8> z4Uhq|f_Tmkj!<1#66mBe<)RP!b?%&&Vs<2C(1z-CyWd90++RLK`GKyqzRxK*|6Aco ze@w&gg>1%vm4mb({N1{)lHN3j7Z$S60~70;I};mv385F8$9M8_hekbSpJA7W2Rj5+ z3k3%LsUE8jxOUC2s-IgZuG&SsxI6;iOB4!>KD^8KBadiGIOfQR1+yWMlYB=As!8`} z4Gseoe$@M$QC5mKk8hh2B3~P@9gIY&)Ix8lGlyNqXn*qicrEPA zrMGNy_W_{~_T9>_eQ=AT##J+#o zNbQOT`gZFb@Emx014x9+)T-55J71qwoFUy>c?eKNL>a&W%Ck3i!|FI|Ik7OiubW38 z63CLMq63dGu+)RM8Qr_In?P*Ddgc0Mb%K5IIQ^l&FOU62WFvY}62T|OFdyCR>UKi5B4KgHz;lPK;1|e36!9sHpR6Phnm^-wF8S!Mu#e=zM%5GUh zVl(dG5(9yUQyj-a51klquo3?3qIuOxTqThYW7R9-pOQ{cO_!dd0&-MQ1c9-D#*ue{ z3~fJ2Etqvd%Kdg?CnP;{9N*v=LgzM;B1jID;CHvD2LuUQ3!FPa04g+`7@`16bq9wQ zTag*+Se@xl?Gn@R$N6(HbAp9INC75!WE}OYhvxG)zooi@Kvq=w?vtAYbSP_;a^Od! znf2(3UASu;g~-sa4+uj$%)_xP2C8|@Fdea`rm9nMWJC3py3g4M+Q1#wU7_h7Q`j7# zse?v@(c{VEUCcLKc7X|0?N#-~d;1IF^MLnbm`uFExlNcY$X)OAHP&j_PxOTL=0$tR zIm(`O%wDGFkmE(h{;B>8qd-b%OIr{>R&)zO0ayI%Yh%rk8`hND-pne7(t{U5G?!m= zoBZty?KepOnGZ>+2E-(($9-U)2lP_v;cE2;+*hvANn8g6p+j9rZsa5(55>TM)kfU_ zpq9dN8UO30G^pSMhq}5+o5XmGWQ2J80o!JZ>S;snitxv}H7mt1aM<{i{5huiZx$t7 z_?$J}^$j5P-09qXNy3nAUxV}kP^@{jf+vL?Q%fI5%NC^Iswy5(*wkxgFu&2$2nnF% zcv4KP?nyhEdAzc`C`N@BtZ6`W;n`WC6eMj6B1bhtCgFLM{EH}Oz(r(aX7XwUEq#6Y z3ngh9RvY{&qo@byb%%Zfu~r}kST`#?Bzui|BsoYfI#rk$O-UMEnhRi32;n6$Sm0yd zd>u1lzhXZi8ylP5reZ#=>7MxSMpNHH*dwm#TnRK(Zjo&ffV0==;*`_aiP?ETQu-1= zj+0AI&d%?+)5{}kPu%UP8Pglv!iUPJvuPYRyyz0RZsMjiZKJbn5-BC%4HQN7$>kK) zA^(P|*rRaAQToiiM(Y&)DMSn|*KGX$tdUAED+I0ras+!3wVwOx8F^4-P}|uNX%ey& z1>tA-L3_OMc3PL!9BQCT-vfUU6T|kK4-DPW;)~fu%x|xc*l!(aJvlQa?+#C{&aU?( zFg&wWvy;Vda4c?f>c!>zZ_O+-`QUj@*A0!U4?DR&jnC)DFoF-;$9*9uODm#njZTgM zqLqGaA*$_}hfkw{1Zp#u_+D{eB2&?e^fx?PrCiMn+kn$~$QiQc?7IipF)DTXfs zn6kG3ZD4&v0|jU0vyqvtO_ReN)rz8Qb61HDytlHlmI4Z>l-lM&US-75O;s*xyMZtH zu+&k|&RM%!9C4QM2~Ljwt+-(yR)h_``456Qi|4vp+V zraY;f!?m+O&|L%CP&DxOI9Adb@6qRQ*zI?4#;i2PnyFKwi>;1QaHbp)^9M6(z_vFY zv|c%q4;1nKy&sLDSg$)fp0{+YeNZ!4*r!Z8(7-IsaLd$@Cvjc~R8e%qslHf)kGLcA zrOuEo>;deRN(bLMXB9sNi@qJQDv^5#E-cx^Q#ufu9Pe2m%LijY3$-|^r9Z*M`oYo=oqR68{28nne4L8dS@jHB;hw|1WV$Z-4oqv-_g z9_frF@U-h248YO9Kw|>oyI~_(XoLVWezcaKa2|Zi zABBtNNx1XjM+14i#(Pl(1;AVrC$4ktwg`zakd38sOzt+o%PSad)b~0)IB1nvKBq6; z6r=Qr;@WmK$WBjMVclR9)NJ3vJV|Nh) zLNG~PNmpNU%9L9nHJ2&?g{eQ`rMLo>n8Icigg6$f#Dz?H_L=i3gn0x}ObpolU?HL-wV%~v3eCv^@g`Yq=TX1{bgVnJe ze0-@yE+(rJQs6`Jr*6f;fXXx=jWqtke|@)_*UBB^L+*tR*JRS?2g#n6LW z?b$1uNL7A=kDiMg$m>%OHtPhNs&7q1!X%nW<(|VpB7(zeB!D!*>-;NrVGffGdj8?B zj()PLBd{oHI$xKcFQLSv9Vhv)X+MnqWHZM%+sGBqu@xVKBxCff(jWVS`u$vO(_m^v zAGmA^19&?`Sh7G*NWeb4KA%=6<$|>cx1YQ6eh&bO$CPtH|A>h`=3c+DaGE*LABYt@q+vg^V`B$1GD zvkl=5yG8R~7tg;&e-g6pj@L*v{<$lw>RX=5T4f~TYxWt|!vI?7YuZuw1b&INYh3S> z+(NGOr5v2hp3TUn-$F^Z?LWW$-S|5j^>qKSh+bq?QswQ5m>as=aZgyR7?FSav+9?s z*NcbybGwJ_{#xq0dia`PL7tBd#nqX2y@Ik_h%LDxP7F%A&#D9w91?;IDSTmfh5wYu z!(QDGYg&97?es!^I$28-;1&;+f7ol-Yj*#_=RNmuFw*4%5E5U%IHH+b&!q7DWa}F1 z-;f=c-doUC5(rHXn&e_A(lI?&DLudg+l$ATC7*aP1Y}%a0R|lnb}a|pB|IFwVtrUk zl8{4 z2ex6IZT_!dCK{t5Jo;4_7_J03NbO%>4`?ah?LL*MbDBngd&03TA#`CK#dbE)Ur2#< zi$^jMy*PxP?n6TnV zf}y%TP%jsfb@4!ICJ>uLsn1&#=#Vyqo`(DOLsG;mpcdR5iT63N^Y5cY(QsXv>!{vQ*d`rB2 zsZ=w6rsBvb)3yA~qj}IY=21;)OcY#hOp&TFC6Dx9z zan-?MyjHG{E(5|Eolh+6>e~1XX>~it^6XykjU>jAFhd(I2&a9a?W~5+aaZcAUSrLu z28?Z2 ztg2g%?0PxO?wDLqHJH8fl=U(9Gwzq8Y>=uHyN5&x@Tw$a^XTbp6Ss$WrC~|^lcqbI zqcmJrO9|`J*ET^@6|$Z$mwS+;A!PriXh2#r|K5_y>eEg^b8o3;vfVz`U;V|2W0cp9 zBo2$b7#T>8#H!vBOorx;))Dyxt7#(JkeYJgZn$Y|Dx}HEUSgok+z@Fjfw?nBSl9{C zp7KzY_In#)Qoj)IHHB4Yi~7Y`VP6Sg|ItB}cMTrnFuDZQxF{9d<`kbImFH)j(PO+)TekW_vS}93 zfz!Vauh^DJPSTNmz(Uu2LTGAQ zvOAjkN|AknRUssyR_AS2KHm6yKG%~RiWdoXRta8V$Vr>h-78oU5PH@jtMtKps*WE~ zEI1%_gZL>bP%B%sODR6jf=@00@@Hlvw;uYUfmWqNvUXqnzgiXMnHcp5(XIzwd(Xdl z?T}?B`sAW8HaiW5jq1&HzE{_$7qY33;I z?CqTcYHK?VrTtMXDpqIzr^92ECMl=*M1?*%y~-&_zRo4X zyT6=uBT9rY{wG`&7~P}^0+*d_1CHZ|wLM!e3feFCo3XoxJMQo5s@m!_uH~lBk7*-I zUqU{3>vFuxv#qt=OQzk9>@1yLg-BQ-N?%JF*^Xvb2u9pZ8O5=aUpUbUu!9 z9ZwT}JeYM7EO>Q@EahrV=}2JbU&U-3^5Tn{0xo%8w>HO_jf$3q_S6av6^j*eMyCfV ztnIlwHE+IOXE-Mw8vKV9QkF>PFeRXUybrJf6&wePjQWAGVGu)qw3m6cqj`Pmb0UZ? z-NSr?=L^!05zuc{LzFjJwMwb=pWqbI^Hp>{a6>0POslg8`I`%}&3^$eJ9Z@VaDEG+ zvu2gjhe<|v-m20RyHRv`;9xuaIh5*KL&<=!5k%#_vv2{T_`-LRslp!O=;PEw42&^q zlcY(h?74KTBIfrS?<#0qU}>Zd>t$wxvwWUivoqwb5gvU7%LXZ%$jK}trx0rONx>oPEubjl>?PE_qc@u}lF*%Ntc0H1L;vIBVjDm7PJ zjqhnCx-gzU(Ell_|NuGm_i zq@iQXpqZG#8O<1vPODEgO)hblIr2uYlle=>RbhY;xvE}8m0?z5v2{WJifL979OQ9>^F@HAt;hGx;E4kYV@vn1a1n4~kh^loYPe=i zCl}KDUir3)80dX{S|16}%KjsvwB$6JY<@89BWxa**%eP#bZ|DVsC2Y{`*833ZoCI; zi+4)|KJG>CW$F@dInWb!1sQF!2!QuWBb zdq#k=QF(5o;f*v(;nG^?aGVs3L%>Yq{Lk3+^ysYH;OXK&K(LPt<1%u+hLAFM6;z&T zV!(qlLOSDSZBXWQ-sVu1MV@RhY167zE0%wSM^fMRr4r&qg;5gI5~ZX-)E06_D;C<*8R)!=_4}*7nI0)29|#& z7a;Y=MrEQlMP^Y*?VUTMf+Ie^KNSe(Dyxeu3Tq#If-{rD`P&X1s14auZ;3otl_cqZ zJ>CjZT!29rmac^@YJ7lTy0deJ57 zM2EKS&u-55t+h5;J$#IcKf}&$crkbVJl#R!=zII1pNI^%dN}yT2MXZ&M?cq=UZ0Tr zPck~4KiH2HjVuqy6D*&ZaeoY+K;Sxzxg~@H_3!`aICA-h*va68^~o3EH2^BrW&+AP z@h2kW$~?#*23d)4>7CrknwIZnYr}mVR*pKtx~uED#^w((2)U{1=4M-;G{LC7?-^%4 z(9@xkAs5qD;b^1K6^4^CA~q}P)?K64Fo43q0tU(U*L;f%t9bl#b#UmSVRz%uI}CPzw7Wj}SGR*Z)awpa%p2F`VBnPd{7P9PbZKfZaq zra8j8OTwTAwvg)Q)$yC-g$*_7uO&l1k()?DQc@g?5X~}23RSYV=>};-S;TjHl`E23 z>|VO-ZXiUb=(i@omezNP^lnmDd<(V`o`S5>oc5qLpQo+^n8nWzTy4U^vi!Wb7Jkm+ zWe9%~4s|L--DGqQuJ;1BdxuV=V1?jXD~b!6Ym-~B|FUQD6mGxNbsg$EW>jjp%cGWc zwRrCXh76qU5_o*SGX>}~yWL^CzJ_lR<*b>3kB*3Y#p;y9B@0UJ{iygnW5ZV4^CEo7 z^`~`z%}4zBnalaX8ovfP_fO7y5a!o_Zu%mGKYR`bX%Lp+2aZ$mC)Xsma}&1B67n>p1zB6{g)PM^|s?-b}B@o-xHTsH9W zLm1CF{A-?(rZTEFXo}%=t*<}6TKES71~Y(PD01-T=2nzO*aIaBh)^%*@rq^Kr8F$z z)YtBeGp&Ms{Zr#=*V_((zwdRGV8%mmTI4=4NT=e2UI3cla#%+PcZl1bf&7LN5XyNyfmdjb30OW%nDe&sGMM((2xKp59S928wn{3_qB5f zuphTQ9}0=JfO8WD%P4{ybZcQ!*Y%Ueh;XUTSNiJdI;cQi3b3kTbvr!qhH&snHA3TG z9^Z#@PP3qr3frAp2;Qjq6XAIo2?&Xrv2aX)j0y2@)NU?$CvbQ_+aM@;2$N`FOP)VH zaBje!4`7^f;|*_(OoAY>DQLqmtQKVI-Mt`bcz7`p}tM% zJ<0`CF(V??R*fSoc&y+H$sYf0w9RT%ATYOl0s*p?dOfNm<^X-%DnI1)6t@qevKz$4 zSn5CU$<|~xuL*!yp`AAw(pUyr4Wd@r{)EVq#nm>HvPWunnXLjw6K1qqvF$g z@;Ai5jEXY3zf=>!(_$aACggQ)O zf514NYPY%S(_NqrtlG?7Q0Em#a48PvL>2~A~{Mi~YF`?ts`$1N>7yi9v>{!yt@(TdSvyWmBgB)EK zn{EY);e>KEfVT=}*90}I(&_Awmmwb{fSS5x!iauZ4{y0}!Klvd z?A%X`%_Gn<26Sf^li=&~yT`h6pm@cRicYv&2^Qw2r#ujp763CL@zh1wg@+s)DB{sW z8!Dg|T#kNT)=yi_2$z^qy>!mJzi|ZtR*xWhEQ1glC~iGy_r;GlRHL7p{0AISz(#?+ z#x&iHz20dT9%q`O5l_Ed0s z!fB;4_zq5VbEHQj(!K)n$qQr?{yiY`UUBE5cTFOQ<8B(dg^sKZxgAuc(u%Y7T|CxP z0!kzRQ9os4p!WfOGW&7mu}#&P{;z$VJsf+!Lun=&SSJ+3=$kbdLo_jwV$cgI$JV*M zAc-;;YfH32tX@FS*gz?`d+G`oL|X80CqPzVh@1dlq$jFYL7Dz(lHqi{5|ctyzVq&M zu`c)@IHBod+VCy}UyeLO{Tc`w`y%ZeHdrgc#$;yB{YDbReV8xLUZoiDd$4H>ExSJR z#C7ku2w>;VVU;u=wSOF9j4{ogE)RVz*6P6sOt?)E%Dj2O~N5Nj#2F>68ufB6dl=wk-_DB)e@VoTv=hW5bn z<`e`F|B))s+yc8h$_YBUOPEA_cbYWSttTLrcoH%F`R)n#SqCmz}|ALt0K% zWN%CVDs5m#e^d-L3X|+ZKl#q$iVe?3vFm*5V)KZY+&?4()N+uVGs7Zdjn+Q-AO$Lr zQ)Fio21^cDOaV?vVA`&boIr9-N8JjoLXcM1j#5-4cXb~VkbnYIMR*spIyr(x4j)Ca zGX(5{85$Pj-*3)I)IcB{6@APykwS@s+#i!BMa%5Dgg$7AOAuD%$I6Bp*N4_7`{i}JdI~UqqY}8l<;p+}QUANX zKgx83ukk0c;S=qI-kC-l^0S(^k`4X$wG6vmT2I67y#`49W3!`ISqC$+1PRb3v?r}JKA_3_P#Ln*h zTK(Rg#X@rV2ps6j4l$`OIioesVZ5y*Y8Siflrg3vfPtUM%g-V1ojE5AoAamPGGlo2$d)$o5MD>uh(1`(2BGaCaWa^r=2i? zJ$X=1U`~va!PIk9C0J>JBbXk%Zl??Ohd{tZ*e)zP%s8a&dm!`yw`mWdYvRM3@kUrW}mK zdiL)}4FBXuJ5VZU&1Yv0ONeKBt}{@P$d^HJY%L?Umg)TZf?f-ZAaIbQDs|;GR$GVY zE-m6KuZrx(8|(n3Oa$ZD;=gi1oRCvwcl|Vwn)VbgLbPN>R-lE(VMjwhi6Jvl{&qz* z?P)Os8?%KRZkQ^BT8$v*Qslq5SncQk1yI9sBuKoSl%Hc5q-6PwqgoAe`OxX7{jl6y zI|i7sheZO?ejBIt4z^l?y{M`7{Y;Hms7l@S_jA9JK1Vx+@uwc|2Y2PgaT=PJ z+;v69HVs6Ywf81 zaz(bgHmxRg16_S2&V{T`x^T!vh1ddx)Y%23Rs|%VZC&}#FjxgmT=rswXDQo4wpdM8 z|Md#G$Y4ds@-_44r;tblb#__5M=*)lox6mVkrOvRPwgVomm-MYvaIvG1Z}Y;C!#Dn2_#Qd<`2NZYkK@c;_R2Utd(?TW(^lLm@wA9B6Ap*tFe&wVkazk z?YJb&m1_LA#2s=yy*NAoHf-szcKs-@m#R@K)BRyrA`U#b^Nn%t11KlNp$d+OgDc-f zrN}kl=G??nk4Fcqg4~sF&5_>YWPcGy#u4eCYsW#K1RqaN$X(Rcp)+KqPif_Gdab}z zOh%QhFb*Q2qbSJ~_Fh`hwDZknt5m+Ko~Dl_zHqpufIWUhP#QM{EpPXB@;E&g~)5~|d4T2gaD zdhjXZm)eZv#^ycgeEV+{A{jF2kFF+{muxibLdheCEBhvDB-%->GMW6dlIeH&@qKLK zwVPF`1BZ7JEDi)9)7PfU?%3Y@yNX=2k3VwUoCKgHbwoV6=mDcvM(f`PmfAfS=<+Hh z7W&J$2?OiVLBk1-w8utb6sk)IBUD12(?|y#hJuvCxz5C|Plm9{Jta^Rc}LI?O{v=b zE+6hraGnt2r+ErMgu(f`gmes9Opxh_4Y=eVm&Dsx_ZFkh-P7~d|A#$>m)a2q))X}%-C^#WfT*O&fdCR~S)G2ujQMC) z4l28}90NU``pz&3b5n3O&m|fEL%+0Tgs`!Y=k<)3d&ww1C6>0{&d^=CVD4L|0*E39 zlW1})~P{J zwm@M7@$-TN=BtmXK%_BB*QcbHL+(^dmF802;Rn_^BWWph&+uI(jg8%QTly0kJ^Rh$ z-Oz9NxN8+Sv6$LoZnnN&#(8dx|9Aov0QloezmIWI-N9TSeBOgvLRs;PxbyVZX-(X$ zVj$LO%w{UR9pHC@fB|90^|<&M{Dz+mZs#Xy?TUY5^>%k6eJi%%MDOCc$L$U-d-4$r z8#_=dQaM*`n9iFHGiF4I9(X#ZNS5jvzh|gPc=o2B*86?y8O1vF*j&b!0e?QP+oMYU z44k*YmX+D$7IsuH4jG<(lJ>^JEz0NBkzcDHDjM8e$T94hiWv+gk`{Q@@mNCbn;0X8 z*H1I^U49V0bNbHI;!ghX_7?GyP8Ybab9X;Av~;#<1)J@1okg1{)JU@@O)jwd$M2gz ztu94<;Ir|h-dC)lNz$l))7=w?>=l9i@9;(U}P#Z$JLS6GL(rH$bpw4dcL zul$!I{TxWqjM9T1=m{(J4_N2-?Ee&<^EtG2opH*BR}wP;8_PoGSg&0)-(9HlJf!#sx4pUCMpbZdVbo^r|*~)o!()vSe1A z+GLK!-0*3{nkrYOi7W(k)#Sg`271>%)_V)59>?IE%;h5~Dd<$4chgODjMlNZ6jnJv z&<3!Eu{6rjmeub(7HaQC==87nt5#N%Xtl9DdD{E{*OJWXI)<4U091&wg<8GNH|vX@ z6mV=>gFk;}DHKwmhPFmPYfpFQ?gtd6p{1?Ep<=SC+H^h6ki3o0?s>vDM`C2`q5~7x zh}V>0#kz#3Em;%gxfgw`Lu)1W*Y~^HLV5}Js>dzx&5{Fi#W6*sg`xaa5UAX)z^NXgWKn zbozZ$*2{`-+ft>)A7|_LUddiUVw0WHxqpZ+#<@y#$x1;3(={zN1Bdd-fpC&-dP1@^H005UN6fm^uR~ z!Q3{Xgn17@9)ogp5nl`(5{?4oW=a=t1we=O&@{p_2!x%aOHkHEJy%$AmdXUJFJ8a7HsV_G@O=AQN4)ZPm8$$04vrYB|9A+Lg(HqHeks< zZcoHlNcB{h6mLPszbu|Jil-IWaNe7eXs*$9O`zk-(@Y2@ad-C?5X|ot-}?58qj8&JORf!9xX`Udv>3 zkd+GL_K`d~_GRRM2qDd?(J1wzJMG01X3+`}JBBFIwb|}iC2>>?X{+SXfw|t`kX`nW zckIk^sK9=T(631t*nUTKEZywVqB_nnMzob@Co8k*3AkPBREb_U2x$jv4-47DFV5HN z9Aw6Yb)e)0xU zCIp=9j`2nyYm=uso_eAUh&mzW&wa6))Mr0!8;*&fps=nV6_hXZ+I7)u<$0NK-K>b1 zESwaknw|c(J2j*<bJ%J3RJU=GPet!hxaEIoA&WUTV5s>R(en6LuCDG`D*X6UR9!7ZwgsjoU!etb= zs(f}7-^6~5FqYe2}SbravtH#(hsIg{1wj$GkOm1Llz zU)f3racg>t-qoMcmFW!P8Cr7{`bg5M#s1OxTbeq-zLhB#52z2t)?2dfE(qmluKTBG z$x)|)v0csn;0E zn_#?fpMJh38M0J!^%M_9YuG{zvXwQH@N1b#`ug=WXPyvHG|PQ5V;dUDoebKxYU0Jk zwBotf6ypo6PwP16@jAHp!RB|jB+bljZ-%yRH%Cu5yZ6A$_uzU%Z!fQp$BP9UPWVEP z;}>4^QBG>~w!l?xvQ;U>Oyz^u+RIP&Y#@pp04KHVEA{k&K0b8OoDy5C&2V9<4*fH# z{aGYG{>$G?5B`)1GW!k4S2&Q1O@Afu9@v9Hrmk{uZb3z)_qg!KNcv>0yEPIIC%qb< zIdPPTzfR6V@1mO~&V7TAndmi#GoK%B;>_TqX8k8}70IG{xf>DIT`LT-IBlTDy5FSd z<{b4Cci^Pq9^sH-TygM1tHWi=EJ4pAuYCb}aS(%y*Q0&6c*0dh^z%ZJP%VVck*Pqd z6s!wYt&G9->SF@UF4`E2m6hwbMx$4C$IHQM0N(OEm7v$(n#K*)1vwIpF_s${5IAV7 zPP8{N4uf64doO}0S%~Q8R^Wy1&7P1H1%APX9X<6|77PdAxe{W}lYF{XFT{F4WcytNbUQ1wk{yUoTc7@+E1=+W(LC=4FH5B31;k7l4B!GTYPQ%h-D zL83JQmN1PP`<8D&GS7OPAQn_&*_Dv^^~P_ytzLxr>*Mpds$$tr1jDy**ell-+wP+e zu-8LAtjm#>yLd|tl+Xrp);zLgm|g8#4ua@iNx72my`1Ork;B*1-@WT7hEUj7U#wTu zWgBa`Os{ax1-v{T&nLuZom#+?gNM=mlG!~gnENvR%kcYPF_Vy=zEocX&2z$=#b2=h zE-+|Bcy0atN4vYl1OWKoGRXgnoAFOz;OuB%`_EAA_@D5M84Vk|qjtof8@+)Kd-blr zOD1h$h3wS^teTHHv=?hWD9p ziDdJIcU0`lR(xgT9S9Urhsc#&~Z;9&IS$zpU02MhK8jNH1Ur`R6Gm z`caTNiXk1i(YonoAiT0KC<$Ui7kF2^V53QI6Q%!GXB{UqDX!O3wQjN_X6TKMz^t(| zi0K8k&0hU{(|E_?1ejpg%@+$uJ!DzUQA&&7&rZfMDM*!E*C!33Q~9l8KL=#t0_0yQ z`gdI{$|jH%H1B`Qp!S?J1SgH?{nM7)pbEX{2>W?^WF6oeXmoP(gj))==LAV-)DNww zrghW3p)tzbNly8!NKBI>@&jjJ_pFC0(L8PbLMuTBVv8roiSjpwAh}f9Y@cCPs*fLS z8oFRfrdOk(kIWTQI)`*S8IS*vQ`*F)vAHE#NS0Z(Eqpsu805u{FF(FTFIX|!bxv(m z&^$lf{=BHxto}yqA@!J6yy?tkf7>Py_VgOQ4)VKHpo{t+lN`5cZqWQvH!4d~MkxL* zS?!V_c57Yqm`WN(NhWOPAv+`oh_-K00Lhf+Qv&(u|8&7+m^Trrs7V)ov(kVn(F1^2 zodYr$hEiyQLK|54x*qAeHM7>JTN{*ThTlIqMrH;E1h5)P(MS7)d+9vJ;_3^xFQ8o% zda2^*62FY7Bk?;lp{b2tFl8JK{wbs9tk?fjDjHoQEHFkcW!>!j?EWFSFee-ewC^0h zb;)dG>ES#W`t@_7jITh*vyV%M7{iK8_vfXZN$r3Pdv@U^X_RfIfV?4u<4I_eAUYP89x`K6x5=QO*OA>tah_N5$H}%*f}>f2&W zB`wXM1XBXcM!rlPLy8H~O^J$4s`H83utL%P3#mbSZel>|0^U&Bk3u$KV>Qw!d#ym= zIf($6$h)ww*ZCrxUr06(ROp>hYPg?f;q>a8IqPa;?&mgcz0+YrsV#q_24;d z-@f@DWig-{PIu^=b%zsFs#w3PfyI>Lvs+3=7J{OeE;f|Web4Um=Vo|cgGZ$}|bB|k*AH|&5L7o0F z+2v1@#g1Q*<4!2*>q=%SF>HIYACkB57k=UB~cO?d`< zPwj~rjqVAw7X~0w;}c&>T+jXfkH($01^SqkO26RT%xLM6srx;@UAbLvm(e)z_Y@Au zbm9zG?CoY6Q~8R8>r`SJkCsjvRVRw1<>w*=Ie47;K97uQbGEQ_h2}tGbxtDqj!!2* zO13+WQneb#({u$pWIqh61kdNw!C#Rd`{#o(j7tu8&vp%MnXdY`_eha$^HF5*AVNUF zoAS5m^ij3vRNO!W4Z6%c5#hhp3|jMs$q4-UY*`9N@_kZer;<^jdZhs_oEO7W%}*2N+SiMubvzhz50n%`$@x0%O2xqGlZgE*Hjrh5P&q#wm* zUCu?n0RO#-_(n}A0LNm0+Ebc1_A)-x7l)B!Gk!v4@5vFuqbS+&GB24HX_!kZURmat0 z6gASx=0k=GP3l&20dquEbFmv9^6le#nv2zeY-WabWlN<_vf5n-yHxo_enqvC75%KK zZ0(}2WwfbTo30?unnK-yIBnfw5c3eVk$ZWYVJkwhws^zHk3sHiW_3Kh;95qf+vD;1 zueU~})BSn68p`S#*}2Tq>;1M*Ylxwb#S(j)ww-gjuRy6us9eY$&(XQx1>mFWl64`U zV=5IfGA6Qgox9ZK9)4n;s|PiI)`2zT^a_tOd43ZHHhDvfoa(4dr8U#dXawONIFfN}kHJx*o~eAo@Fk5j6My z-r+SXxl(;nddp5p!dJ9*lVeI^w;o9iU0IGkJ`t3$RvDyMqv&GbcEW*BHOy9p8Lf;` z&68eZdByeSZnFcHx_<`d-ucbiH=$1E?((VQ%k+AQNL&AggMG(j_a>?yVQ^IQ$wz%1 zY&%d`j=i1YcG#wC&eY}k{BT2Qr1n~(iYuwtxnZxw++X-WoOc1 za-r*-QyomIG>UX&m+bMwUeFiXG+lMEN_FAJ_V^AtB_4xLuxtTnZpRwE)?$+6=1mrT z#$4#u@g>4y*x`-67o(ZoiiYF}HdOZ;ivgw)hK$%HUW*Ut?>2NfmM`<{j1OjizZ@+)%rHR%Def)yd3>vwN-hfg=#8x%3i4TQ75_61hG+fKV;kC2> z$S<)S6t}rvuV@P0d*J3SLm0F@Ipj_jnx4S$Kw?ZE?=?(%ENMp&3YbNJ%HiP--Jq)M zQBUr)5Z3Q+>Qo2iWFDf#NJ(vUsp%j@eb6|JDqFaY8F>9h)^X_;eX9(Q`R_{&WLWc8 z)fX)~aXZbGz+=Y3fMoNJTl_(DTwg7?IOw{WQuIf^x|Y>+CL3=(^!$ykaj5n()AE_O zkKIdXXjP)J&j;2z+>(Lq1L{ejkjJ0o^YDV8^RqACwROA{>bPKCEBW^ANo{HW8JbC2 zxveVm^L*G@;?wO*sJi4oDfIm~KF>>w;*J+e(W*d5*gr-ZbRvp@(9VYf2lX5|AI{#D zg~vo8czs^ghHOGB95~w7u{-|O2Y6rwZAjU&?s7$NBOq)~X?dmqF7w62;JiN-(_o92 ztoiCQ*%^*B&R!x7Mu5xELmAmWiYJG+o{=iz%p!dAl+msK!y8;|DpJ+{0g|!~N&ZP# zX1%U=d$S8#C9-f#wtfcWF}j<;SuRDg)(2S(z3vcCI3^fkiT}eF1jg=qau*HbEm|zJI$u+=| zyed@cAnUy7fV2WK=N79d7;k5th@Ne+kJa+4v8CmjL)i08A^6W=b2SSGWc;2J_-vau zi?k)^dedHVaA*Vj5zX;bYR0}&wjW*3FT`R@{NPf13)z{xiMbVgqRW8Uh`D9;y z0jS&nWKnW}2VP^rjm+Ga1j{U!?Ac>#1W>af@QkxXu16I_ z-7)4^H%v)8p@so!LT?&1bomug$$MzH#J_;9QJOiWZfD`pntn?&?xrC+XvLLaFrY zq$|8yzV<$-2G(}Nc1J>Ge(C*wKBaA5v)%UijtIH9Ir065%6jBC##MutyDd>?K=sYX zse-ke5&lhptPWcMnjK15kRz3+cOl=W=PE1qHd6V}n3dNg#R|OzAr>D@-QnF}j!!^` zs?mtAaJEdPIP%t!!o=;?GXpvfAls#`@7)W2rixOi+Wpo3S4Tv}4_d&1#0p}edBmsP19Bg;yT)O z&G1(EGEri|bXjXzV0`LRiefzaL1^q|e%fVBOfMc3@sO2Ho>irm2^2zZ-w^-Gh8veF zYho~?M3T}#4DlwtdxjZjD452?=@E^kTVXP(vH;9<{uI{q6M|iXQB}y_Uxb{(&8XwC z$?3lY)ceu-#qp}<9@Z^)IQB+!!QZ^Re*oRQ->vx)^lNwP6;rLVHN2Skt3OP3o1 z5SEe+Pw(0qonnpIC|MV+FzLm2>D3QmFCe@W3W?j>kiBfyYr~>ld3R%`vdT|kp=8$J z8WxV3Mqtg~4pMheiiU7eL)AS^yTt#N$?N+|D>$8q2!W$R3!_YrU)dH98u4+pypMmc z&j4dKXx{H-y97BXv1qsd1oOQAGCZzJkv)RDE8^+O%n<@})6CpDhwC9C8E3iE~%AJw{OO<*x?udp`_-eNI59t|bTJup7O|t)b<0vN4 zS6XV`9fadjdc=x#5+={_iLfrg*!<)tGZv~-)lV2yM@RC4>Tey#KUqu5*_|sG92p#AA_4Zvu3Z1b;Ft1VJ`n*Ch|_1qF3K%V794^ z@q|T~rzY6!JUfr;w8r_MNd@lvw?-^XPhPtR7gFJJ>%^OiqE1W!76IHsnV%ZglhHS!ev4NhtaGlVyr`mNNHO^vs(PA&zP zh}Vn&Swl7+(#>{I`bU2bU5{k;bSyM?ohcm-li=50q2qH961w+cA>CBE@RUXq&T>kz zT|h<#qqkpKl{#rCRmt{!F~Q!6moIHXj8}@X4)Um7LMt}$7sc`F%N&!w0h(-8BHs;!liTGf5SP0&0^1!^rIyPgNGO?1 z6w&|&3&tXDbeg^o*ETTr9*_ew(+5GKV=+0qUyOv!5_bs3YPsBbr^VIN%lmp*D>*-D zKj)bM=dAP;NZjn``mPYE#+))cu#3SD{fcx+JCl;_M@}mChSiDNPB3==w(89jaFVjO zvSjxVmQi^f0WIo;4-c6nZFdVyYboDvlF2uw$8%HuS3>W-Q6K&ybD9@&xaR?GFvL|_ z+aIG5S$#IulnmGhvs{V!Z99*8pw_(Gdh$eHWH}uysoVYvb`k(0=f?SzqOaZH381{C18Xle+CnRaMvJ1_s%E za>ot(+(U2|Ep%xU`$RgM^b!4BJC$#nrX%-34TE9yA^mX?b$F3-f$(nfrv@*yhgAPM zs~`Hk2Iv_vt_QpQ4GG09i9|N}dIsCa)y_Q-BP_0F4L76?-Be=ob(0klj?7y!7LKXA z2kXGCM7HT$4Eob`#66!=?)1Guw!51WuE}Wril)KuK6UIM$LFC4#*`uI$iy;qP+c}) zQL+zYBjh9D%g@8Zc6WXHz8NrKH(byGD|8_PxIyg)84%~JfC^Guf4nD*ZtkI#9WX2WAAH$8=w*cthWrZ|1AnG#2*oEm@;~@(-4BFG3u)C+gs#!NB#lYu!K2PD?!M0cx9B zmvYR70=wA#`#{S9O@^E74{Ak3qwPK}o?oX|_yXU?FRf0AA3%Ay(IP{n83|K zO*;p3->x#O8#~5e#`IBz9D@TFYYU}SFVy#5dh0UZCM8R5QWco7@td}!7aS;=-7cBy z(8>u?0`fZ^vy)c`fWC7`Kj>IpI5EGkOP*W`!Kcz~*ci7o2dyu|(tWnhtbO!G?W+>Ug>D-e*Q%q|2{8Z#d`DhW`X?v zV9OS{znCSOzJI5My|2a0)LiH6^yumSSaz{p{@Ua}Z!ATJ4y>l%o3H=I290<7>Q_mp z1J`3+0dgZP#eVe*>eGkd&B=P*+$V^dx>&tBtOy!~f}k0L7Y`f-j$$UV zXC9N#tXm99T}qM5#xEM(OCe+Pl#jYA99Bx_kl3zQV%M?V!hik);&CG*edobr<}!tw z*XnkO^&}m^|A8CT`}t^Vwdhg5{2Jp0qr)G*Ki_HsDkWVf(jtC>sNH1fZPO3EmFlJ> z2=)kJ&_@IK^p?l*4{El3lj&I~ri@XP}H0xJ~Rx7LWA zPbZMxN=Osv&m?(=0QO}hgv=vBFcsB6*r~Wf6VlGoDM2vvqzG<@1iuU4@iLGV7oNiS zyD;97V?cciG^Ul+6H5>rny)-Etb5!93EJFW4bc`s&OhUjE)I)mcUaPWOfpVo~-+FuXNZ z--SI~ZD;^tqK7`HZR9XsMW6`QNMD+WXro>W=NrhdK#(HhAj)^e{Fq2RqC6DrQz$^y zYQEED4ty6TD@Ds6kHm1SE|Plts*;L48n5FIwBprqXaRQ~2$@wG1l4?%shMI)k^^Va zAQX8SU&~3XDP~@*L|%Z8zjn1k9TA|yN~ek-u|LbIgd5vZF|^nhV#5_2d>@tecFviJ zdgnKU57XE&eyGp3*xF3+*Xn2$S~NRkzzl9{cFNiX^CR z7I8mShW1bcJr48KWwMFR;UOc0(P6EWbe82xb+Wg`f}+8po3a9BSUseCk!^ke#qu_p z{aNO1d$Zq>ZCsbTFQUjRmIV|b0Meh~9-%~e{sbgBYBjnvT~HVABVKA~G=Kz>BYlH- zmdFn$)t;0!z1gSL_KTLxTfnj2`7TnXhl6G(p6O>lrqTZ2o-PbEk(wX?bb&fddJo)6 zZNB31yxt(U0bj|GaDnd;K$NT9zUkbT-QFf-gka`6l?BSe1l>PS;(K5mQR-4tELjxgxPSUshXvHl} zO7)l}s*zET4gnPS@NG$fDhH~c;*{i5fhKeUn3GUb;__5f70A6vzY&NyJ0(ZE=R|roh zu7zm<2gmV`BG_O!Rv9Aj;qw&R2|49JC-5uGkf z>TkVag&>@`NlB0<-~=zC<3TDjL?7fcwNElZ0Zs0iy~0ez)D*n1$94+Ruwi=Y%z5ED zKQj}G*4V2B&P4AxEaOY56_@ndqAVGDd(i`SsiNZ&0K^VpfKi!NC$+HLC7eo*%8n3S;%Z z^r{lCu9G_H7w^-+XH69;Tsg6Y_nU$Da%K8MvoM5%4kEe((GBZs_ny%Mg?)F}9dEdQ zmnh^;IpszJ80jDkb6;2bO+!hFL=hh7e++TV<4>m(;3^C^wyGd_tvQPl;Eti&6_3rv1k5ZMTQjGoHr9Hbq%7*tlA zRbb~{-rT0RQR@`)NRw7ulr(bAAd;8*zzF2F?r&Dxf>{F~WWD-;nNZYkC#Dxk0&6E# z#J7PYfmgd9GxXlDYFP3{PoYpglL_l3qs}Diz2bskH#-FzCSsEAuZ}I%7*5~}ir*zk z0r+;@2=*@BrmMFSIG6AS55)>X6UrXJccD@YbbQS^-lfanZ%z`+;9yoIfsHu3n2L_q zO>}oki75(!m=`40bsn3EffHU%&_HNmz6EK3xlp?yxg*C1a*sDe9Daai1I7)m1pB+Z zW~g;#XWfM#Y%iVk#p!>?+E2t$-rtTe4v785a&I;wnE{I_cuQnHB&+~y&Qv*JFYv0yxvgoL2*`+=?93ee8!awnRG%dpsLR}F-J%9k}hL{N39}i+|Spmfa_sA~yj8pm6Z^~?K6v0LFjw|Xk z2^PFCC@BuoxQ-y7TtR#S!F!TVoS&`P&>d%mkc?c9#Y4Fo2DhGydiuAQlN=wG5dIBY@`8%!4}(WvROk4NJUW!;8b5>3_E4JGLjOd zJ6<`-qqEV2q#u$%elb8>>QGt@q`*pHF~wZ3NDSLg(cfHzsD_T91`{+cb!y9+cMnP> zX<A*nP*x<+H6wm$|{A}Ln;mm^-VSXuX- zAB)k%X3inBO3&bAQ<+DN7GeiH^>0QRD}vPH0!RkS5WCX-l=UlX>o1^>C^P(>`wkr_Z;b3L;aLfPh#PE+fDQdHf#ofis2YR(T# zFzL@hw3jh(^$0z9ZWB3X2MFqZ#IE zLKJZMx0J~^N!GdQM)_Y(SW~r}Ecr{rf6MxZ%_O@B0U8TM>-0GGh6R>CjAI<%w=G-0 zUyGS_X(;_ivGKBSzkf~%*<|cUHY&_CP;L{ggh}<$^eO^S8x&Dx%8^nW7EhE5?X)?e zehsLT;~D-P9Fx9#QUdU^R;T(7z9M?)w#w`(3+p6HK<5>8P+qKz&+Dp&XJFjpOI{Od z0gm>PBA-)M@dWBD&7g^g@-W1bhniU1is0svhEyrU=dh@xY81A9@l!Tm8utD`56LR; zPu3x*xAOPjrU_-ao-B7u_G?_>R!(ULY_GhzQkTyQ=KL8A@IXUoX6F$Igj617vV&hT zwgJI?*B5Lc?uMVeQp^GS<(QdgTesLq2n8vl^E5J6N`50N;zxg5n@kkf+7Efqp-as9 z$UPVoR ztg$r5s=^Q?qV0ICvWm^4{}}>+efM;;T>Iu~0dzCRTuCoMVjDrOi?khTmey_^=Zey| z_1A2&Bj>6~eX<>$1UnsDx*Jsb1bg@9si`Vl_TduF$X(y8RJIY3iF`&ZxlzOh%-`AN zlVTJwyNZ2Ai#4^HQRYUFkV&J>tYMD7l&a2+hAV)0%4*CC{yOfsR|Iy^6k1+nt(fqg z*$+!QM8k(8SXMhOHB4qhr6%K73MQ1bdOA*na%;^lkvi%q(@}QsOO@bgRq3*DO3v`= zzp^R&zF&yTGPN%VyLYTns=>-aNxkeT=@FD0iKe+v9a`$#qSRQ9B@#3@&8F>@Ben|3 z#%%bDEO+X99_`**9BN^3wFrs6D7Cxd2gV_ z-gdQgbaZVX@93M(qX+g@(~!hd+$6j?iF}_w7gOQbs$kM#@hGlY2)~7q>z465T2>%_ z-4F&BVJC|Gg{gz)nwt~@c0{$ll7OAaUHAmCnV!>kTGa!)JExx+ya_(GWP!5!do%B> zo@BiX5a^MUB4K{vo!3s2;m_BoGsCvHG{tcM zNrbOAJ^)7xSX?CcJjO*;ug#&3U`5~6O$pobC$x!>il>^9k)|@0cMY3}fvq1hPnI@g zkgRZ7P=Au34g!B0_xKeKcI%Ja*o=lJ*IzFbj_ug*t3dIT=c9Am_rVEn=7oB#dH#o8 zmqxR9aYymI#}+Grb~aIH`y!&4b8>|r&?~|HT1^9f;a21Q+z?uzy(CnpgN{p7E-ViYQtscpl_Rc0u zOcf}8->;q~v=byE9M>9BtNTXNZ^xT-|H#|FbffFT(n_EE;);7AHXdwcm1QDJEJ19d zTyZk$W?k{_jCamI?u55cj@nC!66Oo&HkiuNr**l@5iff$F3Xr7FjBA7TcJ+%>Jn9| zRCUNbGB#5tZ9OA+M?TEY2^7xAd&Le6S9cfXjLt?9$zptuDsJiCY0{)Y$7S0qNiP6;bd3x!@{~r&7lnwXtNS)V5Z)A?1=N;h1#qG%Ny#Ri3`0f><-<^eV_Iu0+nl zRktdrT-Z}X=}=?qMgSbQE_Eza|Hk0bXa-<;t?6WbZ~KSTGQWBi}oR*0eP9m1o(eRl8h(*vGKpFuDE~is8}_x z090!bYKlscFV*6yD$Tp#M7Z!lSEzmv}3R znR&=P#o>3ENdu1FQ{p$w;KBu9i;jV)wleHKU9R| z!iS?j6IqQFnF1_C{ZVCaxn=@*W1BNC6U{!4+TtMJmQy-QaN}tYdBP15niP-T^1^#0 ziCPd&q$c7OqPl{i3j7#K2SFajsUCa^!aiLyoL(FhXlgbNq4&oyKVnBgO$aM*m87#R z3i$lz@gVx?MPXcXyx*ZTL_64{&lAR)J>pt-SS2{&{h?igsqqnUnhlnhv+C%rs$=0C|x`*CRA%*g$+%@W=XYM=QVllL+f@nc0y&g1=sUi5tpIXP7umKoe{+7{*t?D*TE+k{c>MPoY7Vf|Xe0(^fmHPv_Wp95yg-e~1y7(0$nnb^!JEKa04Z*T;8V{4#7F4!851zVWfE ziGY#n5nQebW~dal{bTN1hSw>)J?a>u3k`Y>>6!Sv-P|9Sz%_p+d`wps80xyNsaGpn z*G#qV&~U$N6wz26WuW-y{P6o1NVrJBP5mcq!49=`5`!sG5moM)o~kx zJp;|{g!u!qhbZ9MYGv{Qx~G^7MyjyCXv>K&B7>Vlv=OdUS!`v~w@oM-4mP;mOtLL= zb`mPq;yj}LUcb?|{hpHUaWD)7Gz~mbMgCape%(_1(kfEgEq?Jyg=li@$P48Td$)bh zF`_NRyY~Km`?_MX^9g>wPWfn!sz@}TxV5UsJkSCt;OlNd4*Z@t zaYYno3WjeunAOFaL`#jtwp(n=lTR^5IhFme&piK3tG*nHD0-ckn#yY}HbpN4_$H9$ z*(0i)T?<(r`I@ye0YCU-&1-hL)?K_Q#H!qX044@VC*}wx)XbweR~l!~(_ew8&sIvXR0D@-Xp-5UEN>}T5h$Q| z`?}7|8=fq;uTJ}wL^snz0OCoI35}ROBqHvjHj*ezS+eoi?YJjXPVtdU?=hmC;~(hi z5fZbum-f*E)L@RtUCyv9fN ziW-9`l_3imc5_xeJ`dav%{X+`Ouq1(1^R>g?DLDXW2P*bw)Vm6slvPgtjn?xeMCGH z%SDhQF@E{)7y*1Ve=g*e0b75{3EfGY<&Rk0G}0Aocgv(H-Vl791^Y!61C5Dx?B`a4 zCZURV(XO;-AN3m{c)o(yoBwC-4m3_f4Jg! z2943QwgB6t^|e{(Yl9HK43Y37G!0or>3t8v0`Q+FMVa`M({o}!7^8DD>e%QMCdgXi38NGB^xBjjP(Q=*|~kb z&hB=dIJqCIVsPJ%@gNl4kO=q)r_zyR0b$sd|(R$iqKdW?V5 zDP_s}tfZAQU{|0Ni)&~eP?)gJ9oOk4t=V{Z*)7mVgx%&YJUQ>2T5kJkD;{epnmYSc z&LmvvvAEDm9W3S-`faRA19yr|ifOz~k8WRWjIJY;!Dpy5SoDGqyiD|HB#5EhcY#xBxvpBkdvHbq#e?qi?HR^*uJKZ1Kzo1iKRA_membi7y zY9tk#NpUb#x%}4AtT>w*ICJ2_qxOKfLog+A=Bqmvi&a^t<++;Y>|U`Y*Cy?`gBcFI znbRs3E~dT4j|q4l(&Fem?Y$n(<~WvPGnU5h5BoB)FpO)9&c0P?o{==y-r{ZQJ0a2K zd!6Prbo4pbi{$F}SB8H-b1tGjKm*25r_vwOwVWIjS1hHI4E$F8muVW8@QsbitJK;C z7u6ND>Y!=6#wPpCT4B3qP~iciuo0M+l9LakC&>t**k|AYpS#mbeBv|qXez@bA;wxA z<;Fc)P0gT8IO%eXH)(tH#`4t7e0WrN4pa zQGK%5%vyQ>G#%D zDYt`~SgIbZD&4%sMftV6%7N#cQlKIA2(OZG!GP`sCRT5EV+GEA(h@Oe1QDv70bTQm z=D}w|8b8jYCef=E2kcblk-nqweZN&Dba6;avtvxpc^@%H<$0`f1qsz2m8+nhD))RP zWaNPUQNb$-IKBRay-B%Y^AoRugc{?|X~7}HLYmovg{M1NXi#xNQiTIQ`Fxy_M*eA- z)^sKDhd&bmdonZuH9=Oq{JxhZf<$;|pcE}fuVe41XuBMHMH;2(w3fH6HVZ>VBL6dq zk<@t6aOi2L-V4{=ygpWu*0b&EYUim@um)#`)5DfF1K)Fz4XRtrh;aq;T)-@EjE`7$ zV;1(-VJSU8^F!OtdTZQU$8N!paZ6@zr41&3JBAE&Mp;e zM3!L5Iy7;>h|gVzp*9`wXK0B9J=uL+&4%H2Jduc=xb%pyLA{cV;z+pq$RJ#E?uR&^ zndYtGJ+6#>g9xcL3Rp-iGXs{`A4lbo^n6p2wMT4^#k<`*?pR09!mVp14_E7Z!s$%{ z9o-|I)<@;8ln^l9rHRTs3UN)G#xsegW0{x8nypNOiEXOkz8NiJLQ*AIh7nj<$@}E+ z-(tfFdQSW$(uAW2xPR!RNOyAon(AdRuZIzv4pQ50l%LO%z#)jFi1_z;@vPq{Cwh%q zQW?+dwOP~Q3gtC7gOf?O;ay?7lwaU#j*)n{U7|t1P~U9Fa9Trn6EB$ioLDK+KHn#{ z8opR`7!bX?eFoEK8K#McTQ@sfC9hl6YYWq)DPfdX2XWYCbX&(yRzqqTA7Ak8-N^Ro zVe!1Jsx(_OLSj|GY*a$W{YoTO9*Tir?W@D%FeH~;R$e--k zo51=3@m$u2&1WJKfco_U4cVevxoe(n!G4;+5enyQL&DXp-zW3VJl=U^IB@5oC7kqKG5Kbfhdk z_3FOFF7k0;eY+`Q9Z0^IVjaxFKm+a3ULX!Hnj-$p^JvYAx}2?)9crq;1~38;aovE_ zrnKemZ`NtBp8ooB%_2;$ptX7+>0JB3J4JN(0{6iFDyxweLRV-engkEAI48NPsZG+7 zXbt+zqMFSXpE4){b4zz4+@9VV*}UV!j->rxpn@1BTr{=RuCGw#yQ#&uadE=h@jL?> zFvfZ&>FS-MD(Z9E^IW+s?c!M(}cX5eE;xR;!2n|Rx5#kmSUXWjmOz+h!qkU6qjqzFO#Q2)ysx2CunIRYV_?pZUb3s(f%v%-oW;QDTxmCxO1~ zV}~jcssGzSLRE5o=;@{6vY*8`i!sNp8mU@MZ}^Ks{EnP7S#GL5z1`emlFR)`ZGmw( zy0$oyhS_QqeM}$RPMLFP8n=`$*g8l&6CtJl_q0fn>tpN~V3y@VWxRN}Qi4c{0Jbyk zQ+XLXKA?o`q;b9y@ zq%yL6FitBGyD~L%`2-?5sjWsgUVf0c{nzeE;4}!zsL@8t9 z!Lf2nde*wMo}GH~pg#_K{t$-Ges{ks3s*1423EKk{* zo6&n!`q0{1B7rbCRf05^hvr#Q>eBt~%KN-yUk24{63>C0JI(0nP5*hg@$iBXT6#D- z%x9GpTnMJ5!j=x`1ATN|M`biM#`wAqA|FJ2sZtWvPH)Q@D!3+QG?pjeQj4K*84FO0 zmq!kuovPnkHtx2lz^&y=;>5#oUsB1=TmpV=f269a!Cw|8T{D<#ss}HDtGPU45|rC| z&V8AgXniIret%5@3QIe%JG7JA6(8w#M%I9ri(*WupSKecT@Bbk!_Lu}a_7GPn1M$S zj{)`{V5#V&e}J9o+J6m%-&V9h9nX8a-(9Af(TrDhG=x%?=Ve{o$o%`;g;w$97?CI# z7|B`crss{(%~z%KD^x9Ppn{c$=CXTc!D4lWk=GG?C-vhG9pd1E#@~3&<9N?_wp2cc zwj^~Cx5a9Op{7-b4#%Ttl%6{5@1lsR-x2ss=(_ma8DtyHA_YWutSYs_@9_v;xE>Uk z!u!9yE4>oAi|C)z)-}-3dxc%1k>6txmCc=iiG*0S@@GDgyf|!WU;t6N>lm?-A_6D5q#KuTqemSp@i?f@Bhzhi# ziAF_zB@%SQJ>btp?kZk7)(>K2py2gqFo$&1Nl9I9KzS&`_-E<_@+rVXNt)r;%8NI;qv-QBTJHSd3A;TRW4UnLeBHDuf?k9by*n zzs^<)&ji2nsD=#Q=xGdQ>gXkfQ7diO4D!`TH&Jm5)Re;o>pKIZ6xpanM3+L)WTU7C z+)Z6Q66=%iOf}%&7abHiPU~u`E?4|j`T%hQaoG^pf9ob6;w2qFB42JrG9;T&N@Vx{ zNm4}_){YNw$kAkRXg(S(tFm7jtOp&bK9*?gi(6XOV!>uXJz6xl>NQHBnu97k^OHKe zSbUwP)I^E$S(WNQvuKd2#@(rdj?o#m5^sWyxe;V^f2;3&mlNS=Gs3m#P1-qsCCctE z++Z9BEV)=E2I|ihZbN_!g|m$pyd`lG{Z57(L5-%AB{}dr_x}AuT-%pg@OhpD}`tvUVYNkfSLNPP1~F$anBy z3w}2nc3U$HHVQG3F}d7hcvd8c8n^ZMQ3FNLox^RFaV!5;FS{^mk*^4o)l7>py1FZK z(rVnGA{;@B*r3v-X{*ZK1EtogGm9x9lxZD!L7p-v_1UIsoJhLq5vUg5VLRHt-%OWU zwcX;_sfudo0^AHfgpQ9MB4U?W)QE{c-vKI~&&L~^%Mwr!TJo&>&y2ZQ>MH9+I)v{v zzNTPfO1sII*L{iua(bndEw50>=oV9gfh|D0tpARNzd#7mEnLiPd%LzOmnd)`wqNXg zbMtt7GA35-&U1e|<($*c%db?k=6pgI|w`ge88J z;fir)gcB?*qds5PXoZBWC+w=~fsp4>;MJBO7cqmkqX+fs`MrhL+$BPaE$Yr*iK{{J zR&kwNxv|8_Wc-T62z;865!R}(OwVJ=g@(Q_wm z?R>^!l8emB`rwJ>;pu)?)WBg~oBfP|c$aK0e0`U+Hg2ChyT@h-0vT zOq@}#aKY}MSEK-)#l5fO{?t_V3m5k&BYZT?ss2|u1fd&U!JOeU2A1&D@S8%0X#()j zU0T&BB%>A?Iy^qIYdIUm@)t^1i#()oQ`n&19hwn%3S6!(X|0D>iGMpxcUhjrX1hk9 z=1k8*wdfd zKLnRq^-Iz!DbZmSZ@yqPD>?>?n@H6fDmjQ}mcSiWoP@%pnwLA!r->lSij`WVVNdK< z<--%62c`qkf9;HD{KI7U+}Z%VekgRv8m&1%4-%Ht#W^fvWB|*Z5kgNoi>zju(!=)Q z>r%*bmn}gLWjrB)<7tox548=+x_efI+j!RiaiHMI-rQYXf(#PFt~U4JBB%|G)4KKW zSiqsed!>hz-No_4Yrd@^DzcC5uZr03N@LplU*N74$jJ5GfNrq_*Nb{U4I23S(eKjz zKmEKc{Dh^B!);zv@?NoD9|5@0$0pXS1Gny#>8bV|V#tOwY`>L@%C6Rv5R~pL+--Ic zmNaS>1&rwAtFDE5ba61?mY&lMbnXMgDR)Jybh=&)cHBg}7zr=!L~0O*UskKkRYSaX z&b6jZtHUYhs5GAl2?Fi%lZnwfQW+zEzK8foTB4wiq@6~w=O=N6WRcqqoa}o=9WGm} zJh2R(B&jZDvsO9|i5rXb8@3%u6VT4m!m0Y-0$s&1ilkW>hJwqPO7)NJY{?RoC^;_O zB`&GqaVf9E_!eA?v}QZv4G}XEQoM^Q)ypIT6-l(bq^1;HG}!YJB`Lpo@TcEjwo=Yv zl6DlOg#o!VNFBL<*rU9vA&>g>_q)7*1LayiKS<5x)9D&p6eE;3GdU2O>0o?by@G;EQ zY7=Pi(U~Pca>od{AMH!MhEc{oLWn9n-KV0knjax*(r32uCgrXdQg-Qhf66PACDvqM z?8xZ?$nH*lk){DXZe%~Uvsk69l9ivCi)CvVvZl$^Fe)Ab3q$Th3jeyc+ffbK^EUI4 zhODNx{Jm0tnm~VXcn$s=o7AIm7#6CGjrD7HGWPEUUg2E`jB?Evh%Gkst_<$Gm1hPX zg2zI?z>DsFsiFarvLD>}MDdDyO1QvcOwYVKdfI$G#di$hm#!^yTO03N-%B-2gll>f zrQ#h~3RNN%T0RVubbHKT0xU~%4b)e3#gr1me&J6JHbv7K;IUS zk%V|2sT!>TQGRwEC!soHQT<<6FK(qo{ORiQbP-vHeQ}W_#p`e$c4(LyL8llj&lcAh zI+PUstxc+6kp=5*of}gtcx^3Byev&wq*PP)&XUfB)enDi(J(6|GW_u6$^^{3@RvAo z!G%q>vBcL=-IKYBw3V89MLc6nenO>Kxde@t@Ykg8i)Xp%r-5>~tw6~hC6H5a7LL1- zN@m741|GedsoLd`va6JaWpGRan2 zeBN-Bd(TJ@Kze6BJMqt#Aq(C`FHu$nJ4%yQ#c?Zynfgqle_mC3dNoRz#RTEl)aQ)@X9#?0{ni=U;f&h$JI2g&y>z(svpP9 zPV0H8E(q5u?~NiE*Pff2f@TF5ak>=dLoACy@0~;1_5Ql}f$6wmm9dPdt+Nv8+rz)N zBs<^ITE#ePWtypnXLvc?-tRnlM-`7}H-CEGuWO$DNC=icpU+-)zN)If1{P|1KF(Zx z0LhitVM7sst??)~Hono7m$N{0N9oto+4Zr@I~;^? zw_~_G>e)d3Wl`J+c|4@~c@5axhH+1=ivJF{?WpYx%NvBb`@prHnKiKTl7RdIRA_@m%V8^pvHr|olAS}J^6o%2&Od)sQA(4xbV zd<-iP{t$(q+E;XWuqY;9pv`vps??yK{tEu6+K%?r$b0Dus}9PeUDoglWs2{FcfCXH zz}sX$`@(aGey4&f(mbb8#1@7Oil-wyqL};}cA*BN;g_=}3L-J$f=J&b=(yirK#6AZdU1+YEd1JLc1ntD0rj) z7b*+s1W^J5S=ubllCd~et2~cbFVu=rpla z2||Y|TMPrqq91{l{6hwM5=lzKGU9o~tk75_$bEZnqrCFHg{WPKDmIcH4+)Nm*b3s? zkv+FZwEs$6U9S)~f`9@6X~6*j;rwqU*#Avj0YsDpgawoYs#L9HH%0&aTQ$X?z^7zh zw?%BV{uiL`&d(9{dr+Xl+n>i{db{?Sv*RKl;r@WD;o`s&POzF1ao_qSEzM**<>geE zAT#tw(4feg(KW3zls6QU$@jO8Vg$N0WQMV}|7nAVZX0c`TIe+w#rDBtm0j7(X8zG}ER)X7X(%Yh_ z#(BsC4XbHgnfA@dB#ezqs`FLPB@V44qH|NraD`p=LS@fO>~8Fk@5n_1J}On&F*=9S zY<3tpt*@gcGY_P(EsjR$Anf?v>!`mIyIC_t{DV_asEuLK$q~n%;ZrKC?t7VusJN`?E82q z>cAI{duYt1FEpM~Gx$?!Tal^s9qUwDE+Jp2e<`NqL#);LOv0!ofMHm<~=QP`_ zYzVp?Cpd?k3)y>-DC6oPY61m%=C}_g;5+{g76`H~D+iPHU`Xl3#XNcL&Z~y(1-|0N z;Nf>c#oN|sn8PdTLv;0|TW$djN90AvMG~og)kky1S1&UG{jLj41JaQ1rlE+Z!st>v_H7dsAU1^C*v0iY!TtKw7a%^TF;MTREsr0y+;ml7U?t|qnuy#Fst!JX zOe{?avBg}vtXF^ym>~m6w_sJuK73QCC_14eFF>Z~ep75euv&I`y1LkYfV>0i0>T{nlnL9v zlSRg{k2($R7$z86Vj#h2wNH2i{8T*=q$)O(TiGXo<%p8vy6t;x$JJRZ=D4oJBmSTl z(aMEq^s=p8Lg31Ec1wPmwy&F?^oif88WOB^3N6$pfUYOzbliP?tcZnZJ5=7*MQ`Kg z;c{N~laZzkkfeD1Rir^dkf!z82uuX3hHL-P-SXv2N!58(oL0g-4+2G}m)%D2 zj$qt$cjPVQfC=uN5yYL**5aC7@jTc^Ivm1UF5c5{g;dCzeDmr zG2?Km|#Mf4HnD79RzGEltxU78z7nTT5$ zhx-^untNMVnwtv#ufqORU&Q~`360>T^n?8i_^%NHBK)5MJKEUlSQ_OySal>gH$3L-+X3c`(DBgqxx&9!SaCI~IJ#qzNH{ZNpB2(x;- z0m$~qp6CNVIfE@Y zHPHqoB|Pz#6GAH7^+C^B?3kfO{nF$oXegp2wyOl_cRo!$^hr4@I`k_nqrW#G9zn7h z;e?e-kd*U4mR%vDab_C!PR&xl5E5{liG#oUEPZ}`DXrN3fTEV4JH_87T%rK=kUC)O zL~FKJCK+f?D@*CvMu{-%(pp-9=b^twEc1SwcsANSqS@d>oY|Da6-uq%3Tcuml}p_xzTxV;ZKZHe>cEfP9QHbA_HX?X-;(?Uzk|ct^*rJyHY|vj->o2np6%&oV6cBz}$3& zkm-6z=Nwxodl~60(`j`UIEjQazTzbBjRR?doG^ZJe@+D^^A$~?gBy{Sw4DvH;^V*d zVmR1y)fs0`(gc?K5*VW|zG+;NU@4%Kf`tD6^~+j)o^ zf@_tWdSQ;5#xw5A;bf9c_iGZOT8pWr$3UV*Q6DMGzIGZ=|hD-3IRTzZ#5j0wS1!&YfV6nz`l(=S?!E@xfpiNnzYgz*;ev`FVcUqnti)wt$LA3D+@Q2v$O5DAyEf7h%EPAW z@Req9ftS!FkgZa^_S`rUuX^|{5G`^UZ8>K$n~_A2KJkrH;)Pz^Fxs_qI%{V{?v89O zGWFG2G6XF(0&-jc=Aj)rhN1DVATpaY&aq=S(p{IGTj3YG7rmKhtx2P#G8oqYJmdNY zG)``|X^Q+U0=H4l(pExeEMk*2ZUPvC978M9hmsJlEE`fu;{Fk@!6Ixd7C-TU(8S_9 z^pYaBy3%cZV(l8uTwGRFFfa8Ty~h!=)ne?Sn!~+b$YL8w0k#B=Ej$E2+ySS~b`+mu z%Rl3huCsUt-?3J-5biF>KB&5{h5@z5_QliUg}qFCM!LN;rMAti9`k(fC`iAH$`>yP zpMDu#|B3%J4*bsF$vWmCv7I@BgNdk#3NC!Uizly6j68+<*fm0s`|fR{)?PV|&YiWv ze1U(N>WA(M8E!+A*E7Fb81TdzGR?!kRKf|HQ0vqlYo&F!Cs(!tA9!tH`40IQGlv3G zzwX1wiB~w)waej@@D5cMJbb(3hiQ!uAMFC8xvHfYb=i6R^>cY=VV&iVw zw?5^9g}f&z;e5Or;Yq>;OzyxD#1-D_vpGTzSNy1)E&Czmo|`Ff4PwI52V8fUc^M>s zEQcldcMRG+MhWl%b8YMYZnrJpuxND9Qx3Jtp!2-lZu!?PBPY(t_Ii3Aez zhdmkBfFYvdf+6ib+tqQLAGv#{#II#Rq(4A+7kRosK0v_8T8^76_)r#o0j3r9)p7Y< z6SoWJ*N4}a#%D;k8eo)Fl7@%%^v8~)Ea#l^TvFwN>Dd}Mh*@|7J;>7PA;TQ$$3JS~ z88jo9p!zC;9wqTXcqP^CWh-cTWUv2`rDkROz6hu)n zJ`Bp;o!mH`A#(DwHpFL80Wm7voB9_A0HNmLzm+X((gl)s^9eaCj|Xt zRtr;N1AOOOu`CnNDu-o6tSpEA8O)sF*?(2OzeZWf)Sej5i0h87f-|c@TzM}cU_Rxq zir+s7k*?kZ2b-jK&9r&0)oZtfa5>>)3cQ4$8vq20T?*pXxC>LXihNL;HL=e@SW+pK zFYU*U?K)@qp~TOL7Epcb2=2bzCwWFfWJ{6b4`*;*%0zzow zUQrpo86|UA9jwLp!=q@hr^NAg|Drn^h_-N0rKZjkkn ztfbx{mYK+L&Ko`HR#SR8{eH4Dd))}XCF5j0Pvk)X#^dWW&$up*zF|19vA+lj${E(a z|Gc33w$q#YxJ}I$sg{iji+J`l$IV*MbvOM(5}@Oy8*~r}5rR|iw&vpW6NQ&v2H*2r zuV@_GXmT2_FgPMTo{ip{CX7^ivq7`aQ$Bq1Oiz+NK9mdb=NM$1^wCENYoX+(?t%ol zpC{dHAF+|dabpkYku&nyF_q{LU5Qd^WeQHP%tr4K`jdh(BQvo^vFG4vfO8uH%OAUO zbdVgFvbvLsWK!$Pv=Pn>J5~|PUDYlmV5gj#?s1RdGupa)wT}hUwic_EvzwU$nwjB% zOW1ZaRsp9Ag9J)MpJ@uW`LB%>nonU5#iz)`5_Y)Uw1V!jwy$ZSQ8RRf7D7tP0D_EW z%6yj0B7{A-!RiOE%H65h_o2Qn)Sqx z>LU}1y9>*Yz)mn7LN-+JBPzAW(qD>e&GtXn>q+2;R8h%RF*NY8)LwB}_Br0kI@>Ax zc-I?}#6+zU+Y~5s0ds9nM!~?&nTlkp(@;1MP+i-w_`%}N&; zmKpeV^rm-(4|U#p@fBl=qrf;?Y_~Pqf~BACr<+Kr0HfE+G%qIaADCEGtA!XNTu=3< z46|c-hngUI1XzLFGb;Ey+h`Jm1LUJifP$;VE|(sMEY}n5LC&yi@ZEPs7Ob5QDR`1$ zD%O=uCM^qeqE3RC`8pYBn+{C#@VRv#hUA*P=($*$8^%GIT#d!i3dUa?5#0!PC8mOc z&M5u~F>DDaI|5oYwT=1GNk4wP&A44Qix0EV*6g0k;4wL3(~Ga~b*d^bH}3EwU0Eot zGsDRrLcqRlRtYtwShp4WG~bS}Tbi|0G|UOBtK@&~}CbD@xDw6@4N2*MK>UQO_MjvMKHq}Q9qu5urRFQ7CX`j*_!9<;A zJH_>q+D_WHA$u$z&|SCFgQsIiac6Fm@QHCHar8d-t;^f1OPe?9*Gj~%T6!bx9^)0Z zz8*yrUv()j9%{DWEi{)~%N;`xz2^xxg%nJ=5NM1#4bz^f&y25k08VpdmwOWY5*?+0 zLToB`PEGqn)ELwpRUE&vC$EH4pX_=Tm6+jLG6qpM#W&u0P3`u^r|if0aM(f~E_R48 zB;pdV2*JK!2Bu_l%rAa&D%F_hDI1e^U>EY|gnF1eCTX{7$BmJ(3Pxw%luK~p$&O(a z#ZPasIwVKM7%g<%B2XSbkaGWXA^OHCXunzb1iUZaD6tx^$ThSO;Eise7usWc-$Vn^zK*FexyzGy7l|erref8Rcq^fnrJi6j12ZBVky>u z$Y+K+NSB>+W1qHf=I&w>59Xq$j5U|3Y^o<3k6DP!ShIK5gYvgn>DsJkBjcRPiQ+(f z$ZzJY7ffWydE`2;du3ib2L#>0K|H8mKsVkc=ef3BRu_!UPs4XLTG3UhE zV9~IOc~haLUHm|3%+qk7V>ze?+DTqm-KacgAMVdWkn93v8LB2dMb^~yGSkX67Z`h2 z3|+mwz{N`^o;^twY*ceU*tP}#JSUsj6m%W&Zei-$f29r%C!p$tLvc}5IXbx!FOW@d zc17GlzjblD1x>Cy{Eu;x5sIn5S6v*!k_HrlNYo?c>+nfss++@56eyh+o z(4X76*1n%}q!{BPW{7ZKp*dMm;?3rw&(@E}gWeR{J#{VM*q2|urNluu>q_^s^c0IW-+sn1t8nq&TjCxR}9uR0HBR?Z<2k_oNQtwy7vW)EVx0H9@oaSw<`K_tZ-2hH?PtNDP69 zR13)mYSs_^Y|B$Ta3{Ob60GmF2i(v(_~WQP$u)=V_?%Ed-N@4{1O{B>9vpB_7IP2G z1KH$9A!8E2FotI`CzVOl&QtM{<@Y7eb~faQV$7T?{1k@Z96Gx5j-)7F@N0+W4qx;- zcJPA05y)H+o_a=^&=LCm-6SPQ`t&M?VZjqr-zmkWCCz75^Rr&13vexiT@kKvxE1Q3 z1{utxem8`DdDpbjfOL=cG=n$CRh@Z2FT|$?_R`4Ki2Fg-p6JUS129(dNMp#|km|6r zQ$CY1{sWK7Npgvm*I;uf%1^R8cbSF?edO08wL({W6UMp9^KWH+3>ueQV-J?iL?D_Q zksw>9GToF5?szfz9xHd5{GI$)vVQ~AsfRj;OguRx20Xu(zVn0Coi*Awx_g#NLGin! zF`oP?0EVP=%;h{?^v~9O-}*f%k$7nWab(^*vmw8Ptu6kIl?_xsr5}y&@ecq};Ye>p z_QpJ)vArAyea3`7(@i#GU3dF{S5}7G2U(YNEE;XH7GBxWwd*$nL=@=USakjuV`l-C z)$#>;Qo38|Mx-RAK@sVaknZkoB&53=q>=7!3F(yX?(TZWd*8k5;U9eWtOcLCJioJN z&#u|$TQhspjV?tScVAq;S=eo>){7vRb7PMOpC7wp+kBbz8UM_J8_xhj5)$g{Y`#!w z2Ysn=?45NZi+XEzoq%urI@J&*X!07#Q7qnkyz@4_0Yl^nYj=>b zJMUwbnMTTJ)<&SxOXuwM@mOObKVVlSrn31q!ZGq2;EZC03%)C%-4IUu!hw6q>gS46 zw43neUNH)()jcn%CjY%RL|eOmp(HV_flT;bt`BM#Dn3@af)u~J?dZAo&M{k49n zD4&7x&RdO0IOvm1)=2EwKv1{nx($+l5|jd2&Epsdb;}wq(_ZF#TlxQV=riP#ozQ)t0NP zD6M5#x-@(UK>^_=Wm^9_Y74+^yOF+^}o?OHZqWVbX0sana}1Y&1i@=l$5 z3k;-1l=iPpH`>5AN*@!_vC?e>xn8mFA6K;9)D5b-_toWXcL`bv?_YnE-W*JG4zHh~ z9wnpECA4D`b&mGSX2w3ItEh$b#?}5RNCRQ|#yq+cYeq+)g)5&06y_dVa=i*Py znp09iU(p;h5fw}xf-7nvaizfQ70}Rx(H}4l%~Ki?NI{gTg5=w%>b@i}#bc3DZSuDs zM>uos#S*BW>?XpZndOhCwHqXTg*-vZSnBiu;q)^3990rv6sX2 z+z4YBim=Z{f^Kla+tPz(;WAM12OHf*E+lEb~#oTE55e>Bjd(ch~-3Y`1qMUt!NHRFNNoP(u0`3mKXCgc*~ z)@AC>rnbfx7ZRPSU<9(Su(xLUApFG);wga!$UHA2dbgq4m!vpu2{>*MvwLG^XJ#H8 zEKb<#Xq<|K3?oji&ooRhKdzd8itmD&kb881ko5kc?}TW)&*sMl;g9x-VV-a%v5Xok?^fzPIp=LZR?(KXNHGx ziRS=!HWjJ(y9vc|$y7RjxUOfmP9LLSYd3@W8=2qVuZf>pK{f5E-ArIzNv57gSw|>0 zCCO36S9+CT;B(U{FfL)uNiF)^92gs>H_Bq)g^bI_`wWo{YS>z;v70cW%!%-X%7wLh{+x2yb=yN)`fA4nE=JS?D5<-V#D zZIUC7*15#C4ea7tvlf|zdde-Z_~I$*tVJoJ=d)VYRBY(eO~lBj31mG2z5w%J?_q?c4(3_c~cc>-5wBl9d*oWb4muY_7J zqy>Y{NI#YrDug7hBvnN73TrRW6G?kCS$~WDI+bG52|q55=rf7I;SY*P9m;?Rn*1oQQEup`!9Z zWGB9+ff+!?>z0r3Y-ZR@@_{wp#0$J@*nHh-GkTIj%4aO# zcqxM3ye^DwWPBWWtr41!K23wJN!7QX`Xut2*Tt8!101`^_FWIV)oYGi+t#+a9B%#B z+GuJ7oY*l$t$olgnu^=D#(d5CoxG5CU-mhP^rByx+G+QXJ!4#<#anbxnv2*%XUguZ zgofb1fj=W@x{c>0?_J)>4YOnG9NT>^D#pe*zVS}e4t$5xGk4*raQPTt%%6s+qc~-9 ze?4ry4+{A}pPUp<%!f%i9d+@oC2jWyHK?~tD;5Ji-9QHfCac)((-sd;4;`A>=Zg*z zGMS1}QNt+1CPomYHVnNb^MyI6#^*JBdHJ=qvec;`3Q~xE4Si2C_A2I5?@*W7n*pgQk%XP$n{4Z%C0?XM zeacm|M~l%;fTtOD$X*xkhU$PO*F>p74x zqr9RDW3B8jD_dG3f@G^aZKoOAlXgXaaPBKrO=uto--zBf&P_J^yc0I8*Tn{j57nwA zF88nrz|Uf{dxpcsz7?}UU$xdF)e#bYF(f0PHGduy$iUpt#CvnvQH#7t4?{d&Pd=Lt;or7Dw9G=WR`9#KhJj9^1h;_0#SkWj*y;?$1O; z-&Ts-BoEYfnp32%*t&i8+fHPw0{d5@So5lvRIPTvqS-Dg*CT=#xq@YO!AlU|Z$|$h zS(&D{;92|8>Eu|@$zkfoh!w?9cBW8j+6JW_)f1R+=XAALI^l|$O^aNP_vMcF*0u`k zC30nUaa_avC0rAo*)7JW$Q+w=63cE>a}UGR&vp9ta?o>qy#zazV25SYl!bQ&(p)4B z92mA4+*x3Hg<0Q|bWD0iot2s)xzmMx*PR$wTl&JJMx$F@pRua-`)J&1syAR88h7k^ zViRHaLBSr|XUq8Qh}*-=hWG1B@!?idZu&&s?i;L@k?i|~TcOkDwsF+|9D;JwFt*|G zw?myt;UeXfpAm(9|3SE0adZmNrzB*;tR45lcE}71#ia7%_h1AZT?JL9GUD%A-K&f) z2W!xUqJ4&tSj_UF(bDK=ay1b_x7g4IhPTa}Y`;R6~?$=93TwNVLx60uWcq{Tq5a=lGwQ>B5Muj^ z5(|?MZh}iqgSeAI$(1Z>_=MhT38a=k~?a8t>g;7kEV59ED?8Uva+k6&%QGFS)2~N zL_>T5<)8j}UcN{@kx8Gxod*8hKBkO>kW~*abKv%wN9+c_-TN32|7pmr(mqV`t^v6E zFtyy=eKzeg-iTCW+_oG8CZ9udQh`1dIB%b6krR;P&hIA!tdhJfY(k|v15))!Sl9hodaAK$Qks^u`}{_uCkmd z-YVx7o$8{{v%GO{)0yyTErsmp`I}QJ>@RDzu$XZ7pv~7XzOkh>zATJ)HlQcTrLA3H zskU{&EpxHe^f&2b`Ev2ZlLHqtZXLc$8BU`NNBkiMjDsf}c} zPU7Xmo2f9y)i*KJWID@SYcKAZbl$pDy0F`o^Qk)hj=SMN{1%fE0u6)ceKM0}Y@PCiO6+Es zB6N|&dpRYiA`bx^1bNu`@*Pi@>C`5-`l)tWUo@VKvIh6U2G%nh-nR-np;n~n^l?)7KvAv}-9 z%OaldRTCg5-p4H;;Ug38&c6(vWvnw?If0+)3!WZWv`i_^=Su3|(12>WPJFQ%+lD*+R@dyI$+j%8rvtwp|lt?26S6>~PcSDnExp}JSmy*fD zS)m)7Am!NeC*8-*t7vCU)CnVOsTb4eL=G>#jqDOzB`c`y9hLKmMJ)I1Q5oCO7GO{1 zS@H*FTV~Q;;W~*Ve#2&fW+WiI#Q#L(@ho^s&>=7gf{`7 zuGV1rU2v~+T!Z*$b;lc=3V|Z{Deig$NcZ9QLNK0P&#WS;4*bM6*Lg_WK8%eBN{4aPD#Co%-XORF zs`xxg0C5q2Rto!aIX};Ua(YGXu9)`IUJx+WWYQ1AfwFF5YMZ*Axd6 zsAV&%J-F-XZ9-4I-i~_U3#_^F>Op+3CcDz8vs1H?KU(C{_VY;*cNfUAICzE;=-t-w znQb*Gq#*hg$Y3awC7)ZHH|>@N4N};uYpU|LMsb9~HxBQ4jY#XkFl5QdF}d2JP}_uZ8vOJd(7w+fiQ25pL#e zEDov=It3T-y_m+q{tbHT{3l&1*^PT=m#NmPB;`b3h z&EWHq9nBAdZ>ec~N~`?{j@Iabwe~*Fz&*X&MygO!r$BakDi*=fT+1O9#(9=)9p!NY zvieml>w6s%Etl`C91>r@Bb}@-Lpg-IsTdF~j;xTXthwsI1PX808kn|{G$GE-<+eh~ zAmP}eK{QXkf)*fLK{}{vgez=mpeLY$CoCuZ2nJmx7?#?nEI+LOwIPtp>7zl*uD@v^ z43S%Fqgp!KP?#32jZn&TD?vj~>}8qQ72%@jPp;LFx%v}3O}Oi`ff$yql;|ZV;u73J zzA9lvUqVnUHq3aRQ)CkCI&6n6GMtyt#4*we9k;cn2n{BS+d)GitR7d!ZZQ2asi-+D zxo2F&qWmV33K$EhY_-KnUV3S-lo;?KCi>N% zplsI6HKN7)AY|)_??^{ieu?job!Zv-(do}6NvF5Fe`Y?AN-QsK-tdn|`AOU+R9AH2=PD+S z9wY}t4KvbWs@G?GeyQs(r#>-&%2H@HVxE0>3`L0p-Z??s2C5$I+V#XlAQtu|^lC@f zv6mWMhQ^H8yD3ZM5;D$r7HNA*$qw(EUp8vq1-!?^qEPb38a}~|H{E-W=(egpNc~=Dww0@VHucj2XdSpByUtXzmCK3>we2D zXI>oBvw{s?PkoiKuIfvm z9Y-y~bN9np8eP(n3T`4j=Kw~tgh{A*nsqgECGpLe&iy0uXk;2w(&o|ERkQFLVX>aq z>Ix&Jln`y=pV324VKP!wV9-x+raKLs&8EgV1t{@1+}%S}%aJ^Ell?O_ow8q4L5$3G zPHuWoZf{V~`oH3UAYB+(AUa7YYHX<8y#+TwofPqcqezddPT4O|J0u0YJRJVwiM{aF za0Ma;<3-Gs-?XlS%YFQ()pgs**kX?3tu$QHYBF9MRYiG>OZ{Nw*R^KRwF>*!k#i{f zs~Pv9ot;?i8#X^1EKOh?uD{6aG{F3X%1e9uUY{aJBB#fNJMSAykD!T9`T>&V8MU@6 zLi=nxVQ}qLGj0c8hP7Kl$L_uEBovXrlrV*CRknDP`)o5FVjEA+q3&GDz>Kqjv|$Ny zHz<+O_nqhRNdC-F_wSgY$C#o>68CIBdDxaNEW6JwLc`ys{xB0zvafHcK%9)UGi?)U zBGb0!#x^gmnlUD9^Tc(Ca0ge8=kD2AaN0W<<906p9zz+dtBo|}c6QDkGB@M3EjNM<7XltFm z6uSa#{NmeY>z+o^;FO7IT|sBS7?5A*)j}2Y-T{X|H`;BkzV(nGf2Rk;;j|XAn?LT<};F;2ZNu-|-V)t_X_ zkTYMpXe5ki>{9(bnz94 zC!)-YIqP*0W_=_n&-8EEO_DdSPp%Lbz+1(TPiQ*dn49#H*Q>Ax7G4mAv|_&?MUY^z zB<#$M1zw$mXtcX|Z+6P_*&x6Mev@?lz(?|0UEq8&47m*4AFbZyjXUSpp@A}|@A|Gb z+IK0ej{2hDEI5KQ+GK> zS0eWWvoqqH-y$uc2rMkrx$-K%z+{5E>lkivvQTkjWk*5Q{q|XoID{s^519oDEDIZNePNj9f6#ii~&=JAuDgV{muReCNsvO< zH3Jvrdx3rGksJxE_1+MkyXPoU!mZxteY$`T$t0)WhMbs^KLn5esNwWLZprxP zrCC(m{Y~o2`Hr8n1};8oQ8~3@%r@djXUK)6?`p0pr;uLx3iXa`HN0qGy{WSLy5Qbv zwLhv7hExMasmPYH3JN#eP#UerWm6YmzJ-dcl47RP@WP+fQMF&If|^|w_TN`D)c zB#Ukg25vS3Qe%QM@@2k+%d?dsh9(SDP|7=a)2N`ssM!g}y!f&Y#y; zy7BaFclRnY^slL@CAqA!RE&mfv9C;P?sanRZ_bSb;c*G|Kk#`~lO29uTl6M@T_u#s zG>y)_84B>$fSs%5RO6gz-7J#6&VSv}wmzyri6fy<=DOOcy?@!LMXUR)K>m6IHFmwY zQ;-`~0YZ_w#sPXq@E}FFWt=!FDnn;Wj-sFtcg%D^tdf->ybV!z0aUKw1vefN`#aQu z6@+Wh+bY>fCpv_m{%1LkOfQfpHu9gPgI5;uZ-(}Li$fVews*Adk;G34p-3G?y5T7( zEK>I?*4(CLENg<$GHAPQYd7Q-O~amsF6x&;5l8uc!HtYQAac2Y6mV3*y;=imbLMAJ z@!gqu<;(Wi^xcBwp-FzdRe>5}O#IyZC7)BWd{buPy@sm`NzMYa@y?bOTWw^x{U-sO zLi@LGcNJ5LH(fvdSYw|l$*jHEgJ|ZFNomk8f=g929HCzjYcFl(iWN*!Q3&N_fMBUv z0L#;2cPFkitywB|+K;_OI#D@~@)pjio9+-o3p0frjm!>_*2fu3llbD|uJmpcAE_rf zB`9GfWFo7p3D+JX8@H>j4S_3{78*O>pn&>csMjbMJN}rVK5Mc}7HQ!pLayd&un+ynhzuS5#tuUVZlS8+KF#BB>K2vH_bHsYM@-`*>AmQs{#>z)cvl4WOjIONd zpwwnE3RV`j%NqRY4lnM^H1HYJO=Ro-mdXzSo~ zenL3F9g)|GU&bbjk|#zf!Y@Z98jNAj4u=KV#h0xRw&t*NUpRm7K(G{3b5Ey|eGg=W z#g*(1r@I*Hf)UU91X}Yc0!-M}PAcYIfArxmt5&P<aJ9>VQo>s){M>@lG8Ur5&&(a|>Ox5Ya zC%bAd@;Gdx(?lw8HDl1x^Ke;lSU;OSc}cuF|@ zbCohqDfANNVmq#6+<($H%#|abIC;ogKhNa3%Bn3tKg8=eBizJgI7P@1+Zlcnco)0m zrci>$ADv!KT_RliV`gnMtRz>dKIY=oMB(W!dz%?sIrd*Qs7dz-{XMw-HZf&gE_XnH zLnhLi#=8jP!zyM}ybZL7(BxkP3N%Y2lNBa@ugasr?BEtVxs>e8voEx8K!UHAdQ-)H z+9PZ7HV3;emIZ|RU4$PT-JaBPNILP}T#?T$Ijuub^W6D}3`XKUaiW*aNe`zfBwYZ4SE5DR`c>^igzZqbf_i2( zT}sW4)5TrF+;vfRchuG3$BC9_A#!{qN2l(oNMCg$mM11ZQ+E{5=z)NqnOxi))ghf- zJMUsd8v-2 zIBfknCl_hWT$HqwG}vKHn1vVuj0(*dAH2KBjQmFZ?6z;EspH1UxyOY$J1@>~BH zchwxRNa+IUXJJIS5$JG2!np7~bJ!d86c4(ppFNbtUdJy*)*Z_ZvkkoW*u$2FhP;uw z(nf7ja{20nJC5tH7bM6@^;MBjx9~-9heR1Wdc@8K7m)@9g2{|Rsj~O3Pv41|OQEHI z&$$xB&KH*a4OA^+CE;qxC3Ez)Z}|@7@ooMA;+uV(8D5L51Jl$gJ2P|{tY??U zBHvU)y1PZGiK$|X46SBTKx=Kk`!~uB8*50#u~YoCq*`)5l-MY;yW$DY-V(v2ie;hn z5f%{ebnYgiWbjZve9bl=LUuX$X&!bzQw{%T@C?deC)uqoZ(6KXJJp8zmo$wpc-q1E zYz6gu>j(MpH`>F5UorI5kYi?bdHg~|4xFP8x8;}lqI1Mw31z1{@3ygzUcEpwS%VJC z-`0vfNSNkzNkJhxv`$%pa&S{6osCuNbJ@_Swm@3;wX1cRfeq9YHP!aNq#-b%DM;W* z6=2xlS1D_wN4^WZy-I6VrGsc24Hiq;@PVTtsP9NcBFCaI-L2G5h13^3<0qtRL+lJg z(!^-@?uVcMBt@si`69Z@(V4r>C7*4pHZz_i9vVm?LrF%1yUSI7MFsOq{Fj6KEFrcP(P} z8ir$eyk?!bUJ0AE9P@{PQ5;C>hs160#$4cZ!fHfwn-!n4Jhoh0w@Jmb?}`<*5T-4T6pjX9lHT2}PVJVu`DW`Ei$=kVXeO4GAu7C?S7Y zd!J_Q=*xk`KR+%y+|gN4i#5ZRYY?3gP%oi2;$@!FU+_T)hpP*xGRs@KIBhzy1qlX% zeuog{8Ji==HobF}yV=HIRWMn4-*~48{TLKi_7`<-F;gN&3IlTMwt8@R^d$J8k;N^L zLidp%lWref*Q5-V@y>Xjh-#tZdX1$W&;P2o+>+37jCXzCL-9pc#*F_^# z*7S1hFAX~H1mE$UdVUDXinv*&z=DcYw+vI49@=UsqrReRV-Iil>R5-tjmZhe`hfa+ z1I$Z#=9ng+Jkay{K)Qi6diHK1+)j|SonA=jvIXim?%htBY$7A*+z)k};gEW+OLwA$ zjzeRQo)TK zZpE?UEMk*?u*pI@-HfKx4usz0Qg)mp(Zgf=hVP6YsK2XG2YIpi%7xkbY%J&P%g(q1 zj1uR|mwZCws95_m<}vAPUl-ejM^y;Z=b$_!UnI;yjERI1zfvYl@cqi~JR{!fT0NfT z69>^e$Janr`$}vFZ*_VXR3$>mudiY!`cq?Zz)z<`Yh62WvLg&A?$rR#igCOE49z+o zx$iQZov)tTM3*az2EMD}z7;I{iDd@rs_g}%1Ug)aEEVxVVP*t7sQEBZQ;L78EN(g4 zefkH~dz8U7(R%~X>r(-&K8oLQ`=3@{3;l$TC8^h3x$@G`eL_%N18cnYj zC49+D>$332#)$Fg#YJ&C(s;({(_jLv@LbWnu}F%a!gTHVZYIm#aMOijU8{}7QFMQP z>}cD*@%+hI;edy~{8wbBL2?Ng;Ek~$#i<7QR9EPnuvN{MiF(qRuDcdGSu%}7&1#T% z@I;Xu+8H4aa6Ezo9R2(*O(cm}WrtCg#_AWUqVEsBL3F%XI0Y%u=HeIa4STWbOwgU| zr0iMiIsQ&$V~VjI%HIq}V?Rklbh5Oo(%Y9iNhye{;thpEACMq(nia3X*ko+6vB;2T zc+^p6L*veK0@RLh8`ytp%@q$rxznC=K!~(K=PHF~9nVrh4vFl4H8!fr3#YD|?2w;d z9{BE4WX6xl^u1(y&w>sUER<6kH)$S1Ap(D>B|ZL!THu$u7lC=p{;eAwb2s*_7lu?? z0)5e7T?Pz-V34B1Vj*?w>wIOV65L{2jN;2}fv8m*BA#Vfy#qOe@^6$A0C2e{x-% zmb$g(&vHEDx2?15?E)8D*6~pT2rqpsODMer)Q_!``F=zhqg|0Jq04lxt60R?8B67d zwVcx*`d`jvrcND_>;`~2#(f>ikT#5wdHFNTJB#?GAP*u*j?q)Fp6KEm67QV{vE#AXHEEA-eOy>!ZsgzoE=fKd ze@iKU+ic?E%Mn?YY)|XHsw`vuR;yDk2Ti|}`xo(b%Bd3Q*Q(g<`If6u?u(~A*R}N~ z(&%{7Mx_>sTB#5io%p3pKcng7Z9&dpOd>p#f)fSC#+E%?>y-$2c$+ZH$kCgrL1}P6 z-l}f38ci%3z_j#z>Xm7Q2yCEO4>w~|p(`q=oCn+GkyOiX6N#n3PPifu#0B3HvPj!f zrE3^UB;R%v(yrJ1(1d&f#R&rIjgtw#X6qiAI9v;&ia+wrws5x+~Ug)X>R95vts)ko*#F#5-w zU0Xxbxeb08nzX9K+a9D(hMa)Mi$6QjmH zT3eg;dMIv($t`pqd-cBb_&X*$sU_Qs-5uK3hGIc2b2%A}OO4~6vUg%HN008x z?deRH5i@VU-p(W=NHcKg4;EQ8+8A&;|pJV%&D@KY1 zIn?TMDc2CPE6^AOZf#ZWxYErwOsihKs|;3I6Ap{P(@h7n6W+-AHeg{LL62(vL7cMt zTKgFan|`Qe`G#ke(GA?W2Sm{fR8r5?fIrtZ^aFu;?dWVTz5Yt#qh}*=eiGWtS(r=v+C5;-qXVv&-9|ODf^j+1@dlD6@7B9tH-uU|6cOrQqq4=teYm_ zyx&7RRBj7}iqSH=Wvy?Jq(_9pEp*}qT0c)tRduc!c0=*OOr;;~6ssS0#vQ*?Z-kJ0 zl7b?(3)jRgjvVheulQja+x+E6x23`WrDtOa=lE<^TU!ljX;68Z2-Bt^Yf^Qg^+v&R zFq5!jq;_n9A2U@wtwveSLSCg6RW@uw3k&LBQ<2$seWi_w4cGR-)|h5MiWLjpQ;$b$ z;X8o}Zkjy1Z=OrgnOBWJkDhVI^v455@c0C3H%%{N&*LtRQxiXq`88Q@lZ~N9!1Z;B z8Ms>`{k@TioGVnLw4|I6aQ=AY914X?Q8M9}7-u9*9=oRvC%#8zGkh|XZjGwD_P6@c}2W6ysK0fipA#A%NG?2;Dn z3UuCMd7tFtZGm%LV)w2hn-_^1?onJtTc)XHiLJW-H#A>{B>0)m>sQ858j75v@Nbp5?ah%RlN_wPF7+^BSO)F|n=`)qE8&v}h|KFDZ-T8HhT!&ZUhb33EbA*w z4tZ|f{k)d-EgEz+`{Xgfa(H3QxQD)H2Wb~5jfAQl!+TB`SAE+$QKXE5x3L>=6TYheIFWMWc6}{gM zxzI~|O}SKM9QV@s?8CEXKYnn#ziZsck zY9BwgvFTB3<7?=D#wwaA(>}P4ydqr!iX6Uo&U#ju@?njL&>wC=r7oL?9%8n#<)`zw z*m?+EP^qz!0V4U47oT4R-EHKI7)%tO1j)1N+RU;>kMZD0-j7#V?bKl`yK@$@D?6X=b_cM9?We&kz_3_HlQP#qY~Q6ob4K(&5`4W z*~fE+x}D@FgW)2_bccUY7uW3ZZLG~jdoeuO0IKyk60PEeL=wZCuU@6z5wvA zlHvV(&b#J2UFsb~F^>bG_Z2NIDl-M>3GaF3p3TC%44g!wRM@t-H5U)y3Q`|DqqzXR zo011#kCHn5f!4+)Q~IG)aAYoLx)E-%=Pd+mD_vYFJ9Ke)Y5*&errT##uEL@rZd2^u z&L8SlImeC!E=;%@T%Qr2i6Mf6TbPDeeM1oq7!KeSIK1~ze&!OHJkp++?-9eA?&9;l zv2UGBCDcz~U!b$gH&C0Yq!)eS5h-437yCV59$bs=x*S!U_ut}T3G0u|rR~$%9 zxDj5=heXXw;f1Yds^zLz;%fY~Nv-JBH}!)}P6~J%SlE#6BwVk2P$@52vPZ{wdsvly zh<8x7KXNI!oJ|*i+35RBo<7{*a8Ro&4K4lpZ0a_ zrAE6ms4HR{a=L)*0913lI0Y+F(cuW8aitZKqF{=zUOxN?rT!17+MvAS{BKqS1o!6z zk|LmB=-}wU7FN(8;J^`KWha@=7r@_iKtVu|fX{!fa`#_<0(K6gQ&TfAHLzAwqcwN< z{bsZCqVam*Mmg}`Zzco&_3xWaGz?51y;;cWuxAzRGJ0gJl`{rLe zms#4Fn(A0Sis1OdVP2LgPSyXyd|c_@yShL*n0BaCXqU58O*5Rgh>n>G9gj0~dx zVVIff8tBrkANsZ(z7>! zyFUWDemKckQon#crJ13Q)~}Onf1mObViU$L zSP+mQ0uT_=e+C46mb(iBo8>*!v6YUou9}&RwYG+}jRn`^yG&EFWR@+ifxF1JZZ_KfiW7{pTuoU$Od~rDbgJC!=&p%Zj1` z%x?(T`;X)w4)9s-?qmHJO2fw5Ov}u~+*s!cYgn%et@j2rr$Gn;0+`ajSGoJ4^J73w z4J#crfM}v&s{P1N--WY`3InKQ8xRm+F8;mB-79?_!)cjln>}e@#DZcp)PQk417gO* zS>?)k6!y1RfOvp=+dpO}Yh{oj(LfNm2kiCNhJpWFRWu>MGi1vtaxGXBa`vM3yMfdwK zjr$+tS?XB)LHD`6pME3*O1ne*-K*%PAEQ~B8~jQ(j|q0`2qK~Y=o@gM-<$w?=~0xm zhP90qAe*+%W4P_8F@|sm5RjKZ(tW76l>f#3ZL?N?a{9PE0*@KM>7fCSdgxRZ>;EI( zKfI?>33dR^$`3FQkYB)uF#m(6VNXQK_5OGZHNgIx0KAB=b&?Ma@lrH+o{W0gWv*Y(0O zFumD;XFRMFxUrw4>1$Z&KQdCkwn)w`ApRNy(miCUym*?WV{HBiE2e}&eGt%^6YB3% z;EDGn>#y+p2n^g)3||5e$_7vw(F2u*lKcT?W&U{eFr6xs%K{|k6U*Om_>_ObS!);@ zKO$Ywa|haDK(a-K-_;f&@FdO{IJ5T=mZM{&lQfX9u7HH~&^X+rpJZ9-Xjp1JHlb6= zo`ontxg`S(_ThvgDLzfpH?w<0GJ2cyjtyWAn1CSnuo6+$dXi;hYG7*hgxchvWv*}l zLq!B?_J>aTMgK|QU!~V0(v8?4&~gB#s|cj8hhgN_?049&bN>{FTToZ& zy8+)i2Yl<{kXq@c*h&=dpm|rw@FY6;Pxa z5ba1GP~Y4BnQHY*6_3bSa@}!KAdc>&%YD@ ziUNO{7Zn`-@K~S<@Z^Sm3kV-E;U4z+a{UxQy{*1(4AD;e~l1 z&b$H!`w&??{RgC#gB4J^1B=&3OfWZDK-wJ$H#Y$Gp}`EVK8<|B?=*NExSRl6J_gE` zhbcT1$afDHcP2X48o*Lf<4*=SYVeb96Y$}WK%x9lIFW;=d4^VxuFvn%)O!|z7&xr? zyRlfDJPCVZpw#T&w%dSeik9m4Fc^#o_S8Vljr7!jGX6;mbl}r3)Bp^`2l#pQz+j@E zKM6H3F*mccHa5`wlO8o0Wpf;WN!|hUNd17!_u{{hf30*i9t&W@)p|x&faOR5v-9!+ z7@Y9GfPWeLV}{OtGAKm|aG`*N3aI$stK7Yj>c4P-j?rUSryrDe8~_Z6XCQ?CLVvj= z8RP$8fklY%A051B-iSjG$TEjO1P21pzgM|?@>4V|V0CZst3mRJCobWmz()YVtQ4@( zht5OF{Dg4Y29`jyRkN{ttXzuE6zoy~oTn1dBT)4JdzHJNb3Vb-HM2C)u>NbEZ)x@z zb3P`wuN4^bGr*XDsrmORcaPpnc|6b+pxPniBjSWm6>s8IKM4t--qvZi6_+fgXP=A7C1@yg4 z9-CbP7|#g}puQ;sQVi+8GW{~W0*$9wf0dhRKt~L6c31!`cD#n zWoMx6sAg`dqx+bL%psB0Py!LW2#DYhGfbk<6HsdnOFbQHHFF1R{YT?&Uf>?r3V^Hw zM*h%dpe&w1K2_Zy61WS$28R0U=b^`u+x?C*)v>lSvo!isSj5PgNW29W076o~OBVAa z4ru&6wgQkC8!B}G2B`*A?GH_5Am}N{p6Vn>9?QTj0;ZA*6b=tZ=@s!5OZ(|{aEa{L zr!gP~bO6c+%CCQ~a`%k*r*Os^jt**1&BAfxu5B$K8?(^wQM5MWDWDb5zIwcEJ~59_ zGXQAr;(s((TK^R7sru+(d6&2!a8_EtB_7rb4XsbH>`ja<&9xqhBfk^{u>QIpdTdww z?=Zka|9&s<$AnRMC6_7)h=% zh-VlOF@Ku;ZYZb|f8YV31n6`=7NLHr?jH?4tPWOA{s8=|;r}PUEv!N02m~A?3l#)} z?(Yfu>vy?3?dkuQ`}Zp)YfE5l@#vbu^}tO;6_7d@u*ru)L*4v;;r|r1kC@YEidWsn z0Jjz3GCmNx;O;+j)pWECtTi-^AJcZ&0&&SpARhz+YYv774=@A;|E(tdf9&;dZT}-U zaH5Z%hL*!4@+051>-=h3F#E{vrQkAy3a_Baz<-HIP{5jsB;&M*a^Ecxo6PbxU$<NIHoqDVj}z<>_XLyi8z{dzy5Yw)O(MNF7gGy&P5H{kc&XQ}oS>gm>8aPSbm0HCs$ zfPp?NRn5GfqFL!YR`jAUNmw)jeJL81-*ds9&r_s7H4T4x3t)qPT@RDrPTK$Stjvu6 z>hk?*PFG*_3Quy8L|25(NN8!3=Hm1Ng8U9(bKQ@58FKH%az&nWnpay$5 ztCqm&dH>}hz?Uy<4IXcAGELU(90K7%9eBWRaD@K`|9g@As6Bdgj+|)$MU*>GC_hXy z#VG$3Zeas7AWVQ02p>}oZ>z;cBodI+Tc z9EQdL@4-a)z3}yV3TCJQ6p&_WPkbFh*!~UAPoP#h2PW^u1Jg^SeL^~8v&Xu#;FkQY zF+iMi2PW#_vNDhUagc_&InWh)Y(5ZA9VQEb;!O=$3qH((u0T!q&{Y3c*^_O*nu6`4 zGC-uyfNN1b7@r>7pHK#x2F3=~4r|5SF~ zVNqSpA78-4iY)>fEP%lR0qj^}uwZN`id|7$V1X6bC0oSuM!7cZF;j`%$b=xXU@4=vfzTROFQ+$q>im9 zkBBYW31Aw$$`lm#iTwAZ&!iFeF`xgzV&uns93Kp))c60@xrjJy-qI}+w|#$ahX}3u z0kgu7`At_EtBH+`5EQHqyPtML{aN)LrkRKB=^=pW&}^aAQMUI*v?lKiK(COTcyW_l zwwDNoPmvaWiL`hxS(!Gz>z2VE_eYFE_Gx=8(x?4s9?QY7cVW^b67!L9A=Gam*4PP* z*TV*51+^F9VjOF1q)hKxy1};sEP5fVh0nxh4x?$Y2+360z+q;~fww?Pz%cn`b~c(O zu`U5ps3sR5Esugv>hC9C{rT}U3SK0Zp3O6_4!Q?Jo(DtZF6mqB3{d8qs5MgK+tjkc z&NDFBws_6t^TfsqmR5RT*A??CB;G9&+f zx_TK+LMClaGU@dRXslv=rUZ0TPMLvmEIF?$x7oZ50n{9ch>k5r%F1HD+MB)&xM4`C z`Sm$xBaMUYCq=-K5VGmY8LPB|b!^0|Ek6+xexYGz9h(YzBBYd>-?NR3Aeb&6vQ$R} zGy}Ou*<<_NX>~9UDG<$*TbDj3XwXQl!DLn^&|SW11NUSGL#El7R^C9S!Z}fPD|$Z- z*pQnY;DF6UjFMlNALqzPBcl`xdCfdLx37k4Jc2Ru%1Zh_3KgjyqgGRMc%t&8(FgHn z>VOwr#8TU1k$UG+pja*S^7r7HI_f=CE}?UZ&l0*lrznXULzLN|RZ}}WE8HB?HE@EL z;B$Bro%n`g8O@P+-x1VylTz0l^1`@Q50EET-eo_MO&(KuA&K>w()&-&YfBxCfHjnb zb43x=_E@B;o`t}X8eO#Bpp@<{3mSW%#VD03%Gpu2aB5=f!)j865JU^CmI(B`YIJOf z)S3<)JU;6x1POs@*|(u*N^{bAS^<=OEnD7ZJ>g=&yCD4kD4)wVhtgN@4C|gjp?;Lc z_*x&@V<%`wp)3!Znpkx7%uphtZoAFLyU4dXA8b;>71&tKA@$(;6p`!cr1VA94Y9)$?-*l=?> zK>rkj-4()w2bK~JcDbB1#!;1lR}%Zslqv1cqb0)_A)|kiCQeNy zx{1+cIKRyZY?M*@68EL-bBau9t(FFf7R%$(U%l192(ghZQ~X^SiFLY^P{bSB^-e%j znDg5e@&sjSJTF!eO!$Jn??BCkv#_C(^P60*7Yk_=YsC`O04sZky8R7r(6+Zc1>5%< z4HNZzoVxernpI6ys<2{WJw@BRedH|~p|#VFuIgXYeeh@v=R6R_Jw8)8SE(!s!`T{b zjE3yQ{N(Y_GZnD#KQEp_p%00YEKzO11|sEEHgJ;JlpP}3NkWZ=EcjFuHh5G$GyGr05Dp4)yzPuIq9 zxz4>M8YE7r7tGfUuV=yNVtAo4rH_};tYli}e!=B0|Lq5z&z0+36Y5NkE?KPe5BV$o zduBtb*>b5CeN#~cqjc_h?(&L-F!bZ=$4WGa9T6my{&slMRUBDRT|lLRH}ofo z#YqOeQZ8Mq?{4iE7+pL3cvcU+fF+EF-C8Hc`y;b(-7g2RINjpZ-bjWb9NnJi>geKk72 zl}eT0*g>YA(i;g18ySnG#EjLfnbOA->KTMM!xtbL=TRiQ1gmwiWM%M5pJiv*`!CW| zm4{71EJ>gBh(HxJ(hCG*fTA}D`+3Wh{vc_B^Wpb<9SfSh6i1}$ImyQ7{+JNTY%(@$ zA&{v4v@v(jVEUUED`elER+)1IiN;tqI;Hj7rp>Z*8vttsm?x*KKWES|#pBtn9l!r+ zC|;0Q=OAyMxwAw#s%n$%n0ioymAgoirwPXSG$#h-OoI-Eb4l#sm@YZ2w4)=GcOHS6{xMT#pKY!UMjI zGX9)995b;9Z!4d1pJVg%4KH_FdZJnzK zMk@+$4`%uN;s;Zih)4kQvpp7RtdNBUAf=t{4J~F(sOY6qwO%5hjE7Z3;;}Q5cqOIZ z7uxV$beH;1UiA=fSYbhO z8##?#7TV~(&pLfTGP^2iZitj+W8v56URHsW%yW%wsTE=K=C{Ht(JcnV>eY z(+zBIT!}dEOzn(cuySt}Te+c66p6x&FEBpjqxM+2EwMcKl^c?;Kt$7tL9eBXv4I&Y zhJ6CyXQ0`?F5w;Sr4lenOH6To!+Dznu{us5nDLIj_CE@+L^MB8Zi=n0qJ?XZ%arCj zRpl+lenLcRw@uefw^{JY^NKmC3raXNwoyT&?EK9U_aWdC%r8F^>COtmi7k3V+MH)6 zA>J$m4IX&3q5?1(@{rM^p_c31s{*;oZ%<-v4W_*kS%)n&lZvDUsDC0jmn{KMe~ zAgD23k0KQQwMb=Z3u!_-4sxr!?HF>-IK0O4X4j~WfQHQk#9JyM7<1LtaRCfvI~Few z3k(#&u>GPZvy0P5A_LHxts03%VIM6lQrXr581fW)W1_)}AwRO+`+BG`dU85z-&Vx3 z9-5+Y>P%hmG(;Vj>2k*&6)eCdph7|g?8EVXvsrfc*hxN{^+yO$iR=g)JpseYc%}ab zI*Tf%vwjHzT2g`;y#<61>G(c(8QM#%*GYMBI&;08_0~?h2_n?|3V`B~am>7b(?bpRmlk2He{btDb zJ%98nnHpzGq{?x>ySO#T!S49W!Sa1ib=Q)i+C-{9Ej_hWkFyxQ8N-LXw#OoUGyGpL z4OHo=k#5zl0g!V8;Z9ll}t@SX-Uss=*-luGP)Ph9k##+Yy+6rZIh`bvkfN7umW>N9^H&=>0>w* zp4nhw$xP!&$_D1G4O4|cvmLOX&M(Y>u}BZM2-w!7K+$=X@g4K}c3Tup8#>6K$@@xxiXGR* z4&T>Ef?ju=k-s~q<90Ca1+d7~7D_5S4P5>HsCLn?+Bb-O{NVfeRHKnb7D5#VKla0; zTJC`6!@=^gR(_1 zvq=e1;b!j?*9%9IPzalY#rm1enphlY-n0ZJZjYd>fA!zfqpM-qUdRxea>RRWOCqwf z<<|a3rB{>N&zl|c!t&baqf)it{y<33|L_NJORBipvRvKsw_;&s`{8vxxW93r8~-<0 zxd+?AiWBE;GL3VBO19!xm!rjo32B9|j^sV8M;e^SOND;f!2{mB*7Xqqi>_CV5LIjj z&K`4O1B%j@;^kvb?k|8AHfd3>qs9*{9DBpNHb%N@zr|#cBEJ^V$ST8@+*wP;V7iZC zpnOXCC|Lxe&)F~iu+L!-rhr|^z^BdW69pvJ3_^|0f9iA93SdrR0{GX)W|KuI(LE>^ zbN|RW1Up;aMgG!KWvY;+kJpm5-hFL{x0WCj3iqIO?FvSgv38_CfpMv!BPDQ!) z&#e&f*m(saa&3@0SC57EuNBk&yetukc|-!0p8WC1$4CQ~z!UP?Z@yZ9vcAqzth74) zKiUbgJTXXqr4KtLU=?f&km_H1CO+NliFr(x)B2qe&J|Eo7qiT=o<)y3BSO_aRkw-~4Hhg<&OrfeyFF9~QQw3nbAvp@z z|F1?_sqiFGa80mi+hdVVbrAv!_Ms>o`~Qoy$G^ue=qbb%q%BIxfcqu?*eIZv;@61% zjl#zw<(7yoyl{^7W=E*W^Em2>YqD`~yNcB=`PlPqs7z>WRGgBWep_aI$*xSV1y%B- zqXS5iu$DS``>O>bkg?rFJoG3UF8;MhPSF%8N|TTfk*tk2#Zl8T-v3F;=U=01rmno7 zeVvY?X%h7#w8BevZ;gJslbv0}$w%25cDW&@!K@R|xJfwr+Ji6540J+O1#`gr1m8bM z-Y9mjQ$#_@hTwHQzvBw_-Be{EBOf?c-l2Jg&HDuF@&1FZso>Ose0+j4`Yy#{+uJ&- z8OLe-%W)?7{0^v#k!JVnD>+ZVmfH;d`X!ah;BHjCoBH_druEG-BkGQMS zgWBF0-+9cXePf43y7H2S>8Y^4ZB4BP8NkFB%aj6NQy85Y<|=3fa9c6JZ!*ML1by=f zoa{V%sqi}Eb-QJ&^y^4`VU}SuY$y`?wWum)6hF`84 zeg~Wt#W-1R6o(z9rON0*1FQGDi5T+PAo&_TSe@cvhpTB5c8#21$0o$}o29tiNi`X< zo%f`-KNs)>J7$?5XSHS7=yiBgtUcRfkuC=)kP4R!IoNympV#XMOAkSbhBvD>O-Lk8 zdl2SOF}_ppSR&OPU1 zrfWkto;KaGXg=R4!bD*Ag?&7N(9rUbuxIlzSy$j8`JkjR(>QY?c`_|z!KWG8e)vqy zM7}N8A~pGj1c{dGjF7Wkb1}d&SQWg_K7UpKLhB;AS6Ja}R5FfFsm8(C^3nV8c^YK` zi0+!HRi%w*J`{BqCcrD|$z=hHK2><}&qKMD0Gf+{%cm%Aw+K+QCPr;eFhvy9C5ahq z)p_IcJgK$m4|_zAteG7lkXIMabB|$} z6W}TNcrq)W!Waznk&6+z`f9k&P&E&0kDt9Q&j=1n0a$@<6m?$vx+*WN16Irl42@UP z*yjS4kv?8_)4kh^4oJSfMgZVbrkAe>Qk*t64t_F@-m$;YWA_vv80ad5JKj}}Eag@_ z8xY(z+;acGBQr2K3tS~{nitDb6f^4OWH1_2^-`TD2t*cCN%@)kz9IoiP>;qJcnAwP z^zzaq3zCz)f%0MPt4VRRBdJ{e)8)6<;{p>^7)ZRP*ZK-5;^fp_KkmF6K;!-8I&x`5 z!Gu>E_B<-egX35q3+sHN)52wVxE3Wg!^@(k!t zVyr1QF|amAUXOZ>^?C+x|GYfihmas0c{t;nYUB5N!+y%lluy`L4TZs#4<^cmq`v7p zcQCA{W1ifF^7wG;6ix9Rs|CKAP+%HeHGv6J`A$K=koDc zcGI*(vK3}v+S_xj;BNJ>CEi7z|BdFbk5W+^I&4S)Ss(j}%al5!E>i3rN7Rou^uSM- z%z$L!$FH;$3WF{m`p(z0t*X^>#h^mbWyL#LzvF~BC@xTHo~w0A>;%f2VwBORDT^W&|7&Jo0^5G~OCd|14i(V+WBu^1E)2qF2m52}SQmoaPsY%LIxd5T>{J zMK8Q#sbcWs=d4Dm2t&QFspoAA2?bzjd>g7>vFODn-hT2kCG#-~Bnm#~ z-iDdjwr@U$#;=g0a*n}_-F#dNsZlEDKbYz0laH9+rlI_0rprm0Ty{J)xxt+qxTEJ{ zWP5Jdx$(d_iyjnvE{R#9F8aW)9IicwFQ^9T_>p#hD5l|lWS!ASMStzS@Kf2a&=Jra zT!QVfNaJxirhW9sCAv1vfn_b>nbh?Cj=euPPf;Pbbp1*$<@9G_s<`=`iG}I4KK3sc znbI+b8X_r0#u7TwqXD~V<0H6Jdl-7c9eEf&o`HKAnkre!{sTevEC3}SpM$%wJr-$G zX#vb`Uy5)WIlJ2a(heB*e4m;6x+e6rL4G+15GX~K}#eRn08g&2M1Fn0br`+jo zi=uHjca;!L1(eivdo#virA>u&{6tjNiBJjn@CbQ_M4Ol^X+OY&yY`eXh~r<=Fs3gY zbHq2UsQgwnX!*>oDE`)k*W{}$Yp2q@!bT=y3VM0`+&T*C-<&KT=;H50EMpQ1_*B$` z)!J5SefA%P4-RPK<2CmFq-b$jZ>&=OMv>3NJeO^7Qomw48W$1quSH5J3CeC;(&21^ zhJ7hoYaqWuQtrvTY0;?0)P!mCK5&vnS!NrZP^*hJFE9)l|0d+dye9njD^qo*1bn%P zTrNEaKWu|e6V=WRa#6E?Q-&su76*aA_on8*dgG3UDe{iit5=n&Mh$L@!>x;IY+BNv z+&Lb0Bxn#Ubte*q&$zj}WP1>U6a|Bp95JQ5GBH9Xu99Q-Kjqis2}0P7 zV4Tn6{z}gO`d1=xs0-cyl#}_%XVvaOFpx;p@LF+yrDm=FaV!b?WZdgNlB}vQa*@h- z3qRpc|CypDC?yqz&#$q*9vrPURUZ4Q1(ZNFlBe+O#l%%Wwg=~NdzAoWsXVhl#YWBC zpQE;Rfgac=C3ybHf6q@;$7=)|*v{8|N6x^Kzm65!+9o~oQ<^^iTK;5>Iv!tOVqZ2C zU7B`x`r_|%;14GvY2(*am%;SkVO?2DQ~7A^?MmO5MpQ?lT91=FGF*YEm@Sk$6<(Ts zEu|AQ0xPjS7O7pd0#mdp(9`L~5AOi^69eaQ*J2cKXx}wcfhurz;fb$N-3QpP#8-iTmoK}L-yv?Uq0e2qau;M1-E6RZ|^=q4$=%B z&BHbu%sQV=SHQ7cp9pV3U+>tJ2fscJMATVrk417{Spp5;k&B8$KfKYTQm=#3NK3-^cNkd`V38z+2* zxO=Yxkp3iJ|MUGX?8TVfvHR&^(Ao|Y*& zU$N5snl$ro>fhL(-67qpZDN04iLGS#8++L@rP6;1XdzuY zcIw%u6GeM+=`#!afXz@8j`+gJ;lBm69-aEO4{qPLz5VrIOt87y?7rbp))4&c>jxI8 z)LQ{+K$lLPLgbwL=fBV+0;>k#=Z#;{lPRT%IQX)GVRS^{jpnj@TbXFT)md}^j!y-Z zaWCq)0_~kZG?PB5FoF}juqyZKFYkt2WU;*FGC;%&>(ntcEVx(qkC+^)Z4TQUR!+fU J?aWFx{{_Qxt~vk! literal 0 HcmV?d00001 diff --git a/Lib/enum.py b/Lib/enum.py index af561383..eaa517e2 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -487,7 +487,7 @@ def __setitem__(self, key, value): # accepts iterable as multiple arguments? value = t(auto_valued) except TypeError: - # then pass them in singlely + # then pass them in singly value = t(*auto_valued) self._member_names[key] = None if non_auto_store: @@ -592,19 +592,13 @@ def __new__(metacls, cls, bases, classdict, *, boundary=None, _simple=False, **k classdict['_all_bits_'] = 0 classdict['_inverted_'] = None try: - exc = None enum_class = super().__new__(metacls, cls, bases, classdict, **kwds) except Exception as e: - # since 3.12 the line "Error calling __set_name__ on '_proto_member' instance ..." - # is tacked on to the error instead of raising a RuntimeError - # recreate the exception to discard - exc = type(e)(str(e)) - exc.__cause__ = e.__cause__ - exc.__context__ = e.__context__ - tb = e.__traceback__ - if exc is not None: - raise exc.with_traceback(tb) - # + # since 3.12 the note "Error calling __set_name__ on '_proto_member' instance ..." + # is tacked on to the error instead of raising a RuntimeError, so discard it + if hasattr(e, '__notes__'): + del e.__notes__ + raise # update classdict with any changes made by __init_subclass__ classdict.update(enum_class.__dict__) # diff --git a/Lib/filecmp.py b/Lib/filecmp.py index 30bd900f..6fdb48f7 100644 --- a/Lib/filecmp.py +++ b/Lib/filecmp.py @@ -160,12 +160,14 @@ def phase2(self): # Distinguish files, directories, funnies ok = True try: a_stat = os.stat(a_path) - except OSError: + except (OSError, ValueError): + # See https://github.com/python/cpython/issues/122400 + # for the rationale for protecting against ValueError. # print('Can\'t stat', a_path, ':', why.args[1]) ok = False try: b_stat = os.stat(b_path) - except OSError: + except (OSError, ValueError): # print('Can\'t stat', b_path, ':', why.args[1]) ok = False @@ -280,12 +282,12 @@ def cmpfiles(a, b, common, shallow=True): # Return: # 0 for equal # 1 for different -# 2 for funny cases (can't stat, etc.) +# 2 for funny cases (can't stat, NUL bytes, etc.) # def _cmp(a, b, sh, abs=abs, cmp=cmp): try: return not abs(cmp(a, b, sh)) - except OSError: + except (OSError, ValueError): return 2 diff --git a/Lib/fractions.py b/Lib/fractions.py index 88b418fe..e3a8bbcf 100644 --- a/Lib/fractions.py +++ b/Lib/fractions.py @@ -825,8 +825,10 @@ def __pow__(a, b): # A fractional power will generally produce an # irrational number. return float(a) ** float(b) - else: + elif isinstance(b, (float, complex)): return float(a) ** b + else: + return NotImplemented def __rpow__(b, a): """a ** b""" diff --git a/Lib/functools.py b/Lib/functools.py index 1f1ba638..f6849899 100644 --- a/Lib/functools.py +++ b/Lib/functools.py @@ -238,12 +238,14 @@ def reduce(function, sequence, initial=_initial_missing): """ reduce(function, iterable[, initial]) -> value - Apply a function of two arguments cumulatively to the items of a sequence - or iterable, from left to right, so as to reduce the iterable to a single - value. For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates - ((((1+2)+3)+4)+5). If initial is present, it is placed before the items - of the iterable in the calculation, and serves as a default when the - iterable is empty. + Apply a function of two arguments cumulatively to the items of an iterable, from left to right. + + This effectively reduces the iterable to a single value. If initial is present, + it is placed before the items of the iterable in the calculation, and serves as + a default when the iterable is empty. + + For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) + calculates ((((1 + 2) + 3) + 4) + 5). """ it = iter(sequence) @@ -372,15 +374,13 @@ def __init__(self, func, /, *args, **keywords): self.keywords = keywords def __repr__(self): - args = ", ".join(map(repr, self.args)) - keywords = ", ".join("{}={!r}".format(k, v) - for k, v in self.keywords.items()) - format_string = "{module}.{cls}({func}, {args}, {keywords})" - return format_string.format(module=self.__class__.__module__, - cls=self.__class__.__qualname__, - func=self.func, - args=args, - keywords=keywords) + cls = type(self) + module = cls.__module__ + qualname = cls.__qualname__ + args = [repr(self.func)] + args.extend(map(repr, self.args)) + args.extend(f"{k}={v!r}" for k, v in self.keywords.items()) + return f"{module}.{qualname}({', '.join(args)})" def _make_unbound_method(self): def _method(cls_or_self, /, *args, **keywords): diff --git a/Lib/http/cookies.py b/Lib/http/cookies.py index 35ac2dc6..6b9ed24a 100644 --- a/Lib/http/cookies.py +++ b/Lib/http/cookies.py @@ -184,8 +184,13 @@ def _quote(str): return '"' + str.translate(_Translator) + '"' -_OctalPatt = re.compile(r"\\[0-3][0-7][0-7]") -_QuotePatt = re.compile(r"[\\].") +_unquote_sub = re.compile(r'\\(?:([0-3][0-7][0-7])|(.))').sub + +def _unquote_replace(m): + if m[1]: + return chr(int(m[1], 8)) + else: + return m[2] def _unquote(str): # If there aren't any doublequotes, @@ -205,36 +210,13 @@ def _unquote(str): # \012 --> \n # \" --> " # - i = 0 - n = len(str) - res = [] - while 0 <= i < n: - o_match = _OctalPatt.search(str, i) - q_match = _QuotePatt.search(str, i) - if not o_match and not q_match: # Neither matched - res.append(str[i:]) - break - # else: - j = k = -1 - if o_match: - j = o_match.start(0) - if q_match: - k = q_match.start(0) - if q_match and (not o_match or k < j): # QuotePatt matched - res.append(str[i:k]) - res.append(str[k+1]) - i = k + 2 - else: # OctalPatt matched - res.append(str[i:j]) - res.append(chr(int(str[j+1:j+4], 8))) - i = j + 4 - return _nulljoin(res) + return _unquote_sub(_unquote_replace, str) # The _getdate() routine is used to set the expiration time in the cookie's HTTP # header. By default, _getdate() returns the current time in the appropriate # "expires" format for a Set-Cookie header. The one optional argument is an # offset from now, in seconds. For example, an offset of -3600 means "one hour -# ago". The offset may be a floating point number. +# ago". The offset may be a floating-point number. # _weekdayname = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] diff --git a/Lib/idlelib/HISTORY.txt b/Lib/idlelib/HISTORY.txt index 731fabd1..a601b25b 100644 --- a/Lib/idlelib/HISTORY.txt +++ b/Lib/idlelib/HISTORY.txt @@ -277,7 +277,7 @@ Command to format a paragraph. Debug menu: JIT (Just-In-Time) stack viewer toggle -- if set, the stack viewer -automaticall pops up when you get a traceback. +automatically pops up when you get a traceback. Windows menu: diff --git a/Lib/idlelib/Icons/README.txt b/Lib/idlelib/Icons/README.txt index d91c4d5d..e245bc0b 100644 --- a/Lib/idlelib/Icons/README.txt +++ b/Lib/idlelib/Icons/README.txt @@ -1,13 +1,51 @@ -The IDLE icons are from https://bugs.python.org/issue1490384 +IDLE-PYTHON LOGOS -Created by Andrew Clover. +These are sent to tk on Windows, *NIX, and non-Aqua macOS +in pyshell following "# set application icon". -The original sources are available from Andrew's website: + +2006?: Andrew Clover made variously sized python icons for win23. https://www.doxdesk.com/software/py/pyicons.html -Various different formats and sizes are available at this GitHub Pull Request: -https://github.com/python/cpython/pull/17473 +2006: 16, 32, and 48 bit .png versions were copied to CPython +as Python application icons, maybe in PC/icons/py.ico. +https://github.com/python/cpython/issues/43372 + +2014: They were copied (perhaps a bit revised) to idlelib/Icons. +https://github.com/python/cpython/issues/64605 +.gif versions were also added. + +2020: Add Clover's 256-bit image. +https://github.com/python/cpython/issues/82620 +Other fixups were done. + +The idle.ico file used for Windows was created with ImageMagick: + $ convert idle_16.png idle_32.png idle_48.png idle_256.png idle.ico +** This needs redoing whenever files are changed. +?? Do Start, Desktop, and Taskbar use idlelib/Icons files? + +Issue added Windows Store PC/icons/idlex44.png and .../idlex150.png. +https://github.com/python/cpython/pull/22817 +?? Should these be updated with major changes? + +2022: Optimize .png images in CPython repository with external program. +https://github.com/python/cpython/pull/21348 +idle.ico (and idlex##) were not updated. + +The idlexx.gif files are only needed for *nix running tcl/tk 8.5. +As of 2022, this was known true for 1 'major' Linux distribution. +(Same would be true for any non-Aqua macOS with 8.5, but now none?) +Can be deleted when we require 8.6 or it is known always used. + +Future: Derivatives of Python logo should be submitted for approval. +PSF Trademark Working Group / Committee psf-trademarks@python.org +https://www.python.org/community/logos/ # Original files +https://www.python.org/psf/trademarks-faq/ +https://www.python.org/psf/trademarks/ # Usage. + + +OTHER GIFS: These are used by browsers using idlelib.tree. +At least some will not be used when tree is replaced by ttk.Treeview. -The idle.ico file was created with ImageMagick: - $ convert idle_16.png idle_32.png idle_48.png idle_256.png idle.ico +Edited 2024 August 26 by TJR. diff --git a/Lib/idlelib/News3.txt b/Lib/idlelib/News3.txt index d60f9242..2735ad7e 100644 --- a/Lib/idlelib/News3.txt +++ b/Lib/idlelib/News3.txt @@ -4,6 +4,16 @@ Released after 2023-10-02 ========================= +gh-120083: Add explicit black IDLE Hovertip foreground color needed for +recent macOS. Fixes Sonoma showing unreadable white on pale yellow. +Patch by John Riggles. + +gh-122482: Change About IDLE to direct users to discuss.python.org +instead of the now unused idle-dev email and mailing list. + +gh-78889: Stop Shell freezes by blocking user access to non-method +sys.stdout.shell attributes, which are all private. + gh-78955: Use user-selected color theme for Help => IDLE Doc. gh-96905: In idlelib code, stop redefining built-ins 'dict' and 'object'. @@ -567,14 +577,14 @@ bpo-33679: Enable theme-specific color configuration for Code Context. color setting, default or custom, on the extensions tab, that applied to all themes.) For built-in themes, the foreground is the same as normal text and the background is a contrasting gray. Context colors for -custom themes are set on the Hightlights tab along with other colors. +custom themes are set on the Highlights tab along with other colors. When one starts IDLE from a console and loads a custom theme without definitions for 'context', one will see a warning message on the console. bpo-33642: Display up to maxlines non-blank lines for Code Context. If there is no current context, show a single blank line. (Previously, -the Code Contex had numlines lines, usually with some blank.) The use +the Code Context had numlines lines, usually with some blank.) The use of a new option, 'maxlines' (default 15), avoids possible interference with user settings of the old option, 'numlines' (default 3). @@ -728,7 +738,7 @@ not affect their keyset-specific customization after 3.6.3. and vice versa. Initial patch by Charles Wohlganger, revised by Terry Jan Reedy. -bpo-31051: Rearrange condigdialog General tab. +bpo-31051: Rearrange configdialog General tab. Sort non-Help options into Window (Shell+Editor) and Editor (only). Leave room for the addition of new options. Patch by Terry Jan Reedy. diff --git a/Lib/idlelib/TODO.txt b/Lib/idlelib/TODO.txt index e2f1ac0f..41b86b0c 100644 --- a/Lib/idlelib/TODO.txt +++ b/Lib/idlelib/TODO.txt @@ -179,7 +179,7 @@ it -- i.e. you can only edit the current command, and the cursor can't escape from the command area. (Albert Brandl) - Set X11 class to "idle/Idle", set icon and title to something -beginning with "idle" -- for window manangers. (Randall Hopper) +beginning with "idle" -- for window managers. (Randall Hopper) - Config files editable through a preferences dialog. (me) DONE diff --git a/Lib/idlelib/config.py b/Lib/idlelib/config.py index 6a5acac9..d10c88a4 100644 --- a/Lib/idlelib/config.py +++ b/Lib/idlelib/config.py @@ -600,7 +600,7 @@ def GetCoreKeys(self, keySetName=None): """ # TODO: = dict(sorted([(v-event, keys), ...]))? keyBindings={ - # vitual-event: list of key events. + # virtual-event: list of key events. '<>': ['', ''], '<>': ['', ''], '<>': ['', ''], diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index eedf97bf..4d2adb48 100644 --- a/Lib/idlelib/configdialog.py +++ b/Lib/idlelib/configdialog.py @@ -111,7 +111,7 @@ def create_widgets(self): load_configs: Load pages except for extensions. activate_config_changes: Tell editors to reload. """ - self.frame = frame = Frame(self, padding="5px") + self.frame = frame = Frame(self, padding=5) self.frame.grid(sticky="nwes") self.note = note = Notebook(frame) self.extpage = ExtPage(note) diff --git a/Lib/idlelib/editor.py b/Lib/idlelib/editor.py index 7bfa0932..c76db20c 100644 --- a/Lib/idlelib/editor.py +++ b/Lib/idlelib/editor.py @@ -914,7 +914,7 @@ def RemoveKeybindings(self): def ApplyKeybindings(self): """Apply the virtual, configurable keybindings. - Alse update hotkeys to current keyset. + Also update hotkeys to current keyset. """ # Called from configdialog.activate_config_changes. self.mainmenu.default_keydefs = keydefs = idleConf.GetCurrentKeySet() diff --git a/Lib/idlelib/extend.txt b/Lib/idlelib/extend.txt index b482f76c..2522758c 100644 --- a/Lib/idlelib/extend.txt +++ b/Lib/idlelib/extend.txt @@ -52,7 +52,7 @@ should probably be refined in the future.) Extensions are not required to define menu entries for all the events they implement. (They are also not required to create keybindings, but in that -case there must be empty bindings in cofig-extensions.def) +case there must be empty bindings in config-extensions.def) Here is a partial example from zzdummy.py: diff --git a/Lib/idlelib/grep.py b/Lib/idlelib/grep.py index ef143499..42048ff2 100644 --- a/Lib/idlelib/grep.py +++ b/Lib/idlelib/grep.py @@ -190,7 +190,7 @@ def grep_it(self, prog, path): def _grep_dialog(parent): # htest # - from tkinter import Toplevel, Text, SEL, END + from tkinter import Toplevel, Text, SEL from tkinter.ttk import Frame, Button from idlelib.pyshell import PyShellFileList diff --git a/Lib/idlelib/help.html b/Lib/idlelib/help.html index 827d230b..2a4adc6a 100644 --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html @@ -5,7 +5,7 @@ - IDLE — Python 3.13.0a2 documentation + IDLE — Python 3.14.0a0 documentation @@ -18,7 +18,7 @@ @@ -26,6 +26,7 @@ + @@ -45,6 +46,8 @@ + + @@ -184,7 +187,7 @@

    Navigation

  1. - 3.13.0a2 Documentation » + 3.14.0a0 Documentation »
  2. @@ -554,7 +557,7 @@

    Key bindingsControl key on Windows and -Unix and the Command key on macOS. (And all such dicussions +Unix and the Command key on macOS. (And all such discussions assume that the keys have not been re-bound to something else.)

    @@ -694,7 +697,7 @@

    Shell window -
  3. C-c attemps to interrupt statement execution (but may fail).

  4. +
  5. C-c attempts to interrupt statement execution (but may fail).

  6. C-d closes Shell if typed at a >>> prompt.

  7. Alt-p and Alt-n (C-p and C-n on macOS) retrieve to the current prompt the previous or next previously @@ -1136,7 +1139,7 @@

    Navigation

  8. - 3.13.0a2 Documentation » + 3.14.0a0 Documentation »
  9. @@ -1180,7 +1183,7 @@

    Navigation



    - Last updated on Jan 17, 2024 (06:57 UTC). + Last updated on Oct 14, 2024 (20:27 UTC). Found a bug?
    diff --git a/Lib/idlelib/help_about.py b/Lib/idlelib/help_about.py index aa1c3528..81c65f62 100644 --- a/Lib/idlelib/help_about.py +++ b/Lib/idlelib/help_about.py @@ -85,15 +85,18 @@ def create_widgets(self): byline = Label(frame_background, text=byline_text, justify=LEFT, fg=self.fg, bg=self.bg) byline.grid(row=2, column=0, sticky=W, columnspan=3, padx=10, pady=5) - email = Label(frame_background, text='email: idle-dev@python.org', - justify=LEFT, fg=self.fg, bg=self.bg) - email.grid(row=6, column=0, columnspan=2, sticky=W, padx=10, pady=0) + + forums_url = "https://discuss.python.org" + forums = Label(frame_background, text="Python forums: "+forums_url, + justify=LEFT, fg=self.fg, bg=self.bg) + forums.grid(row=6, column=0, sticky=W, padx=10, pady=0) + forums.bind("", lambda event: webbrowser.open(forums_url)) docs_url = ("https://docs.python.org/%d.%d/library/idle.html" % sys.version_info[:2]) docs = Label(frame_background, text=docs_url, justify=LEFT, fg=self.fg, bg=self.bg) docs.grid(row=7, column=0, columnspan=2, sticky=W, padx=10, pady=0) - docs.bind("", lambda event: webbrowser.open(docs['text'])) + docs.bind("", lambda event: webbrowser.open(docs_url)) Frame(frame_background, borderwidth=1, relief=SUNKEN, height=2, bg=self.bg).grid(row=8, column=0, sticky=EW, @@ -123,9 +126,7 @@ def create_widgets(self): height=2, bg=self.bg).grid(row=11, column=0, sticky=EW, columnspan=3, padx=5, pady=5) - idle = Label(frame_background, - text='IDLE', - fg=self.fg, bg=self.bg) + idle = Label(frame_background, text='IDLE', fg=self.fg, bg=self.bg) idle.grid(row=12, column=0, sticky=W, padx=10, pady=0) idle_buttons = Frame(frame_background, bg=self.bg) idle_buttons.grid(row=13, column=0, columnspan=3, sticky=NSEW) diff --git a/Lib/idlelib/idle_test/example_stub.pyi b/Lib/idlelib/idle_test/example_stub.pyi index 17b58010..abcdbc17 100644 --- a/Lib/idlelib/idle_test/example_stub.pyi +++ b/Lib/idlelib/idle_test/example_stub.pyi @@ -1,4 +1,4 @@ -" Example to test recognition of .pyi file as Python source code. +# An example file to test recognition of a .pyi file as Python source code. class Example: def method(self, argument1: str, argument2: list[int]) -> None: ... diff --git a/Lib/idlelib/idle_test/test_outwin.py b/Lib/idlelib/idle_test/test_outwin.py index d6e85ad6..81f4aad7 100644 --- a/Lib/idlelib/idle_test/test_outwin.py +++ b/Lib/idlelib/idle_test/test_outwin.py @@ -1,6 +1,7 @@ "Test outwin, coverage 76%." from idlelib import outwin +import sys import unittest from test.support import requires from tkinter import Tk, Text @@ -18,6 +19,10 @@ def setUpClass(cls): root.withdraw() w = cls.window = outwin.OutputWindow(None, None, None, root) cls.text = w.text = Text(root) + if sys.platform == 'darwin': # Issue 112938 + cls.text.update = cls.text.update_idletasks + # Without this, test write, writelines, and goto... fail. + # The reasons and why macOS-specific are unclear. @classmethod def tearDownClass(cls): diff --git a/Lib/idlelib/outwin.py b/Lib/idlelib/outwin.py index 5ed3f35a..8baa6575 100644 --- a/Lib/idlelib/outwin.py +++ b/Lib/idlelib/outwin.py @@ -112,7 +112,7 @@ def write(self, s, tags=(), mark="insert"): assert isinstance(s, str) self.text.insert(mark, s, tags) self.text.see(mark) - self.text.update_idletasks() + self.text.update() return len(s) def writelines(self, lines): diff --git a/Lib/idlelib/pyshell.py b/Lib/idlelib/pyshell.py index d8b2652d..e882c6cb 100755 --- a/Lib/idlelib/pyshell.py +++ b/Lib/idlelib/pyshell.py @@ -706,7 +706,7 @@ def prepend_syspath(self, filename): del _filename, _sys, _dirname, _dir \n""".format(filename)) - def showsyntaxerror(self, filename=None): + def showsyntaxerror(self, filename=None, **kwargs): """Override Interactive Interpreter method: Use Colorizing Color the offending position instead of printing it and pointing at it diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py index 53e80a9b..2faeba67 100644 --- a/Lib/idlelib/run.py +++ b/Lib/idlelib/run.py @@ -101,11 +101,11 @@ def handle_tk_events(tcl=tcl): # Thread shared globals: Establish a queue between a subthread (which handles # the socket) and the main thread (which runs user code), plus global -# completion, exit and interruptable (the main thread) flags: +# completion, exit and interruptible (the main thread) flags: exit_now = False quitting = False -interruptable = False +interruptible = False def main(del_exitfunc=False): """Start the Python execution server in a subprocess @@ -436,6 +436,9 @@ class StdioFile(io.TextIOBase): def __init__(self, shell, tags, encoding='utf-8', errors='strict'): self.shell = shell + # GH-78889: accessing unpickleable attributes freezes Shell. + # IDLE only needs methods; allow 'width' for possible use. + self.shell._RPCProxy__attributes = {'width': 1} self.tags = tags self._encoding = encoding self._errors = errors @@ -572,14 +575,14 @@ def __init__(self, rpchandler): self.locals = {} def runcode(self, code): - global interruptable + global interruptible try: self.user_exc_info = None - interruptable = True + interruptible = True try: exec(code, self.locals) finally: - interruptable = False + interruptible = False except SystemExit as e: if e.args: # SystemExit called with an argument. ob = e.args[0] @@ -605,7 +608,7 @@ def runcode(self, code): flush_stdout() def interrupt_the_server(self): - if interruptable: + if interruptible: thread.interrupt_main() def start_the_debugger(self, gui_adap_oid): diff --git a/Lib/idlelib/searchbase.py b/Lib/idlelib/searchbase.py index 64ed50c7..c68a6ca3 100644 --- a/Lib/idlelib/searchbase.py +++ b/Lib/idlelib/searchbase.py @@ -86,7 +86,7 @@ def create_widgets(self): top.wm_iconname(self.icon) _setup_dialog(top) self.top = top - self.frame = Frame(top, padding="5px") + self.frame = Frame(top, padding=5) self.frame.grid(sticky="nwes") top.grid_columnconfigure(0, weight=100) top.grid_rowconfigure(0, weight=100) diff --git a/Lib/idlelib/tooltip.py b/Lib/idlelib/tooltip.py index 3983690d..df5b1fe1 100644 --- a/Lib/idlelib/tooltip.py +++ b/Lib/idlelib/tooltip.py @@ -144,7 +144,8 @@ def hidetip(self): class Hovertip(OnHoverTooltipBase): "A tooltip that pops up when a mouse hovers over an anchor widget." - def __init__(self, anchor_widget, text, hover_delay=1000): + def __init__(self, anchor_widget, text, hover_delay=1000, + foreground="#000000", background="#ffffe0"): """Create a text tooltip with a mouse hover delay. anchor_widget: the widget next to which the tooltip will be shown @@ -156,10 +157,13 @@ def __init__(self, anchor_widget, text, hover_delay=1000): """ super().__init__(anchor_widget, hover_delay=hover_delay) self.text = text + self.foreground = foreground + self.background = background def showcontents(self): label = Label(self.tipwindow, text=self.text, justify=LEFT, - background="#ffffe0", relief=SOLID, borderwidth=1) + relief=SOLID, borderwidth=1, + foreground=self.foreground, background=self.background) label.pack() diff --git a/Lib/idlelib/tree.py b/Lib/idlelib/tree.py index 0726d7e2..182ce718 100644 --- a/Lib/idlelib/tree.py +++ b/Lib/idlelib/tree.py @@ -83,6 +83,8 @@ def wheel_event(event, widget=None): class TreeNode: + dy = 0 + def __init__(self, canvas, parent, item): self.canvas = canvas self.parent = parent @@ -199,23 +201,22 @@ def update(self): def draw(self, x, y): # XXX This hard-codes too many geometry constants! - dy = 20 self.x, self.y = x, y self.drawicon() self.drawtext() if self.state != 'expanded': - return y + dy + return y + TreeNode.dy # draw children if not self.children: sublist = self.item._GetSubList() if not sublist: # _IsExpandable() was mistaken; that's allowed - return y+17 + return y + TreeNode.dy for item in sublist: child = self.__class__(self.canvas, self, item) self.children.append(child) cx = x+20 - cy = y + dy + cy = y + TreeNode.dy cylast = 0 for child in self.children: cylast = cy @@ -289,6 +290,11 @@ def drawtext(self): self.label.bind("", lambda e: wheel_event(e, self.canvas)) self.label.bind("", lambda e: wheel_event(e, self.canvas)) self.text_id = id + if TreeNode.dy == 0: + # The first row doesn't matter what the dy is, just measure its + # size to get the value of the subsequent dy + coords = self.canvas.bbox(id) + TreeNode.dy = max(20, coords[3] - coords[1] - 3) def select_or_edit(self, event=None): if self.selected and self.item.IsEditable(): diff --git a/Lib/importlib/__init__.py b/Lib/importlib/__init__.py index 707c081c..5b92442f 100644 --- a/Lib/importlib/__init__.py +++ b/Lib/importlib/__init__.py @@ -105,7 +105,7 @@ def reload(module): try: name = module.__name__ except AttributeError: - raise TypeError("reload() argument must be a module") + raise TypeError("reload() argument must be a module") from None if sys.modules.get(name) is not module: raise ImportError(f"module {name} not in sys.modules", name=name) diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index 61dafc0f..9b8a8dfc 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -204,7 +204,11 @@ def _write_atomic(path, data, mode=0o666): # We first write data to a temporary file, and then use os.replace() to # perform an atomic rename. with _io.FileIO(fd, 'wb') as file: - file.write(data) + bytes_written = file.write(data) + if bytes_written != len(data): + # Raise an OSError so the 'except' below cleans up the partially + # written file. + raise OSError("os.write() didn't write the full pyc file") _os.replace(path_tmp, path) except OSError: try: diff --git a/Lib/importlib/metadata/__init__.py b/Lib/importlib/metadata/__init__.py index 54156e93..e6ca1782 100644 --- a/Lib/importlib/metadata/__init__.py +++ b/Lib/importlib/metadata/__init__.py @@ -534,7 +534,7 @@ def _read_files_egginfo_installed(self): paths = ( (subdir / name) .resolve() - .relative_to(self.locate_file('').resolve()) + .relative_to(self.locate_file('').resolve(), walk_up=True) .as_posix() for name in text.splitlines() ) diff --git a/Lib/importlib/resources/readers.py b/Lib/importlib/resources/readers.py index c3cdf769..8e2d8e82 100644 --- a/Lib/importlib/resources/readers.py +++ b/Lib/importlib/resources/readers.py @@ -31,8 +31,10 @@ def files(self): class ZipReader(abc.TraversableResources): def __init__(self, loader, module): - _, _, name = module.rpartition('.') - self.prefix = loader.prefix.replace('\\', '/') + name + '/' + self.prefix = loader.prefix.replace('\\', '/') + if loader.is_package(module): + _, _, name = module.rpartition('.') + self.prefix += name + '/' self.archive = loader.archive def open_resource(self, resource): diff --git a/Lib/importlib/util.py b/Lib/importlib/util.py index 3743e6aa..4b836f47 100644 --- a/Lib/importlib/util.py +++ b/Lib/importlib/util.py @@ -13,7 +13,6 @@ import _imp import sys -import threading import types @@ -253,6 +252,9 @@ def create_module(self, spec): def exec_module(self, module): """Make the module load lazily.""" + # Threading is only needed for lazy loading, and importlib.util can + # be pulled in at interpreter startup, so defer until needed. + import threading module.__spec__.loader = self.loader module.__loader__ = self.loader # Don't need to worry about deep-copying as trying to set an attribute diff --git a/Lib/inspect.py b/Lib/inspect.py index 497169da..b630cb28 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -280,7 +280,13 @@ def get_annotations(obj, *, globals=None, locals=None, eval_str=False): if globals is None: globals = obj_globals if locals is None: - locals = obj_locals + locals = obj_locals or {} + + # "Inject" type parameters into the local namespace + # (unless they are shadowed by assignments *in* the local namespace), + # as a way of emulating annotation scopes when calling `eval()` + if type_params := getattr(obj, "__type_params__", ()): + locals = {param.__name__: param for param in type_params} | locals return_value = {key: value if not isinstance(value, str) else eval(value, globals, locals) @@ -401,13 +407,13 @@ def isgeneratorfunction(obj): return _has_code_flag(obj, CO_GENERATOR) # A marker for markcoroutinefunction and iscoroutinefunction. -_is_coroutine_marker = object() +_is_coroutine_mark = object() def _has_coroutine_mark(f): while ismethod(f): f = f.__func__ f = functools._unwrap_partial(f) - return getattr(f, "_is_coroutine_marker", None) is _is_coroutine_marker + return getattr(f, "_is_coroutine_marker", None) is _is_coroutine_mark def markcoroutinefunction(func): """ @@ -415,7 +421,7 @@ def markcoroutinefunction(func): """ if hasattr(func, '__func__'): func = func.__func__ - func._is_coroutine_marker = _is_coroutine_marker + func._is_coroutine_marker = _is_coroutine_mark return func def iscoroutinefunction(obj): @@ -1632,11 +1638,15 @@ def getclosurevars(func): global_vars = {} builtin_vars = {} unbound_names = set() - for name in code.co_names: - if name in ("None", "True", "False"): - # Because these used to be builtins instead of keywords, they - # may still show up as name references. We ignore them. - continue + global_names = set() + for instruction in dis.get_instructions(code): + opname = instruction.opname + name = instruction.argval + if opname == "LOAD_ATTR": + unbound_names.add(name) + elif opname == "LOAD_GLOBAL": + global_names.add(name) + for name in global_names: try: global_vars[name] = global_ns[name] except KeyError: diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py index d8f3b5e2..76031ded 100644 --- a/Lib/ipaddress.py +++ b/Lib/ipaddress.py @@ -310,7 +310,7 @@ def collapse_addresses(addresses): [IPv4Network('192.0.2.0/24')] Args: - addresses: An iterator of IPv4Network or IPv6Network objects. + addresses: An iterable of IPv4Network or IPv6Network objects. Returns: An iterator of the collapsed IPv(4|6)Network objects. @@ -2001,6 +2001,9 @@ def is_multicast(self): See RFC 2373 2.7 for details. """ + ipv4_mapped = self.ipv4_mapped + if ipv4_mapped is not None: + return ipv4_mapped.is_multicast return self in self._constants._multicast_network @property @@ -2012,6 +2015,9 @@ def is_reserved(self): reserved IPv6 Network ranges. """ + ipv4_mapped = self.ipv4_mapped + if ipv4_mapped is not None: + return ipv4_mapped.is_reserved return any(self in x for x in self._constants._reserved_networks) @property @@ -2022,6 +2028,9 @@ def is_link_local(self): A boolean, True if the address is reserved per RFC 4291. """ + ipv4_mapped = self.ipv4_mapped + if ipv4_mapped is not None: + return ipv4_mapped.is_link_local return self in self._constants._linklocal_network @property @@ -2078,6 +2087,9 @@ def is_global(self): ``is_global`` has value opposite to :attr:`is_private`, except for the ``100.64.0.0/10`` IPv4 range where they are both ``False``. """ + ipv4_mapped = self.ipv4_mapped + if ipv4_mapped is not None: + return ipv4_mapped.is_global return not self.is_private @property @@ -2089,6 +2101,9 @@ def is_unspecified(self): RFC 2373 2.5.2. """ + ipv4_mapped = self.ipv4_mapped + if ipv4_mapped is not None: + return ipv4_mapped.is_unspecified return self._ip == 0 @property @@ -2332,6 +2347,8 @@ class _IPv6Constants: IPv6Network('2001:db8::/32'), # IANA says N/A, let's consider it not globally reachable to be safe IPv6Network('2002::/16'), + # RFC 9637: https://www.rfc-editor.org/rfc/rfc9637.html#section-6-2.2 + IPv6Network('3fff::/20'), IPv6Network('fc00::/7'), IPv6Network('fe80::/10'), ] diff --git a/Lib/json/decoder.py b/Lib/json/decoder.py index c5d9ae2d..5e5effea 100644 --- a/Lib/json/decoder.py +++ b/Lib/json/decoder.py @@ -50,17 +50,18 @@ def __reduce__(self): } +HEXDIGITS = re.compile(r'[0-9A-Fa-f]{4}', FLAGS) STRINGCHUNK = re.compile(r'(.*?)(["\\\x00-\x1f])', FLAGS) BACKSLASH = { '"': '"', '\\': '\\', '/': '/', 'b': '\b', 'f': '\f', 'n': '\n', 'r': '\r', 't': '\t', } -def _decode_uXXXX(s, pos): - esc = s[pos + 1:pos + 5] - if len(esc) == 4 and esc[1] not in 'xX': +def _decode_uXXXX(s, pos, _m=HEXDIGITS.match): + esc = _m(s, pos + 1) + if esc is not None: try: - return int(esc, 16) + return int(esc.group(), 16) except ValueError: pass msg = "Invalid \\uXXXX escape" diff --git a/Lib/json/scanner.py b/Lib/json/scanner.py index 7a61cfc2..09089751 100644 --- a/Lib/json/scanner.py +++ b/Lib/json/scanner.py @@ -9,7 +9,7 @@ __all__ = ['make_scanner'] NUMBER_RE = re.compile( - r'(-?(?:0|[1-9]\d*))(\.\d+)?([eE][-+]?\d+)?', + r'(-?(?:0|[1-9][0-9]*))(\.[0-9]+)?([eE][-+]?[0-9]+)?', (re.VERBOSE | re.MULTILINE | re.DOTALL)) def py_make_scanner(context): diff --git a/Lib/linecache.py b/Lib/linecache.py index ed4c9700..248cba93 100644 --- a/Lib/linecache.py +++ b/Lib/linecache.py @@ -70,7 +70,7 @@ def checkcache(filename=None): continue # no-op for files loaded via a __loader__ try: stat = os.stat(fullname) - except OSError: + except (OSError, ValueError): cache.pop(filename, None) continue if size != stat.st_size or mtime != stat.st_mtime: @@ -128,10 +128,12 @@ def updatecache(filename, module_globals=None): try: stat = os.stat(fullname) break - except OSError: + except (OSError, ValueError): pass else: return [] + except ValueError: # may be raised by os.stat() + return [] try: with tokenize.open(fullname) as fp: lines = fp.readlines() diff --git a/Lib/logging/config.py b/Lib/logging/config.py index 1824d0aa..c128bc7a 100644 --- a/Lib/logging/config.py +++ b/Lib/logging/config.py @@ -500,6 +500,33 @@ def as_tuple(self, value): value = tuple(value) return value +def _is_queue_like_object(obj): + """Check that *obj* implements the Queue API.""" + if isinstance(obj, (queue.Queue, queue.SimpleQueue)): + return True + # defer importing multiprocessing as much as possible + from multiprocessing.queues import Queue as MPQueue + if isinstance(obj, MPQueue): + return True + # Depending on the multiprocessing start context, we cannot create + # a multiprocessing.managers.BaseManager instance 'mm' to get the + # runtime type of mm.Queue() or mm.JoinableQueue() (see gh-119819). + # + # Since we only need an object implementing the Queue API, we only + # do a protocol check, but we do not use typing.runtime_checkable() + # and typing.Protocol to reduce import time (see gh-121723). + # + # Ideally, we would have wanted to simply use strict type checking + # instead of a protocol-based type checking since the latter does + # not check the method signatures. + # + # Note that only 'put_nowait' and 'get' are required by the logging + # queue handler and queue listener (see gh-124653) and that other + # methods are either optional or unused. + minimal_queue_interface = ['put_nowait', 'get'] + return all(callable(getattr(obj, method, None)) + for method in minimal_queue_interface) + class DictConfigurator(BaseConfigurator): """ Configure logging using a dictionary-like object to describe the @@ -787,25 +814,20 @@ def configure_handler(self, config): # if 'handlers' not in config: # raise ValueError('No handlers specified for a QueueHandler') if 'queue' in config: - from multiprocessing.queues import Queue as MPQueue - from multiprocessing import Manager as MM - proxy_queue = MM().Queue() - proxy_joinable_queue = MM().JoinableQueue() qspec = config['queue'] - if not isinstance(qspec, (queue.Queue, MPQueue, - type(proxy_queue), type(proxy_joinable_queue))): - if isinstance(qspec, str): - q = self.resolve(qspec) - if not callable(q): - raise TypeError('Invalid queue specifier %r' % qspec) - q = q() - elif isinstance(qspec, dict): - if '()' not in qspec: - raise TypeError('Invalid queue specifier %r' % qspec) - q = self.configure_custom(dict(qspec)) - else: + + if isinstance(qspec, str): + q = self.resolve(qspec) + if not callable(q): raise TypeError('Invalid queue specifier %r' % qspec) - config['queue'] = q + config['queue'] = q() + elif isinstance(qspec, dict): + if '()' not in qspec: + raise TypeError('Invalid queue specifier %r' % qspec) + config['queue'] = self.configure_custom(dict(qspec)) + elif not _is_queue_like_object(qspec): + raise TypeError('Invalid queue specifier %r' % qspec) + if 'listener' in config: lspec = config['listener'] if isinstance(lspec, type): diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py index 1ae6bb84..73757758 100644 --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -187,15 +187,18 @@ def shouldRollover(self, record): Basically, see if the supplied record would cause the file to exceed the size limit we have. """ - # See bpo-45401: Never rollover anything other than regular files - if os.path.exists(self.baseFilename) and not os.path.isfile(self.baseFilename): - return False if self.stream is None: # delay was set... self.stream = self._open() if self.maxBytes > 0: # are we rolling over? + pos = self.stream.tell() + if not pos: + # gh-116263: Never rollover an empty file + return False msg = "%s\n" % self.format(record) - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature - if self.stream.tell() + len(msg) >= self.maxBytes: + if pos + len(msg) >= self.maxBytes: + # See bpo-45401: Never rollover anything other than regular files + if os.path.exists(self.baseFilename) and not os.path.isfile(self.baseFilename): + return False return True return False diff --git a/Lib/mimetypes.py b/Lib/mimetypes.py index 3cc027aa..10f3ddc5 100644 --- a/Lib/mimetypes.py +++ b/Lib/mimetypes.py @@ -551,6 +551,8 @@ def _default_mime_types(): '.csv' : 'text/csv', '.html' : 'text/html', '.htm' : 'text/html', + '.md' : 'text/markdown', + '.markdown': 'text/markdown', '.n3' : 'text/n3', '.txt' : 'text/plain', '.bat' : 'text/plain', diff --git a/Lib/multiprocessing/connection.py b/Lib/multiprocessing/connection.py index d0582e3c..fdbc3bda 100644 --- a/Lib/multiprocessing/connection.py +++ b/Lib/multiprocessing/connection.py @@ -956,7 +956,7 @@ def answer_challenge(connection, authkey: bytes): f'Protocol error, expected challenge: {message=}') message = message[len(_CHALLENGE):] if len(message) < _MD5ONLY_MESSAGE_LENGTH: - raise AuthenticationError('challenge too short: {len(message)} bytes') + raise AuthenticationError(f'challenge too short: {len(message)} bytes') digest = _create_response(authkey, message) connection.send_bytes(digest) response = connection.recv_bytes(256) # reject large message diff --git a/Lib/multiprocessing/forkserver.py b/Lib/multiprocessing/forkserver.py index 4642707d..9fb56327 100644 --- a/Lib/multiprocessing/forkserver.py +++ b/Lib/multiprocessing/forkserver.py @@ -167,6 +167,8 @@ def ensure_running(self): def main(listener_fd, alive_r, preload, main_path=None, sys_path=None): '''Run forkserver.''' if preload: + if sys_path is not None: + sys.path[:] = sys_path if '__main__' in preload and main_path is not None: process.current_process()._inheriting = True try: diff --git a/Lib/multiprocessing/managers.py b/Lib/multiprocessing/managers.py index 75d9c18c..010d16e1 100644 --- a/Lib/multiprocessing/managers.py +++ b/Lib/multiprocessing/managers.py @@ -755,22 +755,29 @@ class BaseProxy(object): _address_to_local = {} _mutex = util.ForkAwareThreadLock() + # Each instance gets a `_serial` number. Unlike `id(...)`, this number + # is never reused. + _next_serial = 1 + def __init__(self, token, serializer, manager=None, authkey=None, exposed=None, incref=True, manager_owned=False): with BaseProxy._mutex: - tls_idset = BaseProxy._address_to_local.get(token.address, None) - if tls_idset is None: - tls_idset = util.ForkAwareLocal(), ProcessLocalSet() - BaseProxy._address_to_local[token.address] = tls_idset + tls_serials = BaseProxy._address_to_local.get(token.address, None) + if tls_serials is None: + tls_serials = util.ForkAwareLocal(), ProcessLocalSet() + BaseProxy._address_to_local[token.address] = tls_serials + + self._serial = BaseProxy._next_serial + BaseProxy._next_serial += 1 # self._tls is used to record the connection used by this # thread to communicate with the manager at token.address - self._tls = tls_idset[0] + self._tls = tls_serials[0] - # self._idset is used to record the identities of all shared - # objects for which the current process owns references and + # self._all_serials is a set used to record the identities of all + # shared objects for which the current process owns references and # which are in the manager at token.address - self._idset = tls_idset[1] + self._all_serials = tls_serials[1] self._token = token self._id = self._token.id @@ -850,20 +857,20 @@ def _incref(self): dispatch(conn, None, 'incref', (self._id,)) util.debug('INCREF %r', self._token.id) - self._idset.add(self._id) + self._all_serials.add(self._serial) state = self._manager and self._manager._state self._close = util.Finalize( self, BaseProxy._decref, - args=(self._token, self._authkey, state, - self._tls, self._idset, self._Client), + args=(self._token, self._serial, self._authkey, state, + self._tls, self._all_serials, self._Client), exitpriority=10 ) @staticmethod - def _decref(token, authkey, state, tls, idset, _Client): - idset.discard(token.id) + def _decref(token, serial, authkey, state, tls, idset, _Client): + idset.discard(serial) # check whether manager is still alive if state is None or state.value == State.STARTED: diff --git a/Lib/multiprocessing/synchronize.py b/Lib/multiprocessing/synchronize.py index 3ccbfe31..0f682b9a 100644 --- a/Lib/multiprocessing/synchronize.py +++ b/Lib/multiprocessing/synchronize.py @@ -174,7 +174,7 @@ def __repr__(self): name = process.current_process().name if threading.current_thread().name != 'MainThread': name += '|' + threading.current_thread().name - elif self._semlock._get_value() == 1: + elif not self._semlock._is_zero(): name = 'None' elif self._semlock._count() > 0: name = 'SomeOtherThread' @@ -200,7 +200,7 @@ def __repr__(self): if threading.current_thread().name != 'MainThread': name += '|' + threading.current_thread().name count = self._semlock._count() - elif self._semlock._get_value() == 1: + elif not self._semlock._is_zero(): name, count = 'None', 0 elif self._semlock._count() > 0: name, count = 'SomeOtherThread', 'nonzero' diff --git a/Lib/ntpath.py b/Lib/ntpath.py index 2e290dcf..c05e965f 100644 --- a/Lib/ntpath.py +++ b/Lib/ntpath.py @@ -561,28 +561,21 @@ def normpath(path): return prefix + sep.join(comps) -def _abspath_fallback(path): - """Return the absolute version of a path as a fallback function in case - `nt._getfullpathname` is not available or raises OSError. See bpo-31047 for - more. - - """ - - path = os.fspath(path) - if not isabs(path): - if isinstance(path, bytes): - cwd = os.getcwdb() - else: - cwd = os.getcwd() - path = join(cwd, path) - return normpath(path) - # Return an absolute path. try: from nt import _getfullpathname except ImportError: # not running on Windows - mock up something sensible - abspath = _abspath_fallback + def abspath(path): + """Return the absolute version of a path.""" + path = os.fspath(path) + if not isabs(path): + if isinstance(path, bytes): + cwd = os.getcwdb() + else: + cwd = os.getcwd() + path = join(cwd, path) + return normpath(path) else: # use native Windows method on Windows def abspath(path): @@ -590,7 +583,27 @@ def abspath(path): try: return _getfullpathname(normpath(path)) except (OSError, ValueError): - return _abspath_fallback(path) + # See gh-75230, handle outside for cleaner traceback + pass + path = os.fspath(path) + if not isabs(path): + if isinstance(path, bytes): + sep = b'\\' + getcwd = os.getcwdb + else: + sep = '\\' + getcwd = os.getcwd + drive, root, path = splitroot(path) + # Either drive or root can be nonempty, but not both. + if drive or root: + try: + path = join(_getfullpathname(drive + root), path) + except (OSError, ValueError): + # Drive "\0:" cannot exist; use the root directory. + path = drive + sep + path + else: + path = join(getcwd(), path) + return normpath(path) try: from nt import _getfinalpathname, readlink as _nt_readlink diff --git a/Lib/nturl2path.py b/Lib/nturl2path.py index 61852aff..757fd01b 100644 --- a/Lib/nturl2path.py +++ b/Lib/nturl2path.py @@ -15,32 +15,29 @@ def url2pathname(url): # become # C:\foo\bar\spam.foo import string, urllib.parse + if url[:3] == '///': + # URL has an empty authority section, so the path begins on the third + # character. + url = url[2:] + elif url[:12] == '//localhost/': + # Skip past 'localhost' authority. + url = url[11:] + if url[:3] == '///': + # Skip past extra slash before UNC drive in URL path. + url = url[1:] # Windows itself uses ":" even in URLs. url = url.replace(':', '|') if not '|' in url: # No drive specifier, just convert slashes - if url[:4] == '////': - # path is something like ////host/path/on/remote/host - # convert this to \\host\path\on\remote\host - # (notice halving of slashes at the start of the path) - url = url[2:] - components = url.split('/') # make sure not to convert quoted slashes :-) - return urllib.parse.unquote('\\'.join(components)) + return urllib.parse.unquote(url.replace('/', '\\')) comp = url.split('|') if len(comp) != 2 or comp[0][-1] not in string.ascii_letters: error = 'Bad URL: ' + url raise OSError(error) drive = comp[0][-1].upper() - components = comp[1].split('/') - path = drive + ':' - for comp in components: - if comp: - path = path + '\\' + urllib.parse.unquote(comp) - # Issue #11474 - handing url such as |c/| - if path.endswith(':') and url.endswith('/'): - path += '\\' - return path + tail = urllib.parse.unquote(comp[1].replace('/', '\\')) + return drive + ':' + tail def pathname2url(p): """OS-specific conversion from a file system path to a relative URL @@ -52,30 +49,21 @@ def pathname2url(p): import urllib.parse # First, clean up some special forms. We are going to sacrifice # the additional information anyway - if p[:4] == '\\\\?\\': + p = p.replace('\\', '/') + if p[:4] == '//?/': p = p[4:] - if p[:4].upper() == 'UNC\\': - p = '\\' + p[4:] + if p[:4].upper() == 'UNC/': + p = '//' + p[4:] elif p[1:2] != ':': raise OSError('Bad path: ' + p) if not ':' in p: - # No drive specifier, just convert slashes and quote the name - if p[:2] == '\\\\': - # path is something like \\host\path\on\remote\host - # convert this to ////host/path/on/remote/host - # (notice doubling of slashes at the start of the path) - p = '\\\\' + p - components = p.split('\\') - return urllib.parse.quote('/'.join(components)) + # No DOS drive specified, just quote the pathname + return urllib.parse.quote(p) comp = p.split(':', maxsplit=2) if len(comp) != 2 or len(comp[0]) > 1: error = 'Bad path: ' + p raise OSError(error) drive = urllib.parse.quote(comp[0].upper()) - components = comp[1].split('\\') - path = '///' + drive + ':' - for comp in components: - if comp: - path = path + '/' + urllib.parse.quote(comp) - return path + tail = urllib.parse.quote(comp[1]) + return '///' + drive + ':' + tail diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 65ff0ee1..02eb5c25 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -359,9 +359,9 @@ def __init__(self, *args): paths = [] for arg in args: if isinstance(arg, PurePath): - if arg._flavour is ntpath and self._flavour is posixpath: + if arg._flavour is not self._flavour: # GH-103631: Convert separators for backwards compatibility. - paths.extend(path.replace('\\', '/') for path in arg._raw_paths) + paths.append(arg.as_posix()) else: paths.extend(arg._raw_paths) else: diff --git a/Lib/pdb.py b/Lib/pdb.py index 225c9f25..1e1b5ea4 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -96,7 +96,7 @@ class Restart(Exception): "post_mortem", "help"] def find_function(funcname, filename): - cre = re.compile(r'def\s+%s\s*[(]' % re.escape(funcname)) + cre = re.compile(r'def\s+%s(\s*\[.+\])?\s*[(]' % re.escape(funcname)) try: fp = tokenize.open(filename) except OSError: @@ -321,8 +321,7 @@ def user_call(self, frame, argument_list): def user_line(self, frame): """This function is called when we stop or break at this line.""" if self._wait_for_mainpyfile: - if (self.mainpyfile != self.canonic(frame.f_code.co_filename) - or frame.f_lineno <= 0): + if (self.mainpyfile != self.canonic(frame.f_code.co_filename)): return self._wait_for_mainpyfile = False if self.bp_commands(frame): @@ -395,7 +394,7 @@ def _cmdloop(self): # Called before loop, handles display expressions # Set up convenience variable containers - def preloop(self): + def _show_display(self): displaying = self.displaying.get(self.curframe) if displaying: for expr, oldvalue in displaying.items(): @@ -419,10 +418,16 @@ def interaction(self, frame, traceback): else: Pdb._previous_sigint_handler = None self.setup(frame, traceback) - # if we have more commands to process, do not show the stack entry - if not self.cmdqueue: - self.print_stack_entry(self.stack[self.curindex]) + # We should print the stack entry if and only if the user input + # is expected, and we should print it right before the user input. + # We achieve this by appending _pdbcmd_print_frame_status to the + # command queue. If cmdqueue is not exausted, the user input is + # not expected and we will not print the stack entry. + self.cmdqueue.append('_pdbcmd_print_frame_status') self._cmdloop() + # If _pdbcmd_print_frame_status is not used, pop it out + if self.cmdqueue and self.cmdqueue[-1] == '_pdbcmd_print_frame_status': + self.cmdqueue.pop() self.forget() def displayhook(self, obj): @@ -524,6 +529,10 @@ def onecmd(self, line): a breakpoint command list definition. """ if not self.commands_defining: + if line.startswith('_pdbcmd'): + command, arg, line = self.parseline(line) + if hasattr(self, command): + return getattr(self, command)(arg) return cmd.Cmd.onecmd(self, line) else: return self.handle_command_def(line) @@ -623,6 +632,12 @@ def _complete_expression(self, text, line, begidx, endidx): # Complete a simple name. return [n for n in ns.keys() if n.startswith(text)] + # Pdb meta commands, only intended to be used internally by pdb + + def _pdbcmd_print_frame_status(self, arg): + self.print_stack_entry(self.stack[self.curindex]) + self._show_display() + # Command definitions, called by cmdloop() # The argument is the remaining string on the command line # Return true to exit from the command loop diff --git a/Lib/pickle.py b/Lib/pickle.py index 6e3c61fd..ea5f1c5d 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -314,16 +314,17 @@ def load_frame(self, frame_size): # Tools used for pickling. def _getattribute(obj, name): + top = obj for subpath in name.split('.'): if subpath == '': raise AttributeError("Can't get local attribute {!r} on {!r}" - .format(name, obj)) + .format(name, top)) try: parent = obj obj = getattr(obj, subpath) except AttributeError: raise AttributeError("Can't get attribute {!r} on {!r}" - .format(name, obj)) from None + .format(name, top)) from None return obj, parent def whichmodule(obj, name): @@ -396,6 +397,8 @@ def decode_long(data): return int.from_bytes(data, byteorder='little', signed=True) +_NoValue = object() + # Pickling machinery class _Pickler: @@ -530,10 +533,11 @@ def save(self, obj, save_persistent_id=True): self.framer.commit_frame() # Check for persistent id (defined by a subclass) - pid = self.persistent_id(obj) - if pid is not None and save_persistent_id: - self.save_pers(pid) - return + if save_persistent_id: + pid = self.persistent_id(obj) + if pid is not None: + self.save_pers(pid) + return # Check the memo x = self.memo.get(id(obj)) @@ -780,14 +784,10 @@ def save_float(self, obj): self.write(FLOAT + repr(obj).encode("ascii") + b'\n') dispatch[float] = save_float - def save_bytes(self, obj): - if self.proto < 3: - if not obj: # bytes object is empty - self.save_reduce(bytes, (), obj=obj) - else: - self.save_reduce(codecs.encode, - (str(obj, 'latin1'), 'latin1'), obj=obj) - return + def _save_bytes_no_memo(self, obj): + # helper for writing bytes objects for protocol >= 3 + # without memoizing them + assert self.proto >= 3 n = len(obj) if n <= 0xff: self.write(SHORT_BINBYTES + pack("= 5 + # without memoizing them + assert self.proto >= 5 + n = len(obj) + if n >= self.framer._FRAME_SIZE_TARGET: + self._write_large_bytes(BYTEARRAY8 + pack("= self.framer._FRAME_SIZE_TARGET: - self._write_large_bytes(BYTEARRAY8 + pack("= 5") with obj.raw() as m: if not m.contiguous: @@ -830,10 +846,18 @@ def save_picklebuffer(self, obj): if in_band: # Write data in-band # XXX The C implementation avoids a copy here + buf = m.tobytes() + in_memo = id(buf) in self.memo if m.readonly: - self.save_bytes(m.tobytes()) + if in_memo: + self._save_bytes_no_memo(buf) + else: + self.save_bytes(buf) else: - self.save_bytearray(m.tobytes()) + if in_memo: + self._save_bytearray_no_memo(buf) + else: + self.save_bytearray(buf) else: # Write data out-of-band self.write(NEXT_BUFFER) @@ -1070,11 +1094,16 @@ def save_global(self, obj, name=None): (obj, module_name, name)) if self.proto >= 2: - code = _extension_registry.get((module_name, name)) - if code: - assert code > 0 + code = _extension_registry.get((module_name, name), _NoValue) + if code is not _NoValue: if code <= 0xff: - write(EXT1 + pack("= 3: - write(GLOBAL + bytes(module_name, "utf-8") + b'\n' + - bytes(name, "utf-8") + b'\n') + elif '.' in name: + # In protocol < 4, objects with multi-part __qualname__ + # are represented as + # getattr(getattr(..., attrname1), attrname2). + dotted_path = name.split('.') + name = dotted_path.pop(0) + save = self.save + for attrname in dotted_path: + save(getattr) + if self.proto < 2: + write(MARK) + self._save_toplevel_by_name(module_name, name) + for attrname in dotted_path: + save(attrname) + if self.proto < 2: + write(TUPLE) + else: + write(TUPLE2) + write(REDUCE) + else: + self._save_toplevel_by_name(module_name, name) + + self.memoize(obj) + + def _save_toplevel_by_name(self, module_name, name): + if self.proto >= 3: + # Non-ASCII identifiers are supported only with protocols >= 3. + self.write(GLOBAL + bytes(module_name, "utf-8") + b'\n' + + bytes(name, "utf-8") + b'\n') else: if self.fix_imports: r_name_mapping = _compat_pickle.REVERSE_NAME_MAPPING @@ -1102,14 +1155,12 @@ def save_global(self, obj, name=None): elif module_name in r_import_mapping: module_name = r_import_mapping[module_name] try: - write(GLOBAL + bytes(module_name, "ascii") + b'\n' + - bytes(name, "ascii") + b'\n') + self.write(GLOBAL + bytes(module_name, "ascii") + b'\n' + + bytes(name, "ascii") + b'\n') except UnicodeEncodeError: raise PicklingError( "can't pickle global identifier '%s.%s' using " - "pickle protocol %i" % (module, name, self.proto)) from None - - self.memoize(obj) + "pickle protocol %i" % (module_name, name, self.proto)) from None def save_type(self, obj): if obj is type(None): @@ -1546,9 +1597,8 @@ def load_ext4(self): dispatch[EXT4[0]] = load_ext4 def get_extension(self, code): - nil = [] - obj = _extension_cache.get(code, nil) - if obj is not nil: + obj = _extension_cache.get(code, _NoValue) + if obj is not _NoValue: self.append(obj) return key = _inverted_registry.get(code) diff --git a/Lib/pickletools.py b/Lib/pickletools.py index 51ee4a7a..33a51492 100644 --- a/Lib/pickletools.py +++ b/Lib/pickletools.py @@ -312,7 +312,7 @@ def read_uint8(f): doc="Eight-byte unsigned integer, little-endian.") -def read_stringnl(f, decode=True, stripquotes=True): +def read_stringnl(f, decode=True, stripquotes=True, *, encoding='latin-1'): r""" >>> import io >>> read_stringnl(io.BytesIO(b"'abcd'\nefg\n")) @@ -356,7 +356,7 @@ def read_stringnl(f, decode=True, stripquotes=True): raise ValueError("no string quotes around %r" % data) if decode: - data = codecs.escape_decode(data)[0].decode("ascii") + data = codecs.escape_decode(data)[0].decode(encoding) return data stringnl = ArgumentDescriptor( @@ -370,7 +370,7 @@ def read_stringnl(f, decode=True, stripquotes=True): """) def read_stringnl_noescape(f): - return read_stringnl(f, stripquotes=False) + return read_stringnl(f, stripquotes=False, encoding='utf-8') stringnl_noescape = ArgumentDescriptor( name='stringnl_noescape', @@ -2513,7 +2513,10 @@ def dis(pickle, out=None, memo=None, indentlevel=4, annotate=0): # make a mild effort to align arguments line += ' ' * (10 - len(opcode.name)) if arg is not None: - line += ' ' + repr(arg) + if opcode.name in ("STRING", "BINSTRING", "SHORT_BINSTRING"): + line += ' ' + ascii(arg) + else: + line += ' ' + repr(arg) if markmsg: line += ' ' + markmsg if annotate: diff --git a/Lib/pstats.py b/Lib/pstats.py index 51bcca84..f3611777 100644 --- a/Lib/pstats.py +++ b/Lib/pstats.py @@ -83,7 +83,7 @@ class Stats: method now take arbitrarily many file names as arguments. All the print methods now take an argument that indicates how many lines - to print. If the arg is a floating point number between 0 and 1.0, then + to print. If the arg is a floating-point number between 0 and 1.0, then it is taken as a decimal percentage of the available lines to be printed (e.g., .1 means print 10% of all available lines). If it is an integer, it is taken to mean the number of lines of data that you wish to have diff --git a/Lib/pydoc.py b/Lib/pydoc.py index 9a881239..e3745e54 100755 --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -2148,7 +2148,7 @@ def help(self, request, is_cli=False): elif request in self.symbols: self.showsymbol(request) elif request in ['True', 'False', 'None']: # special case these keywords since they are objects too - doc(eval(request), 'Help on %s:', is_cli=is_cli) + doc(eval(request), 'Help on %s:', output=self._output, is_cli=is_cli) elif request in self.keywords: self.showtopic(request) elif request in self.topics: self.showtopic(request) elif request: doc(request, 'Help on %s:', output=self._output, is_cli=is_cli) @@ -2241,7 +2241,11 @@ def showtopic(self, topic, more_xrefs=''): text = 'Related help topics: ' + ', '.join(xrefs.split()) + '\n' wrapped_text = textwrap.wrap(text, 72) doc += '\n%s\n' % '\n'.join(wrapped_text) - pager(doc) + + if self._output is None: + pager(doc) + else: + self.output.write(doc) def _gettopic(self, topic, more_xrefs=''): """Return unbuffered tuple of (topic, xrefs). diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index e9e6337c..12523999 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Thu Jun 6 20:20:21 2024 +# Autogenerated by Sphinx on Tue Dec 3 19:41:14 2024 # as part of the release process. topics = {'assert': 'The "assert" statement\n' '**********************\n' @@ -29,13 +29,12 @@ '(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' + '"assert" statement when optimization is requested at compile ' + 'time.\n' + 'Note that it is unnecessary to include the source code for the\n' + 'expression that failed in the error message; it will be displayed ' + 'as\n' + 'part of the stack trace.\n' '\n' 'Assignments to "__debug__" are illegal. The value for the ' 'built-in\n' @@ -308,10 +307,10 @@ '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' + 'An augmented assignment statement like "x += 1" can be ' + 'rewritten as "x\n' + '= 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 ' @@ -362,21 +361,26 @@ 'a single\n' 'target is allowed.\n' '\n' - 'For simple names as assignment targets, if in class or module ' - 'scope,\n' - 'the annotations are evaluated and stored in a special class or ' - 'module\n' - 'attribute "__annotations__" that is a dictionary mapping from ' - 'variable\n' - 'names (mangled if private) to evaluated annotations. This ' - 'attribute is\n' - 'writable and is automatically created at the start of class or ' - 'module\n' - 'body execution, if annotations are found statically.\n' - '\n' - 'For expressions as assignment targets, the annotations are ' + 'The assignment target is considered “simple” if it consists of ' + 'a\n' + 'single name that is not enclosed in parentheses. For simple ' + 'assignment\n' + 'targets, if in class or module scope, the annotations are ' 'evaluated\n' - 'if in class or module scope, but not stored.\n' + 'and stored in a special class or module attribute ' + '"__annotations__"\n' + 'that is a dictionary mapping from variable names (mangled if ' + 'private)\n' + 'to evaluated annotations. This attribute is writable and is\n' + 'automatically created at the start of class or module body ' + 'execution,\n' + 'if annotations are found statically.\n' + '\n' + 'If the assignment target is not simple (an attribute, ' + 'subscript node,\n' + 'or parenthesized name), the annotation is evaluated if in ' + 'class or\n' + 'module scope, but not stored.\n' '\n' 'If a name is annotated in a function scope, then this name is ' 'local\n' @@ -555,31 +559,67 @@ '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 ' + '\n' + 'Private name mangling\n' + '=====================\n' + '\n' + 'When an identifier that textually occurs in a class ' + 'definition begins\n' + 'with two or more underscore characters and does not end ' + 'in two or more\n' + 'underscores, it is considered a *private name* of that ' + 'class.\n' + '\n' + 'See also: The class specifications.\n' + '\n' + 'More precisely, private names are transformed to a ' + 'longer form before\n' + 'code is generated for them. If the transformed name is ' + 'longer than\n' + '255 characters, implementation-defined truncation may ' + 'happen.\n' + '\n' + 'The 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', + 'the identifier is used but only the following private ' + 'identifiers are\n' + 'mangled:\n' + '\n' + '* Any name used as the name of a variable that is ' + 'assigned or read or\n' + ' any name of an attribute being accessed.\n' + '\n' + ' The "__name__" attribute of nested functions, classes, ' + 'and type\n' + ' aliases is however not mangled.\n' + '\n' + '* The name of imported modules, e.g., "__spam" in ' + '"import __spam". If\n' + ' the module is part of a package (i.e., its name ' + 'contains a dot), the\n' + ' name is *not* mangled, e.g., the "__foo" in "import ' + '__foo.bar" is\n' + ' not mangled.\n' + '\n' + '* The name of an imported member, e.g., "__f" in "from ' + 'spam import\n' + ' __f".\n' + '\n' + 'The transformation rule is defined as follows:\n' + '\n' + '* The class name, with leading underscores removed and a ' + 'single\n' + ' leading underscore inserted, is inserted in front of ' + 'the identifier,\n' + ' e.g., the identifier "__spam" occurring in a class ' + 'named "Foo",\n' + ' "_Foo" or "__Foo" is transformed to "_Foo__spam".\n' + '\n' + '* If the class name consists only of underscores, the ' + 'transformation\n' + ' is the identity, e.g., the identifier "__spam" ' + 'occurring in a class\n' + ' named "_" or "__" is left as is.\n', 'atom-literals': 'Literals\n' '********\n' '\n' @@ -592,10 +632,10 @@ '\n' 'Evaluation of a literal yields an object of the given type ' '(string,\n' - 'bytes, integer, floating point number, complex number) with ' + 'bytes, integer, floating-point number, complex number) with ' 'the given\n' 'value. The value may be approximated in the case of ' - 'floating point\n' + 'floating-point\n' 'and imaginary (complex) literals. See section Literals for ' 'details.\n' '\n' @@ -632,7 +672,8 @@ 'should either\n' ' return the (computed) attribute value or raise an ' '"AttributeError"\n' - ' exception.\n' + ' exception. The "object" class itself does not provide ' + 'this method.\n' '\n' ' Note that if the attribute is found through the ' 'normal mechanism,\n' @@ -815,7 +856,9 @@ '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' + 'the key of the property in the owner class’ "__dict__". ' + 'The "object"\n' + 'class itself does not implement any of these protocols.\n' '\n' 'object.__get__(self, instance, owner=None)\n' '\n' @@ -1053,11 +1096,13 @@ 'to the class\n' ' where it is defined. *__slots__* declared in parents ' 'are available\n' - ' in child classes. However, child subclasses will get a ' - '"__dict__"\n' - ' and *__weakref__* unless they also define *__slots__* ' - '(which should\n' - ' only contain names of any *additional* slots).\n' + ' in child classes. However, instances of a child ' + 'subclass will get a\n' + ' "__dict__" and *__weakref__* unless the subclass also ' + 'defines\n' + ' *__slots__* (which should only contain names of any ' + '*additional*\n' + ' slots).\n' '\n' '* If a class defines a slot also defined in a base ' 'class, the instance\n' @@ -1163,10 +1208,10 @@ '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' + 'An augmented assignment statement like "x += 1" can be ' + 'rewritten as "x\n' + '= 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 ' @@ -1239,6 +1284,10 @@ 'The "@" (at) operator is intended to be used for matrix\n' 'multiplication. No builtin Python types implement this operator.\n' '\n' + 'This operation can be customized using the special "__matmul__()" ' + 'and\n' + '"__rmatmul__()" methods.\n' + '\n' 'Added in version 3.5.\n' '\n' 'The "/" (division) and "//" (floor division) operators yield the\n' @@ -1251,17 +1300,19 @@ 'result. Division by zero raises the "ZeroDivisionError" ' 'exception.\n' '\n' - 'This operation can be customized using the special "__truediv__()" ' + 'The division operation can be customized using the special\n' + '"__truediv__()" and "__rtruediv__()" methods. The floor division\n' + 'operation can be customized using the special "__floordiv__()" ' 'and\n' - '"__floordiv__()" methods.\n' + '"__rfloordiv__()" methods.\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' + '"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 ' @@ -1288,13 +1339,13 @@ '\n' 'The *modulo* operation can be customized using the special ' '"__mod__()"\n' - 'method.\n' + 'and "__rmod__()" methods.\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' + '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 ' @@ -1313,7 +1364,8 @@ 'The numeric arguments are first converted to a common type.\n' '\n' 'This operation can be customized using the special "__sub__()" ' - 'method.\n', + 'and\n' + '"__rsub__()" methods.\n', 'bitwise': 'Binary bitwise operations\n' '*************************\n' '\n' @@ -1479,7 +1531,9 @@ ' Called when the instance is “called” as a function; if ' 'this method\n' ' is defined, "x(arg1, arg2, ...)" roughly translates to\n' - ' "type(x).__call__(x, arg1, ...)".\n', + ' "type(x).__call__(x, arg1, ...)". The "object" class ' + 'itself does\n' + ' not provide this method.\n', 'calls': 'Calls\n' '*****\n' '\n' @@ -1664,6 +1718,9 @@ ' Function definitions. When the code block executes a "return"\n' ' statement, this specifies the return value of the function ' 'call.\n' + ' If execution reaches the end of the code block without executing ' + 'a\n' + ' "return" statement, the return value is "None".\n' '\n' 'a built-in function or method:\n' ' The result is up to the interpreter; see Built-in Functions for ' @@ -2388,18 +2445,16 @@ 'An\n' 'expression-less "except" clause, if present, must be last; it ' 'matches\n' - 'any exception. For an "except" clause with an expression, that\n' - 'expression is evaluated, and the clause matches the exception if ' - 'the\n' - 'resulting object is “compatible” with the exception. An object ' - 'is\n' - 'compatible with an exception if the object is the class or a ' - '*non-\n' - 'virtual base class* of the exception object, or a tuple ' - 'containing an\n' - 'item that is the class or a non-virtual base class of the ' - 'exception\n' - 'object.\n' + 'any exception.\n' + '\n' + 'For an "except" clause with an expression, the expression must\n' + 'evaluate to an exception type or a tuple of exception types. ' + 'The\n' + 'raised exception matches an "except" clause whose expression ' + 'evaluates\n' + 'to the class or a *non-virtual base class* of the exception ' + 'object, or\n' + 'to a tuple that contains such a class.\n' '\n' 'If no "except" clause matches the exception, the search for an\n' 'exception handler continues in the surrounding code and on the\n' @@ -2548,13 +2603,16 @@ ' ...\n' " ExceptionGroup('', (BlockingIOError()))\n" '\n' - 'An "except*" clause must have a matching type, and this type ' - 'cannot be\n' - 'a subclass of "BaseExceptionGroup". It is not possible to mix ' - '"except"\n' - 'and "except*" in the same "try". "break", "continue" and ' - '"return"\n' - 'cannot appear in an "except*" clause.\n' + 'An "except*" clause must have a matching expression; it cannot ' + 'be\n' + '"except*:". Furthermore, this expression cannot contain ' + 'exception\n' + 'group types, because that would have ambiguous semantics.\n' + '\n' + 'It is not possible to mix "except" and "except*" in the same ' + '"try".\n' + '"break", "continue" and "return" cannot appear in an "except*" ' + 'clause.\n' '\n' '\n' '"else" clause\n' @@ -2711,18 +2769,15 @@ ' enter = type(manager).__enter__\n' ' exit = type(manager).__exit__\n' ' value = enter(manager)\n' - ' hit_except = False\n' '\n' ' try:\n' ' TARGET = value\n' ' SUITE\n' ' except:\n' - ' hit_except = True\n' ' if not exit(manager, *sys.exc_info()):\n' ' raise\n' - ' finally:\n' - ' if not hit_except:\n' - ' exit(manager, None, None, None)\n' + ' else:\n' + ' exit(manager, None, None, None)\n' '\n' 'With more than one item, the context managers are processed as ' 'if\n' @@ -3052,7 +3107,7 @@ ' | "None"\n' ' | "True"\n' ' | "False"\n' - ' | signed_number: NUMBER | "-" NUMBER\n' + ' signed_number ::= ["-"] NUMBER\n' '\n' 'The rule "strings" and the token "NUMBER" are defined in the ' 'standard\n' @@ -3522,10 +3577,12 @@ ' parameter_list_no_posonly ::= defparameter ("," ' 'defparameter)* ["," [parameter_list_starargs]]\n' ' | parameter_list_starargs\n' - ' parameter_list_starargs ::= "*" [parameter] ("," ' + ' parameter_list_starargs ::= "*" [star_parameter] ("," ' 'defparameter)* ["," ["**" parameter [","]]]\n' ' | "**" parameter [","]\n' ' parameter ::= identifier [":" expression]\n' + ' star_parameter ::= identifier [":" ["*"] ' + 'expression]\n' ' defparameter ::= parameter ["=" expression]\n' ' funcname ::= identifier\n' '\n' @@ -3653,27 +3710,31 @@ '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' + 'even those of the form "*identifier" or "**identifier". (As a ' + 'special\n' + 'case, parameters of the form "*identifier" may have an ' + 'annotation “":\n' + '*expression"”.) Functions may have “return” annotation of the ' + 'form\n' + '“"-> expression"” after the parameter list. These annotations ' + 'can be\n' + 'any valid Python expression. The presence of annotations does ' + 'not\n' + 'change the semantics of a function. The annotation values are\n' + 'available as values of a dictionary keyed by the parameters’ ' + 'names in\n' + 'the "__annotations__" attribute of the function object. If the\n' + '"annotations" import from "__future__" is used, annotations are\n' + 'preserved as strings at runtime which enables postponed ' + 'evaluation.\n' + 'Otherwise, they are evaluated when the function definition is\n' + 'executed. In this case annotations may be evaluated in a ' + 'different\n' + 'order than they appear in the source code.\n' + '\n' + 'Changed in version 3.11: Parameters of the form “"*identifier"” ' + 'may\n' + 'have an annotation “": *expression"”. See **PEP 646**.\n' '\n' 'It is also possible to create anonymous functions (functions not ' 'bound\n' @@ -4332,6 +4393,9 @@ '\n' 'For more information on context managers, see Context ' 'Manager Types.\n' + 'The "object" class itself does not provide the context ' + 'manager\n' + 'methods.\n' '\n' 'object.__enter__(self)\n' '\n' @@ -4400,7 +4464,7 @@ 'converted to\n' ' complex;\n' '\n' - '* otherwise, if either argument is a floating point number, ' + '* otherwise, if either argument is a floating-point number, ' 'the other\n' ' is converted to floating point;\n' '\n' @@ -4511,6 +4575,10 @@ ' It is not guaranteed that "__del__()" methods are called ' 'for\n' ' objects that still exist when the interpreter exits.\n' + ' "weakref.finalize" provides a straightforward way to ' + 'register a\n' + ' cleanup function to be called when an object is garbage ' + 'collected.\n' '\n' ' Note:\n' '\n' @@ -4597,17 +4665,20 @@ '\n' ' This is typically used for debugging, so it is important ' 'that the\n' - ' representation is information-rich and unambiguous.\n' + ' representation is information-rich and unambiguous. A ' + 'default\n' + ' implementation is provided by the "object" class ' + 'itself.\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' + ' Called by "str(object)", the default "__format__()" ' + 'implementation,\n' + ' and the built-in function "print()", to compute the ' + '“informal” or\n' + ' nicely printable string representation of an object. ' + 'The return\n' + ' value must be a str object.\n' '\n' ' This method differs from "object.__repr__()" in that ' 'there is no\n' @@ -4623,7 +4694,9 @@ '\n' ' Called by bytes to compute a byte-string representation ' 'of an\n' - ' object. This should return a "bytes" object.\n' + ' object. This should return a "bytes" object. The ' + '"object" class\n' + ' itself does not provide this method.\n' '\n' 'object.__format__(self, format_spec)\n' '\n' @@ -4651,6 +4724,11 @@ '\n' ' The return value must be a string object.\n' '\n' + ' The default implementation by the "object" class should ' + 'be given an\n' + ' empty *format_spec* string. It delegates to ' + '"__str__()".\n' + '\n' ' Changed in version 3.4: The __format__ method of ' '"object" itself\n' ' raises a "TypeError" if passed any non-empty string.\n' @@ -4708,6 +4786,16 @@ ' ordering operations from a single root operation, see\n' ' "functools.total_ordering()".\n' '\n' + ' By default, the "object" class provides implementations ' + 'consistent\n' + ' with Value comparisons: equality compares according to ' + 'object\n' + ' identity, and order comparisons raise "TypeError". Each ' + 'default\n' + ' method may generate these results directly, but may also ' + 'return\n' + ' "NotImplemented".\n' + '\n' ' See the paragraph on "__hash__()" for some important ' 'notes on\n' ' creating *hashable* objects which support custom ' @@ -4794,12 +4882,13 @@ '\n' ' User-defined classes have "__eq__()" and "__hash__()" ' 'methods by\n' - ' default; with them, all objects compare unequal (except ' - 'with\n' - ' themselves) and "x.__hash__()" returns an appropriate ' - 'value such\n' - ' that "x == y" implies both that "x is y" and "hash(x) == ' - 'hash(y)".\n' + ' default (inherited from the "object" class); with them, ' + 'all objects\n' + ' compare unequal (except with themselves) and ' + '"x.__hash__()" returns\n' + ' an appropriate value such that "x == y" implies both ' + 'that "x is y"\n' + ' and "hash(x) == hash(y)".\n' '\n' ' A class that overrides "__eq__()" and does not define ' '"__hash__()"\n' @@ -4870,9 +4959,9 @@ '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', + ' neither "__len__()" nor "__bool__()" (which is true of ' + 'the "object"\n' + ' class itself), all its instances are considered true.\n', 'debugger': '"pdb" — The Python Debugger\n' '***************************\n' '\n' @@ -6178,11 +6267,11 @@ '\n' '* While annotation scopes have an internal name, that name is ' 'not\n' - ' reflected in the *__qualname__* of objects defined within the ' - 'scope.\n' - ' Instead, the "__qualname__" of such objects is as if the ' - 'object were\n' - ' defined in the enclosing scope.\n' + ' reflected in the *qualified name* of objects defined within ' + 'the\n' + ' scope. Instead, the "__qualname__" of such objects is as if ' + 'the\n' + ' object were defined in the enclosing scope.\n' '\n' 'Added in version 3.12: Annotation scopes were introduced in ' 'Python\n' @@ -6380,12 +6469,17 @@ 'exprlists': 'Expression lists\n' '****************\n' '\n' - ' expression_list ::= expression ("," expression)* [","]\n' - ' starred_list ::= starred_item ("," starred_item)* ' + ' starred_expression ::= ["*"] or_expr\n' + ' flexible_expression ::= assignment_expression | ' + 'starred_expression\n' + ' flexible_expression_list ::= flexible_expression ("," ' + 'flexible_expression)* [","]\n' + ' starred_expression_list ::= starred_expression ("," ' + 'starred_expression)* [","]\n' + ' expression_list ::= expression ("," expression)* ' '[","]\n' - ' starred_expression ::= expression | (starred_item ",")* ' - '[starred_item]\n' - ' starred_item ::= assignment_expression | "*" or_expr\n' + ' yield_list ::= expression_list | ' + 'starred_expression "," [starred_expression_list]\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 ' @@ -6404,6 +6498,10 @@ 'Added in version 3.5: Iterable unpacking in expression lists,\n' 'originally proposed by **PEP 448**.\n' '\n' + 'Added in version 3.11: Any item in an expression list may be ' + 'starred.\n' + 'See **PEP 646**.\n' + '\n' 'A trailing comma is required only to create a one-item tuple, ' 'such as\n' '"1,"; it is optional in all other cases. A single expression ' @@ -6413,10 +6511,10 @@ 'that expression. (To create an empty tuple, use an empty pair ' 'of\n' 'parentheses: "()".)\n', - 'floating': 'Floating point literals\n' + 'floating': 'Floating-point literals\n' '***********************\n' '\n' - 'Floating point literals are described by the following lexical\n' + 'Floating-point literals are described by the following lexical\n' 'definitions:\n' '\n' ' floatnumber ::= pointfloat | exponentfloat\n' @@ -6430,12 +6528,12 @@ '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' + 'as "77e10". The allowed range of floating-point literals is\n' 'implementation-dependent. As in integer literals, underscores ' 'are\n' 'supported for digit grouping.\n' '\n' - 'Some examples of floating point literals:\n' + 'Some examples of floating-point literals:\n' '\n' ' 3.14 10. .001 1e100 3.14e-10 0e0 ' '3.14_15_93\n' @@ -6732,10 +6830,12 @@ 'printing fields |\n' '| | in the form ‘+000000120’. This alignment ' 'option is only |\n' - '| | valid for numeric types. It becomes the ' - 'default for |\n' - '| | numbers when ‘0’ immediately precedes the ' - 'field width. |\n' + '| | valid for numeric types, excluding "complex". ' + 'It becomes |\n' + '| | the default for numbers when ‘0’ immediately ' + 'precedes the |\n' + '| | field ' + 'width. |\n' '+-----------+------------------------------------------------------------+\n' '| "\'^\'" | Forces the field to be centered within the ' 'available |\n' @@ -6818,7 +6918,7 @@ '\n' 'The "\'_\'" option signals the use of an underscore for a ' 'thousands\n' - 'separator for floating point presentation types and for ' + 'separator for floating-point presentation types and for ' 'integer\n' 'presentation type "\'d\'". For integer presentation types ' '"\'b\'", "\'o\'",\n' @@ -6842,9 +6942,9 @@ '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' + 'types, excluding "complex". This is equivalent to a *fill* ' + 'character\n' + 'of "\'0\'" with an *alignment* type of "\'=\'".\n' '\n' 'Changed in version 3.10: Preceding the *width* field by ' '"\'0\'" no\n' @@ -6945,11 +7045,11 @@ '\n' 'In addition to the above presentation types, integers can ' 'be formatted\n' - 'with the floating point presentation types listed below ' + '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' + 'to a floating-point number before formatting.\n' '\n' 'The available presentation types for "float" and "Decimal" ' 'values are:\n' @@ -6975,12 +7075,10 @@ 'of "6" digits |\n' ' | | after the decimal point for "float", and ' 'shows all |\n' - ' | | coefficient digits for "Decimal". If no ' - 'digits follow the |\n' - ' | | decimal point, the decimal point is also ' - 'removed unless |\n' - ' | | the "#" option is ' - 'used. |\n' + ' | | coefficient digits for "Decimal". If ' + '"p=0", the decimal |\n' + ' | | point is omitted unless the "#" option is ' + 'used. |\n' ' ' '+-----------+------------------------------------------------------------+\n' ' | "\'E\'" | Scientific notation. Same as "\'e\'" ' @@ -6999,12 +7097,10 @@ 'decimal point for |\n' ' | | "float", and uses a precision large enough ' 'to show all |\n' - ' | | coefficient digits for "Decimal". If no ' - 'digits follow the |\n' - ' | | decimal point, the decimal point is also ' - 'removed unless |\n' - ' | | the "#" option is ' - 'used. |\n' + ' | | coefficient digits for "Decimal". If ' + '"p=0", the decimal |\n' + ' | | point is omitted unless the "#" option is ' + 'used. |\n' ' ' '+-----------+------------------------------------------------------------+\n' ' | "\'F\'" | Fixed-point notation. Same as "\'f\'", ' @@ -7089,18 +7185,22 @@ 'percent sign. |\n' ' ' '+-----------+------------------------------------------------------------+\n' - ' | None | For "float" this is the same as "\'g\'", ' - 'except that when |\n' - ' | | fixed-point notation is used to format the ' - 'result, it |\n' + ' | None | For "float" this is like the "\'g\'" type, ' + 'except that when |\n' + ' | | fixed- point notation is used to format ' + 'the result, it |\n' ' | | always includes at least one digit past ' - 'the decimal point. |\n' - ' | | The precision used is as large as needed ' - 'to represent the |\n' - ' | | given value faithfully. For "Decimal", ' - 'this is the same |\n' - ' | | as either "\'g\'" or "\'G\'" depending on ' - 'the value of |\n' + 'the decimal point, |\n' + ' | | and switches to the scientific notation ' + 'when "exp >= p - |\n' + ' | | 1". When the precision is not specified, ' + 'the latter will |\n' + ' | | be as large as needed to represent the ' + 'given value |\n' + ' | | faithfully. For "Decimal", this is the ' + 'same as either |\n' + ' | | "\'g\'" or "\'G\'" depending on the value ' + 'of |\n' ' | | "context.capitals" for the current decimal ' 'context. The |\n' ' | | overall effect is to match the output of ' @@ -7110,6 +7210,32 @@ ' ' '+-----------+------------------------------------------------------------+\n' '\n' + 'The result should be correctly rounded to a given precision ' + '"p" of\n' + 'digits after the decimal point. The rounding mode for ' + '"float" matches\n' + 'that of the "round()" builtin. For "Decimal", the rounding ' + 'mode of\n' + 'the current context will be used.\n' + '\n' + 'The available presentation types for "complex" are the same ' + 'as those\n' + 'for "float" ("\'%\'" is not allowed). Both the real and ' + 'imaginary\n' + 'components of a complex number are formatted as ' + 'floating-point\n' + 'numbers, according to the specified presentation type. ' + 'They are\n' + 'separated by the mandatory sign of the imaginary part, the ' + 'latter\n' + 'being terminated by a "j" suffix. If the presentation type ' + 'is\n' + 'missing, the result will match the output of "str()" ' + '(complex numbers\n' + 'with a non-zero real part are also surrounded by ' + 'parentheses),\n' + 'possibly altered by other format modifiers.\n' + '\n' '\n' 'Format examples\n' '===============\n' @@ -7290,10 +7416,12 @@ ' parameter_list_no_posonly ::= defparameter ("," ' 'defparameter)* ["," [parameter_list_starargs]]\n' ' | parameter_list_starargs\n' - ' parameter_list_starargs ::= "*" [parameter] ("," ' + ' parameter_list_starargs ::= "*" [star_parameter] ("," ' 'defparameter)* ["," ["**" parameter [","]]]\n' ' | "**" parameter [","]\n' ' parameter ::= identifier [":" expression]\n' + ' star_parameter ::= identifier [":" ["*"] ' + 'expression]\n' ' defparameter ::= parameter ["=" expression]\n' ' funcname ::= identifier\n' '\n' @@ -7421,27 +7549,31 @@ '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' + 'even those of the form "*identifier" or "**identifier". (As a ' + 'special\n' + 'case, parameters of the form "*identifier" may have an ' + 'annotation “":\n' + '*expression"”.) Functions may have “return” annotation of the ' + 'form\n' + '“"-> expression"” after the parameter list. These annotations ' + 'can be\n' + 'any valid Python expression. The presence of annotations does ' + 'not\n' + 'change the semantics of a function. The annotation values are\n' + 'available as values of a dictionary keyed by the parameters’ ' + 'names in\n' + 'the "__annotations__" attribute of the function object. If the\n' + '"annotations" import from "__future__" is used, annotations are\n' + 'preserved as strings at runtime which enables postponed ' + 'evaluation.\n' + 'Otherwise, they are evaluated when the function definition is\n' + 'executed. In this case annotations may be evaluated in a ' + 'different\n' + 'order than they appear in the source code.\n' + '\n' + 'Changed in version 3.11: Parameters of the form “"*identifier"” ' + 'may\n' + 'have an annotation “": *expression"”. See **PEP 646**.\n' '\n' 'It is also possible to create anonymous functions (functions not ' 'bound\n' @@ -7497,33 +7629,17 @@ '\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' + 'The "global" statement causes the listed identifiers to be ' + 'interpreted\n' + 'as globals. It would be impossible to assign to a global variable\n' + 'without "global", although free variables may refer to globals ' + 'without\n' + 'being declared global.\n' '\n' - 'Names listed in a "global" statement must not be defined as ' - 'formal\n' - 'parameters, or as targets in "with" statements or "except" ' - 'clauses, or\n' - 'in a "for" target list, "class" definition, function definition,\n' - '"import" statement, or variable annotation.\n' - '\n' - '**CPython implementation detail:** The current implementation does ' - 'not\n' - 'enforce some of these 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' + 'The "global" statement applies to the entire scope of a function ' + 'or\n' + 'class body. A "SyntaxError" is raised if a variable is used or\n' + 'assigned to prior to its global declaration in the scope.\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' @@ -7610,19 +7726,16 @@ '\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' + 'identifiers include the uppercase and lowercase letters "A" ' + 'through\n' + '"Z", the underscore "_" and, except for the first character, ' + 'the\n' + 'digits "0" through "9". Python 3.0 introduced additional ' + 'characters\n' + 'from outside the ASCII range (see **PEP 3131**). For these\n' + 'characters, the classification uses the version of the ' + 'Unicode\n' + 'Character Database as included in the "unicodedata" module.\n' '\n' 'Identifiers are unlimited in length. Case is significant.\n' '\n' @@ -7807,11 +7920,11 @@ '\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 ' + '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 ' + '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' @@ -8197,7 +8310,8 @@ 'in\n' 'square brackets:\n' '\n' - ' list_display ::= "[" [starred_list | comprehension] "]"\n' + ' list_display ::= "[" [flexible_expression_list | comprehension] ' + '"]"\n' '\n' 'A list display yields a new list object, the contents being ' 'specified\n' @@ -8448,11 +8562,9 @@ ' can introduce new names.\n' '\n' '* While annotation scopes have an internal name, that name is not\n' - ' reflected in the *__qualname__* of objects defined within the ' - 'scope.\n' - ' Instead, the "__qualname__" of such objects is as if the object ' - 'were\n' - ' defined in the enclosing scope.\n' + ' reflected in the *qualified name* of objects defined within the\n' + ' scope. Instead, the "__qualname__" of such objects is as if the\n' + ' object were defined in the enclosing scope.\n' '\n' 'Added in version 3.12: Annotation scopes were introduced in ' 'Python\n' @@ -8587,8 +8699,8 @@ 'scope,\n' 'or if there is no nonlocal scope, a "SyntaxError" is raised.\n' '\n' - 'The nonlocal statement applies to the entire scope of a function ' - 'or\n' + 'The "nonlocal" statement applies to the entire scope of a ' + 'function or\n' 'class body. A "SyntaxError" is raised if a variable is used or\n' 'assigned to prior to its nonlocal declaration in the scope.\n' '\n' @@ -8605,8 +8717,8 @@ 'numbers': 'Numeric literals\n' '****************\n' '\n' - 'There are three types of numeric literals: integers, floating ' - 'point\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' @@ -8938,16 +9050,22 @@ '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', + 'for mutable objects this is not allowed. For example, after "a = ' + '1; b\n' + '= 1", *a* and *b* may or may not refer to the same object with ' + 'the\n' + 'value one, depending on the implementation. This is because "int" ' + 'is\n' + 'an immutable type, so the reference to "1" can be reused. This\n' + 'behaviour depends on the implementation used, so should not be ' + 'relied\n' + 'upon, but is something to be aware of when making use of object\n' + 'identity tests. However, after "c = []; d = []", *c* and *d* are\n' + 'guaranteed to refer to two different, unique, newly created ' + 'empty\n' + 'lists. (Note that "e = f = []" assigns the *same* object to both ' + '*e*\n' + 'and *f*.)\n', 'operator-summary': 'Operator precedence\n' '*******************\n' '\n' @@ -9176,8 +9294,8 @@ '"complex"\n' 'number. (In earlier versions it raised a "ValueError".)\n' '\n' - 'This operation can be customized using the special "__pow__()" ' - 'method.\n', + 'This operation can be customized using the special "__pow__()" and\n' + '"__rpow__()" methods.\n', 'raise': 'The "raise" statement\n' '*********************\n' '\n' @@ -9340,56 +9458,58 @@ '\n' 'The following methods can be defined to implement ' 'container objects.\n' - 'Containers usually are *sequences* (such as "lists" or ' - '"tuples") or\n' - '*mappings* (like "dictionaries"), but can represent other ' - 'containers\n' - 'as well. The first set of methods is used either to ' - 'emulate a\n' - 'sequence or to emulate a mapping; the difference is that ' - 'for a\n' - 'sequence, the allowable keys should be the integers *k* ' - 'for which "0\n' - '<= k < N" where *N* is the length of the sequence, or ' - '"slice" objects,\n' - 'which define a range of items. It is also recommended ' - 'that mappings\n' - 'provide the methods "keys()", "values()", "items()", ' - '"get()",\n' - '"clear()", "setdefault()", "pop()", "popitem()", "copy()", ' + 'None of them are provided by the "object" class itself. ' + 'Containers\n' + 'usually are *sequences* (such as "lists" or "tuples") or ' + '*mappings*\n' + '(like *dictionaries*), but can represent other containers ' + 'as well.\n' + 'The 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.abc" module provides a "MutableMapping" ' + '*abstract\n' + 'base class* to help create those methods from a base set ' + 'of\n' + '"__getitem__()", "__setitem__()", "__delitem__()", and ' + '"keys()".\n' + 'Mutable sequences should provide methods "append()", ' + '"count()",\n' + '"index()", "extend()", "insert()", "pop()", "remove()", ' + '"reverse()"\n' + 'and "sort()", like Python standard "list" objects. ' + 'Finally, sequence\n' + 'types should implement addition (meaning concatenation) ' 'and\n' - '"update()" behaving similar to those for Python’s ' - 'standard\n' - '"dictionary" objects. The "collections.abc" module ' - 'provides a\n' - '"MutableMapping" *abstract base class* to help create ' - 'those methods\n' - 'from a base set of "__getitem__()", "__setitem__()", ' - '"__delitem__()",\n' - 'and "keys()". Mutable sequences should provide methods ' - '"append()",\n' - '"count()", "index()", "extend()", "insert()", "pop()", ' - '"remove()",\n' - '"reverse()" and "sort()", like Python standard "list" ' - 'objects.\n' - 'Finally, sequence types should implement addition ' - '(meaning\n' - 'concatenation) and multiplication (meaning repetition) by ' - 'defining the\n' - 'methods "__add__()", "__radd__()", "__iadd__()", ' - '"__mul__()",\n' - '"__rmul__()" and "__imul__()" described below; they should ' - 'not define\n' - 'other numerical operators. It is recommended that both ' - 'mappings and\n' - 'sequences implement the "__contains__()" method to allow ' - 'efficient use\n' - 'of the "in" operator; for mappings, "in" should search the ' - 'mapping’s\n' - 'keys; for sequences, it should search through the values. ' - 'It is\n' - 'further recommended that both mappings and sequences ' - 'implement the\n' + 'multiplication (meaning repetition) by defining the ' + 'methods\n' + '"__add__()", "__radd__()", "__iadd__()", "__mul__()", ' + '"__rmul__()" and\n' + '"__imul__()" described below; they should not define other ' + 'numerical\n' + 'operators. It is recommended that both mappings and ' + 'sequences\n' + 'implement the "__contains__()" method to allow efficient ' + 'use of the\n' + '"in" operator; for mappings, "in" should search the ' + 'mapping’s keys;\n' + 'for sequences, it should search through the values. It is ' + 'further\n' + 'recommended that both mappings and sequences implement ' + 'the\n' '"__iter__()" method to allow efficient iteration through ' 'the\n' 'container; for mappings, "__iter__()" should iterate ' @@ -9591,9 +9711,12 @@ 'the\n' 'second argument.\n' '\n' - 'This operation can be customized using the special ' - '"__lshift__()" and\n' - '"__rshift__()" methods.\n' + 'The left shift operation can be customized using the special\n' + '"__lshift__()" and "__rlshift__()" methods. The right shift ' + 'operation\n' + 'can be customized using the special "__rshift__()" and ' + '"__rrshift__()"\n' + 'methods.\n' '\n' 'A right shift by *n* bits is defined as floor division by ' '"pow(2,n)".\n' @@ -9659,20 +9782,6 @@ '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 ' @@ -9687,39 +9796,26 @@ '\n' ' Added in version 3.3.\n' '\n' - 'definition.__type_params__\n' - '\n' - ' The type parameters of generic classes, functions, and ' - 'type\n' - ' aliases.\n' - '\n' - ' Added in version 3.12.\n' - '\n' - 'class.__mro__\n' + 'definition.__module__\n' '\n' - ' This attribute is a tuple of classes that are considered ' - 'when\n' - ' looking for base classes during method resolution.\n' + ' The name of the module in which a class or function was ' + 'defined.\n' '\n' - 'class.mro()\n' + 'definition.__doc__\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' + ' The documentation string of a class or function, or ' + '"None" if\n' + ' undefined.\n' '\n' - 'class.__subclasses__()\n' + 'definition.__type_params__\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. The list is in definition order. Example:\n' + ' The type parameters of generic classes, functions, and ' + 'type\n' + ' aliases. For classes and functions that are not generic, ' + 'this will\n' + ' be an empty tuple.\n' '\n' - ' >>> int.__subclasses__()\n' - " [, , , " - "]\n", + ' Added in version 3.12.\n', 'specialnames': 'Special method names\n' '********************\n' '\n' @@ -9863,6 +9959,10 @@ ' It is not guaranteed that "__del__()" methods are called ' 'for\n' ' objects that still exist when the interpreter exits.\n' + ' "weakref.finalize" provides a straightforward way to ' + 'register a\n' + ' cleanup function to be called when an object is garbage ' + 'collected.\n' '\n' ' Note:\n' '\n' @@ -9949,17 +10049,19 @@ '\n' ' This is typically used for debugging, so it is important ' 'that the\n' - ' representation is information-rich and unambiguous.\n' + ' representation is information-rich and unambiguous. A ' + 'default\n' + ' implementation is provided by the "object" class itself.\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' + ' Called by "str(object)", the default "__format__()" ' + 'implementation,\n' + ' and the built-in function "print()", to compute the ' + '“informal” or\n' + ' nicely printable string representation of an object. The ' + 'return\n' + ' value must be a str object.\n' '\n' ' This method differs from "object.__repr__()" in that ' 'there is no\n' @@ -9975,7 +10077,9 @@ '\n' ' Called by bytes to compute a byte-string representation ' 'of an\n' - ' object. This should return a "bytes" object.\n' + ' object. This should return a "bytes" object. The "object" ' + 'class\n' + ' itself does not provide this method.\n' '\n' 'object.__format__(self, format_spec)\n' '\n' @@ -10003,6 +10107,10 @@ '\n' ' The return value must be a string object.\n' '\n' + ' The default implementation by the "object" class should ' + 'be given an\n' + ' empty *format_spec* string. It delegates to "__str__()".\n' + '\n' ' Changed in version 3.4: The __format__ method of "object" ' 'itself\n' ' raises a "TypeError" if passed any non-empty string.\n' @@ -10060,6 +10168,16 @@ ' ordering operations from a single root operation, see\n' ' "functools.total_ordering()".\n' '\n' + ' By default, the "object" class provides implementations ' + 'consistent\n' + ' with Value comparisons: equality compares according to ' + 'object\n' + ' identity, and order comparisons raise "TypeError". Each ' + 'default\n' + ' method may generate these results directly, but may also ' + 'return\n' + ' "NotImplemented".\n' + '\n' ' See the paragraph on "__hash__()" for some important ' 'notes on\n' ' creating *hashable* objects which support custom ' @@ -10145,12 +10263,13 @@ '\n' ' User-defined classes have "__eq__()" and "__hash__()" ' 'methods by\n' - ' default; with them, all objects compare unequal (except ' - 'with\n' - ' themselves) and "x.__hash__()" returns an appropriate ' - 'value such\n' - ' that "x == y" implies both that "x is y" and "hash(x) == ' - 'hash(y)".\n' + ' default (inherited from the "object" class); with them, ' + 'all objects\n' + ' compare unequal (except with themselves) and ' + '"x.__hash__()" returns\n' + ' an appropriate value such that "x == y" implies both that ' + '"x is y"\n' + ' and "hash(x) == hash(y)".\n' '\n' ' A class that overrides "__eq__()" and does not define ' '"__hash__()"\n' @@ -10219,9 +10338,9 @@ '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' + ' neither "__len__()" nor "__bool__()" (which is true of ' + 'the "object"\n' + ' class itself), all its instances are considered true.\n' '\n' '\n' 'Customizing attribute access\n' @@ -10245,7 +10364,8 @@ 'either\n' ' return the (computed) attribute value or raise an ' '"AttributeError"\n' - ' exception.\n' + ' exception. The "object" class itself does not provide ' + 'this method.\n' '\n' ' Note that if the attribute is found through the normal ' 'mechanism,\n' @@ -10425,7 +10545,9 @@ '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' + 'the key of the property in the owner class’ "__dict__". The ' + '"object"\n' + 'class itself does not implement any of these protocols.\n' '\n' 'object.__get__(self, instance, owner=None)\n' '\n' @@ -10661,11 +10783,13 @@ 'the class\n' ' where it is defined. *__slots__* declared in parents are ' 'available\n' - ' in child classes. However, child subclasses will get a ' - '"__dict__"\n' - ' and *__weakref__* unless they also define *__slots__* ' - '(which should\n' - ' only contain names of any *additional* slots).\n' + ' in child classes. However, instances of a child subclass ' + 'will get a\n' + ' "__dict__" and *__weakref__* unless the subclass also ' + 'defines\n' + ' *__slots__* (which should only contain names of any ' + '*additional*\n' + ' slots).\n' '\n' '* If a class defines a slot also defined in a base class, ' 'the instance\n' @@ -11082,7 +11206,7 @@ 'built-in\n' 'types), including other ABCs.\n' '\n' - 'class.__instancecheck__(self, instance)\n' + 'type.__instancecheck__(self, instance)\n' '\n' ' Return true if *instance* should be considered a (direct ' 'or\n' @@ -11090,7 +11214,7 @@ 'implement\n' ' "isinstance(instance, class)".\n' '\n' - 'class.__subclasscheck__(self, subclass)\n' + 'type.__subclasscheck__(self, subclass)\n' '\n' ' Return true if *subclass* should be considered a (direct ' 'or\n' @@ -11306,7 +11430,9 @@ ' Called when the instance is “called” as a function; if ' 'this method\n' ' is defined, "x(arg1, arg2, ...)" roughly translates to\n' - ' "type(x).__call__(x, arg1, ...)".\n' + ' "type(x).__call__(x, arg1, ...)". The "object" class ' + 'itself does\n' + ' not provide this method.\n' '\n' '\n' 'Emulating container types\n' @@ -11314,54 +11440,54 @@ '\n' 'The following methods can be defined to implement container ' 'objects.\n' - 'Containers usually are *sequences* (such as "lists" or ' - '"tuples") or\n' - '*mappings* (like "dictionaries"), but can represent other ' - 'containers\n' - 'as well. The first set of methods is used either to emulate ' - 'a\n' - 'sequence or to emulate a mapping; the difference is that for ' - 'a\n' - 'sequence, the allowable keys should be the integers *k* for ' - 'which "0\n' - '<= k < N" where *N* is the length of the sequence, or ' - '"slice" objects,\n' - 'which define a range of items. It is also recommended that ' - 'mappings\n' - 'provide the methods "keys()", "values()", "items()", ' - '"get()",\n' - '"clear()", "setdefault()", "pop()", "popitem()", "copy()", ' - 'and\n' - '"update()" behaving similar to those for Python’s standard\n' - '"dictionary" objects. The "collections.abc" module provides ' - 'a\n' - '"MutableMapping" *abstract base class* to help create those ' - 'methods\n' - 'from a base set of "__getitem__()", "__setitem__()", ' - '"__delitem__()",\n' - 'and "keys()". Mutable sequences should provide methods ' - '"append()",\n' - '"count()", "index()", "extend()", "insert()", "pop()", ' - '"remove()",\n' - '"reverse()" and "sort()", like Python standard "list" ' + 'None of them are provided by the "object" class itself. ' + 'Containers\n' + 'usually are *sequences* (such as "lists" or "tuples") or ' + '*mappings*\n' + '(like *dictionaries*), but can represent other containers as ' + 'well.\n' + 'The 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' - 'Finally, sequence types should implement addition (meaning\n' - 'concatenation) and multiplication (meaning repetition) by ' - 'defining the\n' - 'methods "__add__()", "__radd__()", "__iadd__()", ' - '"__mul__()",\n' - '"__rmul__()" and "__imul__()" described below; they should ' - 'not define\n' - 'other numerical operators. It is recommended that both ' - 'mappings and\n' - 'sequences implement the "__contains__()" method to allow ' - 'efficient use\n' - 'of the "in" operator; for mappings, "in" should search the ' - 'mapping’s\n' - 'keys; for sequences, it should search through the values. ' - 'It is\n' - 'further recommended that both mappings and sequences ' - 'implement the\n' + 'The "collections.abc" module provides a "MutableMapping" ' + '*abstract\n' + 'base class* to help create those methods from a base set of\n' + '"__getitem__()", "__setitem__()", "__delitem__()", and ' + '"keys()".\n' + 'Mutable sequences should provide methods "append()", ' + '"count()",\n' + '"index()", "extend()", "insert()", "pop()", "remove()", ' + '"reverse()"\n' + 'and "sort()", like Python standard "list" objects. Finally, ' + 'sequence\n' + 'types should implement addition (meaning concatenation) and\n' + 'multiplication (meaning repetition) by defining the methods\n' + '"__add__()", "__radd__()", "__iadd__()", "__mul__()", ' + '"__rmul__()" and\n' + '"__imul__()" described below; they should not define other ' + 'numerical\n' + 'operators. It is recommended that both mappings and ' + 'sequences\n' + 'implement the "__contains__()" method to allow efficient use ' + 'of the\n' + '"in" operator; for mappings, "in" should search the ' + 'mapping’s keys;\n' + 'for sequences, it should search through the values. It is ' + 'further\n' + 'recommended that both mappings and sequences implement the\n' '"__iter__()" method to allow efficient iteration through ' 'the\n' 'container; for mappings, "__iter__()" should iterate through ' @@ -11777,6 +11903,9 @@ '\n' 'For more information on context managers, see Context ' 'Manager Types.\n' + 'The "object" class itself does not provide the context ' + 'manager\n' + 'methods.\n' '\n' 'object.__enter__(self)\n' '\n' @@ -12657,11 +12786,11 @@ ' 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' + ' may consist of multiple characters as a single ' + 'delimiter (to split\n' + ' with multiple delimiters, use "re.split()"). Splitting ' + 'an empty\n' + ' string with a specified separator returns "[\'\']".\n' '\n' ' For example:\n' '\n' @@ -12671,6 +12800,8 @@ " ['1', '2,3']\n" " >>> '1,2,,3,'.split(',')\n" " ['1', '2', '', '3', '']\n" + " >>> '1<>2<>3<4'.split('<>')\n" + " ['1', '2', '3<4']\n" '\n' ' If *sep* is not specified or is "None", a different ' 'splitting\n' @@ -13013,15 +13144,13 @@ 'greater must be expressed with escapes.\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' + 'letter "\'r\'" or "\'R\'"; such constructs are called *raw ' + 'string\n' + 'literals* and *raw bytes literals* respectively and treat ' + 'backslashes\n' + 'as literal characters. As a result, in raw string literals, ' + '"\'\\U\'"\n' + 'and "\'\\u\'" escapes are not treated specially.\n' '\n' 'Added in version 3.3: The "\'rb\'" prefix of raw bytes literals ' 'has been\n' @@ -13212,7 +13341,8 @@ '*generic\n' 'class* will generally return a GenericAlias object.\n' '\n' - ' subscription ::= primary "[" expression_list "]"\n' + ' subscription ::= primary "[" flexible_expression_list ' + '"]"\n' '\n' 'When an object is subscripted, the interpreter will ' 'evaluate the\n' @@ -13231,13 +13361,18 @@ 'see\n' '__class_getitem__ versus __getitem__.\n' '\n' - 'If the expression list contains at least one comma, it will ' - 'evaluate\n' - 'to a "tuple" containing the items of the expression list. ' - 'Otherwise,\n' - 'the expression list will evaluate to the value of the ' - 'list’s sole\n' - 'member.\n' + 'If the expression list contains at least one comma, or if ' + 'any of the\n' + 'expressions are starred, the expression list will evaluate ' + 'to a\n' + '"tuple" containing the items of the expression list. ' + 'Otherwise, the\n' + 'expression list will evaluate to the value of the list’s ' + 'sole member.\n' + '\n' + 'Changed in version 3.11: Expressions in an expression list ' + 'may be\n' + 'starred. See **PEP 646**.\n' '\n' 'For built-in objects, there are two types of objects that ' 'support\n' @@ -13351,14 +13486,15 @@ 'clauses in turn until one is found that matches the exception. An\n' 'expression-less "except" clause, if present, must be last; it ' 'matches\n' - 'any exception. For an "except" clause with an expression, that\n' - 'expression is evaluated, and the clause matches the exception if the\n' - 'resulting object is “compatible” with the exception. An object is\n' - 'compatible with an exception if the object is the class or a *non-\n' - 'virtual base class* of the exception object, or a tuple containing ' - 'an\n' - 'item that is the class or a non-virtual base class of the exception\n' - 'object.\n' + 'any exception.\n' + '\n' + 'For an "except" clause with an expression, the expression must\n' + 'evaluate to an exception type or a tuple of exception types. The\n' + 'raised exception matches an "except" clause whose expression ' + 'evaluates\n' + 'to the class or a *non-virtual base class* of the exception object, ' + 'or\n' + 'to a tuple that contains such a class.\n' '\n' 'If no "except" clause matches the exception, the search for an\n' 'exception handler continues in the surrounding code and on the\n' @@ -13487,12 +13623,13 @@ ' ...\n' " ExceptionGroup('', (BlockingIOError()))\n" '\n' - 'An "except*" clause must have a matching type, and this type cannot ' - 'be\n' - 'a subclass of "BaseExceptionGroup". It is not possible to mix ' - '"except"\n' - 'and "except*" in the same "try". "break", "continue" and "return"\n' - 'cannot appear in an "except*" clause.\n' + 'An "except*" clause must have a matching expression; it cannot be\n' + '"except*:". Furthermore, this expression cannot contain exception\n' + 'group types, because that would have ambiguous semantics.\n' + '\n' + 'It is not possible to mix "except" and "except*" in the same "try".\n' + '"break", "continue" and "return" cannot appear in an "except*" ' + 'clause.\n' '\n' '\n' '"else" clause\n' @@ -13653,7 +13790,7 @@ '\n' '* A sign is shown only when the number is negative.\n' '\n' - 'Python distinguishes between integers, floating point numbers, and\n' + 'Python distinguishes between integers, floating-point numbers, and\n' 'complex numbers:\n' '\n' '\n' @@ -13698,28 +13835,28 @@ '"numbers.Real" ("float")\n' '------------------------\n' '\n' - 'These represent machine-level double precision floating point ' + 'These represent machine-level double precision floating-point ' 'numbers.\n' 'You are at the mercy of the underlying machine architecture (and C ' 'or\n' 'Java implementation) for the accepted range and handling of ' 'overflow.\n' - 'Python does not support single-precision floating point numbers; ' + 'Python does not support single-precision floating-point numbers; ' 'the\n' 'savings in processor and memory usage that are usually the reason ' 'for\n' 'using these are dwarfed by the overhead of using objects in Python, ' 'so\n' 'there is no reason to complicate the language with two kinds of\n' - 'floating point numbers.\n' + 'floating-point numbers.\n' '\n' '\n' '"numbers.Complex" ("complex")\n' '-----------------------------\n' '\n' 'These represent complex numbers as a pair of machine-level double\n' - 'precision floating point numbers. The same caveats apply as for\n' - 'floating point numbers. The real and imaginary parts of a complex\n' + 'precision floating-point numbers. The same caveats apply as for\n' + 'floating-point numbers. The real and imaginary parts of a complex\n' 'number "z" can be retrieved through the read-only attributes ' '"z.real"\n' 'and "z.imag".\n' @@ -13913,8 +14050,7 @@ 'however removing a key and re-inserting it will add it to the end\n' 'instead of keeping its old place.\n' '\n' - 'Dictionaries are mutable; they can be created by the "{...}" ' - 'notation\n' + 'Dictionaries are mutable; they can be created by the "{}" notation\n' '(see section Dictionary displays).\n' '\n' 'The extension modules "dbm.ndbm" and "dbm.gnu" provide additional\n' @@ -13985,8 +14121,8 @@ '|====================================================|====================================================|\n' '| function.__doc__ | The ' 'function’s documentation string, or "None" if |\n' - '| | unavailable. ' - 'Not inherited by subclasses. |\n' + '| | ' + 'unavailable. |\n' '+----------------------------------------------------+----------------------------------------------------+\n' '| function.__name__ | The ' 'function’s name. See also: "__name__ |\n' @@ -14134,21 +14270,10 @@ 'to\n' 'calling "f(C,1)" where "f" is the underlying function.\n' '\n' - 'Note that the transformation from function object to instance ' - 'method\n' - 'object happens each time the attribute is retrieved from the ' - 'instance.\n' - 'In some cases, a fruitful optimization is to assign the attribute ' - 'to a\n' - 'local variable and call that local variable. Also notice that this\n' - 'transformation only happens for user-defined functions; other ' - 'callable\n' - 'objects (and all non-callable objects) are retrieved without\n' - 'transformation. It is also important to note that user-defined\n' - 'functions which are attributes of a class instance are not ' - 'converted\n' - 'to bound methods; this *only* happens when the function is an\n' - 'attribute of the class.\n' + 'It is important to note that user-defined functions which are\n' + 'attributes of a class instance are not converted to bound methods;\n' + 'this *only* happens when the function is an attribute of the ' + 'class.\n' '\n' '\n' 'Generator functions\n' @@ -14285,43 +14410,254 @@ 'e.g.,\n' '"m.x = 1" is equivalent to "m.__dict__["x"] = 1".\n' '\n' - 'Predefined (writable) attributes:\n' '\n' - ' "__name__"\n' - ' The module’s name.\n' + 'Import-related attributes on module objects\n' + '-------------------------------------------\n' + '\n' + 'Module objects have the following attributes that relate to the ' + 'import\n' + 'system. When a module is created using the machinery associated ' + 'with\n' + 'the import system, these attributes are filled in based on the\n' + 'module’s *spec*, before the *loader* executes and loads the ' + 'module.\n' + '\n' + 'To create a module dynamically rather than using the import ' + 'system,\n' + 'it’s recommended to use "importlib.util.module_from_spec()", which\n' + 'will set the various import-controlled attributes to appropriate\n' + 'values. It’s also possible to use the "types.ModuleType" ' + 'constructor\n' + 'to create modules directly, but this technique is more error-prone, ' + 'as\n' + 'most attributes must be manually set on the module object after it ' + 'has\n' + 'been created when using this approach.\n' + '\n' + 'Caution:\n' + '\n' + ' With the exception of "__name__", it is **strongly** recommended\n' + ' that you rely on "__spec__" and its attributes instead of any of ' + 'the\n' + ' other individual attributes listed in this subsection. Note that\n' + ' updating an attribute on "__spec__" will not update the\n' + ' corresponding attribute on the module itself:\n' + '\n' + ' >>> import typing\n' + ' >>> typing.__name__, typing.__spec__.name\n' + " ('typing', 'typing')\n" + " >>> typing.__spec__.name = 'spelling'\n" + ' >>> typing.__name__, typing.__spec__.name\n' + " ('typing', 'spelling')\n" + " >>> typing.__name__ = 'keyboard_smashing'\n" + ' >>> typing.__name__, typing.__spec__.name\n' + " ('keyboard_smashing', 'spelling')\n" + '\n' + 'module.__name__\n' + '\n' + ' The name used to uniquely identify the module in the import ' + 'system.\n' + ' For a directly executed module, this will be set to ' + '""__main__"".\n' + '\n' + ' This attribute must be set to the fully qualified name of the\n' + ' module. It is expected to match the value of\n' + ' "module.__spec__.name".\n' + '\n' + 'module.__spec__\n' + '\n' + ' A record of the module’s import-system-related state.\n' + '\n' + ' Set to the "module spec" that was used when importing the ' + 'module.\n' + ' See Module specs for more details.\n' + '\n' + ' Added in version 3.4.\n' + '\n' + 'module.__package__\n' + '\n' + ' The *package* a module belongs to.\n' + '\n' + ' If the module is top-level (that is, not a part of any specific\n' + ' package) then the attribute should be set to "\'\'" (the empty\n' + ' string). Otherwise, it should be set to the name of the ' + 'module’s\n' + ' package (which can be equal to "module.__name__" if the module\n' + ' itself is a package). See **PEP 366** for further details.\n' + '\n' + ' This attribute is used instead of "__name__" to calculate ' + 'explicit\n' + ' relative imports for main modules. It defaults to "None" for\n' + ' modules created dynamically using the "types.ModuleType"\n' + ' constructor; use "importlib.util.module_from_spec()" instead to\n' + ' ensure the attribute is set to a "str".\n' + '\n' + ' It is **strongly** recommended that you use\n' + ' "module.__spec__.parent" instead of "module.__package__".\n' + ' "__package__" is now only used as a fallback if ' + '"__spec__.parent"\n' + ' is not set, and this fallback path is deprecated.\n' + '\n' + ' Changed in version 3.4: This attribute now defaults to "None" ' + 'for\n' + ' modules created dynamically using the "types.ModuleType"\n' + ' constructor. Previously the attribute was optional.\n' + '\n' + ' Changed in version 3.6: The value of "__package__" is expected ' + 'to\n' + ' be the same as "__spec__.parent". "__package__" is now only used ' + 'as\n' + ' a fallback during import resolution if "__spec__.parent" is not\n' + ' defined.\n' '\n' - ' "__doc__"\n' - ' The module’s documentation string, or "None" if unavailable.\n' + ' Changed in version 3.10: "ImportWarning" is raised if an import\n' + ' resolution falls back to "__package__" instead of\n' + ' "__spec__.parent".\n' '\n' - ' "__file__"\n' - ' The pathname of the file from which the module was loaded, if ' - 'it\n' - ' was loaded from a file. The "__file__" attribute may be ' - 'missing\n' - ' for certain types of modules, such as C modules that are\n' - ' statically linked into the interpreter. For extension ' + ' Changed in version 3.12: Raise "DeprecationWarning" instead of\n' + ' "ImportWarning" when falling back to "__package__" during ' + 'import\n' + ' resolution.\n' + '\n' + 'module.__loader__\n' + '\n' + ' The *loader* object that the import machinery used to load the\n' + ' module.\n' + '\n' + ' This attribute is mostly useful for introspection, but can be ' + 'used\n' + ' for additional loader-specific functionality, for example ' + 'getting\n' + ' data associated with a loader.\n' + '\n' + ' "__loader__" defaults to "None" for modules created dynamically\n' + ' using the "types.ModuleType" constructor; use\n' + ' "importlib.util.module_from_spec()" instead to ensure the ' + 'attribute\n' + ' is set to a *loader* object.\n' + '\n' + ' It is **strongly** recommended that you use\n' + ' "module.__spec__.loader" instead of "module.__loader__".\n' + '\n' + ' Changed in version 3.4: This attribute now defaults to "None" ' + 'for\n' + ' modules created dynamically using the "types.ModuleType"\n' + ' constructor. Previously the attribute was optional.\n' + '\n' + ' Deprecated since version 3.12, will be removed in version 3.16:\n' + ' Setting "__loader__" on a module while failing to set\n' + ' "__spec__.loader" is deprecated. In Python 3.16, "__loader__" ' + 'will\n' + ' cease to be set or taken into consideration by the import system ' + 'or\n' + ' the standard library.\n' + '\n' + 'module.__path__\n' + '\n' + ' A (possibly empty) *sequence* of strings enumerating the ' + 'locations\n' + ' where the package’s submodules will be found. Non-package ' 'modules\n' - ' loaded dynamically from a shared library, it’s the pathname ' - 'of\n' - ' the shared library file.\n' + ' should not have a "__path__" attribute. See __path__ attributes ' + 'on\n' + ' modules for more details.\n' '\n' - ' "__annotations__"\n' - ' A dictionary containing *variable annotations* collected ' - 'during\n' - ' module body execution. For best practices on working with\n' - ' "__annotations__", please see Annotations Best Practices.\n' + ' It is **strongly** recommended that you use\n' + ' "module.__spec__.submodule_search_locations" instead of\n' + ' "module.__path__".\n' '\n' - 'Special read-only attribute: "__dict__" is the module’s namespace ' - 'as a\n' - 'dictionary object.\n' + 'module.__file__\n' '\n' - '**CPython implementation detail:** Because of the way CPython ' - 'clears\n' - 'module dictionaries, the module dictionary will be cleared when ' + 'module.__cached__\n' + '\n' + ' "__file__" and "__cached__" are both optional attributes that ' + 'may\n' + ' or may not be set. Both attributes should be a "str" when they ' + 'are\n' + ' available.\n' + '\n' + ' "__file__" indicates the pathname of the file from which the ' + 'module\n' + ' was loaded (if loaded from a file), or the pathname of the ' + 'shared\n' + ' library file for extension modules loaded dynamically from a ' + 'shared\n' + ' library. It might be missing for certain types of modules, such ' + 'as\n' + ' C modules that are statically linked into the interpreter, and ' 'the\n' - 'module falls out of scope even if the dictionary still has live\n' - 'references. To avoid this, copy the dictionary or keep the module\n' - 'around while using its dictionary directly.\n' + ' import system may opt to leave it unset if it has no semantic\n' + ' meaning (for example, a module loaded from a database).\n' + '\n' + ' If "__file__" is set then the "__cached__" attribute might also ' + 'be\n' + ' set, which is the path to any compiled version of the code ' + '(for\n' + ' example, a byte-compiled file). The file does not need to exist ' + 'to\n' + ' set this attribute; the path can simply point to where the ' + 'compiled\n' + ' file *would* exist (see **PEP 3147**).\n' + '\n' + ' Note that "__cached__" may be set even if "__file__" is not ' + 'set.\n' + ' However, that scenario is quite atypical. Ultimately, the ' + '*loader*\n' + ' is what makes use of the module spec provided by the *finder* ' + '(from\n' + ' which "__file__" and "__cached__" are derived). So if a loader ' + 'can\n' + ' load from a cached module but otherwise does not load from a ' + 'file,\n' + ' that atypical scenario may be appropriate.\n' + '\n' + ' It is **strongly** recommended that you use\n' + ' "module.__spec__.cached" instead of "module.__cached__".\n' + '\n' + '\n' + 'Other writable attributes on module objects\n' + '-------------------------------------------\n' + '\n' + 'As well as the import-related attributes listed above, module ' + 'objects\n' + 'also have the following writable attributes:\n' + '\n' + 'module.__doc__\n' + '\n' + ' The module’s documentation string, or "None" if unavailable. ' + 'See\n' + ' also: "__doc__ attributes".\n' + '\n' + 'module.__annotations__\n' + '\n' + ' A dictionary containing *variable annotations* collected during\n' + ' module body execution. For best practices on working with\n' + ' "__annotations__", please see Annotations Best Practices.\n' + '\n' + '\n' + 'Module dictionaries\n' + '-------------------\n' + '\n' + 'Module objects also have the following special read-only ' + 'attribute:\n' + '\n' + 'module.__dict__\n' + '\n' + ' The module’s namespace as a dictionary object. Uniquely among ' + 'the\n' + ' attributes listed here, "__dict__" cannot be accessed as a ' + 'global\n' + ' variable from within a module; it can only be accessed as an\n' + ' attribute on module objects.\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' '\n' 'Custom classes\n' @@ -14367,32 +14703,104 @@ 'A class object can be called (see above) to yield a class instance\n' '(see below).\n' '\n' - 'Special attributes:\n' '\n' - ' "__name__"\n' - ' The class name.\n' + 'Special attributes\n' + '------------------\n' + '\n' + '+----------------------------------------------------+----------------------------------------------------+\n' + '| Attribute | ' + 'Meaning |\n' + '|====================================================|====================================================|\n' + '| type.__name__ | The class’s ' + 'name. See also: "__name__ attributes". |\n' + '+----------------------------------------------------+----------------------------------------------------+\n' + '| type.__qualname__ | The class’s ' + '*qualified name*. See also: |\n' + '| | ' + '"__qualname__ attributes". |\n' + '+----------------------------------------------------+----------------------------------------------------+\n' + '| type.__module__ | The name of ' + 'the module in which the class was |\n' + '| | ' + 'defined. |\n' + '+----------------------------------------------------+----------------------------------------------------+\n' + '| type.__dict__ | A "mapping ' + 'proxy" providing a read-only view of |\n' + '| | the class’s ' + 'namespace. See also: "__dict__ |\n' + '| | ' + 'attributes". |\n' + '+----------------------------------------------------+----------------------------------------------------+\n' + '| type.__bases__ | A "tuple" ' + 'containing the class’s bases. In most |\n' + '| | cases, for a ' + 'class defined as "class X(A, B, C)", |\n' + '| | ' + '"X.__bases__" will be exactly equal to "(A, B, |\n' + '| | ' + 'C)". |\n' + '+----------------------------------------------------+----------------------------------------------------+\n' + '| type.__doc__ | The class’s ' + 'documentation string, or "None" if |\n' + '| | undefined. ' + 'Not inherited by subclasses. |\n' + '+----------------------------------------------------+----------------------------------------------------+\n' + '| type.__annotations__ | A dictionary ' + 'containing *variable annotations* |\n' + '| | collected ' + 'during class body execution. For best |\n' + '| | practices on ' + 'working with "__annotations__", |\n' + '| | please see ' + 'Annotations Best Practices. Caution: |\n' + '| | Accessing ' + 'the "__annotations__" attribute of a |\n' + '| | class object ' + 'directly may yield incorrect results |\n' + '| | in the ' + 'presence of metaclasses. In addition, the |\n' + '| | attribute ' + 'may not exist for some classes. Use |\n' + '| | ' + '"inspect.get_annotations()" to retrieve class |\n' + '| | annotations ' + 'safely. |\n' + '+----------------------------------------------------+----------------------------------------------------+\n' + '| type.__type_params__ | A "tuple" ' + 'containing the type parameters of a |\n' + '| | generic ' + 'class. Added in version 3.12. |\n' + '+----------------------------------------------------+----------------------------------------------------+\n' + '| type.__mro__ | The "tuple" ' + 'of classes that are considered when |\n' + '| | looking for ' + 'base classes during method resolution. |\n' + '+----------------------------------------------------+----------------------------------------------------+\n' + '\n' + '\n' + 'Special methods\n' + '---------------\n' '\n' - ' "__module__"\n' - ' The name of the module in which the class was defined.\n' + 'In addition to the special attributes described above, all Python\n' + 'classes also have the following two methods available:\n' '\n' - ' "__dict__"\n' - ' The dictionary containing the class’s namespace.\n' + 'type.mro()\n' '\n' - ' "__bases__"\n' - ' A tuple containing the base classes, in the order of their\n' - ' occurrence in the base class list.\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' - ' "__doc__"\n' - ' The class’s documentation string, or "None" if undefined.\n' + 'type.__subclasses__()\n' '\n' - ' "__annotations__"\n' - ' A dictionary containing *variable annotations* collected ' - 'during\n' - ' class body execution. For best practices on working with\n' - ' "__annotations__", please see Annotations Best Practices.\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. The list is in definition order. Example:\n' '\n' - ' "__type_params__"\n' - ' A tuple containing the type parameters of a generic class.\n' + ' >>> class A: pass\n' + ' >>> class B(A): pass\n' + ' >>> A.__subclasses__()\n' + " []\n" '\n' '\n' 'Class instances\n' @@ -14432,8 +14840,19 @@ 'they have methods with certain special names. See section Special\n' 'method names.\n' '\n' - 'Special attributes: "__dict__" is the attribute dictionary;\n' - '"__class__" is the instance’s class.\n' + '\n' + 'Special attributes\n' + '------------------\n' + '\n' + 'object.__class__\n' + '\n' + ' The class to which a class instance belongs.\n' + '\n' + 'object.__dict__\n' + '\n' + ' A dictionary or other mapping object used to store an object’s\n' + ' (writable) attributes. Not all instances have a "__dict__"\n' + ' attribute; see the section on __slots__ for more details.\n' '\n' '\n' 'I/O objects (also known as file objects)\n' @@ -14573,7 +14992,7 @@ '| | version ' '3.12: This attribute of code objects is |\n' '| | deprecated, ' - 'and may be removed in Python 3.14. |\n' + 'and may be removed in Python 3.15. |\n' '+----------------------------------------------------+----------------------------------------------------+\n' '| codeobject.co_stacksize | The required ' 'stack size of the code object |\n' @@ -15028,21 +15447,23 @@ '\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' + ' If a positional argument is given and it defines a ' + '"keys()" method,\n' + ' a dictionary is created by calling "__getitem__()" on the ' + 'argument\n' + ' with each returned key from the method. Otherwise, the ' + 'positional\n' + ' argument must be an *iterable* object. Each item in the ' + 'iterable\n' + ' must itself be an iterable with exactly two elements. ' + 'The first\n' + ' element of each item becomes a key in the new dictionary, ' + 'and the\n' + ' second element the corresponding value. If a key occurs ' + 'more than\n' + ' once, the last value for that key becomes the ' + 'corresponding value\n' + ' in the new dictionary.\n' '\n' ' If keyword arguments are given, the keyword arguments and ' 'their\n' @@ -15155,7 +15576,7 @@ '\n' ' Return a shallow copy of the dictionary.\n' '\n' - ' classmethod fromkeys(iterable, value=None)\n' + ' classmethod fromkeys(iterable, value=None, /)\n' '\n' ' Create a new dictionary with keys from *iterable* and ' 'values set\n' @@ -15237,15 +15658,17 @@ '*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' + ' "update()" accepts either another object with a ' + '"keys()" method\n' + ' (in which case "__getitem__()" is called with every ' + 'key returned\n' + ' from the method) or an iterable of key/value pairs (as ' + 'tuples or\n' + ' other iterables of length two). If keyword arguments ' + 'are\n' + ' specified, the dictionary is then updated with those ' + 'key/value\n' + ' pairs: "d.update(red=1, blue=2)".\n' '\n' ' values()\n' '\n' @@ -15910,8 +16333,8 @@ '| | also removes it from ' '*s* | |\n' '+--------------------------------+----------------------------------+-----------------------+\n' - '| "s.remove(x)" | remove the first item from ' - '*s* | (3) |\n' + '| "s.remove(x)" | removes the first item from ' + '*s* | (3) |\n' '| | where "s[i]" is equal to ' '*x* | |\n' '+--------------------------------+----------------------------------+-----------------------+\n' @@ -15923,7 +16346,9 @@ '\n' 'Notes:\n' '\n' - '1. *t* must have the same length as the slice it is replacing.\n' + '1. If *k* is not equal to "1", *t* must have the same length as ' + 'the\n' + ' slice it is replacing.\n' '\n' '2. The optional argument *i* defaults to "-1", so that by ' 'default the\n' @@ -16280,7 +16705,7 @@ '\n' ' * The linspace recipe shows how to implement a lazy version of ' 'range\n' - ' suitable for floating point applications.\n', + ' suitable for floating-point applications.\n', 'typesseq-mutable': 'Mutable Sequence Types\n' '**********************\n' '\n' @@ -16373,8 +16798,8 @@ '| | also removes it from ' '*s* | |\n' '+--------------------------------+----------------------------------+-----------------------+\n' - '| "s.remove(x)" | remove the first item ' - 'from *s* | (3) |\n' + '| "s.remove(x)" | removes the first ' + 'item from *s* | (3) |\n' '| | where "s[i]" is equal ' 'to *x* | |\n' '+--------------------------------+----------------------------------+-----------------------+\n' @@ -16387,8 +16812,9 @@ '\n' 'Notes:\n' '\n' - '1. *t* must have the same length as the slice it is ' - 'replacing.\n' + '1. If *k* is not equal to "1", *t* must have the same ' + 'length as the\n' + ' slice it is replacing.\n' '\n' '2. The optional argument *i* defaults to "-1", so that ' 'by default the\n' @@ -16550,18 +16976,15 @@ ' enter = type(manager).__enter__\n' ' exit = type(manager).__exit__\n' ' value = enter(manager)\n' - ' hit_except = False\n' '\n' ' try:\n' ' TARGET = value\n' ' SUITE\n' ' except:\n' - ' hit_except = True\n' ' if not exit(manager, *sys.exc_info()):\n' ' raise\n' - ' finally:\n' - ' if not hit_except:\n' - ' exit(manager, None, None, None)\n' + ' else:\n' + ' exit(manager, None, None, None)\n' '\n' 'With more than one item, the context managers are processed as if\n' 'multiple "with" statements were nested:\n' @@ -16602,7 +17025,8 @@ '\n' 'A "yield" statement is semantically equivalent to a yield ' 'expression.\n' - 'The yield statement can be used to omit the parentheses that would\n' + 'The "yield" statement can be used to omit the parentheses that ' + 'would\n' 'otherwise be required in the equivalent yield expression ' 'statement.\n' 'For example, the yield statements\n' @@ -16618,10 +17042,9 @@ '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' + 'function. Using "yield" in a function definition is sufficient to\n' + 'cause that definition to create a generator function instead of a\n' + 'normal function.\n' '\n' 'For full details of "yield" semantics, refer to the Yield ' 'expressions\n' diff --git a/Lib/re/_casefix.py b/Lib/re/_casefix.py index 06507d08..fed2d84f 100644 --- a/Lib/re/_casefix.py +++ b/Lib/re/_casefix.py @@ -1,4 +1,4 @@ -# Auto-generated by Tools/scripts/generate_re_casefix.py. +# Auto-generated by Tools/build/generate_re_casefix.py. # Maps the code of lowercased character to codes of different lowercased # characters which have the same uppercase. diff --git a/Lib/re/_compiler.py b/Lib/re/_compiler.py index 285c2193..bb97f9fd 100644 --- a/Lib/re/_compiler.py +++ b/Lib/re/_compiler.py @@ -250,11 +250,11 @@ def _optimize_charset(charset, iscased=None, fixup=None, fixes=None): while True: try: if op is LITERAL: - if fixup: - lo = fixup(av) - charmap[lo] = 1 - if fixes and lo in fixes: - for k in fixes[lo]: + if fixup: # IGNORECASE and not LOCALE + av = fixup(av) + charmap[av] = 1 + if fixes and av in fixes: + for k in fixes[av]: charmap[k] = 1 if not hascased and iscased(av): hascased = True @@ -262,7 +262,7 @@ def _optimize_charset(charset, iscased=None, fixup=None, fixes=None): charmap[av] = 1 elif op is RANGE: r = range(av[0], av[1]+1) - if fixup: + if fixup: # IGNORECASE and not LOCALE if fixes: for i in map(fixup, r): charmap[i] = 1 @@ -289,8 +289,7 @@ def _optimize_charset(charset, iscased=None, fixup=None, fixes=None): # Character set contains non-BMP character codes. # For range, all BMP characters in the range are already # proceeded. - if fixup: - hascased = True + if fixup: # IGNORECASE and not LOCALE # For now, IN_UNI_IGNORE+LITERAL and # IN_UNI_IGNORE+RANGE_UNI_IGNORE work for all non-BMP # characters, because two characters (at least one of @@ -301,7 +300,13 @@ def _optimize_charset(charset, iscased=None, fixup=None, fixes=None): # Also, both c.lower() and c.lower().upper() are single # characters for every non-BMP character. if op is RANGE: - op = RANGE_UNI_IGNORE + if fixes: # not ASCII + op = RANGE_UNI_IGNORE + hascased = True + else: + assert op is LITERAL + if not hascased and iscased(av): + hascased = True tail.append((op, av)) break diff --git a/Lib/reprlib.py b/Lib/reprlib.py index a7b37630..85c1b94a 100644 --- a/Lib/reprlib.py +++ b/Lib/reprlib.py @@ -35,6 +35,17 @@ def wrapper(self): return decorating_function class Repr: + _lookup = { + 'tuple': 'builtins', + 'list': 'builtins', + 'array': 'array', + 'set': 'builtins', + 'frozenset': 'builtins', + 'deque': 'collections', + 'dict': 'builtins', + 'str': 'builtins', + 'int': 'builtins' + } def __init__( self, *, maxlevel=6, maxtuple=6, maxlist=6, maxarray=5, maxdict=4, @@ -59,14 +70,24 @@ def repr(self, x): return self.repr1(x, self.maxlevel) def repr1(self, x, level): - typename = type(x).__name__ + cls = type(x) + typename = cls.__name__ + if ' ' in typename: parts = typename.split() typename = '_'.join(parts) - if hasattr(self, 'repr_' + typename): - return getattr(self, 'repr_' + typename)(x, level) - else: - return self.repr_instance(x, level) + + method = getattr(self, 'repr_' + typename, None) + if method: + # not defined in this class + if typename not in self._lookup: + return method(x, level) + module = getattr(cls, '__module__', None) + # defined in this class and is the module intended + if module == self._lookup[typename]: + return method(x, level) + + return self.repr_instance(x, level) def _join(self, pieces, level): if self.indent is None: diff --git a/Lib/runpy.py b/Lib/runpy.py index 42f896c9..ef54d328 100644 --- a/Lib/runpy.py +++ b/Lib/runpy.py @@ -247,17 +247,17 @@ def _get_main_module_details(error=ImportError): sys.modules[main_name] = saved_main -def _get_code_from_file(run_name, fname): +def _get_code_from_file(fname): # Check for a compiled file first from pkgutil import read_code - decoded_path = os.path.abspath(os.fsdecode(fname)) - with io.open_code(decoded_path) as f: + code_path = os.path.abspath(fname) + with io.open_code(code_path) as f: code = read_code(f) if code is None: # That didn't work, so try it as normal source code - with io.open_code(decoded_path) as f: + with io.open_code(code_path) as f: code = compile(f.read(), fname, 'exec') - return code, fname + return code def run_path(path_name, init_globals=None, run_name=None): """Execute code located at the specified filesystem location. @@ -279,12 +279,13 @@ def run_path(path_name, init_globals=None, run_name=None): pkg_name = run_name.rpartition(".")[0] from pkgutil import get_importer importer = get_importer(path_name) + path_name = os.fsdecode(path_name) if isinstance(importer, type(None)): # Not a valid sys.path entry, so run the code directly # execfile() doesn't help as we want to allow compiled files - code, fname = _get_code_from_file(run_name, path_name) + code = _get_code_from_file(path_name) return _run_module_code(code, init_globals, run_name, - pkg_name=pkg_name, script_name=fname) + pkg_name=pkg_name, script_name=path_name) else: # Finder is defined for path, so add it to # the start of sys.path diff --git a/Lib/sched.py b/Lib/sched.py index 14613cf2..fb20639d 100644 --- a/Lib/sched.py +++ b/Lib/sched.py @@ -11,7 +11,7 @@ implement simulated time by writing your own functions. This can also be used to integrate scheduling with STDWIN events; the delay function is allowed to modify the queue. Time can be expressed as -integers or floating point numbers, as long as it is consistent. +integers or floating-point numbers, as long as it is consistent. Events are specified by tuples (time, priority, action, argument, kwargs). As in UNIX, lower priority numbers mean higher priority; in this diff --git a/Lib/shutil.py b/Lib/shutil.py index 20ad1cb5..2d285691 100644 --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -1534,21 +1534,21 @@ def which(cmd, mode=os.F_OK | os.X_OK, path=None): if sys.platform == "win32": # PATHEXT is necessary to check on Windows. pathext_source = os.getenv("PATHEXT") or _WIN_DEFAULT_PATHEXT - pathext = [ext for ext in pathext_source.split(os.pathsep) if ext] + pathext = pathext_source.split(os.pathsep) + pathext = [ext.rstrip('.') for ext in pathext if ext] if use_bytes: pathext = [os.fsencode(ext) for ext in pathext] - files = ([cmd] + [cmd + ext for ext in pathext]) + files = [cmd + ext for ext in pathext] - # gh-109590. If we are looking for an executable, we need to look - # for a PATHEXT match. The first cmd is the direct match - # (e.g. python.exe instead of python) - # Check that direct match first if and only if the extension is in PATHEXT - # Otherwise check it last - suffix = os.path.splitext(files[0])[1].upper() - if mode & os.X_OK and not any(suffix == ext.upper() for ext in pathext): - files.append(files.pop(0)) + # If X_OK in mode, simulate the cmd.exe behavior: look at direct + # match if and only if the extension is in PATHEXT. + # If X_OK not in mode, simulate the first result of where.exe: + # always look at direct match before a PATHEXT match. + normcmd = cmd.upper() + if not (mode & os.X_OK) or any(normcmd.endswith(ext.upper()) for ext in pathext): + files.insert(0, cmd) else: # On other platforms you don't have things like PATHEXT to tell you # what file suffixes are executable, so just pass on cmd as-is. @@ -1557,7 +1557,7 @@ def which(cmd, mode=os.F_OK | os.X_OK, path=None): seen = set() for dir in path: normdir = os.path.normcase(dir) - if not normdir in seen: + if normdir not in seen: seen.add(normdir) for thefile in files: name = os.path.join(dir, thefile) diff --git a/Lib/site.py b/Lib/site.py index 924cfbec..aed254ad 100644 --- a/Lib/site.py +++ b/Lib/site.py @@ -426,8 +426,9 @@ def setcopyright(): """Set 'copyright' and 'credits' in builtins""" builtins.copyright = _sitebuiltins._Printer("copyright", sys.copyright) builtins.credits = _sitebuiltins._Printer("credits", """\ - Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands - for supporting Python development. See www.python.org for more information.""") + Thanks to CWI, CNRI, BeOpen, Zope Corporation, the Python Software + Foundation, and a cast of thousands for supporting Python + development. See www.python.org for more information.""") files, dirs = [], [] # Not all modules are required to have a __file__ attribute. See # PEP 420 for more details. diff --git a/Lib/socket.py b/Lib/socket.py index d796082e..c1880c4e 100644 --- a/Lib/socket.py +++ b/Lib/socket.py @@ -592,16 +592,65 @@ def fromshare(info): return socket(0, 0, 0, info) __all__.append("fromshare") -if hasattr(_socket, "socketpair"): +# Origin: https://gist.github.com/4325783, by Geert Jansen. Public domain. +# This is used if _socket doesn't natively provide socketpair. It's +# always defined so that it can be patched in for testing purposes. +def _fallback_socketpair(family=AF_INET, type=SOCK_STREAM, proto=0): + if family == AF_INET: + host = _LOCALHOST + elif family == AF_INET6: + host = _LOCALHOST_V6 + else: + raise ValueError("Only AF_INET and AF_INET6 socket address families " + "are supported") + if type != SOCK_STREAM: + raise ValueError("Only SOCK_STREAM socket type is supported") + if proto != 0: + raise ValueError("Only protocol zero is supported") + + # We create a connected TCP socket. Note the trick with + # setblocking(False) that prevents us from having to create a thread. + lsock = socket(family, type, proto) + try: + lsock.bind((host, 0)) + lsock.listen() + # On IPv6, ignore flow_info and scope_id + addr, port = lsock.getsockname()[:2] + csock = socket(family, type, proto) + try: + csock.setblocking(False) + try: + csock.connect((addr, port)) + except (BlockingIOError, InterruptedError): + pass + csock.setblocking(True) + ssock, _ = lsock.accept() + except: + csock.close() + raise + finally: + lsock.close() - def socketpair(family=None, type=SOCK_STREAM, proto=0): - """socketpair([family[, type[, proto]]]) -> (socket object, socket object) + # Authenticating avoids using a connection from something else + # able to connect to {host}:{port} instead of us. + # We expect only AF_INET and AF_INET6 families. + try: + if ( + ssock.getsockname() != csock.getpeername() + or csock.getsockname() != ssock.getpeername() + ): + raise ConnectionError("Unexpected peer connection") + except: + # getsockname() and getpeername() can fail + # if either socket isn't connected. + ssock.close() + csock.close() + raise - Create a pair of socket objects from the sockets returned by the platform - socketpair() function. - The arguments are the same as for socket() except the default family is - AF_UNIX if defined on the platform; otherwise, the default is AF_INET. - """ + return (ssock, csock) + +if hasattr(_socket, "socketpair"): + def socketpair(family=None, type=SOCK_STREAM, proto=0): if family is None: try: family = AF_UNIX @@ -613,44 +662,7 @@ def socketpair(family=None, type=SOCK_STREAM, proto=0): return a, b else: - - # Origin: https://gist.github.com/4325783, by Geert Jansen. Public domain. - def socketpair(family=AF_INET, type=SOCK_STREAM, proto=0): - if family == AF_INET: - host = _LOCALHOST - elif family == AF_INET6: - host = _LOCALHOST_V6 - else: - raise ValueError("Only AF_INET and AF_INET6 socket address families " - "are supported") - if type != SOCK_STREAM: - raise ValueError("Only SOCK_STREAM socket type is supported") - if proto != 0: - raise ValueError("Only protocol zero is supported") - - # We create a connected TCP socket. Note the trick with - # setblocking(False) that prevents us from having to create a thread. - lsock = socket(family, type, proto) - try: - lsock.bind((host, 0)) - lsock.listen() - # On IPv6, ignore flow_info and scope_id - addr, port = lsock.getsockname()[:2] - csock = socket(family, type, proto) - try: - csock.setblocking(False) - try: - csock.connect((addr, port)) - except (BlockingIOError, InterruptedError): - pass - csock.setblocking(True) - ssock, _ = lsock.accept() - except: - csock.close() - raise - finally: - lsock.close() - return (ssock, csock) + socketpair = _fallback_socketpair __all__.append("socketpair") socketpair.__doc__ = """socketpair([family[, type[, proto]]]) -> (socket object, socket object) diff --git a/Lib/ssl.py b/Lib/ssl.py index 983c2db6..42ebb8ed 100644 --- a/Lib/ssl.py +++ b/Lib/ssl.py @@ -513,18 +513,17 @@ def set_alpn_protocols(self, alpn_protocols): self._set_alpn_protocols(protos) def _load_windows_store_certs(self, storename, purpose): - certs = bytearray() try: for cert, encoding, trust in enum_certificates(storename): # CA certs are never PKCS#7 encoded if encoding == "x509_asn": if trust is True or purpose.oid in trust: - certs.extend(cert) + try: + self.load_verify_locations(cadata=cert) + except SSLError as exc: + warnings.warn(f"Bad certificate in Windows certificate store: {exc!s}") except PermissionError: warnings.warn("unable to enumerate Windows certificate store") - if certs: - self.load_verify_locations(cadata=certs) - return certs def load_default_certs(self, purpose=Purpose.SERVER_AUTH): if not isinstance(purpose, _ASN1Object): diff --git a/Lib/statistics.py b/Lib/statistics.py index 6bd214bb..db108b3e 100644 --- a/Lib/statistics.py +++ b/Lib/statistics.py @@ -11,7 +11,7 @@ Function Description ================== ================================================== mean Arithmetic mean (average) of data. -fmean Fast, floating point arithmetic mean. +fmean Fast, floating-point arithmetic mean. geometric_mean Geometric mean of data. harmonic_mean Harmonic mean of data. median Median (middle value) of data. diff --git a/Lib/symtable.py b/Lib/symtable.py index 4b0bc6f4..f95639be 100644 --- a/Lib/symtable.py +++ b/Lib/symtable.py @@ -217,8 +217,37 @@ def get_methods(self): """ if self.__methods is None: d = {} + + def is_local_symbol(ident): + flags = self._table.symbols.get(ident, 0) + return ((flags >> SCOPE_OFF) & SCOPE_MASK) == LOCAL + for st in self._table.children: - d[st.name] = 1 + # pick the function-like symbols that are local identifiers + if is_local_symbol(st.name): + match st.type: + case _symtable.TYPE_FUNCTION: + # generators are of type TYPE_FUNCTION with a ".0" + # parameter as a first parameter (which makes them + # distinguishable from a function named 'genexpr') + if st.name == 'genexpr' and '.0' in st.varnames: + continue + d[st.name] = 1 + case _symtable.TYPE_TYPE_PARAM: + # Get the function-def block in the annotation + # scope 'st' with the same identifier, if any. + scope_name = st.name + for c in st.children: + if c.name == scope_name and c.type == _symtable.TYPE_FUNCTION: + # A generic generator of type TYPE_FUNCTION + # cannot be a direct child of 'st' (but it + # can be a descendant), e.g.: + # + # class A: + # type genexpr[genexpr] = (x for x in []) + assert scope_name != 'genexpr' or '.0' not in c.varnames + d[scope_name] = 1 + break self.__methods = tuple(d) return self.__methods diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index 122d441b..517b13ac 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -169,9 +169,7 @@ def joinuser(*args): _PY_VERSION = sys.version.split()[0] _PY_VERSION_SHORT = f'{sys.version_info[0]}.{sys.version_info[1]}' _PY_VERSION_SHORT_NO_DOT = f'{sys.version_info[0]}{sys.version_info[1]}' -_PREFIX = os.path.normpath(sys.prefix) _BASE_PREFIX = os.path.normpath(sys.base_prefix) -_EXEC_PREFIX = os.path.normpath(sys.exec_prefix) _BASE_EXEC_PREFIX = os.path.normpath(sys.base_exec_prefix) # Mutex guarding initialization of _CONFIG_VARS. _CONFIG_VARS_LOCK = threading.RLock() @@ -642,8 +640,10 @@ def _init_config_vars(): # Normalized versions of prefix and exec_prefix are handy to have; # in fact, these are the standard versions used most places in the # Distutils. - _CONFIG_VARS['prefix'] = _PREFIX - _CONFIG_VARS['exec_prefix'] = _EXEC_PREFIX + _PREFIX = os.path.normpath(sys.prefix) + _EXEC_PREFIX = os.path.normpath(sys.exec_prefix) + _CONFIG_VARS['prefix'] = _PREFIX # FIXME: This gets overwriten by _init_posix. + _CONFIG_VARS['exec_prefix'] = _EXEC_PREFIX # FIXME: This gets overwriten by _init_posix. _CONFIG_VARS['py_version'] = _PY_VERSION _CONFIG_VARS['py_version_short'] = _PY_VERSION_SHORT _CONFIG_VARS['py_version_nodot'] = _PY_VERSION_SHORT_NO_DOT @@ -711,6 +711,7 @@ def get_config_vars(*args): With arguments, return a list of values that result from looking up each argument in the configuration variable dictionary. """ + global _CONFIG_VARS_INITIALIZED # Avoid claiming the lock once initialization is complete. if not _CONFIG_VARS_INITIALIZED: @@ -721,6 +722,15 @@ def get_config_vars(*args): # don't re-enter init_config_vars(). if _CONFIG_VARS is None: _init_config_vars() + else: + # If the site module initialization happened after _CONFIG_VARS was + # initialized, a virtual environment might have been activated, resulting in + # variables like sys.prefix changing their value, so we need to re-init the + # config vars (see GH-126789). + if _CONFIG_VARS['base'] != os.path.normpath(sys.prefix): + with _CONFIG_VARS_LOCK: + _CONFIG_VARS_INITIALIZED = False + _init_config_vars() if args: vals = [] diff --git a/Lib/tabnanny.py b/Lib/tabnanny.py index e2ac6837..d06c4c22 100755 --- a/Lib/tabnanny.py +++ b/Lib/tabnanny.py @@ -107,14 +107,14 @@ def check(file): errprint("%r: Token Error: %s" % (file, msg)) return - except SyntaxError as msg: - errprint("%r: Token Error: %s" % (file, msg)) - return - except IndentationError as msg: errprint("%r: Indentation Error: %s" % (file, msg)) return + except SyntaxError as msg: + errprint("%r: Syntax Error: %s" % (file, msg)) + return + except NannyNag as nag: badline = nag.get_lineno() line = nag.get_line() diff --git a/Lib/tarfile.py b/Lib/tarfile.py index e1487e38..0a0f31ec 100755 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -843,6 +843,9 @@ def data_filter(member, dest_path): # Sentinel for replace() defaults, meaning "don't change the attribute" _KEEP = object() +# Header length is digits followed by a space. +_header_length_prefix_re = re.compile(br"([0-9]{1,20}) ") + class TarInfo(object): """Informational class which holds the details about an archive member given by a tar header block. @@ -1412,37 +1415,59 @@ def _proc_pax(self, tarfile): else: pax_headers = tarfile.pax_headers.copy() - # Check if the pax header contains a hdrcharset field. This tells us - # the encoding of the path, linkpath, uname and gname fields. Normally, - # these fields are UTF-8 encoded but since POSIX.1-2008 tar - # implementations are allowed to store them as raw binary strings if - # the translation to UTF-8 fails. - match = re.search(br"\d+ hdrcharset=([^\n]+)\n", buf) - if match is not None: - pax_headers["hdrcharset"] = match.group(1).decode("utf-8") - - # For the time being, we don't care about anything other than "BINARY". - # The only other value that is currently allowed by the standard is - # "ISO-IR 10646 2000 UTF-8" in other words UTF-8. - hdrcharset = pax_headers.get("hdrcharset") - if hdrcharset == "BINARY": - encoding = tarfile.encoding - else: - encoding = "utf-8" - # Parse pax header information. A record looks like that: # "%d %s=%s\n" % (length, keyword, value). length is the size # of the complete record including the length field itself and - # the newline. keyword and value are both UTF-8 encoded strings. - regex = re.compile(br"(\d+) ([^=]+)=") + # the newline. pos = 0 - while match := regex.match(buf, pos): - length, keyword = match.groups() - length = int(length) - if length == 0: + encoding = None + raw_headers = [] + while len(buf) > pos and buf[pos] != 0x00: + if not (match := _header_length_prefix_re.match(buf, pos)): + raise InvalidHeaderError("invalid header") + try: + length = int(match.group(1)) + except ValueError: + raise InvalidHeaderError("invalid header") + # Headers must be at least 5 bytes, shortest being '5 x=\n'. + # Value is allowed to be empty. + if length < 5: + raise InvalidHeaderError("invalid header") + if pos + length > len(buf): + raise InvalidHeaderError("invalid header") + + header_value_end_offset = match.start(1) + length - 1 # Last byte of the header + keyword_and_value = buf[match.end(1) + 1:header_value_end_offset] + raw_keyword, equals, raw_value = keyword_and_value.partition(b"=") + + # Check the framing of the header. The last character must be '\n' (0x0A) + if not raw_keyword or equals != b"=" or buf[header_value_end_offset] != 0x0A: raise InvalidHeaderError("invalid header") - value = buf[match.end(2) + 1:match.start(1) + length - 1] + raw_headers.append((length, raw_keyword, raw_value)) + + # Check if the pax header contains a hdrcharset field. This tells us + # the encoding of the path, linkpath, uname and gname fields. Normally, + # these fields are UTF-8 encoded but since POSIX.1-2008 tar + # implementations are allowed to store them as raw binary strings if + # the translation to UTF-8 fails. For the time being, we don't care about + # anything other than "BINARY". The only other value that is currently + # allowed by the standard is "ISO-IR 10646 2000 UTF-8" in other words UTF-8. + # Note that we only follow the initial 'hdrcharset' setting to preserve + # the initial behavior of the 'tarfile' module. + if raw_keyword == b"hdrcharset" and encoding is None: + if raw_value == b"BINARY": + encoding = tarfile.encoding + else: # This branch ensures only the first 'hdrcharset' header is used. + encoding = "utf-8" + pos += length + + # If no explicit hdrcharset is set, we use UTF-8 as a default. + if encoding is None: + encoding = "utf-8" + + # After parsing the raw headers we can decode them to text. + for length, raw_keyword, raw_value in raw_headers: # Normally, we could just use "utf-8" as the encoding and "strict" # as the error handler, but we better not take the risk. For # example, GNU tar <= 1.23 is known to store filenames it cannot @@ -1450,17 +1475,16 @@ def _proc_pax(self, tarfile): # hdrcharset=BINARY header). # We first try the strict standard encoding, and if that fails we # fall back on the user's encoding and error handler. - keyword = self._decode_pax_field(keyword, "utf-8", "utf-8", + keyword = self._decode_pax_field(raw_keyword, "utf-8", "utf-8", tarfile.errors) if keyword in PAX_NAME_FIELDS: - value = self._decode_pax_field(value, encoding, tarfile.encoding, + value = self._decode_pax_field(raw_value, encoding, tarfile.encoding, tarfile.errors) else: - value = self._decode_pax_field(value, "utf-8", "utf-8", + value = self._decode_pax_field(raw_value, "utf-8", "utf-8", tarfile.errors) pax_headers[keyword] = value - pos += length # Fetch the next header. try: @@ -1475,7 +1499,7 @@ def _proc_pax(self, tarfile): elif "GNU.sparse.size" in pax_headers: # GNU extended sparse format version 0.0. - self._proc_gnusparse_00(next, pax_headers, buf) + self._proc_gnusparse_00(next, raw_headers) elif pax_headers.get("GNU.sparse.major") == "1" and pax_headers.get("GNU.sparse.minor") == "0": # GNU extended sparse format version 1.0. @@ -1497,15 +1521,24 @@ def _proc_pax(self, tarfile): return next - def _proc_gnusparse_00(self, next, pax_headers, buf): + def _proc_gnusparse_00(self, next, raw_headers): """Process a GNU tar extended sparse header, version 0.0. """ offsets = [] - for match in re.finditer(br"\d+ GNU.sparse.offset=(\d+)\n", buf): - offsets.append(int(match.group(1))) numbytes = [] - for match in re.finditer(br"\d+ GNU.sparse.numbytes=(\d+)\n", buf): - numbytes.append(int(match.group(1))) + for _, keyword, value in raw_headers: + if keyword == b"GNU.sparse.offset": + try: + offsets.append(int(value.decode())) + except ValueError: + raise InvalidHeaderError("invalid header") + + elif keyword == b"GNU.sparse.numbytes": + try: + numbytes.append(int(value.decode())) + except ValueError: + raise InvalidHeaderError("invalid header") + next.sparse = list(zip(offsets, numbytes)) def _proc_gnusparse_01(self, next, pax_headers): diff --git a/Lib/test/_test_eintr.py b/Lib/test/_test_eintr.py index 15586f15..493932d6 100644 --- a/Lib/test/_test_eintr.py +++ b/Lib/test/_test_eintr.py @@ -18,6 +18,7 @@ import socket import subprocess import sys +import textwrap import time import unittest @@ -492,29 +493,31 @@ def test_devpoll(self): self.check_elapsed_time(dt) -class FNTLEINTRTest(EINTRBaseTest): +class FCNTLEINTRTest(EINTRBaseTest): def _lock(self, lock_func, lock_name): self.addCleanup(os_helper.unlink, os_helper.TESTFN) - code = '\n'.join(( - "import fcntl, time", - "with open('%s', 'wb') as f:" % os_helper.TESTFN, - " fcntl.%s(f, fcntl.LOCK_EX)" % lock_name, - " time.sleep(%s)" % self.sleep_time)) - start_time = time.monotonic() - proc = self.subprocess(code) + rd1, wr1 = os.pipe() + rd2, wr2 = os.pipe() + for fd in (rd1, wr1, rd2, wr2): + self.addCleanup(os.close, fd) + code = textwrap.dedent(f""" + import fcntl, os, time + with open('{os_helper.TESTFN}', 'wb') as f: + fcntl.{lock_name}(f, fcntl.LOCK_EX) + os.write({wr1}, b"ok") + _ = os.read({rd2}, 2) # wait for parent process + time.sleep({self.sleep_time}) + """) + proc = self.subprocess(code, pass_fds=[wr1, rd2]) with kill_on_error(proc): with open(os_helper.TESTFN, 'wb') as f: # synchronize the subprocess + ok = os.read(rd1, 2) + self.assertEqual(ok, b"ok") + + # notify the child that the parent is ready start_time = time.monotonic() - for _ in support.sleeping_retry(support.LONG_TIMEOUT, error=False): - try: - lock_func(f, fcntl.LOCK_EX | fcntl.LOCK_NB) - lock_func(f, fcntl.LOCK_UN) - except BlockingIOError: - break - else: - dt = time.monotonic() - start_time - raise Exception("failed to sync child in %.1f sec" % dt) + os.write(wr2, b"go") # the child locked the file just a moment ago for 'sleep_time' seconds # that means that the lock below will block for 'sleep_time' minus some diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 39551234..3b4415b5 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -12,6 +12,7 @@ import sys import os import gc +import importlib import errno import functools import signal @@ -19,8 +20,10 @@ import socket import random import logging +import shutil import subprocess import struct +import tempfile import operator import pickle import weakref @@ -254,6 +257,9 @@ def __call__(self, *args, **kwds): class BaseTestCase(object): ALLOWED_TYPES = ('processes', 'manager', 'threads') + # If not empty, limit which start method suites run this class. + START_METHODS: set[str] = set() + start_method = None # set by install_tests_in_module_dict() def assertTimingAlmostEqual(self, a, b): if CHECK_TIMINGS: @@ -1332,6 +1338,23 @@ def _on_queue_feeder_error(e, obj): self.assertTrue(not_serializable_obj.reduce_was_called) self.assertTrue(not_serializable_obj.on_queue_feeder_error_was_called) + def test_closed_queue_empty_exceptions(self): + # Assert that checking the emptiness of an unused closed queue + # does not raise an OSError. The rationale is that q.close() is + # a no-op upon construction and becomes effective once the queue + # has been used (e.g., by calling q.put()). + for q in multiprocessing.Queue(), multiprocessing.JoinableQueue(): + q.close() # this is a no-op since the feeder thread is None + q.join_thread() # this is also a no-op + self.assertTrue(q.empty()) + + for q in multiprocessing.Queue(), multiprocessing.JoinableQueue(): + q.put('foo') # make sure that the queue is 'used' + q.close() # close the feeder thread + q.join_thread() # make sure to join the feeder thread + with self.assertRaisesRegex(OSError, 'is closed'): + q.empty() + def test_closed_queue_put_get_exceptions(self): for q in multiprocessing.Queue(), multiprocessing.JoinableQueue(): q.close() @@ -1345,6 +1368,66 @@ def test_closed_queue_put_get_exceptions(self): class _TestLock(BaseTestCase): + @staticmethod + def _acquire(lock, l=None): + lock.acquire() + if l is not None: + l.append(repr(lock)) + + @staticmethod + def _acquire_event(lock, event): + lock.acquire() + event.set() + time.sleep(1.0) + + def test_repr_lock(self): + if self.TYPE != 'processes': + self.skipTest('test not appropriate for {}'.format(self.TYPE)) + + lock = self.Lock() + self.assertEqual(f'', repr(lock)) + + lock.acquire() + self.assertEqual(f'', repr(lock)) + lock.release() + + tname = 'T1' + l = [] + t = threading.Thread(target=self._acquire, + args=(lock, l), + name=tname) + t.start() + time.sleep(0.1) + self.assertEqual(f'', l[0]) + lock.release() + + t = threading.Thread(target=self._acquire, + args=(lock,), + name=tname) + t.start() + time.sleep(0.1) + self.assertEqual('', repr(lock)) + lock.release() + + pname = 'P1' + l = multiprocessing.Manager().list() + p = self.Process(target=self._acquire, + args=(lock, l), + name=pname) + p.start() + p.join() + self.assertEqual(f'', l[0]) + + lock = self.Lock() + event = self.Event() + p = self.Process(target=self._acquire_event, + args=(lock, event), + name='P2') + p.start() + event.wait() + self.assertEqual(f'', repr(lock)) + p.terminate() + def test_lock(self): lock = self.Lock() self.assertEqual(lock.acquire(), True) @@ -1352,6 +1435,68 @@ def test_lock(self): self.assertEqual(lock.release(), None) self.assertRaises((ValueError, threading.ThreadError), lock.release) + @staticmethod + def _acquire_release(lock, timeout, l=None, n=1): + for _ in range(n): + lock.acquire() + if l is not None: + l.append(repr(lock)) + time.sleep(timeout) + for _ in range(n): + lock.release() + + def test_repr_rlock(self): + if self.TYPE != 'processes': + self.skipTest('test not appropriate for {}'.format(self.TYPE)) + + lock = self.RLock() + self.assertEqual('', repr(lock)) + + n = 3 + for _ in range(n): + lock.acquire() + self.assertEqual(f'', repr(lock)) + for _ in range(n): + lock.release() + + t, l = [], [] + for i in range(n): + t.append(threading.Thread(target=self._acquire_release, + args=(lock, 0.1, l, i+1), + name=f'T{i+1}')) + t[-1].start() + for t_ in t: + t_.join() + for i in range(n): + self.assertIn(f'', l) + + + t = threading.Thread(target=self._acquire_release, + args=(lock, 0.2), + name=f'T1') + t.start() + time.sleep(0.1) + self.assertEqual('', repr(lock)) + time.sleep(0.2) + + pname = 'P1' + l = multiprocessing.Manager().list() + p = self.Process(target=self._acquire_release, + args=(lock, 0.1, l), + name=pname) + p.start() + p.join() + self.assertEqual(f'', l[0]) + + event = self.Event() + lock = self.RLock() + p = self.Process(target=self._acquire_event, + args=(lock, event)) + p.start() + event.wait() + self.assertEqual('', repr(lock)) + p.join() + def test_rlock(self): lock = self.RLock() self.assertEqual(lock.acquire(), True) @@ -5638,6 +5783,8 @@ def test_resource_tracker_sigterm(self): # Catchable signal (ignored by semaphore tracker) self.check_resource_tracker_death(signal.SIGTERM, False) + @unittest.skipIf(sys.platform.startswith("netbsd"), + "gh-125620: Skip on NetBSD due to long wait for SIGKILL process termination.") def test_resource_tracker_sigkill(self): # Uncatchable signal. self.check_resource_tracker_death(signal.SIGKILL, True) @@ -5691,6 +5838,15 @@ def _test_empty(cls, queue, child_can_start, parent_can_continue): finally: parent_can_continue.set() + def test_empty_exceptions(self): + # Assert that checking emptiness of a closed queue raises + # an OSError, independently of whether the queue was used + # or not. This differs from Queue and JoinableQueue. + q = multiprocessing.SimpleQueue() + q.close() # close the pipe + with self.assertRaisesRegex(OSError, 'is closed'): + q.empty() + def test_empty(self): queue = multiprocessing.SimpleQueue() child_can_start = multiprocessing.Event() @@ -6037,6 +6193,76 @@ def submain(): pass self.assertFalse(err, msg=err.decode('utf-8')) +class _TestSpawnedSysPath(BaseTestCase): + """Test that sys.path is setup in forkserver and spawn processes.""" + + ALLOWED_TYPES = {'processes'} + # Not applicable to fork which inherits everything from the process as is. + START_METHODS = {"forkserver", "spawn"} + + def setUp(self): + self._orig_sys_path = list(sys.path) + self._temp_dir = tempfile.mkdtemp(prefix="test_sys_path-") + self._mod_name = "unique_test_mod" + module_path = os.path.join(self._temp_dir, f"{self._mod_name}.py") + with open(module_path, "w", encoding="utf-8") as mod: + mod.write("# A simple test module\n") + sys.path[:] = [p for p in sys.path if p] # remove any existing ""s + sys.path.insert(0, self._temp_dir) + sys.path.insert(0, "") # Replaced with an abspath in child. + self.assertIn(self.start_method, self.START_METHODS) + self._ctx = multiprocessing.get_context(self.start_method) + + def tearDown(self): + sys.path[:] = self._orig_sys_path + shutil.rmtree(self._temp_dir, ignore_errors=True) + + @staticmethod + def enq_imported_module_names(queue): + queue.put(tuple(sys.modules)) + + def test_forkserver_preload_imports_sys_path(self): + if self._ctx.get_start_method() != "forkserver": + self.skipTest("forkserver specific test.") + self.assertNotIn(self._mod_name, sys.modules) + multiprocessing.forkserver._forkserver._stop() # Must be fresh. + self._ctx.set_forkserver_preload( + ["test.test_multiprocessing_forkserver", self._mod_name]) + q = self._ctx.Queue() + proc = self._ctx.Process( + target=self.enq_imported_module_names, args=(q,)) + proc.start() + proc.join() + child_imported_modules = q.get() + q.close() + self.assertIn(self._mod_name, child_imported_modules) + + @staticmethod + def enq_sys_path_and_import(queue, mod_name): + queue.put(sys.path) + try: + importlib.import_module(mod_name) + except ImportError as exc: + queue.put(exc) + else: + queue.put(None) + + def test_child_sys_path(self): + q = self._ctx.Queue() + proc = self._ctx.Process( + target=self.enq_sys_path_and_import, args=(q, self._mod_name)) + proc.start() + proc.join() + child_sys_path = q.get() + import_error = q.get() + q.close() + self.assertNotIn("", child_sys_path) # replaced by an abspath + self.assertIn(self._temp_dir, child_sys_path) # our addition + # ignore the first element, it is the absolute "" replacement + self.assertEqual(child_sys_path[1:], sys.path[1:]) + self.assertIsNone(import_error, msg=f"child could not import {self._mod_name}") + + class MiscTestCase(unittest.TestCase): def test__all__(self): # Just make sure names in not_exported are excluded @@ -6213,6 +6439,8 @@ def install_tests_in_module_dict(remote_globs, start_method, if base is BaseTestCase: continue assert set(base.ALLOWED_TYPES) <= ALL_TYPES, base.ALLOWED_TYPES + if base.START_METHODS and start_method not in base.START_METHODS: + continue # class not intended for this start method. for type_ in base.ALLOWED_TYPES: if only_type and type_ != only_type: continue @@ -6226,6 +6454,7 @@ class Temp(base, Mixin, unittest.TestCase): Temp = hashlib_helper.requires_hashdigest('sha256')(Temp) Temp.__name__ = Temp.__qualname__ = newname Temp.__module__ = __module__ + Temp.start_method = start_method remote_globs[newname] = Temp elif issubclass(base, unittest.TestCase): if only_type: diff --git a/Lib/test/clinic.test.c b/Lib/test/clinic.test.c index b1471f75..6703cf19 100644 --- a/Lib/test/clinic.test.c +++ b/Lib/test/clinic.test.c @@ -1984,7 +1984,7 @@ test_keywords(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObjec PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(a), &_Py_ID(b), }, + .ob_item = { _Py_LATIN1_CHR('a'), _Py_LATIN1_CHR('b'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -2018,7 +2018,7 @@ test_keywords(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObjec static PyObject * test_keywords_impl(PyObject *module, PyObject *a, PyObject *b) -/*[clinic end generated code: output=73d46a9ae3320f96 input=0d3484844749c05b]*/ +/*[clinic end generated code: output=13ba007e1c842a37 input=0d3484844749c05b]*/ /*[clinic input] @@ -2054,7 +2054,7 @@ test_keywords_kwonly(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(a), &_Py_ID(b), }, + .ob_item = { _Py_LATIN1_CHR('a'), _Py_LATIN1_CHR('b'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -2088,7 +2088,7 @@ test_keywords_kwonly(PyObject *module, PyObject *const *args, Py_ssize_t nargs, static PyObject * test_keywords_kwonly_impl(PyObject *module, PyObject *a, PyObject *b) -/*[clinic end generated code: output=c9f02a41f425897d input=384adc78bfa0bff7]*/ +/*[clinic end generated code: output=789799a6d2d6eb4d input=384adc78bfa0bff7]*/ /*[clinic input] @@ -2125,7 +2125,7 @@ test_keywords_opt(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyO PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(a), &_Py_ID(b), &_Py_ID(c), }, + .ob_item = { _Py_LATIN1_CHR('a'), _Py_LATIN1_CHR('b'), _Py_LATIN1_CHR('c'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -2172,7 +2172,7 @@ test_keywords_opt(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyO static PyObject * test_keywords_opt_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c) -/*[clinic end generated code: output=b35d4e66f7283e46 input=eda7964f784f4607]*/ +/*[clinic end generated code: output=42430dd8ea5afde6 input=eda7964f784f4607]*/ /*[clinic input] @@ -2211,7 +2211,7 @@ test_keywords_opt_kwonly(PyObject *module, PyObject *const *args, Py_ssize_t nar PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(a), &_Py_ID(b), &_Py_ID(c), &_Py_ID(d), }, + .ob_item = { _Py_LATIN1_CHR('a'), _Py_LATIN1_CHR('b'), _Py_LATIN1_CHR('c'), _Py_LATIN1_CHR('d'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -2269,7 +2269,7 @@ test_keywords_opt_kwonly(PyObject *module, PyObject *const *args, Py_ssize_t nar static PyObject * test_keywords_opt_kwonly_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c, PyObject *d) -/*[clinic end generated code: output=ede7e6e65106bf2b input=209387a4815e5082]*/ +/*[clinic end generated code: output=f312c35c380d2bf9 input=209387a4815e5082]*/ /*[clinic input] @@ -2307,7 +2307,7 @@ test_keywords_kwonly_opt(PyObject *module, PyObject *const *args, Py_ssize_t nar PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(a), &_Py_ID(b), &_Py_ID(c), }, + .ob_item = { _Py_LATIN1_CHR('a'), _Py_LATIN1_CHR('b'), _Py_LATIN1_CHR('c'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -2354,7 +2354,7 @@ test_keywords_kwonly_opt(PyObject *module, PyObject *const *args, Py_ssize_t nar static PyObject * test_keywords_kwonly_opt_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c) -/*[clinic end generated code: output=36d4df939a4c3eef input=18393cc64fa000f4]*/ +/*[clinic end generated code: output=3937da2a8233ebe0 input=18393cc64fa000f4]*/ /*[clinic input] @@ -2390,7 +2390,7 @@ test_posonly_keywords(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(b), }, + .ob_item = { _Py_LATIN1_CHR('b'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -2424,7 +2424,7 @@ test_posonly_keywords(PyObject *module, PyObject *const *args, Py_ssize_t nargs, static PyObject * test_posonly_keywords_impl(PyObject *module, PyObject *a, PyObject *b) -/*[clinic end generated code: output=4835f4b6cf386c28 input=1767b0ebdf06060e]*/ +/*[clinic end generated code: output=6b4f6dd5f4db3877 input=1767b0ebdf06060e]*/ /*[clinic input] @@ -2461,7 +2461,7 @@ test_posonly_kwonly(PyObject *module, PyObject *const *args, Py_ssize_t nargs, P PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(c), }, + .ob_item = { _Py_LATIN1_CHR('c'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -2495,7 +2495,7 @@ test_posonly_kwonly(PyObject *module, PyObject *const *args, Py_ssize_t nargs, P static PyObject * test_posonly_kwonly_impl(PyObject *module, PyObject *a, PyObject *c) -/*[clinic end generated code: output=2570ea156a8d3cb5 input=9042f2818f664839]*/ +/*[clinic end generated code: output=8bef2a8198e70b26 input=9042f2818f664839]*/ /*[clinic input] @@ -2534,7 +2534,7 @@ test_posonly_keywords_kwonly(PyObject *module, PyObject *const *args, Py_ssize_t PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(b), &_Py_ID(c), }, + .ob_item = { _Py_LATIN1_CHR('b'), _Py_LATIN1_CHR('c'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -2571,7 +2571,7 @@ test_posonly_keywords_kwonly(PyObject *module, PyObject *const *args, Py_ssize_t static PyObject * test_posonly_keywords_kwonly_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c) -/*[clinic end generated code: output=aaa0e6b5ce02900d input=29546ebdca492fea]*/ +/*[clinic end generated code: output=a44b8ae8300955e1 input=29546ebdca492fea]*/ /*[clinic input] @@ -2610,7 +2610,7 @@ test_posonly_keywords_opt(PyObject *module, PyObject *const *args, Py_ssize_t na PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(b), &_Py_ID(c), &_Py_ID(d), }, + .ob_item = { _Py_LATIN1_CHR('b'), _Py_LATIN1_CHR('c'), _Py_LATIN1_CHR('d'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -2659,7 +2659,7 @@ test_posonly_keywords_opt(PyObject *module, PyObject *const *args, Py_ssize_t na static PyObject * test_posonly_keywords_opt_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c, PyObject *d) -/*[clinic end generated code: output=1d9f2d8420d0a85f input=cdf5a9625e554e9b]*/ +/*[clinic end generated code: output=cae6647c9e8e0238 input=cdf5a9625e554e9b]*/ /*[clinic input] @@ -2697,7 +2697,7 @@ test_posonly_keywords_opt2(PyObject *module, PyObject *const *args, Py_ssize_t n PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(b), &_Py_ID(c), }, + .ob_item = { _Py_LATIN1_CHR('b'), _Py_LATIN1_CHR('c'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -2744,7 +2744,7 @@ test_posonly_keywords_opt2(PyObject *module, PyObject *const *args, Py_ssize_t n static PyObject * test_posonly_keywords_opt2_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c) -/*[clinic end generated code: output=a83caa0505b296cf input=1581299d21d16f14]*/ +/*[clinic end generated code: output=6526fd08aafa2149 input=1581299d21d16f14]*/ /*[clinic input] @@ -2783,7 +2783,7 @@ test_posonly_opt_keywords_opt(PyObject *module, PyObject *const *args, Py_ssize_ PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(c), &_Py_ID(d), }, + .ob_item = { _Py_LATIN1_CHR('c'), _Py_LATIN1_CHR('d'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -2837,7 +2837,7 @@ test_posonly_opt_keywords_opt(PyObject *module, PyObject *const *args, Py_ssize_ static PyObject * test_posonly_opt_keywords_opt_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c, PyObject *d) -/*[clinic end generated code: output=0b24fba3dc04d26b input=408798ec3d42949f]*/ +/*[clinic end generated code: output=b8d01e98443738c2 input=408798ec3d42949f]*/ /*[clinic input] @@ -2877,7 +2877,7 @@ test_posonly_kwonly_opt(PyObject *module, PyObject *const *args, Py_ssize_t narg PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(b), &_Py_ID(c), &_Py_ID(d), }, + .ob_item = { _Py_LATIN1_CHR('b'), _Py_LATIN1_CHR('c'), _Py_LATIN1_CHR('d'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -2926,7 +2926,7 @@ test_posonly_kwonly_opt(PyObject *module, PyObject *const *args, Py_ssize_t narg static PyObject * test_posonly_kwonly_opt_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c, PyObject *d) -/*[clinic end generated code: output=592b217bca2f7bcc input=8d8e5643bbbc2309]*/ +/*[clinic end generated code: output=81d71c288f13d4dc input=8d8e5643bbbc2309]*/ /*[clinic input] @@ -2965,7 +2965,7 @@ test_posonly_kwonly_opt2(PyObject *module, PyObject *const *args, Py_ssize_t nar PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(b), &_Py_ID(c), }, + .ob_item = { _Py_LATIN1_CHR('b'), _Py_LATIN1_CHR('c'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -3012,7 +3012,7 @@ test_posonly_kwonly_opt2(PyObject *module, PyObject *const *args, Py_ssize_t nar static PyObject * test_posonly_kwonly_opt2_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c) -/*[clinic end generated code: output=b8b00420826bc11f input=f7e5eed94f75fff0]*/ +/*[clinic end generated code: output=a717d2a1a3310289 input=f7e5eed94f75fff0]*/ /*[clinic input] @@ -3052,7 +3052,7 @@ test_posonly_opt_kwonly_opt(PyObject *module, PyObject *const *args, Py_ssize_t PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(c), &_Py_ID(d), }, + .ob_item = { _Py_LATIN1_CHR('c'), _Py_LATIN1_CHR('d'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -3106,7 +3106,7 @@ test_posonly_opt_kwonly_opt(PyObject *module, PyObject *const *args, Py_ssize_t static PyObject * test_posonly_opt_kwonly_opt_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c, PyObject *d) -/*[clinic end generated code: output=3b9ee879ebee285a input=1e557dc979d120fd]*/ +/*[clinic end generated code: output=0f50b4b8d45cf2de input=1e557dc979d120fd]*/ /*[clinic input] @@ -3148,7 +3148,7 @@ test_posonly_keywords_kwonly_opt(PyObject *module, PyObject *const *args, Py_ssi PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(b), &_Py_ID(c), &_Py_ID(d), &_Py_ID(e), }, + .ob_item = { _Py_LATIN1_CHR('b'), _Py_LATIN1_CHR('c'), _Py_LATIN1_CHR('d'), _Py_LATIN1_CHR('e'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -3200,7 +3200,7 @@ 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=d380f84f81cc0e45 input=c3884a4f956fdc89]*/ +/*[clinic end generated code: output=8dac8d2a4e6105fa input=c3884a4f956fdc89]*/ /*[clinic input] @@ -3240,7 +3240,7 @@ test_posonly_keywords_kwonly_opt2(PyObject *module, PyObject *const *args, Py_ss PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(b), &_Py_ID(c), &_Py_ID(d), }, + .ob_item = { _Py_LATIN1_CHR('b'), _Py_LATIN1_CHR('c'), _Py_LATIN1_CHR('d'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -3289,7 +3289,7 @@ test_posonly_keywords_kwonly_opt2(PyObject *module, PyObject *const *args, Py_ss static PyObject * test_posonly_keywords_kwonly_opt2_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c, PyObject *d) -/*[clinic end generated code: output=ee629e962cb06992 input=68d01d7c0f6dafb0]*/ +/*[clinic end generated code: output=5a96d521e6414f5d input=68d01d7c0f6dafb0]*/ /*[clinic input] @@ -3332,7 +3332,7 @@ test_posonly_keywords_opt_kwonly_opt(PyObject *module, PyObject *const *args, Py PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(b), &_Py_ID(c), &_Py_ID(d), &_Py_ID(e), }, + .ob_item = { _Py_LATIN1_CHR('b'), _Py_LATIN1_CHR('c'), _Py_LATIN1_CHR('d'), _Py_LATIN1_CHR('e'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -3393,7 +3393,7 @@ 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=a2721babb42ecfd1 input=d0883d45876f186c]*/ +/*[clinic end generated code: output=d5a474dcd5dc3e9f input=d0883d45876f186c]*/ /*[clinic input] @@ -3436,7 +3436,7 @@ test_posonly_keywords_opt2_kwonly_opt(PyObject *module, PyObject *const *args, P PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(b), &_Py_ID(c), &_Py_ID(d), &_Py_ID(e), }, + .ob_item = { _Py_LATIN1_CHR('b'), _Py_LATIN1_CHR('c'), _Py_LATIN1_CHR('d'), _Py_LATIN1_CHR('e'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -3502,7 +3502,7 @@ 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=0626203eedb6e7e8 input=c95e2e1ec93035ad]*/ +/*[clinic end generated code: output=ac239c5ee8a74408 input=c95e2e1ec93035ad]*/ /*[clinic input] @@ -3547,7 +3547,7 @@ test_posonly_opt_keywords_opt_kwonly_opt(PyObject *module, PyObject *const *args PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(c), &_Py_ID(d), &_Py_ID(e), &_Py_ID(f), }, + .ob_item = { _Py_LATIN1_CHR('c'), _Py_LATIN1_CHR('d'), _Py_LATIN1_CHR('e'), _Py_LATIN1_CHR('f'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -3621,7 +3621,7 @@ 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=07d8acc04558a5a0 input=9914857713c5bbf8]*/ +/*[clinic end generated code: output=638bbd0005639342 input=9914857713c5bbf8]*/ /*[clinic input] test_keyword_only_parameter @@ -4017,7 +4017,7 @@ test_vararg(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(a), }, + .ob_item = { _Py_LATIN1_CHR('a'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -4052,7 +4052,7 @@ test_vararg(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject static PyObject * test_vararg_impl(PyObject *module, PyObject *a, PyObject *args) -/*[clinic end generated code: output=880365c61ae205d7 input=81d33815ad1bae6e]*/ +/*[clinic end generated code: output=1411e464f358a7ba input=81d33815ad1bae6e]*/ /*[clinic input] test_vararg_with_default @@ -4089,7 +4089,7 @@ test_vararg_with_default(PyObject *module, PyObject *const *args, Py_ssize_t nar PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(a), &_Py_ID(b), }, + .ob_item = { _Py_LATIN1_CHR('a'), _Py_LATIN1_CHR('b'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -4135,7 +4135,7 @@ test_vararg_with_default(PyObject *module, PyObject *const *args, Py_ssize_t nar static PyObject * test_vararg_with_default_impl(PyObject *module, PyObject *a, PyObject *args, int b) -/*[clinic end generated code: output=291e9a5a09831128 input=6e110b54acd9b22d]*/ +/*[clinic end generated code: output=f09d4b917063ca41 input=6e110b54acd9b22d]*/ /*[clinic input] test_vararg_with_only_defaults @@ -4172,7 +4172,7 @@ test_vararg_with_only_defaults(PyObject *module, PyObject *const *args, Py_ssize PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(b), &_Py_ID(c), }, + .ob_item = { _Py_LATIN1_CHR('b'), _Py_LATIN1_CHR('c'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -4223,7 +4223,7 @@ test_vararg_with_only_defaults(PyObject *module, PyObject *const *args, Py_ssize static PyObject * test_vararg_with_only_defaults_impl(PyObject *module, PyObject *args, int b, PyObject *c) -/*[clinic end generated code: output=dd21b28f0db26a4b input=fa56a709a035666e]*/ +/*[clinic end generated code: output=cc6590b8805d5433 input=fa56a709a035666e]*/ /*[clinic input] test_paramname_module @@ -4490,7 +4490,7 @@ Test_cls_with_param(TestObj *self, PyTypeObject *cls, PyObject *const *args, Py_ PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(a), }, + .ob_item = { _Py_LATIN1_CHR('a'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -4525,7 +4525,7 @@ Test_cls_with_param(TestObj *self, PyTypeObject *cls, PyObject *const *args, Py_ static PyObject * Test_cls_with_param_impl(TestObj *self, PyTypeObject *cls, int a) -/*[clinic end generated code: output=00218e7f583e6c81 input=af158077bd237ef9]*/ +/*[clinic end generated code: output=107b46f09870e1f8 input=af158077bd237ef9]*/ /*[clinic input] @@ -4838,7 +4838,7 @@ Test___init__(PyObject *self, PyObject *args, PyObject *kwargs) PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(a), }, + .ob_item = { _Py_LATIN1_CHR('a'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -4872,7 +4872,7 @@ Test___init__(PyObject *self, PyObject *args, PyObject *kwargs) static int Test___init___impl(TestObj *self, PyObject *a) -/*[clinic end generated code: output=0b9ca79638ab3ecb input=a8f9222a6ab35c59]*/ +/*[clinic end generated code: output=0e1239b9bc247bc1 input=a8f9222a6ab35c59]*/ /*[clinic input] diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index 404894ac..903a43aa 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -1331,6 +1331,11 @@ def test_insane_fromtimestamp(self): self.assertRaises(OverflowError, self.theclass.fromtimestamp, insane) + def test_fromtimestamp_with_none_arg(self): + # See gh-120268 for more details + with self.assertRaises(TypeError): + self.theclass.fromtimestamp(None) + def test_today(self): import time @@ -2811,11 +2816,32 @@ def test_more_strftime(self): self.assertEqual(t.strftime("%z"), "-0200" + z) self.assertEqual(t.strftime("%:z"), "-02:00:" + z) - # bpo-34482: Check that surrogates don't cause a crash. - try: - t.strftime('%y\ud800%m %H\ud800%M') - except UnicodeEncodeError: - pass + def test_strftime_special(self): + t = self.theclass(2004, 12, 31, 6, 22, 33, 47) + s1 = t.strftime('%c') + s2 = t.strftime('%B') + # gh-52551, gh-78662: Unicode strings should pass through strftime, + # independently from locale. + self.assertEqual(t.strftime('\U0001f40d'), '\U0001f40d') + self.assertEqual(t.strftime('\U0001f4bb%c\U0001f40d%B'), f'\U0001f4bb{s1}\U0001f40d{s2}') + self.assertEqual(t.strftime('%c\U0001f4bb%B\U0001f40d'), f'{s1}\U0001f4bb{s2}\U0001f40d') + # Lone surrogates should pass through. + self.assertEqual(t.strftime('\ud83d'), '\ud83d') + self.assertEqual(t.strftime('\udc0d'), '\udc0d') + self.assertEqual(t.strftime('\ud83d%c\udc0d%B'), f'\ud83d{s1}\udc0d{s2}') + self.assertEqual(t.strftime('%c\ud83d%B\udc0d'), f'{s1}\ud83d{s2}\udc0d') + self.assertEqual(t.strftime('%c\udc0d%B\ud83d'), f'{s1}\udc0d{s2}\ud83d') + # Surrogate pairs should not recombine. + self.assertEqual(t.strftime('\ud83d\udc0d'), '\ud83d\udc0d') + self.assertEqual(t.strftime('%c\ud83d\udc0d%B'), f'{s1}\ud83d\udc0d{s2}') + # Surrogate-escaped bytes should not recombine. + self.assertEqual(t.strftime('\udcf0\udc9f\udc90\udc8d'), '\udcf0\udc9f\udc90\udc8d') + self.assertEqual(t.strftime('%c\udcf0\udc9f\udc90\udc8d%B'), f'{s1}\udcf0\udc9f\udc90\udc8d{s2}') + # gh-124531: The null character should not terminate the format string. + self.assertEqual(t.strftime('\0'), '\0') + self.assertEqual(t.strftime('\0'*1000), '\0'*1000) + self.assertEqual(t.strftime('\0%c\0%B'), f'\0{s1}\0{s2}') + self.assertEqual(t.strftime('%c\0%B\0'), f'{s1}\0{s2}\0') def test_extract(self): dt = self.theclass(2002, 3, 4, 18, 45, 3, 1234) @@ -3568,6 +3594,33 @@ def test_strftime(self): # gh-85432: The parameter was named "fmt" in the pure-Python impl. t.strftime(format="%f") + def test_strftime_special(self): + t = self.theclass(1, 2, 3, 4) + s1 = t.strftime('%I%p%Z') + s2 = t.strftime('%X') + # gh-52551, gh-78662: Unicode strings should pass through strftime, + # independently from locale. + self.assertEqual(t.strftime('\U0001f40d'), '\U0001f40d') + self.assertEqual(t.strftime('\U0001f4bb%I%p%Z\U0001f40d%X'), f'\U0001f4bb{s1}\U0001f40d{s2}') + self.assertEqual(t.strftime('%I%p%Z\U0001f4bb%X\U0001f40d'), f'{s1}\U0001f4bb{s2}\U0001f40d') + # Lone surrogates should pass through. + self.assertEqual(t.strftime('\ud83d'), '\ud83d') + self.assertEqual(t.strftime('\udc0d'), '\udc0d') + self.assertEqual(t.strftime('\ud83d%I%p%Z\udc0d%X'), f'\ud83d{s1}\udc0d{s2}') + self.assertEqual(t.strftime('%I%p%Z\ud83d%X\udc0d'), f'{s1}\ud83d{s2}\udc0d') + self.assertEqual(t.strftime('%I%p%Z\udc0d%X\ud83d'), f'{s1}\udc0d{s2}\ud83d') + # Surrogate pairs should not recombine. + self.assertEqual(t.strftime('\ud83d\udc0d'), '\ud83d\udc0d') + self.assertEqual(t.strftime('%I%p%Z\ud83d\udc0d%X'), f'{s1}\ud83d\udc0d{s2}') + # Surrogate-escaped bytes should not recombine. + self.assertEqual(t.strftime('\udcf0\udc9f\udc90\udc8d'), '\udcf0\udc9f\udc90\udc8d') + self.assertEqual(t.strftime('%I%p%Z\udcf0\udc9f\udc90\udc8d%X'), f'{s1}\udcf0\udc9f\udc90\udc8d{s2}') + # gh-124531: The null character should not terminate the format string. + self.assertEqual(t.strftime('\0'), '\0') + self.assertEqual(t.strftime('\0'*1000), '\0'*1000) + self.assertEqual(t.strftime('\0%I%p%Z\0%X'), f'\0{s1}\0{s2}') + self.assertEqual(t.strftime('%I%p%Z\0%X\0'), f'{s1}\0{s2}\0') + def test_format(self): t = self.theclass(1, 2, 3, 4) self.assertEqual(t.__format__(''), str(t)) @@ -3997,9 +4050,8 @@ def tzname(self, dt): return self.tz self.assertRaises(TypeError, t.strftime, "%Z") # Issue #6697: - if '_Fast' in self.__class__.__name__: - Badtzname.tz = '\ud800' - self.assertRaises(ValueError, t.strftime, "%Z") + Badtzname.tz = '\ud800' + self.assertEqual(t.strftime("%Z"), '\ud800') def test_hash_edge_cases(self): # Offsets that overflow a basic time. diff --git a/Lib/test/decimaltestdata/ddFMA.decTest b/Lib/test/decimaltestdata/ddFMA.decTest index 9094fc01..7f2e5230 100644 --- a/Lib/test/decimaltestdata/ddFMA.decTest +++ b/Lib/test/decimaltestdata/ddFMA.decTest @@ -1663,7 +1663,7 @@ ddfma375087 fma 1 12345678 1E-33 -> 12345678.00000001 Inexac ddfma375088 fma 1 12345678 1E-34 -> 12345678.00000001 Inexact Rounded ddfma375089 fma 1 12345678 1E-35 -> 12345678.00000001 Inexact Rounded --- desctructive subtraction (from remainder tests) +-- destructive subtraction (from remainder tests) -- +++ some of these will be off-by-one remainder vs remainderNear diff --git a/Lib/test/decimaltestdata/ddQuantize.decTest b/Lib/test/decimaltestdata/ddQuantize.decTest index 91776201..e1c5674d 100644 --- a/Lib/test/decimaltestdata/ddQuantize.decTest +++ b/Lib/test/decimaltestdata/ddQuantize.decTest @@ -462,7 +462,7 @@ ddqua520 quantize 1.234 1e359 -> 0E+359 Inexact Rounded ddqua521 quantize 123.456 1e359 -> 0E+359 Inexact Rounded ddqua522 quantize 1.234 1e359 -> 0E+359 Inexact Rounded ddqua523 quantize 123.456 1e359 -> 0E+359 Inexact Rounded --- next four are "won't fit" overfl +-- next four are "won't fit" overflow ddqua526 quantize 1.234 1e-299 -> NaN Invalid_operation ddqua527 quantize 123.456 1e-299 -> NaN Invalid_operation ddqua528 quantize 1.234 1e-299 -> NaN Invalid_operation diff --git a/Lib/test/decimaltestdata/ddRemainder.decTest b/Lib/test/decimaltestdata/ddRemainder.decTest index 5bd1e32d..b1866d39 100644 --- a/Lib/test/decimaltestdata/ddRemainder.decTest +++ b/Lib/test/decimaltestdata/ddRemainder.decTest @@ -422,7 +422,7 @@ ddrem757 remainder 1 sNaN -> NaN Invalid_operation ddrem758 remainder 1000 sNaN -> NaN Invalid_operation ddrem759 remainder Inf -sNaN -> -NaN Invalid_operation --- propaging NaNs +-- propagating NaNs ddrem760 remainder NaN1 NaN7 -> NaN1 ddrem761 remainder sNaN2 NaN8 -> NaN2 Invalid_operation ddrem762 remainder NaN3 sNaN9 -> NaN9 Invalid_operation diff --git a/Lib/test/decimaltestdata/ddRemainderNear.decTest b/Lib/test/decimaltestdata/ddRemainderNear.decTest index 6ba64eba..bbe82ea3 100644 --- a/Lib/test/decimaltestdata/ddRemainderNear.decTest +++ b/Lib/test/decimaltestdata/ddRemainderNear.decTest @@ -450,7 +450,7 @@ ddrmn757 remaindernear 1 sNaN -> NaN Invalid_operation ddrmn758 remaindernear 1000 sNaN -> NaN Invalid_operation ddrmn759 remaindernear Inf -sNaN -> -NaN Invalid_operation --- propaging NaNs +-- propagating NaNs ddrmn760 remaindernear NaN1 NaN7 -> NaN1 ddrmn761 remaindernear sNaN2 NaN8 -> NaN2 Invalid_operation ddrmn762 remaindernear NaN3 sNaN9 -> NaN9 Invalid_operation diff --git a/Lib/test/decimaltestdata/dqRemainder.decTest b/Lib/test/decimaltestdata/dqRemainder.decTest index bae8eae5..e0aaca37 100644 --- a/Lib/test/decimaltestdata/dqRemainder.decTest +++ b/Lib/test/decimaltestdata/dqRemainder.decTest @@ -418,7 +418,7 @@ dqrem757 remainder 1 sNaN -> NaN Invalid_operation dqrem758 remainder 1000 sNaN -> NaN Invalid_operation dqrem759 remainder Inf -sNaN -> -NaN Invalid_operation --- propaging NaNs +-- propagating NaNs dqrem760 remainder NaN1 NaN7 -> NaN1 dqrem761 remainder sNaN2 NaN8 -> NaN2 Invalid_operation dqrem762 remainder NaN3 sNaN9 -> NaN9 Invalid_operation diff --git a/Lib/test/decimaltestdata/dqRemainderNear.decTest b/Lib/test/decimaltestdata/dqRemainderNear.decTest index b850626f..2c5c3f50 100644 --- a/Lib/test/decimaltestdata/dqRemainderNear.decTest +++ b/Lib/test/decimaltestdata/dqRemainderNear.decTest @@ -450,7 +450,7 @@ dqrmn757 remaindernear 1 sNaN -> NaN Invalid_operation dqrmn758 remaindernear 1000 sNaN -> NaN Invalid_operation dqrmn759 remaindernear Inf -sNaN -> -NaN Invalid_operation --- propaging NaNs +-- propagating NaNs dqrmn760 remaindernear NaN1 NaN7 -> NaN1 dqrmn761 remaindernear sNaN2 NaN8 -> NaN2 Invalid_operation dqrmn762 remaindernear NaN3 sNaN9 -> NaN9 Invalid_operation diff --git a/Lib/test/decimaltestdata/exp.decTest b/Lib/test/decimaltestdata/exp.decTest index 6a7af23b..e01d7a8f 100644 --- a/Lib/test/decimaltestdata/exp.decTest +++ b/Lib/test/decimaltestdata/exp.decTest @@ -28,7 +28,7 @@ rounding: half_even maxExponent: 384 minexponent: -383 --- basics (examples in specificiation, etc.) +-- basics (examples in specification, etc.) expx001 exp -Infinity -> 0 expx002 exp -10 -> 0.0000453999298 Inexact Rounded expx003 exp -1 -> 0.367879441 Inexact Rounded diff --git a/Lib/test/decimaltestdata/remainder.decTest b/Lib/test/decimaltestdata/remainder.decTest index 7a1061b1..4f59b332 100644 --- a/Lib/test/decimaltestdata/remainder.decTest +++ b/Lib/test/decimaltestdata/remainder.decTest @@ -435,7 +435,7 @@ remx757 remainder 1 sNaN -> NaN Invalid_operation remx758 remainder 1000 sNaN -> NaN Invalid_operation remx759 remainder Inf -sNaN -> -NaN Invalid_operation --- propaging NaNs +-- propagating NaNs remx760 remainder NaN1 NaN7 -> NaN1 remx761 remainder sNaN2 NaN8 -> NaN2 Invalid_operation remx762 remainder NaN3 sNaN9 -> NaN9 Invalid_operation diff --git a/Lib/test/decimaltestdata/remainderNear.decTest b/Lib/test/decimaltestdata/remainderNear.decTest index b768b9e0..000b1424 100644 --- a/Lib/test/decimaltestdata/remainderNear.decTest +++ b/Lib/test/decimaltestdata/remainderNear.decTest @@ -498,7 +498,7 @@ rmnx758 remaindernear 1000 sNaN -> NaN Invalid_operation rmnx759 remaindernear Inf sNaN -> NaN Invalid_operation rmnx760 remaindernear NaN sNaN -> NaN Invalid_operation --- propaging NaNs +-- propagating NaNs rmnx761 remaindernear NaN1 NaN7 -> NaN1 rmnx762 remaindernear sNaN2 NaN8 -> NaN2 Invalid_operation rmnx763 remaindernear NaN3 -sNaN9 -> -NaN9 Invalid_operation diff --git a/Lib/test/ieee754.txt b/Lib/test/ieee754.txt index a8b8a0a2..3e986cdb 100644 --- a/Lib/test/ieee754.txt +++ b/Lib/test/ieee754.txt @@ -51,7 +51,7 @@ nan >>> INF / INF nan -However unambigous operations with inf return inf: +However unambiguous operations with inf return inf: >>> INF * INF inf >>> 1.5 * INF diff --git a/Lib/test/libregrtest/logger.py b/Lib/test/libregrtest/logger.py index a1257069..fa1d4d57 100644 --- a/Lib/test/libregrtest/logger.py +++ b/Lib/test/libregrtest/logger.py @@ -43,7 +43,10 @@ def log(self, line: str = '') -> None: def get_load_avg(self) -> float | None: if hasattr(os, 'getloadavg'): - return os.getloadavg()[0] + try: + return os.getloadavg()[0] + except OSError: + pass if self.win_load_tracker is not None: return self.win_load_tracker.getloadavg() return None diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index e41646d2..04404cbc 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -508,7 +508,7 @@ def _run_tests(self, selected: TestTuple, tests: TestList | None) -> int: setup_process() if (runtests.hunt_refleak is not None) and (not self.num_workers): - # gh-109739: WindowsLoadTracker thread interfers with refleak check + # gh-109739: WindowsLoadTracker thread interferes with refleak check use_load_tracker = False else: # WindowsLoadTracker is only needed on Windows diff --git a/Lib/test/libregrtest/refleak.py b/Lib/test/libregrtest/refleak.py index a257d102..ab5921c7 100644 --- a/Lib/test/libregrtest/refleak.py +++ b/Lib/test/libregrtest/refleak.py @@ -109,7 +109,7 @@ def get_pooled_int(value): getunicodeinternedsize = sys.getunicodeinternedsize fd_count = os_helper.fd_count # initialize variables to make pyflakes quiet - rc_before = alloc_before = fd_before = interned_before = 0 + rc_before = alloc_before = fd_before = interned_immortal_before = 0 if not quiet: print("beginning", repcount, "repetitions. Showing number of leaks " @@ -135,9 +135,11 @@ def get_pooled_int(value): # Also, readjust the reference counts and alloc blocks by ignoring # any strings that might have been interned during test_func. These # strings will be deallocated at runtime shutdown - interned_after = getunicodeinternedsize() - alloc_after = getallocatedblocks() - interned_after - rc_after = gettotalrefcount() - interned_after * 2 + interned_immortal_after = getunicodeinternedsize( + # Use an internal-only keyword argument that mypy doesn't know yet + _only_immortal=True) # type: ignore[call-arg] + alloc_after = getallocatedblocks() - interned_immortal_after + rc_after = gettotalrefcount() - interned_immortal_after * 2 fd_after = fd_count() rc_deltas[i] = get_pooled_int(rc_after - rc_before) @@ -164,7 +166,7 @@ def get_pooled_int(value): alloc_before = alloc_after rc_before = rc_after fd_before = fd_after - interned_before = interned_after + interned_immortal_before = interned_immortal_after restore_support_xml(xml_filename) @@ -239,9 +241,13 @@ def dash_R_cleanup(fs, ps, pic, zdc, abcs): abs_classes = filter(isabstract, abs_classes) for abc in abs_classes: for obj in abc.__subclasses__() + [abc]: - for ref in abcs.get(obj, set()): - if ref() is not None: - obj.register(ref()) + refs = abcs.get(obj, None) + if refs is not None: + obj._abc_registry_clear() + for ref in refs: + subclass = ref() + if subclass is not None: + obj.register(subclass) obj._abc_caches_clear() # Clear caches diff --git a/Lib/test/libregrtest/testresult.py b/Lib/test/libregrtest/testresult.py index de23fdd5..1820f354 100644 --- a/Lib/test/libregrtest/testresult.py +++ b/Lib/test/libregrtest/testresult.py @@ -9,6 +9,7 @@ import traceback import unittest from test import support +from test.libregrtest.utils import sanitize_xml class RegressionTestResult(unittest.TextTestResult): USE_XML = False @@ -65,23 +66,24 @@ def _add_result(self, test, capture=False, **args): if capture: if self._stdout_buffer is not None: stdout = self._stdout_buffer.getvalue().rstrip() - ET.SubElement(e, 'system-out').text = stdout + ET.SubElement(e, 'system-out').text = sanitize_xml(stdout) if self._stderr_buffer is not None: stderr = self._stderr_buffer.getvalue().rstrip() - ET.SubElement(e, 'system-err').text = stderr + ET.SubElement(e, 'system-err').text = sanitize_xml(stderr) for k, v in args.items(): if not k or not v: continue + e2 = ET.SubElement(e, k) if hasattr(v, 'items'): for k2, v2 in v.items(): if k2: - e2.set(k2, str(v2)) + e2.set(k2, sanitize_xml(str(v2))) else: - e2.text = str(v2) + e2.text = sanitize_xml(str(v2)) else: - e2.text = str(v) + e2.text = sanitize_xml(str(v)) @classmethod def __makeErrorDict(cls, err_type, err_value, err_tb): diff --git a/Lib/test/libregrtest/utils.py b/Lib/test/libregrtest/utils.py index 265dbf9a..dabed3c3 100644 --- a/Lib/test/libregrtest/utils.py +++ b/Lib/test/libregrtest/utils.py @@ -5,6 +5,7 @@ import os.path import platform import random +import re import shlex import signal import subprocess @@ -263,6 +264,12 @@ def clear_caches(): for f in typing._cleanups: f() + import inspect + abs_classes = filter(inspect.isabstract, typing.__dict__.values()) + for abc in abs_classes: + for obj in abc.__subclasses__() + [abc]: + obj._abc_caches_clear() + try: fractions = sys.modules['fractions'] except KeyError: @@ -336,6 +343,11 @@ def get_build_info(): if support.check_cflags_pgo(): # PGO (--enable-optimizations) optimizations.append('PGO') + + if support.check_bolt_optimized(): + # BOLT (--enable-bolt) + optimizations.append('BOLT') + if optimizations: build.append('+'.join(optimizations)) @@ -710,3 +722,24 @@ def get_signal_name(exitcode): pass return None + + +ILLEGAL_XML_CHARS_RE = re.compile( + '[' + # Control characters; newline (\x0A and \x0D) and TAB (\x09) are legal + '\x00-\x08\x0B\x0C\x0E-\x1F' + # Surrogate characters + '\uD800-\uDFFF' + # Special Unicode characters + '\uFFFE' + '\uFFFF' + # Match multiple sequential invalid characters for better efficiency + ']+') + +def _sanitize_xml_replace(regs): + text = regs[0] + return ''.join(f'\\x{ord(ch):02x}' if ch <= '\xff' else ascii(ch)[1:-1] + for ch in text) + +def sanitize_xml(text): + return ILLEGAL_XML_CHARS_RE.sub(_sanitize_xml_replace, text) diff --git a/Lib/test/list_tests.py b/Lib/test/list_tests.py index b1ef3325..ac13b110 100644 --- a/Lib/test/list_tests.py +++ b/Lib/test/list_tests.py @@ -191,6 +191,14 @@ def test_setslice(self): self.assertRaises(TypeError, a.__setitem__) + def test_slice_assign_iterator(self): + x = self.type2test(range(5)) + x[0:3] = reversed(range(3)) + self.assertEqual(x, self.type2test([2, 1, 0, 3, 4])) + + x[:] = reversed(range(3)) + self.assertEqual(x, self.type2test([2, 1, 0])) + def test_delslice(self): a = self.type2test([0, 1]) del a[1:2] diff --git a/Lib/test/lock_tests.py b/Lib/test/lock_tests.py index 024c6deb..8c8f8901 100644 --- a/Lib/test/lock_tests.py +++ b/Lib/test/lock_tests.py @@ -1013,6 +1013,10 @@ def multipass(self, results, n): self.assertEqual(self.barrier.n_waiting, 0) self.assertFalse(self.barrier.broken) + def test_constructor(self): + self.assertRaises(ValueError, self.barriertype, parties=0) + self.assertRaises(ValueError, self.barriertype, parties=-1) + def test_barrier(self, passes=1): """ Test that a barrier is passed in lockstep diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py index 5b9bcece..85710a97 100644 --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -26,7 +26,7 @@ from test import support from test.support import os_helper from test.support import ( - TestFailed, run_with_locale, no_tracing, + TestFailed, run_with_locales, no_tracing, _2G, _4G, bigmemtest ) from test.support.import_helper import forget @@ -144,6 +144,14 @@ class E(C): def __getinitargs__(self): return () +import __main__ +__main__.C = C +C.__module__ = "__main__" +__main__.D = D +D.__module__ = "__main__" +__main__.E = E +E.__module__ = "__main__" + # Simple mutable object. class Object: pass @@ -157,14 +165,6 @@ def __reduce__(self): # Shouldn't support the recursion itself return K, (self.value,) -import __main__ -__main__.C = C -C.__module__ = "__main__" -__main__.D = D -D.__module__ = "__main__" -__main__.E = E -E.__module__ = "__main__" - class myint(int): def __init__(self, x): self.str = str(x) @@ -1179,6 +1179,153 @@ def test_compat_unpickle(self): self.assertIs(type(unpickled), collections.UserDict) self.assertEqual(unpickled, collections.UserDict({1: 2})) + def test_load_global(self): + self.assertIs(self.loads(b'cbuiltins\nstr\n.'), str) + self.assertIs(self.loads(b'cmath\nlog\n.'), math.log) + self.assertIs(self.loads(b'cos.path\njoin\n.'), os.path.join) + self.assertIs(self.loads(b'\x80\x04cbuiltins\nstr.upper\n.'), str.upper) + with support.swap_item(sys.modules, 'mödule', types.SimpleNamespace(glöbal=42)): + self.assertEqual(self.loads(b'\x80\x04cm\xc3\xb6dule\ngl\xc3\xb6bal\n.'), 42) + + self.assertRaises(UnicodeDecodeError, self.loads, b'c\xff\nlog\n.') + self.assertRaises(UnicodeDecodeError, self.loads, b'cmath\n\xff\n.') + self.assertRaises(self.truncated_errors, self.loads, b'c\nlog\n.') + self.assertRaises(self.truncated_errors, self.loads, b'cmath\n\n.') + self.assertRaises(self.truncated_errors, self.loads, b'\x80\x04cmath\n\n.') + + def test_load_stack_global(self): + self.assertIs(self.loads(b'\x8c\x08builtins\x8c\x03str\x93.'), str) + self.assertIs(self.loads(b'\x8c\x04math\x8c\x03log\x93.'), math.log) + self.assertIs(self.loads(b'\x8c\x07os.path\x8c\x04join\x93.'), + os.path.join) + self.assertIs(self.loads(b'\x80\x04\x8c\x08builtins\x8c\x09str.upper\x93.'), + str.upper) + with support.swap_item(sys.modules, 'mödule', types.SimpleNamespace(glöbal=42)): + self.assertEqual(self.loads(b'\x80\x04\x8c\x07m\xc3\xb6dule\x8c\x07gl\xc3\xb6bal\x93.'), 42) + + self.assertRaises(UnicodeDecodeError, self.loads, b'\x8c\x01\xff\x8c\x03log\x93.') + self.assertRaises(UnicodeDecodeError, self.loads, b'\x8c\x04math\x8c\x01\xff\x93.') + self.assertRaises(ValueError, self.loads, b'\x8c\x00\x8c\x03log\x93.') + self.assertRaises(AttributeError, self.loads, b'\x8c\x04math\x8c\x00\x93.') + self.assertRaises(AttributeError, self.loads, b'\x80\x04\x8c\x04math\x8c\x00\x93.') + + self.assertRaises(pickle.UnpicklingError, self.loads, b'N\x8c\x03log\x93.') + self.assertRaises(pickle.UnpicklingError, self.loads, b'\x8c\x04mathN\x93.') + self.assertRaises(pickle.UnpicklingError, self.loads, b'\x80\x04\x8c\x04mathN\x93.') + + def test_find_class(self): + unpickler = self.unpickler(io.BytesIO()) + unpickler_nofix = self.unpickler(io.BytesIO(), fix_imports=False) + unpickler4 = self.unpickler(io.BytesIO(b'\x80\x04N.')) + unpickler4.load() + + self.assertIs(unpickler.find_class('__builtin__', 'str'), str) + self.assertRaises(ModuleNotFoundError, + unpickler_nofix.find_class, '__builtin__', 'str') + self.assertIs(unpickler.find_class('builtins', 'str'), str) + self.assertIs(unpickler_nofix.find_class('builtins', 'str'), str) + self.assertIs(unpickler.find_class('math', 'log'), math.log) + self.assertIs(unpickler.find_class('os.path', 'join'), os.path.join) + self.assertIs(unpickler.find_class('os.path', 'join'), os.path.join) + + self.assertIs(unpickler4.find_class('builtins', 'str.upper'), str.upper) + with self.assertRaises(AttributeError): + unpickler.find_class('builtins', 'str.upper') + + with self.assertRaises(AttributeError): + unpickler.find_class('math', 'spam') + with self.assertRaises(AttributeError): + unpickler4.find_class('math', 'spam') + with self.assertRaises(AttributeError): + unpickler.find_class('math', 'log.spam') + with self.assertRaises(AttributeError): + unpickler4.find_class('math', 'log.spam') + with self.assertRaises(AttributeError): + unpickler.find_class('math', 'log..spam') + with self.assertRaises(AttributeError): + unpickler4.find_class('math', 'log..spam') + with self.assertRaises(AttributeError): + unpickler.find_class('math', '') + with self.assertRaises(AttributeError): + unpickler4.find_class('math', '') + self.assertRaises(ModuleNotFoundError, unpickler.find_class, 'spam', 'log') + self.assertRaises(ValueError, unpickler.find_class, '', 'log') + + self.assertRaises(TypeError, unpickler.find_class, None, 'log') + self.assertRaises(TypeError, unpickler.find_class, 'math', None) + self.assertRaises((TypeError, AttributeError), unpickler4.find_class, 'math', None) + + def test_custom_find_class(self): + def loads(data): + class Unpickler(self.unpickler): + def find_class(self, module_name, global_name): + return (module_name, global_name) + return Unpickler(io.BytesIO(data)).load() + + self.assertEqual(loads(b'cmath\nlog\n.'), ('math', 'log')) + self.assertEqual(loads(b'\x8c\x04math\x8c\x03log\x93.'), ('math', 'log')) + + def loads(data): + class Unpickler(self.unpickler): + @staticmethod + def find_class(module_name, global_name): + return (module_name, global_name) + return Unpickler(io.BytesIO(data)).load() + + self.assertEqual(loads(b'cmath\nlog\n.'), ('math', 'log')) + self.assertEqual(loads(b'\x8c\x04math\x8c\x03log\x93.'), ('math', 'log')) + + def loads(data): + class Unpickler(self.unpickler): + @classmethod + def find_class(cls, module_name, global_name): + return (module_name, global_name) + return Unpickler(io.BytesIO(data)).load() + + self.assertEqual(loads(b'cmath\nlog\n.'), ('math', 'log')) + self.assertEqual(loads(b'\x8c\x04math\x8c\x03log\x93.'), ('math', 'log')) + + def loads(data): + class Unpickler(self.unpickler): + pass + def find_class(module_name, global_name): + return (module_name, global_name) + unpickler = Unpickler(io.BytesIO(data)) + unpickler.find_class = find_class + return unpickler.load() + + self.assertEqual(loads(b'cmath\nlog\n.'), ('math', 'log')) + self.assertEqual(loads(b'\x8c\x04math\x8c\x03log\x93.'), ('math', 'log')) + + def test_bad_ext_code(self): + # unregistered extension code + self.check_unpickling_error(ValueError, b'\x82\x01.') + self.check_unpickling_error(ValueError, b'\x82\xff.') + self.check_unpickling_error(ValueError, b'\x83\x01\x00.') + self.check_unpickling_error(ValueError, b'\x83\xff\xff.') + self.check_unpickling_error(ValueError, b'\x84\x01\x00\x00\x00.') + self.check_unpickling_error(ValueError, b'\x84\xff\xff\xff\x7f.') + # EXT specifies code <= 0 + self.check_unpickling_error(pickle.UnpicklingError, b'\x82\x00.') + self.check_unpickling_error(pickle.UnpicklingError, b'\x83\x00\x00.') + self.check_unpickling_error(pickle.UnpicklingError, b'\x84\x00\x00\x00\x00.') + self.check_unpickling_error(pickle.UnpicklingError, b'\x84\x00\x00\x00\x80.') + self.check_unpickling_error(pickle.UnpicklingError, b'\x84\xff\xff\xff\xff.') + + @support.cpython_only + def test_bad_ext_inverted_registry(self): + code = 1 + def check(key, exc): + with support.swap_item(copyreg._inverted_registry, code, key): + with self.assertRaises(exc): + self.loads(b'\x82\x01.') + check(None, ValueError) + check((), ValueError) + check((__name__,), (TypeError, ValueError)) + check((__name__, "MyList", "x"), (TypeError, ValueError)) + check((__name__, None), (TypeError, ValueError)) + check((None, "MyList"), (TypeError, ValueError)) + def test_bad_reduce(self): self.assertEqual(self.loads(b'cbuiltins\nint\n)R.'), 0) self.check_unpickling_error(TypeError, b'N)R.') @@ -1197,6 +1344,41 @@ def test_bad_newobj_ex(self): self.check_unpickling_error(error, b'cbuiltins\nint\nN}\x92.') self.check_unpickling_error(error, b'cbuiltins\nint\n)N\x92.') + def test_bad_state(self): + c = C() + c.x = None + base = b'c__main__\nC\n)\x81' + self.assertEqual(self.loads(base + b'}X\x01\x00\x00\x00xNsb.'), c) + self.assertEqual(self.loads(base + b'N}X\x01\x00\x00\x00xNs\x86b.'), c) + # non-hashable dict key + self.check_unpickling_error(TypeError, base + b'}]Nsb.') + # state = list + error = (pickle.UnpicklingError, AttributeError) + self.check_unpickling_error(error, base + b'](}}eb.') + # state = 1-tuple + self.check_unpickling_error(error, base + b'}\x85b.') + # state = 3-tuple + self.check_unpickling_error(error, base + b'}}}\x87b.') + # non-hashable slot name + self.check_unpickling_error(TypeError, base + b'}}]Ns\x86b.') + # non-string slot name + self.check_unpickling_error(TypeError, base + b'}}NNs\x86b.') + # dict = True + self.check_unpickling_error(error, base + b'\x88}\x86b.') + # slots dict = True + self.check_unpickling_error(error, base + b'}\x88\x86b.') + + class BadKey1: + count = 1 + def __hash__(self): + if not self.count: + raise CustomError + self.count -= 1 + return 42 + __main__.BadKey1 = BadKey1 + # bad hashable dict key + self.check_unpickling_error(CustomError, base + b'}c__main__\nBadKey1\n)\x81Nsb.') + def test_bad_stack(self): badpickles = [ b'.', # STOP @@ -1443,6 +1625,498 @@ def t(): [ToBeUnpickled] * 2) +class AbstractPicklingErrorTests: + # Subclass must define self.dumps, self.pickler. + + def test_bad_reduce_result(self): + obj = REX([print, ()]) + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(pickle.PicklingError): + self.dumps(obj, proto) + + obj = REX((print,)) + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(pickle.PicklingError): + self.dumps(obj, proto) + + obj = REX((print, (), None, None, None, None, None)) + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(pickle.PicklingError): + self.dumps(obj, proto) + + def test_bad_reconstructor(self): + obj = REX((42, ())) + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(pickle.PicklingError): + self.dumps(obj, proto) + + def test_unpickleable_reconstructor(self): + obj = REX((UnpickleableCallable(), ())) + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(CustomError): + self.dumps(obj, proto) + + def test_bad_reconstructor_args(self): + obj = REX((print, [])) + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(pickle.PicklingError): + self.dumps(obj, proto) + + def test_unpickleable_reconstructor_args(self): + obj = REX((print, (1, 2, UNPICKLEABLE))) + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(CustomError): + self.dumps(obj, proto) + + def test_bad_newobj_args(self): + obj = REX((copyreg.__newobj__, ())) + for proto in protocols[2:]: + with self.subTest(proto=proto): + with self.assertRaises((IndexError, pickle.PicklingError)) as cm: + self.dumps(obj, proto) + + obj = REX((copyreg.__newobj__, [REX])) + for proto in protocols[2:]: + with self.subTest(proto=proto): + with self.assertRaises((IndexError, pickle.PicklingError)): + self.dumps(obj, proto) + + def test_bad_newobj_class(self): + obj = REX((copyreg.__newobj__, (NoNew(),))) + for proto in protocols[2:]: + with self.subTest(proto=proto): + with self.assertRaises(pickle.PicklingError): + self.dumps(obj, proto) + + def test_wrong_newobj_class(self): + obj = REX((copyreg.__newobj__, (str,))) + for proto in protocols[2:]: + with self.subTest(proto=proto): + with self.assertRaises(pickle.PicklingError): + self.dumps(obj, proto) + + def test_unpickleable_newobj_class(self): + class LocalREX(REX): pass + obj = LocalREX((copyreg.__newobj__, (LocalREX,))) + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises((pickle.PicklingError, AttributeError)): + self.dumps(obj, proto) + + def test_unpickleable_newobj_args(self): + obj = REX((copyreg.__newobj__, (REX, 1, 2, UNPICKLEABLE))) + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(CustomError): + self.dumps(obj, proto) + + def test_bad_newobj_ex_args(self): + obj = REX((copyreg.__newobj_ex__, ())) + for proto in protocols[2:]: + with self.subTest(proto=proto): + with self.assertRaises((ValueError, pickle.PicklingError)): + self.dumps(obj, proto) + + obj = REX((copyreg.__newobj_ex__, 42)) + for proto in protocols[2:]: + with self.subTest(proto=proto): + with self.assertRaises(pickle.PicklingError): + self.dumps(obj, proto) + + obj = REX((copyreg.__newobj_ex__, (REX, 42, {}))) + is_py = self.pickler is pickle._Pickler + for proto in protocols[2:4] if is_py else protocols[2:]: + with self.subTest(proto=proto): + with self.assertRaises((TypeError, pickle.PicklingError)): + self.dumps(obj, proto) + + obj = REX((copyreg.__newobj_ex__, (REX, (), []))) + for proto in protocols[2:4] if is_py else protocols[2:]: + with self.subTest(proto=proto): + with self.assertRaises((TypeError, pickle.PicklingError)): + self.dumps(obj, proto) + + def test_bad_newobj_ex__class(self): + obj = REX((copyreg.__newobj_ex__, (NoNew(), (), {}))) + for proto in protocols[2:]: + with self.subTest(proto=proto): + with self.assertRaises(pickle.PicklingError): + self.dumps(obj, proto) + + def test_wrong_newobj_ex_class(self): + if self.pickler is not pickle._Pickler: + self.skipTest('only verified in the Python implementation') + obj = REX((copyreg.__newobj_ex__, (str, (), {}))) + for proto in protocols[2:]: + with self.subTest(proto=proto): + with self.assertRaises(pickle.PicklingError): + self.dumps(obj, proto) + + def test_unpickleable_newobj_ex_class(self): + class LocalREX(REX): pass + obj = LocalREX((copyreg.__newobj_ex__, (LocalREX, (), {}))) + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises((pickle.PicklingError, AttributeError)): + self.dumps(obj, proto) + + def test_unpickleable_newobj_ex_args(self): + obj = REX((copyreg.__newobj_ex__, (REX, (1, 2, UNPICKLEABLE), {}))) + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(CustomError): + self.dumps(obj, proto) + + def test_unpickleable_newobj_ex_kwargs(self): + obj = REX((copyreg.__newobj_ex__, (REX, (), {'a': UNPICKLEABLE}))) + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(CustomError): + self.dumps(obj, proto) + + def test_unpickleable_state(self): + obj = REX_state(UNPICKLEABLE) + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(CustomError): + self.dumps(obj, proto) + + def test_bad_state_setter(self): + if self.pickler is pickle._Pickler: + self.skipTest('only verified in the C implementation') + obj = REX((print, (), 'state', None, None, 42)) + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(pickle.PicklingError): + self.dumps(obj, proto) + + def test_unpickleable_state_setter(self): + obj = REX((print, (), 'state', None, None, UnpickleableCallable())) + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(CustomError): + self.dumps(obj, proto) + + def test_unpickleable_state_with_state_setter(self): + obj = REX((print, (), UNPICKLEABLE, None, None, print)) + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(CustomError): + self.dumps(obj, proto) + + def test_bad_object_list_items(self): + # Issue4176: crash when 4th and 5th items of __reduce__() + # are not iterators + obj = REX((list, (), None, 42)) + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises((TypeError, pickle.PicklingError)): + self.dumps(obj, proto) + + if self.pickler is not pickle._Pickler: + # Python implementation is less strict and also accepts iterables. + obj = REX((list, (), None, [])) + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises((TypeError, pickle.PicklingError)): + self.dumps(obj, proto) + + def test_unpickleable_object_list_items(self): + obj = REX_six([1, 2, UNPICKLEABLE]) + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(CustomError): + self.dumps(obj, proto) + + def test_bad_object_dict_items(self): + # Issue4176: crash when 4th and 5th items of __reduce__() + # are not iterators + obj = REX((dict, (), None, None, 42)) + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises((TypeError, pickle.PicklingError)): + self.dumps(obj, proto) + + for proto in protocols: + obj = REX((dict, (), None, None, iter([('a',)]))) + with self.subTest(proto=proto): + with self.assertRaises((ValueError, TypeError)): + self.dumps(obj, proto) + + if self.pickler is not pickle._Pickler: + # Python implementation is less strict and also accepts iterables. + obj = REX((dict, (), None, None, [])) + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises((TypeError, pickle.PicklingError)): + self.dumps(obj, proto) + + def test_unpickleable_object_dict_items(self): + obj = REX_seven({'a': UNPICKLEABLE}) + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(CustomError): + self.dumps(obj, proto) + + def test_unpickleable_list_items(self): + obj = [1, [2, 3, UNPICKLEABLE]] + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(CustomError): + self.dumps(obj, proto) + for n in [0, 1, 1000, 1005]: + obj = [*range(n), UNPICKLEABLE] + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(CustomError): + self.dumps(obj, proto) + + def test_unpickleable_tuple_items(self): + obj = (1, (2, 3, UNPICKLEABLE)) + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(CustomError): + self.dumps(obj, proto) + obj = (*range(10), UNPICKLEABLE) + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(CustomError): + self.dumps(obj, proto) + + def test_unpickleable_dict_items(self): + obj = {'a': {'b': UNPICKLEABLE}} + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(CustomError): + self.dumps(obj, proto) + for n in [0, 1, 1000, 1005]: + obj = dict.fromkeys(range(n)) + obj['a'] = UNPICKLEABLE + for proto in protocols: + with self.subTest(proto=proto, n=n): + with self.assertRaises(CustomError): + self.dumps(obj, proto) + + def test_unpickleable_set_items(self): + obj = {UNPICKLEABLE} + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(CustomError): + self.dumps(obj, proto) + + def test_unpickleable_frozenset_items(self): + obj = frozenset({frozenset({UNPICKLEABLE})}) + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(CustomError): + self.dumps(obj, proto) + + def test_global_lookup_error(self): + # Global name does not exist + obj = REX('spam') + obj.__module__ = __name__ + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(pickle.PicklingError): + self.dumps(obj, proto) + + obj.__module__ = 'nonexisting' + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(pickle.PicklingError): + self.dumps(obj, proto) + + obj.__module__ = '' + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises((ValueError, pickle.PicklingError)): + self.dumps(obj, proto) + + obj.__module__ = None + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(pickle.PicklingError): + self.dumps(obj, proto) + + def test_nonencodable_global_name_error(self): + for proto in protocols[:4]: + with self.subTest(proto=proto): + name = 'nonascii\xff' if proto < 3 else 'nonencodable\udbff' + obj = REX(name) + obj.__module__ = __name__ + with support.swap_item(globals(), name, obj): + with self.assertRaises((UnicodeEncodeError, pickle.PicklingError)): + self.dumps(obj, proto) + + def test_nonencodable_module_name_error(self): + for proto in protocols[:4]: + with self.subTest(proto=proto): + name = 'nonascii\xff' if proto < 3 else 'nonencodable\udbff' + obj = REX('test') + obj.__module__ = name + mod = types.SimpleNamespace(test=obj) + with support.swap_item(sys.modules, name, mod): + with self.assertRaises((UnicodeEncodeError, pickle.PicklingError)): + self.dumps(obj, proto) + + def test_nested_lookup_error(self): + # Nested name does not exist + obj = REX('AbstractPickleTests.spam') + obj.__module__ = __name__ + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(pickle.PicklingError): + self.dumps(obj, proto) + + obj.__module__ = None + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(pickle.PicklingError): + self.dumps(obj, proto) + + def test_wrong_object_lookup_error(self): + # Name is bound to different object + obj = REX('AbstractPickleTests') + obj.__module__ = __name__ + AbstractPickleTests.ham = [] + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(pickle.PicklingError): + self.dumps(obj, proto) + + obj.__module__ = None + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises(pickle.PicklingError): + self.dumps(obj, proto) + + def test_local_lookup_error(self): + # Test that whichmodule() errors out cleanly when looking up + # an assumed globally-reachable object fails. + def f(): + pass + # Since the function is local, lookup will fail + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises((AttributeError, pickle.PicklingError)): + self.dumps(f, proto) + # Same without a __module__ attribute (exercises a different path + # in _pickle.c). + del f.__module__ + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises((AttributeError, pickle.PicklingError)): + self.dumps(f, proto) + # Yet a different path. + f.__name__ = f.__qualname__ + for proto in protocols: + with self.subTest(proto=proto): + with self.assertRaises((AttributeError, pickle.PicklingError)): + self.dumps(f, proto) + + def test_reduce_ex_None(self): + if self.pickler is pickle._Pickler: + self.skipTest('only verified in the C implementation') + c = REX_None() + with self.assertRaises(TypeError): + self.dumps(c) + + def test_reduce_None(self): + c = R_None() + with self.assertRaises(TypeError): + self.dumps(c) + + @no_tracing + def test_bad_getattr(self): + # Issue #3514: crash when there is an infinite loop in __getattr__ + x = BadGetattr() + for proto in range(2): + with support.infinite_recursion(25): + self.assertRaises(RuntimeError, self.dumps, x, proto) + for proto in range(2, pickle.HIGHEST_PROTOCOL + 1): + s = self.dumps(x, proto) + + def test_picklebuffer_error(self): + # PickleBuffer forbidden with protocol < 5 + pb = pickle.PickleBuffer(b"foobar") + for proto in range(0, 5): + with self.subTest(proto=proto): + with self.assertRaises(pickle.PickleError) as cm: + self.dumps(pb, proto) + self.assertEqual(str(cm.exception), + 'PickleBuffer can only be pickled with protocol >= 5') + + def test_non_continuous_buffer(self): + for proto in protocols[5:]: + with self.subTest(proto=proto): + pb = pickle.PickleBuffer(memoryview(b"foobar")[::2]) + with self.assertRaises((pickle.PicklingError, BufferError)): + self.dumps(pb, proto) + + def test_buffer_callback_error(self): + def buffer_callback(buffers): + raise CustomError + pb = pickle.PickleBuffer(b"foobar") + with self.assertRaises(CustomError): + self.dumps(pb, 5, buffer_callback=buffer_callback) + + def test_evil_pickler_mutating_collection(self): + # https://github.com/python/cpython/issues/92930 + global Clearer + class Clearer: + pass + + def check(collection): + class EvilPickler(self.pickler): + def persistent_id(self, obj): + if isinstance(obj, Clearer): + collection.clear() + return None + pickler = EvilPickler(io.BytesIO(), proto) + try: + pickler.dump(collection) + except RuntimeError as e: + expected = "changed size during iteration" + self.assertIn(expected, str(e)) + + for proto in protocols: + check([Clearer()]) + check([Clearer(), Clearer()]) + check({Clearer()}) + check({Clearer(), Clearer()}) + check({Clearer(): 1}) + check({Clearer(): 1, Clearer(): 2}) + check({1: Clearer(), 2: Clearer()}) + + @support.cpython_only + def test_bad_ext_code(self): + # This should never happen in normal circumstances, because the type + # and the value of the extension code is checked in copyreg.add_extension(). + key = (__name__, 'MyList') + def check(code, exc): + assert key not in copyreg._extension_registry + assert code not in copyreg._inverted_registry + with (support.swap_item(copyreg._extension_registry, key, code), + support.swap_item(copyreg._inverted_registry, code, key)): + for proto in protocols[2:]: + with self.assertRaises(exc): + self.dumps(MyList, proto) + + check(object(), TypeError) + check(None, TypeError) + check(-1, (RuntimeError, struct.error)) + check(0, RuntimeError) + check(2**31, (RuntimeError, OverflowError, struct.error)) + check(2**1000, (OverflowError, struct.error)) + check(-2**1000, (OverflowError, struct.error)) + class AbstractPickleTests: # Subclass must define self.dumps, self.loads. @@ -1845,6 +2519,25 @@ def test_bytes(self): p = self.dumps(s, proto) self.assert_is_copy(s, self.loads(p)) + def test_bytes_memoization(self): + for proto in protocols: + for array_type in [bytes, ZeroCopyBytes]: + for s in b'', b'xyz', b'xyz'*100: + with self.subTest(proto=proto, array_type=array_type, s=s, independent=False): + b = array_type(s) + p = self.dumps((b, b), proto) + x, y = self.loads(p) + self.assertIs(x, y) + self.assert_is_copy((b, b), (x, y)) + + with self.subTest(proto=proto, array_type=array_type, s=s, independent=True): + b1, b2 = array_type(s), array_type(s) + p = self.dumps((b1, b2), proto) + # Note that (b1, b2) = self.loads(p) might have identical + # components, i.e., b1 is b2, but this is not always the + # case if the content is large (equality still holds). + self.assert_is_copy((b1, b2), self.loads(p)) + def test_bytearray(self): for proto in protocols: for s in b'', b'xyz', b'xyz'*100: @@ -1864,13 +2557,31 @@ def test_bytearray(self): self.assertNotIn(b'bytearray', p) self.assertTrue(opcode_in_pickle(pickle.BYTEARRAY8, p)) - def test_bytearray_memoization_bug(self): + def test_bytearray_memoization(self): for proto in protocols: - for s in b'', b'xyz', b'xyz'*100: - b = bytearray(s) - p = self.dumps((b, b), proto) - b1, b2 = self.loads(p) - self.assertIs(b1, b2) + for array_type in [bytearray, ZeroCopyBytearray]: + for s in b'', b'xyz', b'xyz'*100: + with self.subTest(proto=proto, array_type=array_type, s=s, independent=False): + b = array_type(s) + p = self.dumps((b, b), proto) + b1, b2 = self.loads(p) + self.assertIs(b1, b2) + + with self.subTest(proto=proto, array_type=array_type, s=s, independent=True): + b1a, b2a = array_type(s), array_type(s) + # Unlike bytes, equal but independent bytearray objects are + # never identical. + self.assertIsNot(b1a, b2a) + + p = self.dumps((b1a, b2a), proto) + b1b, b2b = self.loads(p) + self.assertIsNot(b1b, b2b) + + self.assertIsNot(b1a, b1b) + self.assert_is_copy(b1a, b1b) + + self.assertIsNot(b2a, b2b) + self.assert_is_copy(b2a, b2b) def test_ints(self): for proto in protocols: @@ -1915,7 +2626,7 @@ def test_float(self): got = self.loads(pickle) self.assert_is_copy(value, got) - @run_with_locale('LC_ALL', 'de_DE', 'fr_FR') + @run_with_locales('LC_ALL', 'de_DE', 'fr_FR', '') def test_float_format(self): # make sure that floats are formatted locale independent with proto 0 self.assertEqual(self.dumps(1.2, 0)[0:3], b'F1.') @@ -2416,38 +3127,11 @@ def test_reduce_calls_base(self): y = self.loads(s) self.assertEqual(y._reduce_called, 1) - @no_tracing - def test_bad_getattr(self): - # Issue #3514: crash when there is an infinite loop in __getattr__ - x = BadGetattr() - for proto in range(2): - with support.infinite_recursion(): - self.assertRaises(RuntimeError, self.dumps, x, proto) - for proto in range(2, pickle.HIGHEST_PROTOCOL + 1): - s = self.dumps(x, proto) - - def test_reduce_bad_iterator(self): - # Issue4176: crash when 4th and 5th items of __reduce__() - # are not iterators - class C(object): - def __reduce__(self): - # 4th item is not an iterator - return list, (), None, [], None - class D(object): - def __reduce__(self): - # 5th item is not an iterator - return dict, (), None, None, [] - - # Python implementation is less strict and also accepts iterables. - for proto in protocols: - try: - self.dumps(C(), proto) - except pickle.PicklingError: - pass - try: - self.dumps(D(), proto) - except pickle.PicklingError: - pass + def test_pickle_setstate_None(self): + c = C_None_setstate() + p = self.dumps(c) + with self.assertRaises((AttributeError, TypeError)): + self.loads(p) def test_many_puts_and_gets(self): # Test that internal data structures correctly deal with lots of @@ -2765,6 +3449,18 @@ class Recursive: self.assertIs(unpickled, Recursive) del Recursive.mod # break reference loop + def test_recursive_nested_names2(self): + global Recursive + class Recursive: + pass + Recursive.ref = Recursive + Recursive.__qualname__ = 'Recursive.ref' + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(proto=proto): + unpickled = self.loads(self.dumps(Recursive, proto)) + self.assertIs(unpickled, Recursive) + del Recursive.ref # break reference loop + def test_py_methods(self): global PyMethodsTest class PyMethodsTest: @@ -2885,27 +3581,6 @@ def test_compat_pickle(self): self.assertIn(('c%s\n%s' % (mod, name)).encode(), pickled) self.assertIs(type(self.loads(pickled)), type(val)) - def test_local_lookup_error(self): - # Test that whichmodule() errors out cleanly when looking up - # an assumed globally-reachable object fails. - def f(): - pass - # Since the function is local, lookup will fail - for proto in range(0, pickle.HIGHEST_PROTOCOL + 1): - with self.assertRaises((AttributeError, pickle.PicklingError)): - pickletools.dis(self.dumps(f, proto)) - # Same without a __module__ attribute (exercises a different path - # in _pickle.c). - del f.__module__ - for proto in range(0, pickle.HIGHEST_PROTOCOL + 1): - with self.assertRaises((AttributeError, pickle.PicklingError)): - pickletools.dis(self.dumps(f, proto)) - # Yet a different path. - f.__name__ = f.__qualname__ - for proto in range(0, pickle.HIGHEST_PROTOCOL + 1): - with self.assertRaises((AttributeError, pickle.PicklingError)): - pickletools.dis(self.dumps(f, proto)) - # # PEP 574 tests below # @@ -3016,20 +3691,6 @@ def test_oob_buffers_writable_to_readonly(self): self.assertIs(type(new), type(obj)) self.assertEqual(new, obj) - def test_picklebuffer_error(self): - # PickleBuffer forbidden with protocol < 5 - pb = pickle.PickleBuffer(b"foobar") - for proto in range(0, 5): - with self.assertRaises(pickle.PickleError): - self.dumps(pb, proto) - - def test_buffer_callback_error(self): - def buffer_callback(buffers): - 1/0 - pb = pickle.PickleBuffer(b"foobar") - with self.assertRaises(ZeroDivisionError): - self.dumps(pb, 5, buffer_callback=buffer_callback) - def test_buffers_error(self): pb = pickle.PickleBuffer(b"foobar") for proto in range(5, pickle.HIGHEST_PROTOCOL + 1): @@ -3121,37 +3782,6 @@ def __reduce__(self): expected = "changed size during iteration" self.assertIn(expected, str(e)) - def test_evil_pickler_mutating_collection(self): - # https://github.com/python/cpython/issues/92930 - if not hasattr(self, "pickler"): - raise self.skipTest(f"{type(self)} has no associated pickler type") - - global Clearer - class Clearer: - pass - - def check(collection): - class EvilPickler(self.pickler): - def persistent_id(self, obj): - if isinstance(obj, Clearer): - collection.clear() - return None - pickler = EvilPickler(io.BytesIO(), proto) - try: - pickler.dump(collection) - except RuntimeError as e: - expected = "changed size during iteration" - self.assertIn(expected, str(e)) - - for proto in protocols: - check([Clearer()]) - check([Clearer(), Clearer()]) - check({Clearer()}) - check({Clearer(), Clearer()}) - check({Clearer(): 1}) - check({Clearer(): 1, Clearer(): 2}) - check({1: Clearer(), 2: Clearer()}) - class BigmemPickleTests: @@ -3282,6 +3912,18 @@ def test_huge_str_64b(self, size): # Test classes for reduce_ex +class R: + def __init__(self, reduce=None): + self.reduce = reduce + def __reduce__(self, proto): + return self.reduce + +class REX: + def __init__(self, reduce_ex=None): + self.reduce_ex = reduce_ex + def __reduce_ex__(self, proto): + return self.reduce_ex + class REX_one(object): """No __reduce_ex__ here, but inheriting it from object""" _reduce_called = 0 @@ -3357,6 +3999,34 @@ def __setstate__(self, state): def __reduce__(self): return type(self), (), self.state +class REX_None: + """ Setting __reduce_ex__ to None should fail """ + __reduce_ex__ = None + +class R_None: + """ Setting __reduce__ to None should fail """ + __reduce__ = None + +class C_None_setstate: + """ Setting __setstate__ to None should fail """ + def __getstate__(self): + return 1 + + __setstate__ = None + +class CustomError(Exception): + pass + +class Unpickleable: + def __reduce__(self): + raise CustomError + +UNPICKLEABLE = Unpickleable() + +class UnpickleableCallable(Unpickleable): + def __call__(self, *args, **kwargs): + pass + # Test classes for newobj @@ -3406,7 +4076,9 @@ class MyIntWithNew2(MyIntWithNew): class SlotList(MyList): __slots__ = ["foo"] -class SimpleNewObj(int): +# Ruff "redefined while unused" false positive here due to `global` variables +# being assigned (and then restored) from within test methods earlier in the file +class SimpleNewObj(int): # noqa: F811 def __init__(self, *args, **kwargs): # raise an error, to make sure this isn't called raise TypeError("SimpleNewObj.__init__() didn't expect to get called") @@ -3425,6 +4097,12 @@ class BadGetattr: def __getattr__(self, key): self.foo +class NoNew: + def __getattribute__(self, name): + if name == '__new__': + raise AttributeError + return super().__getattribute__(name) + class AbstractPickleModuleTests: @@ -3497,7 +4175,7 @@ def raises_oserror(self, *args, **kwargs): raise OSError @property def bad_property(self): - 1/0 + raise CustomError # File without read and readline class F: @@ -3518,23 +4196,23 @@ class F: class F: read = bad_property readline = raises_oserror - self.assertRaises(ZeroDivisionError, self.Unpickler, F()) + self.assertRaises(CustomError, self.Unpickler, F()) # File with bad readline class F: readline = bad_property read = raises_oserror - self.assertRaises(ZeroDivisionError, self.Unpickler, F()) + self.assertRaises(CustomError, self.Unpickler, F()) # File with bad readline, no read class F: readline = bad_property - self.assertRaises(ZeroDivisionError, self.Unpickler, F()) + self.assertRaises(CustomError, self.Unpickler, F()) # File with bad read, no readline class F: read = bad_property - self.assertRaises((AttributeError, ZeroDivisionError), self.Unpickler, F()) + self.assertRaises((AttributeError, CustomError), self.Unpickler, F()) # File with bad peek class F: @@ -3543,7 +4221,7 @@ class F: readline = raises_oserror try: self.Unpickler(F()) - except ZeroDivisionError: + except CustomError: pass # File with bad readinto @@ -3553,7 +4231,7 @@ class F: readline = raises_oserror try: self.Unpickler(F()) - except ZeroDivisionError: + except CustomError: pass def test_pickler_bad_file(self): @@ -3566,8 +4244,8 @@ class F: class F: @property def write(self): - 1/0 - self.assertRaises(ZeroDivisionError, self.Pickler, F()) + raise CustomError + self.assertRaises(CustomError, self.Pickler, F()) def check_dumps_loads_oob_buffers(self, dumps, loads): # No need to do the full gamut of tests here, just enough to @@ -3675,9 +4353,15 @@ def test_return_correct_type(self): def test_protocol0_is_ascii_only(self): non_ascii_str = "\N{EMPTY SET}" - self.assertRaises(pickle.PicklingError, self.dumps, non_ascii_str, 0) + with self.assertRaises(pickle.PicklingError) as cm: + self.dumps(non_ascii_str, 0) + self.assertEqual(str(cm.exception), + 'persistent IDs in protocol 0 must be ASCII strings') pickled = pickle.PERSID + non_ascii_str.encode('utf-8') + b'\n.' - self.assertRaises(pickle.UnpicklingError, self.loads, pickled) + with self.assertRaises(pickle.UnpicklingError) as cm: + self.loads(pickled) + self.assertEqual(str(cm.exception), + 'persistent IDs in protocol 0 must be ASCII strings') class AbstractPicklerUnpicklerObjectTests: diff --git a/Lib/test/pyclbr_input.py b/Lib/test/pyclbr_input.py index 19ccd62d..5535edbf 100644 --- a/Lib/test/pyclbr_input.py +++ b/Lib/test/pyclbr_input.py @@ -12,17 +12,19 @@ class B (object): def bm(self): pass class C (B): - foo = Other().foo - om = Other.om - d = 10 - # XXX: This causes test_pyclbr.py to fail, but only because the - # introspection-based is_method() code in the test can't - # distinguish between this and a genuine method function like m(). - # The pyclbr.py module gets this right as it parses the text. + # This one is correctly considered by both test_pyclbr.py and pyclbr.py + # as a non-method of C. + foo = Other().foo + + # This causes test_pyclbr.py to fail, but only because the + # introspection-based is_method() code in the test can't + # distinguish between this and a genuine method function like m(). # - #f = f + # The pyclbr.py module gets this right as it parses the text. + om = Other.om + f = f def m(self): pass @@ -31,3 +33,53 @@ def sm(self): pass @classmethod def cm(self): pass + +# Check that mangling is correctly handled + +class a: + def a(self): pass + def _(self): pass + def _a(self): pass + def __(self): pass + def ___(self): pass + def __a(self): pass + +class _: + def a(self): pass + def _(self): pass + def _a(self): pass + def __(self): pass + def ___(self): pass + def __a(self): pass + +class __: + def a(self): pass + def _(self): pass + def _a(self): pass + def __(self): pass + def ___(self): pass + def __a(self): pass + +class ___: + def a(self): pass + def _(self): pass + def _a(self): pass + def __(self): pass + def ___(self): pass + def __a(self): pass + +class _a: + def a(self): pass + def _(self): pass + def _a(self): pass + def __(self): pass + def ___(self): pass + def __a(self): pass + +class __a: + def a(self): pass + def _(self): pass + def _a(self): pass + def __(self): pass + def ___(self): pass + def __a(self): pass diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 4e793f15..ba57eb30 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -43,7 +43,7 @@ "requires_limited_api", "requires_specialization", # sys "MS_WINDOWS", "is_jython", "is_android", "is_emscripten", "is_wasi", - "check_impl_detail", "unix_shell", "setswitchinterval", + "is_apple_mobile", "check_impl_detail", "unix_shell", "setswitchinterval", # os "get_pagesize", # network @@ -58,6 +58,7 @@ "LOOPBACK_TIMEOUT", "INTERNET_TIMEOUT", "SHORT_TIMEOUT", "LONG_TIMEOUT", "Py_DEBUG", "EXCEEDS_RECURSION_LIMIT", "C_RECURSION_LIMIT", "skip_on_s390x", + "BrokenIter", ] @@ -249,22 +250,16 @@ class USEROBJECTFLAGS(ctypes.Structure): # process not running under the same user id as the current console # user. To avoid that, raise an exception if the window manager # connection is not available. - from ctypes import cdll, c_int, pointer, Structure - from ctypes.util import find_library - - app_services = cdll.LoadLibrary(find_library("ApplicationServices")) - - if app_services.CGMainDisplayID() == 0: - reason = "gui tests cannot run without OS X window manager" + import subprocess + try: + rc = subprocess.run(["launchctl", "managername"], + capture_output=True, check=True) + managername = rc.stdout.decode("utf-8").strip() + except subprocess.CalledProcessError: + reason = "unable to detect macOS launchd job manager" else: - class ProcessSerialNumber(Structure): - _fields_ = [("highLongOfPSN", c_int), - ("lowLongOfPSN", c_int)] - psn = ProcessSerialNumber() - psn_p = pointer(psn) - if ( (app_services.GetCurrentProcess(psn_p) < 0) or - (app_services.SetFrontProcess(psn_p) < 0) ): - reason = "cannot run without OS X gui process" + if managername != "Aqua": + reason = f"{managername=} -- can only run in a macOS GUI session" # check on every platform whether tkinter can actually do anything if not reason: @@ -386,7 +381,7 @@ def skip_if_buildbot(reason=None): reason = 'not suitable for buildbots' try: isbuildbot = getpass.getuser().lower() == 'buildbot' - except (KeyError, EnvironmentError) as err: + except (KeyError, OSError) as err: warnings.warn(f'getpass.getuser() failed {err}.', RuntimeWarning) isbuildbot = False return unittest.skipIf(isbuildbot, reason) @@ -530,7 +525,7 @@ def requires_legacy_unicode_capi(): is_android = hasattr(sys, 'getandroidapilevel') -if sys.platform not in ('win32', 'vxworks'): +if sys.platform not in {"win32", "vxworks", "ios", "tvos", "watchos"}: unix_shell = '/system/bin/sh' if is_android else '/bin/sh' else: unix_shell = None @@ -540,19 +535,35 @@ def requires_legacy_unicode_capi(): is_emscripten = sys.platform == "emscripten" is_wasi = sys.platform == "wasi" -has_fork_support = hasattr(os, "fork") and not is_emscripten and not is_wasi +# Apple mobile platforms (iOS/tvOS/watchOS) are POSIX-like but do not +# have subprocess or fork support. +is_apple_mobile = sys.platform in {"ios", "tvos", "watchos"} +is_apple = is_apple_mobile or sys.platform == "darwin" + +has_fork_support = hasattr(os, "fork") and not ( + is_emscripten + or is_wasi + or is_apple_mobile +) def requires_fork(): return unittest.skipUnless(has_fork_support, "requires working os.fork()") -has_subprocess_support = not is_emscripten and not is_wasi +has_subprocess_support = not ( + is_emscripten + or is_wasi + or is_apple_mobile +) def requires_subprocess(): """Used for subprocess, os.spawn calls, fd inheritance""" return unittest.skipUnless(has_subprocess_support, "requires subprocess support") # Emscripten's socket emulation and WASI sockets have limitations. -has_socket_support = not is_emscripten and not is_wasi +has_socket_support = not ( + is_emscripten + or is_wasi +) def requires_working_socket(*, module=False): """Skip tests or modules that require working sockets @@ -816,10 +827,20 @@ def check_cflags_pgo(): _align = '0P' _vheader = _header + 'n' +def check_bolt_optimized(): + # Always return false, if the platform is WASI, + # because BOLT optimization does not support WASM binary. + if is_wasi: + return False + config_args = sysconfig.get_config_var('CONFIG_ARGS') or '' + return '--enable-bolt' in config_args + + def calcobjsize(fmt): import struct return struct.calcsize(_header + fmt + _align) + def calcvobjsize(fmt): import struct return struct.calcsize(_vheader + fmt + _align) @@ -843,8 +864,8 @@ def check_sizeof(test, o, size): test.assertEqual(result, size, msg) #======================================================================= -# Decorator for running a function in a different locale, correctly resetting -# it afterwards. +# Decorator/context manager for running a code in a different locale, +# correctly resetting it afterwards. @contextlib.contextmanager def run_with_locale(catstr, *locales): @@ -855,16 +876,21 @@ def run_with_locale(catstr, *locales): except AttributeError: # if the test author gives us an invalid category string raise - except: + except Exception: # cannot retrieve original locale, so do nothing locale = orig_locale = None + if '' not in locales: + raise unittest.SkipTest('no locales') else: for loc in locales: try: locale.setlocale(category, loc) break - except: + except locale.Error: pass + else: + if '' not in locales: + raise unittest.SkipTest(f'no locales {locales}') try: yield @@ -872,6 +898,46 @@ def run_with_locale(catstr, *locales): if locale and orig_locale: locale.setlocale(category, orig_locale) +#======================================================================= +# Decorator for running a function in multiple locales (if they are +# availasble) and resetting the original locale afterwards. + +def run_with_locales(catstr, *locales): + def deco(func): + @functools.wraps(func) + def wrapper(self, /, *args, **kwargs): + dry_run = '' in locales + try: + import locale + category = getattr(locale, catstr) + orig_locale = locale.setlocale(category) + except AttributeError: + # if the test author gives us an invalid category string + raise + except Exception: + # cannot retrieve original locale, so do nothing + pass + else: + try: + for loc in locales: + with self.subTest(locale=loc): + try: + locale.setlocale(category, loc) + except locale.Error: + self.skipTest(f'no locale {loc!r}') + else: + dry_run = False + func(self, *args, **kwargs) + finally: + locale.setlocale(category, orig_locale) + if dry_run: + # no locales available, so just run the test + # with the current locale + with self.subTest(locale=None): + func(self, *args, **kwargs) + return wrapper + return deco + #======================================================================= # Decorator for running a function in a specific timezone, correctly # resetting it afterwards. @@ -2384,9 +2450,9 @@ def adjust_int_max_str_digits(max_digits): else: C_RECURSION_LIMIT = 10000 -#Windows doesn't have os.uname() but it doesn't support s390x. -skip_on_s390x = unittest.skipIf(hasattr(os, 'uname') and os.uname().machine == 's390x', - 'skipped on s390x') +# Windows doesn't have os.uname() but it doesn't support s390x. +is_s390x = hasattr(os, 'uname') and os.uname().machine == 's390x' +skip_on_s390x = unittest.skipIf(is_s390x, 'skipped on s390x') _BASE_COPY_SRC_DIR_IGNORED_NAMES = frozenset({ # SRC_DIR/.git @@ -2413,3 +2479,75 @@ def copy_python_src_ignore(path, names): 'build', } return ignored + + +def iter_builtin_types(): + for obj in __builtins__.values(): + if not isinstance(obj, type): + continue + cls = obj + if cls.__module__ != 'builtins': + continue + yield cls + + +def iter_slot_wrappers(cls): + assert cls.__module__ == 'builtins', cls + + def is_slot_wrapper(name, value): + if not isinstance(value, types.WrapperDescriptorType): + assert not repr(value).startswith(' ' + line for line in data.splitlines()) + return indent + f'{name}:\n' + prefixed_lines + + def run(self, *args, **subprocess_args): + if subprocess_args.get('shell'): + raise ValueError('Running the subprocess in shell mode is not supported.') + default_args = { + 'capture_output': True, + 'check': True, + } + try: + result = subprocess.run([self.interpreter, *args], **default_args | subprocess_args) + except subprocess.CalledProcessError as e: + if e.returncode != 0: + self._logger.error( + f'Interpreter returned non-zero exit status {e.returncode}.\n' + + self._format_output('COMMAND', shlex.join(e.cmd)) + '\n' + + self._format_output('STDOUT', e.stdout.decode()) + '\n' + + self._format_output('STDERR', e.stderr.decode()) + '\n' + ) + raise + else: + return result diff --git a/Lib/test/test__locale.py b/Lib/test/test__locale.py index 0947464b..89c20325 100644 --- a/Lib/test/test__locale.py +++ b/Lib/test/test__locale.py @@ -1,4 +1,4 @@ -from _locale import (setlocale, LC_ALL, LC_CTYPE, LC_NUMERIC, localeconv, Error) +from _locale import (setlocale, LC_ALL, LC_CTYPE, LC_NUMERIC, LC_TIME, localeconv, Error) try: from _locale import (RADIXCHAR, THOUSEP, nl_langinfo) except ImportError: @@ -26,7 +26,10 @@ 'bs_BA', 'fr_LU', 'kl_GL', 'fa_IR', 'de_BE', 'sv_SE', 'it_CH', 'uk_UA', 'eu_ES', 'vi_VN', 'af_ZA', 'nb_NO', 'en_DK', 'tg_TJ', 'ps_AF', 'en_US', 'fr_FR.ISO8859-1', 'fr_FR.UTF-8', 'fr_FR.ISO8859-15@euro', - 'ru_RU.KOI8-R', 'ko_KR.eucKR'] + 'ru_RU.KOI8-R', 'ko_KR.eucKR', + 'ja_JP.UTF-8', 'lzh_TW.UTF-8', 'my_MM.UTF-8', 'or_IN.UTF-8', 'shn_MM.UTF-8', + 'ar_AE.UTF-8', 'bn_IN.UTF-8', 'mr_IN.UTF-8', 'th_TH.TIS620', +] def setUpModule(): global candidate_locales @@ -74,6 +77,27 @@ def accept(loc): 'ps_AF': ('\u066b', '\u066c'), } +known_alt_digits = { + 'C': (0, {}), + 'en_US': (0, {}), + 'fa_IR': (100, {0: '\u06f0\u06f0', 10: '\u06f1\u06f0', 99: '\u06f9\u06f9'}), + 'ja_JP': (100, {1: '\u4e00', 10: '\u5341', 99: '\u4e5d\u5341\u4e5d'}), + 'lzh_TW': (32, {0: '\u3007', 10: '\u5341', 31: '\u5345\u4e00'}), + 'my_MM': (100, {0: '\u1040\u1040', 10: '\u1041\u1040', 99: '\u1049\u1049'}), + 'or_IN': (100, {0: '\u0b66', 10: '\u0b67\u0b66', 99: '\u0b6f\u0b6f'}), + 'shn_MM': (100, {0: '\u1090\u1090', 10: '\u1091\u1090', 99: '\u1099\u1099'}), + 'ar_AE': (100, {0: '\u0660', 10: '\u0661\u0660', 99: '\u0669\u0669'}), + 'bn_IN': (100, {0: '\u09e6', 10: '\u09e7\u09e6', 99: '\u09ef\u09ef'}), +} + +known_era = { + 'C': (0, ''), + 'en_US': (0, ''), + 'ja_JP': (11, '+:1:2019/05/01:2019/12/31:令和:%EC元年'), + 'zh_TW': (3, '+:1:1912/01/01:1912/12/31:民國:%EC元年'), + 'th_TW': (1, '+:1:-543/01/01:+*:พ.ศ.:%EC %Ey'), +} + if sys.platform == 'win32': # ps_AF doesn't work on Windows: see bpo-38324 (msg361830) del known_numerics['ps_AF'] @@ -176,6 +200,80 @@ def test_lc_numeric_basic(self): if not tested: self.skipTest('no suitable locales') + @unittest.skipUnless(nl_langinfo, "nl_langinfo is not available") + @unittest.skipUnless(hasattr(locale, 'ALT_DIGITS'), "requires locale.ALT_DIGITS") + @unittest.skipIf( + support.is_emscripten or support.is_wasi, + "musl libc issue on Emscripten, bpo-46390" + ) + def test_alt_digits_nl_langinfo(self): + # Test nl_langinfo(ALT_DIGITS) + tested = False + for loc in candidate_locales: + with self.subTest(locale=loc): + try: + setlocale(LC_TIME, loc) + setlocale(LC_CTYPE, loc) + except Error: + self.skipTest(f'no locale {loc!r}') + continue + + with self.subTest(locale=loc): + alt_digits = nl_langinfo(locale.ALT_DIGITS) + self.assertIsInstance(alt_digits, str) + alt_digits = alt_digits.split(';') if alt_digits else [] + if alt_digits: + self.assertGreaterEqual(len(alt_digits), 10, alt_digits) + loc1 = loc.split('.', 1)[0] + if loc1 in known_alt_digits: + count, samples = known_alt_digits[loc1] + if count and not alt_digits: + self.skipTest(f'ALT_DIGITS is not set for locale {loc!r} on this platform') + self.assertEqual(len(alt_digits), count, alt_digits) + for i in samples: + self.assertEqual(alt_digits[i], samples[i]) + tested = True + if not tested: + self.skipTest('no suitable locales') + + @unittest.skipUnless(nl_langinfo, "nl_langinfo is not available") + @unittest.skipUnless(hasattr(locale, 'ERA'), "requires locale.ERA") + @unittest.skipIf( + support.is_emscripten or support.is_wasi, + "musl libc issue on Emscripten, bpo-46390" + ) + def test_era_nl_langinfo(self): + # Test nl_langinfo(ERA) + tested = False + for loc in candidate_locales: + with self.subTest(locale=loc): + try: + setlocale(LC_TIME, loc) + setlocale(LC_CTYPE, loc) + except Error: + self.skipTest(f'no locale {loc!r}') + continue + + with self.subTest(locale=loc): + era = nl_langinfo(locale.ERA) + self.assertIsInstance(era, str) + if era: + self.assertEqual(era.count(':'), (era.count(';') + 1) * 5, era) + + loc1 = loc.split('.', 1)[0] + if loc1 in known_era: + count, sample = known_era[loc1] + if count: + if not era: + self.skipTest(f'ERA is not set for locale {loc!r} on this platform') + self.assertGreaterEqual(era.count(';') + 1, count) + self.assertIn(sample, era) + else: + self.assertEqual(era, '') + tested = True + if not tested: + self.skipTest('no suitable locales') + def test_float_parsing(self): # Bug #1391872: Test whether float parsing is okay on European # locales. diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index 940c93bc..01d2a9f2 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -15,7 +15,9 @@ import argparse import warnings +from enum import StrEnum from test.support import os_helper +from test.support.i18n_helper import TestTranslationsBase, update_translation_snapshots from unittest import mock @@ -280,16 +282,18 @@ def test_failures(self, tester): parser = self._get_parser(tester) for args_str in tester.failures: args = args_str.split() - with tester.assertRaises(ArgumentParserError, msg=args): - parser.parse_args(args) + with tester.subTest(args=args): + with tester.assertRaises(ArgumentParserError, msg=args): + parser.parse_args(args) def test_successes(self, tester): parser = self._get_parser(tester) for args, expected_ns in tester.successes: if isinstance(args, str): args = args.split() - result_ns = self._parse_args(parser, args) - tester.assertEqual(expected_ns, result_ns) + with tester.subTest(args=args): + result_ns = self._parse_args(parser, args) + tester.assertEqual(expected_ns, result_ns) # add tests for each combination of an optionals adding method # and an arg parsing method @@ -378,15 +382,22 @@ class TestOptionalsSingleDashAmbiguous(ParserTestCase): """Test Optionals that partially match but are not subsets""" argument_signatures = [Sig('-foobar'), Sig('-foorab')] - failures = ['-f', '-f a', '-fa', '-foa', '-foo', '-fo', '-foo b'] + failures = ['-f', '-f a', '-fa', '-foa', '-foo', '-fo', '-foo b', + '-f=a', '-foo=b'] successes = [ ('', NS(foobar=None, foorab=None)), ('-foob a', NS(foobar='a', foorab=None)), + ('-foob=a', NS(foobar='a', foorab=None)), ('-foor a', NS(foobar=None, foorab='a')), + ('-foor=a', NS(foobar=None, foorab='a')), ('-fooba a', NS(foobar='a', foorab=None)), + ('-fooba=a', NS(foobar='a', foorab=None)), ('-foora a', NS(foobar=None, foorab='a')), + ('-foora=a', NS(foobar=None, foorab='a')), ('-foobar a', NS(foobar='a', foorab=None)), + ('-foobar=a', NS(foobar='a', foorab=None)), ('-foorab a', NS(foobar=None, foorab='a')), + ('-foorab=a', NS(foobar=None, foorab='a')), ] @@ -677,7 +688,7 @@ class TestOptionalsChoices(ParserTestCase): argument_signatures = [ Sig('-f', choices='abc'), Sig('-g', type=int, choices=range(5))] - failures = ['a', '-f d', '-fad', '-ga', '-g 6'] + failures = ['a', '-f d', '-f ab', '-fad', '-ga', '-g 6'] successes = [ ('', NS(f=None, g=None)), ('-f a', NS(f='a', g=None)), @@ -916,7 +927,9 @@ class TestOptionalsAllowLongAbbreviation(ParserTestCase): successes = [ ('', NS(foo=None, foobaz=None, fooble=False)), ('--foo 7', NS(foo='7', foobaz=None, fooble=False)), + ('--foo=7', NS(foo='7', foobaz=None, fooble=False)), ('--fooba a', NS(foo=None, foobaz='a', fooble=False)), + ('--fooba=a', NS(foo=None, foobaz='a', fooble=False)), ('--foobl --foo g', NS(foo='g', foobaz=None, fooble=True)), ] @@ -955,6 +968,23 @@ class TestOptionalsDisallowLongAbbreviationPrefixChars(ParserTestCase): ] +class TestOptionalsDisallowSingleDashLongAbbreviation(ParserTestCase): + """Do not allow abbreviations of long options at all""" + + parser_signature = Sig(allow_abbrev=False) + argument_signatures = [ + Sig('-foo'), + Sig('-foodle', action='store_true'), + Sig('-foonly'), + ] + failures = ['-foon 3', '-food', '-food -foo 2'] + successes = [ + ('', NS(foo=None, foodle=False, foonly=None)), + ('-foo 3', NS(foo='3', foodle=False, foonly=None)), + ('-foonly 7 -foodle -foo 2', NS(foo='2', foodle=True, foonly='7')), + ] + + class TestDisallowLongAbbreviationAllowsShortGrouping(ParserTestCase): """Do not allow abbreviations of long options at all""" @@ -993,6 +1023,34 @@ class TestDisallowLongAbbreviationAllowsShortGroupingPrefix(ParserTestCase): ] +class TestStrEnumChoices(TestCase): + class Color(StrEnum): + RED = "red" + GREEN = "green" + BLUE = "blue" + + def test_parse_enum_value(self): + parser = argparse.ArgumentParser() + parser.add_argument('--color', choices=self.Color) + args = parser.parse_args(['--color', 'red']) + self.assertEqual(args.color, self.Color.RED) + + def test_help_message_contains_enum_choices(self): + parser = argparse.ArgumentParser() + parser.add_argument('--color', choices=self.Color, help='Choose a color') + self.assertIn('[--color {red,green,blue}]', parser.format_usage()) + self.assertIn(' --color {red,green,blue}', parser.format_help()) + + def test_invalid_enum_value_raises_error(self): + parser = argparse.ArgumentParser(exit_on_error=False) + parser.add_argument('--color', choices=self.Color) + self.assertRaisesRegex( + argparse.ArgumentError, + r"invalid choice: 'yellow' \(choose from red, green, blue\)", + parser.parse_args, + ['--color', 'yellow'], + ) + # ================ # Positional tests # ================ @@ -1132,57 +1190,87 @@ class TestPositionalsNargs2None(ParserTestCase): class TestPositionalsNargsNoneZeroOrMore(ParserTestCase): """Test a Positional with no nargs followed by one with unlimited""" - argument_signatures = [Sig('foo'), Sig('bar', nargs='*')] - failures = ['', '--foo'] + argument_signatures = [Sig('-x'), Sig('foo'), Sig('bar', nargs='*')] + failures = ['', '--foo', 'a b -x X c'] successes = [ - ('a', NS(foo='a', bar=[])), - ('a b', NS(foo='a', bar=['b'])), - ('a b c', NS(foo='a', bar=['b', 'c'])), + ('a', NS(x=None, foo='a', bar=[])), + ('a b', NS(x=None, foo='a', bar=['b'])), + ('a b c', NS(x=None, foo='a', bar=['b', 'c'])), + ('-x X a', NS(x='X', foo='a', bar=[])), + ('a -x X', NS(x='X', foo='a', bar=[])), + ('-x X a b', NS(x='X', foo='a', bar=['b'])), + ('a -x X b', NS(x='X', foo='a', bar=['b'])), + ('a b -x X', NS(x='X', foo='a', bar=['b'])), + ('-x X a b c', NS(x='X', foo='a', bar=['b', 'c'])), + ('a -x X b c', NS(x='X', foo='a', bar=['b', 'c'])), + ('a b c -x X', NS(x='X', foo='a', bar=['b', 'c'])), ] class TestPositionalsNargsNoneOneOrMore(ParserTestCase): """Test a Positional with no nargs followed by one with one or more""" - argument_signatures = [Sig('foo'), Sig('bar', nargs='+')] - failures = ['', '--foo', 'a'] + argument_signatures = [Sig('-x'), Sig('foo'), Sig('bar', nargs='+')] + failures = ['', '--foo', 'a', 'a b -x X c'] successes = [ - ('a b', NS(foo='a', bar=['b'])), - ('a b c', NS(foo='a', bar=['b', 'c'])), + ('a b', NS(x=None, foo='a', bar=['b'])), + ('a b c', NS(x=None, foo='a', bar=['b', 'c'])), + ('-x X a b', NS(x='X', foo='a', bar=['b'])), + ('a -x X b', NS(x='X', foo='a', bar=['b'])), + ('a b -x X', NS(x='X', foo='a', bar=['b'])), + ('-x X a b c', NS(x='X', foo='a', bar=['b', 'c'])), + ('a -x X b c', NS(x='X', foo='a', bar=['b', 'c'])), + ('a b c -x X', NS(x='X', foo='a', bar=['b', 'c'])), ] class TestPositionalsNargsNoneOptional(ParserTestCase): """Test a Positional with no nargs followed by one with an Optional""" - argument_signatures = [Sig('foo'), Sig('bar', nargs='?')] + argument_signatures = [Sig('-x'), Sig('foo'), Sig('bar', nargs='?')] failures = ['', '--foo', 'a b c'] successes = [ - ('a', NS(foo='a', bar=None)), - ('a b', NS(foo='a', bar='b')), + ('a', NS(x=None, foo='a', bar=None)), + ('a b', NS(x=None, foo='a', bar='b')), + ('-x X a', NS(x='X', foo='a', bar=None)), + ('a -x X', NS(x='X', foo='a', bar=None)), + ('-x X a b', NS(x='X', foo='a', bar='b')), + ('a -x X b', NS(x='X', foo='a', bar='b')), + ('a b -x X', NS(x='X', foo='a', bar='b')), ] class TestPositionalsNargsZeroOrMoreNone(ParserTestCase): """Test a Positional with unlimited nargs followed by one with none""" - argument_signatures = [Sig('foo', nargs='*'), Sig('bar')] - failures = ['', '--foo'] + argument_signatures = [Sig('-x'), Sig('foo', nargs='*'), Sig('bar')] + failures = ['', '--foo', 'a -x X b', 'a -x X b c', 'a b -x X c'] successes = [ - ('a', NS(foo=[], bar='a')), - ('a b', NS(foo=['a'], bar='b')), - ('a b c', NS(foo=['a', 'b'], bar='c')), + ('a', NS(x=None, foo=[], bar='a')), + ('a b', NS(x=None, foo=['a'], bar='b')), + ('a b c', NS(x=None, foo=['a', 'b'], bar='c')), + ('-x X a', NS(x='X', foo=[], bar='a')), + ('a -x X', NS(x='X', foo=[], bar='a')), + ('-x X a b', NS(x='X', foo=['a'], bar='b')), + ('a b -x X', NS(x='X', foo=['a'], bar='b')), + ('-x X a b c', NS(x='X', foo=['a', 'b'], bar='c')), + ('a b c -x X', NS(x='X', foo=['a', 'b'], bar='c')), ] class TestPositionalsNargsOneOrMoreNone(ParserTestCase): """Test a Positional with one or more nargs followed by one with none""" - argument_signatures = [Sig('foo', nargs='+'), Sig('bar')] - failures = ['', '--foo', 'a'] + argument_signatures = [Sig('-x'), Sig('foo', nargs='+'), Sig('bar')] + failures = ['', '--foo', 'a', 'a -x X b c', 'a b -x X c'] successes = [ - ('a b', NS(foo=['a'], bar='b')), - ('a b c', NS(foo=['a', 'b'], bar='c')), + ('a b', NS(x=None, foo=['a'], bar='b')), + ('a b c', NS(x=None, foo=['a', 'b'], bar='c')), + ('-x X a b', NS(x='X', foo=['a'], bar='b')), + ('a -x X b', NS(x='X', foo=['a'], bar='b')), + ('a b -x X', NS(x='X', foo=['a'], bar='b')), + ('-x X a b c', NS(x='X', foo=['a', 'b'], bar='c')), + ('a b c -x X', NS(x='X', foo=['a', 'b'], bar='c')), ] @@ -1267,14 +1355,21 @@ class TestPositionalsNargsNoneZeroOrMore1(ParserTestCase): """Test three Positionals: no nargs, unlimited nargs and 1 nargs""" argument_signatures = [ + Sig('-x'), Sig('foo'), Sig('bar', nargs='*'), Sig('baz', nargs=1), ] - failures = ['', '--foo', 'a'] + failures = ['', '--foo', 'a', 'a b -x X c'] successes = [ - ('a b', NS(foo='a', bar=[], baz=['b'])), - ('a b c', NS(foo='a', bar=['b'], baz=['c'])), + ('a b', NS(x=None, foo='a', bar=[], baz=['b'])), + ('a b c', NS(x=None, foo='a', bar=['b'], baz=['c'])), + ('-x X a b', NS(x='X', foo='a', bar=[], baz=['b'])), + ('a -x X b', NS(x='X', foo='a', bar=[], baz=['b'])), + ('a b -x X', NS(x='X', foo='a', bar=[], baz=['b'])), + ('-x X a b c', NS(x='X', foo='a', bar=['b'], baz=['c'])), + ('a -x X b c', NS(x='X', foo='a', bar=['b'], baz=['c'])), + ('a b c -x X', NS(x='X', foo='a', bar=['b'], baz=['c'])), ] @@ -1282,14 +1377,22 @@ class TestPositionalsNargsNoneOneOrMore1(ParserTestCase): """Test three Positionals: no nargs, one or more nargs and 1 nargs""" argument_signatures = [ + Sig('-x'), Sig('foo'), Sig('bar', nargs='+'), Sig('baz', nargs=1), ] - failures = ['', '--foo', 'a', 'b'] + failures = ['', '--foo', 'a', 'b', 'a b -x X c d', 'a b c -x X d'] successes = [ - ('a b c', NS(foo='a', bar=['b'], baz=['c'])), - ('a b c d', NS(foo='a', bar=['b', 'c'], baz=['d'])), + ('a b c', NS(x=None, foo='a', bar=['b'], baz=['c'])), + ('a b c d', NS(x=None, foo='a', bar=['b', 'c'], baz=['d'])), + ('-x X a b c', NS(x='X', foo='a', bar=['b'], baz=['c'])), + ('a -x X b c', NS(x='X', foo='a', bar=['b'], baz=['c'])), + ('a b -x X c', NS(x='X', foo='a', bar=['b'], baz=['c'])), + ('a b c -x X', NS(x='X', foo='a', bar=['b'], baz=['c'])), + ('-x X a b c d', NS(x='X', foo='a', bar=['b', 'c'], baz=['d'])), + ('a -x X b c d', NS(x='X', foo='a', bar=['b', 'c'], baz=['d'])), + ('a b c d -x X', NS(x='X', foo='a', bar=['b', 'c'], baz=['d'])), ] @@ -1297,14 +1400,21 @@ class TestPositionalsNargsNoneOptional1(ParserTestCase): """Test three Positionals: no nargs, optional narg and 1 nargs""" argument_signatures = [ + Sig('-x'), Sig('foo'), Sig('bar', nargs='?', default=0.625), Sig('baz', nargs=1), ] - failures = ['', '--foo', 'a'] + failures = ['', '--foo', 'a', 'a b -x X c'] successes = [ - ('a b', NS(foo='a', bar=0.625, baz=['b'])), - ('a b c', NS(foo='a', bar='b', baz=['c'])), + ('a b', NS(x=None, foo='a', bar=0.625, baz=['b'])), + ('a b c', NS(x=None, foo='a', bar='b', baz=['c'])), + ('-x X a b', NS(x='X', foo='a', bar=0.625, baz=['b'])), + ('a -x X b', NS(x='X', foo='a', bar=0.625, baz=['b'])), + ('a b -x X', NS(x='X', foo='a', bar=0.625, baz=['b'])), + ('-x X a b c', NS(x='X', foo='a', bar='b', baz=['c'])), + ('a -x X b c', NS(x='X', foo='a', bar='b', baz=['c'])), + ('a b c -x X', NS(x='X', foo='a', bar='b', baz=['c'])), ] @@ -1481,6 +1591,9 @@ class TestNargsRemainder(ParserTestCase): successes = [ ('X', NS(x='X', y=[], z=None)), ('-z Z X', NS(x='X', y=[], z='Z')), + ('-z Z X A B', NS(x='X', y=['A', 'B'], z='Z')), + ('X -z Z A B', NS(x='X', y=['-z', 'Z', 'A', 'B'], z=None)), + ('X A -z Z B', NS(x='X', y=['A', '-z', 'Z', 'B'], z=None)), ('X A B -z Z', NS(x='X', y=['A', 'B', '-z', 'Z'], z=None)), ('X Y --foo', NS(x='X', y=['Y', '--foo'], z=None)), ] @@ -1517,18 +1630,24 @@ class TestDefaultSuppress(ParserTestCase): """Test actions with suppressed defaults""" argument_signatures = [ - Sig('foo', nargs='?', default=argparse.SUPPRESS), - Sig('bar', nargs='*', default=argparse.SUPPRESS), + Sig('foo', nargs='?', type=int, default=argparse.SUPPRESS), + Sig('bar', nargs='*', type=int, default=argparse.SUPPRESS), Sig('--baz', action='store_true', default=argparse.SUPPRESS), + Sig('--qux', nargs='?', type=int, default=argparse.SUPPRESS), + Sig('--quux', nargs='*', type=int, default=argparse.SUPPRESS), ] - failures = ['-x'] + failures = ['-x', 'a', '1 a'] successes = [ ('', NS()), - ('a', NS(foo='a')), - ('a b', NS(foo='a', bar=['b'])), + ('1', NS(foo=1)), + ('1 2', NS(foo=1, bar=[2])), ('--baz', NS(baz=True)), - ('a --baz', NS(foo='a', baz=True)), - ('--baz a b', NS(foo='a', bar=['b'], baz=True)), + ('1 --baz', NS(foo=1, baz=True)), + ('--baz 1 2', NS(foo=1, bar=[2], baz=True)), + ('--qux', NS(qux=None)), + ('--qux 1', NS(qux=1)), + ('--quux', NS(quux=[])), + ('--quux 1 2', NS(quux=[1, 2])), ] @@ -2126,7 +2245,9 @@ def _get_parser(self, subparser_help=False, prefix_chars=None, else: subparsers_kwargs['help'] = 'command help' subparsers = parser.add_subparsers(**subparsers_kwargs) - self.assertArgumentParserError(parser.add_subparsers) + self.assertRaisesRegex(argparse.ArgumentError, + 'cannot have multiple subparser arguments', + parser.add_subparsers) # add first sub-parser parser1_kwargs = dict(description='1 description') @@ -2136,14 +2257,14 @@ def _get_parser(self, subparser_help=False, prefix_chars=None, parser1_kwargs['aliases'] = ['1alias1', '1alias2'] parser1 = subparsers.add_parser('1', **parser1_kwargs) parser1.add_argument('-w', type=int, help='w help') - parser1.add_argument('x', choices='abc', help='x help') + parser1.add_argument('x', choices=['a', 'b', 'c'], help='x help') # add second sub-parser parser2_kwargs = dict(description='2 description') if subparser_help: parser2_kwargs['help'] = '2 help' parser2 = subparsers.add_parser('2', **parser2_kwargs) - parser2.add_argument('-y', choices='123', help='y help') + parser2.add_argument('-y', choices=['1', '2', '3'], help='y help') parser2.add_argument('z', type=complex, nargs='*', help='z help') # add third sub-parser @@ -2210,6 +2331,40 @@ def test_parse_known_args(self): (NS(foo=False, bar=0.5, w=7, x='b'), ['-W', '-X', 'Y', 'Z']), ) + def test_parse_known_args_to_class_namespace(self): + class C: + pass + self.assertEqual( + self.parser.parse_known_args('0.5 1 b -w 7 -p'.split(), namespace=C), + (C, ['-p']), + ) + self.assertIs(C.foo, False) + self.assertEqual(C.bar, 0.5) + self.assertEqual(C.w, 7) + self.assertEqual(C.x, 'b') + + def test_abbreviation(self): + parser = ErrorRaisingArgumentParser() + parser.add_argument('--foodle') + parser.add_argument('--foonly') + subparsers = parser.add_subparsers() + parser1 = subparsers.add_parser('bar') + parser1.add_argument('--fo') + parser1.add_argument('--foonew') + + self.assertEqual(parser.parse_args(['--food', 'baz', 'bar']), + NS(foodle='baz', foonly=None, fo=None, foonew=None)) + self.assertEqual(parser.parse_args(['--foon', 'baz', 'bar']), + NS(foodle=None, foonly='baz', fo=None, foonew=None)) + self.assertArgumentParserError(parser.parse_args, ['--fo', 'baz', 'bar']) + self.assertEqual(parser.parse_args(['bar', '--fo', 'baz']), + NS(foodle=None, foonly=None, fo='baz', foonew=None)) + self.assertEqual(parser.parse_args(['bar', '--foo', 'baz']), + NS(foodle=None, foonly=None, fo=None, foonew='baz')) + self.assertEqual(parser.parse_args(['bar', '--foon', 'baz']), + NS(foodle=None, foonly=None, fo=None, foonew='baz')) + self.assertArgumentParserError(parser.parse_args, ['bar', '--food', 'baz']) + def test_parse_known_args_with_single_dash_option(self): parser = ErrorRaisingArgumentParser() parser.add_argument('-k', '--known', action='count', default=0) @@ -2297,7 +2452,7 @@ def test_wrong_argument_subparsers_no_destination_error(self): parser.parse_args(('baz',)) self.assertRegex( excinfo.exception.stderr, - r"error: argument {foo,bar}: invalid choice: 'baz' \(choose from 'foo', 'bar'\)\n$" + r"error: argument {foo,bar}: invalid choice: 'baz' \(choose from foo, bar\)\n$" ) def test_optional_subparsers(self): @@ -2755,6 +2910,35 @@ def test_groups_parents(self): -x X '''.format(progname, ' ' if progname else '' ))) + def test_mutex_groups_parents(self): + parent = ErrorRaisingArgumentParser(add_help=False) + g = parent.add_argument_group(title='g', description='gd') + g.add_argument('-w') + g.add_argument('-x') + m = g.add_mutually_exclusive_group() + m.add_argument('-y') + m.add_argument('-z') + parser = ErrorRaisingArgumentParser(prog='PROG', parents=[parent]) + + self.assertRaises(ArgumentParserError, parser.parse_args, + ['-y', 'Y', '-z', 'Z']) + + parser_help = parser.format_help() + self.assertEqual(parser_help, textwrap.dedent('''\ + usage: PROG [-h] [-w W] [-x X] [-y Y | -z Z] + + options: + -h, --help show this help message and exit + + g: + gd + + -w W + -x X + -y Y + -z Z + ''')) + # ============================== # Mutually exclusive group tests # ============================== @@ -2831,26 +3015,30 @@ def test_failures_when_not_required(self): parse_args = self.get_parser(required=False).parse_args error = ArgumentParserError for args_string in self.failures: - self.assertRaises(error, parse_args, args_string.split()) + with self.subTest(args=args_string): + self.assertRaises(error, parse_args, args_string.split()) def test_failures_when_required(self): parse_args = self.get_parser(required=True).parse_args error = ArgumentParserError for args_string in self.failures + ['']: - self.assertRaises(error, parse_args, args_string.split()) + with self.subTest(args=args_string): + self.assertRaises(error, parse_args, args_string.split()) def test_successes_when_not_required(self): parse_args = self.get_parser(required=False).parse_args successes = self.successes + self.successes_when_not_required for args_string, expected_ns in successes: - actual_ns = parse_args(args_string.split()) - self.assertEqual(actual_ns, expected_ns) + with self.subTest(args=args_string): + actual_ns = parse_args(args_string.split()) + self.assertEqual(actual_ns, expected_ns) def test_successes_when_required(self): parse_args = self.get_parser(required=True).parse_args for args_string, expected_ns in self.successes: - actual_ns = parse_args(args_string.split()) - self.assertEqual(actual_ns, expected_ns) + with self.subTest(args=args_string): + actual_ns = parse_args(args_string.split()) + self.assertEqual(actual_ns, expected_ns) def test_usage_when_not_required(self): format_usage = self.get_parser(required=False).format_usage @@ -3027,7 +3215,7 @@ def get_parser(self, required): group = parser.add_mutually_exclusive_group(required=required) group.add_argument('--foo', action='store_true', help='FOO') group.add_argument('--spam', help='SPAM') - group.add_argument('badger', nargs='*', default='X', help='BADGER') + group.add_argument('badger', nargs='*', help='BADGER') return parser failures = [ @@ -3038,13 +3226,13 @@ def get_parser(self, required): '--foo X Y', ] successes = [ - ('--foo', NS(foo=True, spam=None, badger='X')), - ('--spam S', NS(foo=False, spam='S', badger='X')), + ('--foo', NS(foo=True, spam=None, badger=[])), + ('--spam S', NS(foo=False, spam='S', badger=[])), ('X', NS(foo=False, spam=None, badger=['X'])), ('X Y Z', NS(foo=False, spam=None, badger=['X', 'Y', 'Z'])), ] successes_when_not_required = [ - ('', NS(foo=False, spam=None, badger='X')), + ('', NS(foo=False, spam=None, badger=[])), ] usage_when_not_required = '''\ @@ -3237,6 +3425,111 @@ def get_parser(self, required): test_successes_when_not_required = None test_successes_when_required = None + +class TestMutuallyExclusiveOptionalOptional(MEMixin, TestCase): + def get_parser(self, required=None): + parser = ErrorRaisingArgumentParser(prog='PROG') + group = parser.add_mutually_exclusive_group(required=required) + group.add_argument('--foo') + group.add_argument('--bar', nargs='?') + return parser + + failures = [ + '--foo X --bar Y', + '--foo X --bar', + ] + successes = [ + ('--foo X', NS(foo='X', bar=None)), + ('--bar X', NS(foo=None, bar='X')), + ('--bar', NS(foo=None, bar=None)), + ] + successes_when_not_required = [ + ('', NS(foo=None, bar=None)), + ] + usage_when_required = '''\ + usage: PROG [-h] (--foo FOO | --bar [BAR]) + ''' + usage_when_not_required = '''\ + usage: PROG [-h] [--foo FOO | --bar [BAR]] + ''' + help = '''\ + + options: + -h, --help show this help message and exit + --foo FOO + --bar [BAR] + ''' + + +class TestMutuallyExclusiveOptionalWithDefault(MEMixin, TestCase): + def get_parser(self, required=None): + parser = ErrorRaisingArgumentParser(prog='PROG') + group = parser.add_mutually_exclusive_group(required=required) + group.add_argument('--foo') + group.add_argument('--bar', type=bool, default=True) + return parser + + failures = [ + '--foo X --bar Y', + '--foo X --bar=', + ] + successes = [ + ('--foo X', NS(foo='X', bar=True)), + ('--bar X', NS(foo=None, bar=True)), + ('--bar=', NS(foo=None, bar=False)), + ] + successes_when_not_required = [ + ('', NS(foo=None, bar=True)), + ] + usage_when_required = '''\ + usage: PROG [-h] (--foo FOO | --bar BAR) + ''' + usage_when_not_required = '''\ + usage: PROG [-h] [--foo FOO | --bar BAR] + ''' + help = '''\ + + options: + -h, --help show this help message and exit + --foo FOO + --bar BAR + ''' + + +class TestMutuallyExclusivePositionalWithDefault(MEMixin, TestCase): + def get_parser(self, required=None): + parser = ErrorRaisingArgumentParser(prog='PROG') + group = parser.add_mutually_exclusive_group(required=required) + group.add_argument('--foo') + group.add_argument('bar', nargs='?', type=bool, default=True) + return parser + + failures = [ + '--foo X Y', + ] + successes = [ + ('--foo X', NS(foo='X', bar=True)), + ('X', NS(foo=None, bar=True)), + ] + successes_when_not_required = [ + ('', NS(foo=None, bar=True)), + ] + usage_when_required = '''\ + usage: PROG [-h] (--foo FOO | bar) + ''' + usage_when_not_required = '''\ + usage: PROG [-h] [--foo FOO | bar] + ''' + help = '''\ + + positional arguments: + bar + + options: + -h, --help show this help message and exit + --foo FOO + ''' + # ================================================= # Mutually exclusive group in parent parser tests # ================================================= @@ -4197,7 +4490,7 @@ class TestHelpVariableExpansion(HelpTestCase): help='x %(prog)s %(default)s %(type)s %%'), Sig('-y', action='store_const', default=42, const='XXX', help='y %(prog)s %(default)s %(const)s'), - Sig('--foo', choices='abc', + Sig('--foo', choices=['a', 'b', 'c'], help='foo %(prog)s %(default)s %(choices)s'), Sig('--bar', default='baz', choices=[1, 2], metavar='BBB', help='bar %(prog)s %(default)s %(dest)s'), @@ -4440,7 +4733,7 @@ class TestHelpNone(HelpTestCase): version = '' -class TestHelpTupleMetavar(HelpTestCase): +class TestHelpTupleMetavarOptional(HelpTestCase): """Test specifying metavar as a tuple""" parser_signature = Sig(prog='PROG') @@ -4467,6 +4760,34 @@ class TestHelpTupleMetavar(HelpTestCase): version = '' +class TestHelpTupleMetavarPositional(HelpTestCase): + """Test specifying metavar on a Positional as a tuple""" + + parser_signature = Sig(prog='PROG') + argument_signatures = [ + Sig('w', help='w help', nargs='+', metavar=('W1', 'W2')), + Sig('x', help='x help', nargs='*', metavar=('X1', 'X2')), + Sig('y', help='y help', nargs=3, metavar=('Y1', 'Y2', 'Y3')), + Sig('z', help='z help', nargs='?', metavar=('Z1',)), + ] + argument_group_signatures = [] + usage = '''\ + usage: PROG [-h] W1 [W2 ...] [X1 [X2 ...]] Y1 Y2 Y3 [Z1] + ''' + help = usage + '''\ + + positional arguments: + W1 W2 w help + X1 X2 x help + Y1 Y2 Y3 y help + Z1 z help + + options: + -h, --help show this help message and exit + ''' + version = '' + + class TestHelpRawText(HelpTestCase): """Test the RawTextHelpFormatter""" @@ -4760,6 +5081,46 @@ def custom_type(string): version = '' +class TestHelpUsageLongSubparserCommand(TestCase): + """Test that subparser commands are formatted correctly in help""" + maxDiff = None + + def test_parent_help(self): + def custom_formatter(prog): + return argparse.RawTextHelpFormatter(prog, max_help_position=50) + + parent_parser = argparse.ArgumentParser( + prog='PROG', + formatter_class=custom_formatter + ) + + cmd_subparsers = parent_parser.add_subparsers(title="commands", + metavar='CMD', + help='command to use') + cmd_subparsers.add_parser("add", + help="add something") + + cmd_subparsers.add_parser("remove", + help="remove something") + + cmd_subparsers.add_parser("a-very-long-command", + help="command that does something") + + parser_help = parent_parser.format_help() + self.assertEqual(parser_help, textwrap.dedent('''\ + usage: PROG [-h] CMD ... + + options: + -h, --help show this help message and exit + + commands: + CMD command to use + add add something + remove remove something + a-very-long-command command that does something + ''')) + + # ===================================== # Optional/Positional constructor tests # ===================================== @@ -4767,15 +5128,15 @@ def custom_type(string): class TestInvalidArgumentConstructors(TestCase): """Test a bunch of invalid Argument constructors""" - def assertTypeError(self, *args, **kwargs): + def assertTypeError(self, *args, errmsg=None, **kwargs): parser = argparse.ArgumentParser() - self.assertRaises(TypeError, parser.add_argument, - *args, **kwargs) + self.assertRaisesRegex(TypeError, errmsg, parser.add_argument, + *args, **kwargs) - def assertValueError(self, *args, **kwargs): + def assertValueError(self, *args, errmsg=None, **kwargs): parser = argparse.ArgumentParser() - self.assertRaises(ValueError, parser.add_argument, - *args, **kwargs) + self.assertRaisesRegex(ValueError, errmsg, parser.add_argument, + *args, **kwargs) def test_invalid_keyword_arguments(self): self.assertTypeError('-x', bar=None) @@ -4785,8 +5146,9 @@ def test_invalid_keyword_arguments(self): def test_missing_destination(self): self.assertTypeError() - for action in ['append', 'store']: - self.assertTypeError(action=action) + for action in ['store', 'append', 'extend']: + with self.subTest(action=action): + self.assertTypeError(action=action) def test_invalid_option_strings(self): self.assertValueError('--') @@ -4800,10 +5162,8 @@ def test_invalid_action(self): self.assertValueError('-x', action='foo') self.assertValueError('foo', action='baz') self.assertValueError('--foo', action=('store', 'append')) - parser = argparse.ArgumentParser() - with self.assertRaises(ValueError) as cm: - parser.add_argument("--foo", action="store-true") - self.assertIn('unknown action', str(cm.exception)) + self.assertValueError('--foo', action="store-true", + errmsg='unknown action') def test_multiple_dest(self): parser = argparse.ArgumentParser() @@ -4816,39 +5176,47 @@ def test_multiple_dest(self): def test_no_argument_actions(self): for action in ['store_const', 'store_true', 'store_false', 'append_const', 'count']: - for attrs in [dict(type=int), dict(nargs='+'), - dict(choices='ab')]: - self.assertTypeError('-x', action=action, **attrs) + with self.subTest(action=action): + for attrs in [dict(type=int), dict(nargs='+'), + dict(choices=['a', 'b'])]: + with self.subTest(attrs=attrs): + self.assertTypeError('-x', action=action, **attrs) + self.assertTypeError('x', action=action, **attrs) + self.assertTypeError('-x', action=action, nargs=0) + self.assertTypeError('x', action=action, nargs=0) def test_no_argument_no_const_actions(self): # options with zero arguments for action in ['store_true', 'store_false', 'count']: + with self.subTest(action=action): + # const is always disallowed + self.assertTypeError('-x', const='foo', action=action) - # const is always disallowed - self.assertTypeError('-x', const='foo', action=action) - - # nargs is always disallowed - self.assertTypeError('-x', nargs='*', action=action) + # nargs is always disallowed + self.assertTypeError('-x', nargs='*', action=action) def test_more_than_one_argument_actions(self): - for action in ['store', 'append']: - - # nargs=0 is disallowed - self.assertValueError('-x', nargs=0, action=action) - self.assertValueError('spam', nargs=0, action=action) - - # const is disallowed with non-optional arguments - for nargs in [1, '*', '+']: - self.assertValueError('-x', const='foo', - nargs=nargs, action=action) - self.assertValueError('spam', const='foo', - nargs=nargs, action=action) + for action in ['store', 'append', 'extend']: + with self.subTest(action=action): + # nargs=0 is disallowed + action_name = 'append' if action == 'extend' else action + self.assertValueError('-x', nargs=0, action=action, + errmsg=f'nargs for {action_name} actions must be != 0') + self.assertValueError('spam', nargs=0, action=action, + errmsg=f'nargs for {action_name} actions must be != 0') + + # const is disallowed with non-optional arguments + for nargs in [1, '*', '+']: + self.assertValueError('-x', const='foo', + nargs=nargs, action=action) + self.assertValueError('spam', const='foo', + nargs=nargs, action=action) def test_required_const_actions(self): for action in ['store_const', 'append_const']: - - # nargs is always disallowed - self.assertTypeError('-x', nargs='+', action=action) + with self.subTest(action=action): + # nargs is always disallowed + self.assertTypeError('-x', nargs='+', action=action) def test_parsers_action_missing_params(self): self.assertTypeError('command', action='parsers') @@ -5381,8 +5749,34 @@ def test_zero_or_more_optional(self): args = parser.parse_args([]) self.assertEqual(NS(x=[]), args) - def test_double_dash(self): - parser = argparse.ArgumentParser() + +class TestDoubleDash(TestCase): + def test_single_argument_option(self): + parser = argparse.ArgumentParser(exit_on_error=False) + parser.add_argument('-f', '--foo') + parser.add_argument('bar', nargs='*') + + args = parser.parse_args(['--foo=--']) + self.assertEqual(NS(foo='--', bar=[]), args) + self.assertRaisesRegex(argparse.ArgumentError, + 'argument -f/--foo: expected one argument', + parser.parse_args, ['--foo', '--']) + args = parser.parse_args(['-f--']) + self.assertEqual(NS(foo='--', bar=[]), args) + self.assertRaisesRegex(argparse.ArgumentError, + 'argument -f/--foo: expected one argument', + parser.parse_args, ['-f', '--']) + args = parser.parse_args(['--foo', 'a', '--', 'b', 'c']) + self.assertEqual(NS(foo='a', bar=['b', 'c']), args) + args = parser.parse_args(['a', 'b', '--foo', 'c']) + self.assertEqual(NS(foo='c', bar=['a', 'b']), args) + args = parser.parse_args(['a', '--', 'b', '--foo', 'c']) + self.assertEqual(NS(foo=None, bar=['a', 'b', '--foo', 'c']), args) + args = parser.parse_args(['a', '--', 'b', '--', 'c', '--foo', 'd']) + self.assertEqual(NS(foo=None, bar=['a', 'b', '--', 'c', '--foo', 'd']), args) + + def test_multiple_argument_option(self): + parser = argparse.ArgumentParser(exit_on_error=False) parser.add_argument('-f', '--foo', nargs='*') parser.add_argument('bar', nargs='*') @@ -5396,6 +5790,91 @@ def test_double_dash(self): self.assertEqual(NS(foo=[], bar=[]), args) args = parser.parse_args(['--foo', 'a', 'b', '--', 'c', 'd']) self.assertEqual(NS(foo=['a', 'b'], bar=['c', 'd']), args) + args = parser.parse_args(['a', 'b', '--foo', 'c', 'd']) + self.assertEqual(NS(foo=['c', 'd'], bar=['a', 'b']), args) + args = parser.parse_args(['a', '--', 'b', '--foo', 'c', 'd']) + self.assertEqual(NS(foo=None, bar=['a', 'b', '--foo', 'c', 'd']), args) + args, argv = parser.parse_known_args(['a', 'b', '--foo', 'c', '--', 'd']) + self.assertEqual(NS(foo=['c'], bar=['a', 'b']), args) + self.assertEqual(argv, ['--', 'd']) + + def test_multiple_double_dashes(self): + parser = argparse.ArgumentParser(exit_on_error=False) + parser.add_argument('foo') + parser.add_argument('bar', nargs='*') + + args = parser.parse_args(['--', 'a', 'b', 'c']) + self.assertEqual(NS(foo='a', bar=['b', 'c']), args) + args = parser.parse_args(['a', '--', 'b', 'c']) + self.assertEqual(NS(foo='a', bar=['b', 'c']), args) + args = parser.parse_args(['a', 'b', '--', 'c']) + self.assertEqual(NS(foo='a', bar=['b', 'c']), args) + args = parser.parse_args(['a', '--', 'b', '--', 'c']) + self.assertEqual(NS(foo='a', bar=['b', '--', 'c']), args) + args = parser.parse_args(['--', '--', 'a', '--', 'b', 'c']) + self.assertEqual(NS(foo='--', bar=['a', '--', 'b', 'c']), args) + + def test_remainder(self): + parser = argparse.ArgumentParser(exit_on_error=False) + parser.add_argument('foo') + parser.add_argument('bar', nargs='...') + + args = parser.parse_args(['--', 'a', 'b', 'c']) + self.assertEqual(NS(foo='a', bar=['b', 'c']), args) + args = parser.parse_args(['a', '--', 'b', 'c']) + self.assertEqual(NS(foo='a', bar=['b', 'c']), args) + args = parser.parse_args(['a', 'b', '--', 'c']) + self.assertEqual(NS(foo='a', bar=['b', '--', 'c']), args) + args = parser.parse_args(['a', '--', 'b', '--', 'c']) + self.assertEqual(NS(foo='a', bar=['b', '--', 'c']), args) + + parser = argparse.ArgumentParser(exit_on_error=False) + parser.add_argument('--foo') + parser.add_argument('bar', nargs='...') + args = parser.parse_args(['--foo', 'a', '--', 'b', '--', 'c']) + self.assertEqual(NS(foo='a', bar=['--', 'b', '--', 'c']), args) + + def test_subparser(self): + parser = argparse.ArgumentParser(exit_on_error=False) + parser.add_argument('foo') + subparsers = parser.add_subparsers() + parser1 = subparsers.add_parser('run') + parser1.add_argument('-f') + parser1.add_argument('bar', nargs='*') + + args = parser.parse_args(['x', 'run', 'a', 'b', '-f', 'c']) + self.assertEqual(NS(foo='x', f='c', bar=['a', 'b']), args) + args = parser.parse_args(['x', 'run', 'a', 'b', '--', '-f', 'c']) + self.assertEqual(NS(foo='x', f=None, bar=['a', 'b', '-f', 'c']), args) + args = parser.parse_args(['x', 'run', 'a', '--', 'b', '-f', 'c']) + self.assertEqual(NS(foo='x', f=None, bar=['a', 'b', '-f', 'c']), args) + args = parser.parse_args(['x', 'run', '--', 'a', 'b', '-f', 'c']) + self.assertEqual(NS(foo='x', f=None, bar=['a', 'b', '-f', 'c']), args) + args = parser.parse_args(['x', '--', 'run', 'a', 'b', '-f', 'c']) + self.assertEqual(NS(foo='x', f='c', bar=['a', 'b']), args) + args = parser.parse_args(['--', 'x', 'run', 'a', 'b', '-f', 'c']) + self.assertEqual(NS(foo='x', f='c', bar=['a', 'b']), args) + args = parser.parse_args(['x', 'run', '--', 'a', '--', 'b']) + self.assertEqual(NS(foo='x', f=None, bar=['a', '--', 'b']), args) + args = parser.parse_args(['x', '--', 'run', '--', 'a', '--', 'b']) + self.assertEqual(NS(foo='x', f=None, bar=['a', '--', 'b']), args) + self.assertRaisesRegex(argparse.ArgumentError, + "invalid choice: '--'", + parser.parse_args, ['--', 'x', '--', 'run', 'a', 'b']) + + def test_subparser_after_multiple_argument_option(self): + parser = argparse.ArgumentParser(exit_on_error=False) + parser.add_argument('--foo', nargs='*') + subparsers = parser.add_subparsers() + parser1 = subparsers.add_parser('run') + parser1.add_argument('-f') + parser1.add_argument('bar', nargs='*') + + args = parser.parse_args(['--foo', 'x', 'y', '--', 'run', 'a', 'b', '-f', 'c']) + self.assertEqual(NS(foo=['x', 'y'], f='c', bar=['a', 'b']), args) + self.assertRaisesRegex(argparse.ArgumentError, + "invalid choice: '--'", + parser.parse_args, ['--foo', 'x', '--', '--', 'run', 'a', 'b']) # =========================== @@ -5417,14 +5896,25 @@ def test_basic(self): args, extras = parser.parse_known_args(argv) # cannot parse the '1,2,3' - self.assertEqual(NS(bar='y', cmd='cmd', foo='x', rest=[]), args) - self.assertEqual(["1", "2", "3"], extras) + self.assertEqual(NS(bar='y', cmd='cmd', foo='x', rest=[1]), args) + self.assertEqual(["2", "3"], extras) + args, extras = parser.parse_known_intermixed_args(argv) + self.assertEqual(NS(bar='y', cmd='cmd', foo='x', rest=[1, 2, 3]), args) + self.assertEqual([], extras) + # unknown optionals go into extras + argv = 'cmd --foo x --error 1 2 --bar y 3'.split() + args, extras = parser.parse_known_intermixed_args(argv) + self.assertEqual(NS(bar='y', cmd='cmd', foo='x', rest=[1, 2, 3]), args) + self.assertEqual(['--error'], extras) argv = 'cmd --foo x 1 --error 2 --bar y 3'.split() args, extras = parser.parse_known_intermixed_args(argv) - # unknown optionals go into extras - self.assertEqual(NS(bar='y', cmd='cmd', foo='x', rest=[1]), args) - self.assertEqual(['--error', '2', '3'], extras) + self.assertEqual(NS(bar='y', cmd='cmd', foo='x', rest=[1, 2, 3]), args) + self.assertEqual(['--error'], extras) + argv = 'cmd --foo x 1 2 --error --bar y 3'.split() + args, extras = parser.parse_known_intermixed_args(argv) + self.assertEqual(NS(bar='y', cmd='cmd', foo='x', rest=[1, 2, 3]), args) + self.assertEqual(['--error'], extras) # restores attributes that were temporarily changed self.assertIsNone(parser.usage) @@ -5443,28 +5933,45 @@ def test_remainder(self): parser.parse_intermixed_args(argv) self.assertRegex(str(cm.exception), r'\.\.\.') - def test_exclusive(self): - # mutually exclusive group; intermixed works fine - parser = ErrorRaisingArgumentParser(prog='PROG') + def test_required_exclusive(self): + # required mutually exclusive group; intermixed works fine + parser = argparse.ArgumentParser(prog='PROG', exit_on_error=False) group = parser.add_mutually_exclusive_group(required=True) group.add_argument('--foo', action='store_true', help='FOO') group.add_argument('--spam', help='SPAM') parser.add_argument('badger', nargs='*', default='X', help='BADGER') + args = parser.parse_intermixed_args('--foo 1 2'.split()) + self.assertEqual(NS(badger=['1', '2'], foo=True, spam=None), args) args = parser.parse_intermixed_args('1 --foo 2'.split()) self.assertEqual(NS(badger=['1', '2'], foo=True, spam=None), args) - self.assertRaises(ArgumentParserError, parser.parse_intermixed_args, '1 2'.split()) + self.assertRaisesRegex(argparse.ArgumentError, + 'one of the arguments --foo --spam is required', + parser.parse_intermixed_args, '1 2'.split()) self.assertEqual(group.required, True) - def test_exclusive_incompatible(self): - # mutually exclusive group including positional - fail - parser = ErrorRaisingArgumentParser(prog='PROG') + def test_required_exclusive_with_positional(self): + # required mutually exclusive group with positional argument + parser = argparse.ArgumentParser(prog='PROG', exit_on_error=False) group = parser.add_mutually_exclusive_group(required=True) group.add_argument('--foo', action='store_true', help='FOO') group.add_argument('--spam', help='SPAM') group.add_argument('badger', nargs='*', default='X', help='BADGER') - self.assertRaises(TypeError, parser.parse_intermixed_args, []) + args = parser.parse_intermixed_args(['--foo']) + self.assertEqual(NS(foo=True, spam=None, badger='X'), args) + args = parser.parse_intermixed_args(['a', 'b']) + self.assertEqual(NS(foo=False, spam=None, badger=['a', 'b']), args) + self.assertRaisesRegex(argparse.ArgumentError, + 'one of the arguments --foo --spam badger is required', + parser.parse_intermixed_args, []) + self.assertRaisesRegex(argparse.ArgumentError, + 'argument badger: not allowed with argument --foo', + parser.parse_intermixed_args, ['--foo', 'a', 'b']) + self.assertRaisesRegex(argparse.ArgumentError, + 'argument badger: not allowed with argument --foo', + parser.parse_intermixed_args, ['a', '--foo', 'b']) self.assertEqual(group.required, True) + class TestIntermixedMessageContentError(TestCase): # case where Intermixed gives different error message # error is raised by 1st parsing step @@ -5482,7 +5989,7 @@ def test_missing_argument_name_in_message(self): with self.assertRaises(ArgumentParserError) as cm: parser.parse_intermixed_args([]) msg = str(cm.exception) - self.assertNotRegex(msg, 'req_pos') + self.assertRegex(msg, 'req_pos') self.assertRegex(msg, 'req_opt') # ========================== @@ -5732,7 +6239,8 @@ def test_help_with_metavar(self): class TestExitOnError(TestCase): def setUp(self): - self.parser = argparse.ArgumentParser(exit_on_error=False) + self.parser = argparse.ArgumentParser(exit_on_error=False, + fromfile_prefix_chars='@') self.parser.add_argument('--integers', metavar='N', type=int) def test_exit_on_error_with_good_args(self): @@ -5743,6 +6251,153 @@ def test_exit_on_error_with_bad_args(self): with self.assertRaises(argparse.ArgumentError): self.parser.parse_args('--integers a'.split()) + def test_unrecognized_args(self): + self.assertRaisesRegex(argparse.ArgumentError, + 'unrecognized arguments: --foo bar', + self.parser.parse_args, '--foo bar'.split()) + + def test_unrecognized_intermixed_args(self): + self.assertRaisesRegex(argparse.ArgumentError, + 'unrecognized arguments: --foo bar', + self.parser.parse_intermixed_args, '--foo bar'.split()) + + def test_required_args(self): + self.parser.add_argument('bar') + self.parser.add_argument('baz') + self.assertRaisesRegex(argparse.ArgumentError, + 'the following arguments are required: bar, baz$', + self.parser.parse_args, []) + + def test_required_args_with_metavar(self): + self.parser.add_argument('bar') + self.parser.add_argument('baz', metavar='BaZ') + self.assertRaisesRegex(argparse.ArgumentError, + 'the following arguments are required: bar, BaZ$', + self.parser.parse_args, []) + + def test_required_args_n(self): + self.parser.add_argument('bar') + self.parser.add_argument('baz', nargs=3) + self.assertRaisesRegex(argparse.ArgumentError, + 'the following arguments are required: bar, baz$', + self.parser.parse_args, []) + + def test_required_args_n_with_metavar(self): + self.parser.add_argument('bar') + self.parser.add_argument('baz', nargs=3, metavar=('B', 'A', 'Z')) + self.assertRaisesRegex(argparse.ArgumentError, + 'the following arguments are required: bar, B, A, Z$', + self.parser.parse_args, []) + + def test_required_args_optional(self): + self.parser.add_argument('bar') + self.parser.add_argument('baz', nargs='?') + self.assertRaisesRegex(argparse.ArgumentError, + 'the following arguments are required: bar$', + self.parser.parse_args, []) + + def test_required_args_zero_or_more(self): + self.parser.add_argument('bar') + self.parser.add_argument('baz', nargs='*') + self.assertRaisesRegex(argparse.ArgumentError, + 'the following arguments are required: bar$', + self.parser.parse_args, []) + + def test_required_args_one_or_more(self): + self.parser.add_argument('bar') + self.parser.add_argument('baz', nargs='+') + self.assertRaisesRegex(argparse.ArgumentError, + 'the following arguments are required: bar, baz$', + self.parser.parse_args, []) + + def test_required_args_one_or_more_with_metavar(self): + self.parser.add_argument('bar') + self.parser.add_argument('baz', nargs='+', metavar=('BaZ1', 'BaZ2')) + self.assertRaisesRegex(argparse.ArgumentError, + r'the following arguments are required: bar, BaZ1\[, BaZ2]$', + self.parser.parse_args, []) + + def test_required_args_remainder(self): + self.parser.add_argument('bar') + self.parser.add_argument('baz', nargs='...') + self.assertRaisesRegex(argparse.ArgumentError, + 'the following arguments are required: bar$', + self.parser.parse_args, []) + + def test_required_mutually_exclusive_args(self): + group = self.parser.add_mutually_exclusive_group(required=True) + group.add_argument('--bar') + group.add_argument('--baz') + self.assertRaisesRegex(argparse.ArgumentError, + 'one of the arguments --bar --baz is required', + self.parser.parse_args, []) + + def test_conflicting_mutually_exclusive_args_optional_with_metavar(self): + group = self.parser.add_mutually_exclusive_group() + group.add_argument('--bar') + group.add_argument('baz', nargs='?', metavar='BaZ') + self.assertRaisesRegex(argparse.ArgumentError, + 'argument BaZ: not allowed with argument --bar$', + self.parser.parse_args, ['--bar', 'a', 'b']) + self.assertRaisesRegex(argparse.ArgumentError, + 'argument --bar: not allowed with argument BaZ$', + self.parser.parse_args, ['a', '--bar', 'b']) + + def test_conflicting_mutually_exclusive_args_zero_or_more_with_metavar1(self): + group = self.parser.add_mutually_exclusive_group() + group.add_argument('--bar') + group.add_argument('baz', nargs='*', metavar=('BAZ1',)) + self.assertRaisesRegex(argparse.ArgumentError, + 'argument BAZ1: not allowed with argument --bar$', + self.parser.parse_args, ['--bar', 'a', 'b']) + self.assertRaisesRegex(argparse.ArgumentError, + 'argument --bar: not allowed with argument BAZ1$', + self.parser.parse_args, ['a', '--bar', 'b']) + + def test_conflicting_mutually_exclusive_args_zero_or_more_with_metavar2(self): + group = self.parser.add_mutually_exclusive_group() + group.add_argument('--bar') + group.add_argument('baz', nargs='*', metavar=('BAZ1', 'BAZ2')) + self.assertRaisesRegex(argparse.ArgumentError, + r'argument BAZ1\[, BAZ2]: not allowed with argument --bar$', + self.parser.parse_args, ['--bar', 'a', 'b']) + self.assertRaisesRegex(argparse.ArgumentError, + r'argument --bar: not allowed with argument BAZ1\[, BAZ2]$', + self.parser.parse_args, ['a', '--bar', 'b']) + + def test_ambiguous_option(self): + self.parser.add_argument('--foobaz') + self.parser.add_argument('--fooble', action='store_true') + self.parser.add_argument('--foogle') + self.assertRaisesRegex(argparse.ArgumentError, + "ambiguous option: --foob could match --foobaz, --fooble", + self.parser.parse_args, ['--foob']) + self.assertRaisesRegex(argparse.ArgumentError, + "ambiguous option: --foob=1 could match --foobaz, --fooble$", + self.parser.parse_args, ['--foob=1']) + self.assertRaisesRegex(argparse.ArgumentError, + "ambiguous option: --foob could match --foobaz, --fooble$", + self.parser.parse_args, ['--foob', '1', '--foogle', '2']) + self.assertRaisesRegex(argparse.ArgumentError, + "ambiguous option: --foob=1 could match --foobaz, --fooble$", + self.parser.parse_args, ['--foob=1', '--foogle', '2']) + + def test_os_error(self): + self.parser.add_argument('file') + self.assertRaisesRegex(argparse.ArgumentError, + "No such file or directory: 'no-such-file'", + self.parser.parse_args, ['@no-such-file']) + + +# ================= +# Translation tests +# ================= + +class TestTranslations(TestTranslationsBase): + + def test_translations(self): + self.assertMsgidsEqual(argparse) + def tearDownModule(): # Remove global references to avoid looking like we have refleaks. @@ -5751,4 +6406,8 @@ def tearDownModule(): if __name__ == '__main__': + # To regenerate translation snapshots + if len(sys.argv) > 1 and sys.argv[1] == '--snapshot-update': + update_translation_snapshots(argparse) + sys.exit(0) unittest.main() diff --git a/Lib/test/test_array.py b/Lib/test/test_array.py index 5b2c107a..9c21cf03 100755 --- a/Lib/test/test_array.py +++ b/Lib/test/test_array.py @@ -1437,7 +1437,7 @@ def test_byteswap(self): self.assertEqual(a, b) else: # On alphas treating the byte swapped bit patters as - # floats/doubles results in floating point exceptions + # floats/doubles results in floating-point exceptions # => compare the 8bit string values instead self.assertNotEqual(a.tobytes(), b.tobytes()) b.byteswap() diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py deleted file mode 100644 index a357fbfd..00000000 --- a/Lib/test/test_ast.py +++ /dev/null @@ -1,3078 +0,0 @@ -import ast -import builtins -import dis -import enum -import os -import re -import sys -import textwrap -import types -import unittest -import warnings -import weakref -from functools import partial -from textwrap import dedent - -from test import support -from test.support.import_helper import import_fresh_module -from test.support import os_helper, script_helper -from test.support.ast_helper import ASTTestMixin - -def to_tuple(t): - if t is None or isinstance(t, (str, int, complex)) or t is Ellipsis: - return t - elif isinstance(t, list): - return [to_tuple(e) for e in t] - result = [t.__class__.__name__] - if hasattr(t, 'lineno') and hasattr(t, 'col_offset'): - result.append((t.lineno, t.col_offset)) - if hasattr(t, 'end_lineno') and hasattr(t, 'end_col_offset'): - result[-1] += (t.end_lineno, t.end_col_offset) - if t._fields is None: - return tuple(result) - for f in t._fields: - result.append(to_tuple(getattr(t, f))) - return tuple(result) - - -# These tests are compiled through "exec" -# There should be at least one test per statement -exec_tests = [ - # None - "None", - # Module docstring - "'module docstring'", - # FunctionDef - "def f(): pass", - # FunctionDef with docstring - "def f(): 'function docstring'", - # FunctionDef with arg - "def f(a): pass", - # FunctionDef with arg and default value - "def f(a=0): pass", - # FunctionDef with varargs - "def f(*args): pass", - # FunctionDef with varargs as TypeVarTuple - "def f(*args: *Ts): pass", - # FunctionDef with varargs as unpacked Tuple - "def f(*args: *tuple[int, ...]): pass", - # FunctionDef with varargs as unpacked Tuple *and* TypeVarTuple - "def f(*args: *tuple[int, *Ts]): pass", - # FunctionDef with kwargs - "def f(**kwargs): pass", - # FunctionDef with all kind of args and docstring - "def f(a, b=1, c=None, d=[], e={}, *args, f=42, **kwargs): 'doc for f()'", - # FunctionDef with type annotation on return involving unpacking - "def f() -> tuple[*Ts]: pass", - "def f() -> tuple[int, *Ts]: pass", - "def f() -> tuple[int, *tuple[int, ...]]: pass", - # ClassDef - "class C:pass", - # ClassDef with docstring - "class C: 'docstring for class C'", - # ClassDef, new style class - "class C(object): pass", - # Return - "def f():return 1", - # Delete - "del v", - # Assign - "v = 1", - "a,b = c", - "(a,b) = c", - "[a,b] = c", - # AnnAssign with unpacked types - "x: tuple[*Ts]", - "x: tuple[int, *Ts]", - "x: tuple[int, *tuple[str, ...]]", - # AugAssign - "v += 1", - # For - "for v in v:pass", - # While - "while v:pass", - # If - "if v:pass", - # If-Elif - "if a:\n pass\nelif b:\n pass", - # If-Elif-Else - "if a:\n pass\nelif b:\n pass\nelse:\n pass", - # With - "with x as y: pass", - "with x as y, z as q: pass", - # Raise - "raise Exception('string')", - # TryExcept - "try:\n pass\nexcept Exception:\n pass", - # TryFinally - "try:\n pass\nfinally:\n pass", - # TryStarExcept - "try:\n pass\nexcept* Exception:\n pass", - # Assert - "assert v", - # Import - "import sys", - # ImportFrom - "from sys import v", - # Global - "global v", - # Expr - "1", - # Pass, - "pass", - # Break - "for v in v:break", - # Continue - "for v in v:continue", - # for statements with naked tuples (see http://bugs.python.org/issue6704) - "for a,b in c: pass", - "for (a,b) in c: pass", - "for [a,b] in c: pass", - # Multiline generator expression (test for .lineno & .col_offset) - """( - ( - Aa - , - Bb - ) - for - Aa - , - Bb in Cc - )""", - # dictcomp - "{a : b for w in x for m in p if g}", - # dictcomp with naked tuple - "{a : b for v,w in x}", - # setcomp - "{r for l in x if g}", - # setcomp with naked tuple - "{r for l,m in x}", - # AsyncFunctionDef - "async def f():\n 'async function'\n await something()", - # AsyncFor - "async def f():\n async for e in i: 1\n else: 2", - # AsyncWith - "async def f():\n async with a as b: 1", - # PEP 448: Additional Unpacking Generalizations - "{**{1:2}, 2:3}", - "{*{1, 2}, 3}", - # Asynchronous comprehensions - "async def f():\n [i async for b in c]", - # Decorated FunctionDef - "@deco1\n@deco2()\n@deco3(1)\ndef f(): pass", - # Decorated AsyncFunctionDef - "@deco1\n@deco2()\n@deco3(1)\nasync def f(): pass", - # Decorated ClassDef - "@deco1\n@deco2()\n@deco3(1)\nclass C: pass", - # Decorator with generator argument - "@deco(a for a in b)\ndef f(): pass", - # Decorator with attribute - "@a.b.c\ndef f(): pass", - # Simple assignment expression - "(a := 1)", - # Positional-only arguments - "def f(a, /,): pass", - "def f(a, /, c, d, e): pass", - "def f(a, /, c, *, d, e): pass", - "def f(a, /, c, *, d, e, **kwargs): pass", - # Positional-only arguments with defaults - "def f(a=1, /,): pass", - "def f(a=1, /, b=2, c=4): pass", - "def f(a=1, /, b=2, *, c=4): pass", - "def f(a=1, /, b=2, *, c): pass", - "def f(a=1, /, b=2, *, c=4, **kwargs): pass", - "def f(a=1, /, b=2, *, c, **kwargs): pass", - # Type aliases - "type X = int", - "type X[T] = int", - "type X[T, *Ts, **P] = (T, Ts, P)", - "type X[T: int, *Ts, **P] = (T, Ts, P)", - "type X[T: (int, str), *Ts, **P] = (T, Ts, P)", - # Generic classes - "class X[T]: pass", - "class X[T, *Ts, **P]: pass", - "class X[T: int, *Ts, **P]: pass", - "class X[T: (int, str), *Ts, **P]: pass", - # Generic functions - "def f[T](): pass", - "def f[T, *Ts, **P](): pass", - "def f[T: int, *Ts, **P](): pass", - "def f[T: (int, str), *Ts, **P](): pass", -] - -# These are compiled through "single" -# because of overlap with "eval", it just tests what -# can't be tested with "eval" -single_tests = [ - "1+2" -] - -# These are compiled through "eval" -# It should test all expressions -eval_tests = [ - # None - "None", - # BoolOp - "a and b", - # BinOp - "a + b", - # UnaryOp - "not v", - # Lambda - "lambda:None", - # Dict - "{ 1:2 }", - # Empty dict - "{}", - # Set - "{None,}", - # Multiline dict (test for .lineno & .col_offset) - """{ - 1 - : - 2 - }""", - # ListComp - "[a for b in c if d]", - # GeneratorExp - "(a for b in c if d)", - # Comprehensions with multiple for targets - "[(a,b) for a,b in c]", - "[(a,b) for (a,b) in c]", - "[(a,b) for [a,b] in c]", - "{(a,b) for a,b in c}", - "{(a,b) for (a,b) in c}", - "{(a,b) for [a,b] in c}", - "((a,b) for a,b in c)", - "((a,b) for (a,b) in c)", - "((a,b) for [a,b] in c)", - # Yield - yield expressions can't work outside a function - # - # Compare - "1 < 2 < 3", - # Call - "f(1,2,c=3,*d,**e)", - # Call with multi-character starred - "f(*[0, 1])", - # Call with a generator argument - "f(a for a in b)", - # Num - "10", - # Str - "'string'", - # Attribute - "a.b", - # Subscript - "a[b:c]", - # Name - "v", - # List - "[1,2,3]", - # Empty list - "[]", - # Tuple - "1,2,3", - # Tuple - "(1,2,3)", - # Empty tuple - "()", - # Combination - "a.b.c.d(a.b[1:2])", -] - -# TODO: expr_context, slice, boolop, operator, unaryop, cmpop, comprehension -# excepthandler, arguments, keywords, alias - -class AST_Tests(unittest.TestCase): - maxDiff = None - - def _is_ast_node(self, name, node): - if not isinstance(node, type): - return False - if "ast" not in node.__module__: - return False - return name != 'AST' and name[0].isupper() - - def _assertTrueorder(self, ast_node, parent_pos): - if not isinstance(ast_node, ast.AST) or ast_node._fields is None: - return - if isinstance(ast_node, (ast.expr, ast.stmt, ast.excepthandler)): - node_pos = (ast_node.lineno, ast_node.col_offset) - self.assertGreaterEqual(node_pos, parent_pos) - parent_pos = (ast_node.lineno, ast_node.col_offset) - for name in ast_node._fields: - value = getattr(ast_node, name) - if isinstance(value, list): - first_pos = parent_pos - if value and name == 'decorator_list': - first_pos = (value[0].lineno, value[0].col_offset) - for child in value: - self._assertTrueorder(child, first_pos) - elif value is not None: - self._assertTrueorder(value, parent_pos) - self.assertEqual(ast_node._fields, ast_node.__match_args__) - - def test_AST_objects(self): - x = ast.AST() - self.assertEqual(x._fields, ()) - x.foobar = 42 - self.assertEqual(x.foobar, 42) - self.assertEqual(x.__dict__["foobar"], 42) - - with self.assertRaises(AttributeError): - x.vararg - - with self.assertRaises(TypeError): - # "ast.AST constructor takes 0 positional arguments" - ast.AST(2) - - def test_AST_garbage_collection(self): - class X: - pass - a = ast.AST() - a.x = X() - a.x.a = a - ref = weakref.ref(a.x) - del a - support.gc_collect() - self.assertIsNone(ref()) - - def test_snippets(self): - for input, output, kind in ((exec_tests, exec_results, "exec"), - (single_tests, single_results, "single"), - (eval_tests, eval_results, "eval")): - for i, o in zip(input, output): - with self.subTest(action="parsing", input=i): - ast_tree = compile(i, "?", kind, ast.PyCF_ONLY_AST) - self.assertEqual(to_tuple(ast_tree), o) - self._assertTrueorder(ast_tree, (0, 0)) - 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_invalid_position_information(self): - invalid_linenos = [ - (10, 1), (-10, -11), (10, -11), (-5, -2), (-5, 1) - ] - - for lineno, end_lineno in invalid_linenos: - with self.subTest(f"Check invalid linenos {lineno}:{end_lineno}"): - snippet = "a = 1" - tree = ast.parse(snippet) - tree.body[0].lineno = lineno - tree.body[0].end_lineno = end_lineno - with self.assertRaises(ValueError): - compile(tree, '', 'exec') - - invalid_col_offsets = [ - (10, 1), (-10, -11), (10, -11), (-5, -2), (-5, 1) - ] - for col_offset, end_col_offset in invalid_col_offsets: - with self.subTest(f"Check invalid col_offset {col_offset}:{end_col_offset}"): - snippet = "a = 1" - tree = ast.parse(snippet) - tree.body[0].col_offset = col_offset - tree.body[0].end_col_offset = end_col_offset - with self.assertRaises(ValueError): - compile(tree, '', 'exec') - - def test_compilation_of_ast_nodes_with_default_end_position_values(self): - tree = ast.Module(body=[ - ast.Import(names=[ast.alias(name='builtins', lineno=1, col_offset=0)], lineno=1, col_offset=0), - ast.Import(names=[ast.alias(name='traceback', lineno=0, col_offset=0)], lineno=0, col_offset=1) - ], type_ignores=[]) - - # Check that compilation doesn't crash. Note: this may crash explicitly only on debug mode. - compile(tree, "", "exec") - - def test_slice(self): - slc = ast.parse("x[::]").body[0].value.slice - self.assertIsNone(slc.upper) - self.assertIsNone(slc.lower) - self.assertIsNone(slc.step) - - def test_from_import(self): - im = ast.parse("from . import y").body[0] - self.assertIsNone(im.module) - - def test_non_interned_future_from_ast(self): - mod = ast.parse("from __future__ import division") - self.assertIsInstance(mod.body[0], ast.ImportFrom) - mod.body[0].module = " __future__ ".strip() - compile(mod, "", "exec") - - def test_alias(self): - im = ast.parse("from bar import y").body[0] - self.assertEqual(len(im.names), 1) - alias = im.names[0] - self.assertEqual(alias.name, 'y') - self.assertIsNone(alias.asname) - self.assertEqual(alias.lineno, 1) - self.assertEqual(alias.end_lineno, 1) - self.assertEqual(alias.col_offset, 16) - self.assertEqual(alias.end_col_offset, 17) - - im = ast.parse("from bar import *").body[0] - alias = im.names[0] - self.assertEqual(alias.name, '*') - self.assertIsNone(alias.asname) - self.assertEqual(alias.lineno, 1) - self.assertEqual(alias.end_lineno, 1) - self.assertEqual(alias.col_offset, 16) - self.assertEqual(alias.end_col_offset, 17) - - im = ast.parse("from bar import y as z").body[0] - alias = im.names[0] - self.assertEqual(alias.name, "y") - self.assertEqual(alias.asname, "z") - self.assertEqual(alias.lineno, 1) - self.assertEqual(alias.end_lineno, 1) - self.assertEqual(alias.col_offset, 16) - self.assertEqual(alias.end_col_offset, 22) - - im = ast.parse("import bar as foo").body[0] - alias = im.names[0] - self.assertEqual(alias.name, "bar") - self.assertEqual(alias.asname, "foo") - self.assertEqual(alias.lineno, 1) - self.assertEqual(alias.end_lineno, 1) - self.assertEqual(alias.col_offset, 7) - self.assertEqual(alias.end_col_offset, 17) - - def test_base_classes(self): - self.assertTrue(issubclass(ast.For, ast.stmt)) - self.assertTrue(issubclass(ast.Name, ast.expr)) - self.assertTrue(issubclass(ast.stmt, ast.AST)) - self.assertTrue(issubclass(ast.expr, ast.AST)) - self.assertTrue(issubclass(ast.comprehension, ast.AST)) - self.assertTrue(issubclass(ast.Gt, ast.AST)) - - def test_import_deprecated(self): - ast = import_fresh_module('ast') - depr_regex = ( - r'ast\.{} is deprecated and will be removed in Python 3.14; ' - r'use ast\.Constant instead' - ) - for name in 'Num', 'Str', 'Bytes', 'NameConstant', 'Ellipsis': - with self.assertWarnsRegex(DeprecationWarning, depr_regex.format(name)): - getattr(ast, name) - - def test_field_attr_existence_deprecated(self): - with warnings.catch_warnings(): - warnings.filterwarnings('ignore', '', DeprecationWarning) - from ast import Num, Str, Bytes, NameConstant, Ellipsis - - for name in ('Num', 'Str', 'Bytes', 'NameConstant', 'Ellipsis'): - item = getattr(ast, name) - if self._is_ast_node(name, item): - with self.subTest(item): - with self.assertWarns(DeprecationWarning): - x = item() - if isinstance(x, ast.AST): - self.assertIs(type(x._fields), tuple) - - def test_field_attr_existence(self): - for name, item in ast.__dict__.items(): - # These emit DeprecationWarnings - if name in {'Num', 'Str', 'Bytes', 'NameConstant', 'Ellipsis'}: - continue - # constructor has a different signature - if name == 'Index': - continue - if self._is_ast_node(name, item): - x = item() - if isinstance(x, ast.AST): - self.assertIs(type(x._fields), tuple) - - def test_arguments(self): - x = ast.arguments() - self.assertEqual(x._fields, ('posonlyargs', 'args', 'vararg', 'kwonlyargs', - 'kw_defaults', 'kwarg', 'defaults')) - - with self.assertRaises(AttributeError): - x.args - self.assertIsNone(x.vararg) - - x = ast.arguments(*range(1, 8)) - self.assertEqual(x.args, 2) - self.assertEqual(x.vararg, 3) - - def test_field_attr_writable_deprecated(self): - with warnings.catch_warnings(): - warnings.filterwarnings('ignore', '', DeprecationWarning) - x = ast.Num() - # We can assign to _fields - x._fields = 666 - self.assertEqual(x._fields, 666) - - def test_field_attr_writable(self): - x = ast.Constant() - # We can assign to _fields - x._fields = 666 - self.assertEqual(x._fields, 666) - - def test_classattrs_deprecated(self): - with warnings.catch_warnings(): - warnings.filterwarnings('ignore', '', DeprecationWarning) - from ast import Num, Str, Bytes, NameConstant, Ellipsis - - with warnings.catch_warnings(record=True) as wlog: - warnings.filterwarnings('always', '', DeprecationWarning) - x = ast.Num() - self.assertEqual(x._fields, ('value', 'kind')) - - with self.assertRaises(AttributeError): - x.value - - with self.assertRaises(AttributeError): - x.n - - x = ast.Num(42) - self.assertEqual(x.value, 42) - self.assertEqual(x.n, 42) - - with self.assertRaises(AttributeError): - x.lineno - - with self.assertRaises(AttributeError): - x.foobar - - x = ast.Num(lineno=2) - self.assertEqual(x.lineno, 2) - - x = ast.Num(42, lineno=0) - self.assertEqual(x.lineno, 0) - self.assertEqual(x._fields, ('value', 'kind')) - self.assertEqual(x.value, 42) - self.assertEqual(x.n, 42) - - self.assertRaises(TypeError, ast.Num, 1, None, 2) - self.assertRaises(TypeError, ast.Num, 1, None, 2, lineno=0) - - # Arbitrary keyword arguments are supported - self.assertEqual(ast.Num(1, foo='bar').foo, 'bar') - - with self.assertRaisesRegex(TypeError, "Num got multiple values for argument 'n'"): - ast.Num(1, n=2) - - self.assertEqual(ast.Num(42).n, 42) - self.assertEqual(ast.Num(4.25).n, 4.25) - self.assertEqual(ast.Num(4.25j).n, 4.25j) - self.assertEqual(ast.Str('42').s, '42') - self.assertEqual(ast.Bytes(b'42').s, b'42') - self.assertIs(ast.NameConstant(True).value, True) - self.assertIs(ast.NameConstant(False).value, False) - self.assertIs(ast.NameConstant(None).value, None) - - self.assertEqual([str(w.message) for w in wlog], [ - 'ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead', - 'Attribute n is deprecated and will be removed in Python 3.14; use value instead', - 'ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead', - 'Attribute n is deprecated and will be removed in Python 3.14; use value instead', - 'ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead', - 'ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead', - 'Attribute n is deprecated and will be removed in Python 3.14; use value instead', - 'ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead', - 'ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead', - 'ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead', - 'ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead', - 'Attribute n is deprecated and will be removed in Python 3.14; use value instead', - 'ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead', - 'Attribute n is deprecated and will be removed in Python 3.14; use value instead', - 'ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead', - 'Attribute n is deprecated and will be removed in Python 3.14; use value instead', - 'ast.Str is deprecated and will be removed in Python 3.14; use ast.Constant instead', - 'Attribute s is deprecated and will be removed in Python 3.14; use value instead', - 'ast.Bytes is deprecated and will be removed in Python 3.14; use ast.Constant instead', - 'Attribute s is deprecated and will be removed in Python 3.14; use value instead', - 'ast.NameConstant is deprecated and will be removed in Python 3.14; use ast.Constant instead', - 'ast.NameConstant is deprecated and will be removed in Python 3.14; use ast.Constant instead', - 'ast.NameConstant is deprecated and will be removed in Python 3.14; use ast.Constant instead', - ]) - - def test_classattrs(self): - x = ast.Constant() - self.assertEqual(x._fields, ('value', 'kind')) - - with self.assertRaises(AttributeError): - x.value - - x = ast.Constant(42) - self.assertEqual(x.value, 42) - - with self.assertRaises(AttributeError): - x.lineno - - with self.assertRaises(AttributeError): - x.foobar - - x = ast.Constant(lineno=2) - self.assertEqual(x.lineno, 2) - - x = ast.Constant(42, lineno=0) - self.assertEqual(x.lineno, 0) - self.assertEqual(x._fields, ('value', 'kind')) - self.assertEqual(x.value, 42) - - self.assertRaises(TypeError, ast.Constant, 1, None, 2) - self.assertRaises(TypeError, ast.Constant, 1, None, 2, lineno=0) - - # Arbitrary keyword arguments are supported - self.assertEqual(ast.Constant(1, foo='bar').foo, 'bar') - - with self.assertRaisesRegex(TypeError, "Constant got multiple values for argument 'value'"): - ast.Constant(1, value=2) - - self.assertEqual(ast.Constant(42).value, 42) - self.assertEqual(ast.Constant(4.25).value, 4.25) - self.assertEqual(ast.Constant(4.25j).value, 4.25j) - self.assertEqual(ast.Constant('42').value, '42') - self.assertEqual(ast.Constant(b'42').value, b'42') - self.assertIs(ast.Constant(True).value, True) - self.assertIs(ast.Constant(False).value, False) - self.assertIs(ast.Constant(None).value, None) - self.assertIs(ast.Constant(...).value, ...) - - def test_realtype(self): - with warnings.catch_warnings(): - warnings.filterwarnings('ignore', '', DeprecationWarning) - from ast import Num, Str, Bytes, NameConstant, Ellipsis - - with warnings.catch_warnings(record=True) as wlog: - warnings.filterwarnings('always', '', DeprecationWarning) - self.assertIs(type(ast.Num(42)), ast.Constant) - self.assertIs(type(ast.Num(4.25)), ast.Constant) - self.assertIs(type(ast.Num(4.25j)), ast.Constant) - self.assertIs(type(ast.Str('42')), ast.Constant) - self.assertIs(type(ast.Bytes(b'42')), ast.Constant) - self.assertIs(type(ast.NameConstant(True)), ast.Constant) - self.assertIs(type(ast.NameConstant(False)), ast.Constant) - self.assertIs(type(ast.NameConstant(None)), ast.Constant) - self.assertIs(type(ast.Ellipsis()), ast.Constant) - - self.assertEqual([str(w.message) for w in wlog], [ - 'ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead', - 'ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead', - 'ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead', - 'ast.Str is deprecated and will be removed in Python 3.14; use ast.Constant instead', - 'ast.Bytes is deprecated and will be removed in Python 3.14; use ast.Constant instead', - 'ast.NameConstant is deprecated and will be removed in Python 3.14; use ast.Constant instead', - 'ast.NameConstant is deprecated and will be removed in Python 3.14; use ast.Constant instead', - 'ast.NameConstant is deprecated and will be removed in Python 3.14; use ast.Constant instead', - 'ast.Ellipsis is deprecated and will be removed in Python 3.14; use ast.Constant instead', - ]) - - def test_isinstance(self): - from ast import Constant - - with warnings.catch_warnings(): - warnings.filterwarnings('ignore', '', DeprecationWarning) - from ast import Num, Str, Bytes, NameConstant, Ellipsis - - cls_depr_msg = ( - 'ast.{} is deprecated and will be removed in Python 3.14; ' - 'use ast.Constant instead' - ) - - assertNumDeprecated = partial( - self.assertWarnsRegex, DeprecationWarning, cls_depr_msg.format("Num") - ) - assertStrDeprecated = partial( - self.assertWarnsRegex, DeprecationWarning, cls_depr_msg.format("Str") - ) - assertBytesDeprecated = partial( - self.assertWarnsRegex, DeprecationWarning, cls_depr_msg.format("Bytes") - ) - assertNameConstantDeprecated = partial( - self.assertWarnsRegex, - DeprecationWarning, - cls_depr_msg.format("NameConstant") - ) - assertEllipsisDeprecated = partial( - self.assertWarnsRegex, DeprecationWarning, cls_depr_msg.format("Ellipsis") - ) - - for arg in 42, 4.2, 4.2j: - with self.subTest(arg=arg): - with assertNumDeprecated(): - n = Num(arg) - with assertNumDeprecated(): - self.assertIsInstance(n, Num) - - with assertStrDeprecated(): - s = Str('42') - with assertStrDeprecated(): - self.assertIsInstance(s, Str) - - with assertBytesDeprecated(): - b = Bytes(b'42') - with assertBytesDeprecated(): - self.assertIsInstance(b, Bytes) - - for arg in True, False, None: - with self.subTest(arg=arg): - with assertNameConstantDeprecated(): - n = NameConstant(arg) - with assertNameConstantDeprecated(): - self.assertIsInstance(n, NameConstant) - - with assertEllipsisDeprecated(): - e = Ellipsis() - with assertEllipsisDeprecated(): - self.assertIsInstance(e, Ellipsis) - - for arg in 42, 4.2, 4.2j: - with self.subTest(arg=arg): - with assertNumDeprecated(): - self.assertIsInstance(Constant(arg), Num) - - with assertStrDeprecated(): - self.assertIsInstance(Constant('42'), Str) - - with assertBytesDeprecated(): - self.assertIsInstance(Constant(b'42'), Bytes) - - for arg in True, False, None: - with self.subTest(arg=arg): - with assertNameConstantDeprecated(): - self.assertIsInstance(Constant(arg), NameConstant) - - with assertEllipsisDeprecated(): - self.assertIsInstance(Constant(...), Ellipsis) - - with assertStrDeprecated(): - s = Str('42') - assertNumDeprecated(self.assertNotIsInstance, s, Num) - assertBytesDeprecated(self.assertNotIsInstance, s, Bytes) - - with assertNumDeprecated(): - n = Num(42) - assertStrDeprecated(self.assertNotIsInstance, n, Str) - assertNameConstantDeprecated(self.assertNotIsInstance, n, NameConstant) - assertEllipsisDeprecated(self.assertNotIsInstance, n, Ellipsis) - - with assertNameConstantDeprecated(): - n = NameConstant(True) - with assertNumDeprecated(): - self.assertNotIsInstance(n, Num) - - with assertNameConstantDeprecated(): - n = NameConstant(False) - with assertNumDeprecated(): - self.assertNotIsInstance(n, Num) - - for arg in '42', True, False: - with self.subTest(arg=arg): - with assertNumDeprecated(): - self.assertNotIsInstance(Constant(arg), Num) - - assertStrDeprecated(self.assertNotIsInstance, Constant(42), Str) - assertBytesDeprecated(self.assertNotIsInstance, Constant('42'), Bytes) - assertNameConstantDeprecated(self.assertNotIsInstance, Constant(42), NameConstant) - assertEllipsisDeprecated(self.assertNotIsInstance, Constant(42), Ellipsis) - assertNumDeprecated(self.assertNotIsInstance, Constant(), Num) - assertStrDeprecated(self.assertNotIsInstance, Constant(), Str) - assertBytesDeprecated(self.assertNotIsInstance, Constant(), Bytes) - assertNameConstantDeprecated(self.assertNotIsInstance, Constant(), NameConstant) - assertEllipsisDeprecated(self.assertNotIsInstance, Constant(), Ellipsis) - - class S(str): pass - with assertStrDeprecated(): - self.assertIsInstance(Constant(S('42')), Str) - with assertNumDeprecated(): - self.assertNotIsInstance(Constant(S('42')), Num) - - def test_constant_subclasses_deprecated(self): - with warnings.catch_warnings(): - warnings.filterwarnings('ignore', '', DeprecationWarning) - from ast import Num - - with warnings.catch_warnings(record=True) as wlog: - warnings.filterwarnings('always', '', DeprecationWarning) - class N(ast.Num): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.z = 'spam' - class N2(ast.Num): - pass - - n = N(42) - self.assertEqual(n.n, 42) - self.assertEqual(n.z, 'spam') - self.assertIs(type(n), N) - self.assertIsInstance(n, N) - self.assertIsInstance(n, ast.Num) - self.assertNotIsInstance(n, N2) - self.assertNotIsInstance(ast.Num(42), N) - n = N(n=42) - self.assertEqual(n.n, 42) - self.assertIs(type(n), N) - - self.assertEqual([str(w.message) for w in wlog], [ - 'Attribute n is deprecated and will be removed in Python 3.14; use value instead', - 'Attribute n is deprecated and will be removed in Python 3.14; use value instead', - 'ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead', - 'ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead', - 'Attribute n is deprecated and will be removed in Python 3.14; use value instead', - 'Attribute n is deprecated and will be removed in Python 3.14; use value instead', - ]) - - def test_constant_subclasses(self): - class N(ast.Constant): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.z = 'spam' - class N2(ast.Constant): - pass - - n = N(42) - self.assertEqual(n.value, 42) - self.assertEqual(n.z, 'spam') - self.assertEqual(type(n), N) - self.assertTrue(isinstance(n, N)) - self.assertTrue(isinstance(n, ast.Constant)) - self.assertFalse(isinstance(n, N2)) - self.assertFalse(isinstance(ast.Constant(42), N)) - n = N(value=42) - self.assertEqual(n.value, 42) - self.assertEqual(type(n), N) - - def test_module(self): - body = [ast.Constant(42)] - x = ast.Module(body, []) - self.assertEqual(x.body, body) - - def test_nodeclasses(self): - # Zero arguments constructor explicitly allowed - x = ast.BinOp() - self.assertEqual(x._fields, ('left', 'op', 'right')) - - # Random attribute allowed too - x.foobarbaz = 5 - self.assertEqual(x.foobarbaz, 5) - - n1 = ast.Constant(1) - n3 = ast.Constant(3) - addop = ast.Add() - x = ast.BinOp(n1, addop, n3) - self.assertEqual(x.left, n1) - self.assertEqual(x.op, addop) - self.assertEqual(x.right, n3) - - x = ast.BinOp(1, 2, 3) - self.assertEqual(x.left, 1) - self.assertEqual(x.op, 2) - self.assertEqual(x.right, 3) - - x = ast.BinOp(1, 2, 3, lineno=0) - self.assertEqual(x.left, 1) - self.assertEqual(x.op, 2) - self.assertEqual(x.right, 3) - self.assertEqual(x.lineno, 0) - - # node raises exception when given too many arguments - self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4) - # node raises exception when given too many arguments - self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4, lineno=0) - - # can set attributes through kwargs too - x = ast.BinOp(left=1, op=2, right=3, lineno=0) - self.assertEqual(x.left, 1) - self.assertEqual(x.op, 2) - self.assertEqual(x.right, 3) - self.assertEqual(x.lineno, 0) - - # Random kwargs also allowed - x = ast.BinOp(1, 2, 3, foobarbaz=42) - self.assertEqual(x.foobarbaz, 42) - - def test_no_fields(self): - # this used to fail because Sub._fields was None - x = ast.Sub() - self.assertEqual(x._fields, ()) - - def test_pickling(self): - import pickle - - for protocol in range(pickle.HIGHEST_PROTOCOL + 1): - for ast in (compile(i, "?", "exec", 0x400) for i in exec_tests): - ast2 = pickle.loads(pickle.dumps(ast, protocol)) - self.assertEqual(to_tuple(ast2), to_tuple(ast)) - - def test_invalid_sum(self): - pos = dict(lineno=2, col_offset=3) - m = ast.Module([ast.Expr(ast.expr(**pos), **pos)], []) - with self.assertRaises(TypeError) as cm: - compile(m, "", "exec") - self.assertIn("but got ", "exec") - self.assertIn("identifier must be of type str", str(cm.exception)) - - def test_invalid_constant(self): - for invalid_constant in int, (1, 2, int), frozenset((1, 2, int)): - e = ast.Expression(body=ast.Constant(invalid_constant)) - ast.fix_missing_locations(e) - with self.assertRaisesRegex( - TypeError, "invalid type in Constant: type" - ): - compile(e, "", "eval") - - def test_empty_yield_from(self): - # Issue 16546: yield from value is not optional. - empty_yield_from = ast.parse("def f():\n yield from g()") - empty_yield_from.body[0].body[0].value.value = None - with self.assertRaises(ValueError) as cm: - compile(empty_yield_from, "", "exec") - self.assertIn("field 'value' is required", str(cm.exception)) - - @support.cpython_only - def test_issue31592(self): - # There shouldn't be an assertion failure in case of a bad - # unicodedata.normalize(). - import unicodedata - def bad_normalize(*args): - return None - with support.swap_attr(unicodedata, 'normalize', bad_normalize): - self.assertRaises(TypeError, ast.parse, '\u03D5') - - def test_issue18374_binop_col_offset(self): - tree = ast.parse('4+5+6+7') - parent_binop = tree.body[0].value - child_binop = parent_binop.left - grandchild_binop = child_binop.left - self.assertEqual(parent_binop.col_offset, 0) - self.assertEqual(parent_binop.end_col_offset, 7) - self.assertEqual(child_binop.col_offset, 0) - self.assertEqual(child_binop.end_col_offset, 5) - self.assertEqual(grandchild_binop.col_offset, 0) - self.assertEqual(grandchild_binop.end_col_offset, 3) - - tree = ast.parse('4+5-\\\n 6-7') - parent_binop = tree.body[0].value - child_binop = parent_binop.left - grandchild_binop = child_binop.left - self.assertEqual(parent_binop.col_offset, 0) - self.assertEqual(parent_binop.lineno, 1) - self.assertEqual(parent_binop.end_col_offset, 4) - self.assertEqual(parent_binop.end_lineno, 2) - - self.assertEqual(child_binop.col_offset, 0) - self.assertEqual(child_binop.lineno, 1) - self.assertEqual(child_binop.end_col_offset, 2) - self.assertEqual(child_binop.end_lineno, 2) - - self.assertEqual(grandchild_binop.col_offset, 0) - self.assertEqual(grandchild_binop.lineno, 1) - self.assertEqual(grandchild_binop.end_col_offset, 3) - self.assertEqual(grandchild_binop.end_lineno, 1) - - def test_issue39579_dotted_name_end_col_offset(self): - tree = ast.parse('@a.b.c\ndef f(): pass') - attr_b = tree.body[0].decorator_list[0].value - self.assertEqual(attr_b.end_col_offset, 4) - - def test_ast_asdl_signature(self): - self.assertEqual(ast.withitem.__doc__, "withitem(expr context_expr, expr? optional_vars)") - self.assertEqual(ast.GtE.__doc__, "GtE") - self.assertEqual(ast.Name.__doc__, "Name(identifier id, expr_context ctx)") - self.assertEqual(ast.cmpop.__doc__, "cmpop = Eq | NotEq | Lt | LtE | Gt | GtE | Is | IsNot | In | NotIn") - expressions = [f" | {node.__doc__}" for node in ast.expr.__subclasses__()] - expressions[0] = f"expr = {ast.expr.__subclasses__()[0].__doc__}" - self.assertCountEqual(ast.expr.__doc__.split("\n"), expressions) - - def test_positional_only_feature_version(self): - ast.parse('def foo(x, /): ...', feature_version=(3, 8)) - ast.parse('def bar(x=1, /): ...', feature_version=(3, 8)) - with self.assertRaises(SyntaxError): - ast.parse('def foo(x, /): ...', feature_version=(3, 7)) - with self.assertRaises(SyntaxError): - ast.parse('def bar(x=1, /): ...', feature_version=(3, 7)) - - ast.parse('lambda x, /: ...', feature_version=(3, 8)) - ast.parse('lambda x=1, /: ...', feature_version=(3, 8)) - with self.assertRaises(SyntaxError): - ast.parse('lambda x, /: ...', feature_version=(3, 7)) - with self.assertRaises(SyntaxError): - ast.parse('lambda x=1, /: ...', feature_version=(3, 7)) - - def test_assignment_expression_feature_version(self): - ast.parse('(x := 0)', feature_version=(3, 8)) - with self.assertRaises(SyntaxError): - ast.parse('(x := 0)', feature_version=(3, 7)) - - def test_conditional_context_managers_parse_with_low_feature_version(self): - # regression test for gh-115881 - ast.parse('with (x() if y else z()): ...', feature_version=(3, 8)) - - def test_exception_groups_feature_version(self): - code = dedent(''' - try: ... - except* Exception: ... - ''') - ast.parse(code) - with self.assertRaises(SyntaxError): - ast.parse(code, feature_version=(3, 10)) - - def test_type_params_feature_version(self): - samples = [ - "type X = int", - "class X[T]: pass", - "def f[T](): pass", - ] - for sample in samples: - with self.subTest(sample): - ast.parse(sample) - with self.assertRaises(SyntaxError): - ast.parse(sample, feature_version=(3, 11)) - - def test_invalid_major_feature_version(self): - with self.assertRaises(ValueError): - ast.parse('pass', feature_version=(2, 7)) - with self.assertRaises(ValueError): - ast.parse('pass', feature_version=(4, 0)) - - def test_constant_as_name(self): - for constant in "True", "False", "None": - expr = ast.Expression(ast.Name(constant, ast.Load())) - ast.fix_missing_locations(expr) - with self.assertRaisesRegex(ValueError, f"identifier field can't represent '{constant}' constant"): - compile(expr, "", "eval") - - def test_precedence_enum(self): - class _Precedence(enum.IntEnum): - """Precedence table that originated from python grammar.""" - NAMED_EXPR = enum.auto() # := - TUPLE = enum.auto() # , - YIELD = enum.auto() # 'yield', 'yield from' - TEST = enum.auto() # 'if'-'else', 'lambda' - OR = enum.auto() # 'or' - AND = enum.auto() # 'and' - NOT = enum.auto() # 'not' - CMP = enum.auto() # '<', '>', '==', '>=', '<=', '!=', - # 'in', 'not in', 'is', 'is not' - EXPR = enum.auto() - BOR = EXPR # '|' - BXOR = enum.auto() # '^' - BAND = enum.auto() # '&' - SHIFT = enum.auto() # '<<', '>>' - ARITH = enum.auto() # '+', '-' - TERM = enum.auto() # '*', '@', '/', '%', '//' - FACTOR = enum.auto() # unary '+', '-', '~' - POWER = enum.auto() # '**' - AWAIT = enum.auto() # 'await' - ATOM = enum.auto() - def next(self): - try: - return self.__class__(self + 1) - except ValueError: - return self - enum._test_simple_enum(_Precedence, ast._Precedence) - - @unittest.skipIf(support.is_wasi, "exhausts limited stack on WASI") - @support.cpython_only - def test_ast_recursion_limit(self): - fail_depth = support.C_RECURSION_LIMIT + 1 - crash_depth = 100_000 - success_depth = int(support.C_RECURSION_LIMIT * 0.9) - - def check_limit(prefix, repeated): - expect_ok = prefix + repeated * success_depth - ast.parse(expect_ok) - for depth in (fail_depth, crash_depth): - broken = prefix + repeated * depth - details = "Compiling ({!r} + {!r} * {})".format( - prefix, repeated, depth) - with self.assertRaises(RecursionError, msg=details): - with support.infinite_recursion(): - ast.parse(broken) - - check_limit("a", "()") - check_limit("a", ".b") - check_limit("a", "[0]") - check_limit("a", "*a") - - def test_null_bytes(self): - with self.assertRaises(SyntaxError, - msg="source code string cannot contain null bytes"): - ast.parse("a\0b") - - def assert_none_check(self, node: type[ast.AST], attr: str, source: str) -> None: - with self.subTest(f"{node.__name__}.{attr}"): - tree = ast.parse(source) - found = 0 - for child in ast.walk(tree): - if isinstance(child, node): - setattr(child, attr, None) - found += 1 - self.assertEqual(found, 1) - e = re.escape(f"field '{attr}' is required for {node.__name__}") - with self.assertRaisesRegex(ValueError, f"^{e}$"): - compile(tree, "", "exec") - - def test_none_checks(self) -> None: - tests = [ - (ast.alias, "name", "import spam as SPAM"), - (ast.arg, "arg", "def spam(SPAM): spam"), - (ast.comprehension, "target", "[spam for SPAM in spam]"), - (ast.comprehension, "iter", "[spam for spam in SPAM]"), - (ast.keyword, "value", "spam(**SPAM)"), - (ast.match_case, "pattern", "match spam:\n case SPAM: spam"), - (ast.withitem, "context_expr", "with SPAM: spam"), - ] - for node, attr, source in tests: - self.assert_none_check(node, attr, source) - -class ASTHelpers_Test(unittest.TestCase): - maxDiff = None - - def test_parse(self): - a = ast.parse('foo(1 + 1)') - b = compile('foo(1 + 1)', '', 'exec', ast.PyCF_ONLY_AST) - self.assertEqual(ast.dump(a), ast.dump(b)) - - def test_parse_in_error(self): - try: - 1/0 - except Exception: - with self.assertRaises(SyntaxError) as e: - ast.literal_eval(r"'\U'") - self.assertIsNotNone(e.exception.__context__) - - 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')], " - "keywords=[]))], type_ignores=[])" - ) - self.assertEqual(ast.dump(node, annotate_fields=False), - "Module([Expr(Call(Name('spam', Load()), [Name('eggs', Load()), " - "Constant('and cheese')], []))], [])" - ) - self.assertEqual(ast.dump(node, include_attributes=True), - "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load(), " - "lineno=1, col_offset=0, end_lineno=1, end_col_offset=4), " - "args=[Name(id='eggs', ctx=Load(), lineno=1, col_offset=5, " - "end_lineno=1, end_col_offset=9), Constant(value='and cheese', " - "lineno=1, col_offset=11, end_lineno=1, end_col_offset=23)], keywords=[], " - "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24), " - "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24)], type_ignores=[])" - ) - - def test_dump_indent(self): - node = ast.parse('spam(eggs, "and cheese")') - self.assertEqual(ast.dump(node, indent=3), """\ -Module( - body=[ - Expr( - value=Call( - func=Name(id='spam', ctx=Load()), - args=[ - Name(id='eggs', ctx=Load()), - Constant(value='and cheese')], - keywords=[]))], - type_ignores=[])""") - self.assertEqual(ast.dump(node, annotate_fields=False, indent='\t'), """\ -Module( -\t[ -\t\tExpr( -\t\t\tCall( -\t\t\t\tName('spam', Load()), -\t\t\t\t[ -\t\t\t\t\tName('eggs', Load()), -\t\t\t\t\tConstant('and cheese')], -\t\t\t\t[]))], -\t[])""") - self.assertEqual(ast.dump(node, include_attributes=True, indent=3), """\ -Module( - body=[ - Expr( - value=Call( - func=Name( - id='spam', - ctx=Load(), - lineno=1, - col_offset=0, - end_lineno=1, - end_col_offset=4), - args=[ - Name( - id='eggs', - ctx=Load(), - lineno=1, - col_offset=5, - end_lineno=1, - end_col_offset=9), - Constant( - value='and cheese', - lineno=1, - col_offset=11, - end_lineno=1, - end_col_offset=23)], - keywords=[], - lineno=1, - col_offset=0, - end_lineno=1, - end_col_offset=24), - lineno=1, - col_offset=0, - end_lineno=1, - end_col_offset=24)], - type_ignores=[])""") - - def test_dump_incomplete(self): - node = ast.Raise(lineno=3, col_offset=4) - self.assertEqual(ast.dump(node), - "Raise()" - ) - self.assertEqual(ast.dump(node, include_attributes=True), - "Raise(lineno=3, col_offset=4)" - ) - node = ast.Raise(exc=ast.Name(id='e', ctx=ast.Load()), lineno=3, col_offset=4) - self.assertEqual(ast.dump(node), - "Raise(exc=Name(id='e', ctx=Load()))" - ) - self.assertEqual(ast.dump(node, annotate_fields=False), - "Raise(Name('e', Load()))" - ) - self.assertEqual(ast.dump(node, include_attributes=True), - "Raise(exc=Name(id='e', ctx=Load()), lineno=3, col_offset=4)" - ) - self.assertEqual(ast.dump(node, annotate_fields=False, include_attributes=True), - "Raise(Name('e', Load()), lineno=3, col_offset=4)" - ) - node = ast.Raise(cause=ast.Name(id='e', ctx=ast.Load())) - self.assertEqual(ast.dump(node), - "Raise(cause=Name(id='e', ctx=Load()))" - ) - self.assertEqual(ast.dump(node, annotate_fields=False), - "Raise(cause=Name('e', Load()))" - ) - - def test_copy_location(self): - src = ast.parse('1 + 1', mode='eval') - src.body.right = ast.copy_location(ast.Constant(2), src.body.right) - self.assertEqual(ast.dump(src, include_attributes=True), - 'Expression(body=BinOp(left=Constant(value=1, lineno=1, col_offset=0, ' - 'end_lineno=1, end_col_offset=1), op=Add(), right=Constant(value=2, ' - 'lineno=1, col_offset=4, end_lineno=1, end_col_offset=5), lineno=1, ' - 'col_offset=0, end_lineno=1, end_col_offset=5))' - ) - src = ast.Call(col_offset=1, lineno=1, end_lineno=1, end_col_offset=1) - new = ast.copy_location(src, ast.Call(col_offset=None, lineno=None)) - self.assertIsNone(new.end_lineno) - self.assertIsNone(new.end_col_offset) - self.assertEqual(new.lineno, 1) - self.assertEqual(new.col_offset, 1) - - def test_fix_missing_locations(self): - src = ast.parse('write("spam")') - src.body.append(ast.Expr(ast.Call(ast.Name('spam', ast.Load()), - [ast.Constant('eggs')], []))) - self.assertEqual(src, ast.fix_missing_locations(src)) - self.maxDiff = None - 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, " - "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(), " - "lineno=1, col_offset=0, end_lineno=1, end_col_offset=0), " - "args=[Constant(value='eggs', lineno=1, col_offset=0, end_lineno=1, " - "end_col_offset=0)], keywords=[], lineno=1, col_offset=0, end_lineno=1, " - "end_col_offset=0), lineno=1, col_offset=0, end_lineno=1, end_col_offset=0)], " - "type_ignores=[])" - ) - - 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, ' - 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, ' - 'col_offset=0, end_lineno=4, end_col_offset=5))' - ) - # issue10869: do not increment lineno of root twice - 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, ' - 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, ' - 'col_offset=0, end_lineno=4, end_col_offset=5))' - ) - src = ast.Call( - func=ast.Name("test", ast.Load()), args=[], keywords=[], lineno=1 - ) - self.assertEqual(ast.increment_lineno(src).lineno, 2) - self.assertIsNone(ast.increment_lineno(src).end_lineno) - - def test_increment_lineno_on_module(self): - src = ast.parse(dedent("""\ - a = 1 - b = 2 # type: ignore - c = 3 - d = 4 # type: ignore@tag - """), type_comments=True) - ast.increment_lineno(src, n=5) - self.assertEqual(src.type_ignores[0].lineno, 7) - self.assertEqual(src.type_ignores[1].lineno, 9) - self.assertEqual(src.type_ignores[1].tag, '@tag') - - def test_iter_fields(self): - node = ast.parse('foo()', mode='eval') - d = dict(ast.iter_fields(node.body)) - self.assertEqual(d.pop('func').id, 'foo') - self.assertEqual(d, {'keywords': [], 'args': []}) - - def test_iter_child_nodes(self): - node = ast.parse("spam(23, 42, eggs='leek')", mode='eval') - self.assertEqual(len(list(ast.iter_child_nodes(node.body))), 4) - iterator = ast.iter_child_nodes(node.body) - self.assertEqual(next(iterator).id, 'spam') - 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'))" - ) - - def test_get_docstring(self): - node = ast.parse('"""line one\n line two"""') - self.assertEqual(ast.get_docstring(node), - 'line one\nline two') - - node = ast.parse('class foo:\n """line one\n line two"""') - self.assertEqual(ast.get_docstring(node.body[0]), - 'line one\nline two') - - node = ast.parse('def foo():\n """line one\n line two"""') - self.assertEqual(ast.get_docstring(node.body[0]), - 'line one\nline two') - - node = ast.parse('async def foo():\n """spam\n ham"""') - self.assertEqual(ast.get_docstring(node.body[0]), 'spam\nham') - - def test_get_docstring_none(self): - self.assertIsNone(ast.get_docstring(ast.parse(''))) - node = ast.parse('x = "not docstring"') - self.assertIsNone(ast.get_docstring(node)) - node = ast.parse('def foo():\n pass') - self.assertIsNone(ast.get_docstring(node)) - - node = ast.parse('class foo:\n pass') - self.assertIsNone(ast.get_docstring(node.body[0])) - node = ast.parse('class foo:\n x = "not docstring"') - self.assertIsNone(ast.get_docstring(node.body[0])) - node = ast.parse('class foo:\n def bar(self): pass') - self.assertIsNone(ast.get_docstring(node.body[0])) - - node = ast.parse('def foo():\n pass') - self.assertIsNone(ast.get_docstring(node.body[0])) - node = ast.parse('def foo():\n x = "not docstring"') - self.assertIsNone(ast.get_docstring(node.body[0])) - - node = ast.parse('async def foo():\n pass') - self.assertIsNone(ast.get_docstring(node.body[0])) - node = ast.parse('async def foo():\n x = "not docstring"') - self.assertIsNone(ast.get_docstring(node.body[0])) - - def test_multi_line_docstring_col_offset_and_lineno_issue16806(self): - node = ast.parse( - '"""line one\nline two"""\n\n' - 'def foo():\n """line one\n line two"""\n\n' - ' def bar():\n """line one\n line two"""\n' - ' """line one\n line two"""\n' - '"""line one\nline two"""\n\n' - ) - self.assertEqual(node.body[0].col_offset, 0) - self.assertEqual(node.body[0].lineno, 1) - self.assertEqual(node.body[1].body[0].col_offset, 2) - self.assertEqual(node.body[1].body[0].lineno, 5) - self.assertEqual(node.body[1].body[1].body[0].col_offset, 4) - self.assertEqual(node.body[1].body[1].body[0].lineno, 9) - self.assertEqual(node.body[1].body[2].col_offset, 2) - self.assertEqual(node.body[1].body[2].lineno, 11) - self.assertEqual(node.body[2].col_offset, 0) - self.assertEqual(node.body[2].lineno, 13) - - def test_elif_stmt_start_position(self): - node = ast.parse('if a:\n pass\nelif b:\n pass\n') - elif_stmt = node.body[0].orelse[0] - self.assertEqual(elif_stmt.lineno, 3) - self.assertEqual(elif_stmt.col_offset, 0) - - def test_elif_stmt_start_position_with_else(self): - node = ast.parse('if a:\n pass\nelif b:\n pass\nelse:\n pass\n') - elif_stmt = node.body[0].orelse[0] - self.assertEqual(elif_stmt.lineno, 3) - self.assertEqual(elif_stmt.col_offset, 0) - - def test_starred_expr_end_position_within_call(self): - node = ast.parse('f(*[0, 1])') - starred_expr = node.body[0].value.args[0] - self.assertEqual(starred_expr.end_lineno, 1) - self.assertEqual(starred_expr.end_col_offset, 9) - - def test_literal_eval(self): - self.assertEqual(ast.literal_eval('[1, 2, 3]'), [1, 2, 3]) - self.assertEqual(ast.literal_eval('{"foo": 42}'), {"foo": 42}) - self.assertEqual(ast.literal_eval('(True, False, None)'), (True, False, None)) - self.assertEqual(ast.literal_eval('{1, 2, 3}'), {1, 2, 3}) - self.assertEqual(ast.literal_eval('b"hi"'), b"hi") - self.assertEqual(ast.literal_eval('set()'), set()) - self.assertRaises(ValueError, ast.literal_eval, 'foo()') - self.assertEqual(ast.literal_eval('6'), 6) - self.assertEqual(ast.literal_eval('+6'), 6) - self.assertEqual(ast.literal_eval('-6'), -6) - self.assertEqual(ast.literal_eval('3.25'), 3.25) - self.assertEqual(ast.literal_eval('+3.25'), 3.25) - self.assertEqual(ast.literal_eval('-3.25'), -3.25) - self.assertEqual(repr(ast.literal_eval('-0.0')), '-0.0') - self.assertRaises(ValueError, ast.literal_eval, '++6') - self.assertRaises(ValueError, ast.literal_eval, '+True') - self.assertRaises(ValueError, ast.literal_eval, '2+3') - - def test_literal_eval_str_int_limit(self): - with support.adjust_int_max_str_digits(4000): - ast.literal_eval('3'*4000) # no error - with self.assertRaises(SyntaxError) as err_ctx: - ast.literal_eval('3'*4001) - self.assertIn('Exceeds the limit ', str(err_ctx.exception)) - self.assertIn(' Consider hexadecimal ', str(err_ctx.exception)) - - def test_literal_eval_complex(self): - # Issue #4907 - self.assertEqual(ast.literal_eval('6j'), 6j) - self.assertEqual(ast.literal_eval('-6j'), -6j) - self.assertEqual(ast.literal_eval('6.75j'), 6.75j) - self.assertEqual(ast.literal_eval('-6.75j'), -6.75j) - self.assertEqual(ast.literal_eval('3+6j'), 3+6j) - self.assertEqual(ast.literal_eval('-3+6j'), -3+6j) - self.assertEqual(ast.literal_eval('3-6j'), 3-6j) - self.assertEqual(ast.literal_eval('-3-6j'), -3-6j) - self.assertEqual(ast.literal_eval('3.25+6.75j'), 3.25+6.75j) - self.assertEqual(ast.literal_eval('-3.25+6.75j'), -3.25+6.75j) - self.assertEqual(ast.literal_eval('3.25-6.75j'), 3.25-6.75j) - self.assertEqual(ast.literal_eval('-3.25-6.75j'), -3.25-6.75j) - self.assertEqual(ast.literal_eval('(3+6j)'), 3+6j) - self.assertRaises(ValueError, ast.literal_eval, '-6j+3') - self.assertRaises(ValueError, ast.literal_eval, '-6j+3j') - self.assertRaises(ValueError, ast.literal_eval, '3+-6j') - self.assertRaises(ValueError, ast.literal_eval, '3+(0+6j)') - self.assertRaises(ValueError, ast.literal_eval, '-(3+6j)') - - def test_literal_eval_malformed_dict_nodes(self): - malformed = ast.Dict(keys=[ast.Constant(1), ast.Constant(2)], values=[ast.Constant(3)]) - self.assertRaises(ValueError, ast.literal_eval, malformed) - malformed = ast.Dict(keys=[ast.Constant(1)], values=[ast.Constant(2), ast.Constant(3)]) - self.assertRaises(ValueError, ast.literal_eval, malformed) - - def test_literal_eval_trailing_ws(self): - self.assertEqual(ast.literal_eval(" -1"), -1) - self.assertEqual(ast.literal_eval("\t\t-1"), -1) - self.assertEqual(ast.literal_eval(" \t -1"), -1) - self.assertRaises(IndentationError, ast.literal_eval, "\n -1") - - def test_literal_eval_malformed_lineno(self): - msg = r'malformed node or string on line 3:' - with self.assertRaisesRegex(ValueError, msg): - ast.literal_eval("{'a': 1,\n'b':2,\n'c':++3,\n'd':4}") - - node = ast.UnaryOp( - ast.UAdd(), ast.UnaryOp(ast.UAdd(), ast.Constant(6))) - self.assertIsNone(getattr(node, 'lineno', None)) - msg = r'malformed node or string:' - with self.assertRaisesRegex(ValueError, msg): - ast.literal_eval(node) - - def test_literal_eval_syntax_errors(self): - with self.assertRaisesRegex(SyntaxError, "unexpected indent"): - ast.literal_eval(r''' - \ - (\ - \ ''') - - def test_bad_integer(self): - # issue13436: Bad error message with invalid numeric values - body = [ast.ImportFrom(module='time', - names=[ast.alias(name='sleep')], - level=None, - lineno=None, col_offset=None)] - mod = ast.Module(body, []) - with self.assertRaises(ValueError) as cm: - compile(mod, 'test', 'exec') - self.assertIn("invalid integer value: None", str(cm.exception)) - - def test_level_as_none(self): - body = [ast.ImportFrom(module='time', - names=[ast.alias(name='sleep', - lineno=0, col_offset=0)], - level=None, - lineno=0, col_offset=0)] - mod = ast.Module(body, []) - code = compile(mod, 'test', 'exec') - ns = {} - exec(code, ns) - self.assertIn('sleep', ns) - - def test_recursion_direct(self): - e = ast.UnaryOp(op=ast.Not(), lineno=0, col_offset=0) - e.operand = e - with self.assertRaises(RecursionError): - with support.infinite_recursion(): - compile(ast.Expression(e), "", "eval") - - def test_recursion_indirect(self): - e = ast.UnaryOp(op=ast.Not(), lineno=0, col_offset=0) - f = ast.UnaryOp(op=ast.Not(), lineno=0, col_offset=0) - e.operand = f - f.operand = e - with self.assertRaises(RecursionError): - with support.infinite_recursion(): - compile(ast.Expression(e), "", "eval") - - -class ASTValidatorTests(unittest.TestCase): - - def mod(self, mod, msg=None, mode="exec", *, exc=ValueError): - mod.lineno = mod.col_offset = 0 - ast.fix_missing_locations(mod) - if msg is None: - compile(mod, "", mode) - else: - with self.assertRaises(exc) as cm: - compile(mod, "", mode) - self.assertIn(msg, str(cm.exception)) - - def expr(self, node, msg=None, *, exc=ValueError): - mod = ast.Module([ast.Expr(node)], []) - self.mod(mod, msg, exc=exc) - - def stmt(self, stmt, msg=None): - mod = ast.Module([stmt], []) - self.mod(mod, msg) - - def test_module(self): - m = ast.Interactive([ast.Expr(ast.Name("x", ast.Store()))]) - self.mod(m, "must have Load context", "single") - m = ast.Expression(ast.Name("x", ast.Store())) - self.mod(m, "must have Load context", "eval") - - def _check_arguments(self, fac, check): - def arguments(args=None, posonlyargs=None, vararg=None, - kwonlyargs=None, kwarg=None, - defaults=None, kw_defaults=None): - if args is None: - args = [] - if posonlyargs is None: - posonlyargs = [] - if kwonlyargs is None: - kwonlyargs = [] - if defaults is None: - defaults = [] - if kw_defaults is None: - kw_defaults = [] - args = ast.arguments(args, posonlyargs, vararg, kwonlyargs, - kw_defaults, kwarg, defaults) - return fac(args) - args = [ast.arg("x", ast.Name("x", ast.Store()))] - check(arguments(args=args), "must have Load context") - check(arguments(posonlyargs=args), "must have Load context") - check(arguments(kwonlyargs=args), "must have Load context") - check(arguments(defaults=[ast.Constant(3)]), - "more positional defaults than args") - check(arguments(kw_defaults=[ast.Constant(4)]), - "length of kwonlyargs is not the same as kw_defaults") - args = [ast.arg("x", ast.Name("x", ast.Load()))] - check(arguments(args=args, defaults=[ast.Name("x", ast.Store())]), - "must have Load context") - args = [ast.arg("a", ast.Name("x", ast.Load())), - ast.arg("b", ast.Name("y", ast.Load()))] - check(arguments(kwonlyargs=args, - kw_defaults=[None, ast.Name("x", ast.Store())]), - "must have Load context") - - def test_funcdef(self): - a = ast.arguments([], [], None, [], [], None, []) - f = ast.FunctionDef("x", a, [], [], None, None, []) - self.stmt(f, "empty body on FunctionDef") - f = ast.FunctionDef("x", a, [ast.Pass()], [ast.Name("x", ast.Store())], None, None, []) - self.stmt(f, "must have Load context") - f = ast.FunctionDef("x", a, [ast.Pass()], [], - ast.Name("x", ast.Store()), None, []) - self.stmt(f, "must have Load context") - f = ast.FunctionDef("x", ast.arguments(), [ast.Pass()]) - self.stmt(f) - def fac(args): - return ast.FunctionDef("x", args, [ast.Pass()], [], None, None, []) - self._check_arguments(fac, self.stmt) - - def test_funcdef_pattern_matching(self): - # gh-104799: New fields on FunctionDef should be added at the end - def matcher(node): - match node: - case ast.FunctionDef("foo", ast.arguments(args=[ast.arg("bar")]), - [ast.Pass()], - [ast.Name("capybara", ast.Load())], - ast.Name("pacarana", ast.Load())): - return True - case _: - return False - - code = """ - @capybara - def foo(bar) -> pacarana: - pass - """ - source = ast.parse(textwrap.dedent(code)) - funcdef = source.body[0] - self.assertIsInstance(funcdef, ast.FunctionDef) - self.assertTrue(matcher(funcdef)) - - def test_classdef(self): - def cls(bases=None, keywords=None, body=None, decorator_list=None, type_params=None): - if bases is None: - bases = [] - if keywords is None: - keywords = [] - if body is None: - body = [ast.Pass()] - if decorator_list is None: - decorator_list = [] - if type_params is None: - type_params = [] - return ast.ClassDef("myclass", bases, keywords, - body, decorator_list, type_params) - self.stmt(cls(bases=[ast.Name("x", ast.Store())]), - "must have Load context") - self.stmt(cls(keywords=[ast.keyword("x", ast.Name("x", ast.Store()))]), - "must have Load context") - self.stmt(cls(body=[]), "empty body on ClassDef") - self.stmt(cls(body=[None]), "None disallowed") - self.stmt(cls(decorator_list=[ast.Name("x", ast.Store())]), - "must have Load context") - - def test_delete(self): - self.stmt(ast.Delete([]), "empty targets on Delete") - self.stmt(ast.Delete([None]), "None disallowed") - self.stmt(ast.Delete([ast.Name("x", ast.Load())]), - "must have Del context") - - def test_assign(self): - self.stmt(ast.Assign([], ast.Constant(3)), "empty targets on Assign") - self.stmt(ast.Assign([None], ast.Constant(3)), "None disallowed") - self.stmt(ast.Assign([ast.Name("x", ast.Load())], ast.Constant(3)), - "must have Store context") - self.stmt(ast.Assign([ast.Name("x", ast.Store())], - ast.Name("y", ast.Store())), - "must have Load context") - - def test_augassign(self): - aug = ast.AugAssign(ast.Name("x", ast.Load()), ast.Add(), - ast.Name("y", ast.Load())) - self.stmt(aug, "must have Store context") - aug = ast.AugAssign(ast.Name("x", ast.Store()), ast.Add(), - ast.Name("y", ast.Store())) - self.stmt(aug, "must have Load context") - - def test_for(self): - x = ast.Name("x", ast.Store()) - y = ast.Name("y", ast.Load()) - p = ast.Pass() - self.stmt(ast.For(x, y, [], []), "empty body on For") - self.stmt(ast.For(ast.Name("x", ast.Load()), y, [p], []), - "must have Store context") - self.stmt(ast.For(x, ast.Name("y", ast.Store()), [p], []), - "must have Load context") - e = ast.Expr(ast.Name("x", ast.Store())) - self.stmt(ast.For(x, y, [e], []), "must have Load context") - self.stmt(ast.For(x, y, [p], [e]), "must have Load context") - - def test_while(self): - self.stmt(ast.While(ast.Constant(3), [], []), "empty body on While") - self.stmt(ast.While(ast.Name("x", ast.Store()), [ast.Pass()], []), - "must have Load context") - self.stmt(ast.While(ast.Constant(3), [ast.Pass()], - [ast.Expr(ast.Name("x", ast.Store()))]), - "must have Load context") - - def test_if(self): - self.stmt(ast.If(ast.Constant(3), [], []), "empty body on If") - i = ast.If(ast.Name("x", ast.Store()), [ast.Pass()], []) - self.stmt(i, "must have Load context") - i = ast.If(ast.Constant(3), [ast.Expr(ast.Name("x", ast.Store()))], []) - self.stmt(i, "must have Load context") - i = ast.If(ast.Constant(3), [ast.Pass()], - [ast.Expr(ast.Name("x", ast.Store()))]) - self.stmt(i, "must have Load context") - - def test_with(self): - p = ast.Pass() - self.stmt(ast.With([], [p]), "empty items on With") - i = ast.withitem(ast.Constant(3), None) - self.stmt(ast.With([i], []), "empty body on With") - i = ast.withitem(ast.Name("x", ast.Store()), None) - self.stmt(ast.With([i], [p]), "must have Load context") - i = ast.withitem(ast.Constant(3), ast.Name("x", ast.Load())) - self.stmt(ast.With([i], [p]), "must have Store context") - - def test_raise(self): - r = ast.Raise(None, ast.Constant(3)) - self.stmt(r, "Raise with cause but no exception") - r = ast.Raise(ast.Name("x", ast.Store()), None) - self.stmt(r, "must have Load context") - r = ast.Raise(ast.Constant(4), ast.Name("x", ast.Store())) - self.stmt(r, "must have Load context") - - def test_try(self): - p = ast.Pass() - t = ast.Try([], [], [], [p]) - self.stmt(t, "empty body on Try") - t = ast.Try([ast.Expr(ast.Name("x", ast.Store()))], [], [], [p]) - self.stmt(t, "must have Load context") - t = ast.Try([p], [], [], []) - self.stmt(t, "Try has neither except handlers nor finalbody") - t = ast.Try([p], [], [p], [p]) - self.stmt(t, "Try has orelse but no except handlers") - t = ast.Try([p], [ast.ExceptHandler(None, "x", [])], [], []) - self.stmt(t, "empty body on ExceptHandler") - e = [ast.ExceptHandler(ast.Name("x", ast.Store()), "y", [p])] - self.stmt(ast.Try([p], e, [], []), "must have Load context") - e = [ast.ExceptHandler(None, "x", [p])] - t = ast.Try([p], e, [ast.Expr(ast.Name("x", ast.Store()))], [p]) - self.stmt(t, "must have Load context") - t = ast.Try([p], e, [p], [ast.Expr(ast.Name("x", ast.Store()))]) - self.stmt(t, "must have Load context") - - def test_try_star(self): - p = ast.Pass() - t = ast.TryStar([], [], [], [p]) - self.stmt(t, "empty body on TryStar") - t = ast.TryStar([ast.Expr(ast.Name("x", ast.Store()))], [], [], [p]) - self.stmt(t, "must have Load context") - t = ast.TryStar([p], [], [], []) - self.stmt(t, "TryStar has neither except handlers nor finalbody") - t = ast.TryStar([p], [], [p], [p]) - self.stmt(t, "TryStar has orelse but no except handlers") - t = ast.TryStar([p], [ast.ExceptHandler(None, "x", [])], [], []) - self.stmt(t, "empty body on ExceptHandler") - e = [ast.ExceptHandler(ast.Name("x", ast.Store()), "y", [p])] - self.stmt(ast.TryStar([p], e, [], []), "must have Load context") - e = [ast.ExceptHandler(None, "x", [p])] - t = ast.TryStar([p], e, [ast.Expr(ast.Name("x", ast.Store()))], [p]) - self.stmt(t, "must have Load context") - t = ast.TryStar([p], e, [p], [ast.Expr(ast.Name("x", ast.Store()))]) - self.stmt(t, "must have Load context") - - def test_assert(self): - self.stmt(ast.Assert(ast.Name("x", ast.Store()), None), - "must have Load context") - assrt = ast.Assert(ast.Name("x", ast.Load()), - ast.Name("y", ast.Store())) - self.stmt(assrt, "must have Load context") - - def test_import(self): - self.stmt(ast.Import([]), "empty names on Import") - - def test_importfrom(self): - imp = ast.ImportFrom(None, [ast.alias("x", None)], -42) - self.stmt(imp, "Negative ImportFrom level") - self.stmt(ast.ImportFrom(None, [], 0), "empty names on ImportFrom") - - def test_global(self): - self.stmt(ast.Global([]), "empty names on Global") - - def test_nonlocal(self): - self.stmt(ast.Nonlocal([]), "empty names on Nonlocal") - - def test_expr(self): - e = ast.Expr(ast.Name("x", ast.Store())) - self.stmt(e, "must have Load context") - - def test_boolop(self): - b = ast.BoolOp(ast.And(), []) - self.expr(b, "less than 2 values") - b = ast.BoolOp(ast.And(), [ast.Constant(3)]) - self.expr(b, "less than 2 values") - b = ast.BoolOp(ast.And(), [ast.Constant(4), None]) - self.expr(b, "None disallowed") - b = ast.BoolOp(ast.And(), [ast.Constant(4), ast.Name("x", ast.Store())]) - self.expr(b, "must have Load context") - - def test_unaryop(self): - u = ast.UnaryOp(ast.Not(), ast.Name("x", ast.Store())) - self.expr(u, "must have Load context") - - def test_lambda(self): - a = ast.arguments([], [], None, [], [], None, []) - self.expr(ast.Lambda(a, ast.Name("x", ast.Store())), - "must have Load context") - def fac(args): - return ast.Lambda(args, ast.Name("x", ast.Load())) - self._check_arguments(fac, self.expr) - - def test_ifexp(self): - l = ast.Name("x", ast.Load()) - s = ast.Name("y", ast.Store()) - for args in (s, l, l), (l, s, l), (l, l, s): - self.expr(ast.IfExp(*args), "must have Load context") - - def test_dict(self): - d = ast.Dict([], [ast.Name("x", ast.Load())]) - self.expr(d, "same number of keys as values") - d = ast.Dict([ast.Name("x", ast.Load())], [None]) - self.expr(d, "None disallowed") - - def test_set(self): - self.expr(ast.Set([None]), "None disallowed") - s = ast.Set([ast.Name("x", ast.Store())]) - self.expr(s, "must have Load context") - - def _check_comprehension(self, fac): - self.expr(fac([]), "comprehension with no generators") - g = ast.comprehension(ast.Name("x", ast.Load()), - ast.Name("x", ast.Load()), [], 0) - self.expr(fac([g]), "must have Store context") - g = ast.comprehension(ast.Name("x", ast.Store()), - ast.Name("x", ast.Store()), [], 0) - self.expr(fac([g]), "must have Load context") - x = ast.Name("x", ast.Store()) - y = ast.Name("y", ast.Load()) - g = ast.comprehension(x, y, [None], 0) - self.expr(fac([g]), "None disallowed") - g = ast.comprehension(x, y, [ast.Name("x", ast.Store())], 0) - self.expr(fac([g]), "must have Load context") - - def _simple_comp(self, fac): - g = ast.comprehension(ast.Name("x", ast.Store()), - ast.Name("x", ast.Load()), [], 0) - self.expr(fac(ast.Name("x", ast.Store()), [g]), - "must have Load context") - def wrap(gens): - return fac(ast.Name("x", ast.Store()), gens) - self._check_comprehension(wrap) - - def test_listcomp(self): - self._simple_comp(ast.ListComp) - - def test_setcomp(self): - self._simple_comp(ast.SetComp) - - def test_generatorexp(self): - self._simple_comp(ast.GeneratorExp) - - def test_dictcomp(self): - g = ast.comprehension(ast.Name("y", ast.Store()), - ast.Name("p", ast.Load()), [], 0) - c = ast.DictComp(ast.Name("x", ast.Store()), - ast.Name("y", ast.Load()), [g]) - self.expr(c, "must have Load context") - c = ast.DictComp(ast.Name("x", ast.Load()), - ast.Name("y", ast.Store()), [g]) - self.expr(c, "must have Load context") - def factory(comps): - k = ast.Name("x", ast.Load()) - v = ast.Name("y", ast.Load()) - return ast.DictComp(k, v, comps) - self._check_comprehension(factory) - - def test_yield(self): - self.expr(ast.Yield(ast.Name("x", ast.Store())), "must have Load") - self.expr(ast.YieldFrom(ast.Name("x", ast.Store())), "must have Load") - - def test_compare(self): - left = ast.Name("x", ast.Load()) - comp = ast.Compare(left, [ast.In()], []) - self.expr(comp, "no comparators") - comp = ast.Compare(left, [ast.In()], [ast.Constant(4), ast.Constant(5)]) - self.expr(comp, "different number of comparators and operands") - comp = ast.Compare(ast.Constant("blah"), [ast.In()], [left]) - self.expr(comp) - comp = ast.Compare(left, [ast.In()], [ast.Constant("blah")]) - self.expr(comp) - - def test_call(self): - func = ast.Name("x", ast.Load()) - args = [ast.Name("y", ast.Load())] - keywords = [ast.keyword("w", ast.Name("z", ast.Load()))] - call = ast.Call(ast.Name("x", ast.Store()), args, keywords) - self.expr(call, "must have Load context") - call = ast.Call(func, [None], keywords) - self.expr(call, "None disallowed") - bad_keywords = [ast.keyword("w", ast.Name("z", ast.Store()))] - call = ast.Call(func, args, bad_keywords) - self.expr(call, "must have Load context") - - def test_num(self): - with warnings.catch_warnings(record=True) as wlog: - warnings.filterwarnings('ignore', '', DeprecationWarning) - from ast import Num - - with warnings.catch_warnings(record=True) as wlog: - warnings.filterwarnings('always', '', DeprecationWarning) - class subint(int): - pass - class subfloat(float): - pass - class subcomplex(complex): - pass - for obj in "0", "hello": - self.expr(ast.Num(obj)) - for obj in subint(), subfloat(), subcomplex(): - self.expr(ast.Num(obj), "invalid type", exc=TypeError) - - self.assertEqual([str(w.message) for w in wlog], [ - 'ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead', - 'ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead', - 'ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead', - 'ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead', - 'ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead', - ]) - - def test_attribute(self): - attr = ast.Attribute(ast.Name("x", ast.Store()), "y", ast.Load()) - self.expr(attr, "must have Load context") - - def test_subscript(self): - sub = ast.Subscript(ast.Name("x", ast.Store()), ast.Constant(3), - ast.Load()) - self.expr(sub, "must have Load context") - x = ast.Name("x", ast.Load()) - sub = ast.Subscript(x, ast.Name("y", ast.Store()), - ast.Load()) - self.expr(sub, "must have Load context") - s = ast.Name("x", ast.Store()) - for args in (s, None, None), (None, s, None), (None, None, s): - sl = ast.Slice(*args) - self.expr(ast.Subscript(x, sl, ast.Load()), - "must have Load context") - sl = ast.Tuple([], ast.Load()) - self.expr(ast.Subscript(x, sl, ast.Load())) - sl = ast.Tuple([s], ast.Load()) - self.expr(ast.Subscript(x, sl, ast.Load()), "must have Load context") - - def test_starred(self): - left = ast.List([ast.Starred(ast.Name("x", ast.Load()), ast.Store())], - ast.Store()) - assign = ast.Assign([left], ast.Constant(4)) - self.stmt(assign, "must have Store context") - - def _sequence(self, fac): - self.expr(fac([None], ast.Load()), "None disallowed") - self.expr(fac([ast.Name("x", ast.Store())], ast.Load()), - "must have Load context") - - def test_list(self): - self._sequence(ast.List) - - def test_tuple(self): - self._sequence(ast.Tuple) - - def test_nameconstant(self): - with warnings.catch_warnings(record=True) as wlog: - warnings.filterwarnings('ignore', '', DeprecationWarning) - from ast import NameConstant - - with warnings.catch_warnings(record=True) as wlog: - warnings.filterwarnings('always', '', DeprecationWarning) - self.expr(ast.NameConstant(4)) - - self.assertEqual([str(w.message) for w in wlog], [ - 'ast.NameConstant is deprecated and will be removed in Python 3.14; use ast.Constant instead', - ]) - - @support.requires_resource('cpu') - def test_stdlib_validates(self): - stdlib = os.path.dirname(ast.__file__) - tests = [fn for fn in os.listdir(stdlib) if fn.endswith(".py")] - tests.extend(["test/test_grammar.py", "test/test_unpack_ex.py"]) - for module in tests: - with self.subTest(module): - fn = os.path.join(stdlib, module) - with open(fn, "r", encoding="utf-8") as fp: - source = fp.read() - mod = ast.parse(source, fn) - compile(mod, fn, "exec") - - constant_1 = ast.Constant(1) - pattern_1 = ast.MatchValue(constant_1) - - constant_x = ast.Constant('x') - pattern_x = ast.MatchValue(constant_x) - - constant_true = ast.Constant(True) - pattern_true = ast.MatchSingleton(True) - - name_carter = ast.Name('carter', ast.Load()) - - _MATCH_PATTERNS = [ - ast.MatchValue( - ast.Attribute( - ast.Attribute( - ast.Name('x', ast.Store()), - 'y', ast.Load() - ), - 'z', ast.Load() - ) - ), - ast.MatchValue( - ast.Attribute( - ast.Attribute( - ast.Name('x', ast.Load()), - 'y', ast.Store() - ), - 'z', ast.Load() - ) - ), - ast.MatchValue( - ast.Constant(...) - ), - ast.MatchValue( - ast.Constant(True) - ), - ast.MatchValue( - ast.Constant((1,2,3)) - ), - ast.MatchSingleton('string'), - ast.MatchSequence([ - ast.MatchSingleton('string') - ]), - ast.MatchSequence( - [ - ast.MatchSequence( - [ - ast.MatchSingleton('string') - ] - ) - ] - ), - ast.MatchMapping( - [constant_1, constant_true], - [pattern_x] - ), - ast.MatchMapping( - [constant_true, constant_1], - [pattern_x, pattern_1], - rest='True' - ), - ast.MatchMapping( - [constant_true, ast.Starred(ast.Name('lol', ast.Load()), ast.Load())], - [pattern_x, pattern_1], - rest='legit' - ), - ast.MatchClass( - ast.Attribute( - ast.Attribute( - constant_x, - 'y', ast.Load()), - 'z', ast.Load()), - patterns=[], kwd_attrs=[], kwd_patterns=[] - ), - ast.MatchClass( - name_carter, - patterns=[], - kwd_attrs=['True'], - kwd_patterns=[pattern_1] - ), - ast.MatchClass( - name_carter, - patterns=[], - kwd_attrs=[], - kwd_patterns=[pattern_1] - ), - ast.MatchClass( - name_carter, - patterns=[ast.MatchSingleton('string')], - kwd_attrs=[], - kwd_patterns=[] - ), - ast.MatchClass( - name_carter, - patterns=[ast.MatchStar()], - kwd_attrs=[], - kwd_patterns=[] - ), - ast.MatchClass( - name_carter, - patterns=[], - kwd_attrs=[], - kwd_patterns=[ast.MatchStar()] - ), - ast.MatchClass( - constant_true, # invalid name - patterns=[], - kwd_attrs=['True'], - kwd_patterns=[pattern_1] - ), - ast.MatchSequence( - [ - ast.MatchStar("True") - ] - ), - ast.MatchAs( - name='False' - ), - ast.MatchOr( - [] - ), - ast.MatchOr( - [pattern_1] - ), - ast.MatchOr( - [pattern_1, pattern_x, ast.MatchSingleton('xxx')] - ), - ast.MatchAs(name="_"), - ast.MatchStar(name="x"), - ast.MatchSequence([ast.MatchStar("_")]), - ast.MatchMapping([], [], rest="_"), - ] - - def test_match_validation_pattern(self): - name_x = ast.Name('x', ast.Load()) - for pattern in self._MATCH_PATTERNS: - with self.subTest(ast.dump(pattern, indent=4)): - node = ast.Match( - subject=name_x, - cases = [ - ast.match_case( - pattern=pattern, - body = [ast.Pass()] - ) - ] - ) - node = ast.fix_missing_locations(node) - module = ast.Module([node], []) - with self.assertRaises(ValueError): - compile(module, "", "exec") - - -class ConstantTests(unittest.TestCase): - """Tests on the ast.Constant node type.""" - - def compile_constant(self, value): - tree = ast.parse("x = 123") - - node = tree.body[0].value - new_node = ast.Constant(value=value) - ast.copy_location(new_node, node) - tree.body[0].value = new_node - - code = compile(tree, "", "exec") - - ns = {} - exec(code, ns) - return ns['x'] - - def test_validation(self): - with self.assertRaises(TypeError) as cm: - self.compile_constant([1, 2, 3]) - self.assertEqual(str(cm.exception), - "got an invalid type in Constant: list") - - def test_singletons(self): - for const in (None, False, True, Ellipsis, b'', frozenset()): - with self.subTest(const=const): - value = self.compile_constant(const) - self.assertIs(value, const) - - def test_values(self): - nested_tuple = (1,) - nested_frozenset = frozenset({1}) - for level in range(3): - nested_tuple = (nested_tuple, 2) - nested_frozenset = frozenset({nested_frozenset, 2}) - values = (123, 123.0, 123j, - "unicode", b'bytes', - tuple("tuple"), frozenset("frozenset"), - nested_tuple, nested_frozenset) - for value in values: - with self.subTest(value=value): - result = self.compile_constant(value) - self.assertEqual(result, value) - - def test_assign_to_constant(self): - tree = ast.parse("x = 1") - - target = tree.body[0].targets[0] - new_target = ast.Constant(value=1) - ast.copy_location(new_target, target) - tree.body[0].targets[0] = new_target - - with self.assertRaises(ValueError) as cm: - compile(tree, "string", "exec") - self.assertEqual(str(cm.exception), - "expression which can't be assigned " - "to in Store context") - - def test_get_docstring(self): - tree = ast.parse("'docstring'\nx = 1") - self.assertEqual(ast.get_docstring(tree), 'docstring') - - def get_load_const(self, tree): - # Compile to bytecode, disassemble and get parameter of LOAD_CONST - # instructions - co = compile(tree, '', 'exec') - consts = [] - for instr in dis.get_instructions(co): - if instr.opname == 'LOAD_CONST' or instr.opname == 'RETURN_CONST': - consts.append(instr.argval) - return consts - - @support.cpython_only - def test_load_const(self): - consts = [None, - True, False, - 124, - 2.0, - 3j, - "unicode", - b'bytes', - (1, 2, 3)] - - code = '\n'.join(['x={!r}'.format(const) for const in consts]) - code += '\nx = ...' - consts.extend((Ellipsis, None)) - - tree = ast.parse(code) - self.assertEqual(self.get_load_const(tree), - consts) - - # Replace expression nodes with constants - for assign, const in zip(tree.body, consts): - assert isinstance(assign, ast.Assign), ast.dump(assign) - new_node = ast.Constant(value=const) - ast.copy_location(new_node, assign.value) - assign.value = new_node - - self.assertEqual(self.get_load_const(tree), - consts) - - def test_literal_eval(self): - tree = ast.parse("1 + 2") - binop = tree.body[0].value - - new_left = ast.Constant(value=10) - ast.copy_location(new_left, binop.left) - binop.left = new_left - - new_right = ast.Constant(value=20j) - ast.copy_location(new_right, binop.right) - binop.right = new_right - - 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. - - Testing end positions of nodes requires a bit of extra care - because of how LL parsers work. - """ - def _check_end_pos(self, ast_node, end_lineno, end_col_offset): - self.assertEqual(ast_node.end_lineno, end_lineno) - self.assertEqual(ast_node.end_col_offset, end_col_offset) - - def _check_content(self, source, ast_node, content): - self.assertEqual(ast.get_source_segment(source, ast_node), content) - - def _parse_value(self, s): - # Use duck-typing to support both single expression - # and a right hand side of an assignment statement. - return ast.parse(s).body[0].value - - def test_lambda(self): - s = 'lambda x, *y: None' - lam = self._parse_value(s) - self._check_content(s, lam.body, 'None') - self._check_content(s, lam.args.args[0], 'x') - self._check_content(s, lam.args.vararg, 'y') - - def test_func_def(self): - s = dedent(''' - def func(x: int, - *args: str, - z: float = 0, - **kwargs: Any) -> bool: - return True - ''').strip() - fdef = ast.parse(s).body[0] - self._check_end_pos(fdef, 5, 15) - self._check_content(s, fdef.body[0], 'return True') - self._check_content(s, fdef.args.args[0], 'x: int') - self._check_content(s, fdef.args.args[0].annotation, 'int') - self._check_content(s, fdef.args.kwarg, 'kwargs: Any') - self._check_content(s, fdef.args.kwarg.annotation, 'Any') - - def test_call(self): - s = 'func(x, y=2, **kw)' - call = self._parse_value(s) - self._check_content(s, call.func, 'func') - self._check_content(s, call.keywords[0].value, '2') - self._check_content(s, call.keywords[1].value, 'kw') - - def test_call_noargs(self): - s = 'x[0]()' - call = self._parse_value(s) - self._check_content(s, call.func, 'x[0]') - self._check_end_pos(call, 1, 6) - - def test_class_def(self): - s = dedent(''' - class C(A, B): - x: int = 0 - ''').strip() - cdef = ast.parse(s).body[0] - self._check_end_pos(cdef, 2, 14) - self._check_content(s, cdef.bases[1], 'B') - self._check_content(s, cdef.body[0], 'x: int = 0') - - def test_class_kw(self): - s = 'class S(metaclass=abc.ABCMeta): pass' - cdef = ast.parse(s).body[0] - self._check_content(s, cdef.keywords[0].value, 'abc.ABCMeta') - - def test_multi_line_str(self): - s = dedent(''' - x = """Some multi-line text. - - It goes on starting from same indent.""" - ''').strip() - assign = ast.parse(s).body[0] - self._check_end_pos(assign, 3, 40) - self._check_end_pos(assign.value, 3, 40) - - def test_continued_str(self): - s = dedent(''' - x = "first part" \\ - "second part" - ''').strip() - assign = ast.parse(s).body[0] - self._check_end_pos(assign, 2, 13) - self._check_end_pos(assign.value, 2, 13) - - def test_suites(self): - # We intentionally put these into the same string to check - # that empty lines are not part of the suite. - s = dedent(''' - while True: - pass - - if one(): - x = None - elif other(): - y = None - else: - z = None - - for x, y in stuff: - assert True - - try: - raise RuntimeError - except TypeError as e: - pass - - pass - ''').strip() - mod = ast.parse(s) - while_loop = mod.body[0] - if_stmt = mod.body[1] - for_loop = mod.body[2] - try_stmt = mod.body[3] - pass_stmt = mod.body[4] - - self._check_end_pos(while_loop, 2, 8) - self._check_end_pos(if_stmt, 9, 12) - self._check_end_pos(for_loop, 12, 15) - self._check_end_pos(try_stmt, 17, 8) - self._check_end_pos(pass_stmt, 19, 4) - - self._check_content(s, while_loop.test, 'True') - self._check_content(s, if_stmt.body[0], 'x = None') - self._check_content(s, if_stmt.orelse[0].test, 'other()') - self._check_content(s, for_loop.target, 'x, y') - self._check_content(s, try_stmt.body[0], 'raise RuntimeError') - self._check_content(s, try_stmt.handlers[0].type, 'TypeError') - - def test_fstring(self): - s = 'x = f"abc {x + y} abc"' - fstr = self._parse_value(s) - binop = fstr.values[1].value - self._check_content(s, binop, 'x + y') - - def test_fstring_multi_line(self): - s = dedent(''' - f"""Some multi-line text. - { - arg_one - + - arg_two - } - It goes on...""" - ''').strip() - fstr = self._parse_value(s) - binop = fstr.values[1].value - self._check_end_pos(binop, 5, 7) - self._check_content(s, binop.left, 'arg_one') - self._check_content(s, binop.right, 'arg_two') - - def test_import_from_multi_line(self): - s = dedent(''' - from x.y.z import ( - a, b, c as c - ) - ''').strip() - imp = ast.parse(s).body[0] - self._check_end_pos(imp, 3, 1) - self._check_end_pos(imp.names[2], 2, 16) - - def test_slices(self): - s1 = 'f()[1, 2] [0]' - s2 = 'x[ a.b: c.d]' - sm = dedent(''' - x[ a.b: f () , - g () : c.d - ] - ''').strip() - i1, i2, im = map(self._parse_value, (s1, s2, sm)) - self._check_content(s1, i1.value, 'f()[1, 2]') - self._check_content(s1, i1.value.slice, '1, 2') - self._check_content(s2, i2.slice.lower, 'a.b') - self._check_content(s2, i2.slice.upper, 'c.d') - self._check_content(sm, im.slice.elts[0].upper, 'f ()') - self._check_content(sm, im.slice.elts[1].lower, 'g ()') - self._check_end_pos(im, 3, 3) - - def test_binop(self): - s = dedent(''' - (1 * 2 + (3 ) + - 4 - ) - ''').strip() - binop = self._parse_value(s) - self._check_end_pos(binop, 2, 6) - self._check_content(s, binop.right, '4') - self._check_content(s, binop.left, '1 * 2 + (3 )') - self._check_content(s, binop.left.right, '3') - - def test_boolop(self): - s = dedent(''' - if (one_condition and - (other_condition or yet_another_one)): - pass - ''').strip() - bop = ast.parse(s).body[0].test - self._check_end_pos(bop, 2, 44) - self._check_content(s, bop.values[1], - 'other_condition or yet_another_one') - - def test_tuples(self): - s1 = 'x = () ;' - s2 = 'x = 1 , ;' - s3 = 'x = (1 , 2 ) ;' - sm = dedent(''' - x = ( - a, b, - ) - ''').strip() - t1, t2, t3, tm = map(self._parse_value, (s1, s2, s3, sm)) - self._check_content(s1, t1, '()') - self._check_content(s2, t2, '1 ,') - self._check_content(s3, t3, '(1 , 2 )') - self._check_end_pos(tm, 3, 1) - - def test_attribute_spaces(self): - s = 'func(x. y .z)' - call = self._parse_value(s) - self._check_content(s, call, s) - self._check_content(s, call.args[0], 'x. y .z') - - def test_redundant_parenthesis(self): - s = '( ( ( a + b ) ) )' - v = ast.parse(s).body[0].value - self.assertEqual(type(v).__name__, 'BinOp') - self._check_content(s, v, 'a + b') - s2 = 'await ' + s - v = ast.parse(s2).body[0].value.value - self.assertEqual(type(v).__name__, 'BinOp') - self._check_content(s2, v, 'a + b') - - def test_trailers_with_redundant_parenthesis(self): - tests = ( - ('( ( ( a ) ) ) ( )', 'Call'), - ('( ( ( a ) ) ) ( b )', 'Call'), - ('( ( ( a ) ) ) [ b ]', 'Subscript'), - ('( ( ( a ) ) ) . b', 'Attribute'), - ) - for s, t in tests: - with self.subTest(s): - v = ast.parse(s).body[0].value - self.assertEqual(type(v).__name__, t) - self._check_content(s, v, s) - s2 = 'await ' + s - v = ast.parse(s2).body[0].value.value - self.assertEqual(type(v).__name__, t) - self._check_content(s2, v, s) - - def test_displays(self): - s1 = '[{}, {1, }, {1, 2,} ]' - s2 = '{a: b, f (): g () ,}' - c1 = self._parse_value(s1) - c2 = self._parse_value(s2) - self._check_content(s1, c1.elts[0], '{}') - self._check_content(s1, c1.elts[1], '{1, }') - self._check_content(s1, c1.elts[2], '{1, 2,}') - self._check_content(s2, c2.keys[1], 'f ()') - self._check_content(s2, c2.values[1], 'g ()') - - def test_comprehensions(self): - s = dedent(''' - x = [{x for x, y in stuff - if cond.x} for stuff in things] - ''').strip() - cmp = self._parse_value(s) - self._check_end_pos(cmp, 2, 37) - self._check_content(s, cmp.generators[0].iter, 'things') - self._check_content(s, cmp.elt.generators[0].iter, 'stuff') - self._check_content(s, cmp.elt.generators[0].ifs[0], 'cond.x') - self._check_content(s, cmp.elt.generators[0].target, 'x, y') - - def test_yield_await(self): - s = dedent(''' - async def f(): - yield x - await y - ''').strip() - fdef = ast.parse(s).body[0] - self._check_content(s, fdef.body[0].value, 'yield x') - self._check_content(s, fdef.body[1].value, 'await y') - - def test_source_segment_multi(self): - s_orig = dedent(''' - x = ( - a, b, - ) + () - ''').strip() - s_tuple = dedent(''' - ( - a, b, - ) - ''').strip() - binop = self._parse_value(s_orig) - self.assertEqual(ast.get_source_segment(s_orig, binop.left), s_tuple) - - def test_source_segment_padded(self): - s_orig = dedent(''' - class C: - def fun(self) -> None: - "ЖЖЖЖЖ" - ''').strip() - s_method = ' def fun(self) -> None:\n' \ - ' "ЖЖЖЖЖ"' - cdef = ast.parse(s_orig).body[0] - self.assertEqual(ast.get_source_segment(s_orig, cdef.body[0], padded=True), - s_method) - - def test_source_segment_endings(self): - s = 'v = 1\r\nw = 1\nx = 1\n\ry = 1\rz = 1\r\n' - v, w, x, y, z = ast.parse(s).body - self._check_content(s, v, 'v = 1') - self._check_content(s, w, 'w = 1') - self._check_content(s, x, 'x = 1') - self._check_content(s, y, 'y = 1') - self._check_content(s, z, 'z = 1') - - def test_source_segment_tabs(self): - s = dedent(''' - class C: - \t\f def fun(self) -> None: - \t\f pass - ''').strip() - s_method = ' \t\f def fun(self) -> None:\n' \ - ' \t\f pass' - - cdef = ast.parse(s).body[0] - self.assertEqual(ast.get_source_segment(s, cdef.body[0], padded=True), s_method) - - def test_source_segment_newlines(self): - s = 'def f():\n pass\ndef g():\r pass\r\ndef h():\r\n pass\r\n' - f, g, h = ast.parse(s).body - self._check_content(s, f, 'def f():\n pass') - self._check_content(s, g, 'def g():\r pass') - self._check_content(s, h, 'def h():\r\n pass') - - s = 'def f():\n a = 1\r b = 2\r\n c = 3\n' - f = ast.parse(s).body[0] - self._check_content(s, f, s.rstrip()) - - def test_source_segment_missing_info(self): - s = 'v = 1\r\nw = 1\nx = 1\n\ry = 1\r\n' - v, w, x, y = ast.parse(s).body - del v.lineno - del w.end_lineno - del x.col_offset - del y.end_col_offset - self.assertIsNone(ast.get_source_segment(s, v)) - self.assertIsNone(ast.get_source_segment(s, w)) - self.assertIsNone(ast.get_source_segment(s, x)) - self.assertIsNone(ast.get_source_segment(s, y)) - -class BaseNodeVisitorCases: - # Both `NodeVisitor` and `NodeTranformer` must raise these warnings: - def test_old_constant_nodes(self): - class Visitor(self.visitor_class): - def visit_Num(self, node): - log.append((node.lineno, 'Num', node.n)) - def visit_Str(self, node): - log.append((node.lineno, 'Str', node.s)) - def visit_Bytes(self, node): - log.append((node.lineno, 'Bytes', node.s)) - def visit_NameConstant(self, node): - log.append((node.lineno, 'NameConstant', node.value)) - def visit_Ellipsis(self, node): - log.append((node.lineno, 'Ellipsis', ...)) - mod = ast.parse(dedent('''\ - i = 42 - f = 4.25 - c = 4.25j - s = 'string' - b = b'bytes' - t = True - n = None - e = ... - ''')) - visitor = Visitor() - log = [] - with warnings.catch_warnings(record=True) as wlog: - warnings.filterwarnings('always', '', DeprecationWarning) - visitor.visit(mod) - self.assertEqual(log, [ - (1, 'Num', 42), - (2, 'Num', 4.25), - (3, 'Num', 4.25j), - (4, 'Str', 'string'), - (5, 'Bytes', b'bytes'), - (6, 'NameConstant', True), - (7, 'NameConstant', None), - (8, 'Ellipsis', ...), - ]) - self.assertEqual([str(w.message) for w in wlog], [ - 'visit_Num is deprecated; add visit_Constant', - 'Attribute n is deprecated and will be removed in Python 3.14; use value instead', - 'visit_Num is deprecated; add visit_Constant', - 'Attribute n is deprecated and will be removed in Python 3.14; use value instead', - 'visit_Num is deprecated; add visit_Constant', - 'Attribute n is deprecated and will be removed in Python 3.14; use value instead', - 'visit_Str is deprecated; add visit_Constant', - 'Attribute s is deprecated and will be removed in Python 3.14; use value instead', - 'visit_Bytes is deprecated; add visit_Constant', - 'Attribute s is deprecated and will be removed in Python 3.14; use value instead', - 'visit_NameConstant is deprecated; add visit_Constant', - 'visit_NameConstant is deprecated; add visit_Constant', - 'visit_Ellipsis is deprecated; add visit_Constant', - ]) - - -class NodeVisitorTests(BaseNodeVisitorCases, unittest.TestCase): - visitor_class = ast.NodeVisitor - - -class NodeTransformerTests(ASTTestMixin, BaseNodeVisitorCases, unittest.TestCase): - visitor_class = ast.NodeTransformer - - def assertASTTransformation(self, tranformer_class, - initial_code, expected_code): - initial_ast = ast.parse(dedent(initial_code)) - expected_ast = ast.parse(dedent(expected_code)) - - tranformer = tranformer_class() - result_ast = ast.fix_missing_locations(tranformer.visit(initial_ast)) - - self.assertASTEqual(result_ast, expected_ast) - - def test_node_remove_single(self): - code = 'def func(arg) -> SomeType: ...' - expected = 'def func(arg): ...' - - # Since `FunctionDef.returns` is defined as a single value, we test - # the `if isinstance(old_value, AST):` branch here. - class SomeTypeRemover(ast.NodeTransformer): - def visit_Name(self, node: ast.Name): - self.generic_visit(node) - if node.id == 'SomeType': - return None - return node - - self.assertASTTransformation(SomeTypeRemover, code, expected) - - def test_node_remove_from_list(self): - code = """ - def func(arg): - print(arg) - yield arg - """ - expected = """ - def func(arg): - print(arg) - """ - - # Since `FunctionDef.body` is defined as a list, we test - # the `if isinstance(old_value, list):` branch here. - class YieldRemover(ast.NodeTransformer): - def visit_Expr(self, node: ast.Expr): - self.generic_visit(node) - if isinstance(node.value, ast.Yield): - return None # Remove `yield` from a function - return node - - self.assertASTTransformation(YieldRemover, code, expected) - - def test_node_return_list(self): - code = """ - class DSL(Base, kw1=True): ... - """ - expected = """ - class DSL(Base, kw1=True, kw2=True, kw3=False): ... - """ - - class ExtendKeywords(ast.NodeTransformer): - def visit_keyword(self, node: ast.keyword): - self.generic_visit(node) - if node.arg == 'kw1': - return [ - node, - ast.keyword('kw2', ast.Constant(True)), - ast.keyword('kw3', ast.Constant(False)), - ] - return node - - self.assertASTTransformation(ExtendKeywords, code, expected) - - def test_node_mutate(self): - code = """ - def func(arg): - print(arg) - """ - expected = """ - def func(arg): - log(arg) - """ - - class PrintToLog(ast.NodeTransformer): - def visit_Call(self, node: ast.Call): - self.generic_visit(node) - if isinstance(node.func, ast.Name) and node.func.id == 'print': - node.func.id = 'log' - return node - - self.assertASTTransformation(PrintToLog, code, expected) - - def test_node_replace(self): - code = """ - def func(arg): - print(arg) - """ - expected = """ - def func(arg): - logger.log(arg, debug=True) - """ - - class PrintToLog(ast.NodeTransformer): - def visit_Call(self, node: ast.Call): - self.generic_visit(node) - if isinstance(node.func, ast.Name) and node.func.id == 'print': - return ast.Call( - func=ast.Attribute( - ast.Name('logger', ctx=ast.Load()), - attr='log', - ctx=ast.Load(), - ), - args=node.args, - keywords=[ast.keyword('debug', ast.Constant(True))], - ) - return node - - self.assertASTTransformation(PrintToLog, code, expected) - - -@support.cpython_only -class ModuleStateTests(unittest.TestCase): - # bpo-41194, bpo-41261, bpo-41631: The _ast module uses a global state. - - def check_ast_module(self): - # Check that the _ast module still works as expected - code = 'x + 1' - filename = '' - mode = 'eval' - - # Create _ast.AST subclasses instances - ast_tree = compile(code, filename, mode, flags=ast.PyCF_ONLY_AST) - - # Call PyAST_Check() - code = compile(ast_tree, filename, mode) - self.assertIsInstance(code, types.CodeType) - - def test_reload_module(self): - # bpo-41194: Importing the _ast module twice must not crash. - with support.swap_item(sys.modules, '_ast', None): - del sys.modules['_ast'] - import _ast as ast1 - - del sys.modules['_ast'] - import _ast as ast2 - - self.check_ast_module() - - # Unloading the two _ast module instances must not crash. - del ast1 - del ast2 - support.gc_collect() - - self.check_ast_module() - - def test_sys_modules(self): - # bpo-41631: Test reproducing a Mercurial crash when PyAST_Check() - # imported the _ast module internally. - lazy_mod = object() - - def my_import(name, *args, **kw): - sys.modules[name] = lazy_mod - return lazy_mod - - with support.swap_item(sys.modules, '_ast', None): - del sys.modules['_ast'] - - with support.swap_attr(builtins, '__import__', my_import): - # Test that compile() does not import the _ast module - self.check_ast_module() - self.assertNotIn('_ast', sys.modules) - - # Sanity check of the test itself - import _ast - self.assertIs(_ast, lazy_mod) - - def test_subinterpreter(self): - # bpo-41631: Importing and using the _ast module in a subinterpreter - # must not crash. - code = dedent(''' - import _ast - import ast - import gc - import sys - import types - - # Create _ast.AST subclasses instances and call PyAST_Check() - ast_tree = compile('x+1', '', 'eval', - flags=ast.PyCF_ONLY_AST) - code = compile(ast_tree, 'string', 'eval') - if not isinstance(code, types.CodeType): - raise AssertionError - - # Unloading the _ast module must not crash. - del ast, _ast - del sys.modules['ast'], sys.modules['_ast'] - gc.collect() - ''') - res = support.run_in_subinterp(code) - self.assertEqual(res, 0) - - -class ASTMainTests(unittest.TestCase): - # Tests `ast.main()` function. - - def test_cli_file_input(self): - code = "print(1, 2, 3)" - expected = ast.dump(ast.parse(code), indent=3) - - with os_helper.temp_dir() as tmp_dir: - filename = os.path.join(tmp_dir, "test_module.py") - with open(filename, 'w', encoding='utf-8') as f: - f.write(code) - res, _ = script_helper.run_python_until_end("-m", "ast", filename) - - self.assertEqual(res.err, b"") - self.assertEqual(expected.splitlines(), - res.out.decode("utf8").splitlines()) - self.assertEqual(res.rc, 0) - - -def main(): - if __name__ != '__main__': - return - if sys.argv[1:] == ['-g']: - for statements, kind in ((exec_tests, "exec"), (single_tests, "single"), - (eval_tests, "eval")): - print(kind+"_results = [") - for statement in statements: - tree = ast.parse(statement, "?", kind) - print("%r," % (to_tuple(tree),)) - print("]") - print("main()") - raise SystemExit - unittest.main() - -#### EVERYTHING BELOW IS GENERATED BY python Lib/test/test_ast.py -g ##### -exec_results = [ -('Module', [('Expr', (1, 0, 1, 4), ('Constant', (1, 0, 1, 4), None, None))], []), -('Module', [('Expr', (1, 0, 1, 18), ('Constant', (1, 0, 1, 18), 'module docstring', None))], []), -('Module', [('FunctionDef', (1, 0, 1, 13), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 9, 1, 13))], [], None, None, [])], []), -('Module', [('FunctionDef', (1, 0, 1, 29), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (1, 9, 1, 29), ('Constant', (1, 9, 1, 29), 'function docstring', None))], [], None, None, [])], []), -('Module', [('FunctionDef', (1, 0, 1, 14), 'f', ('arguments', [], [('arg', (1, 6, 1, 7), 'a', None, None)], None, [], [], None, []), [('Pass', (1, 10, 1, 14))], [], None, None, [])], []), -('Module', [('FunctionDef', (1, 0, 1, 16), 'f', ('arguments', [], [('arg', (1, 6, 1, 7), 'a', None, None)], None, [], [], None, [('Constant', (1, 8, 1, 9), 0, None)]), [('Pass', (1, 12, 1, 16))], [], None, None, [])], []), -('Module', [('FunctionDef', (1, 0, 1, 18), 'f', ('arguments', [], [], ('arg', (1, 7, 1, 11), 'args', None, None), [], [], None, []), [('Pass', (1, 14, 1, 18))], [], None, None, [])], []), -('Module', [('FunctionDef', (1, 0, 1, 23), 'f', ('arguments', [], [], ('arg', (1, 7, 1, 16), 'args', ('Starred', (1, 13, 1, 16), ('Name', (1, 14, 1, 16), 'Ts', ('Load',)), ('Load',)), None), [], [], None, []), [('Pass', (1, 19, 1, 23))], [], None, None, [])], []), -('Module', [('FunctionDef', (1, 0, 1, 36), 'f', ('arguments', [], [], ('arg', (1, 7, 1, 29), 'args', ('Starred', (1, 13, 1, 29), ('Subscript', (1, 14, 1, 29), ('Name', (1, 14, 1, 19), 'tuple', ('Load',)), ('Tuple', (1, 20, 1, 28), [('Name', (1, 20, 1, 23), 'int', ('Load',)), ('Constant', (1, 25, 1, 28), Ellipsis, None)], ('Load',)), ('Load',)), ('Load',)), None), [], [], None, []), [('Pass', (1, 32, 1, 36))], [], None, None, [])], []), -('Module', [('FunctionDef', (1, 0, 1, 36), 'f', ('arguments', [], [], ('arg', (1, 7, 1, 29), 'args', ('Starred', (1, 13, 1, 29), ('Subscript', (1, 14, 1, 29), ('Name', (1, 14, 1, 19), 'tuple', ('Load',)), ('Tuple', (1, 20, 1, 28), [('Name', (1, 20, 1, 23), 'int', ('Load',)), ('Starred', (1, 25, 1, 28), ('Name', (1, 26, 1, 28), 'Ts', ('Load',)), ('Load',))], ('Load',)), ('Load',)), ('Load',)), None), [], [], None, []), [('Pass', (1, 32, 1, 36))], [], None, None, [])], []), -('Module', [('FunctionDef', (1, 0, 1, 21), 'f', ('arguments', [], [], None, [], [], ('arg', (1, 8, 1, 14), 'kwargs', None, None), []), [('Pass', (1, 17, 1, 21))], [], None, None, [])], []), -('Module', [('FunctionDef', (1, 0, 1, 71), 'f', ('arguments', [], [('arg', (1, 6, 1, 7), 'a', None, None), ('arg', (1, 9, 1, 10), 'b', None, None), ('arg', (1, 14, 1, 15), 'c', None, None), ('arg', (1, 22, 1, 23), 'd', None, None), ('arg', (1, 28, 1, 29), 'e', None, None)], ('arg', (1, 35, 1, 39), 'args', None, None), [('arg', (1, 41, 1, 42), 'f', None, None)], [('Constant', (1, 43, 1, 45), 42, None)], ('arg', (1, 49, 1, 55), 'kwargs', None, None), [('Constant', (1, 11, 1, 12), 1, None), ('Constant', (1, 16, 1, 20), None, None), ('List', (1, 24, 1, 26), [], ('Load',)), ('Dict', (1, 30, 1, 32), [], [])]), [('Expr', (1, 58, 1, 71), ('Constant', (1, 58, 1, 71), 'doc for f()', None))], [], None, None, [])], []), -('Module', [('FunctionDef', (1, 0, 1, 27), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 23, 1, 27))], [], ('Subscript', (1, 11, 1, 21), ('Name', (1, 11, 1, 16), 'tuple', ('Load',)), ('Tuple', (1, 17, 1, 20), [('Starred', (1, 17, 1, 20), ('Name', (1, 18, 1, 20), 'Ts', ('Load',)), ('Load',))], ('Load',)), ('Load',)), None, [])], []), -('Module', [('FunctionDef', (1, 0, 1, 32), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 28, 1, 32))], [], ('Subscript', (1, 11, 1, 26), ('Name', (1, 11, 1, 16), 'tuple', ('Load',)), ('Tuple', (1, 17, 1, 25), [('Name', (1, 17, 1, 20), 'int', ('Load',)), ('Starred', (1, 22, 1, 25), ('Name', (1, 23, 1, 25), 'Ts', ('Load',)), ('Load',))], ('Load',)), ('Load',)), None, [])], []), -('Module', [('FunctionDef', (1, 0, 1, 45), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 41, 1, 45))], [], ('Subscript', (1, 11, 1, 39), ('Name', (1, 11, 1, 16), 'tuple', ('Load',)), ('Tuple', (1, 17, 1, 38), [('Name', (1, 17, 1, 20), 'int', ('Load',)), ('Starred', (1, 22, 1, 38), ('Subscript', (1, 23, 1, 38), ('Name', (1, 23, 1, 28), 'tuple', ('Load',)), ('Tuple', (1, 29, 1, 37), [('Name', (1, 29, 1, 32), 'int', ('Load',)), ('Constant', (1, 34, 1, 37), Ellipsis, None)], ('Load',)), ('Load',)), ('Load',))], ('Load',)), ('Load',)), None, [])], []), -('Module', [('ClassDef', (1, 0, 1, 12), 'C', [], [], [('Pass', (1, 8, 1, 12))], [], [])], []), -('Module', [('ClassDef', (1, 0, 1, 32), 'C', [], [], [('Expr', (1, 9, 1, 32), ('Constant', (1, 9, 1, 32), 'docstring for class C', None))], [], [])], []), -('Module', [('ClassDef', (1, 0, 1, 21), 'C', [('Name', (1, 8, 1, 14), 'object', ('Load',))], [], [('Pass', (1, 17, 1, 21))], [], [])], []), -('Module', [('FunctionDef', (1, 0, 1, 16), 'f', ('arguments', [], [], None, [], [], None, []), [('Return', (1, 8, 1, 16), ('Constant', (1, 15, 1, 16), 1, None))], [], None, None, [])], []), -('Module', [('Delete', (1, 0, 1, 5), [('Name', (1, 4, 1, 5), 'v', ('Del',))])], []), -('Module', [('Assign', (1, 0, 1, 5), [('Name', (1, 0, 1, 1), 'v', ('Store',))], ('Constant', (1, 4, 1, 5), 1, None), None)], []), -('Module', [('Assign', (1, 0, 1, 7), [('Tuple', (1, 0, 1, 3), [('Name', (1, 0, 1, 1), 'a', ('Store',)), ('Name', (1, 2, 1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 6, 1, 7), 'c', ('Load',)), None)], []), -('Module', [('Assign', (1, 0, 1, 9), [('Tuple', (1, 0, 1, 5), [('Name', (1, 1, 1, 2), 'a', ('Store',)), ('Name', (1, 3, 1, 4), 'b', ('Store',))], ('Store',))], ('Name', (1, 8, 1, 9), 'c', ('Load',)), None)], []), -('Module', [('Assign', (1, 0, 1, 9), [('List', (1, 0, 1, 5), [('Name', (1, 1, 1, 2), 'a', ('Store',)), ('Name', (1, 3, 1, 4), 'b', ('Store',))], ('Store',))], ('Name', (1, 8, 1, 9), 'c', ('Load',)), None)], []), -('Module', [('AnnAssign', (1, 0, 1, 13), ('Name', (1, 0, 1, 1), 'x', ('Store',)), ('Subscript', (1, 3, 1, 13), ('Name', (1, 3, 1, 8), 'tuple', ('Load',)), ('Tuple', (1, 9, 1, 12), [('Starred', (1, 9, 1, 12), ('Name', (1, 10, 1, 12), 'Ts', ('Load',)), ('Load',))], ('Load',)), ('Load',)), None, 1)], []), -('Module', [('AnnAssign', (1, 0, 1, 18), ('Name', (1, 0, 1, 1), 'x', ('Store',)), ('Subscript', (1, 3, 1, 18), ('Name', (1, 3, 1, 8), 'tuple', ('Load',)), ('Tuple', (1, 9, 1, 17), [('Name', (1, 9, 1, 12), 'int', ('Load',)), ('Starred', (1, 14, 1, 17), ('Name', (1, 15, 1, 17), 'Ts', ('Load',)), ('Load',))], ('Load',)), ('Load',)), None, 1)], []), -('Module', [('AnnAssign', (1, 0, 1, 31), ('Name', (1, 0, 1, 1), 'x', ('Store',)), ('Subscript', (1, 3, 1, 31), ('Name', (1, 3, 1, 8), 'tuple', ('Load',)), ('Tuple', (1, 9, 1, 30), [('Name', (1, 9, 1, 12), 'int', ('Load',)), ('Starred', (1, 14, 1, 30), ('Subscript', (1, 15, 1, 30), ('Name', (1, 15, 1, 20), 'tuple', ('Load',)), ('Tuple', (1, 21, 1, 29), [('Name', (1, 21, 1, 24), 'str', ('Load',)), ('Constant', (1, 26, 1, 29), Ellipsis, None)], ('Load',)), ('Load',)), ('Load',))], ('Load',)), ('Load',)), None, 1)], []), -('Module', [('AugAssign', (1, 0, 1, 6), ('Name', (1, 0, 1, 1), 'v', ('Store',)), ('Add',), ('Constant', (1, 5, 1, 6), 1, None))], []), -('Module', [('For', (1, 0, 1, 15), ('Name', (1, 4, 1, 5), 'v', ('Store',)), ('Name', (1, 9, 1, 10), 'v', ('Load',)), [('Pass', (1, 11, 1, 15))], [], None)], []), -('Module', [('While', (1, 0, 1, 12), ('Name', (1, 6, 1, 7), 'v', ('Load',)), [('Pass', (1, 8, 1, 12))], [])], []), -('Module', [('If', (1, 0, 1, 9), ('Name', (1, 3, 1, 4), 'v', ('Load',)), [('Pass', (1, 5, 1, 9))], [])], []), -('Module', [('If', (1, 0, 4, 6), ('Name', (1, 3, 1, 4), 'a', ('Load',)), [('Pass', (2, 2, 2, 6))], [('If', (3, 0, 4, 6), ('Name', (3, 5, 3, 6), 'b', ('Load',)), [('Pass', (4, 2, 4, 6))], [])])], []), -('Module', [('If', (1, 0, 6, 6), ('Name', (1, 3, 1, 4), 'a', ('Load',)), [('Pass', (2, 2, 2, 6))], [('If', (3, 0, 6, 6), ('Name', (3, 5, 3, 6), 'b', ('Load',)), [('Pass', (4, 2, 4, 6))], [('Pass', (6, 2, 6, 6))])])], []), -('Module', [('With', (1, 0, 1, 17), [('withitem', ('Name', (1, 5, 1, 6), 'x', ('Load',)), ('Name', (1, 10, 1, 11), 'y', ('Store',)))], [('Pass', (1, 13, 1, 17))], None)], []), -('Module', [('With', (1, 0, 1, 25), [('withitem', ('Name', (1, 5, 1, 6), 'x', ('Load',)), ('Name', (1, 10, 1, 11), 'y', ('Store',))), ('withitem', ('Name', (1, 13, 1, 14), 'z', ('Load',)), ('Name', (1, 18, 1, 19), 'q', ('Store',)))], [('Pass', (1, 21, 1, 25))], None)], []), -('Module', [('Raise', (1, 0, 1, 25), ('Call', (1, 6, 1, 25), ('Name', (1, 6, 1, 15), 'Exception', ('Load',)), [('Constant', (1, 16, 1, 24), 'string', None)], []), None)], []), -('Module', [('Try', (1, 0, 4, 6), [('Pass', (2, 2, 2, 6))], [('ExceptHandler', (3, 0, 4, 6), ('Name', (3, 7, 3, 16), 'Exception', ('Load',)), None, [('Pass', (4, 2, 4, 6))])], [], [])], []), -('Module', [('Try', (1, 0, 4, 6), [('Pass', (2, 2, 2, 6))], [], [], [('Pass', (4, 2, 4, 6))])], []), -('Module', [('TryStar', (1, 0, 4, 6), [('Pass', (2, 2, 2, 6))], [('ExceptHandler', (3, 0, 4, 6), ('Name', (3, 8, 3, 17), 'Exception', ('Load',)), None, [('Pass', (4, 2, 4, 6))])], [], [])], []), -('Module', [('Assert', (1, 0, 1, 8), ('Name', (1, 7, 1, 8), 'v', ('Load',)), None)], []), -('Module', [('Import', (1, 0, 1, 10), [('alias', (1, 7, 1, 10), 'sys', None)])], []), -('Module', [('ImportFrom', (1, 0, 1, 17), 'sys', [('alias', (1, 16, 1, 17), 'v', None)], 0)], []), -('Module', [('Global', (1, 0, 1, 8), ['v'])], []), -('Module', [('Expr', (1, 0, 1, 1), ('Constant', (1, 0, 1, 1), 1, None))], []), -('Module', [('Pass', (1, 0, 1, 4))], []), -('Module', [('For', (1, 0, 1, 16), ('Name', (1, 4, 1, 5), 'v', ('Store',)), ('Name', (1, 9, 1, 10), 'v', ('Load',)), [('Break', (1, 11, 1, 16))], [], None)], []), -('Module', [('For', (1, 0, 1, 19), ('Name', (1, 4, 1, 5), 'v', ('Store',)), ('Name', (1, 9, 1, 10), 'v', ('Load',)), [('Continue', (1, 11, 1, 19))], [], None)], []), -('Module', [('For', (1, 0, 1, 18), ('Tuple', (1, 4, 1, 7), [('Name', (1, 4, 1, 5), 'a', ('Store',)), ('Name', (1, 6, 1, 7), 'b', ('Store',))], ('Store',)), ('Name', (1, 11, 1, 12), 'c', ('Load',)), [('Pass', (1, 14, 1, 18))], [], None)], []), -('Module', [('For', (1, 0, 1, 20), ('Tuple', (1, 4, 1, 9), [('Name', (1, 5, 1, 6), 'a', ('Store',)), ('Name', (1, 7, 1, 8), 'b', ('Store',))], ('Store',)), ('Name', (1, 13, 1, 14), 'c', ('Load',)), [('Pass', (1, 16, 1, 20))], [], None)], []), -('Module', [('For', (1, 0, 1, 20), ('List', (1, 4, 1, 9), [('Name', (1, 5, 1, 6), 'a', ('Store',)), ('Name', (1, 7, 1, 8), 'b', ('Store',))], ('Store',)), ('Name', (1, 13, 1, 14), 'c', ('Load',)), [('Pass', (1, 16, 1, 20))], [], None)], []), -('Module', [('Expr', (1, 0, 11, 5), ('GeneratorExp', (1, 0, 11, 5), ('Tuple', (2, 4, 6, 5), [('Name', (3, 4, 3, 6), 'Aa', ('Load',)), ('Name', (5, 7, 5, 9), 'Bb', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (8, 4, 10, 6), [('Name', (8, 4, 8, 6), 'Aa', ('Store',)), ('Name', (10, 4, 10, 6), 'Bb', ('Store',))], ('Store',)), ('Name', (10, 10, 10, 12), 'Cc', ('Load',)), [], 0)]))], []), -('Module', [('Expr', (1, 0, 1, 34), ('DictComp', (1, 0, 1, 34), ('Name', (1, 1, 1, 2), 'a', ('Load',)), ('Name', (1, 5, 1, 6), 'b', ('Load',)), [('comprehension', ('Name', (1, 11, 1, 12), 'w', ('Store',)), ('Name', (1, 16, 1, 17), 'x', ('Load',)), [], 0), ('comprehension', ('Name', (1, 22, 1, 23), 'm', ('Store',)), ('Name', (1, 27, 1, 28), 'p', ('Load',)), [('Name', (1, 32, 1, 33), 'g', ('Load',))], 0)]))], []), -('Module', [('Expr', (1, 0, 1, 20), ('DictComp', (1, 0, 1, 20), ('Name', (1, 1, 1, 2), 'a', ('Load',)), ('Name', (1, 5, 1, 6), 'b', ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 14), [('Name', (1, 11, 1, 12), 'v', ('Store',)), ('Name', (1, 13, 1, 14), 'w', ('Store',))], ('Store',)), ('Name', (1, 18, 1, 19), 'x', ('Load',)), [], 0)]))], []), -('Module', [('Expr', (1, 0, 1, 19), ('SetComp', (1, 0, 1, 19), ('Name', (1, 1, 1, 2), 'r', ('Load',)), [('comprehension', ('Name', (1, 7, 1, 8), 'l', ('Store',)), ('Name', (1, 12, 1, 13), 'x', ('Load',)), [('Name', (1, 17, 1, 18), 'g', ('Load',))], 0)]))], []), -('Module', [('Expr', (1, 0, 1, 16), ('SetComp', (1, 0, 1, 16), ('Name', (1, 1, 1, 2), 'r', ('Load',)), [('comprehension', ('Tuple', (1, 7, 1, 10), [('Name', (1, 7, 1, 8), 'l', ('Store',)), ('Name', (1, 9, 1, 10), 'm', ('Store',))], ('Store',)), ('Name', (1, 14, 1, 15), 'x', ('Load',)), [], 0)]))], []), -('Module', [('AsyncFunctionDef', (1, 0, 3, 18), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (2, 1, 2, 17), ('Constant', (2, 1, 2, 17), 'async function', None)), ('Expr', (3, 1, 3, 18), ('Await', (3, 1, 3, 18), ('Call', (3, 7, 3, 18), ('Name', (3, 7, 3, 16), 'something', ('Load',)), [], [])))], [], None, None, [])], []), -('Module', [('AsyncFunctionDef', (1, 0, 3, 8), 'f', ('arguments', [], [], None, [], [], None, []), [('AsyncFor', (2, 1, 3, 8), ('Name', (2, 11, 2, 12), 'e', ('Store',)), ('Name', (2, 16, 2, 17), 'i', ('Load',)), [('Expr', (2, 19, 2, 20), ('Constant', (2, 19, 2, 20), 1, None))], [('Expr', (3, 7, 3, 8), ('Constant', (3, 7, 3, 8), 2, None))], None)], [], None, None, [])], []), -('Module', [('AsyncFunctionDef', (1, 0, 2, 21), 'f', ('arguments', [], [], None, [], [], None, []), [('AsyncWith', (2, 1, 2, 21), [('withitem', ('Name', (2, 12, 2, 13), 'a', ('Load',)), ('Name', (2, 17, 2, 18), 'b', ('Store',)))], [('Expr', (2, 20, 2, 21), ('Constant', (2, 20, 2, 21), 1, None))], None)], [], None, None, [])], []), -('Module', [('Expr', (1, 0, 1, 14), ('Dict', (1, 0, 1, 14), [None, ('Constant', (1, 10, 1, 11), 2, None)], [('Dict', (1, 3, 1, 8), [('Constant', (1, 4, 1, 5), 1, None)], [('Constant', (1, 6, 1, 7), 2, None)]), ('Constant', (1, 12, 1, 13), 3, None)]))], []), -('Module', [('Expr', (1, 0, 1, 12), ('Set', (1, 0, 1, 12), [('Starred', (1, 1, 1, 8), ('Set', (1, 2, 1, 8), [('Constant', (1, 3, 1, 4), 1, None), ('Constant', (1, 6, 1, 7), 2, None)]), ('Load',)), ('Constant', (1, 10, 1, 11), 3, None)]))], []), -('Module', [('AsyncFunctionDef', (1, 0, 2, 21), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (2, 1, 2, 21), ('ListComp', (2, 1, 2, 21), ('Name', (2, 2, 2, 3), 'i', ('Load',)), [('comprehension', ('Name', (2, 14, 2, 15), 'b', ('Store',)), ('Name', (2, 19, 2, 20), 'c', ('Load',)), [], 1)]))], [], None, None, [])], []), -('Module', [('FunctionDef', (4, 0, 4, 13), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (4, 9, 4, 13))], [('Name', (1, 1, 1, 6), 'deco1', ('Load',)), ('Call', (2, 1, 2, 8), ('Name', (2, 1, 2, 6), 'deco2', ('Load',)), [], []), ('Call', (3, 1, 3, 9), ('Name', (3, 1, 3, 6), 'deco3', ('Load',)), [('Constant', (3, 7, 3, 8), 1, None)], [])], None, None, [])], []), -('Module', [('AsyncFunctionDef', (4, 0, 4, 19), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (4, 15, 4, 19))], [('Name', (1, 1, 1, 6), 'deco1', ('Load',)), ('Call', (2, 1, 2, 8), ('Name', (2, 1, 2, 6), 'deco2', ('Load',)), [], []), ('Call', (3, 1, 3, 9), ('Name', (3, 1, 3, 6), 'deco3', ('Load',)), [('Constant', (3, 7, 3, 8), 1, None)], [])], None, None, [])], []), -('Module', [('ClassDef', (4, 0, 4, 13), 'C', [], [], [('Pass', (4, 9, 4, 13))], [('Name', (1, 1, 1, 6), 'deco1', ('Load',)), ('Call', (2, 1, 2, 8), ('Name', (2, 1, 2, 6), 'deco2', ('Load',)), [], []), ('Call', (3, 1, 3, 9), ('Name', (3, 1, 3, 6), 'deco3', ('Load',)), [('Constant', (3, 7, 3, 8), 1, None)], [])], [])], []), -('Module', [('FunctionDef', (2, 0, 2, 13), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (2, 9, 2, 13))], [('Call', (1, 1, 1, 19), ('Name', (1, 1, 1, 5), 'deco', ('Load',)), [('GeneratorExp', (1, 5, 1, 19), ('Name', (1, 6, 1, 7), 'a', ('Load',)), [('comprehension', ('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 17, 1, 18), 'b', ('Load',)), [], 0)])], [])], None, None, [])], []), -('Module', [('FunctionDef', (2, 0, 2, 13), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (2, 9, 2, 13))], [('Attribute', (1, 1, 1, 6), ('Attribute', (1, 1, 1, 4), ('Name', (1, 1, 1, 2), 'a', ('Load',)), 'b', ('Load',)), 'c', ('Load',))], None, None, [])], []), -('Module', [('Expr', (1, 0, 1, 8), ('NamedExpr', (1, 1, 1, 7), ('Name', (1, 1, 1, 2), 'a', ('Store',)), ('Constant', (1, 6, 1, 7), 1, None)))], []), -('Module', [('FunctionDef', (1, 0, 1, 18), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [], None, [], [], None, []), [('Pass', (1, 14, 1, 18))], [], None, None, [])], []), -('Module', [('FunctionDef', (1, 0, 1, 26), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 12, 1, 13), 'c', None, None), ('arg', (1, 15, 1, 16), 'd', None, None), ('arg', (1, 18, 1, 19), 'e', None, None)], None, [], [], None, []), [('Pass', (1, 22, 1, 26))], [], None, None, [])], []), -('Module', [('FunctionDef', (1, 0, 1, 29), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 12, 1, 13), 'c', None, None)], None, [('arg', (1, 18, 1, 19), 'd', None, None), ('arg', (1, 21, 1, 22), 'e', None, None)], [None, None], None, []), [('Pass', (1, 25, 1, 29))], [], None, None, [])], []), -('Module', [('FunctionDef', (1, 0, 1, 39), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 12, 1, 13), 'c', None, None)], None, [('arg', (1, 18, 1, 19), 'd', None, None), ('arg', (1, 21, 1, 22), 'e', None, None)], [None, None], ('arg', (1, 26, 1, 32), 'kwargs', None, None), []), [('Pass', (1, 35, 1, 39))], [], None, None, [])], []), -('Module', [('FunctionDef', (1, 0, 1, 20), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [], None, [], [], None, [('Constant', (1, 8, 1, 9), 1, None)]), [('Pass', (1, 16, 1, 20))], [], None, None, [])], []), -('Module', [('FunctionDef', (1, 0, 1, 29), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None), ('arg', (1, 19, 1, 20), 'c', None, None)], None, [], [], None, [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None), ('Constant', (1, 21, 1, 22), 4, None)]), [('Pass', (1, 25, 1, 29))], [], None, None, [])], []), -('Module', [('FunctionDef', (1, 0, 1, 32), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None)], None, [('arg', (1, 22, 1, 23), 'c', None, None)], [('Constant', (1, 24, 1, 25), 4, None)], None, [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None)]), [('Pass', (1, 28, 1, 32))], [], None, None, [])], []), -('Module', [('FunctionDef', (1, 0, 1, 30), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None)], None, [('arg', (1, 22, 1, 23), 'c', None, None)], [None], None, [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None)]), [('Pass', (1, 26, 1, 30))], [], None, None, [])], []), -('Module', [('FunctionDef', (1, 0, 1, 42), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None)], None, [('arg', (1, 22, 1, 23), 'c', None, None)], [('Constant', (1, 24, 1, 25), 4, None)], ('arg', (1, 29, 1, 35), 'kwargs', None, None), [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None)]), [('Pass', (1, 38, 1, 42))], [], None, None, [])], []), -('Module', [('FunctionDef', (1, 0, 1, 40), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None)], None, [('arg', (1, 22, 1, 23), 'c', None, None)], [None], ('arg', (1, 27, 1, 33), 'kwargs', None, None), [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None)]), [('Pass', (1, 36, 1, 40))], [], None, None, [])], []), -('Module', [('TypeAlias', (1, 0, 1, 12), ('Name', (1, 5, 1, 6), 'X', ('Store',)), [], ('Name', (1, 9, 1, 12), 'int', ('Load',)))], []), -('Module', [('TypeAlias', (1, 0, 1, 15), ('Name', (1, 5, 1, 6), 'X', ('Store',)), [('TypeVar', (1, 7, 1, 8), 'T', None)], ('Name', (1, 12, 1, 15), 'int', ('Load',)))], []), -('Module', [('TypeAlias', (1, 0, 1, 32), ('Name', (1, 5, 1, 6), 'X', ('Store',)), [('TypeVar', (1, 7, 1, 8), 'T', None), ('TypeVarTuple', (1, 10, 1, 13), 'Ts'), ('ParamSpec', (1, 15, 1, 18), 'P')], ('Tuple', (1, 22, 1, 32), [('Name', (1, 23, 1, 24), 'T', ('Load',)), ('Name', (1, 26, 1, 28), 'Ts', ('Load',)), ('Name', (1, 30, 1, 31), 'P', ('Load',))], ('Load',)))], []), -('Module', [('TypeAlias', (1, 0, 1, 37), ('Name', (1, 5, 1, 6), 'X', ('Store',)), [('TypeVar', (1, 7, 1, 13), 'T', ('Name', (1, 10, 1, 13), 'int', ('Load',))), ('TypeVarTuple', (1, 15, 1, 18), 'Ts'), ('ParamSpec', (1, 20, 1, 23), 'P')], ('Tuple', (1, 27, 1, 37), [('Name', (1, 28, 1, 29), 'T', ('Load',)), ('Name', (1, 31, 1, 33), 'Ts', ('Load',)), ('Name', (1, 35, 1, 36), 'P', ('Load',))], ('Load',)))], []), -('Module', [('TypeAlias', (1, 0, 1, 44), ('Name', (1, 5, 1, 6), 'X', ('Store',)), [('TypeVar', (1, 7, 1, 20), 'T', ('Tuple', (1, 10, 1, 20), [('Name', (1, 11, 1, 14), 'int', ('Load',)), ('Name', (1, 16, 1, 19), 'str', ('Load',))], ('Load',))), ('TypeVarTuple', (1, 22, 1, 25), 'Ts'), ('ParamSpec', (1, 27, 1, 30), 'P')], ('Tuple', (1, 34, 1, 44), [('Name', (1, 35, 1, 36), 'T', ('Load',)), ('Name', (1, 38, 1, 40), 'Ts', ('Load',)), ('Name', (1, 42, 1, 43), 'P', ('Load',))], ('Load',)))], []), -('Module', [('ClassDef', (1, 0, 1, 16), 'X', [], [], [('Pass', (1, 12, 1, 16))], [], [('TypeVar', (1, 8, 1, 9), 'T', None)])], []), -('Module', [('ClassDef', (1, 0, 1, 26), 'X', [], [], [('Pass', (1, 22, 1, 26))], [], [('TypeVar', (1, 8, 1, 9), 'T', None), ('TypeVarTuple', (1, 11, 1, 14), 'Ts'), ('ParamSpec', (1, 16, 1, 19), 'P')])], []), -('Module', [('ClassDef', (1, 0, 1, 31), 'X', [], [], [('Pass', (1, 27, 1, 31))], [], [('TypeVar', (1, 8, 1, 14), 'T', ('Name', (1, 11, 1, 14), 'int', ('Load',))), ('TypeVarTuple', (1, 16, 1, 19), 'Ts'), ('ParamSpec', (1, 21, 1, 24), 'P')])], []), -('Module', [('ClassDef', (1, 0, 1, 38), 'X', [], [], [('Pass', (1, 34, 1, 38))], [], [('TypeVar', (1, 8, 1, 21), 'T', ('Tuple', (1, 11, 1, 21), [('Name', (1, 12, 1, 15), 'int', ('Load',)), ('Name', (1, 17, 1, 20), 'str', ('Load',))], ('Load',))), ('TypeVarTuple', (1, 23, 1, 26), 'Ts'), ('ParamSpec', (1, 28, 1, 31), 'P')])], []), -('Module', [('FunctionDef', (1, 0, 1, 16), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 12, 1, 16))], [], None, None, [('TypeVar', (1, 6, 1, 7), 'T', None)])], []), -('Module', [('FunctionDef', (1, 0, 1, 26), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 22, 1, 26))], [], None, None, [('TypeVar', (1, 6, 1, 7), 'T', None), ('TypeVarTuple', (1, 9, 1, 12), 'Ts'), ('ParamSpec', (1, 14, 1, 17), 'P')])], []), -('Module', [('FunctionDef', (1, 0, 1, 31), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 27, 1, 31))], [], None, None, [('TypeVar', (1, 6, 1, 12), 'T', ('Name', (1, 9, 1, 12), 'int', ('Load',))), ('TypeVarTuple', (1, 14, 1, 17), 'Ts'), ('ParamSpec', (1, 19, 1, 22), 'P')])], []), -('Module', [('FunctionDef', (1, 0, 1, 38), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 34, 1, 38))], [], None, None, [('TypeVar', (1, 6, 1, 19), 'T', ('Tuple', (1, 9, 1, 19), [('Name', (1, 10, 1, 13), 'int', ('Load',)), ('Name', (1, 15, 1, 18), 'str', ('Load',))], ('Load',))), ('TypeVarTuple', (1, 21, 1, 24), 'Ts'), ('ParamSpec', (1, 26, 1, 29), 'P')])], []), -] -single_results = [ -('Interactive', [('Expr', (1, 0, 1, 3), ('BinOp', (1, 0, 1, 3), ('Constant', (1, 0, 1, 1), 1, None), ('Add',), ('Constant', (1, 2, 1, 3), 2, None)))]), -] -eval_results = [ -('Expression', ('Constant', (1, 0, 1, 4), None, None)), -('Expression', ('BoolOp', (1, 0, 1, 7), ('And',), [('Name', (1, 0, 1, 1), 'a', ('Load',)), ('Name', (1, 6, 1, 7), 'b', ('Load',))])), -('Expression', ('BinOp', (1, 0, 1, 5), ('Name', (1, 0, 1, 1), 'a', ('Load',)), ('Add',), ('Name', (1, 4, 1, 5), 'b', ('Load',)))), -('Expression', ('UnaryOp', (1, 0, 1, 5), ('Not',), ('Name', (1, 4, 1, 5), 'v', ('Load',)))), -('Expression', ('Lambda', (1, 0, 1, 11), ('arguments', [], [], None, [], [], None, []), ('Constant', (1, 7, 1, 11), None, None))), -('Expression', ('Dict', (1, 0, 1, 7), [('Constant', (1, 2, 1, 3), 1, None)], [('Constant', (1, 4, 1, 5), 2, None)])), -('Expression', ('Dict', (1, 0, 1, 2), [], [])), -('Expression', ('Set', (1, 0, 1, 7), [('Constant', (1, 1, 1, 5), None, None)])), -('Expression', ('Dict', (1, 0, 5, 6), [('Constant', (2, 6, 2, 7), 1, None)], [('Constant', (4, 10, 4, 11), 2, None)])), -('Expression', ('ListComp', (1, 0, 1, 19), ('Name', (1, 1, 1, 2), 'a', ('Load',)), [('comprehension', ('Name', (1, 7, 1, 8), 'b', ('Store',)), ('Name', (1, 12, 1, 13), 'c', ('Load',)), [('Name', (1, 17, 1, 18), 'd', ('Load',))], 0)])), -('Expression', ('GeneratorExp', (1, 0, 1, 19), ('Name', (1, 1, 1, 2), 'a', ('Load',)), [('comprehension', ('Name', (1, 7, 1, 8), 'b', ('Store',)), ('Name', (1, 12, 1, 13), 'c', ('Load',)), [('Name', (1, 17, 1, 18), 'd', ('Load',))], 0)])), -('Expression', ('ListComp', (1, 0, 1, 20), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 14), [('Name', (1, 11, 1, 12), 'a', ('Store',)), ('Name', (1, 13, 1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 18, 1, 19), 'c', ('Load',)), [], 0)])), -('Expression', ('ListComp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), -('Expression', ('ListComp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), -('Expression', ('SetComp', (1, 0, 1, 20), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 14), [('Name', (1, 11, 1, 12), 'a', ('Store',)), ('Name', (1, 13, 1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 18, 1, 19), 'c', ('Load',)), [], 0)])), -('Expression', ('SetComp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), -('Expression', ('SetComp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), -('Expression', ('GeneratorExp', (1, 0, 1, 20), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 14), [('Name', (1, 11, 1, 12), 'a', ('Store',)), ('Name', (1, 13, 1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 18, 1, 19), 'c', ('Load',)), [], 0)])), -('Expression', ('GeneratorExp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), -('Expression', ('GeneratorExp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), -('Expression', ('Compare', (1, 0, 1, 9), ('Constant', (1, 0, 1, 1), 1, None), [('Lt',), ('Lt',)], [('Constant', (1, 4, 1, 5), 2, None), ('Constant', (1, 8, 1, 9), 3, None)])), -('Expression', ('Call', (1, 0, 1, 17), ('Name', (1, 0, 1, 1), 'f', ('Load',)), [('Constant', (1, 2, 1, 3), 1, None), ('Constant', (1, 4, 1, 5), 2, None), ('Starred', (1, 10, 1, 12), ('Name', (1, 11, 1, 12), 'd', ('Load',)), ('Load',))], [('keyword', (1, 6, 1, 9), 'c', ('Constant', (1, 8, 1, 9), 3, None)), ('keyword', (1, 13, 1, 16), None, ('Name', (1, 15, 1, 16), 'e', ('Load',)))])), -('Expression', ('Call', (1, 0, 1, 10), ('Name', (1, 0, 1, 1), 'f', ('Load',)), [('Starred', (1, 2, 1, 9), ('List', (1, 3, 1, 9), [('Constant', (1, 4, 1, 5), 0, None), ('Constant', (1, 7, 1, 8), 1, None)], ('Load',)), ('Load',))], [])), -('Expression', ('Call', (1, 0, 1, 15), ('Name', (1, 0, 1, 1), 'f', ('Load',)), [('GeneratorExp', (1, 1, 1, 15), ('Name', (1, 2, 1, 3), 'a', ('Load',)), [('comprehension', ('Name', (1, 8, 1, 9), 'a', ('Store',)), ('Name', (1, 13, 1, 14), 'b', ('Load',)), [], 0)])], [])), -('Expression', ('Constant', (1, 0, 1, 2), 10, None)), -('Expression', ('Constant', (1, 0, 1, 8), 'string', None)), -('Expression', ('Attribute', (1, 0, 1, 3), ('Name', (1, 0, 1, 1), 'a', ('Load',)), 'b', ('Load',))), -('Expression', ('Subscript', (1, 0, 1, 6), ('Name', (1, 0, 1, 1), 'a', ('Load',)), ('Slice', (1, 2, 1, 5), ('Name', (1, 2, 1, 3), 'b', ('Load',)), ('Name', (1, 4, 1, 5), 'c', ('Load',)), None), ('Load',))), -('Expression', ('Name', (1, 0, 1, 1), 'v', ('Load',))), -('Expression', ('List', (1, 0, 1, 7), [('Constant', (1, 1, 1, 2), 1, None), ('Constant', (1, 3, 1, 4), 2, None), ('Constant', (1, 5, 1, 6), 3, None)], ('Load',))), -('Expression', ('List', (1, 0, 1, 2), [], ('Load',))), -('Expression', ('Tuple', (1, 0, 1, 5), [('Constant', (1, 0, 1, 1), 1, None), ('Constant', (1, 2, 1, 3), 2, None), ('Constant', (1, 4, 1, 5), 3, None)], ('Load',))), -('Expression', ('Tuple', (1, 0, 1, 7), [('Constant', (1, 1, 1, 2), 1, None), ('Constant', (1, 3, 1, 4), 2, None), ('Constant', (1, 5, 1, 6), 3, None)], ('Load',))), -('Expression', ('Tuple', (1, 0, 1, 2), [], ('Load',))), -('Expression', ('Call', (1, 0, 1, 17), ('Attribute', (1, 0, 1, 7), ('Attribute', (1, 0, 1, 5), ('Attribute', (1, 0, 1, 3), ('Name', (1, 0, 1, 1), 'a', ('Load',)), 'b', ('Load',)), 'c', ('Load',)), 'd', ('Load',)), [('Subscript', (1, 8, 1, 16), ('Attribute', (1, 8, 1, 11), ('Name', (1, 8, 1, 9), 'a', ('Load',)), 'b', ('Load',)), ('Slice', (1, 12, 1, 15), ('Constant', (1, 12, 1, 13), 1, None), ('Constant', (1, 14, 1, 15), 2, None), None), ('Load',))], [])), -] -main() diff --git a/Lib/test/test_ast/__init__.py b/Lib/test/test_ast/__init__.py new file mode 100644 index 00000000..9a89d27b --- /dev/null +++ b/Lib/test/test_ast/__init__.py @@ -0,0 +1,7 @@ +import os + +from test import support + + +def load_tests(*args): + return support.load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_ast/snippets.py b/Lib/test/test_ast/snippets.py new file mode 100644 index 00000000..6ed466fe --- /dev/null +++ b/Lib/test/test_ast/snippets.py @@ -0,0 +1,400 @@ +import ast +import sys + +from test.test_ast.utils import to_tuple + + +# These tests are compiled through "exec" +# There should be at least one test per statement +exec_tests = [ + # None + "None", + # Module docstring + "'module docstring'", + # FunctionDef + "def f(): pass", + # FunctionDef with docstring + "def f(): 'function docstring'", + # FunctionDef with arg + "def f(a): pass", + # FunctionDef with arg and default value + "def f(a=0): pass", + # FunctionDef with varargs + "def f(*args): pass", + # FunctionDef with varargs as TypeVarTuple + "def f(*args: *Ts): pass", + # FunctionDef with varargs as unpacked Tuple + "def f(*args: *tuple[int, ...]): pass", + # FunctionDef with varargs as unpacked Tuple *and* TypeVarTuple + "def f(*args: *tuple[int, *Ts]): pass", + # FunctionDef with kwargs + "def f(**kwargs): pass", + # FunctionDef with all kind of args and docstring + "def f(a, b=1, c=None, d=[], e={}, *args, f=42, **kwargs): 'doc for f()'", + # FunctionDef with type annotation on return involving unpacking + "def f() -> tuple[*Ts]: pass", + "def f() -> tuple[int, *Ts]: pass", + "def f() -> tuple[int, *tuple[int, ...]]: pass", + # ClassDef + "class C:pass", + # ClassDef with docstring + "class C: 'docstring for class C'", + # ClassDef, new style class + "class C(object): pass", + # Return + "def f():return 1", + # Delete + "del v", + # Assign + "v = 1", + "a,b = c", + "(a,b) = c", + "[a,b] = c", + # AnnAssign with unpacked types + "x: tuple[*Ts]", + "x: tuple[int, *Ts]", + "x: tuple[int, *tuple[str, ...]]", + # AugAssign + "v += 1", + # For + "for v in v:pass", + # While + "while v:pass", + # If + "if v:pass", + # If-Elif + "if a:\n pass\nelif b:\n pass", + # If-Elif-Else + "if a:\n pass\nelif b:\n pass\nelse:\n pass", + # With + "with x as y: pass", + "with x as y, z as q: pass", + # Raise + "raise Exception('string')", + # TryExcept + "try:\n pass\nexcept Exception:\n pass", + # TryFinally + "try:\n pass\nfinally:\n pass", + # TryStarExcept + "try:\n pass\nexcept* Exception:\n pass", + # Assert + "assert v", + # Import + "import sys", + # ImportFrom + "from sys import v", + # Global + "global v", + # Expr + "1", + # Pass, + "pass", + # Break + "for v in v:break", + # Continue + "for v in v:continue", + # for statements with naked tuples (see http://bugs.python.org/issue6704) + "for a,b in c: pass", + "for (a,b) in c: pass", + "for [a,b] in c: pass", + # Multiline generator expression (test for .lineno & .col_offset) + """( + ( + Aa + , + Bb + ) + for + Aa + , + Bb in Cc + )""", + # dictcomp + "{a : b for w in x for m in p if g}", + # dictcomp with naked tuple + "{a : b for v,w in x}", + # setcomp + "{r for l in x if g}", + # setcomp with naked tuple + "{r for l,m in x}", + # AsyncFunctionDef + "async def f():\n 'async function'\n await something()", + # AsyncFor + "async def f():\n async for e in i: 1\n else: 2", + # AsyncWith + "async def f():\n async with a as b: 1", + # PEP 448: Additional Unpacking Generalizations + "{**{1:2}, 2:3}", + "{*{1, 2}, 3}", + # Asynchronous comprehensions + "async def f():\n [i async for b in c]", + # Decorated FunctionDef + "@deco1\n@deco2()\n@deco3(1)\ndef f(): pass", + # Decorated AsyncFunctionDef + "@deco1\n@deco2()\n@deco3(1)\nasync def f(): pass", + # Decorated ClassDef + "@deco1\n@deco2()\n@deco3(1)\nclass C: pass", + # Decorator with generator argument + "@deco(a for a in b)\ndef f(): pass", + # Decorator with attribute + "@a.b.c\ndef f(): pass", + # Simple assignment expression + "(a := 1)", + # Positional-only arguments + "def f(a, /,): pass", + "def f(a, /, c, d, e): pass", + "def f(a, /, c, *, d, e): pass", + "def f(a, /, c, *, d, e, **kwargs): pass", + # Positional-only arguments with defaults + "def f(a=1, /,): pass", + "def f(a=1, /, b=2, c=4): pass", + "def f(a=1, /, b=2, *, c=4): pass", + "def f(a=1, /, b=2, *, c): pass", + "def f(a=1, /, b=2, *, c=4, **kwargs): pass", + "def f(a=1, /, b=2, *, c, **kwargs): pass", + # Type aliases + "type X = int", + "type X[T] = int", + "type X[T, *Ts, **P] = (T, Ts, P)", + "type X[T: int, *Ts, **P] = (T, Ts, P)", + "type X[T: (int, str), *Ts, **P] = (T, Ts, P)", + # Generic classes + "class X[T]: pass", + "class X[T, *Ts, **P]: pass", + "class X[T: int, *Ts, **P]: pass", + "class X[T: (int, str), *Ts, **P]: pass", + # Generic functions + "def f[T](): pass", + "def f[T, *Ts, **P](): pass", + "def f[T: int, *Ts, **P](): pass", + "def f[T: (int, str), *Ts, **P](): pass", +] + +# These are compiled through "single" +# because of overlap with "eval", it just tests what +# can't be tested with "eval" +single_tests = ["1+2"] + +# These are compiled through "eval" +# It should test all expressions +eval_tests = [ + # None + "None", + # BoolOp + "a and b", + # BinOp + "a + b", + # UnaryOp + "not v", + # Lambda + "lambda:None", + # Dict + "{ 1:2 }", + # Empty dict + "{}", + # Set + "{None,}", + # Multiline dict (test for .lineno & .col_offset) + """{ + 1 + : + 2 + }""", + # ListComp + "[a for b in c if d]", + # GeneratorExp + "(a for b in c if d)", + # Comprehensions with multiple for targets + "[(a,b) for a,b in c]", + "[(a,b) for (a,b) in c]", + "[(a,b) for [a,b] in c]", + "{(a,b) for a,b in c}", + "{(a,b) for (a,b) in c}", + "{(a,b) for [a,b] in c}", + "((a,b) for a,b in c)", + "((a,b) for (a,b) in c)", + "((a,b) for [a,b] in c)", + # Yield - yield expressions can't work outside a function + # + # Compare + "1 < 2 < 3", + # Call + "f(1,2,c=3,*d,**e)", + # Call with multi-character starred + "f(*[0, 1])", + # Call with a generator argument + "f(a for a in b)", + # Num + "10", + # Str + "'string'", + # Attribute + "a.b", + # Subscript + "a[b:c]", + # Name + "v", + # List + "[1,2,3]", + # Empty list + "[]", + # Tuple + "1,2,3", + # Tuple + "(1,2,3)", + # Empty tuple + "()", + # Combination + "a.b.c.d(a.b[1:2])", +] + + +def main(): + if __name__ != '__main__': + return + if sys.argv[1:] == ['-g']: + for statements, kind in ((exec_tests, "exec"), (single_tests, "single"), + (eval_tests, "eval")): + print(kind+"_results = [") + for statement in statements: + tree = ast.parse(statement, "?", kind) + print("%r," % (to_tuple(tree),)) + print("]") + print("main()") + raise SystemExit + unittest.main() + +#### EVERYTHING BELOW IS GENERATED BY python Lib/test/test_ast/snippets.py -g ##### +exec_results = [ +('Module', [('Expr', (1, 0, 1, 4), ('Constant', (1, 0, 1, 4), None, None))], []), +('Module', [('Expr', (1, 0, 1, 18), ('Constant', (1, 0, 1, 18), 'module docstring', None))], []), +('Module', [('FunctionDef', (1, 0, 1, 13), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 9, 1, 13))], [], None, None, [])], []), +('Module', [('FunctionDef', (1, 0, 1, 29), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (1, 9, 1, 29), ('Constant', (1, 9, 1, 29), 'function docstring', None))], [], None, None, [])], []), +('Module', [('FunctionDef', (1, 0, 1, 14), 'f', ('arguments', [], [('arg', (1, 6, 1, 7), 'a', None, None)], None, [], [], None, []), [('Pass', (1, 10, 1, 14))], [], None, None, [])], []), +('Module', [('FunctionDef', (1, 0, 1, 16), 'f', ('arguments', [], [('arg', (1, 6, 1, 7), 'a', None, None)], None, [], [], None, [('Constant', (1, 8, 1, 9), 0, None)]), [('Pass', (1, 12, 1, 16))], [], None, None, [])], []), +('Module', [('FunctionDef', (1, 0, 1, 18), 'f', ('arguments', [], [], ('arg', (1, 7, 1, 11), 'args', None, None), [], [], None, []), [('Pass', (1, 14, 1, 18))], [], None, None, [])], []), +('Module', [('FunctionDef', (1, 0, 1, 23), 'f', ('arguments', [], [], ('arg', (1, 7, 1, 16), 'args', ('Starred', (1, 13, 1, 16), ('Name', (1, 14, 1, 16), 'Ts', ('Load',)), ('Load',)), None), [], [], None, []), [('Pass', (1, 19, 1, 23))], [], None, None, [])], []), +('Module', [('FunctionDef', (1, 0, 1, 36), 'f', ('arguments', [], [], ('arg', (1, 7, 1, 29), 'args', ('Starred', (1, 13, 1, 29), ('Subscript', (1, 14, 1, 29), ('Name', (1, 14, 1, 19), 'tuple', ('Load',)), ('Tuple', (1, 20, 1, 28), [('Name', (1, 20, 1, 23), 'int', ('Load',)), ('Constant', (1, 25, 1, 28), Ellipsis, None)], ('Load',)), ('Load',)), ('Load',)), None), [], [], None, []), [('Pass', (1, 32, 1, 36))], [], None, None, [])], []), +('Module', [('FunctionDef', (1, 0, 1, 36), 'f', ('arguments', [], [], ('arg', (1, 7, 1, 29), 'args', ('Starred', (1, 13, 1, 29), ('Subscript', (1, 14, 1, 29), ('Name', (1, 14, 1, 19), 'tuple', ('Load',)), ('Tuple', (1, 20, 1, 28), [('Name', (1, 20, 1, 23), 'int', ('Load',)), ('Starred', (1, 25, 1, 28), ('Name', (1, 26, 1, 28), 'Ts', ('Load',)), ('Load',))], ('Load',)), ('Load',)), ('Load',)), None), [], [], None, []), [('Pass', (1, 32, 1, 36))], [], None, None, [])], []), +('Module', [('FunctionDef', (1, 0, 1, 21), 'f', ('arguments', [], [], None, [], [], ('arg', (1, 8, 1, 14), 'kwargs', None, None), []), [('Pass', (1, 17, 1, 21))], [], None, None, [])], []), +('Module', [('FunctionDef', (1, 0, 1, 71), 'f', ('arguments', [], [('arg', (1, 6, 1, 7), 'a', None, None), ('arg', (1, 9, 1, 10), 'b', None, None), ('arg', (1, 14, 1, 15), 'c', None, None), ('arg', (1, 22, 1, 23), 'd', None, None), ('arg', (1, 28, 1, 29), 'e', None, None)], ('arg', (1, 35, 1, 39), 'args', None, None), [('arg', (1, 41, 1, 42), 'f', None, None)], [('Constant', (1, 43, 1, 45), 42, None)], ('arg', (1, 49, 1, 55), 'kwargs', None, None), [('Constant', (1, 11, 1, 12), 1, None), ('Constant', (1, 16, 1, 20), None, None), ('List', (1, 24, 1, 26), [], ('Load',)), ('Dict', (1, 30, 1, 32), [], [])]), [('Expr', (1, 58, 1, 71), ('Constant', (1, 58, 1, 71), 'doc for f()', None))], [], None, None, [])], []), +('Module', [('FunctionDef', (1, 0, 1, 27), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 23, 1, 27))], [], ('Subscript', (1, 11, 1, 21), ('Name', (1, 11, 1, 16), 'tuple', ('Load',)), ('Tuple', (1, 17, 1, 20), [('Starred', (1, 17, 1, 20), ('Name', (1, 18, 1, 20), 'Ts', ('Load',)), ('Load',))], ('Load',)), ('Load',)), None, [])], []), +('Module', [('FunctionDef', (1, 0, 1, 32), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 28, 1, 32))], [], ('Subscript', (1, 11, 1, 26), ('Name', (1, 11, 1, 16), 'tuple', ('Load',)), ('Tuple', (1, 17, 1, 25), [('Name', (1, 17, 1, 20), 'int', ('Load',)), ('Starred', (1, 22, 1, 25), ('Name', (1, 23, 1, 25), 'Ts', ('Load',)), ('Load',))], ('Load',)), ('Load',)), None, [])], []), +('Module', [('FunctionDef', (1, 0, 1, 45), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 41, 1, 45))], [], ('Subscript', (1, 11, 1, 39), ('Name', (1, 11, 1, 16), 'tuple', ('Load',)), ('Tuple', (1, 17, 1, 38), [('Name', (1, 17, 1, 20), 'int', ('Load',)), ('Starred', (1, 22, 1, 38), ('Subscript', (1, 23, 1, 38), ('Name', (1, 23, 1, 28), 'tuple', ('Load',)), ('Tuple', (1, 29, 1, 37), [('Name', (1, 29, 1, 32), 'int', ('Load',)), ('Constant', (1, 34, 1, 37), Ellipsis, None)], ('Load',)), ('Load',)), ('Load',))], ('Load',)), ('Load',)), None, [])], []), +('Module', [('ClassDef', (1, 0, 1, 12), 'C', [], [], [('Pass', (1, 8, 1, 12))], [], [])], []), +('Module', [('ClassDef', (1, 0, 1, 32), 'C', [], [], [('Expr', (1, 9, 1, 32), ('Constant', (1, 9, 1, 32), 'docstring for class C', None))], [], [])], []), +('Module', [('ClassDef', (1, 0, 1, 21), 'C', [('Name', (1, 8, 1, 14), 'object', ('Load',))], [], [('Pass', (1, 17, 1, 21))], [], [])], []), +('Module', [('FunctionDef', (1, 0, 1, 16), 'f', ('arguments', [], [], None, [], [], None, []), [('Return', (1, 8, 1, 16), ('Constant', (1, 15, 1, 16), 1, None))], [], None, None, [])], []), +('Module', [('Delete', (1, 0, 1, 5), [('Name', (1, 4, 1, 5), 'v', ('Del',))])], []), +('Module', [('Assign', (1, 0, 1, 5), [('Name', (1, 0, 1, 1), 'v', ('Store',))], ('Constant', (1, 4, 1, 5), 1, None), None)], []), +('Module', [('Assign', (1, 0, 1, 7), [('Tuple', (1, 0, 1, 3), [('Name', (1, 0, 1, 1), 'a', ('Store',)), ('Name', (1, 2, 1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 6, 1, 7), 'c', ('Load',)), None)], []), +('Module', [('Assign', (1, 0, 1, 9), [('Tuple', (1, 0, 1, 5), [('Name', (1, 1, 1, 2), 'a', ('Store',)), ('Name', (1, 3, 1, 4), 'b', ('Store',))], ('Store',))], ('Name', (1, 8, 1, 9), 'c', ('Load',)), None)], []), +('Module', [('Assign', (1, 0, 1, 9), [('List', (1, 0, 1, 5), [('Name', (1, 1, 1, 2), 'a', ('Store',)), ('Name', (1, 3, 1, 4), 'b', ('Store',))], ('Store',))], ('Name', (1, 8, 1, 9), 'c', ('Load',)), None)], []), +('Module', [('AnnAssign', (1, 0, 1, 13), ('Name', (1, 0, 1, 1), 'x', ('Store',)), ('Subscript', (1, 3, 1, 13), ('Name', (1, 3, 1, 8), 'tuple', ('Load',)), ('Tuple', (1, 9, 1, 12), [('Starred', (1, 9, 1, 12), ('Name', (1, 10, 1, 12), 'Ts', ('Load',)), ('Load',))], ('Load',)), ('Load',)), None, 1)], []), +('Module', [('AnnAssign', (1, 0, 1, 18), ('Name', (1, 0, 1, 1), 'x', ('Store',)), ('Subscript', (1, 3, 1, 18), ('Name', (1, 3, 1, 8), 'tuple', ('Load',)), ('Tuple', (1, 9, 1, 17), [('Name', (1, 9, 1, 12), 'int', ('Load',)), ('Starred', (1, 14, 1, 17), ('Name', (1, 15, 1, 17), 'Ts', ('Load',)), ('Load',))], ('Load',)), ('Load',)), None, 1)], []), +('Module', [('AnnAssign', (1, 0, 1, 31), ('Name', (1, 0, 1, 1), 'x', ('Store',)), ('Subscript', (1, 3, 1, 31), ('Name', (1, 3, 1, 8), 'tuple', ('Load',)), ('Tuple', (1, 9, 1, 30), [('Name', (1, 9, 1, 12), 'int', ('Load',)), ('Starred', (1, 14, 1, 30), ('Subscript', (1, 15, 1, 30), ('Name', (1, 15, 1, 20), 'tuple', ('Load',)), ('Tuple', (1, 21, 1, 29), [('Name', (1, 21, 1, 24), 'str', ('Load',)), ('Constant', (1, 26, 1, 29), Ellipsis, None)], ('Load',)), ('Load',)), ('Load',))], ('Load',)), ('Load',)), None, 1)], []), +('Module', [('AugAssign', (1, 0, 1, 6), ('Name', (1, 0, 1, 1), 'v', ('Store',)), ('Add',), ('Constant', (1, 5, 1, 6), 1, None))], []), +('Module', [('For', (1, 0, 1, 15), ('Name', (1, 4, 1, 5), 'v', ('Store',)), ('Name', (1, 9, 1, 10), 'v', ('Load',)), [('Pass', (1, 11, 1, 15))], [], None)], []), +('Module', [('While', (1, 0, 1, 12), ('Name', (1, 6, 1, 7), 'v', ('Load',)), [('Pass', (1, 8, 1, 12))], [])], []), +('Module', [('If', (1, 0, 1, 9), ('Name', (1, 3, 1, 4), 'v', ('Load',)), [('Pass', (1, 5, 1, 9))], [])], []), +('Module', [('If', (1, 0, 4, 6), ('Name', (1, 3, 1, 4), 'a', ('Load',)), [('Pass', (2, 2, 2, 6))], [('If', (3, 0, 4, 6), ('Name', (3, 5, 3, 6), 'b', ('Load',)), [('Pass', (4, 2, 4, 6))], [])])], []), +('Module', [('If', (1, 0, 6, 6), ('Name', (1, 3, 1, 4), 'a', ('Load',)), [('Pass', (2, 2, 2, 6))], [('If', (3, 0, 6, 6), ('Name', (3, 5, 3, 6), 'b', ('Load',)), [('Pass', (4, 2, 4, 6))], [('Pass', (6, 2, 6, 6))])])], []), +('Module', [('With', (1, 0, 1, 17), [('withitem', ('Name', (1, 5, 1, 6), 'x', ('Load',)), ('Name', (1, 10, 1, 11), 'y', ('Store',)))], [('Pass', (1, 13, 1, 17))], None)], []), +('Module', [('With', (1, 0, 1, 25), [('withitem', ('Name', (1, 5, 1, 6), 'x', ('Load',)), ('Name', (1, 10, 1, 11), 'y', ('Store',))), ('withitem', ('Name', (1, 13, 1, 14), 'z', ('Load',)), ('Name', (1, 18, 1, 19), 'q', ('Store',)))], [('Pass', (1, 21, 1, 25))], None)], []), +('Module', [('Raise', (1, 0, 1, 25), ('Call', (1, 6, 1, 25), ('Name', (1, 6, 1, 15), 'Exception', ('Load',)), [('Constant', (1, 16, 1, 24), 'string', None)], []), None)], []), +('Module', [('Try', (1, 0, 4, 6), [('Pass', (2, 2, 2, 6))], [('ExceptHandler', (3, 0, 4, 6), ('Name', (3, 7, 3, 16), 'Exception', ('Load',)), None, [('Pass', (4, 2, 4, 6))])], [], [])], []), +('Module', [('Try', (1, 0, 4, 6), [('Pass', (2, 2, 2, 6))], [], [], [('Pass', (4, 2, 4, 6))])], []), +('Module', [('TryStar', (1, 0, 4, 6), [('Pass', (2, 2, 2, 6))], [('ExceptHandler', (3, 0, 4, 6), ('Name', (3, 8, 3, 17), 'Exception', ('Load',)), None, [('Pass', (4, 2, 4, 6))])], [], [])], []), +('Module', [('Assert', (1, 0, 1, 8), ('Name', (1, 7, 1, 8), 'v', ('Load',)), None)], []), +('Module', [('Import', (1, 0, 1, 10), [('alias', (1, 7, 1, 10), 'sys', None)])], []), +('Module', [('ImportFrom', (1, 0, 1, 17), 'sys', [('alias', (1, 16, 1, 17), 'v', None)], 0)], []), +('Module', [('Global', (1, 0, 1, 8), ['v'])], []), +('Module', [('Expr', (1, 0, 1, 1), ('Constant', (1, 0, 1, 1), 1, None))], []), +('Module', [('Pass', (1, 0, 1, 4))], []), +('Module', [('For', (1, 0, 1, 16), ('Name', (1, 4, 1, 5), 'v', ('Store',)), ('Name', (1, 9, 1, 10), 'v', ('Load',)), [('Break', (1, 11, 1, 16))], [], None)], []), +('Module', [('For', (1, 0, 1, 19), ('Name', (1, 4, 1, 5), 'v', ('Store',)), ('Name', (1, 9, 1, 10), 'v', ('Load',)), [('Continue', (1, 11, 1, 19))], [], None)], []), +('Module', [('For', (1, 0, 1, 18), ('Tuple', (1, 4, 1, 7), [('Name', (1, 4, 1, 5), 'a', ('Store',)), ('Name', (1, 6, 1, 7), 'b', ('Store',))], ('Store',)), ('Name', (1, 11, 1, 12), 'c', ('Load',)), [('Pass', (1, 14, 1, 18))], [], None)], []), +('Module', [('For', (1, 0, 1, 20), ('Tuple', (1, 4, 1, 9), [('Name', (1, 5, 1, 6), 'a', ('Store',)), ('Name', (1, 7, 1, 8), 'b', ('Store',))], ('Store',)), ('Name', (1, 13, 1, 14), 'c', ('Load',)), [('Pass', (1, 16, 1, 20))], [], None)], []), +('Module', [('For', (1, 0, 1, 20), ('List', (1, 4, 1, 9), [('Name', (1, 5, 1, 6), 'a', ('Store',)), ('Name', (1, 7, 1, 8), 'b', ('Store',))], ('Store',)), ('Name', (1, 13, 1, 14), 'c', ('Load',)), [('Pass', (1, 16, 1, 20))], [], None)], []), +('Module', [('Expr', (1, 0, 11, 5), ('GeneratorExp', (1, 0, 11, 5), ('Tuple', (2, 4, 6, 5), [('Name', (3, 4, 3, 6), 'Aa', ('Load',)), ('Name', (5, 7, 5, 9), 'Bb', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (8, 4, 10, 6), [('Name', (8, 4, 8, 6), 'Aa', ('Store',)), ('Name', (10, 4, 10, 6), 'Bb', ('Store',))], ('Store',)), ('Name', (10, 10, 10, 12), 'Cc', ('Load',)), [], 0)]))], []), +('Module', [('Expr', (1, 0, 1, 34), ('DictComp', (1, 0, 1, 34), ('Name', (1, 1, 1, 2), 'a', ('Load',)), ('Name', (1, 5, 1, 6), 'b', ('Load',)), [('comprehension', ('Name', (1, 11, 1, 12), 'w', ('Store',)), ('Name', (1, 16, 1, 17), 'x', ('Load',)), [], 0), ('comprehension', ('Name', (1, 22, 1, 23), 'm', ('Store',)), ('Name', (1, 27, 1, 28), 'p', ('Load',)), [('Name', (1, 32, 1, 33), 'g', ('Load',))], 0)]))], []), +('Module', [('Expr', (1, 0, 1, 20), ('DictComp', (1, 0, 1, 20), ('Name', (1, 1, 1, 2), 'a', ('Load',)), ('Name', (1, 5, 1, 6), 'b', ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 14), [('Name', (1, 11, 1, 12), 'v', ('Store',)), ('Name', (1, 13, 1, 14), 'w', ('Store',))], ('Store',)), ('Name', (1, 18, 1, 19), 'x', ('Load',)), [], 0)]))], []), +('Module', [('Expr', (1, 0, 1, 19), ('SetComp', (1, 0, 1, 19), ('Name', (1, 1, 1, 2), 'r', ('Load',)), [('comprehension', ('Name', (1, 7, 1, 8), 'l', ('Store',)), ('Name', (1, 12, 1, 13), 'x', ('Load',)), [('Name', (1, 17, 1, 18), 'g', ('Load',))], 0)]))], []), +('Module', [('Expr', (1, 0, 1, 16), ('SetComp', (1, 0, 1, 16), ('Name', (1, 1, 1, 2), 'r', ('Load',)), [('comprehension', ('Tuple', (1, 7, 1, 10), [('Name', (1, 7, 1, 8), 'l', ('Store',)), ('Name', (1, 9, 1, 10), 'm', ('Store',))], ('Store',)), ('Name', (1, 14, 1, 15), 'x', ('Load',)), [], 0)]))], []), +('Module', [('AsyncFunctionDef', (1, 0, 3, 18), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (2, 1, 2, 17), ('Constant', (2, 1, 2, 17), 'async function', None)), ('Expr', (3, 1, 3, 18), ('Await', (3, 1, 3, 18), ('Call', (3, 7, 3, 18), ('Name', (3, 7, 3, 16), 'something', ('Load',)), [], [])))], [], None, None, [])], []), +('Module', [('AsyncFunctionDef', (1, 0, 3, 8), 'f', ('arguments', [], [], None, [], [], None, []), [('AsyncFor', (2, 1, 3, 8), ('Name', (2, 11, 2, 12), 'e', ('Store',)), ('Name', (2, 16, 2, 17), 'i', ('Load',)), [('Expr', (2, 19, 2, 20), ('Constant', (2, 19, 2, 20), 1, None))], [('Expr', (3, 7, 3, 8), ('Constant', (3, 7, 3, 8), 2, None))], None)], [], None, None, [])], []), +('Module', [('AsyncFunctionDef', (1, 0, 2, 21), 'f', ('arguments', [], [], None, [], [], None, []), [('AsyncWith', (2, 1, 2, 21), [('withitem', ('Name', (2, 12, 2, 13), 'a', ('Load',)), ('Name', (2, 17, 2, 18), 'b', ('Store',)))], [('Expr', (2, 20, 2, 21), ('Constant', (2, 20, 2, 21), 1, None))], None)], [], None, None, [])], []), +('Module', [('Expr', (1, 0, 1, 14), ('Dict', (1, 0, 1, 14), [None, ('Constant', (1, 10, 1, 11), 2, None)], [('Dict', (1, 3, 1, 8), [('Constant', (1, 4, 1, 5), 1, None)], [('Constant', (1, 6, 1, 7), 2, None)]), ('Constant', (1, 12, 1, 13), 3, None)]))], []), +('Module', [('Expr', (1, 0, 1, 12), ('Set', (1, 0, 1, 12), [('Starred', (1, 1, 1, 8), ('Set', (1, 2, 1, 8), [('Constant', (1, 3, 1, 4), 1, None), ('Constant', (1, 6, 1, 7), 2, None)]), ('Load',)), ('Constant', (1, 10, 1, 11), 3, None)]))], []), +('Module', [('AsyncFunctionDef', (1, 0, 2, 21), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (2, 1, 2, 21), ('ListComp', (2, 1, 2, 21), ('Name', (2, 2, 2, 3), 'i', ('Load',)), [('comprehension', ('Name', (2, 14, 2, 15), 'b', ('Store',)), ('Name', (2, 19, 2, 20), 'c', ('Load',)), [], 1)]))], [], None, None, [])], []), +('Module', [('FunctionDef', (4, 0, 4, 13), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (4, 9, 4, 13))], [('Name', (1, 1, 1, 6), 'deco1', ('Load',)), ('Call', (2, 1, 2, 8), ('Name', (2, 1, 2, 6), 'deco2', ('Load',)), [], []), ('Call', (3, 1, 3, 9), ('Name', (3, 1, 3, 6), 'deco3', ('Load',)), [('Constant', (3, 7, 3, 8), 1, None)], [])], None, None, [])], []), +('Module', [('AsyncFunctionDef', (4, 0, 4, 19), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (4, 15, 4, 19))], [('Name', (1, 1, 1, 6), 'deco1', ('Load',)), ('Call', (2, 1, 2, 8), ('Name', (2, 1, 2, 6), 'deco2', ('Load',)), [], []), ('Call', (3, 1, 3, 9), ('Name', (3, 1, 3, 6), 'deco3', ('Load',)), [('Constant', (3, 7, 3, 8), 1, None)], [])], None, None, [])], []), +('Module', [('ClassDef', (4, 0, 4, 13), 'C', [], [], [('Pass', (4, 9, 4, 13))], [('Name', (1, 1, 1, 6), 'deco1', ('Load',)), ('Call', (2, 1, 2, 8), ('Name', (2, 1, 2, 6), 'deco2', ('Load',)), [], []), ('Call', (3, 1, 3, 9), ('Name', (3, 1, 3, 6), 'deco3', ('Load',)), [('Constant', (3, 7, 3, 8), 1, None)], [])], [])], []), +('Module', [('FunctionDef', (2, 0, 2, 13), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (2, 9, 2, 13))], [('Call', (1, 1, 1, 19), ('Name', (1, 1, 1, 5), 'deco', ('Load',)), [('GeneratorExp', (1, 5, 1, 19), ('Name', (1, 6, 1, 7), 'a', ('Load',)), [('comprehension', ('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 17, 1, 18), 'b', ('Load',)), [], 0)])], [])], None, None, [])], []), +('Module', [('FunctionDef', (2, 0, 2, 13), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (2, 9, 2, 13))], [('Attribute', (1, 1, 1, 6), ('Attribute', (1, 1, 1, 4), ('Name', (1, 1, 1, 2), 'a', ('Load',)), 'b', ('Load',)), 'c', ('Load',))], None, None, [])], []), +('Module', [('Expr', (1, 0, 1, 8), ('NamedExpr', (1, 1, 1, 7), ('Name', (1, 1, 1, 2), 'a', ('Store',)), ('Constant', (1, 6, 1, 7), 1, None)))], []), +('Module', [('FunctionDef', (1, 0, 1, 18), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [], None, [], [], None, []), [('Pass', (1, 14, 1, 18))], [], None, None, [])], []), +('Module', [('FunctionDef', (1, 0, 1, 26), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 12, 1, 13), 'c', None, None), ('arg', (1, 15, 1, 16), 'd', None, None), ('arg', (1, 18, 1, 19), 'e', None, None)], None, [], [], None, []), [('Pass', (1, 22, 1, 26))], [], None, None, [])], []), +('Module', [('FunctionDef', (1, 0, 1, 29), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 12, 1, 13), 'c', None, None)], None, [('arg', (1, 18, 1, 19), 'd', None, None), ('arg', (1, 21, 1, 22), 'e', None, None)], [None, None], None, []), [('Pass', (1, 25, 1, 29))], [], None, None, [])], []), +('Module', [('FunctionDef', (1, 0, 1, 39), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 12, 1, 13), 'c', None, None)], None, [('arg', (1, 18, 1, 19), 'd', None, None), ('arg', (1, 21, 1, 22), 'e', None, None)], [None, None], ('arg', (1, 26, 1, 32), 'kwargs', None, None), []), [('Pass', (1, 35, 1, 39))], [], None, None, [])], []), +('Module', [('FunctionDef', (1, 0, 1, 20), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [], None, [], [], None, [('Constant', (1, 8, 1, 9), 1, None)]), [('Pass', (1, 16, 1, 20))], [], None, None, [])], []), +('Module', [('FunctionDef', (1, 0, 1, 29), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None), ('arg', (1, 19, 1, 20), 'c', None, None)], None, [], [], None, [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None), ('Constant', (1, 21, 1, 22), 4, None)]), [('Pass', (1, 25, 1, 29))], [], None, None, [])], []), +('Module', [('FunctionDef', (1, 0, 1, 32), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None)], None, [('arg', (1, 22, 1, 23), 'c', None, None)], [('Constant', (1, 24, 1, 25), 4, None)], None, [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None)]), [('Pass', (1, 28, 1, 32))], [], None, None, [])], []), +('Module', [('FunctionDef', (1, 0, 1, 30), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None)], None, [('arg', (1, 22, 1, 23), 'c', None, None)], [None], None, [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None)]), [('Pass', (1, 26, 1, 30))], [], None, None, [])], []), +('Module', [('FunctionDef', (1, 0, 1, 42), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None)], None, [('arg', (1, 22, 1, 23), 'c', None, None)], [('Constant', (1, 24, 1, 25), 4, None)], ('arg', (1, 29, 1, 35), 'kwargs', None, None), [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None)]), [('Pass', (1, 38, 1, 42))], [], None, None, [])], []), +('Module', [('FunctionDef', (1, 0, 1, 40), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None)], None, [('arg', (1, 22, 1, 23), 'c', None, None)], [None], ('arg', (1, 27, 1, 33), 'kwargs', None, None), [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None)]), [('Pass', (1, 36, 1, 40))], [], None, None, [])], []), +('Module', [('TypeAlias', (1, 0, 1, 12), ('Name', (1, 5, 1, 6), 'X', ('Store',)), [], ('Name', (1, 9, 1, 12), 'int', ('Load',)))], []), +('Module', [('TypeAlias', (1, 0, 1, 15), ('Name', (1, 5, 1, 6), 'X', ('Store',)), [('TypeVar', (1, 7, 1, 8), 'T', None)], ('Name', (1, 12, 1, 15), 'int', ('Load',)))], []), +('Module', [('TypeAlias', (1, 0, 1, 32), ('Name', (1, 5, 1, 6), 'X', ('Store',)), [('TypeVar', (1, 7, 1, 8), 'T', None), ('TypeVarTuple', (1, 10, 1, 13), 'Ts'), ('ParamSpec', (1, 15, 1, 18), 'P')], ('Tuple', (1, 22, 1, 32), [('Name', (1, 23, 1, 24), 'T', ('Load',)), ('Name', (1, 26, 1, 28), 'Ts', ('Load',)), ('Name', (1, 30, 1, 31), 'P', ('Load',))], ('Load',)))], []), +('Module', [('TypeAlias', (1, 0, 1, 37), ('Name', (1, 5, 1, 6), 'X', ('Store',)), [('TypeVar', (1, 7, 1, 13), 'T', ('Name', (1, 10, 1, 13), 'int', ('Load',))), ('TypeVarTuple', (1, 15, 1, 18), 'Ts'), ('ParamSpec', (1, 20, 1, 23), 'P')], ('Tuple', (1, 27, 1, 37), [('Name', (1, 28, 1, 29), 'T', ('Load',)), ('Name', (1, 31, 1, 33), 'Ts', ('Load',)), ('Name', (1, 35, 1, 36), 'P', ('Load',))], ('Load',)))], []), +('Module', [('TypeAlias', (1, 0, 1, 44), ('Name', (1, 5, 1, 6), 'X', ('Store',)), [('TypeVar', (1, 7, 1, 20), 'T', ('Tuple', (1, 10, 1, 20), [('Name', (1, 11, 1, 14), 'int', ('Load',)), ('Name', (1, 16, 1, 19), 'str', ('Load',))], ('Load',))), ('TypeVarTuple', (1, 22, 1, 25), 'Ts'), ('ParamSpec', (1, 27, 1, 30), 'P')], ('Tuple', (1, 34, 1, 44), [('Name', (1, 35, 1, 36), 'T', ('Load',)), ('Name', (1, 38, 1, 40), 'Ts', ('Load',)), ('Name', (1, 42, 1, 43), 'P', ('Load',))], ('Load',)))], []), +('Module', [('ClassDef', (1, 0, 1, 16), 'X', [], [], [('Pass', (1, 12, 1, 16))], [], [('TypeVar', (1, 8, 1, 9), 'T', None)])], []), +('Module', [('ClassDef', (1, 0, 1, 26), 'X', [], [], [('Pass', (1, 22, 1, 26))], [], [('TypeVar', (1, 8, 1, 9), 'T', None), ('TypeVarTuple', (1, 11, 1, 14), 'Ts'), ('ParamSpec', (1, 16, 1, 19), 'P')])], []), +('Module', [('ClassDef', (1, 0, 1, 31), 'X', [], [], [('Pass', (1, 27, 1, 31))], [], [('TypeVar', (1, 8, 1, 14), 'T', ('Name', (1, 11, 1, 14), 'int', ('Load',))), ('TypeVarTuple', (1, 16, 1, 19), 'Ts'), ('ParamSpec', (1, 21, 1, 24), 'P')])], []), +('Module', [('ClassDef', (1, 0, 1, 38), 'X', [], [], [('Pass', (1, 34, 1, 38))], [], [('TypeVar', (1, 8, 1, 21), 'T', ('Tuple', (1, 11, 1, 21), [('Name', (1, 12, 1, 15), 'int', ('Load',)), ('Name', (1, 17, 1, 20), 'str', ('Load',))], ('Load',))), ('TypeVarTuple', (1, 23, 1, 26), 'Ts'), ('ParamSpec', (1, 28, 1, 31), 'P')])], []), +('Module', [('FunctionDef', (1, 0, 1, 16), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 12, 1, 16))], [], None, None, [('TypeVar', (1, 6, 1, 7), 'T', None)])], []), +('Module', [('FunctionDef', (1, 0, 1, 26), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 22, 1, 26))], [], None, None, [('TypeVar', (1, 6, 1, 7), 'T', None), ('TypeVarTuple', (1, 9, 1, 12), 'Ts'), ('ParamSpec', (1, 14, 1, 17), 'P')])], []), +('Module', [('FunctionDef', (1, 0, 1, 31), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 27, 1, 31))], [], None, None, [('TypeVar', (1, 6, 1, 12), 'T', ('Name', (1, 9, 1, 12), 'int', ('Load',))), ('TypeVarTuple', (1, 14, 1, 17), 'Ts'), ('ParamSpec', (1, 19, 1, 22), 'P')])], []), +('Module', [('FunctionDef', (1, 0, 1, 38), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 34, 1, 38))], [], None, None, [('TypeVar', (1, 6, 1, 19), 'T', ('Tuple', (1, 9, 1, 19), [('Name', (1, 10, 1, 13), 'int', ('Load',)), ('Name', (1, 15, 1, 18), 'str', ('Load',))], ('Load',))), ('TypeVarTuple', (1, 21, 1, 24), 'Ts'), ('ParamSpec', (1, 26, 1, 29), 'P')])], []), +] +single_results = [ +('Interactive', [('Expr', (1, 0, 1, 3), ('BinOp', (1, 0, 1, 3), ('Constant', (1, 0, 1, 1), 1, None), ('Add',), ('Constant', (1, 2, 1, 3), 2, None)))]), +] +eval_results = [ +('Expression', ('Constant', (1, 0, 1, 4), None, None)), +('Expression', ('BoolOp', (1, 0, 1, 7), ('And',), [('Name', (1, 0, 1, 1), 'a', ('Load',)), ('Name', (1, 6, 1, 7), 'b', ('Load',))])), +('Expression', ('BinOp', (1, 0, 1, 5), ('Name', (1, 0, 1, 1), 'a', ('Load',)), ('Add',), ('Name', (1, 4, 1, 5), 'b', ('Load',)))), +('Expression', ('UnaryOp', (1, 0, 1, 5), ('Not',), ('Name', (1, 4, 1, 5), 'v', ('Load',)))), +('Expression', ('Lambda', (1, 0, 1, 11), ('arguments', [], [], None, [], [], None, []), ('Constant', (1, 7, 1, 11), None, None))), +('Expression', ('Dict', (1, 0, 1, 7), [('Constant', (1, 2, 1, 3), 1, None)], [('Constant', (1, 4, 1, 5), 2, None)])), +('Expression', ('Dict', (1, 0, 1, 2), [], [])), +('Expression', ('Set', (1, 0, 1, 7), [('Constant', (1, 1, 1, 5), None, None)])), +('Expression', ('Dict', (1, 0, 5, 6), [('Constant', (2, 6, 2, 7), 1, None)], [('Constant', (4, 10, 4, 11), 2, None)])), +('Expression', ('ListComp', (1, 0, 1, 19), ('Name', (1, 1, 1, 2), 'a', ('Load',)), [('comprehension', ('Name', (1, 7, 1, 8), 'b', ('Store',)), ('Name', (1, 12, 1, 13), 'c', ('Load',)), [('Name', (1, 17, 1, 18), 'd', ('Load',))], 0)])), +('Expression', ('GeneratorExp', (1, 0, 1, 19), ('Name', (1, 1, 1, 2), 'a', ('Load',)), [('comprehension', ('Name', (1, 7, 1, 8), 'b', ('Store',)), ('Name', (1, 12, 1, 13), 'c', ('Load',)), [('Name', (1, 17, 1, 18), 'd', ('Load',))], 0)])), +('Expression', ('ListComp', (1, 0, 1, 20), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 14), [('Name', (1, 11, 1, 12), 'a', ('Store',)), ('Name', (1, 13, 1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 18, 1, 19), 'c', ('Load',)), [], 0)])), +('Expression', ('ListComp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('ListComp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('SetComp', (1, 0, 1, 20), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 14), [('Name', (1, 11, 1, 12), 'a', ('Store',)), ('Name', (1, 13, 1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 18, 1, 19), 'c', ('Load',)), [], 0)])), +('Expression', ('SetComp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('SetComp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('GeneratorExp', (1, 0, 1, 20), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 14), [('Name', (1, 11, 1, 12), 'a', ('Store',)), ('Name', (1, 13, 1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 18, 1, 19), 'c', ('Load',)), [], 0)])), +('Expression', ('GeneratorExp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('GeneratorExp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('Compare', (1, 0, 1, 9), ('Constant', (1, 0, 1, 1), 1, None), [('Lt',), ('Lt',)], [('Constant', (1, 4, 1, 5), 2, None), ('Constant', (1, 8, 1, 9), 3, None)])), +('Expression', ('Call', (1, 0, 1, 17), ('Name', (1, 0, 1, 1), 'f', ('Load',)), [('Constant', (1, 2, 1, 3), 1, None), ('Constant', (1, 4, 1, 5), 2, None), ('Starred', (1, 10, 1, 12), ('Name', (1, 11, 1, 12), 'd', ('Load',)), ('Load',))], [('keyword', (1, 6, 1, 9), 'c', ('Constant', (1, 8, 1, 9), 3, None)), ('keyword', (1, 13, 1, 16), None, ('Name', (1, 15, 1, 16), 'e', ('Load',)))])), +('Expression', ('Call', (1, 0, 1, 10), ('Name', (1, 0, 1, 1), 'f', ('Load',)), [('Starred', (1, 2, 1, 9), ('List', (1, 3, 1, 9), [('Constant', (1, 4, 1, 5), 0, None), ('Constant', (1, 7, 1, 8), 1, None)], ('Load',)), ('Load',))], [])), +('Expression', ('Call', (1, 0, 1, 15), ('Name', (1, 0, 1, 1), 'f', ('Load',)), [('GeneratorExp', (1, 1, 1, 15), ('Name', (1, 2, 1, 3), 'a', ('Load',)), [('comprehension', ('Name', (1, 8, 1, 9), 'a', ('Store',)), ('Name', (1, 13, 1, 14), 'b', ('Load',)), [], 0)])], [])), +('Expression', ('Constant', (1, 0, 1, 2), 10, None)), +('Expression', ('Constant', (1, 0, 1, 8), 'string', None)), +('Expression', ('Attribute', (1, 0, 1, 3), ('Name', (1, 0, 1, 1), 'a', ('Load',)), 'b', ('Load',))), +('Expression', ('Subscript', (1, 0, 1, 6), ('Name', (1, 0, 1, 1), 'a', ('Load',)), ('Slice', (1, 2, 1, 5), ('Name', (1, 2, 1, 3), 'b', ('Load',)), ('Name', (1, 4, 1, 5), 'c', ('Load',)), None), ('Load',))), +('Expression', ('Name', (1, 0, 1, 1), 'v', ('Load',))), +('Expression', ('List', (1, 0, 1, 7), [('Constant', (1, 1, 1, 2), 1, None), ('Constant', (1, 3, 1, 4), 2, None), ('Constant', (1, 5, 1, 6), 3, None)], ('Load',))), +('Expression', ('List', (1, 0, 1, 2), [], ('Load',))), +('Expression', ('Tuple', (1, 0, 1, 5), [('Constant', (1, 0, 1, 1), 1, None), ('Constant', (1, 2, 1, 3), 2, None), ('Constant', (1, 4, 1, 5), 3, None)], ('Load',))), +('Expression', ('Tuple', (1, 0, 1, 7), [('Constant', (1, 1, 1, 2), 1, None), ('Constant', (1, 3, 1, 4), 2, None), ('Constant', (1, 5, 1, 6), 3, None)], ('Load',))), +('Expression', ('Tuple', (1, 0, 1, 2), [], ('Load',))), +('Expression', ('Call', (1, 0, 1, 17), ('Attribute', (1, 0, 1, 7), ('Attribute', (1, 0, 1, 5), ('Attribute', (1, 0, 1, 3), ('Name', (1, 0, 1, 1), 'a', ('Load',)), 'b', ('Load',)), 'c', ('Load',)), 'd', ('Load',)), [('Subscript', (1, 8, 1, 16), ('Attribute', (1, 8, 1, 11), ('Name', (1, 8, 1, 9), 'a', ('Load',)), 'b', ('Load',)), ('Slice', (1, 12, 1, 15), ('Constant', (1, 12, 1, 13), 1, None), ('Constant', (1, 14, 1, 15), 2, None), None), ('Load',))], [])), +] +main() diff --git a/Lib/test/test_ast/test_ast.py b/Lib/test/test_ast/test_ast.py new file mode 100644 index 00000000..f07e2d02 --- /dev/null +++ b/Lib/test/test_ast/test_ast.py @@ -0,0 +1,2781 @@ +import ast +import builtins +import dis +import enum +import os +import re +import sys +import textwrap +import types +import unittest +import warnings +import weakref +from functools import partial +from textwrap import dedent + +from test import support +from test.support.import_helper import import_fresh_module +from test.support import os_helper, script_helper +from test.support.ast_helper import ASTTestMixin +from test.test_ast.utils import to_tuple +from test.test_ast.snippets import ( + eval_tests, eval_results, exec_tests, exec_results, single_tests, single_results +) + + +class AST_Tests(unittest.TestCase): + maxDiff = None + + def _is_ast_node(self, name, node): + if not isinstance(node, type): + return False + if "ast" not in node.__module__: + return False + return name != "AST" and name[0].isupper() + + def _assertTrueorder(self, ast_node, parent_pos): + if not isinstance(ast_node, ast.AST) or ast_node._fields is None: + return + if isinstance(ast_node, (ast.expr, ast.stmt, ast.excepthandler)): + node_pos = (ast_node.lineno, ast_node.col_offset) + self.assertGreaterEqual(node_pos, parent_pos) + parent_pos = (ast_node.lineno, ast_node.col_offset) + for name in ast_node._fields: + value = getattr(ast_node, name) + if isinstance(value, list): + first_pos = parent_pos + if value and name == "decorator_list": + first_pos = (value[0].lineno, value[0].col_offset) + for child in value: + self._assertTrueorder(child, first_pos) + elif value is not None: + self._assertTrueorder(value, parent_pos) + self.assertEqual(ast_node._fields, ast_node.__match_args__) + + def test_AST_objects(self): + x = ast.AST() + self.assertEqual(x._fields, ()) + x.foobar = 42 + self.assertEqual(x.foobar, 42) + self.assertEqual(x.__dict__["foobar"], 42) + + with self.assertRaises(AttributeError): + x.vararg + + with self.assertRaises(TypeError): + # "ast.AST constructor takes 0 positional arguments" + ast.AST(2) + + def test_AST_fields_NULL_check(self): + # See: https://github.com/python/cpython/issues/126105 + old_value = ast.AST._fields + + def cleanup(): + ast.AST._fields = old_value + self.addCleanup(cleanup) + + del ast.AST._fields + + msg = "type object 'ast.AST' has no attribute '_fields'" + # Both examples used to crash: + with self.assertRaisesRegex(AttributeError, msg): + ast.AST(arg1=123) + with self.assertRaisesRegex(AttributeError, msg): + ast.AST() + + def test_AST_garbage_collection(self): + class X: + pass + + a = ast.AST() + a.x = X() + a.x.a = a + ref = weakref.ref(a.x) + del a + support.gc_collect() + self.assertIsNone(ref()) + + def test_snippets(self): + for input, output, kind in ( + (exec_tests, exec_results, "exec"), + (single_tests, single_results, "single"), + (eval_tests, eval_results, "eval"), + ): + for i, o in zip(input, output): + with self.subTest(action="parsing", input=i): + ast_tree = compile(i, "?", kind, ast.PyCF_ONLY_AST) + self.assertEqual(to_tuple(ast_tree), o) + self._assertTrueorder(ast_tree, (0, 0)) + 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_invalid_position_information(self): + invalid_linenos = [(10, 1), (-10, -11), (10, -11), (-5, -2), (-5, 1)] + + for lineno, end_lineno in invalid_linenos: + with self.subTest(f"Check invalid linenos {lineno}:{end_lineno}"): + snippet = "a = 1" + tree = ast.parse(snippet) + tree.body[0].lineno = lineno + tree.body[0].end_lineno = end_lineno + with self.assertRaises(ValueError): + compile(tree, "", "exec") + + invalid_col_offsets = [(10, 1), (-10, -11), (10, -11), (-5, -2), (-5, 1)] + for col_offset, end_col_offset in invalid_col_offsets: + with self.subTest( + f"Check invalid col_offset {col_offset}:{end_col_offset}" + ): + snippet = "a = 1" + tree = ast.parse(snippet) + tree.body[0].col_offset = col_offset + tree.body[0].end_col_offset = end_col_offset + with self.assertRaises(ValueError): + compile(tree, "", "exec") + + def test_compilation_of_ast_nodes_with_default_end_position_values(self): + tree = ast.Module( + body=[ + ast.Import( + names=[ast.alias(name="builtins", lineno=1, col_offset=0)], + lineno=1, + col_offset=0, + ), + ast.Import( + names=[ast.alias(name="traceback", lineno=0, col_offset=0)], + lineno=0, + col_offset=1, + ), + ], + type_ignores=[], + ) + + # Check that compilation doesn't crash. Note: this may crash explicitly only on debug mode. + compile(tree, "", "exec") + + def test_slice(self): + slc = ast.parse("x[::]").body[0].value.slice + self.assertIsNone(slc.upper) + self.assertIsNone(slc.lower) + self.assertIsNone(slc.step) + + def test_from_import(self): + im = ast.parse("from . import y").body[0] + self.assertIsNone(im.module) + + def test_non_interned_future_from_ast(self): + mod = ast.parse("from __future__ import division") + self.assertIsInstance(mod.body[0], ast.ImportFrom) + mod.body[0].module = " __future__ ".strip() + compile(mod, "", "exec") + + def test_alias(self): + im = ast.parse("from bar import y").body[0] + self.assertEqual(len(im.names), 1) + alias = im.names[0] + self.assertEqual(alias.name, "y") + self.assertIsNone(alias.asname) + self.assertEqual(alias.lineno, 1) + self.assertEqual(alias.end_lineno, 1) + self.assertEqual(alias.col_offset, 16) + self.assertEqual(alias.end_col_offset, 17) + + im = ast.parse("from bar import *").body[0] + alias = im.names[0] + self.assertEqual(alias.name, "*") + self.assertIsNone(alias.asname) + self.assertEqual(alias.lineno, 1) + self.assertEqual(alias.end_lineno, 1) + self.assertEqual(alias.col_offset, 16) + self.assertEqual(alias.end_col_offset, 17) + + im = ast.parse("from bar import y as z").body[0] + alias = im.names[0] + self.assertEqual(alias.name, "y") + self.assertEqual(alias.asname, "z") + self.assertEqual(alias.lineno, 1) + self.assertEqual(alias.end_lineno, 1) + self.assertEqual(alias.col_offset, 16) + self.assertEqual(alias.end_col_offset, 22) + + im = ast.parse("import bar as foo").body[0] + alias = im.names[0] + self.assertEqual(alias.name, "bar") + self.assertEqual(alias.asname, "foo") + self.assertEqual(alias.lineno, 1) + self.assertEqual(alias.end_lineno, 1) + self.assertEqual(alias.col_offset, 7) + self.assertEqual(alias.end_col_offset, 17) + + def test_base_classes(self): + self.assertTrue(issubclass(ast.For, ast.stmt)) + self.assertTrue(issubclass(ast.Name, ast.expr)) + self.assertTrue(issubclass(ast.stmt, ast.AST)) + self.assertTrue(issubclass(ast.expr, ast.AST)) + self.assertTrue(issubclass(ast.comprehension, ast.AST)) + self.assertTrue(issubclass(ast.Gt, ast.AST)) + + def test_import_deprecated(self): + ast = import_fresh_module("ast") + depr_regex = ( + r"ast\.{} is deprecated and will be removed in Python 3.14; " + r"use ast\.Constant instead" + ) + for name in "Num", "Str", "Bytes", "NameConstant", "Ellipsis": + with self.assertWarnsRegex(DeprecationWarning, depr_regex.format(name)): + getattr(ast, name) + + def test_field_attr_existence_deprecated(self): + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", "", DeprecationWarning) + from ast import Num, Str, Bytes, NameConstant, Ellipsis + + for name in ("Num", "Str", "Bytes", "NameConstant", "Ellipsis"): + item = getattr(ast, name) + if self._is_ast_node(name, item): + with self.subTest(item): + with self.assertWarns(DeprecationWarning): + x = item() + if isinstance(x, ast.AST): + self.assertIs(type(x._fields), tuple) + + def test_field_attr_existence(self): + for name, item in ast.__dict__.items(): + # These emit DeprecationWarnings + if name in {"Num", "Str", "Bytes", "NameConstant", "Ellipsis"}: + continue + # constructor has a different signature + if name == "Index": + continue + if self._is_ast_node(name, item): + x = item() + if isinstance(x, ast.AST): + self.assertIs(type(x._fields), tuple) + + def test_arguments(self): + x = ast.arguments() + self.assertEqual( + x._fields, + ( + "posonlyargs", + "args", + "vararg", + "kwonlyargs", + "kw_defaults", + "kwarg", + "defaults", + ), + ) + + with self.assertRaises(AttributeError): + x.args + self.assertIsNone(x.vararg) + + x = ast.arguments(*range(1, 8)) + self.assertEqual(x.args, 2) + self.assertEqual(x.vararg, 3) + + def test_field_attr_writable_deprecated(self): + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", "", DeprecationWarning) + x = ast.Num() + # We can assign to _fields + x._fields = 666 + self.assertEqual(x._fields, 666) + + def test_field_attr_writable(self): + x = ast.Constant() + # We can assign to _fields + x._fields = 666 + self.assertEqual(x._fields, 666) + + def test_classattrs_deprecated(self): + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", "", DeprecationWarning) + from ast import Num, Str, Bytes, NameConstant, Ellipsis + + with warnings.catch_warnings(record=True) as wlog: + warnings.filterwarnings("always", "", DeprecationWarning) + x = ast.Num() + self.assertEqual(x._fields, ("value", "kind")) + + with self.assertRaises(AttributeError): + x.value + + with self.assertRaises(AttributeError): + x.n + + x = ast.Num(42) + self.assertEqual(x.value, 42) + self.assertEqual(x.n, 42) + + with self.assertRaises(AttributeError): + x.lineno + + with self.assertRaises(AttributeError): + x.foobar + + x = ast.Num(lineno=2) + self.assertEqual(x.lineno, 2) + + x = ast.Num(42, lineno=0) + self.assertEqual(x.lineno, 0) + self.assertEqual(x._fields, ("value", "kind")) + self.assertEqual(x.value, 42) + self.assertEqual(x.n, 42) + + self.assertRaises(TypeError, ast.Num, 1, None, 2) + self.assertRaises(TypeError, ast.Num, 1, None, 2, lineno=0) + + # Arbitrary keyword arguments are supported + self.assertEqual(ast.Num(1, foo="bar").foo, "bar") + + with self.assertRaisesRegex( + TypeError, "Num got multiple values for argument 'n'" + ): + ast.Num(1, n=2) + + self.assertEqual(ast.Num(42).n, 42) + self.assertEqual(ast.Num(4.25).n, 4.25) + self.assertEqual(ast.Num(4.25j).n, 4.25j) + self.assertEqual(ast.Str("42").s, "42") + self.assertEqual(ast.Bytes(b"42").s, b"42") + self.assertIs(ast.NameConstant(True).value, True) + self.assertIs(ast.NameConstant(False).value, False) + self.assertIs(ast.NameConstant(None).value, None) + + self.assertEqual( + [str(w.message) for w in wlog], + [ + "ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead", + "Attribute n is deprecated and will be removed in Python 3.14; use value instead", + "ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead", + "Attribute n is deprecated and will be removed in Python 3.14; use value instead", + "ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead", + "ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead", + "Attribute n is deprecated and will be removed in Python 3.14; use value instead", + "ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead", + "ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead", + "ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead", + "ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead", + "Attribute n is deprecated and will be removed in Python 3.14; use value instead", + "ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead", + "Attribute n is deprecated and will be removed in Python 3.14; use value instead", + "ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead", + "Attribute n is deprecated and will be removed in Python 3.14; use value instead", + "ast.Str is deprecated and will be removed in Python 3.14; use ast.Constant instead", + "Attribute s is deprecated and will be removed in Python 3.14; use value instead", + "ast.Bytes is deprecated and will be removed in Python 3.14; use ast.Constant instead", + "Attribute s is deprecated and will be removed in Python 3.14; use value instead", + "ast.NameConstant is deprecated and will be removed in Python 3.14; use ast.Constant instead", + "ast.NameConstant is deprecated and will be removed in Python 3.14; use ast.Constant instead", + "ast.NameConstant is deprecated and will be removed in Python 3.14; use ast.Constant instead", + ], + ) + + def test_classattrs(self): + x = ast.Constant() + self.assertEqual(x._fields, ("value", "kind")) + + with self.assertRaises(AttributeError): + x.value + + x = ast.Constant(42) + self.assertEqual(x.value, 42) + + with self.assertRaises(AttributeError): + x.lineno + + with self.assertRaises(AttributeError): + x.foobar + + x = ast.Constant(lineno=2) + self.assertEqual(x.lineno, 2) + + x = ast.Constant(42, lineno=0) + self.assertEqual(x.lineno, 0) + self.assertEqual(x._fields, ("value", "kind")) + self.assertEqual(x.value, 42) + + self.assertRaises(TypeError, ast.Constant, 1, None, 2) + self.assertRaises(TypeError, ast.Constant, 1, None, 2, lineno=0) + + # Arbitrary keyword arguments are supported + self.assertEqual(ast.Constant(1, foo="bar").foo, "bar") + + with self.assertRaisesRegex( + TypeError, "Constant got multiple values for argument 'value'" + ): + ast.Constant(1, value=2) + + self.assertEqual(ast.Constant(42).value, 42) + self.assertEqual(ast.Constant(4.25).value, 4.25) + self.assertEqual(ast.Constant(4.25j).value, 4.25j) + self.assertEqual(ast.Constant("42").value, "42") + self.assertEqual(ast.Constant(b"42").value, b"42") + self.assertIs(ast.Constant(True).value, True) + self.assertIs(ast.Constant(False).value, False) + self.assertIs(ast.Constant(None).value, None) + self.assertIs(ast.Constant(...).value, ...) + + def test_realtype(self): + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", "", DeprecationWarning) + from ast import Num, Str, Bytes, NameConstant, Ellipsis + + with warnings.catch_warnings(record=True) as wlog: + warnings.filterwarnings("always", "", DeprecationWarning) + self.assertIs(type(ast.Num(42)), ast.Constant) + self.assertIs(type(ast.Num(4.25)), ast.Constant) + self.assertIs(type(ast.Num(4.25j)), ast.Constant) + self.assertIs(type(ast.Str("42")), ast.Constant) + self.assertIs(type(ast.Bytes(b"42")), ast.Constant) + self.assertIs(type(ast.NameConstant(True)), ast.Constant) + self.assertIs(type(ast.NameConstant(False)), ast.Constant) + self.assertIs(type(ast.NameConstant(None)), ast.Constant) + self.assertIs(type(ast.Ellipsis()), ast.Constant) + + self.assertEqual( + [str(w.message) for w in wlog], + [ + "ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead", + "ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead", + "ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead", + "ast.Str is deprecated and will be removed in Python 3.14; use ast.Constant instead", + "ast.Bytes is deprecated and will be removed in Python 3.14; use ast.Constant instead", + "ast.NameConstant is deprecated and will be removed in Python 3.14; use ast.Constant instead", + "ast.NameConstant is deprecated and will be removed in Python 3.14; use ast.Constant instead", + "ast.NameConstant is deprecated and will be removed in Python 3.14; use ast.Constant instead", + "ast.Ellipsis is deprecated and will be removed in Python 3.14; use ast.Constant instead", + ], + ) + + def test_isinstance(self): + from ast import Constant + + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", "", DeprecationWarning) + from ast import Num, Str, Bytes, NameConstant, Ellipsis + + cls_depr_msg = ( + "ast.{} is deprecated and will be removed in Python 3.14; " + "use ast.Constant instead" + ) + + assertNumDeprecated = partial( + self.assertWarnsRegex, DeprecationWarning, cls_depr_msg.format("Num") + ) + assertStrDeprecated = partial( + self.assertWarnsRegex, DeprecationWarning, cls_depr_msg.format("Str") + ) + assertBytesDeprecated = partial( + self.assertWarnsRegex, DeprecationWarning, cls_depr_msg.format("Bytes") + ) + assertNameConstantDeprecated = partial( + self.assertWarnsRegex, + DeprecationWarning, + cls_depr_msg.format("NameConstant"), + ) + assertEllipsisDeprecated = partial( + self.assertWarnsRegex, DeprecationWarning, cls_depr_msg.format("Ellipsis") + ) + + for arg in 42, 4.2, 4.2j: + with self.subTest(arg=arg): + with assertNumDeprecated(): + n = Num(arg) + with assertNumDeprecated(): + self.assertIsInstance(n, Num) + + with assertStrDeprecated(): + s = Str("42") + with assertStrDeprecated(): + self.assertIsInstance(s, Str) + + with assertBytesDeprecated(): + b = Bytes(b"42") + with assertBytesDeprecated(): + self.assertIsInstance(b, Bytes) + + for arg in True, False, None: + with self.subTest(arg=arg): + with assertNameConstantDeprecated(): + n = NameConstant(arg) + with assertNameConstantDeprecated(): + self.assertIsInstance(n, NameConstant) + + with assertEllipsisDeprecated(): + e = Ellipsis() + with assertEllipsisDeprecated(): + self.assertIsInstance(e, Ellipsis) + + for arg in 42, 4.2, 4.2j: + with self.subTest(arg=arg): + with assertNumDeprecated(): + self.assertIsInstance(Constant(arg), Num) + + with assertStrDeprecated(): + self.assertIsInstance(Constant("42"), Str) + + with assertBytesDeprecated(): + self.assertIsInstance(Constant(b"42"), Bytes) + + for arg in True, False, None: + with self.subTest(arg=arg): + with assertNameConstantDeprecated(): + self.assertIsInstance(Constant(arg), NameConstant) + + with assertEllipsisDeprecated(): + self.assertIsInstance(Constant(...), Ellipsis) + + with assertStrDeprecated(): + s = Str("42") + assertNumDeprecated(self.assertNotIsInstance, s, Num) + assertBytesDeprecated(self.assertNotIsInstance, s, Bytes) + + with assertNumDeprecated(): + n = Num(42) + assertStrDeprecated(self.assertNotIsInstance, n, Str) + assertNameConstantDeprecated(self.assertNotIsInstance, n, NameConstant) + assertEllipsisDeprecated(self.assertNotIsInstance, n, Ellipsis) + + with assertNameConstantDeprecated(): + n = NameConstant(True) + with assertNumDeprecated(): + self.assertNotIsInstance(n, Num) + + with assertNameConstantDeprecated(): + n = NameConstant(False) + with assertNumDeprecated(): + self.assertNotIsInstance(n, Num) + + for arg in "42", True, False: + with self.subTest(arg=arg): + with assertNumDeprecated(): + self.assertNotIsInstance(Constant(arg), Num) + + assertStrDeprecated(self.assertNotIsInstance, Constant(42), Str) + assertBytesDeprecated(self.assertNotIsInstance, Constant("42"), Bytes) + assertNameConstantDeprecated( + self.assertNotIsInstance, Constant(42), NameConstant + ) + assertEllipsisDeprecated(self.assertNotIsInstance, Constant(42), Ellipsis) + assertNumDeprecated(self.assertNotIsInstance, Constant(), Num) + assertStrDeprecated(self.assertNotIsInstance, Constant(), Str) + assertBytesDeprecated(self.assertNotIsInstance, Constant(), Bytes) + assertNameConstantDeprecated(self.assertNotIsInstance, Constant(), NameConstant) + assertEllipsisDeprecated(self.assertNotIsInstance, Constant(), Ellipsis) + + class S(str): + pass + + with assertStrDeprecated(): + self.assertIsInstance(Constant(S("42")), Str) + with assertNumDeprecated(): + self.assertNotIsInstance(Constant(S("42")), Num) + + def test_constant_subclasses_deprecated(self): + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", "", DeprecationWarning) + from ast import Num + + with warnings.catch_warnings(record=True) as wlog: + warnings.filterwarnings("always", "", DeprecationWarning) + + class N(ast.Num): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.z = "spam" + + class N2(ast.Num): + pass + + n = N(42) + self.assertEqual(n.n, 42) + self.assertEqual(n.z, "spam") + self.assertIs(type(n), N) + self.assertIsInstance(n, N) + self.assertIsInstance(n, ast.Num) + self.assertNotIsInstance(n, N2) + self.assertNotIsInstance(ast.Num(42), N) + n = N(n=42) + self.assertEqual(n.n, 42) + self.assertIs(type(n), N) + + self.assertEqual( + [str(w.message) for w in wlog], + [ + "Attribute n is deprecated and will be removed in Python 3.14; use value instead", + "Attribute n is deprecated and will be removed in Python 3.14; use value instead", + "ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead", + "ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead", + "Attribute n is deprecated and will be removed in Python 3.14; use value instead", + "Attribute n is deprecated and will be removed in Python 3.14; use value instead", + ], + ) + + def test_constant_subclasses(self): + class N(ast.Constant): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.z = "spam" + + class N2(ast.Constant): + pass + + n = N(42) + self.assertEqual(n.value, 42) + self.assertEqual(n.z, "spam") + self.assertEqual(type(n), N) + self.assertTrue(isinstance(n, N)) + self.assertTrue(isinstance(n, ast.Constant)) + self.assertFalse(isinstance(n, N2)) + self.assertFalse(isinstance(ast.Constant(42), N)) + n = N(value=42) + self.assertEqual(n.value, 42) + self.assertEqual(type(n), N) + + def test_module(self): + body = [ast.Constant(42)] + x = ast.Module(body, []) + self.assertEqual(x.body, body) + + def test_nodeclasses(self): + # Zero arguments constructor explicitly allowed + x = ast.BinOp() + self.assertEqual(x._fields, ("left", "op", "right")) + + # Random attribute allowed too + x.foobarbaz = 5 + self.assertEqual(x.foobarbaz, 5) + + n1 = ast.Constant(1) + n3 = ast.Constant(3) + addop = ast.Add() + x = ast.BinOp(n1, addop, n3) + self.assertEqual(x.left, n1) + self.assertEqual(x.op, addop) + self.assertEqual(x.right, n3) + + x = ast.BinOp(1, 2, 3) + self.assertEqual(x.left, 1) + self.assertEqual(x.op, 2) + self.assertEqual(x.right, 3) + + x = ast.BinOp(1, 2, 3, lineno=0) + self.assertEqual(x.left, 1) + self.assertEqual(x.op, 2) + self.assertEqual(x.right, 3) + self.assertEqual(x.lineno, 0) + + # node raises exception when given too many arguments + self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4) + # node raises exception when given too many arguments + self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4, lineno=0) + + # can set attributes through kwargs too + x = ast.BinOp(left=1, op=2, right=3, lineno=0) + self.assertEqual(x.left, 1) + self.assertEqual(x.op, 2) + self.assertEqual(x.right, 3) + self.assertEqual(x.lineno, 0) + + # Random kwargs also allowed + x = ast.BinOp(1, 2, 3, foobarbaz=42) + self.assertEqual(x.foobarbaz, 42) + + def test_no_fields(self): + # this used to fail because Sub._fields was None + x = ast.Sub() + self.assertEqual(x._fields, ()) + + def test_pickling(self): + import pickle + + for protocol in range(pickle.HIGHEST_PROTOCOL + 1): + for ast in (compile(i, "?", "exec", 0x400) for i in exec_tests): + ast2 = pickle.loads(pickle.dumps(ast, protocol)) + self.assertEqual(to_tuple(ast2), to_tuple(ast)) + + def test_invalid_sum(self): + pos = dict(lineno=2, col_offset=3) + m = ast.Module([ast.Expr(ast.expr(**pos), **pos)], []) + with self.assertRaises(TypeError) as cm: + compile(m, "", "exec") + self.assertIn("but got ", "exec") + self.assertIn("identifier must be of type str", str(cm.exception)) + + def test_invalid_constant(self): + for invalid_constant in int, (1, 2, int), frozenset((1, 2, int)): + e = ast.Expression(body=ast.Constant(invalid_constant)) + ast.fix_missing_locations(e) + with self.assertRaisesRegex(TypeError, "invalid type in Constant: type"): + compile(e, "", "eval") + + def test_empty_yield_from(self): + # Issue 16546: yield from value is not optional. + empty_yield_from = ast.parse("def f():\n yield from g()") + empty_yield_from.body[0].body[0].value.value = None + with self.assertRaises(ValueError) as cm: + compile(empty_yield_from, "", "exec") + self.assertIn("field 'value' is required", str(cm.exception)) + + @support.cpython_only + def test_issue31592(self): + # There shouldn't be an assertion failure in case of a bad + # unicodedata.normalize(). + import unicodedata + + def bad_normalize(*args): + return None + + with support.swap_attr(unicodedata, "normalize", bad_normalize): + self.assertRaises(TypeError, ast.parse, "\u03d5") + + def test_issue18374_binop_col_offset(self): + tree = ast.parse("4+5+6+7") + parent_binop = tree.body[0].value + child_binop = parent_binop.left + grandchild_binop = child_binop.left + self.assertEqual(parent_binop.col_offset, 0) + self.assertEqual(parent_binop.end_col_offset, 7) + self.assertEqual(child_binop.col_offset, 0) + self.assertEqual(child_binop.end_col_offset, 5) + self.assertEqual(grandchild_binop.col_offset, 0) + self.assertEqual(grandchild_binop.end_col_offset, 3) + + tree = ast.parse("4+5-\\\n 6-7") + parent_binop = tree.body[0].value + child_binop = parent_binop.left + grandchild_binop = child_binop.left + self.assertEqual(parent_binop.col_offset, 0) + self.assertEqual(parent_binop.lineno, 1) + self.assertEqual(parent_binop.end_col_offset, 4) + self.assertEqual(parent_binop.end_lineno, 2) + + self.assertEqual(child_binop.col_offset, 0) + self.assertEqual(child_binop.lineno, 1) + self.assertEqual(child_binop.end_col_offset, 2) + self.assertEqual(child_binop.end_lineno, 2) + + self.assertEqual(grandchild_binop.col_offset, 0) + self.assertEqual(grandchild_binop.lineno, 1) + self.assertEqual(grandchild_binop.end_col_offset, 3) + self.assertEqual(grandchild_binop.end_lineno, 1) + + def test_issue39579_dotted_name_end_col_offset(self): + tree = ast.parse("@a.b.c\ndef f(): pass") + attr_b = tree.body[0].decorator_list[0].value + self.assertEqual(attr_b.end_col_offset, 4) + + def test_ast_asdl_signature(self): + self.assertEqual( + ast.withitem.__doc__, "withitem(expr context_expr, expr? optional_vars)" + ) + self.assertEqual(ast.GtE.__doc__, "GtE") + self.assertEqual(ast.Name.__doc__, "Name(identifier id, expr_context ctx)") + self.assertEqual( + ast.cmpop.__doc__, + "cmpop = Eq | NotEq | Lt | LtE | Gt | GtE | Is | IsNot | In | NotIn", + ) + expressions = [f" | {node.__doc__}" for node in ast.expr.__subclasses__()] + expressions[0] = f"expr = {ast.expr.__subclasses__()[0].__doc__}" + self.assertCountEqual(ast.expr.__doc__.split("\n"), expressions) + + def test_positional_only_feature_version(self): + ast.parse("def foo(x, /): ...", feature_version=(3, 8)) + ast.parse("def bar(x=1, /): ...", feature_version=(3, 8)) + with self.assertRaises(SyntaxError): + ast.parse("def foo(x, /): ...", feature_version=(3, 7)) + with self.assertRaises(SyntaxError): + ast.parse("def bar(x=1, /): ...", feature_version=(3, 7)) + + ast.parse("lambda x, /: ...", feature_version=(3, 8)) + ast.parse("lambda x=1, /: ...", feature_version=(3, 8)) + with self.assertRaises(SyntaxError): + ast.parse("lambda x, /: ...", feature_version=(3, 7)) + with self.assertRaises(SyntaxError): + ast.parse("lambda x=1, /: ...", feature_version=(3, 7)) + + def test_assignment_expression_feature_version(self): + ast.parse("(x := 0)", feature_version=(3, 8)) + with self.assertRaises(SyntaxError): + ast.parse("(x := 0)", feature_version=(3, 7)) + + def test_conditional_context_managers_parse_with_low_feature_version(self): + # regression test for gh-115881 + ast.parse("with (x() if y else z()): ...", feature_version=(3, 8)) + + def test_exception_groups_feature_version(self): + code = dedent(""" + try: ... + except* Exception: ... + """) + ast.parse(code) + with self.assertRaises(SyntaxError): + ast.parse(code, feature_version=(3, 10)) + + def test_type_params_feature_version(self): + samples = [ + "type X = int", + "class X[T]: pass", + "def f[T](): pass", + ] + for sample in samples: + with self.subTest(sample): + ast.parse(sample) + with self.assertRaises(SyntaxError): + ast.parse(sample, feature_version=(3, 11)) + + def test_invalid_major_feature_version(self): + with self.assertRaises(ValueError): + ast.parse("pass", feature_version=(2, 7)) + with self.assertRaises(ValueError): + ast.parse("pass", feature_version=(4, 0)) + + def test_constant_as_name(self): + for constant in "True", "False", "None": + expr = ast.Expression(ast.Name(constant, ast.Load())) + ast.fix_missing_locations(expr) + with self.assertRaisesRegex( + ValueError, f"identifier field can't represent '{constant}' constant" + ): + compile(expr, "", "eval") + + def test_precedence_enum(self): + class _Precedence(enum.IntEnum): + """Precedence table that originated from python grammar.""" + + NAMED_EXPR = enum.auto() # := + TUPLE = enum.auto() # , + YIELD = enum.auto() # 'yield', 'yield from' + TEST = enum.auto() # 'if'-'else', 'lambda' + OR = enum.auto() # 'or' + AND = enum.auto() # 'and' + NOT = enum.auto() # 'not' + CMP = enum.auto() # '<', '>', '==', '>=', '<=', '!=', + # 'in', 'not in', 'is', 'is not' + EXPR = enum.auto() + BOR = EXPR # '|' + BXOR = enum.auto() # '^' + BAND = enum.auto() # '&' + SHIFT = enum.auto() # '<<', '>>' + ARITH = enum.auto() # '+', '-' + TERM = enum.auto() # '*', '@', '/', '%', '//' + FACTOR = enum.auto() # unary '+', '-', '~' + POWER = enum.auto() # '**' + AWAIT = enum.auto() # 'await' + ATOM = enum.auto() + + def next(self): + try: + return self.__class__(self + 1) + except ValueError: + return self + + enum._test_simple_enum(_Precedence, ast._Precedence) + + @unittest.skipIf(support.is_wasi, "exhausts limited stack on WASI") + @support.cpython_only + def test_ast_recursion_limit(self): + fail_depth = support.C_RECURSION_LIMIT + 1 + crash_depth = 100_000 + success_depth = int(support.C_RECURSION_LIMIT * 0.9) + + def check_limit(prefix, repeated): + expect_ok = prefix + repeated * success_depth + ast.parse(expect_ok) + for depth in (fail_depth, crash_depth): + broken = prefix + repeated * depth + details = "Compiling ({!r} + {!r} * {})".format(prefix, repeated, depth) + with self.assertRaises(RecursionError, msg=details): + with support.infinite_recursion(): + ast.parse(broken) + + check_limit("a", "()") + check_limit("a", ".b") + check_limit("a", "[0]") + check_limit("a", "*a") + + def test_null_bytes(self): + with self.assertRaises( + SyntaxError, msg="source code string cannot contain null bytes" + ): + ast.parse("a\0b") + + def assert_none_check(self, node: type[ast.AST], attr: str, source: str) -> None: + with self.subTest(f"{node.__name__}.{attr}"): + tree = ast.parse(source) + found = 0 + for child in ast.walk(tree): + if isinstance(child, node): + setattr(child, attr, None) + found += 1 + self.assertEqual(found, 1) + e = re.escape(f"field '{attr}' is required for {node.__name__}") + with self.assertRaisesRegex(ValueError, f"^{e}$"): + compile(tree, "", "exec") + + def test_none_checks(self) -> None: + tests = [ + (ast.alias, "name", "import spam as SPAM"), + (ast.arg, "arg", "def spam(SPAM): spam"), + (ast.comprehension, "target", "[spam for SPAM in spam]"), + (ast.comprehension, "iter", "[spam for spam in SPAM]"), + (ast.keyword, "value", "spam(**SPAM)"), + (ast.match_case, "pattern", "match spam:\n case SPAM: spam"), + (ast.withitem, "context_expr", "with SPAM: spam"), + ] + for node, attr, source in tests: + self.assert_none_check(node, attr, source) + + +class ASTHelpers_Test(unittest.TestCase): + maxDiff = None + + def test_parse(self): + a = ast.parse("foo(1 + 1)") + b = compile("foo(1 + 1)", "", "exec", ast.PyCF_ONLY_AST) + self.assertEqual(ast.dump(a), ast.dump(b)) + + def test_parse_in_error(self): + try: + 1 / 0 + except Exception: + with self.assertRaises(SyntaxError) as e: + ast.literal_eval(r"'\U'") + self.assertIsNotNone(e.exception.__context__) + + 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')], " + "keywords=[]))], type_ignores=[])", + ) + self.assertEqual( + ast.dump(node, annotate_fields=False), + "Module([Expr(Call(Name('spam', Load()), [Name('eggs', Load()), " + "Constant('and cheese')], []))], [])", + ) + self.assertEqual( + ast.dump(node, include_attributes=True), + "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load(), " + "lineno=1, col_offset=0, end_lineno=1, end_col_offset=4), " + "args=[Name(id='eggs', ctx=Load(), lineno=1, col_offset=5, " + "end_lineno=1, end_col_offset=9), Constant(value='and cheese', " + "lineno=1, col_offset=11, end_lineno=1, end_col_offset=23)], keywords=[], " + "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24), " + "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24)], type_ignores=[])", + ) + + def test_dump_indent(self): + node = ast.parse('spam(eggs, "and cheese")') + self.assertEqual( + ast.dump(node, indent=3), + """\ +Module( + body=[ + Expr( + value=Call( + func=Name(id='spam', ctx=Load()), + args=[ + Name(id='eggs', ctx=Load()), + Constant(value='and cheese')], + keywords=[]))], + type_ignores=[])""", + ) + self.assertEqual( + ast.dump(node, annotate_fields=False, indent="\t"), + """\ +Module( +\t[ +\t\tExpr( +\t\t\tCall( +\t\t\t\tName('spam', Load()), +\t\t\t\t[ +\t\t\t\t\tName('eggs', Load()), +\t\t\t\t\tConstant('and cheese')], +\t\t\t\t[]))], +\t[])""", + ) + self.assertEqual( + ast.dump(node, include_attributes=True, indent=3), + """\ +Module( + body=[ + Expr( + value=Call( + func=Name( + id='spam', + ctx=Load(), + lineno=1, + col_offset=0, + end_lineno=1, + end_col_offset=4), + args=[ + Name( + id='eggs', + ctx=Load(), + lineno=1, + col_offset=5, + end_lineno=1, + end_col_offset=9), + Constant( + value='and cheese', + lineno=1, + col_offset=11, + end_lineno=1, + end_col_offset=23)], + keywords=[], + lineno=1, + col_offset=0, + end_lineno=1, + end_col_offset=24), + lineno=1, + col_offset=0, + end_lineno=1, + end_col_offset=24)], + type_ignores=[])""", + ) + + def test_dump_incomplete(self): + node = ast.Raise(lineno=3, col_offset=4) + self.assertEqual(ast.dump(node), "Raise()") + self.assertEqual( + ast.dump(node, include_attributes=True), "Raise(lineno=3, col_offset=4)" + ) + node = ast.Raise(exc=ast.Name(id="e", ctx=ast.Load()), lineno=3, col_offset=4) + self.assertEqual(ast.dump(node), "Raise(exc=Name(id='e', ctx=Load()))") + self.assertEqual( + ast.dump(node, annotate_fields=False), "Raise(Name('e', Load()))" + ) + self.assertEqual( + ast.dump(node, include_attributes=True), + "Raise(exc=Name(id='e', ctx=Load()), lineno=3, col_offset=4)", + ) + self.assertEqual( + ast.dump(node, annotate_fields=False, include_attributes=True), + "Raise(Name('e', Load()), lineno=3, col_offset=4)", + ) + node = ast.Raise(cause=ast.Name(id="e", ctx=ast.Load())) + self.assertEqual(ast.dump(node), "Raise(cause=Name(id='e', ctx=Load()))") + self.assertEqual( + ast.dump(node, annotate_fields=False), "Raise(cause=Name('e', Load()))" + ) + + def test_copy_location(self): + src = ast.parse("1 + 1", mode="eval") + src.body.right = ast.copy_location(ast.Constant(2), src.body.right) + self.assertEqual( + ast.dump(src, include_attributes=True), + "Expression(body=BinOp(left=Constant(value=1, lineno=1, col_offset=0, " + "end_lineno=1, end_col_offset=1), op=Add(), right=Constant(value=2, " + "lineno=1, col_offset=4, end_lineno=1, end_col_offset=5), lineno=1, " + "col_offset=0, end_lineno=1, end_col_offset=5))", + ) + src = ast.Call(col_offset=1, lineno=1, end_lineno=1, end_col_offset=1) + new = ast.copy_location(src, ast.Call(col_offset=None, lineno=None)) + self.assertIsNone(new.end_lineno) + self.assertIsNone(new.end_col_offset) + self.assertEqual(new.lineno, 1) + self.assertEqual(new.col_offset, 1) + + def test_fix_missing_locations(self): + src = ast.parse('write("spam")') + src.body.append( + ast.Expr(ast.Call(ast.Name("spam", ast.Load()), [ast.Constant("eggs")], [])) + ) + self.assertEqual(src, ast.fix_missing_locations(src)) + self.maxDiff = None + 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, " + "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(), " + "lineno=1, col_offset=0, end_lineno=1, end_col_offset=0), " + "args=[Constant(value='eggs', lineno=1, col_offset=0, end_lineno=1, " + "end_col_offset=0)], keywords=[], lineno=1, col_offset=0, end_lineno=1, " + "end_col_offset=0), lineno=1, col_offset=0, end_lineno=1, end_col_offset=0)], " + "type_ignores=[])", + ) + + 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, " + "lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, " + "col_offset=0, end_lineno=4, end_col_offset=5))", + ) + # issue10869: do not increment lineno of root twice + 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, " + "lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, " + "col_offset=0, end_lineno=4, end_col_offset=5))", + ) + src = ast.Call( + func=ast.Name("test", ast.Load()), args=[], keywords=[], lineno=1 + ) + self.assertEqual(ast.increment_lineno(src).lineno, 2) + self.assertIsNone(ast.increment_lineno(src).end_lineno) + + def test_increment_lineno_on_module(self): + src = ast.parse( + dedent("""\ + a = 1 + b = 2 # type: ignore + c = 3 + d = 4 # type: ignore@tag + """), + type_comments=True, + ) + ast.increment_lineno(src, n=5) + self.assertEqual(src.type_ignores[0].lineno, 7) + self.assertEqual(src.type_ignores[1].lineno, 9) + self.assertEqual(src.type_ignores[1].tag, "@tag") + + def test_iter_fields(self): + node = ast.parse("foo()", mode="eval") + d = dict(ast.iter_fields(node.body)) + self.assertEqual(d.pop("func").id, "foo") + self.assertEqual(d, {"keywords": [], "args": []}) + + def test_iter_child_nodes(self): + node = ast.parse("spam(23, 42, eggs='leek')", mode="eval") + self.assertEqual(len(list(ast.iter_child_nodes(node.body))), 4) + iterator = ast.iter_child_nodes(node.body) + self.assertEqual(next(iterator).id, "spam") + 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'))", + ) + + def test_get_docstring(self): + node = ast.parse('"""line one\n line two"""') + self.assertEqual(ast.get_docstring(node), "line one\nline two") + + node = ast.parse('class foo:\n """line one\n line two"""') + self.assertEqual(ast.get_docstring(node.body[0]), "line one\nline two") + + node = ast.parse('def foo():\n """line one\n line two"""') + self.assertEqual(ast.get_docstring(node.body[0]), "line one\nline two") + + node = ast.parse('async def foo():\n """spam\n ham"""') + self.assertEqual(ast.get_docstring(node.body[0]), "spam\nham") + + node = ast.parse('async def foo():\n """spam\n ham"""') + self.assertEqual(ast.get_docstring(node.body[0], clean=False), "spam\n ham") + + node = ast.parse("x") + self.assertRaises(TypeError, ast.get_docstring, node.body[0]) + + def test_get_docstring_none(self): + self.assertIsNone(ast.get_docstring(ast.parse(""))) + node = ast.parse('x = "not docstring"') + self.assertIsNone(ast.get_docstring(node)) + node = ast.parse("def foo():\n pass") + self.assertIsNone(ast.get_docstring(node)) + + node = ast.parse("class foo:\n pass") + self.assertIsNone(ast.get_docstring(node.body[0])) + node = ast.parse('class foo:\n x = "not docstring"') + self.assertIsNone(ast.get_docstring(node.body[0])) + node = ast.parse("class foo:\n def bar(self): pass") + self.assertIsNone(ast.get_docstring(node.body[0])) + + node = ast.parse("def foo():\n pass") + self.assertIsNone(ast.get_docstring(node.body[0])) + node = ast.parse('def foo():\n x = "not docstring"') + self.assertIsNone(ast.get_docstring(node.body[0])) + + node = ast.parse("async def foo():\n pass") + self.assertIsNone(ast.get_docstring(node.body[0])) + node = ast.parse('async def foo():\n x = "not docstring"') + self.assertIsNone(ast.get_docstring(node.body[0])) + + node = ast.parse("async def foo():\n 42") + self.assertIsNone(ast.get_docstring(node.body[0])) + + def test_multi_line_docstring_col_offset_and_lineno_issue16806(self): + node = ast.parse( + '"""line one\nline two"""\n\n' + 'def foo():\n """line one\n line two"""\n\n' + ' def bar():\n """line one\n line two"""\n' + ' """line one\n line two"""\n' + '"""line one\nline two"""\n\n' + ) + self.assertEqual(node.body[0].col_offset, 0) + self.assertEqual(node.body[0].lineno, 1) + self.assertEqual(node.body[1].body[0].col_offset, 2) + self.assertEqual(node.body[1].body[0].lineno, 5) + self.assertEqual(node.body[1].body[1].body[0].col_offset, 4) + self.assertEqual(node.body[1].body[1].body[0].lineno, 9) + self.assertEqual(node.body[1].body[2].col_offset, 2) + self.assertEqual(node.body[1].body[2].lineno, 11) + self.assertEqual(node.body[2].col_offset, 0) + self.assertEqual(node.body[2].lineno, 13) + + def test_elif_stmt_start_position(self): + node = ast.parse("if a:\n pass\nelif b:\n pass\n") + elif_stmt = node.body[0].orelse[0] + self.assertEqual(elif_stmt.lineno, 3) + self.assertEqual(elif_stmt.col_offset, 0) + + def test_elif_stmt_start_position_with_else(self): + node = ast.parse("if a:\n pass\nelif b:\n pass\nelse:\n pass\n") + elif_stmt = node.body[0].orelse[0] + self.assertEqual(elif_stmt.lineno, 3) + self.assertEqual(elif_stmt.col_offset, 0) + + def test_starred_expr_end_position_within_call(self): + node = ast.parse("f(*[0, 1])") + starred_expr = node.body[0].value.args[0] + self.assertEqual(starred_expr.end_lineno, 1) + self.assertEqual(starred_expr.end_col_offset, 9) + + def test_literal_eval(self): + self.assertEqual(ast.literal_eval("[1, 2, 3]"), [1, 2, 3]) + self.assertEqual(ast.literal_eval('{"foo": 42}'), {"foo": 42}) + self.assertEqual(ast.literal_eval("(True, False, None)"), (True, False, None)) + self.assertEqual(ast.literal_eval("{1, 2, 3}"), {1, 2, 3}) + self.assertEqual(ast.literal_eval('b"hi"'), b"hi") + self.assertEqual(ast.literal_eval("set()"), set()) + self.assertRaises(ValueError, ast.literal_eval, "foo()") + self.assertEqual(ast.literal_eval("6"), 6) + self.assertEqual(ast.literal_eval("+6"), 6) + self.assertEqual(ast.literal_eval("-6"), -6) + self.assertEqual(ast.literal_eval("3.25"), 3.25) + self.assertEqual(ast.literal_eval("+3.25"), 3.25) + self.assertEqual(ast.literal_eval("-3.25"), -3.25) + self.assertEqual(repr(ast.literal_eval("-0.0")), "-0.0") + self.assertRaises(ValueError, ast.literal_eval, "++6") + self.assertRaises(ValueError, ast.literal_eval, "+True") + self.assertRaises(ValueError, ast.literal_eval, "2+3") + + def test_literal_eval_str_int_limit(self): + with support.adjust_int_max_str_digits(4000): + ast.literal_eval("3" * 4000) # no error + with self.assertRaises(SyntaxError) as err_ctx: + ast.literal_eval("3" * 4001) + self.assertIn("Exceeds the limit ", str(err_ctx.exception)) + self.assertIn(" Consider hexadecimal ", str(err_ctx.exception)) + + def test_literal_eval_complex(self): + # Issue #4907 + self.assertEqual(ast.literal_eval("6j"), 6j) + self.assertEqual(ast.literal_eval("-6j"), -6j) + self.assertEqual(ast.literal_eval("6.75j"), 6.75j) + self.assertEqual(ast.literal_eval("-6.75j"), -6.75j) + self.assertEqual(ast.literal_eval("3+6j"), 3 + 6j) + self.assertEqual(ast.literal_eval("-3+6j"), -3 + 6j) + self.assertEqual(ast.literal_eval("3-6j"), 3 - 6j) + self.assertEqual(ast.literal_eval("-3-6j"), -3 - 6j) + self.assertEqual(ast.literal_eval("3.25+6.75j"), 3.25 + 6.75j) + self.assertEqual(ast.literal_eval("-3.25+6.75j"), -3.25 + 6.75j) + self.assertEqual(ast.literal_eval("3.25-6.75j"), 3.25 - 6.75j) + self.assertEqual(ast.literal_eval("-3.25-6.75j"), -3.25 - 6.75j) + self.assertEqual(ast.literal_eval("(3+6j)"), 3 + 6j) + self.assertRaises(ValueError, ast.literal_eval, "-6j+3") + self.assertRaises(ValueError, ast.literal_eval, "-6j+3j") + self.assertRaises(ValueError, ast.literal_eval, "3+-6j") + self.assertRaises(ValueError, ast.literal_eval, "3+(0+6j)") + self.assertRaises(ValueError, ast.literal_eval, "-(3+6j)") + + def test_literal_eval_malformed_dict_nodes(self): + malformed = ast.Dict( + keys=[ast.Constant(1), ast.Constant(2)], values=[ast.Constant(3)] + ) + self.assertRaises(ValueError, ast.literal_eval, malformed) + malformed = ast.Dict( + keys=[ast.Constant(1)], values=[ast.Constant(2), ast.Constant(3)] + ) + self.assertRaises(ValueError, ast.literal_eval, malformed) + + def test_literal_eval_trailing_ws(self): + self.assertEqual(ast.literal_eval(" -1"), -1) + self.assertEqual(ast.literal_eval("\t\t-1"), -1) + self.assertEqual(ast.literal_eval(" \t -1"), -1) + self.assertRaises(IndentationError, ast.literal_eval, "\n -1") + + def test_literal_eval_malformed_lineno(self): + msg = r"malformed node or string on line 3:" + with self.assertRaisesRegex(ValueError, msg): + ast.literal_eval("{'a': 1,\n'b':2,\n'c':++3,\n'd':4}") + + node = ast.UnaryOp(ast.UAdd(), ast.UnaryOp(ast.UAdd(), ast.Constant(6))) + self.assertIsNone(getattr(node, "lineno", None)) + msg = r"malformed node or string:" + with self.assertRaisesRegex(ValueError, msg): + ast.literal_eval(node) + + def test_literal_eval_syntax_errors(self): + with self.assertRaisesRegex(SyntaxError, "unexpected indent"): + ast.literal_eval(r""" + \ + (\ + \ """) + + def test_bad_integer(self): + # issue13436: Bad error message with invalid numeric values + body = [ + ast.ImportFrom( + module="time", + names=[ast.alias(name="sleep")], + level=None, + lineno=None, + col_offset=None, + ) + ] + mod = ast.Module(body, []) + with self.assertRaises(ValueError) as cm: + compile(mod, "test", "exec") + self.assertIn("invalid integer value: None", str(cm.exception)) + + def test_level_as_none(self): + body = [ + ast.ImportFrom( + module="time", + names=[ast.alias(name="sleep", lineno=0, col_offset=0)], + level=None, + lineno=0, + col_offset=0, + ) + ] + mod = ast.Module(body, []) + code = compile(mod, "test", "exec") + ns = {} + exec(code, ns) + self.assertIn("sleep", ns) + + def test_recursion_direct(self): + e = ast.UnaryOp(op=ast.Not(), lineno=0, col_offset=0) + e.operand = e + with self.assertRaises(RecursionError): + with support.infinite_recursion(): + compile(ast.Expression(e), "", "eval") + + def test_recursion_indirect(self): + e = ast.UnaryOp(op=ast.Not(), lineno=0, col_offset=0) + f = ast.UnaryOp(op=ast.Not(), lineno=0, col_offset=0) + e.operand = f + f.operand = e + with self.assertRaises(RecursionError): + with support.infinite_recursion(): + compile(ast.Expression(e), "", "eval") + + +class ASTValidatorTests(unittest.TestCase): + def mod(self, mod, msg=None, mode="exec", *, exc=ValueError): + mod.lineno = mod.col_offset = 0 + ast.fix_missing_locations(mod) + if msg is None: + compile(mod, "", mode) + else: + with self.assertRaises(exc) as cm: + compile(mod, "", mode) + self.assertIn(msg, str(cm.exception)) + + def expr(self, node, msg=None, *, exc=ValueError): + mod = ast.Module([ast.Expr(node)], []) + self.mod(mod, msg, exc=exc) + + def stmt(self, stmt, msg=None): + mod = ast.Module([stmt], []) + self.mod(mod, msg) + + def test_module(self): + m = ast.Interactive([ast.Expr(ast.Name("x", ast.Store()))]) + self.mod(m, "must have Load context", "single") + m = ast.Expression(ast.Name("x", ast.Store())) + self.mod(m, "must have Load context", "eval") + + def _check_arguments(self, fac, check): + def arguments( + args=None, + posonlyargs=None, + vararg=None, + kwonlyargs=None, + kwarg=None, + defaults=None, + kw_defaults=None, + ): + if args is None: + args = [] + if posonlyargs is None: + posonlyargs = [] + if kwonlyargs is None: + kwonlyargs = [] + if defaults is None: + defaults = [] + if kw_defaults is None: + kw_defaults = [] + args = ast.arguments( + args, posonlyargs, vararg, kwonlyargs, kw_defaults, kwarg, defaults + ) + return fac(args) + + args = [ast.arg("x", ast.Name("x", ast.Store()))] + check(arguments(args=args), "must have Load context") + check(arguments(posonlyargs=args), "must have Load context") + check(arguments(kwonlyargs=args), "must have Load context") + check( + arguments(defaults=[ast.Constant(3)]), "more positional defaults than args" + ) + check( + arguments(kw_defaults=[ast.Constant(4)]), + "length of kwonlyargs is not the same as kw_defaults", + ) + args = [ast.arg("x", ast.Name("x", ast.Load()))] + check( + arguments(args=args, defaults=[ast.Name("x", ast.Store())]), + "must have Load context", + ) + args = [ + ast.arg("a", ast.Name("x", ast.Load())), + ast.arg("b", ast.Name("y", ast.Load())), + ] + check( + arguments(kwonlyargs=args, kw_defaults=[None, ast.Name("x", ast.Store())]), + "must have Load context", + ) + + def test_funcdef(self): + a = ast.arguments([], [], None, [], [], None, []) + f = ast.FunctionDef("x", a, [], [], None, None, []) + self.stmt(f, "empty body on FunctionDef") + f = ast.FunctionDef( + "x", a, [ast.Pass()], [ast.Name("x", ast.Store())], None, None, [] + ) + self.stmt(f, "must have Load context") + f = ast.FunctionDef( + "x", a, [ast.Pass()], [], ast.Name("x", ast.Store()), None, [] + ) + self.stmt(f, "must have Load context") + f = ast.FunctionDef("x", ast.arguments(), [ast.Pass()]) + self.stmt(f) + + def fac(args): + return ast.FunctionDef("x", args, [ast.Pass()], [], None, None, []) + + self._check_arguments(fac, self.stmt) + + def test_funcdef_pattern_matching(self): + # gh-104799: New fields on FunctionDef should be added at the end + def matcher(node): + match node: + case ast.FunctionDef( + "foo", + ast.arguments(args=[ast.arg("bar")]), + [ast.Pass()], + [ast.Name("capybara", ast.Load())], + ast.Name("pacarana", ast.Load()), + ): + return True + case _: + return False + + code = """ + @capybara + def foo(bar) -> pacarana: + pass + """ + source = ast.parse(textwrap.dedent(code)) + funcdef = source.body[0] + self.assertIsInstance(funcdef, ast.FunctionDef) + self.assertTrue(matcher(funcdef)) + + def test_classdef(self): + def cls( + bases=None, keywords=None, body=None, decorator_list=None, type_params=None + ): + if bases is None: + bases = [] + if keywords is None: + keywords = [] + if body is None: + body = [ast.Pass()] + if decorator_list is None: + decorator_list = [] + if type_params is None: + type_params = [] + return ast.ClassDef( + "myclass", bases, keywords, body, decorator_list, type_params + ) + + self.stmt(cls(bases=[ast.Name("x", ast.Store())]), "must have Load context") + self.stmt( + cls(keywords=[ast.keyword("x", ast.Name("x", ast.Store()))]), + "must have Load context", + ) + self.stmt(cls(body=[]), "empty body on ClassDef") + self.stmt(cls(body=[None]), "None disallowed") + self.stmt( + cls(decorator_list=[ast.Name("x", ast.Store())]), "must have Load context" + ) + + def test_delete(self): + self.stmt(ast.Delete([]), "empty targets on Delete") + self.stmt(ast.Delete([None]), "None disallowed") + self.stmt(ast.Delete([ast.Name("x", ast.Load())]), "must have Del context") + + def test_assign(self): + self.stmt(ast.Assign([], ast.Constant(3)), "empty targets on Assign") + self.stmt(ast.Assign([None], ast.Constant(3)), "None disallowed") + self.stmt( + ast.Assign([ast.Name("x", ast.Load())], ast.Constant(3)), + "must have Store context", + ) + self.stmt( + ast.Assign([ast.Name("x", ast.Store())], ast.Name("y", ast.Store())), + "must have Load context", + ) + + def test_augassign(self): + aug = ast.AugAssign( + ast.Name("x", ast.Load()), ast.Add(), ast.Name("y", ast.Load()) + ) + self.stmt(aug, "must have Store context") + aug = ast.AugAssign( + ast.Name("x", ast.Store()), ast.Add(), ast.Name("y", ast.Store()) + ) + self.stmt(aug, "must have Load context") + + def test_for(self): + x = ast.Name("x", ast.Store()) + y = ast.Name("y", ast.Load()) + p = ast.Pass() + self.stmt(ast.For(x, y, [], []), "empty body on For") + self.stmt( + ast.For(ast.Name("x", ast.Load()), y, [p], []), "must have Store context" + ) + self.stmt( + ast.For(x, ast.Name("y", ast.Store()), [p], []), "must have Load context" + ) + e = ast.Expr(ast.Name("x", ast.Store())) + self.stmt(ast.For(x, y, [e], []), "must have Load context") + self.stmt(ast.For(x, y, [p], [e]), "must have Load context") + + def test_while(self): + self.stmt(ast.While(ast.Constant(3), [], []), "empty body on While") + self.stmt( + ast.While(ast.Name("x", ast.Store()), [ast.Pass()], []), + "must have Load context", + ) + self.stmt( + ast.While( + ast.Constant(3), [ast.Pass()], [ast.Expr(ast.Name("x", ast.Store()))] + ), + "must have Load context", + ) + + def test_if(self): + self.stmt(ast.If(ast.Constant(3), [], []), "empty body on If") + i = ast.If(ast.Name("x", ast.Store()), [ast.Pass()], []) + self.stmt(i, "must have Load context") + i = ast.If(ast.Constant(3), [ast.Expr(ast.Name("x", ast.Store()))], []) + self.stmt(i, "must have Load context") + i = ast.If( + ast.Constant(3), [ast.Pass()], [ast.Expr(ast.Name("x", ast.Store()))] + ) + self.stmt(i, "must have Load context") + + def test_with(self): + p = ast.Pass() + self.stmt(ast.With([], [p]), "empty items on With") + i = ast.withitem(ast.Constant(3), None) + self.stmt(ast.With([i], []), "empty body on With") + i = ast.withitem(ast.Name("x", ast.Store()), None) + self.stmt(ast.With([i], [p]), "must have Load context") + i = ast.withitem(ast.Constant(3), ast.Name("x", ast.Load())) + self.stmt(ast.With([i], [p]), "must have Store context") + + def test_raise(self): + r = ast.Raise(None, ast.Constant(3)) + self.stmt(r, "Raise with cause but no exception") + r = ast.Raise(ast.Name("x", ast.Store()), None) + self.stmt(r, "must have Load context") + r = ast.Raise(ast.Constant(4), ast.Name("x", ast.Store())) + self.stmt(r, "must have Load context") + + def test_try(self): + p = ast.Pass() + t = ast.Try([], [], [], [p]) + self.stmt(t, "empty body on Try") + t = ast.Try([ast.Expr(ast.Name("x", ast.Store()))], [], [], [p]) + self.stmt(t, "must have Load context") + t = ast.Try([p], [], [], []) + self.stmt(t, "Try has neither except handlers nor finalbody") + t = ast.Try([p], [], [p], [p]) + self.stmt(t, "Try has orelse but no except handlers") + t = ast.Try([p], [ast.ExceptHandler(None, "x", [])], [], []) + self.stmt(t, "empty body on ExceptHandler") + e = [ast.ExceptHandler(ast.Name("x", ast.Store()), "y", [p])] + self.stmt(ast.Try([p], e, [], []), "must have Load context") + e = [ast.ExceptHandler(None, "x", [p])] + t = ast.Try([p], e, [ast.Expr(ast.Name("x", ast.Store()))], [p]) + self.stmt(t, "must have Load context") + t = ast.Try([p], e, [p], [ast.Expr(ast.Name("x", ast.Store()))]) + self.stmt(t, "must have Load context") + + def test_try_star(self): + p = ast.Pass() + t = ast.TryStar([], [], [], [p]) + self.stmt(t, "empty body on TryStar") + t = ast.TryStar([ast.Expr(ast.Name("x", ast.Store()))], [], [], [p]) + self.stmt(t, "must have Load context") + t = ast.TryStar([p], [], [], []) + self.stmt(t, "TryStar has neither except handlers nor finalbody") + t = ast.TryStar([p], [], [p], [p]) + self.stmt(t, "TryStar has orelse but no except handlers") + t = ast.TryStar([p], [ast.ExceptHandler(None, "x", [])], [], []) + self.stmt(t, "empty body on ExceptHandler") + e = [ast.ExceptHandler(ast.Name("x", ast.Store()), "y", [p])] + self.stmt(ast.TryStar([p], e, [], []), "must have Load context") + e = [ast.ExceptHandler(None, "x", [p])] + t = ast.TryStar([p], e, [ast.Expr(ast.Name("x", ast.Store()))], [p]) + self.stmt(t, "must have Load context") + t = ast.TryStar([p], e, [p], [ast.Expr(ast.Name("x", ast.Store()))]) + self.stmt(t, "must have Load context") + + def test_assert(self): + self.stmt( + ast.Assert(ast.Name("x", ast.Store()), None), "must have Load context" + ) + assrt = ast.Assert(ast.Name("x", ast.Load()), ast.Name("y", ast.Store())) + self.stmt(assrt, "must have Load context") + + def test_import(self): + self.stmt(ast.Import([]), "empty names on Import") + + def test_importfrom(self): + imp = ast.ImportFrom(None, [ast.alias("x", None)], -42) + self.stmt(imp, "Negative ImportFrom level") + self.stmt(ast.ImportFrom(None, [], 0), "empty names on ImportFrom") + + def test_global(self): + self.stmt(ast.Global([]), "empty names on Global") + + def test_nonlocal(self): + self.stmt(ast.Nonlocal([]), "empty names on Nonlocal") + + def test_expr(self): + e = ast.Expr(ast.Name("x", ast.Store())) + self.stmt(e, "must have Load context") + + def test_boolop(self): + b = ast.BoolOp(ast.And(), []) + self.expr(b, "less than 2 values") + b = ast.BoolOp(ast.And(), [ast.Constant(3)]) + self.expr(b, "less than 2 values") + b = ast.BoolOp(ast.And(), [ast.Constant(4), None]) + self.expr(b, "None disallowed") + b = ast.BoolOp(ast.And(), [ast.Constant(4), ast.Name("x", ast.Store())]) + self.expr(b, "must have Load context") + + def test_unaryop(self): + u = ast.UnaryOp(ast.Not(), ast.Name("x", ast.Store())) + self.expr(u, "must have Load context") + + def test_lambda(self): + a = ast.arguments([], [], None, [], [], None, []) + self.expr(ast.Lambda(a, ast.Name("x", ast.Store())), "must have Load context") + + def fac(args): + return ast.Lambda(args, ast.Name("x", ast.Load())) + + self._check_arguments(fac, self.expr) + + def test_ifexp(self): + l = ast.Name("x", ast.Load()) + s = ast.Name("y", ast.Store()) + for args in (s, l, l), (l, s, l), (l, l, s): + self.expr(ast.IfExp(*args), "must have Load context") + + def test_dict(self): + d = ast.Dict([], [ast.Name("x", ast.Load())]) + self.expr(d, "same number of keys as values") + d = ast.Dict([ast.Name("x", ast.Load())], [None]) + self.expr(d, "None disallowed") + + def test_set(self): + self.expr(ast.Set([None]), "None disallowed") + s = ast.Set([ast.Name("x", ast.Store())]) + self.expr(s, "must have Load context") + + def _check_comprehension(self, fac): + self.expr(fac([]), "comprehension with no generators") + g = ast.comprehension( + ast.Name("x", ast.Load()), ast.Name("x", ast.Load()), [], 0 + ) + self.expr(fac([g]), "must have Store context") + g = ast.comprehension( + ast.Name("x", ast.Store()), ast.Name("x", ast.Store()), [], 0 + ) + self.expr(fac([g]), "must have Load context") + x = ast.Name("x", ast.Store()) + y = ast.Name("y", ast.Load()) + g = ast.comprehension(x, y, [None], 0) + self.expr(fac([g]), "None disallowed") + g = ast.comprehension(x, y, [ast.Name("x", ast.Store())], 0) + self.expr(fac([g]), "must have Load context") + + def _simple_comp(self, fac): + g = ast.comprehension( + ast.Name("x", ast.Store()), ast.Name("x", ast.Load()), [], 0 + ) + self.expr(fac(ast.Name("x", ast.Store()), [g]), "must have Load context") + + def wrap(gens): + return fac(ast.Name("x", ast.Store()), gens) + + self._check_comprehension(wrap) + + def test_listcomp(self): + self._simple_comp(ast.ListComp) + + def test_setcomp(self): + self._simple_comp(ast.SetComp) + + def test_generatorexp(self): + self._simple_comp(ast.GeneratorExp) + + def test_dictcomp(self): + g = ast.comprehension( + ast.Name("y", ast.Store()), ast.Name("p", ast.Load()), [], 0 + ) + c = ast.DictComp(ast.Name("x", ast.Store()), ast.Name("y", ast.Load()), [g]) + self.expr(c, "must have Load context") + c = ast.DictComp(ast.Name("x", ast.Load()), ast.Name("y", ast.Store()), [g]) + self.expr(c, "must have Load context") + + def factory(comps): + k = ast.Name("x", ast.Load()) + v = ast.Name("y", ast.Load()) + return ast.DictComp(k, v, comps) + + self._check_comprehension(factory) + + def test_yield(self): + self.expr(ast.Yield(ast.Name("x", ast.Store())), "must have Load") + self.expr(ast.YieldFrom(ast.Name("x", ast.Store())), "must have Load") + + def test_compare(self): + left = ast.Name("x", ast.Load()) + comp = ast.Compare(left, [ast.In()], []) + self.expr(comp, "no comparators") + comp = ast.Compare(left, [ast.In()], [ast.Constant(4), ast.Constant(5)]) + self.expr(comp, "different number of comparators and operands") + comp = ast.Compare(ast.Constant("blah"), [ast.In()], [left]) + self.expr(comp) + comp = ast.Compare(left, [ast.In()], [ast.Constant("blah")]) + self.expr(comp) + + def test_call(self): + func = ast.Name("x", ast.Load()) + args = [ast.Name("y", ast.Load())] + keywords = [ast.keyword("w", ast.Name("z", ast.Load()))] + call = ast.Call(ast.Name("x", ast.Store()), args, keywords) + self.expr(call, "must have Load context") + call = ast.Call(func, [None], keywords) + self.expr(call, "None disallowed") + bad_keywords = [ast.keyword("w", ast.Name("z", ast.Store()))] + call = ast.Call(func, args, bad_keywords) + self.expr(call, "must have Load context") + + def test_num(self): + with warnings.catch_warnings(record=True) as wlog: + warnings.filterwarnings("ignore", "", DeprecationWarning) + from ast import Num + + with warnings.catch_warnings(record=True) as wlog: + warnings.filterwarnings("always", "", DeprecationWarning) + + class subint(int): + pass + + class subfloat(float): + pass + + class subcomplex(complex): + pass + + for obj in "0", "hello": + self.expr(ast.Num(obj)) + for obj in subint(), subfloat(), subcomplex(): + self.expr(ast.Num(obj), "invalid type", exc=TypeError) + + self.assertEqual( + [str(w.message) for w in wlog], + [ + "ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead", + "ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead", + "ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead", + "ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead", + "ast.Num is deprecated and will be removed in Python 3.14; use ast.Constant instead", + ], + ) + + def test_attribute(self): + attr = ast.Attribute(ast.Name("x", ast.Store()), "y", ast.Load()) + self.expr(attr, "must have Load context") + + def test_subscript(self): + sub = ast.Subscript(ast.Name("x", ast.Store()), ast.Constant(3), ast.Load()) + self.expr(sub, "must have Load context") + x = ast.Name("x", ast.Load()) + sub = ast.Subscript(x, ast.Name("y", ast.Store()), ast.Load()) + self.expr(sub, "must have Load context") + s = ast.Name("x", ast.Store()) + for args in (s, None, None), (None, s, None), (None, None, s): + sl = ast.Slice(*args) + self.expr(ast.Subscript(x, sl, ast.Load()), "must have Load context") + sl = ast.Tuple([], ast.Load()) + self.expr(ast.Subscript(x, sl, ast.Load())) + sl = ast.Tuple([s], ast.Load()) + self.expr(ast.Subscript(x, sl, ast.Load()), "must have Load context") + + def test_starred(self): + left = ast.List( + [ast.Starred(ast.Name("x", ast.Load()), ast.Store())], ast.Store() + ) + assign = ast.Assign([left], ast.Constant(4)) + self.stmt(assign, "must have Store context") + + def _sequence(self, fac): + self.expr(fac([None], ast.Load()), "None disallowed") + self.expr( + fac([ast.Name("x", ast.Store())], ast.Load()), "must have Load context" + ) + + def test_list(self): + self._sequence(ast.List) + + def test_tuple(self): + self._sequence(ast.Tuple) + + def test_nameconstant(self): + with warnings.catch_warnings(record=True) as wlog: + warnings.filterwarnings("ignore", "", DeprecationWarning) + from ast import NameConstant + + with warnings.catch_warnings(record=True) as wlog: + warnings.filterwarnings("always", "", DeprecationWarning) + self.expr(ast.NameConstant(4)) + + self.assertEqual( + [str(w.message) for w in wlog], + [ + "ast.NameConstant is deprecated and will be removed in Python 3.14; use ast.Constant instead", + ], + ) + + @support.requires_resource("cpu") + def test_stdlib_validates(self): + stdlib = os.path.dirname(ast.__file__) + tests = [fn for fn in os.listdir(stdlib) if fn.endswith(".py")] + tests.extend(["test/test_grammar.py", "test/test_unpack_ex.py"]) + for module in tests: + with self.subTest(module): + fn = os.path.join(stdlib, module) + with open(fn, "r", encoding="utf-8") as fp: + source = fp.read() + mod = ast.parse(source, fn) + compile(mod, fn, "exec") + + constant_1 = ast.Constant(1) + pattern_1 = ast.MatchValue(constant_1) + + constant_x = ast.Constant("x") + pattern_x = ast.MatchValue(constant_x) + + constant_true = ast.Constant(True) + pattern_true = ast.MatchSingleton(True) + + name_carter = ast.Name("carter", ast.Load()) + + _MATCH_PATTERNS = [ + ast.MatchValue( + ast.Attribute( + ast.Attribute(ast.Name("x", ast.Store()), "y", ast.Load()), + "z", + ast.Load(), + ) + ), + ast.MatchValue( + ast.Attribute( + ast.Attribute(ast.Name("x", ast.Load()), "y", ast.Store()), + "z", + ast.Load(), + ) + ), + ast.MatchValue(ast.Constant(...)), + ast.MatchValue(ast.Constant(True)), + ast.MatchValue(ast.Constant((1, 2, 3))), + ast.MatchSingleton("string"), + ast.MatchSequence([ast.MatchSingleton("string")]), + ast.MatchSequence([ast.MatchSequence([ast.MatchSingleton("string")])]), + ast.MatchMapping([constant_1, constant_true], [pattern_x]), + ast.MatchMapping( + [constant_true, constant_1], [pattern_x, pattern_1], rest="True" + ), + ast.MatchMapping( + [constant_true, ast.Starred(ast.Name("lol", ast.Load()), ast.Load())], + [pattern_x, pattern_1], + rest="legit", + ), + ast.MatchClass( + ast.Attribute(ast.Attribute(constant_x, "y", ast.Load()), "z", ast.Load()), + patterns=[], + kwd_attrs=[], + kwd_patterns=[], + ), + ast.MatchClass( + name_carter, patterns=[], kwd_attrs=["True"], kwd_patterns=[pattern_1] + ), + ast.MatchClass( + name_carter, patterns=[], kwd_attrs=[], kwd_patterns=[pattern_1] + ), + ast.MatchClass( + name_carter, + patterns=[ast.MatchSingleton("string")], + kwd_attrs=[], + kwd_patterns=[], + ), + ast.MatchClass( + name_carter, patterns=[ast.MatchStar()], kwd_attrs=[], kwd_patterns=[] + ), + ast.MatchClass( + name_carter, patterns=[], kwd_attrs=[], kwd_patterns=[ast.MatchStar()] + ), + ast.MatchClass( + constant_true, # invalid name + patterns=[], + kwd_attrs=["True"], + kwd_patterns=[pattern_1], + ), + ast.MatchSequence([ast.MatchStar("True")]), + ast.MatchAs(name="False"), + ast.MatchOr([]), + ast.MatchOr([pattern_1]), + ast.MatchOr([pattern_1, pattern_x, ast.MatchSingleton("xxx")]), + ast.MatchAs(name="_"), + ast.MatchStar(name="x"), + ast.MatchSequence([ast.MatchStar("_")]), + ast.MatchMapping([], [], rest="_"), + ] + + def test_match_validation_pattern(self): + name_x = ast.Name("x", ast.Load()) + for pattern in self._MATCH_PATTERNS: + with self.subTest(ast.dump(pattern, indent=4)): + node = ast.Match( + subject=name_x, + cases=[ast.match_case(pattern=pattern, body=[ast.Pass()])], + ) + node = ast.fix_missing_locations(node) + module = ast.Module([node], []) + with self.assertRaises(ValueError): + compile(module, "", "exec") + + +class ConstantTests(unittest.TestCase): + """Tests on the ast.Constant node type.""" + + def compile_constant(self, value): + tree = ast.parse("x = 123") + + node = tree.body[0].value + new_node = ast.Constant(value=value) + ast.copy_location(new_node, node) + tree.body[0].value = new_node + + code = compile(tree, "", "exec") + + ns = {} + exec(code, ns) + return ns["x"] + + def test_validation(self): + with self.assertRaises(TypeError) as cm: + self.compile_constant([1, 2, 3]) + self.assertEqual(str(cm.exception), "got an invalid type in Constant: list") + + def test_singletons(self): + for const in (None, False, True, Ellipsis, b"", frozenset()): + with self.subTest(const=const): + value = self.compile_constant(const) + self.assertIs(value, const) + + def test_values(self): + nested_tuple = (1,) + nested_frozenset = frozenset({1}) + for level in range(3): + nested_tuple = (nested_tuple, 2) + nested_frozenset = frozenset({nested_frozenset, 2}) + values = ( + 123, + 123.0, + 123j, + "unicode", + b"bytes", + tuple("tuple"), + frozenset("frozenset"), + nested_tuple, + nested_frozenset, + ) + for value in values: + with self.subTest(value=value): + result = self.compile_constant(value) + self.assertEqual(result, value) + + def test_assign_to_constant(self): + tree = ast.parse("x = 1") + + target = tree.body[0].targets[0] + new_target = ast.Constant(value=1) + ast.copy_location(new_target, target) + tree.body[0].targets[0] = new_target + + with self.assertRaises(ValueError) as cm: + compile(tree, "string", "exec") + self.assertEqual( + str(cm.exception), + "expression which can't be assigned " "to in Store context", + ) + + def test_get_docstring(self): + tree = ast.parse("'docstring'\nx = 1") + self.assertEqual(ast.get_docstring(tree), "docstring") + + def get_load_const(self, tree): + # Compile to bytecode, disassemble and get parameter of LOAD_CONST + # instructions + co = compile(tree, "", "exec") + consts = [] + for instr in dis.get_instructions(co): + if instr.opname == "LOAD_CONST" or instr.opname == "RETURN_CONST": + consts.append(instr.argval) + return consts + + @support.cpython_only + def test_load_const(self): + consts = [None, True, False, 124, 2.0, 3j, "unicode", b"bytes", (1, 2, 3)] + + code = "\n".join(["x={!r}".format(const) for const in consts]) + code += "\nx = ..." + consts.extend((Ellipsis, None)) + + tree = ast.parse(code) + self.assertEqual(self.get_load_const(tree), consts) + + # Replace expression nodes with constants + for assign, const in zip(tree.body, consts): + assert isinstance(assign, ast.Assign), ast.dump(assign) + new_node = ast.Constant(value=const) + ast.copy_location(new_node, assign.value) + assign.value = new_node + + self.assertEqual(self.get_load_const(tree), consts) + + def test_literal_eval(self): + tree = ast.parse("1 + 2") + binop = tree.body[0].value + + new_left = ast.Constant(value=10) + ast.copy_location(new_left, binop.left) + binop.left = new_left + + new_right = ast.Constant(value=20j) + ast.copy_location(new_right, binop.right) + binop.right = new_right + + 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. + + Testing end positions of nodes requires a bit of extra care + because of how LL parsers work. + """ + + def _check_end_pos(self, ast_node, end_lineno, end_col_offset): + self.assertEqual(ast_node.end_lineno, end_lineno) + self.assertEqual(ast_node.end_col_offset, end_col_offset) + + def _check_content(self, source, ast_node, content): + self.assertEqual(ast.get_source_segment(source, ast_node), content) + + def _parse_value(self, s): + # Use duck-typing to support both single expression + # and a right hand side of an assignment statement. + return ast.parse(s).body[0].value + + def test_lambda(self): + s = "lambda x, *y: None" + lam = self._parse_value(s) + self._check_content(s, lam.body, "None") + self._check_content(s, lam.args.args[0], "x") + self._check_content(s, lam.args.vararg, "y") + + def test_func_def(self): + s = dedent(""" + def func(x: int, + *args: str, + z: float = 0, + **kwargs: Any) -> bool: + return True + """).strip() + fdef = ast.parse(s).body[0] + self._check_end_pos(fdef, 5, 15) + self._check_content(s, fdef.body[0], "return True") + self._check_content(s, fdef.args.args[0], "x: int") + self._check_content(s, fdef.args.args[0].annotation, "int") + self._check_content(s, fdef.args.kwarg, "kwargs: Any") + self._check_content(s, fdef.args.kwarg.annotation, "Any") + + def test_call(self): + s = "func(x, y=2, **kw)" + call = self._parse_value(s) + self._check_content(s, call.func, "func") + self._check_content(s, call.keywords[0].value, "2") + self._check_content(s, call.keywords[1].value, "kw") + + def test_call_noargs(self): + s = "x[0]()" + call = self._parse_value(s) + self._check_content(s, call.func, "x[0]") + self._check_end_pos(call, 1, 6) + + def test_class_def(self): + s = dedent(""" + class C(A, B): + x: int = 0 + """).strip() + cdef = ast.parse(s).body[0] + self._check_end_pos(cdef, 2, 14) + self._check_content(s, cdef.bases[1], "B") + self._check_content(s, cdef.body[0], "x: int = 0") + + def test_class_kw(self): + s = "class S(metaclass=abc.ABCMeta): pass" + cdef = ast.parse(s).body[0] + self._check_content(s, cdef.keywords[0].value, "abc.ABCMeta") + + def test_multi_line_str(self): + s = dedent(''' + x = """Some multi-line text. + + It goes on starting from same indent.""" + ''').strip() + assign = ast.parse(s).body[0] + self._check_end_pos(assign, 3, 40) + self._check_end_pos(assign.value, 3, 40) + + def test_continued_str(self): + s = dedent(""" + x = "first part" \\ + "second part" + """).strip() + assign = ast.parse(s).body[0] + self._check_end_pos(assign, 2, 13) + self._check_end_pos(assign.value, 2, 13) + + def test_suites(self): + # We intentionally put these into the same string to check + # that empty lines are not part of the suite. + s = dedent(""" + while True: + pass + + if one(): + x = None + elif other(): + y = None + else: + z = None + + for x, y in stuff: + assert True + + try: + raise RuntimeError + except TypeError as e: + pass + + pass + """).strip() + mod = ast.parse(s) + while_loop = mod.body[0] + if_stmt = mod.body[1] + for_loop = mod.body[2] + try_stmt = mod.body[3] + pass_stmt = mod.body[4] + + self._check_end_pos(while_loop, 2, 8) + self._check_end_pos(if_stmt, 9, 12) + self._check_end_pos(for_loop, 12, 15) + self._check_end_pos(try_stmt, 17, 8) + self._check_end_pos(pass_stmt, 19, 4) + + self._check_content(s, while_loop.test, "True") + self._check_content(s, if_stmt.body[0], "x = None") + self._check_content(s, if_stmt.orelse[0].test, "other()") + self._check_content(s, for_loop.target, "x, y") + self._check_content(s, try_stmt.body[0], "raise RuntimeError") + self._check_content(s, try_stmt.handlers[0].type, "TypeError") + + def test_fstring(self): + s = 'x = f"abc {x + y} abc"' + fstr = self._parse_value(s) + binop = fstr.values[1].value + self._check_content(s, binop, "x + y") + + def test_fstring_multi_line(self): + s = dedent(''' + f"""Some multi-line text. + { + arg_one + + + arg_two + } + It goes on...""" + ''').strip() + fstr = self._parse_value(s) + binop = fstr.values[1].value + self._check_end_pos(binop, 5, 7) + self._check_content(s, binop.left, "arg_one") + self._check_content(s, binop.right, "arg_two") + + def test_import_from_multi_line(self): + s = dedent(""" + from x.y.z import ( + a, b, c as c + ) + """).strip() + imp = ast.parse(s).body[0] + self._check_end_pos(imp, 3, 1) + self._check_end_pos(imp.names[2], 2, 16) + + def test_slices(self): + s1 = "f()[1, 2] [0]" + s2 = "x[ a.b: c.d]" + sm = dedent(""" + x[ a.b: f () , + g () : c.d + ] + """).strip() + i1, i2, im = map(self._parse_value, (s1, s2, sm)) + self._check_content(s1, i1.value, "f()[1, 2]") + self._check_content(s1, i1.value.slice, "1, 2") + self._check_content(s2, i2.slice.lower, "a.b") + self._check_content(s2, i2.slice.upper, "c.d") + self._check_content(sm, im.slice.elts[0].upper, "f ()") + self._check_content(sm, im.slice.elts[1].lower, "g ()") + self._check_end_pos(im, 3, 3) + + def test_binop(self): + s = dedent(""" + (1 * 2 + (3 ) + + 4 + ) + """).strip() + binop = self._parse_value(s) + self._check_end_pos(binop, 2, 6) + self._check_content(s, binop.right, "4") + self._check_content(s, binop.left, "1 * 2 + (3 )") + self._check_content(s, binop.left.right, "3") + + def test_boolop(self): + s = dedent(""" + if (one_condition and + (other_condition or yet_another_one)): + pass + """).strip() + bop = ast.parse(s).body[0].test + self._check_end_pos(bop, 2, 44) + self._check_content(s, bop.values[1], "other_condition or yet_another_one") + + def test_tuples(self): + s1 = "x = () ;" + s2 = "x = 1 , ;" + s3 = "x = (1 , 2 ) ;" + sm = dedent(""" + x = ( + a, b, + ) + """).strip() + t1, t2, t3, tm = map(self._parse_value, (s1, s2, s3, sm)) + self._check_content(s1, t1, "()") + self._check_content(s2, t2, "1 ,") + self._check_content(s3, t3, "(1 , 2 )") + self._check_end_pos(tm, 3, 1) + + def test_attribute_spaces(self): + s = "func(x. y .z)" + call = self._parse_value(s) + self._check_content(s, call, s) + self._check_content(s, call.args[0], "x. y .z") + + def test_redundant_parenthesis(self): + s = "( ( ( a + b ) ) )" + v = ast.parse(s).body[0].value + self.assertEqual(type(v).__name__, "BinOp") + self._check_content(s, v, "a + b") + s2 = "await " + s + v = ast.parse(s2).body[0].value.value + self.assertEqual(type(v).__name__, "BinOp") + self._check_content(s2, v, "a + b") + + def test_trailers_with_redundant_parenthesis(self): + tests = ( + ("( ( ( a ) ) ) ( )", "Call"), + ("( ( ( a ) ) ) ( b )", "Call"), + ("( ( ( a ) ) ) [ b ]", "Subscript"), + ("( ( ( a ) ) ) . b", "Attribute"), + ) + for s, t in tests: + with self.subTest(s): + v = ast.parse(s).body[0].value + self.assertEqual(type(v).__name__, t) + self._check_content(s, v, s) + s2 = "await " + s + v = ast.parse(s2).body[0].value.value + self.assertEqual(type(v).__name__, t) + self._check_content(s2, v, s) + + def test_displays(self): + s1 = "[{}, {1, }, {1, 2,} ]" + s2 = "{a: b, f (): g () ,}" + c1 = self._parse_value(s1) + c2 = self._parse_value(s2) + self._check_content(s1, c1.elts[0], "{}") + self._check_content(s1, c1.elts[1], "{1, }") + self._check_content(s1, c1.elts[2], "{1, 2,}") + self._check_content(s2, c2.keys[1], "f ()") + self._check_content(s2, c2.values[1], "g ()") + + def test_comprehensions(self): + s = dedent(""" + x = [{x for x, y in stuff + if cond.x} for stuff in things] + """).strip() + cmp = self._parse_value(s) + self._check_end_pos(cmp, 2, 37) + self._check_content(s, cmp.generators[0].iter, "things") + self._check_content(s, cmp.elt.generators[0].iter, "stuff") + self._check_content(s, cmp.elt.generators[0].ifs[0], "cond.x") + self._check_content(s, cmp.elt.generators[0].target, "x, y") + + def test_yield_await(self): + s = dedent(""" + async def f(): + yield x + await y + """).strip() + fdef = ast.parse(s).body[0] + self._check_content(s, fdef.body[0].value, "yield x") + self._check_content(s, fdef.body[1].value, "await y") + + def test_source_segment_multi(self): + s_orig = dedent(""" + x = ( + a, b, + ) + () + """).strip() + s_tuple = dedent(""" + ( + a, b, + ) + """).strip() + binop = self._parse_value(s_orig) + self.assertEqual(ast.get_source_segment(s_orig, binop.left), s_tuple) + + def test_source_segment_padded(self): + s_orig = dedent(""" + class C: + def fun(self) -> None: + "ЖЖЖЖЖ" + """).strip() + s_method = " def fun(self) -> None:\n" ' "ЖЖЖЖЖ"' + cdef = ast.parse(s_orig).body[0] + self.assertEqual( + ast.get_source_segment(s_orig, cdef.body[0], padded=True), s_method + ) + + def test_source_segment_endings(self): + s = "v = 1\r\nw = 1\nx = 1\n\ry = 1\rz = 1\r\n" + v, w, x, y, z = ast.parse(s).body + self._check_content(s, v, "v = 1") + self._check_content(s, w, "w = 1") + self._check_content(s, x, "x = 1") + self._check_content(s, y, "y = 1") + self._check_content(s, z, "z = 1") + + def test_source_segment_tabs(self): + s = dedent(""" + class C: + \t\f def fun(self) -> None: + \t\f pass + """).strip() + s_method = " \t\f def fun(self) -> None:\n" " \t\f pass" + + cdef = ast.parse(s).body[0] + self.assertEqual(ast.get_source_segment(s, cdef.body[0], padded=True), s_method) + + def test_source_segment_newlines(self): + s = "def f():\n pass\ndef g():\r pass\r\ndef h():\r\n pass\r\n" + f, g, h = ast.parse(s).body + self._check_content(s, f, "def f():\n pass") + self._check_content(s, g, "def g():\r pass") + self._check_content(s, h, "def h():\r\n pass") + + s = "def f():\n a = 1\r b = 2\r\n c = 3\n" + f = ast.parse(s).body[0] + self._check_content(s, f, s.rstrip()) + + def test_source_segment_missing_info(self): + s = "v = 1\r\nw = 1\nx = 1\n\ry = 1\r\n" + v, w, x, y = ast.parse(s).body + del v.lineno + del w.end_lineno + del x.col_offset + del y.end_col_offset + self.assertIsNone(ast.get_source_segment(s, v)) + self.assertIsNone(ast.get_source_segment(s, w)) + self.assertIsNone(ast.get_source_segment(s, x)) + self.assertIsNone(ast.get_source_segment(s, y)) + + +class BaseNodeVisitorCases: + # Both `NodeVisitor` and `NodeTranformer` must raise these warnings: + def test_old_constant_nodes(self): + class Visitor(self.visitor_class): + def visit_Num(self, node): + log.append((node.lineno, "Num", node.n)) + + def visit_Str(self, node): + log.append((node.lineno, "Str", node.s)) + + def visit_Bytes(self, node): + log.append((node.lineno, "Bytes", node.s)) + + def visit_NameConstant(self, node): + log.append((node.lineno, "NameConstant", node.value)) + + def visit_Ellipsis(self, node): + log.append((node.lineno, "Ellipsis", ...)) + + mod = ast.parse( + dedent("""\ + i = 42 + f = 4.25 + c = 4.25j + s = 'string' + b = b'bytes' + t = True + n = None + e = ... + """) + ) + visitor = Visitor() + log = [] + with warnings.catch_warnings(record=True) as wlog: + warnings.filterwarnings("always", "", DeprecationWarning) + visitor.visit(mod) + self.assertEqual( + log, + [ + (1, "Num", 42), + (2, "Num", 4.25), + (3, "Num", 4.25j), + (4, "Str", "string"), + (5, "Bytes", b"bytes"), + (6, "NameConstant", True), + (7, "NameConstant", None), + (8, "Ellipsis", ...), + ], + ) + self.assertEqual( + [str(w.message) for w in wlog], + [ + "visit_Num is deprecated; add visit_Constant", + "Attribute n is deprecated and will be removed in Python 3.14; use value instead", + "visit_Num is deprecated; add visit_Constant", + "Attribute n is deprecated and will be removed in Python 3.14; use value instead", + "visit_Num is deprecated; add visit_Constant", + "Attribute n is deprecated and will be removed in Python 3.14; use value instead", + "visit_Str is deprecated; add visit_Constant", + "Attribute s is deprecated and will be removed in Python 3.14; use value instead", + "visit_Bytes is deprecated; add visit_Constant", + "Attribute s is deprecated and will be removed in Python 3.14; use value instead", + "visit_NameConstant is deprecated; add visit_Constant", + "visit_NameConstant is deprecated; add visit_Constant", + "visit_Ellipsis is deprecated; add visit_Constant", + ], + ) + + +class NodeVisitorTests(BaseNodeVisitorCases, unittest.TestCase): + visitor_class = ast.NodeVisitor + + +class NodeTransformerTests(ASTTestMixin, BaseNodeVisitorCases, unittest.TestCase): + visitor_class = ast.NodeTransformer + + def assertASTTransformation(self, tranformer_class, initial_code, expected_code): + initial_ast = ast.parse(dedent(initial_code)) + expected_ast = ast.parse(dedent(expected_code)) + + tranformer = tranformer_class() + result_ast = ast.fix_missing_locations(tranformer.visit(initial_ast)) + + self.assertASTEqual(result_ast, expected_ast) + + def test_node_remove_single(self): + code = "def func(arg) -> SomeType: ..." + expected = "def func(arg): ..." + + # Since `FunctionDef.returns` is defined as a single value, we test + # the `if isinstance(old_value, AST):` branch here. + class SomeTypeRemover(ast.NodeTransformer): + def visit_Name(self, node: ast.Name): + self.generic_visit(node) + if node.id == "SomeType": + return None + return node + + self.assertASTTransformation(SomeTypeRemover, code, expected) + + def test_node_remove_from_list(self): + code = """ + def func(arg): + print(arg) + yield arg + """ + expected = """ + def func(arg): + print(arg) + """ + + # Since `FunctionDef.body` is defined as a list, we test + # the `if isinstance(old_value, list):` branch here. + class YieldRemover(ast.NodeTransformer): + def visit_Expr(self, node: ast.Expr): + self.generic_visit(node) + if isinstance(node.value, ast.Yield): + return None # Remove `yield` from a function + return node + + self.assertASTTransformation(YieldRemover, code, expected) + + def test_node_return_list(self): + code = """ + class DSL(Base, kw1=True): ... + """ + expected = """ + class DSL(Base, kw1=True, kw2=True, kw3=False): ... + """ + + class ExtendKeywords(ast.NodeTransformer): + def visit_keyword(self, node: ast.keyword): + self.generic_visit(node) + if node.arg == "kw1": + return [ + node, + ast.keyword("kw2", ast.Constant(True)), + ast.keyword("kw3", ast.Constant(False)), + ] + return node + + self.assertASTTransformation(ExtendKeywords, code, expected) + + def test_node_mutate(self): + code = """ + def func(arg): + print(arg) + """ + expected = """ + def func(arg): + log(arg) + """ + + class PrintToLog(ast.NodeTransformer): + def visit_Call(self, node: ast.Call): + self.generic_visit(node) + if isinstance(node.func, ast.Name) and node.func.id == "print": + node.func.id = "log" + return node + + self.assertASTTransformation(PrintToLog, code, expected) + + def test_node_replace(self): + code = """ + def func(arg): + print(arg) + """ + expected = """ + def func(arg): + logger.log(arg, debug=True) + """ + + class PrintToLog(ast.NodeTransformer): + def visit_Call(self, node: ast.Call): + self.generic_visit(node) + if isinstance(node.func, ast.Name) and node.func.id == "print": + return ast.Call( + func=ast.Attribute( + ast.Name("logger", ctx=ast.Load()), + attr="log", + ctx=ast.Load(), + ), + args=node.args, + keywords=[ast.keyword("debug", ast.Constant(True))], + ) + return node + + self.assertASTTransformation(PrintToLog, code, expected) + + +@support.cpython_only +class ModuleStateTests(unittest.TestCase): + # bpo-41194, bpo-41261, bpo-41631: The _ast module uses a global state. + + def check_ast_module(self): + # Check that the _ast module still works as expected + code = "x + 1" + filename = "" + mode = "eval" + + # Create _ast.AST subclasses instances + ast_tree = compile(code, filename, mode, flags=ast.PyCF_ONLY_AST) + + # Call PyAST_Check() + code = compile(ast_tree, filename, mode) + self.assertIsInstance(code, types.CodeType) + + def test_reload_module(self): + # bpo-41194: Importing the _ast module twice must not crash. + with support.swap_item(sys.modules, "_ast", None): + del sys.modules["_ast"] + import _ast as ast1 + + del sys.modules["_ast"] + import _ast as ast2 + + self.check_ast_module() + + # Unloading the two _ast module instances must not crash. + del ast1 + del ast2 + support.gc_collect() + + self.check_ast_module() + + def test_sys_modules(self): + # bpo-41631: Test reproducing a Mercurial crash when PyAST_Check() + # imported the _ast module internally. + lazy_mod = object() + + def my_import(name, *args, **kw): + sys.modules[name] = lazy_mod + return lazy_mod + + with support.swap_item(sys.modules, "_ast", None): + del sys.modules["_ast"] + + with support.swap_attr(builtins, "__import__", my_import): + # Test that compile() does not import the _ast module + self.check_ast_module() + self.assertNotIn("_ast", sys.modules) + + # Sanity check of the test itself + import _ast + + self.assertIs(_ast, lazy_mod) + + def test_subinterpreter(self): + # bpo-41631: Importing and using the _ast module in a subinterpreter + # must not crash. + code = dedent(""" + import _ast + import ast + import gc + import sys + import types + + # Create _ast.AST subclasses instances and call PyAST_Check() + ast_tree = compile('x+1', '', 'eval', + flags=ast.PyCF_ONLY_AST) + code = compile(ast_tree, 'string', 'eval') + if not isinstance(code, types.CodeType): + raise AssertionError + + # Unloading the _ast module must not crash. + del ast, _ast + del sys.modules['ast'], sys.modules['_ast'] + gc.collect() + """) + res = support.run_in_subinterp(code) + self.assertEqual(res, 0) + + +class ASTMainTests(unittest.TestCase): + # Tests `ast.main()` function. + + def test_cli_file_input(self): + code = "print(1, 2, 3)" + expected = ast.dump(ast.parse(code), indent=3) + + with os_helper.temp_dir() as tmp_dir: + filename = os.path.join(tmp_dir, "test_module.py") + with open(filename, "w", encoding="utf-8") as f: + f.write(code) + res, _ = script_helper.run_python_until_end("-m", "ast", filename) + + self.assertEqual(res.err, b"") + self.assertEqual(expected.splitlines(), res.out.decode("utf8").splitlines()) + self.assertEqual(res.rc, 0) diff --git a/Lib/test/test_ast/utils.py b/Lib/test/test_ast/utils.py new file mode 100644 index 00000000..145e89ee --- /dev/null +++ b/Lib/test/test_ast/utils.py @@ -0,0 +1,15 @@ +def to_tuple(t): + if t is None or isinstance(t, (str, int, complex, float, bytes)) or t is Ellipsis: + return t + elif isinstance(t, list): + return [to_tuple(e) for e in t] + result = [t.__class__.__name__] + if hasattr(t, 'lineno') and hasattr(t, 'col_offset'): + result.append((t.lineno, t.col_offset)) + if hasattr(t, 'end_lineno') and hasattr(t, 'end_col_offset'): + result[-1] += (t.end_lineno, t.end_col_offset) + if t._fields is None: + return tuple(result) + for f in t._fields: + result.append(to_tuple(getattr(t, f))) + return tuple(result) diff --git a/Lib/test/test_asyncio/test_eager_task_factory.py b/Lib/test/test_asyncio/test_eager_task_factory.py index 34688873..e2a54dd8 100644 --- a/Lib/test/test_asyncio/test_eager_task_factory.py +++ b/Lib/test/test_asyncio/test_eager_task_factory.py @@ -218,6 +218,56 @@ async def run(): self.run_coro(run()) + def test_staggered_race_with_eager_tasks(self): + # See https://github.com/python/cpython/issues/124309 + + async def fail(): + await asyncio.sleep(0) + raise ValueError("no good") + + async def blocked(): + fut = asyncio.Future() + await fut + + async def run(): + winner, index, excs = await asyncio.staggered.staggered_race( + [ + lambda: blocked(), + lambda: asyncio.sleep(1, result="sleep1"), + lambda: fail() + ], + delay=0.25 + ) + self.assertEqual(winner, 'sleep1') + self.assertEqual(index, 1) + self.assertIsNone(excs[index]) + self.assertIsInstance(excs[0], asyncio.CancelledError) + self.assertIsInstance(excs[2], ValueError) + + self.run_coro(run()) + + def test_staggered_race_with_eager_tasks_no_delay(self): + # See https://github.com/python/cpython/issues/124309 + async def fail(): + raise ValueError("no good") + + async def run(): + winner, index, excs = await asyncio.staggered.staggered_race( + [ + lambda: fail(), + lambda: asyncio.sleep(1, result="sleep1"), + lambda: asyncio.sleep(0, result="sleep0"), + ], + delay=None + ) + self.assertEqual(winner, 'sleep1') + self.assertEqual(index, 1) + self.assertIsNone(excs[index]) + self.assertIsInstance(excs[0], ValueError) + self.assertEqual(len(excs), 2) + + self.run_coro(run()) + class PyEagerTaskFactoryLoopTests(EagerTaskFactoryLoopTests, test_utils.TestCase): Task = tasks._PyTask @@ -246,6 +296,18 @@ class DummyLoop: _, out, err = assert_python_ok("-c", code) self.assertFalse(err) + def test_issue122332(self): + async def coro(): + pass + + async def run(): + task = self.loop.create_task(coro()) + await task + self.assertIsNone(task.get_coro()) + + self.run_coro(run()) + + class AsyncTaskCounter: def __init__(self, loop, *, task_class, eager): self.suspense_count = 0 diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py index f2558037..abf425f5 100644 --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -2351,7 +2351,7 @@ def test_handle_repr(self): h = asyncio.Handle(cb, (), self.loop) cb_regex = r'' - cb_regex = fr'functools.partialmethod\({cb_regex}, , \)\(\)' + cb_regex = fr'functools.partialmethod\({cb_regex}\)\(\)' regex = fr'^$' self.assertRegex(repr(h), regex) diff --git a/Lib/test/test_asyncio/test_futures.py b/Lib/test/test_asyncio/test_futures.py index 2184b209..8be6dcac 100644 --- a/Lib/test/test_asyncio/test_futures.py +++ b/Lib/test/test_asyncio/test_futures.py @@ -31,6 +31,25 @@ def last_cb(): pass +class ReachableCode(Exception): + """Exception to raise to indicate that some code was reached. + + Use this exception if using mocks is not a good alternative. + """ + + +class SimpleEvilEventLoop(asyncio.base_events.BaseEventLoop): + """Base class for UAF and other evil stuff requiring an evil event loop.""" + + def get_debug(self): # to suppress tracebacks + return False + + def __del__(self): + # Automatically close the evil event loop to avoid warnings. + if not self.is_closed() and not self.is_running(): + self.close() + + class DuckFuture: # Class that does not inherit from Future but aims to be duck-type # compatible with it. @@ -270,10 +289,6 @@ def test_exception(self): f = self._new_future(loop=self.loop) self.assertRaises(asyncio.InvalidStateError, f.exception) - # StopIteration cannot be raised into a Future - CPython issue26221 - self.assertRaisesRegex(TypeError, "StopIteration .* cannot be raised", - f.set_exception, StopIteration) - f.set_exception(exc) self.assertFalse(f.cancelled()) self.assertTrue(f.done()) @@ -283,6 +298,25 @@ def test_exception(self): self.assertRaises(asyncio.InvalidStateError, f.set_exception, None) self.assertFalse(f.cancel()) + def test_stop_iteration_exception(self, stop_iteration_class=StopIteration): + exc = stop_iteration_class() + f = self._new_future(loop=self.loop) + f.set_exception(exc) + self.assertFalse(f.cancelled()) + self.assertTrue(f.done()) + self.assertRaises(RuntimeError, f.result) + exc = f.exception() + cause = exc.__cause__ + self.assertIsInstance(exc, RuntimeError) + self.assertRegex(str(exc), 'StopIteration .* cannot be raised') + self.assertIsInstance(cause, stop_iteration_class) + + def test_stop_iteration_subclass_exception(self): + class MyStopIteration(StopIteration): + pass + + self.test_stop_iteration_exception(MyStopIteration) + def test_exception_class(self): f = self._new_future(loop=self.loop) f.set_exception(RuntimeError) @@ -625,6 +659,28 @@ def __del__(self): fut = self._new_future(loop=self.loop) fut.set_result(Evil()) + def test_future_cancelled_result_refcycles(self): + f = self._new_future(loop=self.loop) + f.cancel() + exc = None + try: + f.result() + except asyncio.CancelledError as e: + exc = e + self.assertIsNotNone(exc) + self.assertListEqual(gc.get_referrers(exc), []) + + def test_future_cancelled_exception_refcycles(self): + f = self._new_future(loop=self.loop) + f.cancel() + exc = None + try: + f.exception() + except asyncio.CancelledError as e: + exc = e + self.assertIsNotNone(exc) + self.assertListEqual(gc.get_referrers(exc), []) + @unittest.skipUnless(hasattr(futures, '_CFuture'), 'requires the C _asyncio module') @@ -641,6 +697,32 @@ def test_future_del_segfault(self): with self.assertRaises(AttributeError): del fut._log_traceback + def test_future_iter_get_referents_segfault(self): + # See https://github.com/python/cpython/issues/122695 + import _asyncio + it = iter(self._new_future(loop=self.loop)) + del it + evil = gc.get_referents(_asyncio) + gc.collect() + + def test_callbacks_copy(self): + # See https://github.com/python/cpython/issues/125789 + # In C implementation, the `_callbacks` attribute + # always returns a new list to avoid mutations of internal state + + fut = self._new_future(loop=self.loop) + f1 = lambda _: 1 + f2 = lambda _: 2 + fut.add_done_callback(f1) + fut.add_done_callback(f2) + callbacks = fut._callbacks + self.assertIsNot(callbacks, fut._callbacks) + fut.remove_done_callback(f1) + callbacks = fut._callbacks + self.assertIsNot(callbacks, fut._callbacks) + fut.remove_done_callback(f2) + self.assertIsNone(fut._callbacks) + @unittest.skipUnless(hasattr(futures, '_CFuture'), 'requires the C _asyncio module') @@ -873,6 +955,107 @@ def __eq__(self, other): fut.remove_done_callback(evil()) + def test_evil_call_soon_list_mutation(self): + # see: https://github.com/python/cpython/issues/125969 + called_on_fut_callback0 = False + + pad = lambda: ... + + def evil_call_soon(*args, **kwargs): + nonlocal called_on_fut_callback0 + if called_on_fut_callback0: + # Called when handling fut->fut_callbacks[0] + # and mutates the length fut->fut_callbacks. + fut.remove_done_callback(int) + fut.remove_done_callback(pad) + else: + called_on_fut_callback0 = True + + fake_event_loop = SimpleEvilEventLoop() + fake_event_loop.call_soon = evil_call_soon + + with mock.patch.object(self, 'loop', fake_event_loop): + fut = self._new_future() + self.assertIs(fut.get_loop(), fake_event_loop) + + fut.add_done_callback(str) # sets fut->fut_callback0 + fut.add_done_callback(int) # sets fut->fut_callbacks[0] + fut.add_done_callback(pad) # sets fut->fut_callbacks[1] + fut.add_done_callback(pad) # sets fut->fut_callbacks[2] + fut.set_result("boom") + + # When there are no more callbacks, the Python implementation + # returns an empty list but the C implementation returns None. + self.assertIn(fut._callbacks, (None, [])) + + def test_use_after_free_on_fut_callback_0_with_evil__eq__(self): + # Special thanks to Nico-Posada for the original PoC. + # See https://github.com/python/cpython/issues/125966. + + fut = self._new_future() + + class cb_pad: + def __eq__(self, other): + return True + + class evil(cb_pad): + def __eq__(self, other): + fut.remove_done_callback(None) + return NotImplemented + + fut.add_done_callback(cb_pad()) + fut.remove_done_callback(evil()) + + def test_use_after_free_on_fut_callback_0_with_evil__getattribute__(self): + # see: https://github.com/python/cpython/issues/125984 + + class EvilEventLoop(SimpleEvilEventLoop): + def call_soon(self, *args, **kwargs): + super().call_soon(*args, **kwargs) + raise ReachableCode + + def __getattribute__(self, name): + nonlocal fut_callback_0 + if name == 'call_soon': + fut.remove_done_callback(fut_callback_0) + del fut_callback_0 + return object.__getattribute__(self, name) + + evil_loop = EvilEventLoop() + with mock.patch.object(self, 'loop', evil_loop): + fut = self._new_future() + self.assertIs(fut.get_loop(), evil_loop) + + fut_callback_0 = lambda: ... + fut.add_done_callback(fut_callback_0) + self.assertRaises(ReachableCode, fut.set_result, "boom") + + def test_use_after_free_on_fut_context_0_with_evil__getattribute__(self): + # see: https://github.com/python/cpython/issues/125984 + + class EvilEventLoop(SimpleEvilEventLoop): + def call_soon(self, *args, **kwargs): + super().call_soon(*args, **kwargs) + raise ReachableCode + + def __getattribute__(self, name): + if name == 'call_soon': + # resets the future's event loop + fut.__init__(loop=SimpleEvilEventLoop()) + return object.__getattribute__(self, name) + + evil_loop = EvilEventLoop() + with mock.patch.object(self, 'loop', evil_loop): + fut = self._new_future() + self.assertIs(fut.get_loop(), evil_loop) + + fut_callback_0 = mock.Mock() + fut_context_0 = mock.Mock() + fut.add_done_callback(fut_callback_0, context=fut_context_0) + del fut_context_0 + del fut_callback_0 + self.assertRaises(ReachableCode, fut.set_result, "boom") + @unittest.skipUnless(hasattr(futures, '_CFuture'), 'requires the C _asyncio module') diff --git a/Lib/test/test_asyncio/test_sendfile.py b/Lib/test/test_asyncio/test_sendfile.py index d33ff197..2509d438 100644 --- a/Lib/test/test_asyncio/test_sendfile.py +++ b/Lib/test/test_asyncio/test_sendfile.py @@ -93,13 +93,10 @@ async def wait_closed(self): class SendfileBase: - # 256 KiB plus small unaligned to buffer chunk - # Newer versions of Windows seems to have increased its internal - # buffer and tries to send as much of the data as it can as it - # has some form of buffering for this which is less than 256KiB - # on newer server versions and Windows 11. - # So DATA should be larger than 256 KiB to make this test reliable. - DATA = b"x" * (1024 * 256 + 1) + # Linux >= 6.10 seems buffering up to 17 pages of data. + # So DATA should be large enough to make this test reliable even with a + # 64 KiB page configuration. + DATA = b"x" * (1024 * 17 * 64 + 1) # Reduce socket buffer size to test on relative small data sets. BUF_SIZE = 4 * 1024 # 4 KiB diff --git a/Lib/test/test_asyncio/test_sslproto.py b/Lib/test/test_asyncio/test_sslproto.py index f5f0afea..761904c5 100644 --- a/Lib/test/test_asyncio/test_sslproto.py +++ b/Lib/test/test_asyncio/test_sslproto.py @@ -109,6 +109,54 @@ def test_connection_lost(self): test_utils.run_briefly(self.loop) self.assertIsInstance(waiter.exception(), ConnectionAbortedError) + def test_connection_lost_when_busy(self): + # gh-118950: SSLProtocol.connection_lost not being called when OSError + # is thrown on asyncio.write. + sock = mock.Mock() + sock.fileno = mock.Mock(return_value=12345) + sock.send = mock.Mock(side_effect=BrokenPipeError) + + # construct StreamWriter chain that contains loop dependant logic this emulates + # what _make_ssl_transport() does in BaseSelectorEventLoop + reader = asyncio.StreamReader(limit=2 ** 16, loop=self.loop) + protocol = asyncio.StreamReaderProtocol(reader, loop=self.loop) + ssl_proto = self.ssl_protocol(proto=protocol) + + # emulate reading decompressed data + sslobj = mock.Mock() + sslobj.read.side_effect = ssl.SSLWantReadError + sslobj.write.side_effect = ssl.SSLWantReadError + ssl_proto._sslobj = sslobj + + # emulate outgoing data + data = b'An interesting message' + + outgoing = mock.Mock() + outgoing.read = mock.Mock(return_value=data) + outgoing.pending = len(data) + ssl_proto._outgoing = outgoing + + # use correct socket transport to initialize the SSLProtocol + self.loop._make_socket_transport(sock, ssl_proto) + + transport = ssl_proto._app_transport + writer = asyncio.StreamWriter(transport, protocol, reader, self.loop) + + async def main(): + # writes data to transport + async def write(): + writer.write(data) + await writer.drain() + + # try to write for the first time + await write() + # try to write for the second time, this raises as the connection_lost + # callback should be done with error + with self.assertRaises(ConnectionResetError): + await write() + + self.loop.run_until_complete(main()) + def test_close_during_handshake(self): # bpo-29743 Closing transport during handshake process leaks socket waiter = self.loop.create_future() diff --git a/Lib/test/test_asyncio/test_staggered.py b/Lib/test/test_asyncio/test_staggered.py new file mode 100644 index 00000000..74941f70 --- /dev/null +++ b/Lib/test/test_asyncio/test_staggered.py @@ -0,0 +1,124 @@ +import asyncio +import unittest +from asyncio.staggered import staggered_race + +from test import support + +support.requires_working_socket(module=True) + + +def tearDownModule(): + asyncio.set_event_loop_policy(None) + + +class StaggeredTests(unittest.IsolatedAsyncioTestCase): + async def test_empty(self): + winner, index, excs = await staggered_race( + [], + delay=None, + ) + + self.assertIs(winner, None) + self.assertIs(index, None) + self.assertEqual(excs, []) + + async def test_one_successful(self): + async def coro(index): + return f'Res: {index}' + + winner, index, excs = await staggered_race( + [ + lambda: coro(0), + lambda: coro(1), + ], + delay=None, + ) + + self.assertEqual(winner, 'Res: 0') + self.assertEqual(index, 0) + self.assertEqual(excs, [None]) + + async def test_first_error_second_successful(self): + async def coro(index): + if index == 0: + raise ValueError(index) + return f'Res: {index}' + + winner, index, excs = await staggered_race( + [ + lambda: coro(0), + lambda: coro(1), + ], + delay=None, + ) + + self.assertEqual(winner, 'Res: 1') + self.assertEqual(index, 1) + self.assertEqual(len(excs), 2) + self.assertIsInstance(excs[0], ValueError) + self.assertIs(excs[1], None) + + async def test_first_timeout_second_successful(self): + async def coro(index): + if index == 0: + await asyncio.sleep(10) # much bigger than delay + return f'Res: {index}' + + winner, index, excs = await staggered_race( + [ + lambda: coro(0), + lambda: coro(1), + ], + delay=0.1, + ) + + self.assertEqual(winner, 'Res: 1') + self.assertEqual(index, 1) + self.assertEqual(len(excs), 2) + self.assertIsInstance(excs[0], asyncio.CancelledError) + self.assertIs(excs[1], None) + + async def test_none_successful(self): + async def coro(index): + raise ValueError(index) + + winner, index, excs = await staggered_race( + [ + lambda: coro(0), + lambda: coro(1), + ], + delay=None, + ) + + self.assertIs(winner, None) + self.assertIs(index, None) + self.assertEqual(len(excs), 2) + self.assertIsInstance(excs[0], ValueError) + self.assertIsInstance(excs[1], ValueError) + + + async def test_multiple_winners(self): + event = asyncio.Event() + + async def coro(index): + await event.wait() + return index + + async def do_set(): + event.set() + await asyncio.Event().wait() + + winner, index, excs = await staggered_race( + [ + lambda: coro(0), + lambda: coro(1), + do_set, + ], + delay=0.1, + ) + self.assertIs(winner, 0) + self.assertIs(index, 0) + self.assertEqual(len(excs), 3) + self.assertIsNone(excs[0], None) + self.assertIsInstance(excs[1], asyncio.CancelledError) + self.assertIsInstance(excs[2], asyncio.CancelledError) diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py index 3c8cc5f3..686fef83 100644 --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -1166,6 +1166,24 @@ async def handle_echo(reader, writer): messages = self._basetest_unhandled_exceptions(handle_echo) self.assertEqual(messages, []) + def test_open_connection_happy_eyeball_refcycles(self): + port = socket_helper.find_unused_port() + async def main(): + exc = None + try: + await asyncio.open_connection( + host="localhost", + port=port, + happy_eyeballs_delay=0.25, + ) + except* OSError as excs: + # can't use assertRaises because that clears frames + exc = excs.exceptions[0] + self.assertIsNotNone(exc) + self.assertListEqual(gc.get_referrers(exc), []) + + asyncio.run(main()) + if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_asyncio/test_taskgroups.py b/Lib/test/test_asyncio/test_taskgroups.py index 7a18362b..236bfaac 100644 --- a/Lib/test/test_asyncio/test_taskgroups.py +++ b/Lib/test/test_asyncio/test_taskgroups.py @@ -1,7 +1,7 @@ # Adapted with permission from the EdgeDB project; # license: PSFL. - +import gc import asyncio import contextvars import contextlib @@ -10,7 +10,6 @@ from test.test_asyncio.utils import await_without_task - # To prevent a warning "test altered the execution environment" def tearDownModule(): asyncio.set_event_loop_policy(None) @@ -824,6 +823,95 @@ async def test_taskgroup_without_parent_task(self): # We still have to await coro to avoid a warning await coro + async def test_exception_refcycles_direct(self): + """Test that TaskGroup doesn't keep a reference to the raised ExceptionGroup""" + tg = asyncio.TaskGroup() + exc = None + + class _Done(Exception): + pass + + try: + async with tg: + raise _Done + except ExceptionGroup as e: + exc = e + + self.assertIsNotNone(exc) + self.assertListEqual(gc.get_referrers(exc), []) + + + async def test_exception_refcycles_errors(self): + """Test that TaskGroup deletes self._errors, and __aexit__ args""" + tg = asyncio.TaskGroup() + exc = None + + class _Done(Exception): + pass + + try: + async with tg: + raise _Done + except* _Done as excs: + exc = excs.exceptions[0] + + self.assertIsInstance(exc, _Done) + self.assertListEqual(gc.get_referrers(exc), []) + + + async def test_exception_refcycles_parent_task(self): + """Test that TaskGroup deletes self._parent_task""" + tg = asyncio.TaskGroup() + exc = None + + class _Done(Exception): + pass + + async def coro_fn(): + async with tg: + raise _Done + + try: + async with asyncio.TaskGroup() as tg2: + tg2.create_task(coro_fn()) + except* _Done as excs: + exc = excs.exceptions[0].exceptions[0] + + self.assertIsInstance(exc, _Done) + self.assertListEqual(gc.get_referrers(exc), []) + + async def test_exception_refcycles_propagate_cancellation_error(self): + """Test that TaskGroup deletes propagate_cancellation_error""" + tg = asyncio.TaskGroup() + exc = None + + try: + async with asyncio.timeout(-1): + async with tg: + await asyncio.sleep(0) + except TimeoutError as e: + exc = e.__cause__ + + self.assertIsInstance(exc, asyncio.CancelledError) + self.assertListEqual(gc.get_referrers(exc), []) + + async def test_exception_refcycles_base_error(self): + """Test that TaskGroup deletes self._base_error""" + class MyKeyboardInterrupt(KeyboardInterrupt): + pass + + tg = asyncio.TaskGroup() + exc = None + + try: + async with tg: + raise MyKeyboardInterrupt + except MyKeyboardInterrupt as e: + exc = e + + self.assertIsNotNone(exc) + self.assertListEqual(gc.get_referrers(exc), []) + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index 6e8a51ce..792ab4fb 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -2489,6 +2489,28 @@ def test_get_context(self): finally: loop.close() + def test_proper_refcounts(self): + # see: https://github.com/python/cpython/issues/126083 + class Break: + def __str__(self): + raise RuntimeError("break") + + obj = object() + initial_refcount = sys.getrefcount(obj) + + coro = coroutine_function() + loop = asyncio.new_event_loop() + task = asyncio.Task.__new__(asyncio.Task) + + for _ in range(5): + with self.assertRaisesRegex(RuntimeError, 'break'): + task.__init__(coro, loop=loop, context=obj, name=Break()) + + coro.close() + del task + + self.assertEqual(sys.getrefcount(obj), initial_refcount) + def add_subclass_tests(cls): BaseTask = cls.Task diff --git a/Lib/test/test_audit.py b/Lib/test/test_audit.py index 9e3e0374..9076448c 100644 --- a/Lib/test/test_audit.py +++ b/Lib/test/test_audit.py @@ -140,6 +140,7 @@ def test_gc(self): ) + @support.requires_resource('network') def test_http(self): import_helper.import_module("http.client") returncode, events, stderr = self.run_python("test_http_client") diff --git a/Lib/test/test_bdb.py b/Lib/test/test_bdb.py index 568c88e3..33e28592 100644 --- a/Lib/test/test_bdb.py +++ b/Lib/test/test_bdb.py @@ -1203,6 +1203,19 @@ def main(): with TracerRun(self) as tracer: tracer.runcall(tfunc_import) + def test_next_to_botframe(self): + # gh-125422 + # Check that next command won't go to the bottom frame. + code = """ + lno = 2 + """ + self.expect_set = [ + ('line', 2, ''), ('step', ), + ('return', 2, ''), ('next', ), + ] + with TracerRun(self) as tracer: + tracer.run(compile(textwrap.dedent(code), '', 'exec')) + class TestRegressions(unittest.TestCase): def test_format_stack_entry_no_lineno(self): diff --git a/Lib/test/test_buffer.py b/Lib/test/test_buffer.py index aafbb8a9..5f3e8b0f 100644 --- a/Lib/test/test_buffer.py +++ b/Lib/test/test_buffer.py @@ -3906,6 +3906,8 @@ def test_memoryview_check_released(self): self.assertRaises(ValueError, memoryview, m) # memoryview.cast() self.assertRaises(ValueError, m.cast, 'c') + # memoryview.__iter__() + self.assertRaises(ValueError, m.__iter__) # getbuffer() self.assertRaises(ValueError, ndarray, m) # memoryview.tolist() @@ -4440,6 +4442,21 @@ def test_pybuffer_size_from_format(self): self.assertEqual(_testcapi.PyBuffer_SizeFromFormat(format), struct.calcsize(format)) + @support.cpython_only + def test_flags_overflow(self): + # gh-126594: Check for integer overlow on large flags + try: + from _testcapi import INT_MIN, INT_MAX + except ImportError: + INT_MIN = -(2 ** 31) + INT_MAX = 2 ** 31 - 1 + + obj = b'abc' + for flags in (INT_MIN - 1, INT_MAX + 1): + with self.subTest(flags=flags): + with self.assertRaises(OverflowError): + obj.__buffer__(flags) + class TestPythonBufferProtocol(unittest.TestCase): def test_basic(self): diff --git a/Lib/test/test_bz2.py b/Lib/test/test_bz2.py index 772f0eac..cb730a1a 100644 --- a/Lib/test/test_bz2.py +++ b/Lib/test/test_bz2.py @@ -476,7 +476,6 @@ def testReadlinesNoNewline(self): self.assertEqual(xlines, [b'Test']) def testContextProtocol(self): - f = None with BZ2File(self.filename, "wb") as f: f.write(b"xxx") f = BZ2File(self.filename, "rb") diff --git a/Lib/test/test_calendar.py b/Lib/test/test_calendar.py index 24e472b5..0712559b 100644 --- a/Lib/test/test_calendar.py +++ b/Lib/test/test_calendar.py @@ -456,6 +456,11 @@ def test_formatmonth(self): calendar.TextCalendar().formatmonth(0, 2), result_0_02_text ) + def test_formatmonth_with_invalid_month(self): + with self.assertRaises(calendar.IllegalMonthError): + calendar.TextCalendar().formatmonth(2017, 13) + with self.assertRaises(calendar.IllegalMonthError): + calendar.TextCalendar().formatmonth(2017, -1) def test_formatmonthname_with_year(self): self.assertEqual( @@ -972,7 +977,7 @@ def test__all__(self): not_exported = { 'mdays', 'January', 'February', 'EPOCH', 'different_locale', 'c', 'prweek', 'week', 'format', - 'formatstring', 'main', 'monthlen', 'prevmonth', 'nextmonth'} + 'formatstring', 'main', 'monthlen', 'prevmonth', 'nextmonth', ""} support.check__all__(self, calendar, not_exported=not_exported) @@ -1000,6 +1005,13 @@ def test_formatmonth(self): self.assertIn('class="text-center month"', self.cal.formatmonth(2017, 5)) + def test_formatmonth_with_invalid_month(self): + with self.assertRaises(calendar.IllegalMonthError): + self.cal.formatmonth(2017, 13) + with self.assertRaises(calendar.IllegalMonthError): + self.cal.formatmonth(2017, -1) + + def test_formatweek(self): weeks = self.cal.monthdays2calendar(2017, 5) self.assertIn('class="wed text-nowrap"', self.cal.formatweek(weeks[0])) diff --git a/Lib/test/test_capi/test_bytes.py b/Lib/test/test_capi/test_bytes.py index bb5d724f..c692ee82 100644 --- a/Lib/test/test_capi/test_bytes.py +++ b/Lib/test/test_capi/test_bytes.py @@ -52,6 +52,8 @@ def test_fromstringandsize(self): self.assertEqual(fromstringandsize(b'abc'), b'abc') self.assertEqual(fromstringandsize(b'abc', 2), b'ab') self.assertEqual(fromstringandsize(b'abc\0def'), b'abc\0def') + self.assertEqual(fromstringandsize(b'a'), b'a') + self.assertEqual(fromstringandsize(b'a', 1), b'a') self.assertEqual(fromstringandsize(b'', 0), b'') self.assertEqual(fromstringandsize(NULL, 0), b'') self.assertEqual(len(fromstringandsize(NULL, 3)), 3) diff --git a/Lib/test/test_capi/test_getargs.py b/Lib/test/test_capi/test_getargs.py index 69bd0f4c..132ba350 100644 --- a/Lib/test/test_capi/test_getargs.py +++ b/Lib/test/test_capi/test_getargs.py @@ -6,6 +6,7 @@ from test.support import import_helper from test.support import script_helper from test.support import warnings_helper +from test.support.testcase import FloatsAreIdenticalMixin # Skip this test if the _testcapi module isn't available. _testcapi = import_helper.import_module('_testcapi') from _testcapi import getargs_keywords, getargs_keyword_only @@ -436,11 +437,7 @@ def test_K(self): self.assertEqual(VERY_LARGE & ULLONG_MAX, getargs_K(VERY_LARGE)) -class Float_TestCase(unittest.TestCase): - def assertEqualWithSign(self, actual, expected): - self.assertEqual(actual, expected) - self.assertEqual(math.copysign(1, actual), math.copysign(1, expected)) - +class Float_TestCase(unittest.TestCase, FloatsAreIdenticalMixin): def test_f(self): from _testcapi import getargs_f self.assertEqual(getargs_f(4.25), 4.25) @@ -462,10 +459,10 @@ def test_f(self): self.assertEqual(getargs_f(DBL_MAX), INF) self.assertEqual(getargs_f(-DBL_MAX), -INF) if FLT_MIN > DBL_MIN: - self.assertEqualWithSign(getargs_f(DBL_MIN), 0.0) - self.assertEqualWithSign(getargs_f(-DBL_MIN), -0.0) - self.assertEqualWithSign(getargs_f(0.0), 0.0) - self.assertEqualWithSign(getargs_f(-0.0), -0.0) + self.assertFloatsAreIdentical(getargs_f(DBL_MIN), 0.0) + self.assertFloatsAreIdentical(getargs_f(-DBL_MIN), -0.0) + self.assertFloatsAreIdentical(getargs_f(0.0), 0.0) + self.assertFloatsAreIdentical(getargs_f(-0.0), -0.0) r = getargs_f(NAN) self.assertNotEqual(r, r) @@ -494,8 +491,8 @@ def test_d(self): self.assertEqual(getargs_d(x), x) self.assertRaises(OverflowError, getargs_d, 1< C integer -> object) + values = (0, 1, 1234, max_val) + if min_val < 0: + values += (-1, min_val) + for value in values: + with self.subTest(value=value): + self.assertEqual(func(value), value) + self.assertEqual(func(IntSubclass(value)), value) + if use_index: + self.assertEqual(func(Index(value)), value) + + if use_index: + self.assertEqual(func(MyIndexAndInt()), 10) + else: + self.assertRaises(TypeError, func, Index(42)) + self.assertRaises(TypeError, func, MyIndexAndInt()) + + if mask: + self.assertEqual(func(min_val - 1), max_val) + self.assertEqual(func(max_val + 1), min_val) + self.assertEqual(func(-1 << 1000), 0) + self.assertEqual(func(1 << 1000), 0) + else: + self.assertRaises(negative_value_error, func, min_val - 1) + self.assertRaises(negative_value_error, func, -1 << 1000) + self.assertRaises(OverflowError, func, max_val + 1) + self.assertRaises(OverflowError, func, 1 << 1000) + self.assertRaises(TypeError, func, 1.0) + self.assertRaises(TypeError, func, b'2') + self.assertRaises(TypeError, func, '3') + self.assertRaises(SystemError, func, NULL) + + def check_long_asintandoverflow(self, func, min_val, max_val): + # round trip (object -> C integer -> object) + for value in (min_val, max_val, -1, 0, 1, 1234): + with self.subTest(value=value): + self.assertEqual(func(value), (value, 0)) + self.assertEqual(func(IntSubclass(value)), (value, 0)) + self.assertEqual(func(Index(value)), (value, 0)) + + self.assertEqual(func(MyIndexAndInt()), (10, 0)) + + self.assertEqual(func(min_val - 1), (-1, -1)) + self.assertEqual(func(max_val + 1), (-1, +1)) + + # CRASHES func(1.0) + # CRASHES func(NULL) + def test_long_aslong(self): # Test PyLong_AsLong() and PyLong_FromLong() aslong = _testcapi.pylong_aslong from _testcapi import LONG_MIN, LONG_MAX - # round trip (object -> long -> object) - for value in (LONG_MIN, LONG_MAX, -1, 0, 1, 1234): - with self.subTest(value=value): - self.assertEqual(aslong(value), value) - - self.assertEqual(aslong(IntSubclass(42)), 42) - self.assertEqual(aslong(Index(42)), 42) - self.assertEqual(aslong(MyIndexAndInt()), 10) - - self.assertRaises(OverflowError, aslong, LONG_MIN - 1) - self.assertRaises(OverflowError, aslong, LONG_MAX + 1) - self.assertRaises(TypeError, aslong, 1.0) - self.assertRaises(TypeError, aslong, b'2') - self.assertRaises(TypeError, aslong, '3') - self.assertRaises(SystemError, aslong, NULL) + self.check_long_asint(aslong, LONG_MIN, LONG_MAX) def test_long_aslongandoverflow(self): # Test PyLong_AsLongAndOverflow() aslongandoverflow = _testcapi.pylong_aslongandoverflow from _testcapi import LONG_MIN, LONG_MAX - # round trip (object -> long -> object) - for value in (LONG_MIN, LONG_MAX, -1, 0, 1, 1234): - with self.subTest(value=value): - self.assertEqual(aslongandoverflow(value), (value, 0)) - - self.assertEqual(aslongandoverflow(IntSubclass(42)), (42, 0)) - self.assertEqual(aslongandoverflow(Index(42)), (42, 0)) - self.assertEqual(aslongandoverflow(MyIndexAndInt()), (10, 0)) - - self.assertEqual(aslongandoverflow(LONG_MIN - 1), (-1, -1)) - self.assertEqual(aslongandoverflow(LONG_MAX + 1), (-1, 1)) - # CRASHES aslongandoverflow(1.0) - # CRASHES aslongandoverflow(NULL) + self.check_long_asintandoverflow(aslongandoverflow, LONG_MIN, LONG_MAX) def test_long_asunsignedlong(self): # Test PyLong_AsUnsignedLong() and PyLong_FromUnsignedLong() asunsignedlong = _testcapi.pylong_asunsignedlong from _testcapi import ULONG_MAX - # round trip (object -> unsigned long -> object) - for value in (ULONG_MAX, 0, 1, 1234): - with self.subTest(value=value): - self.assertEqual(asunsignedlong(value), value) - - self.assertEqual(asunsignedlong(IntSubclass(42)), 42) - self.assertRaises(TypeError, asunsignedlong, Index(42)) - self.assertRaises(TypeError, asunsignedlong, MyIndexAndInt()) - - self.assertRaises(OverflowError, asunsignedlong, -1) - self.assertRaises(OverflowError, asunsignedlong, ULONG_MAX + 1) - self.assertRaises(TypeError, asunsignedlong, 1.0) - self.assertRaises(TypeError, asunsignedlong, b'2') - self.assertRaises(TypeError, asunsignedlong, '3') - self.assertRaises(SystemError, asunsignedlong, NULL) + self.check_long_asint(asunsignedlong, 0, ULONG_MAX, + use_index=False) def test_long_asunsignedlongmask(self): # Test PyLong_AsUnsignedLongMask() asunsignedlongmask = _testcapi.pylong_asunsignedlongmask from _testcapi import ULONG_MAX - # round trip (object -> unsigned long -> object) - for value in (ULONG_MAX, 0, 1, 1234): - with self.subTest(value=value): - self.assertEqual(asunsignedlongmask(value), value) - - self.assertEqual(asunsignedlongmask(IntSubclass(42)), 42) - self.assertEqual(asunsignedlongmask(Index(42)), 42) - self.assertEqual(asunsignedlongmask(MyIndexAndInt()), 10) - - self.assertEqual(asunsignedlongmask(-1), ULONG_MAX) - self.assertEqual(asunsignedlongmask(ULONG_MAX + 1), 0) - self.assertRaises(TypeError, asunsignedlongmask, 1.0) - self.assertRaises(TypeError, asunsignedlongmask, b'2') - self.assertRaises(TypeError, asunsignedlongmask, '3') - self.assertRaises(SystemError, asunsignedlongmask, NULL) + self.check_long_asint(asunsignedlongmask, 0, ULONG_MAX, mask=True) def test_long_aslonglong(self): # Test PyLong_AsLongLong() and PyLong_FromLongLong() aslonglong = _testcapi.pylong_aslonglong from _testcapi import LLONG_MIN, LLONG_MAX - # round trip (object -> long long -> object) - for value in (LLONG_MIN, LLONG_MAX, -1, 0, 1, 1234): - with self.subTest(value=value): - self.assertEqual(aslonglong(value), value) - - self.assertEqual(aslonglong(IntSubclass(42)), 42) - self.assertEqual(aslonglong(Index(42)), 42) - self.assertEqual(aslonglong(MyIndexAndInt()), 10) - - self.assertRaises(OverflowError, aslonglong, LLONG_MIN - 1) - self.assertRaises(OverflowError, aslonglong, LLONG_MAX + 1) - self.assertRaises(TypeError, aslonglong, 1.0) - self.assertRaises(TypeError, aslonglong, b'2') - self.assertRaises(TypeError, aslonglong, '3') - self.assertRaises(SystemError, aslonglong, NULL) + self.check_long_asint(aslonglong, LLONG_MIN, LLONG_MAX) def test_long_aslonglongandoverflow(self): # Test PyLong_AsLongLongAndOverflow() aslonglongandoverflow = _testcapi.pylong_aslonglongandoverflow from _testcapi import LLONG_MIN, LLONG_MAX - # round trip (object -> long long -> object) - for value in (LLONG_MIN, LLONG_MAX, -1, 0, 1, 1234): - with self.subTest(value=value): - self.assertEqual(aslonglongandoverflow(value), (value, 0)) - - self.assertEqual(aslonglongandoverflow(IntSubclass(42)), (42, 0)) - self.assertEqual(aslonglongandoverflow(Index(42)), (42, 0)) - self.assertEqual(aslonglongandoverflow(MyIndexAndInt()), (10, 0)) - - self.assertEqual(aslonglongandoverflow(LLONG_MIN - 1), (-1, -1)) - self.assertEqual(aslonglongandoverflow(LLONG_MAX + 1), (-1, 1)) - # CRASHES aslonglongandoverflow(1.0) - # CRASHES aslonglongandoverflow(NULL) + self.check_long_asintandoverflow(aslonglongandoverflow, LLONG_MIN, LLONG_MAX) def test_long_asunsignedlonglong(self): # Test PyLong_AsUnsignedLongLong() and PyLong_FromUnsignedLongLong() asunsignedlonglong = _testcapi.pylong_asunsignedlonglong from _testcapi import ULLONG_MAX - # round trip (object -> unsigned long long -> object) - for value in (ULLONG_MAX, 0, 1, 1234): - with self.subTest(value=value): - self.assertEqual(asunsignedlonglong(value), value) - - self.assertEqual(asunsignedlonglong(IntSubclass(42)), 42) - self.assertRaises(TypeError, asunsignedlonglong, Index(42)) - self.assertRaises(TypeError, asunsignedlonglong, MyIndexAndInt()) - - self.assertRaises(OverflowError, asunsignedlonglong, -1) - self.assertRaises(OverflowError, asunsignedlonglong, ULLONG_MAX + 1) - self.assertRaises(TypeError, asunsignedlonglong, 1.0) - self.assertRaises(TypeError, asunsignedlonglong, b'2') - self.assertRaises(TypeError, asunsignedlonglong, '3') - self.assertRaises(SystemError, asunsignedlonglong, NULL) + self.check_long_asint(asunsignedlonglong, 0, ULLONG_MAX, use_index=False) def test_long_asunsignedlonglongmask(self): # Test PyLong_AsUnsignedLongLongMask() asunsignedlonglongmask = _testcapi.pylong_asunsignedlonglongmask from _testcapi import ULLONG_MAX - # round trip (object -> unsigned long long -> object) - for value in (ULLONG_MAX, 0, 1, 1234): - with self.subTest(value=value): - self.assertEqual(asunsignedlonglongmask(value), value) - - self.assertEqual(asunsignedlonglongmask(IntSubclass(42)), 42) - self.assertEqual(asunsignedlonglongmask(Index(42)), 42) - self.assertEqual(asunsignedlonglongmask(MyIndexAndInt()), 10) - - self.assertEqual(asunsignedlonglongmask(-1), ULLONG_MAX) - self.assertEqual(asunsignedlonglongmask(ULLONG_MAX + 1), 0) - self.assertRaises(TypeError, asunsignedlonglongmask, 1.0) - self.assertRaises(TypeError, asunsignedlonglongmask, b'2') - self.assertRaises(TypeError, asunsignedlonglongmask, '3') - self.assertRaises(SystemError, asunsignedlonglongmask, NULL) + self.check_long_asint(asunsignedlonglongmask, 0, ULLONG_MAX, mask=True) def test_long_as_ssize_t(self): # Test PyLong_AsSsize_t() and PyLong_FromSsize_t() as_ssize_t = _testcapi.pylong_as_ssize_t from _testcapi import PY_SSIZE_T_MIN, PY_SSIZE_T_MAX - # round trip (object -> Py_ssize_t -> object) - for value in (PY_SSIZE_T_MIN, PY_SSIZE_T_MAX, -1, 0, 1, 1234): - with self.subTest(value=value): - self.assertEqual(as_ssize_t(value), value) - - self.assertEqual(as_ssize_t(IntSubclass(42)), 42) - self.assertRaises(TypeError, as_ssize_t, Index(42)) - self.assertRaises(TypeError, as_ssize_t, MyIndexAndInt()) - - self.assertRaises(OverflowError, as_ssize_t, PY_SSIZE_T_MIN - 1) - self.assertRaises(OverflowError, as_ssize_t, PY_SSIZE_T_MAX + 1) - self.assertRaises(TypeError, as_ssize_t, 1.0) - self.assertRaises(TypeError, as_ssize_t, b'2') - self.assertRaises(TypeError, as_ssize_t, '3') - self.assertRaises(SystemError, as_ssize_t, NULL) + self.check_long_asint(as_ssize_t, PY_SSIZE_T_MIN, PY_SSIZE_T_MAX, + use_index=False) def test_long_as_size_t(self): # Test PyLong_AsSize_t() and PyLong_FromSize_t() as_size_t = _testcapi.pylong_as_size_t from _testcapi import SIZE_MAX - # round trip (object -> size_t -> object) - for value in (SIZE_MAX, 0, 1, 1234): - with self.subTest(value=value): - self.assertEqual(as_size_t(value), value) - - self.assertEqual(as_size_t(IntSubclass(42)), 42) - self.assertRaises(TypeError, as_size_t, Index(42)) - self.assertRaises(TypeError, as_size_t, MyIndexAndInt()) - - self.assertRaises(OverflowError, as_size_t, -1) - self.assertRaises(OverflowError, as_size_t, SIZE_MAX + 1) - self.assertRaises(TypeError, as_size_t, 1.0) - self.assertRaises(TypeError, as_size_t, b'2') - self.assertRaises(TypeError, as_size_t, '3') - self.assertRaises(SystemError, as_size_t, NULL) + self.check_long_asint(as_size_t, 0, SIZE_MAX, use_index=False) def test_long_asdouble(self): # Test PyLong_AsDouble() @@ -407,21 +325,7 @@ def test_long_aspid(self): bits = 8 * SIZEOF_PID_T PID_T_MIN = -2**(bits-1) PID_T_MAX = 2**(bits-1) - 1 - # round trip (object -> long -> object) - for value in (PID_T_MIN, PID_T_MAX, -1, 0, 1, 1234): - with self.subTest(value=value): - self.assertEqual(aspid(value), value) - - self.assertEqual(aspid(IntSubclass(42)), 42) - self.assertEqual(aspid(Index(42)), 42) - self.assertEqual(aspid(MyIndexAndInt()), 10) - - self.assertRaises(OverflowError, aspid, PID_T_MIN - 1) - self.assertRaises(OverflowError, aspid, PID_T_MAX + 1) - self.assertRaises(TypeError, aspid, 1.0) - self.assertRaises(TypeError, aspid, b'2') - self.assertRaises(TypeError, aspid, '3') - self.assertRaises(SystemError, aspid, NULL) + self.check_long_asint(aspid, PID_T_MIN, PID_T_MAX) if __name__ == "__main__": diff --git a/Lib/test/test_capi/test_number.py b/Lib/test/test_capi/test_number.py new file mode 100644 index 00000000..3c1f0f24 --- /dev/null +++ b/Lib/test/test_capi/test_number.py @@ -0,0 +1,335 @@ +import itertools +import operator +import sys +import unittest +import warnings + +from test.support import cpython_only, import_helper + +_testcapi = import_helper.import_module('_testcapi') +from _testcapi import PY_SSIZE_T_MAX, PY_SSIZE_T_MIN + +try: + from _testbuffer import ndarray +except ImportError: + ndarray = None + +NULL = None + +class BadDescr: + def __get__(self, obj, objtype=None): + raise RuntimeError + +class WithDunder: + def _meth(self, *args): + if self.val: + return self.val + if self.exc: + raise self.exc + @classmethod + def with_val(cls, val): + obj = super().__new__(cls) + obj.val = val + obj.exc = None + setattr(cls, cls.methname, cls._meth) + return obj + + @classmethod + def with_exc(cls, exc): + obj = super().__new__(cls) + obj.val = None + obj.exc = exc + setattr(cls, cls.methname, cls._meth) + return obj + +class HasBadAttr: + def __new__(cls): + obj = super().__new__(cls) + setattr(cls, cls.methname, BadDescr()) + return obj + + +class IndexLike(WithDunder): + methname = '__index__' + +class IntLike(WithDunder): + methname = '__int__' + +class FloatLike(WithDunder): + methname = '__float__' + + +def subclassof(base): + return type(base.__name__ + 'Subclass', (base,), {}) + + +class SomeError(Exception): + pass + +class OtherError(Exception): + pass + + +class CAPITest(unittest.TestCase): + def test_check(self): + # Test PyNumber_Check() + check = _testcapi.number_check + + self.assertTrue(check(1)) + self.assertTrue(check(IndexLike.with_val(1))) + self.assertTrue(check(IntLike.with_val(99))) + self.assertTrue(check(0.5)) + self.assertTrue(check(FloatLike.with_val(4.25))) + self.assertTrue(check(1+2j)) + + self.assertFalse(check([])) + self.assertFalse(check("abc")) + self.assertFalse(check(object())) + self.assertFalse(check(NULL)) + + def test_unary_ops(self): + methmap = {'__neg__': _testcapi.number_negative, # PyNumber_Negative() + '__pos__': _testcapi.number_positive, # PyNumber_Positive() + '__abs__': _testcapi.number_absolute, # PyNumber_Absolute() + '__invert__': _testcapi.number_invert} # PyNumber_Invert() + + for name, func in methmap.items(): + # Generic object, has no tp_as_number structure + self.assertRaises(TypeError, func, object()) + + # C-API function accepts NULL + self.assertRaises(SystemError, func, NULL) + + # Behave as corresponding unary operation + op = getattr(operator, name) + for x in [0, 42, -1, 3.14, 1+2j]: + try: + op(x) + except TypeError: + self.assertRaises(TypeError, func, x) + else: + self.assertEqual(func(x), op(x)) + + def test_binary_ops(self): + methmap = {'__add__': _testcapi.number_add, # PyNumber_Add() + '__sub__': _testcapi.number_subtract, # PyNumber_Subtract() + '__mul__': _testcapi.number_multiply, # PyNumber_Multiply() + '__matmul__': _testcapi.number_matrixmultiply, # PyNumber_MatrixMultiply() + '__floordiv__': _testcapi.number_floordivide, # PyNumber_FloorDivide() + '__truediv__': _testcapi.number_truedivide, # PyNumber_TrueDivide() + '__mod__': _testcapi.number_remainder, # PyNumber_Remainder() + '__divmod__': _testcapi.number_divmod, # PyNumber_Divmod() + '__lshift__': _testcapi.number_lshift, # PyNumber_Lshift() + '__rshift__': _testcapi.number_rshift, # PyNumber_Rshift() + '__and__': _testcapi.number_and, # PyNumber_And() + '__xor__': _testcapi.number_xor, # PyNumber_Xor() + '__or__': _testcapi.number_or, # PyNumber_Or() + '__pow__': _testcapi.number_power, # PyNumber_Power() + '__iadd__': _testcapi.number_inplaceadd, # PyNumber_InPlaceAdd() + '__isub__': _testcapi.number_inplacesubtract, # PyNumber_InPlaceSubtract() + '__imul__': _testcapi.number_inplacemultiply, # PyNumber_InPlaceMultiply() + '__imatmul__': _testcapi.number_inplacematrixmultiply, # PyNumber_InPlaceMatrixMultiply() + '__ifloordiv__': _testcapi.number_inplacefloordivide, # PyNumber_InPlaceFloorDivide() + '__itruediv__': _testcapi.number_inplacetruedivide, # PyNumber_InPlaceTrueDivide() + '__imod__': _testcapi.number_inplaceremainder, # PyNumber_InPlaceRemainder() + '__ilshift__': _testcapi.number_inplacelshift, # PyNumber_InPlaceLshift() + '__irshift__': _testcapi.number_inplacershift, # PyNumber_InPlaceRshift() + '__iand__': _testcapi.number_inplaceand, # PyNumber_InPlaceAnd() + '__ixor__': _testcapi.number_inplacexor, # PyNumber_InPlaceXor() + '__ior__': _testcapi.number_inplaceor, # PyNumber_InPlaceOr() + '__ipow__': _testcapi.number_inplacepower, # PyNumber_InPlacePower() + } + + for name, func in methmap.items(): + cases = [0, 42, 3.14, -1, 123, 1+2j] + + # Generic object, has no tp_as_number structure + for x in cases: + self.assertRaises(TypeError, func, object(), x) + self.assertRaises(TypeError, func, x, object()) + + # Behave as corresponding binary operation + op = getattr(operator, name, divmod) + for x, y in itertools.combinations(cases, 2): + try: + op(x, y) + except (TypeError, ValueError, ZeroDivisionError) as exc: + self.assertRaises(exc.__class__, func, x, y) + else: + self.assertEqual(func(x, y), op(x, y)) + + # CRASHES func(NULL, object()) + # CRASHES func(object(), NULL) + + @unittest.skipIf(ndarray is None, "needs _testbuffer") + def test_misc_add(self): + # PyNumber_Add(), PyNumber_InPlaceAdd() + add = _testcapi.number_add + inplaceadd = _testcapi.number_inplaceadd + + # test sq_concat/sq_inplace_concat slots + a, b, r = [1, 2], [3, 4], [1, 2, 3, 4] + self.assertEqual(add(a, b), r) + self.assertEqual(a, [1, 2]) + self.assertRaises(TypeError, add, ndarray([1], (1,)), 2) + a, b, r = [1, 2], [3, 4], [1, 2, 3, 4] + self.assertEqual(inplaceadd(a, b), r) + self.assertEqual(a, r) + self.assertRaises(TypeError, inplaceadd, ndarray([1], (1,)), 2) + + @unittest.skipIf(ndarray is None, "needs _testbuffer") + def test_misc_multiply(self): + # PyNumber_Multiply(), PyNumber_InPlaceMultiply() + multiply = _testcapi.number_multiply + inplacemultiply = _testcapi.number_inplacemultiply + + # test sq_repeat/sq_inplace_repeat slots + a, b, r = [1], 2, [1, 1] + self.assertEqual(multiply(a, b), r) + self.assertEqual((a, b), ([1], 2)) + self.assertEqual(multiply(b, a), r) + self.assertEqual((a, b), ([1], 2)) + self.assertEqual(multiply([1], -1), []) + self.assertRaises(TypeError, multiply, ndarray([1], (1,)), 2) + self.assertRaises(TypeError, multiply, [1], 0.5) + self.assertRaises(OverflowError, multiply, [1], PY_SSIZE_T_MAX + 1) + self.assertRaises(MemoryError, multiply, [1, 2], PY_SSIZE_T_MAX//2 + 1) + a, b, r = [1], 2, [1, 1] + self.assertEqual(inplacemultiply(a, b), r) + self.assertEqual((a, b), (r, 2)) + a = [1] + self.assertEqual(inplacemultiply(b, a), r) + self.assertEqual((a, b), ([1], 2)) + self.assertRaises(TypeError, inplacemultiply, ndarray([1], (1,)), 2) + self.assertRaises(OverflowError, inplacemultiply, [1], PY_SSIZE_T_MAX + 1) + self.assertRaises(MemoryError, inplacemultiply, [1, 2], PY_SSIZE_T_MAX//2 + 1) + + def test_misc_power(self): + # PyNumber_Power() + power = _testcapi.number_power + + class HasPow(WithDunder): + methname = '__pow__' + + # ternary op + self.assertEqual(power(4, 11, 5), pow(4, 11, 5)) + self.assertRaises(TypeError, power, 4, 11, 1.25) + self.assertRaises(TypeError, power, 4, 11, HasPow.with_val(NotImplemented)) + self.assertRaises(TypeError, power, 4, 11, object()) + + @cpython_only + def test_rshift_print(self): + # This tests correct syntax hint for py2 redirection (>>). + rshift = _testcapi.number_rshift + + with self.assertRaises(TypeError) as context: + rshift(print, 42) + self.assertIn('Did you mean "print(, ' + 'file=)"?', str(context.exception)) + with self.assertRaises(TypeError) as context: + rshift(max, sys.stderr) + self.assertNotIn('Did you mean ', str(context.exception)) + with self.assertRaises(TypeError) as context: + rshift(1, "spam") + + def test_long(self): + # Test PyNumber_Long() + long = _testcapi.number_long + + self.assertEqual(long(42), 42) + self.assertEqual(long(1.25), 1) + self.assertEqual(long("42"), 42) + self.assertEqual(long(b"42"), 42) + self.assertEqual(long(bytearray(b"42")), 42) + self.assertEqual(long(memoryview(b"42")), 42) + self.assertEqual(long(IndexLike.with_val(99)), 99) + self.assertEqual(long(IntLike.with_val(99)), 99) + + self.assertRaises(TypeError, long, IntLike.with_val(1.0)) + with warnings.catch_warnings(): + warnings.simplefilter("error", DeprecationWarning) + self.assertRaises(DeprecationWarning, long, IntLike.with_val(True)) + with self.assertWarns(DeprecationWarning): + self.assertEqual(long(IntLike.with_val(True)), 1) + self.assertRaises(RuntimeError, long, IntLike.with_exc(RuntimeError)) + + self.assertRaises(TypeError, long, 1j) + self.assertRaises(TypeError, long, object()) + self.assertRaises(SystemError, long, NULL) + + def test_float(self): + # Test PyNumber_Float() + float_ = _testcapi.number_float + + self.assertEqual(float_(1.25), 1.25) + self.assertEqual(float_(123), 123.) + self.assertEqual(float_("1.25"), 1.25) + + self.assertEqual(float_(FloatLike.with_val(4.25)), 4.25) + self.assertEqual(float_(IndexLike.with_val(99)), 99.0) + self.assertEqual(float_(IndexLike.with_val(-1)), -1.0) + + self.assertRaises(TypeError, float_, FloatLike.with_val(687)) + with warnings.catch_warnings(): + warnings.simplefilter("error", DeprecationWarning) + self.assertRaises(DeprecationWarning, float_, FloatLike.with_val(subclassof(float)(4.25))) + with self.assertWarns(DeprecationWarning): + self.assertEqual(float_(FloatLike.with_val(subclassof(float)(4.25))), 4.25) + self.assertRaises(RuntimeError, float_, FloatLike.with_exc(RuntimeError)) + + self.assertRaises(TypeError, float_, IndexLike.with_val(1.25)) + self.assertRaises(OverflowError, float_, IndexLike.with_val(2**2000)) + + self.assertRaises(TypeError, float_, 1j) + self.assertRaises(TypeError, float_, object()) + self.assertRaises(SystemError, float_, NULL) + + def test_index(self): + # Test PyNumber_Index() + index = _testcapi.number_index + + self.assertEqual(index(11), 11) + + with warnings.catch_warnings(): + warnings.simplefilter("error", DeprecationWarning) + self.assertRaises(DeprecationWarning, index, IndexLike.with_val(True)) + with self.assertWarns(DeprecationWarning): + self.assertEqual(index(IndexLike.with_val(True)), 1) + self.assertRaises(TypeError, index, IndexLike.with_val(1.0)) + self.assertRaises(RuntimeError, index, IndexLike.with_exc(RuntimeError)) + + self.assertRaises(TypeError, index, 1.25) + self.assertRaises(TypeError, index, "42") + self.assertRaises(TypeError, index, object()) + self.assertRaises(SystemError, index, NULL) + + def test_tobase(self): + # Test PyNumber_ToBase() + tobase = _testcapi.number_tobase + + self.assertEqual(tobase(10, 2), bin(10)) + self.assertEqual(tobase(11, 8), oct(11)) + self.assertEqual(tobase(16, 10), str(16)) + self.assertEqual(tobase(13, 16), hex(13)) + + self.assertRaises(SystemError, tobase, NULL, 2) + self.assertRaises(SystemError, tobase, 2, 3) + self.assertRaises(TypeError, tobase, 1.25, 2) + self.assertRaises(TypeError, tobase, "42", 2) + + def test_asssizet(self): + # Test PyNumber_AsSsize_t() + asssizet = _testcapi.number_asssizet + + for n in [*range(-6, 7), PY_SSIZE_T_MIN, PY_SSIZE_T_MAX]: + self.assertEqual(asssizet(n, OverflowError), n) + self.assertEqual(asssizet(PY_SSIZE_T_MAX+10, NULL), PY_SSIZE_T_MAX) + self.assertEqual(asssizet(PY_SSIZE_T_MIN-10, NULL), PY_SSIZE_T_MIN) + + self.assertRaises(OverflowError, asssizet, PY_SSIZE_T_MAX + 10, OverflowError) + self.assertRaises(RuntimeError, asssizet, PY_SSIZE_T_MAX + 10, RuntimeError) + self.assertRaises(SystemError, asssizet, NULL, TypeError) + + +if __name__ == "__main__": + unittest.main() diff --git a/Lib/test/test_capi/test_set.py b/Lib/test/test_capi/test_set.py index e9165e7e..5131e674 100644 --- a/Lib/test/test_capi/test_set.py +++ b/Lib/test/test_capi/test_set.py @@ -213,3 +213,7 @@ def test_clear(self): clear(object()) self.assertImmutable(clear) # CRASHES: clear(NULL) + + +if __name__ == "__main__": + unittest.main() diff --git a/Lib/test/test_capi/test_tuple.py b/Lib/test/test_capi/test_tuple.py new file mode 100644 index 00000000..baf0d172 --- /dev/null +++ b/Lib/test/test_capi/test_tuple.py @@ -0,0 +1,261 @@ +import unittest +import sys +from collections import namedtuple +from test.support import import_helper + +_testcapi = import_helper.import_module('_testcapi') +_testlimitedcapi = _testcapi + +NULL = None +PY_SSIZE_T_MIN = _testcapi.PY_SSIZE_T_MIN +PY_SSIZE_T_MAX = _testcapi.PY_SSIZE_T_MAX + +class TupleSubclass(tuple): + pass + + +class CAPITest(unittest.TestCase): + def test_check(self): + # Test PyTuple_Check() + check = _testlimitedcapi.tuple_check + + self.assertTrue(check((1, 2))) + self.assertTrue(check(())) + self.assertTrue(check(TupleSubclass((1, 2)))) + self.assertFalse(check({1: 2})) + self.assertFalse(check([1, 2])) + self.assertFalse(check(42)) + self.assertFalse(check(object())) + + # CRASHES check(NULL) + + def test_tuple_checkexact(self): + # Test PyTuple_CheckExact() + check = _testlimitedcapi.tuple_checkexact + + self.assertTrue(check((1, 2))) + self.assertTrue(check(())) + self.assertFalse(check(TupleSubclass((1, 2)))) + self.assertFalse(check({1: 2})) + self.assertFalse(check([1, 2])) + self.assertFalse(check(42)) + self.assertFalse(check(object())) + + # CRASHES check(NULL) + + def test_tuple_new(self): + # Test PyTuple_New() + tuple_new = _testlimitedcapi.tuple_new + size = _testlimitedcapi.tuple_size + checknull = _testcapi._check_tuple_item_is_NULL + + tup1 = tuple_new(0) + self.assertEqual(tup1, ()) + self.assertEqual(size(tup1), 0) + self.assertIs(type(tup1), tuple) + tup2 = tuple_new(1) + self.assertIs(type(tup2), tuple) + self.assertEqual(size(tup2), 1) + self.assertIsNot(tup2, tup1) + self.assertTrue(checknull(tup2, 0)) + + self.assertRaises(SystemError, tuple_new, -1) + self.assertRaises(SystemError, tuple_new, PY_SSIZE_T_MIN) + self.assertRaises(MemoryError, tuple_new, PY_SSIZE_T_MAX) + + def test_tuple_pack(self): + # Test PyTuple_Pack() + pack = _testlimitedcapi.tuple_pack + + self.assertEqual(pack(0), ()) + self.assertEqual(pack(1, [1]), ([1],)) + self.assertEqual(pack(2, [1], [2]), ([1], [2])) + + self.assertRaises(SystemError, pack, PY_SSIZE_T_MIN) + self.assertRaises(SystemError, pack, -1) + self.assertRaises(MemoryError, pack, PY_SSIZE_T_MAX) + + # CRASHES pack(1, NULL) + # CRASHES pack(2, [1]) + + def test_tuple_size(self): + # Test PyTuple_Size() + size = _testlimitedcapi.tuple_size + + self.assertEqual(size(()), 0) + self.assertEqual(size((1, 2)), 2) + self.assertEqual(size(TupleSubclass((1, 2))), 2) + + self.assertRaises(SystemError, size, []) + self.assertRaises(SystemError, size, 42) + self.assertRaises(SystemError, size, object()) + + # CRASHES size(NULL) + + def test_tuple_get_size(self): + # Test PyTuple_GET_SIZE() + size = _testcapi.tuple_get_size + + self.assertEqual(size(()), 0) + self.assertEqual(size((1, 2)), 2) + self.assertEqual(size(TupleSubclass((1, 2))), 2) + + def test_tuple_getitem(self): + # Test PyTuple_GetItem() + getitem = _testlimitedcapi.tuple_getitem + + tup = ([1], [2], [3]) + self.assertEqual(getitem(tup, 0), [1]) + self.assertEqual(getitem(tup, 2), [3]) + + tup2 = TupleSubclass(([1], [2], [3])) + self.assertEqual(getitem(tup2, 0), [1]) + self.assertEqual(getitem(tup2, 2), [3]) + + self.assertRaises(IndexError, getitem, tup, PY_SSIZE_T_MIN) + self.assertRaises(IndexError, getitem, tup, -1) + self.assertRaises(IndexError, getitem, tup, len(tup)) + self.assertRaises(IndexError, getitem, tup, PY_SSIZE_T_MAX) + self.assertRaises(SystemError, getitem, [1, 2, 3], 1) + self.assertRaises(SystemError, getitem, 42, 1) + + # CRASHES getitem(NULL, 0) + + def test_tuple_get_item(self): + # Test PyTuple_GET_ITEM() + get_item = _testcapi.tuple_get_item + + tup = ([1], [2], [3]) + self.assertEqual(get_item(tup, 0), [1]) + self.assertEqual(get_item(tup, 2), [3]) + + tup2 = TupleSubclass(([1], [2], [3])) + self.assertEqual(get_item(tup2, 0), [1]) + self.assertEqual(get_item(tup2, 2), [3]) + + # CRASHES get_item(NULL, 0) + + def test_tuple_getslice(self): + # Test PyTuple_GetSlice() + getslice = _testlimitedcapi.tuple_getslice + + # empty + tup = ([1], [2], [3]) + self.assertEqual(getslice(tup, PY_SSIZE_T_MIN, 0), ()) + self.assertEqual(getslice(tup, -1, 0), ()) + self.assertEqual(getslice(tup, 3, PY_SSIZE_T_MAX), ()) + self.assertEqual(getslice(tup, 1, 1), ()) + self.assertEqual(getslice(tup, 2, 1), ()) + tup = TupleSubclass(([1], [2], [3])) + self.assertEqual(getslice(tup, PY_SSIZE_T_MIN, 0), ()) + self.assertEqual(getslice(tup, -1, 0), ()) + self.assertEqual(getslice(tup, 3, PY_SSIZE_T_MAX), ()) + self.assertEqual(getslice(tup, 1, 1), ()) + self.assertEqual(getslice(tup, 2, 1), ()) + + # slice + tup = ([1], [2], [3], [4]) + self.assertEqual(getslice(tup, 1, 3), ([2], [3])) + tup = TupleSubclass(([1], [2], [3], [4])) + self.assertEqual(getslice(tup, 1, 3), ([2], [3])) + + # whole + tup = ([1], [2], [3]) + self.assertEqual(getslice(tup, 0, 3), tup) + self.assertEqual(getslice(tup, 0, 100), tup) + self.assertEqual(getslice(tup, -100, 100), tup) + tup = TupleSubclass(([1], [2], [3])) + self.assertEqual(getslice(tup, 0, 3), tup) + self.assertEqual(getslice(tup, 0, 100), tup) + self.assertEqual(getslice(tup, -100, 100), tup) + + self.assertRaises(SystemError, getslice, [[1], [2], [3]], 0, 0) + self.assertRaises(SystemError, getslice, 42, 0, 0) + + # CRASHES getslice(NULL, 0, 0) + + def test_tuple_setitem(self): + # Test PyTuple_SetItem() + setitem = _testlimitedcapi.tuple_setitem + checknull = _testcapi._check_tuple_item_is_NULL + + tup = ([1], [2]) + self.assertEqual(setitem(tup, 0, []), ([], [2])) + self.assertEqual(setitem(tup, 1, []), ([1], [])) + + tup2 = setitem(tup, 1, NULL) + self.assertTrue(checknull(tup2, 1)) + + tup2 = TupleSubclass(([1], [2])) + self.assertRaises(SystemError, setitem, tup2, 0, []) + + self.assertRaises(IndexError, setitem, tup, PY_SSIZE_T_MIN, []) + self.assertRaises(IndexError, setitem, tup, -1, []) + self.assertRaises(IndexError, setitem, tup, len(tup), []) + self.assertRaises(IndexError, setitem, tup, PY_SSIZE_T_MAX, []) + self.assertRaises(SystemError, setitem, [1], 0, []) + self.assertRaises(SystemError, setitem, 42, 0, []) + + # CRASHES setitem(NULL, 0, []) + + def test_tuple_set_item(self): + # Test PyTuple_SET_ITEM() + set_item = _testcapi.tuple_set_item + checknull = _testcapi._check_tuple_item_is_NULL + + tup = ([1], [2]) + self.assertEqual(set_item(tup, 0, []), ([], [2])) + self.assertEqual(set_item(tup, 1, []), ([1], [])) + + tup2 = set_item(tup, 1, NULL) + self.assertTrue(checknull(tup2, 1)) + + tup2 = TupleSubclass(([1], [2])) + self.assertIs(set_item(tup2, 0, []), tup2) + self.assertEqual(tup2, ([], [2])) + + # CRASHES set_item(tup, -1, []) + # CRASHES set_item(tup, len(tup), []) + # CRASHES set_item([1], 0, []) + # CRASHES set_item(NULL, 0, []) + + def test__tuple_resize(self): + # Test _PyTuple_Resize() + resize = _testcapi._tuple_resize + checknull = _testcapi._check_tuple_item_is_NULL + + a = () + b = resize(a, 0, False) + self.assertEqual(len(a), 0) + self.assertEqual(len(b), 0) + b = resize(a, 2, False) + self.assertEqual(len(a), 0) + self.assertEqual(len(b), 2) + self.assertTrue(checknull(b, 0)) + self.assertTrue(checknull(b, 1)) + + a = ([1], [2], [3]) + b = resize(a, 3) + self.assertEqual(b, a) + b = resize(a, 2) + self.assertEqual(b, a[:2]) + b = resize(a, 5) + self.assertEqual(len(b), 5) + self.assertEqual(b[:3], a) + self.assertTrue(checknull(b, 3)) + self.assertTrue(checknull(b, 4)) + + a = () + self.assertRaises(MemoryError, resize, a, PY_SSIZE_T_MAX) + self.assertRaises(SystemError, resize, a, -1) + self.assertRaises(SystemError, resize, a, PY_SSIZE_T_MIN) + # refcount > 1 + a = (1, 2, 3) + self.assertRaises(SystemError, resize, a, 3, False) + self.assertRaises(SystemError, resize, a, 0, False) + # non-tuple + self.assertRaises(SystemError, resize, [1, 2, 3], 0, False) + self.assertRaises(SystemError, resize, NULL, 0, False) + +if __name__ == "__main__": + unittest.main() diff --git a/Lib/test/test_class.py b/Lib/test/test_class.py index 7a159760..28d3c0db 100644 --- a/Lib/test/test_class.py +++ b/Lib/test/test_class.py @@ -503,6 +503,56 @@ def __eq__(self, other): return 1 self.assertRaises(TypeError, hash, C2()) + def testPredefinedAttrs(self): + o = object() + + class Custom: + pass + + c = Custom() + + methods = ( + '__class__', '__delattr__', '__dir__', '__eq__', '__format__', + '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', + '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', + '__new__', '__reduce__', '__reduce_ex__', '__repr__', + '__setattr__', '__sizeof__', '__str__', '__subclasshook__' + ) + for name in methods: + with self.subTest(name): + self.assertTrue(callable(getattr(object, name, None))) + self.assertTrue(callable(getattr(o, name, None))) + self.assertTrue(callable(getattr(Custom, name, None))) + self.assertTrue(callable(getattr(c, name, None))) + + not_defined = [ + '__abs__', '__aenter__', '__aexit__', '__aiter__', '__anext__', + '__await__', '__bool__', '__bytes__', '__ceil__', + '__complex__', '__contains__', '__del__', '__delete__', + '__delitem__', '__divmod__', '__enter__', '__exit__', + '__float__', '__floor__', '__get__', '__getattr__', '__getitem__', + '__index__', '__int__', '__invert__', '__iter__', '__len__', + '__length_hint__', '__missing__', '__neg__', '__next__', + '__objclass__', '__pos__', '__rdivmod__', '__reversed__', + '__round__', '__set__', '__setitem__', '__trunc__' + ] + augment = ( + 'add', 'and', 'floordiv', 'lshift', 'matmul', 'mod', 'mul', 'pow', + 'rshift', 'sub', 'truediv', 'xor' + ) + not_defined.extend(map("__{}__".format, augment)) + not_defined.extend(map("__r{}__".format, augment)) + not_defined.extend(map("__i{}__".format, augment)) + for name in not_defined: + with self.subTest(name): + self.assertFalse(hasattr(object, name)) + self.assertFalse(hasattr(o, name)) + self.assertFalse(hasattr(Custom, name)) + self.assertFalse(hasattr(c, name)) + + # __call__() is defined on the metaclass but not the class + self.assertFalse(hasattr(o, "__call__")) + self.assertFalse(hasattr(c, "__call__")) def testSFBug532646(self): # Test for SF bug 532646 diff --git a/Lib/test/test_clinic.py b/Lib/test/test_clinic.py index c114a62c..e5f653ee 100644 --- a/Lib/test/test_clinic.py +++ b/Lib/test/test_clinic.py @@ -1502,7 +1502,7 @@ def test_cli_force(self): # Verify by checking the checksum. checksum = ( "/*[clinic end generated code: " - "output=2124c291eb067d76 input=9543a8d2da235301]*/\n" + "output=99dd9b13ffdc660d input=9543a8d2da235301]*/\n" ) with open(fn, encoding='utf-8') as f: generated = f.read() @@ -2093,11 +2093,27 @@ def test_vararg(self): self.assertEqual(ac_tester.vararg(1, 2, 3, 4), (1, (2, 3, 4))) def test_vararg_with_default(self): - with self.assertRaises(TypeError): - ac_tester.vararg_with_default() - self.assertEqual(ac_tester.vararg_with_default(1, b=False), (1, (), False)) - self.assertEqual(ac_tester.vararg_with_default(1, 2, 3, 4), (1, (2, 3, 4), False)) - self.assertEqual(ac_tester.vararg_with_default(1, 2, 3, 4, b=True), (1, (2, 3, 4), True)) + fn = ac_tester.vararg_with_default + self.assertRaises(TypeError, fn) + self.assertRaises(TypeError, fn, 1, a=2) + self.assertEqual(fn(1, b=2), (1, (), True)) + self.assertEqual(fn(1, 2, 3, 4), (1, (2, 3, 4), False)) + self.assertEqual(fn(1, 2, 3, 4, b=5), (1, (2, 3, 4), True)) + self.assertEqual(fn(a=1), (1, (), False)) + self.assertEqual(fn(a=1, b=2), (1, (), True)) + + def test_vararg_with_default2(self): + fn = ac_tester.vararg_with_default2 + self.assertRaises(TypeError, fn) + self.assertRaises(TypeError, fn, 1, a=2) + self.assertEqual(fn(1, b=2), (1, (), 2, None)) + self.assertEqual(fn(1, b=2, c=3), (1, (), 2, 3)) + self.assertEqual(fn(1, 2, 3), (1, (2, 3), None, None)) + self.assertEqual(fn(1, 2, 3, b=4), (1, (2, 3), 4, None)) + self.assertEqual(fn(1, 2, 3, b=4, c=5), (1, (2, 3), 4, 5)) + self.assertEqual(fn(a=1), (1, (), None, None)) + self.assertEqual(fn(a=1, b=2), (1, (), 2, None)) + self.assertEqual(fn(a=1, b=2, c=3), (1, (), 2, 3)) def test_vararg_with_only_defaults(self): self.assertEqual(ac_tester.vararg_with_only_defaults(), ((), None)) diff --git a/Lib/test/test_cmath.py b/Lib/test/test_cmath.py index 57f80d5d..a96a5780 100644 --- a/Lib/test/test_cmath.py +++ b/Lib/test/test_cmath.py @@ -1,4 +1,5 @@ from test.support import requires_IEEE_754, cpython_only, import_helper +from test.support.testcase import ComplexesAreIdenticalMixin from test.test_math import parse_testfile, test_file import test.test_math as test_math import unittest @@ -49,7 +50,7 @@ (INF, NAN) ]] -class CMathTests(unittest.TestCase): +class CMathTests(ComplexesAreIdenticalMixin, unittest.TestCase): # list of all functions in cmath test_functions = [getattr(cmath, fname) for fname in [ 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atanh', @@ -65,39 +66,6 @@ def setUp(self): def tearDown(self): self.test_values.close() - def assertFloatIdentical(self, x, y): - """Fail unless floats x and y are identical, in the sense that: - (1) both x and y are nans, or - (2) both x and y are infinities, with the same sign, or - (3) both x and y are zeros, with the same sign, or - (4) x and y are both finite and nonzero, and x == y - - """ - msg = 'floats {!r} and {!r} are not identical' - - if math.isnan(x) or math.isnan(y): - if math.isnan(x) and math.isnan(y): - return - elif x == y: - if x != 0.0: - return - # both zero; check that signs match - elif math.copysign(1.0, x) == math.copysign(1.0, y): - return - else: - msg += ': zeros have different signs' - self.fail(msg.format(x, y)) - - def assertComplexIdentical(self, x, y): - """Fail unless complex numbers x and y have equal values and signs. - - In particular, if x and y both have real (or imaginary) part - zero, but the zeros have different signs, this test will fail. - - """ - self.assertFloatIdentical(x.real, y.real) - self.assertFloatIdentical(x.imag, y.imag) - def rAssertAlmostEqual(self, a, b, rel_err = 2e-15, abs_err = 5e-323, msg=None): """Fail if the two floating-point numbers are not almost equal. @@ -555,7 +523,7 @@ def test_isinf(self): @requires_IEEE_754 def testTanhSign(self): for z in complex_zeros: - self.assertComplexIdentical(cmath.tanh(z), z) + self.assertComplexesAreIdentical(cmath.tanh(z), z) # The algorithm used for atan and atanh makes use of the system # log1p function; If that system function doesn't respect the sign @@ -564,12 +532,12 @@ def testTanhSign(self): @requires_IEEE_754 def testAtanSign(self): for z in complex_zeros: - self.assertComplexIdentical(cmath.atan(z), z) + self.assertComplexesAreIdentical(cmath.atan(z), z) @requires_IEEE_754 def testAtanhSign(self): for z in complex_zeros: - self.assertComplexIdentical(cmath.atanh(z), z) + self.assertComplexesAreIdentical(cmath.atanh(z), z) class IsCloseTests(test_math.IsCloseTests): diff --git a/Lib/test/test_code_module.py b/Lib/test/test_code_module.py index 226bc3a8..06a1ba49 100644 --- a/Lib/test/test_code_module.py +++ b/Lib/test/test_code_module.py @@ -1,5 +1,6 @@ "Test InteractiveConsole and InteractiveInterpreter from code module" import sys +import traceback import unittest from textwrap import dedent from contextlib import ExitStack @@ -11,6 +12,7 @@ class TestInteractiveConsole(unittest.TestCase): + maxDiff = None def setUp(self): self.console = code.InteractiveConsole() @@ -58,21 +60,151 @@ def test_console_stderr(self): raise AssertionError("no console stdout") def test_syntax_error(self): - self.infunc.side_effect = ["undefined", EOFError('Finished')] + self.infunc.side_effect = ["def f():", + " x = ?", + "", + EOFError('Finished')] self.console.interact() - for call in self.stderr.method_calls: - if 'NameError' in ''.join(call[1]): - break - else: - raise AssertionError("No syntax error from console") + output = ''.join(''.join(call[1]) for call in self.stderr.method_calls) + output = output[output.index('(InteractiveConsole)'):] + output = output[:output.index('\nnow exiting')] + self.assertEqual(output.splitlines()[1:], [ + ' File "", line 2', + ' x = ?', + ' ^', + 'SyntaxError: invalid syntax']) + self.assertIs(self.sysmod.last_type, SyntaxError) + self.assertIs(type(self.sysmod.last_value), SyntaxError) + self.assertIsNone(self.sysmod.last_traceback) + self.assertIsNone(self.sysmod.last_value.__traceback__) + self.assertIs(self.sysmod.last_exc, self.sysmod.last_value) + + def test_indentation_error(self): + self.infunc.side_effect = [" 1", EOFError('Finished')] + self.console.interact() + output = ''.join(''.join(call[1]) for call in self.stderr.method_calls) + output = output[output.index('(InteractiveConsole)'):] + output = output[:output.index('\nnow exiting')] + self.assertEqual(output.splitlines()[1:], [ + ' File "", line 1', + ' 1', + 'IndentationError: unexpected indent']) + self.assertIs(self.sysmod.last_type, IndentationError) + self.assertIs(type(self.sysmod.last_value), IndentationError) + self.assertIsNone(self.sysmod.last_traceback) + self.assertIsNone(self.sysmod.last_value.__traceback__) + self.assertIs(self.sysmod.last_exc, self.sysmod.last_value) + + def test_unicode_error(self): + self.infunc.side_effect = ["'\ud800'", EOFError('Finished')] + self.console.interact() + output = ''.join(''.join(call[1]) for call in self.stderr.method_calls) + output = output[output.index('(InteractiveConsole)'):] + output = output[output.index('\n') + 1:] + self.assertTrue(output.startswith('UnicodeEncodeError: '), output) + self.assertIs(self.sysmod.last_type, UnicodeEncodeError) + self.assertIs(type(self.sysmod.last_value), UnicodeEncodeError) + self.assertIsNone(self.sysmod.last_traceback) + self.assertIsNone(self.sysmod.last_value.__traceback__) + self.assertIs(self.sysmod.last_exc, self.sysmod.last_value) def test_sysexcepthook(self): - self.infunc.side_effect = ["raise ValueError('')", + self.infunc.side_effect = ["def f():", + " raise ValueError('BOOM!')", + "", + "f()", + EOFError('Finished')] + hook = mock.Mock() + self.sysmod.excepthook = hook + self.console.interact() + hook.assert_called() + hook.assert_called_with(self.sysmod.last_type, + self.sysmod.last_value, + self.sysmod.last_traceback) + self.assertIs(self.sysmod.last_type, ValueError) + self.assertIs(type(self.sysmod.last_value), ValueError) + self.assertIs(self.sysmod.last_traceback, self.sysmod.last_value.__traceback__) + self.assertIs(self.sysmod.last_exc, self.sysmod.last_value) + self.assertEqual(traceback.format_exception(self.sysmod.last_exc), [ + 'Traceback (most recent call last):\n', + ' File "", line 1, in \n', + ' File "", line 2, in f\n', + 'ValueError: BOOM!\n']) + + def test_sysexcepthook_syntax_error(self): + self.infunc.side_effect = ["def f():", + " x = ?", + "", EOFError('Finished')] hook = mock.Mock() self.sysmod.excepthook = hook self.console.interact() - self.assertTrue(hook.called) + hook.assert_called() + hook.assert_called_with(self.sysmod.last_type, + self.sysmod.last_value, + self.sysmod.last_traceback) + self.assertIs(self.sysmod.last_type, SyntaxError) + self.assertIs(type(self.sysmod.last_value), SyntaxError) + self.assertIsNone(self.sysmod.last_traceback) + self.assertIsNone(self.sysmod.last_value.__traceback__) + self.assertIs(self.sysmod.last_exc, self.sysmod.last_value) + self.assertEqual(traceback.format_exception(self.sysmod.last_exc), [ + ' File "", line 2\n', + ' x = ?\n', + ' ^\n', + 'SyntaxError: invalid syntax\n']) + + def test_sysexcepthook_indentation_error(self): + self.infunc.side_effect = [" 1", EOFError('Finished')] + hook = mock.Mock() + self.sysmod.excepthook = hook + self.console.interact() + hook.assert_called() + hook.assert_called_with(self.sysmod.last_type, + self.sysmod.last_value, + self.sysmod.last_traceback) + self.assertIs(self.sysmod.last_type, IndentationError) + self.assertIs(type(self.sysmod.last_value), IndentationError) + self.assertIsNone(self.sysmod.last_traceback) + self.assertIsNone(self.sysmod.last_value.__traceback__) + self.assertIs(self.sysmod.last_exc, self.sysmod.last_value) + self.assertEqual(traceback.format_exception(self.sysmod.last_exc), [ + ' File "", line 1\n', + ' 1\n', + 'IndentationError: unexpected indent\n']) + + def test_sysexcepthook_crashing_doesnt_close_repl(self): + self.infunc.side_effect = ["1/0", "a = 123", "print(a)", EOFError('Finished')] + self.sysmod.excepthook = 1 + self.console.interact() + self.assertEqual(['write', ('123', ), {}], self.stdout.method_calls[0]) + error = "".join(call.args[0] for call in self.stderr.method_calls if call[0] == 'write') + self.assertIn("Error in sys.excepthook:", error) + self.assertEqual(error.count("'int' object is not callable"), 1) + self.assertIn("Original exception was:", error) + self.assertIn("division by zero", error) + + def test_sysexcepthook_raising_BaseException(self): + self.infunc.side_effect = ["1/0", "a = 123", "print(a)", EOFError('Finished')] + s = "not so fast" + def raise_base(*args, **kwargs): + raise BaseException(s) + self.sysmod.excepthook = raise_base + self.console.interact() + self.assertEqual(['write', ('123', ), {}], self.stdout.method_calls[0]) + error = "".join(call.args[0] for call in self.stderr.method_calls if call[0] == 'write') + self.assertIn("Error in sys.excepthook:", error) + self.assertEqual(error.count("not so fast"), 1) + self.assertIn("Original exception was:", error) + self.assertIn("division by zero", error) + + def test_sysexcepthook_raising_SystemExit_gets_through(self): + self.infunc.side_effect = ["1/0"] + def raise_base(*args, **kwargs): + raise SystemExit + self.sysmod.excepthook = raise_base + with self.assertRaises(SystemExit): + self.console.interact() def test_banner(self): # with banner @@ -131,6 +263,11 @@ def test_cause_tb(self): ValueError """) self.assertIn(expected, output) + self.assertIs(self.sysmod.last_type, ValueError) + self.assertIs(type(self.sysmod.last_value), ValueError) + self.assertIs(self.sysmod.last_traceback, self.sysmod.last_value.__traceback__) + self.assertIsNotNone(self.sysmod.last_traceback) + self.assertIs(self.sysmod.last_exc, self.sysmod.last_value) def test_context_tb(self): self.infunc.side_effect = ["try: ham\nexcept: eggs\n", @@ -149,6 +286,11 @@ def test_context_tb(self): NameError: name 'eggs' is not defined """) self.assertIn(expected, output) + self.assertIs(self.sysmod.last_type, NameError) + self.assertIs(type(self.sysmod.last_value), NameError) + self.assertIs(self.sysmod.last_traceback, self.sysmod.last_value.__traceback__) + self.assertIsNotNone(self.sysmod.last_traceback) + self.assertIs(self.sysmod.last_exc, self.sysmod.last_value) if __name__ == "__main__": diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index 5dc5b1ac..f683f069 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -2,7 +2,6 @@ import contextlib import copy import io -import locale import pickle import sys import unittest @@ -1700,16 +1699,10 @@ def test_getwriter(self): self.assertRaises(TypeError, codecs.getwriter) self.assertRaises(LookupError, codecs.getwriter, "__spam__") + @support.run_with_locale('LC_CTYPE', 'tr_TR') def test_lookup_issue1813(self): # Issue #1813: under Turkish locales, lookup of some codecs failed # because 'I' is lowercased as "ı" (dotless i) - oldlocale = locale.setlocale(locale.LC_CTYPE) - self.addCleanup(locale.setlocale, locale.LC_CTYPE, oldlocale) - try: - locale.setlocale(locale.LC_CTYPE, 'tr_TR') - except locale.Error: - # Unsupported locale on this system - self.skipTest('test needs Turkish locale') c = codecs.lookup('ASCII') self.assertEqual(c.name, 'ascii') diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index 6ed7fe2b..85de2fa2 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -10,7 +10,7 @@ import textwrap import warnings from test import support -from test.support import (script_helper, requires_debug_ranges, +from test.support import (script_helper, requires_debug_ranges, run_code, requires_specialization, C_RECURSION_LIMIT) from test.support.os_helper import FakePath @@ -1065,7 +1065,7 @@ def return_genexp(): x in y) - genexp_lines = [0, 2, 0] + genexp_lines = [0, 4, 2, 0, 4] genexp_code = return_genexp.__code__.co_consts[1] code_lines = self.get_code_lines(genexp_code) @@ -1431,7 +1431,7 @@ def test_multiline_generator_expression(self): self.assertOpcodeSourcePositionIs(compiled_code, 'JUMP_BACKWARD', line=1, end_line=2, column=1, end_column=8, occurrence=1) self.assertOpcodeSourcePositionIs(compiled_code, 'RETURN_CONST', - line=1, end_line=6, column=0, end_column=32, occurrence=1) + line=4, end_line=4, column=7, end_column=14, occurrence=1) def test_multiline_async_generator_expression(self): snippet = textwrap.dedent("""\ @@ -1829,6 +1829,66 @@ def test_load_super_attr(self): code, "LOAD_GLOBAL", line=3, end_line=3, column=4, end_column=9 ) + def test_lambda_return_position(self): + snippets = [ + "f = lambda: x", + "f = lambda: 42", + "f = lambda: 1 + 2", + "f = lambda: a + b", + ] + for snippet in snippets: + with self.subTest(snippet=snippet): + lamb = run_code(snippet)["f"] + positions = lamb.__code__.co_positions() + # assert that all positions are within the lambda + for i, pos in enumerate(positions): + with self.subTest(i=i, pos=pos): + start_line, end_line, start_col, end_col = pos + if i == 0 and start_col == end_col == 0: + # ignore the RESUME in the beginning + continue + self.assertEqual(start_line, 1) + self.assertEqual(end_line, 1) + code_start = snippet.find(":") + 2 + code_end = len(snippet) + self.assertGreaterEqual(start_col, code_start) + self.assertLessEqual(end_col, code_end) + self.assertGreaterEqual(end_col, start_col) + self.assertLessEqual(end_col, code_end) + + def test_return_in_with_positions(self): + # See gh-98442 + def f(): + with xyz: + 1 + 2 + 3 + 4 + return R + + # All instructions should have locations on a single line + for instr in dis.get_instructions(f): + start_line, end_line, _, _ = instr.positions + self.assertEqual(start_line, end_line) + + # Expect three load None instructions for the no-exception __exit__ call, + # and one RETURN_VALUE. + # They should all have the locations of the context manager ('xyz'). + + load_none = [instr for instr in dis.get_instructions(f) if + instr.opname == 'LOAD_CONST' and instr.argval is None] + return_value = [instr for instr in dis.get_instructions(f) if + instr.opname == 'RETURN_VALUE'] + + self.assertEqual(len(load_none), 3) + self.assertEqual(len(return_value), 1) + for instr in load_none + return_value: + start_line, end_line, start_col, end_col = instr.positions + self.assertEqual(start_line, f.__code__.co_firstlineno + 1) + self.assertEqual(end_line, f.__code__.co_firstlineno + 1) + self.assertEqual(start_col, 17) + self.assertEqual(end_col, 20) + class TestExpressionStackSize(unittest.TestCase): # These tests check that the computed stack size for a code object diff --git a/Lib/test/test_compiler_codegen.py b/Lib/test/test_compiler_codegen.py index ea57df9c..a1794980 100644 --- a/Lib/test/test_compiler_codegen.py +++ b/Lib/test/test_compiler_codegen.py @@ -39,6 +39,7 @@ def test_for_loop(self): ('GET_ITER', None, 1), loop_lbl := self.Label(), ('FOR_ITER', exit_lbl := self.Label(), 1), + ('NOP', None, 1, 1), ('STORE_NAME', 1, 1), ('PUSH_NULL', None, 2), ('LOAD_NAME', 2, 2), diff --git a/Lib/test/test_complex.py b/Lib/test/test_complex.py index 3385955d..f12e1c8b 100644 --- a/Lib/test/test_complex.py +++ b/Lib/test/test_complex.py @@ -1,6 +1,7 @@ import unittest import sys from test import support +from test.support.testcase import ComplexesAreIdenticalMixin from test.test_grammar import (VALID_UNDERSCORE_LITERALS, INVALID_UNDERSCORE_LITERALS) @@ -41,7 +42,7 @@ def __init__(self, value): def __complex__(self): return self.value -class ComplexTest(unittest.TestCase): +class ComplexTest(ComplexesAreIdenticalMixin, unittest.TestCase): def assertAlmostEqual(self, a, b): if isinstance(a, complex): @@ -70,29 +71,6 @@ def assertCloseAbs(self, x, y, eps=1e-9): # check that relative difference < eps self.assertTrue(abs((x-y)/y) < eps) - def assertFloatsAreIdentical(self, x, y): - """assert that floats x and y are identical, in the sense that: - (1) both x and y are nans, or - (2) both x and y are infinities, with the same sign, or - (3) both x and y are zeros, with the same sign, or - (4) x and y are both finite and nonzero, and x == y - - """ - msg = 'floats {!r} and {!r} are not identical' - - if isnan(x) or isnan(y): - if isnan(x) and isnan(y): - return - elif x == y: - if x != 0.0: - return - # both zero; check that signs match - elif copysign(1.0, x) == copysign(1.0, y): - return - else: - msg += ': zeros have different signs' - self.fail(msg.format(x, y)) - def assertClose(self, x, y, eps=1e-9): """Return true iff complexes x and y "are close".""" self.assertCloseAbs(x.real, y.real, eps) @@ -322,6 +300,11 @@ def test_pow(self): except OverflowError: pass + # gh-113841: possible undefined division by 0 in _Py_c_pow() + x, y = 9j, 33j**3 + with self.assertRaises(OverflowError): + x**y + def test_pow_with_small_integer_exponents(self): # Check that small integer exponents are handled identically # regardless of their type. @@ -618,7 +601,7 @@ def test_underscores(self): def test_hash(self): for x in range(-30, 30): self.assertEqual(hash(x), hash(complex(x, 0))) - x /= 3.0 # now check against floating point + x /= 3.0 # now check against floating-point self.assertEqual(hash(x), hash(complex(x, 0.))) self.assertNotEqual(hash(2000005 - 1j), -1) @@ -728,8 +711,7 @@ def test_repr_roundtrip(self): for y in vals: z = complex(x, y) roundtrip = complex(repr(z)) - self.assertFloatsAreIdentical(z.real, roundtrip.real) - self.assertFloatsAreIdentical(z.imag, roundtrip.imag) + self.assertComplexesAreIdentical(z, roundtrip) # if we predefine some constants, then eval(repr(z)) should # also work, except that it might change the sign of zeros diff --git a/Lib/test/test_concurrent_futures/test_deadlock.py b/Lib/test/test_concurrent_futures/test_deadlock.py index 1db4cd00..e8cd8f67 100644 --- a/Lib/test/test_concurrent_futures/test_deadlock.py +++ b/Lib/test/test_concurrent_futures/test_deadlock.py @@ -145,7 +145,7 @@ def test_exit_at_task_unpickle(self): self._check_crash(BrokenProcessPool, id, ExitAtUnpickle()) def test_error_at_task_unpickle(self): - # gh-109832: Restore stderr overriden by _raise_error_ignore_stderr() + # gh-109832: Restore stderr overridden by _raise_error_ignore_stderr() self.addCleanup(setattr, sys, 'stderr', sys.stderr) # Check problem occurring while unpickling a task on workers @@ -183,7 +183,7 @@ def test_error_during_result_pickle_on_worker(self): self._check_crash(PicklingError, _return_instance, ErrorAtPickle) def test_error_during_result_unpickle_in_result_handler(self): - # gh-109832: Restore stderr overriden by _raise_error_ignore_stderr() + # gh-109832: Restore stderr overridden by _raise_error_ignore_stderr() self.addCleanup(setattr, sys, 'stderr', sys.stderr) # Check problem occurring while unpickling a task in diff --git a/Lib/test/test_concurrent_futures/test_thread_pool.py b/Lib/test/test_concurrent_futures/test_thread_pool.py index 812f989d..6e4a4b7c 100644 --- a/Lib/test/test_concurrent_futures/test_thread_pool.py +++ b/Lib/test/test_concurrent_futures/test_thread_pool.py @@ -64,6 +64,25 @@ def submit(pool): with futures.ProcessPoolExecutor(1, mp_context=mp.get_context('fork')) as workers: workers.submit(tuple) + @support.requires_fork() + @unittest.skipUnless(hasattr(os, 'register_at_fork'), 'need os.register_at_fork') + def test_process_fork_from_a_threadpool(self): + # bpo-43944: clear concurrent.futures.thread._threads_queues after fork, + # otherwise child process will try to join parent thread + def fork_process_and_return_exitcode(): + # Ignore the warning about fork with threads. + with self.assertWarnsRegex(DeprecationWarning, + r"use of fork\(\) may lead to deadlocks in the child"): + p = mp.get_context('fork').Process(target=lambda: 1) + p.start() + p.join() + return p.exitcode + + with futures.ThreadPoolExecutor(1) as pool: + process_exitcode = pool.submit(fork_process_and_return_exitcode).result() + + self.assertEqual(process_exitcode, 0) + def test_executor_map_current_future_cancel(self): stop_event = threading.Event() log = [] diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py index a50a4ed7..b03ce497 100644 --- a/Lib/test/test_contextlib.py +++ b/Lib/test/test_contextlib.py @@ -434,12 +434,10 @@ class FileContextTestCase(unittest.TestCase): def testWithOpen(self): tfn = tempfile.mktemp() try: - f = None with open(tfn, "w", encoding="utf-8") as f: self.assertFalse(f.closed) f.write("Booh\n") self.assertTrue(f.closed) - f = None with self.assertRaises(ZeroDivisionError): with open(tfn, "r", encoding="utf-8") as f: self.assertFalse(f.closed) diff --git a/Lib/test/test_cprofile.py b/Lib/test/test_cprofile.py index 27e8a767..3b7fd034 100644 --- a/Lib/test/test_cprofile.py +++ b/Lib/test/test_cprofile.py @@ -30,6 +30,59 @@ def test_bad_counter_during_dealloc(self): self.assertEqual(cm.unraisable.exc_type, TypeError) + def test_crash_with_not_enough_args(self): + # gh-126220 + import _lsprof + + for profile in [_lsprof.Profiler(), cProfile.Profile()]: + for method in [ + "_pystart_callback", + "_pyreturn_callback", + "_ccall_callback", + "_creturn_callback", + ]: + with self.subTest(profile=profile, method=method): + method_obj = getattr(profile, method) + with self.assertRaises(TypeError): + method_obj() # should not crash + + def test_evil_external_timer(self): + # gh-120289 + # Disabling profiler in external timer should not crash + import _lsprof + class EvilTimer(): + def __init__(self, disable_count): + self.count = 0 + self.disable_count = disable_count + + def __call__(self): + self.count += 1 + if self.count == self.disable_count: + profiler_with_evil_timer.disable() + return self.count + + # this will trigger external timer to disable profiler at + # call event - in initContext in _lsprof.c + with support.catch_unraisable_exception() as cm: + profiler_with_evil_timer = _lsprof.Profiler(EvilTimer(1)) + profiler_with_evil_timer.enable() + # Make a call to trigger timer + (lambda: None)() + profiler_with_evil_timer.disable() + profiler_with_evil_timer.clear() + self.assertEqual(cm.unraisable.exc_type, RuntimeError) + + # this will trigger external timer to disable profiler at + # return event - in Stop in _lsprof.c + with support.catch_unraisable_exception() as cm: + profiler_with_evil_timer = _lsprof.Profiler(EvilTimer(2)) + profiler_with_evil_timer.enable() + # Make a call to trigger timer + (lambda: None)() + profiler_with_evil_timer.disable() + profiler_with_evil_timer.clear() + self.assertEqual(cm.unraisable.exc_type, RuntimeError) + def test_profile_enable_disable(self): prof = self.profilerclass() # Make sure we clean ourselves up if the test fails for some reason. @@ -83,8 +136,8 @@ def test_throw(self): for func, (cc, nc, _, _, _) in pr.stats.items(): if func[2] == "": - self.assertEqual(cc, 1) - self.assertEqual(nc, 1) + self.assertEqual(cc, 2) + self.assertEqual(nc, 2) class TestCommandLine(unittest.TestCase): diff --git a/Lib/test/test_csv.py b/Lib/test/test_csv.py index adb89d0d..47ff707f 100644 --- a/Lib/test/test_csv.py +++ b/Lib/test/test_csv.py @@ -425,6 +425,8 @@ def test_read_quoting(self): quoting=csv.QUOTE_NONNUMERIC) self._read_test(['1,@,3,@,5'], [['1', ',3,', '5']], quotechar='@') self._read_test(['1,\0,3,\0,5'], [['1', ',3,', '5']], quotechar='\0') + self._read_test(['1\\.5,\\.5,.5'], [[1.5, 0.5, 0.5]], + quoting=csv.QUOTE_NONNUMERIC, escapechar='\\') def test_read_skipinitialspace(self): self._read_test(['no space, space, spaces,\ttab'], @@ -1069,6 +1071,12 @@ class mydialect(csv.Dialect): mydialect.quoting = None self.assertRaises(csv.Error, mydialect) + mydialect.quoting = 42 + with self.assertRaises(csv.Error) as cm: + mydialect() + self.assertEqual(str(cm.exception), + 'bad "quoting" value') + mydialect.doublequote = True mydialect.quoting = csv.QUOTE_ALL mydialect.quotechar = '"' diff --git a/Lib/test/test_ctypes/_support.py b/Lib/test/test_ctypes/_support.py new file mode 100644 index 00000000..e4c2b338 --- /dev/null +++ b/Lib/test/test_ctypes/_support.py @@ -0,0 +1,24 @@ +# Some classes and types are not export to _ctypes module directly. + +import ctypes +from _ctypes import Structure, Union, _Pointer, Array, _SimpleCData, CFuncPtr + + +_CData = Structure.__base__ +assert _CData.__name__ == "_CData" + +class _X(Structure): + _fields_ = [("x", ctypes.c_int)] +CField = type(_X.x) + +# metaclasses +PyCStructType = type(Structure) +UnionType = type(Union) +PyCPointerType = type(_Pointer) +PyCArrayType = type(Array) +PyCSimpleType = type(_SimpleCData) +PyCFuncPtrType = type(CFuncPtr) + +# type flags +Py_TPFLAGS_DISALLOW_INSTANTIATION = 1 << 7 +Py_TPFLAGS_IMMUTABLETYPE = 1 << 8 diff --git a/Lib/test/test_ctypes/test_arrays.py b/Lib/test/test_ctypes/test_arrays.py index 78aead26..4f5a66e3 100644 --- a/Lib/test/test_ctypes/test_arrays.py +++ b/Lib/test/test_ctypes/test_arrays.py @@ -212,7 +212,7 @@ def test_empty_element_struct(self): class EmptyStruct(Structure): _fields_ = [] - obj = (EmptyStruct * 2)() # bpo37188: Floating point exception + obj = (EmptyStruct * 2)() # bpo37188: Floating-point exception self.assertEqual(sizeof(obj), 0) def test_empty_element_array(self): @@ -220,7 +220,7 @@ class EmptyArray(Array): _type_ = c_int _length_ = 0 - obj = (EmptyArray * 2)() # bpo37188: Floating point exception + obj = (EmptyArray * 2)() # bpo37188: Floating-point exception self.assertEqual(sizeof(obj), 0) def test_bpo36504_signed_int_overflow(self): diff --git a/Lib/test/test_ctypes/test_c_simple_type_meta.py b/Lib/test/test_ctypes/test_c_simple_type_meta.py new file mode 100644 index 00000000..eb77d6d7 --- /dev/null +++ b/Lib/test/test_ctypes/test_c_simple_type_meta.py @@ -0,0 +1,152 @@ +import unittest +import ctypes +from ctypes import POINTER, c_void_p + +from ._support import PyCSimpleType + + +class PyCSimpleTypeAsMetaclassTest(unittest.TestCase): + def tearDown(self): + # to not leak references, we must clean _pointer_type_cache + ctypes._reset_cache() + + def test_creating_pointer_in_dunder_new_1(self): + # Test metaclass whose instances are C types; when the type is + # created it automatically creates a pointer type for itself. + # The pointer type is also an instance of the metaclass. + # Such an implementation is used in `IUnknown` of the `comtypes` + # project. See gh-124520. + + class ct_meta(type): + def __new__(cls, name, bases, namespace): + self = super().__new__(cls, name, bases, namespace) + + # Avoid recursion: don't set up a pointer to + # a pointer (to a pointer...) + if bases == (c_void_p,): + # When creating PtrBase itself, the name + # is not yet available + return self + if issubclass(self, PtrBase): + return self + + if bases == (object,): + ptr_bases = (self, PtrBase) + else: + ptr_bases = (self, POINTER(bases[0])) + p = p_meta(f"POINTER({self.__name__})", ptr_bases, {}) + ctypes._pointer_type_cache[self] = p + return self + + class p_meta(PyCSimpleType, ct_meta): + pass + + class PtrBase(c_void_p, metaclass=p_meta): + pass + + class CtBase(object, metaclass=ct_meta): + pass + + class Sub(CtBase): + pass + + class Sub2(Sub): + pass + + self.assertIsInstance(POINTER(Sub2), p_meta) + self.assertTrue(issubclass(POINTER(Sub2), Sub2)) + self.assertTrue(issubclass(POINTER(Sub2), POINTER(Sub))) + self.assertTrue(issubclass(POINTER(Sub), POINTER(CtBase))) + + def test_creating_pointer_in_dunder_new_2(self): + # A simpler variant of the above, used in `CoClass` of the `comtypes` + # project. + + class ct_meta(type): + def __new__(cls, name, bases, namespace): + self = super().__new__(cls, name, bases, namespace) + if isinstance(self, p_meta): + return self + p = p_meta(f"POINTER({self.__name__})", (self, c_void_p), {}) + ctypes._pointer_type_cache[self] = p + return self + + class p_meta(PyCSimpleType, ct_meta): + pass + + class Core(object): + pass + + class CtBase(Core, metaclass=ct_meta): + pass + + class Sub(CtBase): + pass + + self.assertIsInstance(POINTER(Sub), p_meta) + self.assertTrue(issubclass(POINTER(Sub), Sub)) + + def test_creating_pointer_in_dunder_init_1(self): + class ct_meta(type): + def __init__(self, name, bases, namespace): + super().__init__(name, bases, namespace) + + # Avoid recursion. + # (See test_creating_pointer_in_dunder_new_1) + if bases == (c_void_p,): + return + if issubclass(self, PtrBase): + return + if bases == (object,): + ptr_bases = (self, PtrBase) + else: + ptr_bases = (self, POINTER(bases[0])) + p = p_meta(f"POINTER({self.__name__})", ptr_bases, {}) + ctypes._pointer_type_cache[self] = p + + class p_meta(PyCSimpleType, ct_meta): + pass + + class PtrBase(c_void_p, metaclass=p_meta): + pass + + class CtBase(object, metaclass=ct_meta): + pass + + class Sub(CtBase): + pass + + class Sub2(Sub): + pass + + self.assertIsInstance(POINTER(Sub2), p_meta) + self.assertTrue(issubclass(POINTER(Sub2), Sub2)) + self.assertTrue(issubclass(POINTER(Sub2), POINTER(Sub))) + self.assertTrue(issubclass(POINTER(Sub), POINTER(CtBase))) + + def test_creating_pointer_in_dunder_init_2(self): + class ct_meta(type): + def __init__(self, name, bases, namespace): + super().__init__(name, bases, namespace) + + # Avoid recursion. + # (See test_creating_pointer_in_dunder_new_2) + if isinstance(self, p_meta): + return + p = p_meta(f"POINTER({self.__name__})", (self, c_void_p), {}) + ctypes._pointer_type_cache[self] = p + + class p_meta(PyCSimpleType, ct_meta): + pass + + class Core(object): + pass + + class CtBase(Core, metaclass=ct_meta): + pass + + class Sub(CtBase): + pass + + self.assertIsInstance(POINTER(Sub), p_meta) + self.assertTrue(issubclass(POINTER(Sub), Sub)) diff --git a/Lib/test/test_ctypes/test_win32_com_foreign_func.py b/Lib/test/test_ctypes/test_win32_com_foreign_func.py new file mode 100644 index 00000000..8d217fc1 --- /dev/null +++ b/Lib/test/test_ctypes/test_win32_com_foreign_func.py @@ -0,0 +1,286 @@ +import ctypes +import gc +import sys +import unittest +from ctypes import POINTER, byref, c_void_p +from ctypes.wintypes import BYTE, DWORD, WORD + +if sys.platform != "win32": + raise unittest.SkipTest("Windows-specific test") + + +from _ctypes import COMError, CopyComPointer +from ctypes import HRESULT + + +COINIT_APARTMENTTHREADED = 0x2 +CLSCTX_SERVER = 5 +S_OK = 0 +OUT = 2 +TRUE = 1 +E_NOINTERFACE = -2147467262 + + +class GUID(ctypes.Structure): + # https://learn.microsoft.com/en-us/windows/win32/api/guiddef/ns-guiddef-guid + _fields_ = [ + ("Data1", DWORD), + ("Data2", WORD), + ("Data3", WORD), + ("Data4", BYTE * 8), + ] + + +def create_proto_com_method(name, index, restype, *argtypes): + proto = ctypes.WINFUNCTYPE(restype, *argtypes) + + def make_method(*args): + foreign_func = proto(index, name, *args) + + def call(self, *args, **kwargs): + return foreign_func(self, *args, **kwargs) + + return call + + return make_method + + +def create_guid(name): + guid = GUID() + # https://learn.microsoft.com/en-us/windows/win32/api/combaseapi/nf-combaseapi-clsidfromstring + ole32.CLSIDFromString(name, byref(guid)) + return guid + + +def is_equal_guid(guid1, guid2): + # https://learn.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-isequalguid + return ole32.IsEqualGUID(byref(guid1), byref(guid2)) + + +ole32 = ctypes.oledll.ole32 + +IID_IUnknown = create_guid("{00000000-0000-0000-C000-000000000046}") +IID_IStream = create_guid("{0000000C-0000-0000-C000-000000000046}") +IID_IPersist = create_guid("{0000010C-0000-0000-C000-000000000046}") +CLSID_ShellLink = create_guid("{00021401-0000-0000-C000-000000000046}") + +# https://learn.microsoft.com/en-us/windows/win32/api/unknwn/nf-unknwn-iunknown-queryinterface(refiid_void) +proto_query_interface = create_proto_com_method( + "QueryInterface", 0, HRESULT, POINTER(GUID), POINTER(c_void_p) +) +# https://learn.microsoft.com/en-us/windows/win32/api/unknwn/nf-unknwn-iunknown-addref +proto_add_ref = create_proto_com_method("AddRef", 1, ctypes.c_long) +# https://learn.microsoft.com/en-us/windows/win32/api/unknwn/nf-unknwn-iunknown-release +proto_release = create_proto_com_method("Release", 2, ctypes.c_long) +# https://learn.microsoft.com/en-us/windows/win32/api/objidl/nf-objidl-ipersist-getclassid +proto_get_class_id = create_proto_com_method( + "GetClassID", 3, HRESULT, POINTER(GUID) +) + + +def create_shelllink_persist(typ): + ppst = typ() + # https://learn.microsoft.com/en-us/windows/win32/api/combaseapi/nf-combaseapi-cocreateinstance + ole32.CoCreateInstance( + byref(CLSID_ShellLink), + None, + CLSCTX_SERVER, + byref(IID_IPersist), + byref(ppst), + ) + return ppst + + +class ForeignFunctionsThatWillCallComMethodsTests(unittest.TestCase): + def setUp(self): + # https://learn.microsoft.com/en-us/windows/win32/api/combaseapi/nf-combaseapi-coinitializeex + ole32.CoInitializeEx(None, COINIT_APARTMENTTHREADED) + + def tearDown(self): + # https://learn.microsoft.com/en-us/windows/win32/api/combaseapi/nf-combaseapi-couninitialize + ole32.CoUninitialize() + gc.collect() + + def test_without_paramflags_and_iid(self): + class IUnknown(c_void_p): + QueryInterface = proto_query_interface() + AddRef = proto_add_ref() + Release = proto_release() + + class IPersist(IUnknown): + GetClassID = proto_get_class_id() + + ppst = create_shelllink_persist(IPersist) + + clsid = GUID() + hr_getclsid = ppst.GetClassID(byref(clsid)) + self.assertEqual(S_OK, hr_getclsid) + self.assertEqual(TRUE, is_equal_guid(CLSID_ShellLink, clsid)) + + self.assertEqual(2, ppst.AddRef()) + self.assertEqual(3, ppst.AddRef()) + + punk = IUnknown() + hr_qi = ppst.QueryInterface(IID_IUnknown, punk) + self.assertEqual(S_OK, hr_qi) + self.assertEqual(3, punk.Release()) + + with self.assertRaises(OSError) as e: + punk.QueryInterface(IID_IStream, IUnknown()) + self.assertEqual(E_NOINTERFACE, e.exception.winerror) + + self.assertEqual(2, ppst.Release()) + self.assertEqual(1, ppst.Release()) + self.assertEqual(0, ppst.Release()) + + def test_with_paramflags_and_without_iid(self): + class IUnknown(c_void_p): + QueryInterface = proto_query_interface(None) + AddRef = proto_add_ref() + Release = proto_release() + + class IPersist(IUnknown): + GetClassID = proto_get_class_id(((OUT, "pClassID"),)) + + ppst = create_shelllink_persist(IPersist) + + clsid = ppst.GetClassID() + self.assertEqual(TRUE, is_equal_guid(CLSID_ShellLink, clsid)) + + punk = IUnknown() + hr_qi = ppst.QueryInterface(IID_IUnknown, punk) + self.assertEqual(S_OK, hr_qi) + self.assertEqual(1, punk.Release()) + + with self.assertRaises(OSError) as e: + ppst.QueryInterface(IID_IStream, IUnknown()) + self.assertEqual(E_NOINTERFACE, e.exception.winerror) + + self.assertEqual(0, ppst.Release()) + + def test_with_paramflags_and_iid(self): + class IUnknown(c_void_p): + QueryInterface = proto_query_interface(None, IID_IUnknown) + AddRef = proto_add_ref() + Release = proto_release() + + class IPersist(IUnknown): + GetClassID = proto_get_class_id(((OUT, "pClassID"),), IID_IPersist) + + ppst = create_shelllink_persist(IPersist) + + clsid = ppst.GetClassID() + self.assertEqual(TRUE, is_equal_guid(CLSID_ShellLink, clsid)) + + punk = IUnknown() + hr_qi = ppst.QueryInterface(IID_IUnknown, punk) + self.assertEqual(S_OK, hr_qi) + self.assertEqual(1, punk.Release()) + + with self.assertRaises(COMError) as e: + ppst.QueryInterface(IID_IStream, IUnknown()) + self.assertEqual(E_NOINTERFACE, e.exception.hresult) + + self.assertEqual(0, ppst.Release()) + + +class CopyComPointerTests(unittest.TestCase): + def setUp(self): + ole32.CoInitializeEx(None, COINIT_APARTMENTTHREADED) + + class IUnknown(c_void_p): + QueryInterface = proto_query_interface(None, IID_IUnknown) + AddRef = proto_add_ref() + Release = proto_release() + + class IPersist(IUnknown): + GetClassID = proto_get_class_id(((OUT, "pClassID"),), IID_IPersist) + + self.IUnknown = IUnknown + self.IPersist = IPersist + + def tearDown(self): + ole32.CoUninitialize() + gc.collect() + + def test_both_are_null(self): + src = self.IPersist() + dst = self.IPersist() + + hr = CopyComPointer(src, byref(dst)) + + self.assertEqual(S_OK, hr) + + self.assertIsNone(src.value) + self.assertIsNone(dst.value) + + def test_src_is_nonnull_and_dest_is_null(self): + # The reference count of the COM pointer created by `CoCreateInstance` + # is initially 1. + src = create_shelllink_persist(self.IPersist) + dst = self.IPersist() + + # `CopyComPointer` calls `AddRef` explicitly in the C implementation. + # The refcount of `src` is incremented from 1 to 2 here. + hr = CopyComPointer(src, byref(dst)) + + self.assertEqual(S_OK, hr) + self.assertEqual(src.value, dst.value) + + # This indicates that the refcount was 2 before the `Release` call. + self.assertEqual(1, src.Release()) + + clsid = dst.GetClassID() + self.assertEqual(TRUE, is_equal_guid(CLSID_ShellLink, clsid)) + + self.assertEqual(0, dst.Release()) + + def test_src_is_null_and_dest_is_nonnull(self): + src = self.IPersist() + dst_orig = create_shelllink_persist(self.IPersist) + dst = self.IPersist() + CopyComPointer(dst_orig, byref(dst)) + self.assertEqual(1, dst_orig.Release()) + + clsid = dst.GetClassID() + self.assertEqual(TRUE, is_equal_guid(CLSID_ShellLink, clsid)) + + # This does NOT affects the refcount of `dst_orig`. + hr = CopyComPointer(src, byref(dst)) + + self.assertEqual(S_OK, hr) + self.assertIsNone(dst.value) + + with self.assertRaises(ValueError): + dst.GetClassID() # NULL COM pointer access + + # This indicates that the refcount was 1 before the `Release` call. + self.assertEqual(0, dst_orig.Release()) + + def test_both_are_nonnull(self): + src = create_shelllink_persist(self.IPersist) + dst_orig = create_shelllink_persist(self.IPersist) + dst = self.IPersist() + CopyComPointer(dst_orig, byref(dst)) + self.assertEqual(1, dst_orig.Release()) + + self.assertEqual(dst.value, dst_orig.value) + self.assertNotEqual(src.value, dst.value) + + hr = CopyComPointer(src, byref(dst)) + + self.assertEqual(S_OK, hr) + self.assertEqual(src.value, dst.value) + self.assertNotEqual(dst.value, dst_orig.value) + + self.assertEqual(1, src.Release()) + + clsid = dst.GetClassID() + self.assertEqual(TRUE, is_equal_guid(CLSID_ShellLink, clsid)) + + self.assertEqual(0, dst.Release()) + self.assertEqual(0, dst_orig.Release()) + + +if __name__ == '__main__': + unittest.main() diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py index 83d10dd8..cc3aa561 100644 --- a/Lib/test/test_curses.py +++ b/Lib/test/test_curses.py @@ -1081,6 +1081,14 @@ def test_resize_term(self): self.assertEqual(curses.LINES, lines) self.assertEqual(curses.COLS, cols) + with self.assertRaises(OverflowError): + curses.resize_term(35000, 1) + with self.assertRaises(OverflowError): + curses.resize_term(1, 35000) + # GH-120378: Overflow failure in resize_term() causes refresh to fail + tmp = curses.initscr() + tmp.erase() + @requires_curses_func('resizeterm') def test_resizeterm(self): curses.update_lines_cols() @@ -1095,6 +1103,14 @@ def test_resizeterm(self): self.assertEqual(curses.LINES, lines) self.assertEqual(curses.COLS, cols) + with self.assertRaises(OverflowError): + curses.resizeterm(35000, 1) + with self.assertRaises(OverflowError): + curses.resizeterm(1, 35000) + # GH-120378: Overflow failure in resizeterm() causes refresh to fail + tmp = curses.initscr() + tmp.erase() + def test_ungetch(self): curses.ungetch(b'A') self.assertEqual(self.stdscr.getkey(), 'A') diff --git a/Lib/test/test_dataclasses/__init__.py b/Lib/test/test_dataclasses/__init__.py index e15b3457..8421cf97 100644 --- a/Lib/test/test_dataclasses/__init__.py +++ b/Lib/test/test_dataclasses/__init__.py @@ -17,6 +17,7 @@ from typing import ClassVar, Any, List, Union, Tuple, Dict, Generic, TypeVar, Optional, Protocol, DefaultDict from typing import get_type_hints from collections import deque, OrderedDict, namedtuple, defaultdict +from copy import deepcopy from functools import total_ordering import typing # Needed for the string "typing.ClassVar[int]" to work as an annotation. @@ -3071,6 +3072,48 @@ class C: with self.assertRaisesRegex(TypeError, 'unhashable type'): hash(C({})) + def test_frozen_deepcopy_without_slots(self): + # see: https://github.com/python/cpython/issues/89683 + @dataclass(frozen=True, slots=False) + class C: + s: str + + c = C('hello') + self.assertEqual(deepcopy(c), c) + + def test_frozen_deepcopy_with_slots(self): + # see: https://github.com/python/cpython/issues/89683 + with self.subTest('generated __slots__'): + @dataclass(frozen=True, slots=True) + class C: + s: str + + c = C('hello') + self.assertEqual(deepcopy(c), c) + + with self.subTest('user-defined __slots__ and no __{get,set}state__'): + @dataclass(frozen=True, slots=False) + class C: + __slots__ = ('s',) + s: str + + # with user-defined slots, __getstate__ and __setstate__ are not + # automatically added, hence the error + err = r"^cannot\ assign\ to\ field\ 's'$" + self.assertRaisesRegex(FrozenInstanceError, err, deepcopy, C('')) + + with self.subTest('user-defined __slots__ and __{get,set}state__'): + @dataclass(frozen=True, slots=False) + class C: + __slots__ = ('s',) + __getstate__ = dataclasses._dataclass_getstate + __setstate__ = dataclasses._dataclass_setstate + + s: str + + c = C('hello') + self.assertEqual(deepcopy(c), c) + class TestSlots(unittest.TestCase): def test_simple(self): @@ -3560,6 +3603,57 @@ class A(WithDictSlot): ... self.assertEqual(A().__dict__, {}) A() + @support.cpython_only + def test_dataclass_slot_dict_ctype(self): + # https://github.com/python/cpython/issues/123935 + from test.support import import_helper + # Skips test if `_testcapi` is not present: + _testcapi = import_helper.import_module('_testcapi') + + @dataclass(slots=True) + class HasDictOffset(_testcapi.HeapCTypeWithDict): + __dict__: dict = {} + self.assertNotEqual(_testcapi.HeapCTypeWithDict.__dictoffset__, 0) + self.assertEqual(HasDictOffset.__slots__, ()) + + @dataclass(slots=True) + class DoesNotHaveDictOffset(_testcapi.HeapCTypeWithWeakref): + __dict__: dict = {} + self.assertEqual(_testcapi.HeapCTypeWithWeakref.__dictoffset__, 0) + self.assertEqual(DoesNotHaveDictOffset.__slots__, ('__dict__',)) + + @support.cpython_only + def test_slots_with_wrong_init_subclass(self): + # TODO: This test is for a kinda-buggy behavior. + # Ideally, it should be fixed and `__init_subclass__` + # should be fully supported in the future versions. + # See https://github.com/python/cpython/issues/91126 + class WrongSuper: + def __init_subclass__(cls, arg): + pass + + with self.assertRaisesRegex( + TypeError, + "missing 1 required positional argument: 'arg'", + ): + @dataclass(slots=True) + class WithWrongSuper(WrongSuper, arg=1): + pass + + class CorrectSuper: + args = [] + def __init_subclass__(cls, arg="default"): + cls.args.append(arg) + + @dataclass(slots=True) + class WithCorrectSuper(CorrectSuper): + pass + + # __init_subclass__ is called twice: once for `WithCorrectSuper` + # and once for `WithCorrectSuper__slots__` new class + # that we create internally. + self.assertEqual(CorrectSuper.args, ["default", "default"]) + class TestDescriptors(unittest.TestCase): def test_set_name(self): diff --git a/Lib/test/test_datetime.py b/Lib/test/test_datetime.py index 3859733a..005187f1 100644 --- a/Lib/test/test_datetime.py +++ b/Lib/test/test_datetime.py @@ -1,5 +1,6 @@ import unittest import sys +import functools from test.support.import_helper import import_fresh_module @@ -39,21 +40,26 @@ def load_tests(loader, tests, pattern): for cls in test_classes: cls.__name__ += suffix cls.__qualname__ += suffix - @classmethod - def setUpClass(cls_, module=module): - cls_._save_sys_modules = sys.modules.copy() - sys.modules[TESTS] = module - sys.modules['datetime'] = module.datetime_module - if hasattr(module, '_pydatetime'): - sys.modules['_pydatetime'] = module._pydatetime - sys.modules['_strptime'] = module._strptime - @classmethod - def tearDownClass(cls_): - sys.modules.clear() - sys.modules.update(cls_._save_sys_modules) - cls.setUpClass = setUpClass - cls.tearDownClass = tearDownClass - tests.addTests(loader.loadTestsFromTestCase(cls)) + + @functools.wraps(cls, updated=()) + class Wrapper(cls): + @classmethod + def setUpClass(cls_, module=module): + cls_._save_sys_modules = sys.modules.copy() + sys.modules[TESTS] = module + sys.modules['datetime'] = module.datetime_module + if hasattr(module, '_pydatetime'): + sys.modules['_pydatetime'] = module._pydatetime + sys.modules['_strptime'] = module._strptime + super().setUpClass() + + @classmethod + def tearDownClass(cls_): + super().tearDownClass() + sys.modules.clear() + sys.modules.update(cls_._save_sys_modules) + + tests.addTests(loader.loadTestsFromTestCase(Wrapper)) return tests diff --git a/Lib/test/test_decimal.py b/Lib/test/test_decimal.py index 36d4157c..2ec12439 100644 --- a/Lib/test/test_decimal.py +++ b/Lib/test/test_decimal.py @@ -1242,7 +1242,7 @@ def get_fmt(x, override=None, fmt='n'): self.assertEqual(get_fmt(Decimal('-1.5'), dotsep_wide, '020n'), '-0\u00b4000\u00b4000\u00b4000\u00b4001\u00bf5') - @run_with_locale('LC_ALL', 'ps_AF') + @run_with_locale('LC_ALL', 'ps_AF', '') def test_wide_char_separator_decimal_point(self): # locale with wide char separator and decimal point Decimal = self.decimal.Decimal @@ -2060,7 +2060,9 @@ def test_tonum_methods(self): #to quantize, which is already extensively tested test_triples = [ ('123.456', -4, '0E+4'), + ('-123.456', -4, '-0E+4'), ('123.456', -3, '0E+3'), + ('-123.456', -3, '-0E+3'), ('123.456', -2, '1E+2'), ('123.456', -1, '1.2E+2'), ('123.456', 0, '123'), diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py index fbc6ce82..dfe17d47 100644 --- a/Lib/test/test_dict.py +++ b/Lib/test/test_dict.py @@ -1476,6 +1476,24 @@ def test_dict_items_result_gc_reversed(self): gc.collect() self.assertTrue(gc.is_tracked(next(it))) + def test_store_evilattr(self): + class EvilAttr: + def __init__(self, d): + self.d = d + + def __del__(self): + if 'attr' in self.d: + del self.d['attr'] + gc.collect() + + class Obj: + pass + + obj = Obj() + obj.__dict__ = {} + for _ in range(10): + obj.attr = EvilAttr(obj.__dict__) + def test_str_nonstr(self): # cpython uses a different lookup function if the dict only contains # `str` keys. Make sure the unoptimized path is used when a non-`str` diff --git a/Lib/test/test_dictcomps.py b/Lib/test/test_dictcomps.py index 472e3dfa..26b56dac 100644 --- a/Lib/test/test_dictcomps.py +++ b/Lib/test/test_dictcomps.py @@ -1,5 +1,8 @@ +import traceback import unittest +from test.support import BrokenIter + # For scope testing. g = "Global variable" @@ -127,6 +130,41 @@ def test_star_expression(self): self.assertEqual({i: i*i for i in [*range(4)]}, expected) self.assertEqual({i: i*i for i in (*range(4),)}, expected) + def test_exception_locations(self): + # The location of an exception raised from __init__ or + # __next__ should should be the iterator expression + def init_raises(): + try: + {x:x for x in BrokenIter(init_raises=True)} + except Exception as e: + return e + + def next_raises(): + try: + {x:x for x in BrokenIter(next_raises=True)} + except Exception as e: + return e + + def iter_raises(): + try: + {x:x for x in BrokenIter(iter_raises=True)} + except Exception as e: + return e + + for func, expected in [(init_raises, "BrokenIter(init_raises=True)"), + (next_raises, "BrokenIter(next_raises=True)"), + (iter_raises, "BrokenIter(iter_raises=True)"), + ]: + with self.subTest(func): + exc = func() + f = traceback.extract_tb(exc.__traceback__)[0] + indent = 16 + co = func.__code__ + self.assertEqual(f.lineno, co.co_firstlineno + 2) + self.assertEqual(f.end_lineno, co.co_firstlineno + 2) + self.assertEqual(f.line[f.colno - indent : f.end_colno - indent], + expected) + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_email/test_email.py b/Lib/test/test_email/test_email.py index fc8d8797..ef8aa0d5 100644 --- a/Lib/test/test_email/test_email.py +++ b/Lib/test/test_email/test_email.py @@ -16,6 +16,7 @@ import email import email.policy +import email.utils from email.charset import Charset from email.generator import Generator, DecodedGenerator, BytesGenerator @@ -3352,15 +3353,137 @@ def test_getaddresses_comma_in_name(self): ], ) + def test_parsing_errors(self): + """Test for parsing errors from CVE-2023-27043 and CVE-2019-16056""" + alice = 'alice@example.org' + bob = 'bob@example.com' + empty = ('', '') + + # Test utils.getaddresses() and utils.parseaddr() on malformed email + # addresses: default behavior (strict=True) rejects malformed address, + # and strict=False which tolerates malformed address. + for invalid_separator, expected_non_strict in ( + ('(', [(f'<{bob}>', alice)]), + (')', [('', alice), empty, ('', bob)]), + ('<', [('', alice), empty, ('', bob), empty]), + ('>', [('', alice), empty, ('', bob)]), + ('[', [('', f'{alice}[<{bob}>]')]), + (']', [('', alice), empty, ('', bob)]), + ('@', [empty, empty, ('', bob)]), + (';', [('', alice), empty, ('', bob)]), + (':', [('', alice), ('', bob)]), + ('.', [('', alice + '.'), ('', bob)]), + ('"', [('', alice), ('', f'<{bob}>')]), + ): + address = f'{alice}{invalid_separator}<{bob}>' + with self.subTest(address=address): + self.assertEqual(utils.getaddresses([address]), + [empty]) + self.assertEqual(utils.getaddresses([address], strict=False), + expected_non_strict) + + self.assertEqual(utils.parseaddr([address]), + empty) + self.assertEqual(utils.parseaddr([address], strict=False), + ('', address)) + + # Comma (',') is treated differently depending on strict parameter. + # Comma without quotes. + address = f'{alice},<{bob}>' + self.assertEqual(utils.getaddresses([address]), + [('', alice), ('', bob)]) + self.assertEqual(utils.getaddresses([address], strict=False), + [('', alice), ('', bob)]) + self.assertEqual(utils.parseaddr([address]), + empty) + self.assertEqual(utils.parseaddr([address], strict=False), + ('', address)) + + # Real name between quotes containing comma. + address = '"Alice, alice@example.org" ' + expected_strict = ('Alice, alice@example.org', 'bob@example.com') + self.assertEqual(utils.getaddresses([address]), [expected_strict]) + self.assertEqual(utils.getaddresses([address], strict=False), [expected_strict]) + self.assertEqual(utils.parseaddr([address]), expected_strict) + self.assertEqual(utils.parseaddr([address], strict=False), + ('', address)) + + # Valid parenthesis in comments. + address = 'alice@example.org (Alice)' + expected_strict = ('Alice', 'alice@example.org') + self.assertEqual(utils.getaddresses([address]), [expected_strict]) + self.assertEqual(utils.getaddresses([address], strict=False), [expected_strict]) + self.assertEqual(utils.parseaddr([address]), expected_strict) + self.assertEqual(utils.parseaddr([address], strict=False), + ('', address)) + + # Invalid parenthesis in comments. + address = 'alice@example.org )Alice(' + self.assertEqual(utils.getaddresses([address]), [empty]) + self.assertEqual(utils.getaddresses([address], strict=False), + [('', 'alice@example.org'), ('', ''), ('', 'Alice')]) + self.assertEqual(utils.parseaddr([address]), empty) + self.assertEqual(utils.parseaddr([address], strict=False), + ('', address)) + + # Two addresses with quotes separated by comma. + address = '"Jane Doe" , "John Doe" ' + self.assertEqual(utils.getaddresses([address]), + [('Jane Doe', 'jane@example.net'), + ('John Doe', 'john@example.net')]) + self.assertEqual(utils.getaddresses([address], strict=False), + [('Jane Doe', 'jane@example.net'), + ('John Doe', 'john@example.net')]) + self.assertEqual(utils.parseaddr([address]), empty) + self.assertEqual(utils.parseaddr([address], strict=False), + ('', address)) + + # Test email.utils.supports_strict_parsing attribute + self.assertEqual(email.utils.supports_strict_parsing, True) + def test_getaddresses_nasty(self): - eq = self.assertEqual - eq(utils.getaddresses(['foo: ;']), [('', '')]) - eq(utils.getaddresses( - ['[]*-- =~$']), - [('', ''), ('', ''), ('', '*--')]) - eq(utils.getaddresses( - ['foo: ;', '"Jason R. Mastaler" ']), - [('', ''), ('Jason R. Mastaler', 'jason@dom.ain')]) + for addresses, expected in ( + (['"Sürname, Firstname" '], + [('Sürname, Firstname', 'to@example.com')]), + + (['foo: ;'], + [('', '')]), + + (['foo: ;', '"Jason R. Mastaler" '], + [('', ''), ('Jason R. Mastaler', 'jason@dom.ain')]), + + ([r'Pete(A nice \) chap) '], + [('Pete (A nice ) chap his account his host)', 'pete@silly.test')]), + + (['(Empty list)(start)Undisclosed recipients :(nobody(I know))'], + [('', '')]), + + (['Mary <@machine.tld:mary@example.net>, , jdoe@test . example'], + [('Mary', 'mary@example.net'), ('', ''), ('', 'jdoe@test.example')]), + + (['John Doe '], + [('John Doe (comment)', 'jdoe@machine.example')]), + + (['"Mary Smith: Personal Account" '], + [('Mary Smith: Personal Account', 'smith@home.example')]), + + (['Undisclosed recipients:;'], + [('', '')]), + + ([r', "Giant; \"Big\" Box" '], + [('', 'boss@nil.test'), ('Giant; "Big" Box', 'bob@example.net')]), + ): + with self.subTest(addresses=addresses): + self.assertEqual(utils.getaddresses(addresses), + expected) + self.assertEqual(utils.getaddresses(addresses, strict=False), + expected) + + addresses = ['[]*-- =~$'] + self.assertEqual(utils.getaddresses(addresses), + [('', '')]) + self.assertEqual(utils.getaddresses(addresses, strict=False), + [('', ''), ('', ''), ('', '*--')]) def test_getaddresses_embedded_comment(self): """Test proper handling of a nested comment""" @@ -3551,6 +3674,54 @@ def test_mime_classes_policy_argument(self): m = cls(*constructor, policy=email.policy.default) self.assertIs(m.policy, email.policy.default) + def test_iter_escaped_chars(self): + self.assertEqual(list(utils._iter_escaped_chars(r'a\\b\"c\\"d')), + [(0, 'a'), + (2, '\\\\'), + (3, 'b'), + (5, '\\"'), + (6, 'c'), + (8, '\\\\'), + (9, '"'), + (10, 'd')]) + self.assertEqual(list(utils._iter_escaped_chars('a\\')), + [(0, 'a'), (1, '\\')]) + + def test_strip_quoted_realnames(self): + def check(addr, expected): + self.assertEqual(utils._strip_quoted_realnames(addr), expected) + + check('"Jane Doe" , "John Doe" ', + ' , ') + check(r'"Jane \"Doe\"." ', + ' ') + + # special cases + check(r'before"name"after', 'beforeafter') + check(r'before"name"', 'before') + check(r'b"name"', 'b') # single char + check(r'"name"after', 'after') + check(r'"name"a', 'a') # single char + check(r'"name"', '') + + # no change + for addr in ( + 'Jane Doe , John Doe ', + 'lone " quote', + ): + self.assertEqual(utils._strip_quoted_realnames(addr), addr) + + + def test_check_parenthesis(self): + addr = 'alice@example.net' + self.assertTrue(utils._check_parenthesis(f'{addr} (Alice)')) + self.assertFalse(utils._check_parenthesis(f'{addr} )Alice(')) + self.assertFalse(utils._check_parenthesis(f'{addr} (Alice))')) + self.assertFalse(utils._check_parenthesis(f'{addr} ((Alice)')) + + # Ignore real name between quotes + self.assertTrue(utils._check_parenthesis(f'")Alice((" {addr}')) + # Test the iterator/generators class TestIterators(TestEmailBase): diff --git a/Lib/test/test_email/test_generator.py b/Lib/test/test_email/test_generator.py index bfff1051..c75a842c 100644 --- a/Lib/test/test_email/test_generator.py +++ b/Lib/test/test_email/test_generator.py @@ -6,6 +6,7 @@ from email.generator import Generator, BytesGenerator from email.headerregistry import Address from email import policy +import email.errors from test.test_email import TestEmailBase, parameterize @@ -249,6 +250,44 @@ def test_rfc2231_wrapping_switches_to_default_len_if_too_narrow(self): g.flatten(msg) self.assertEqual(s.getvalue(), self.typ(expected)) + def test_keep_encoded_newlines(self): + msg = self.msgmaker(self.typ(textwrap.dedent("""\ + To: nobody + Subject: Bad subject=?UTF-8?Q?=0A?=Bcc: injection@example.com + + None + """))) + expected = textwrap.dedent("""\ + To: nobody + Subject: Bad subject=?UTF-8?Q?=0A?=Bcc: injection@example.com + + None + """) + s = self.ioclass() + g = self.genclass(s, policy=self.policy.clone(max_line_length=80)) + g.flatten(msg) + self.assertEqual(s.getvalue(), self.typ(expected)) + + def test_keep_long_encoded_newlines(self): + msg = self.msgmaker(self.typ(textwrap.dedent("""\ + To: nobody + Subject: Bad subject=?UTF-8?Q?=0A?=Bcc: injection@example.com + + None + """))) + expected = textwrap.dedent("""\ + To: nobody + Subject: Bad subject + =?utf-8?q?=0A?=Bcc: + injection@example.com + + None + """) + s = self.ioclass() + g = self.genclass(s, policy=self.policy.clone(max_line_length=30)) + g.flatten(msg) + self.assertEqual(s.getvalue(), self.typ(expected)) + class TestGenerator(TestGeneratorBase, TestEmailBase): @@ -273,6 +312,29 @@ def test_flatten_unicode_linesep(self): g.flatten(msg) self.assertEqual(s.getvalue(), self.typ(expected)) + def test_verify_generated_headers(self): + """gh-121650: by default the generator prevents header injection""" + class LiteralHeader(str): + name = 'Header' + def fold(self, **kwargs): + return self + + for text in ( + 'Value\r\nBad Injection\r\n', + 'NoNewLine' + ): + with self.subTest(text=text): + message = message_from_string( + "Header: Value\r\n\r\nBody", + policy=self.policy, + ) + + del message['Header'] + message['Header'] = LiteralHeader(text) + + with self.assertRaises(email.errors.HeaderWriteError): + message.as_string() + class TestBytesGenerator(TestGeneratorBase, TestEmailBase): @@ -294,6 +356,19 @@ def test_defaults_handle_spaces_between_encoded_words_when_folded(self): g.flatten(msg) self.assertEqual(s.getvalue(), expected) + def test_defaults_handle_spaces_when_encoded_words_is_folded_in_middle(self): + source = ('A very long long long long long long long long long long long long ' + 'long long long long long long long long long long long súmmäry') + expected = ('Subject: A very long long long long long long long long long long long long\n' + ' long long long long long long long long long long long =?utf-8?q?s=C3=BAmm?=\n' + ' =?utf-8?q?=C3=A4ry?=\n\n').encode('ascii') + msg = EmailMessage() + msg['Subject'] = source + s = io.BytesIO() + g = BytesGenerator(s) + g.flatten(msg) + self.assertEqual(s.getvalue(), expected) + def test_defaults_handle_spaces_at_start_of_subject(self): source = " Уведомление" expected = b"Subject: =?utf-8?b?0KPQstC10LTQvtC80LvQtdC90LjQtQ==?=\n\n" diff --git a/Lib/test/test_email/test_message.py b/Lib/test/test_email/test_message.py index 034f7626..96979db2 100644 --- a/Lib/test/test_email/test_message.py +++ b/Lib/test/test_email/test_message.py @@ -1,6 +1,6 @@ -import unittest import textwrap -from email import policy, message_from_string +import unittest +from email import message_from_bytes, message_from_string, policy from email.message import EmailMessage, MIMEPart from test.test_email import TestEmailBase, parameterize @@ -958,6 +958,52 @@ def test_folding_with_utf8_encoding_8(self): b'123456789-123456789\n 123456789 Hello ' b'=?utf-8?q?W=C3=B6rld!?= 123456789 123456789\n\n') + def test_folding_with_short_nospace_1(self): + # bpo-36520 + # + # Fold a line that contains a long whitespace after + # the fold point. + + m = EmailMessage(policy.default) + m['Message-ID'] = '123456789' * 3 + parsed_msg = message_from_bytes(m.as_bytes(), policy=policy.default) + self.assertEqual(parsed_msg['Message-ID'], m['Message-ID']) + + def test_folding_with_long_nospace_default_policy_1(self): + # Fixed: https://github.com/python/cpython/issues/124452 + # + # When the value is too long, it should be converted back + # to its original form without any modifications. + + m = EmailMessage(policy.default) + message = '123456789' * 10 + m['Message-ID'] = message + self.assertEqual(m.as_bytes(), + f'Message-ID:\n {message}\n\n'.encode()) + parsed_msg = message_from_bytes(m.as_bytes(), policy=policy.default) + self.assertEqual(parsed_msg['Message-ID'], m['Message-ID']) + + def test_folding_with_long_nospace_compat32_policy_1(self): + m = EmailMessage(policy.compat32) + message = '123456789' * 10 + m['Message-ID'] = message + parsed_msg = message_from_bytes(m.as_bytes(), policy=policy.default) + self.assertEqual(parsed_msg['Message-ID'], m['Message-ID']) + + def test_folding_with_long_nospace_smtp_policy_1(self): + m = EmailMessage(policy.SMTP) + message = '123456789' * 10 + m['Message-ID'] = message + parsed_msg = message_from_bytes(m.as_bytes(), policy=policy.default) + self.assertEqual(parsed_msg['Message-ID'], m['Message-ID']) + + def test_folding_with_long_nospace_http_policy_1(self): + m = EmailMessage(policy.HTTP) + message = '123456789' * 10 + m['Message-ID'] = message + parsed_msg = message_from_bytes(m.as_bytes(), policy=policy.default) + self.assertEqual(parsed_msg['Message-ID'], m['Message-ID']) + def test_get_body_malformed(self): """test for bpo-42892""" msg = textwrap.dedent("""\ diff --git a/Lib/test/test_email/test_policy.py b/Lib/test/test_email/test_policy.py index c6b9c80e..baa35fd6 100644 --- a/Lib/test/test_email/test_policy.py +++ b/Lib/test/test_email/test_policy.py @@ -26,6 +26,7 @@ class PolicyAPITests(unittest.TestCase): 'raise_on_defect': False, 'mangle_from_': True, 'message_factory': None, + 'verify_generated_headers': True, } # These default values are the ones set on email.policy.default. # If any of these defaults change, the docs must be updated. @@ -294,6 +295,31 @@ def test_short_maxlen_error(self): with self.assertRaises(email.errors.HeaderParseError): policy.fold("Subject", subject) + def test_verify_generated_headers(self): + """Turning protection off allows header injection""" + policy = email.policy.default.clone(verify_generated_headers=False) + for text in ( + 'Header: Value\r\nBad: Injection\r\n', + 'Header: NoNewLine' + ): + with self.subTest(text=text): + message = email.message_from_string( + "Header: Value\r\n\r\nBody", + policy=policy, + ) + class LiteralHeader(str): + name = 'Header' + def fold(self, **kwargs): + return self + + del message['Header'] + message['Header'] = LiteralHeader(text) + + self.assertEqual( + message.as_string(), + f"{text}\nBody", + ) + # XXX: Need subclassing tests. # For adding subclassed objects, make sure the usual rules apply (subclass # wins), but that the order still works (right overrides left). diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 24617ab2..13713cf3 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -5,6 +5,7 @@ from collections import namedtuple import contextlib +import io import json import os import os.path @@ -389,6 +390,70 @@ def test_ucnhash_capi_reset(self): out, err = self.run_embedded_interpreter("test_repeated_init_exec", code) self.assertEqual(out, '9\n' * INIT_LOOPS) + def test_static_types_inherited_slots(self): + script = textwrap.dedent(""" + import test.support + + results = {} + def add(cls, slot, own): + value = getattr(cls, slot) + try: + subresults = results[cls.__name__] + except KeyError: + subresults = results[cls.__name__] = {} + subresults[slot] = [repr(value), own] + + for cls in test.support.iter_builtin_types(): + for slot, own in test.support.iter_slot_wrappers(cls): + add(cls, slot, own) + """) + + ns = {} + exec(script, ns, ns) + all_expected = ns['results'] + del ns + + script += textwrap.dedent(""" + import json + import sys + text = json.dumps(results) + print(text, file=sys.stderr) + """) + out, err = self.run_embedded_interpreter( + "test_repeated_init_exec", script, script) + results = err.split('--- Loop #')[1:] + results = [res.rpartition(' ---\n')[-1] for res in results] + + self.maxDiff = None + for i, text in enumerate(results, start=1): + result = json.loads(text) + for classname, expected in all_expected.items(): + with self.subTest(loop=i, cls=classname): + slots = result.pop(classname) + self.assertEqual(slots, expected) + self.assertEqual(result, {}) + self.assertEqual(out, '') + + def test_getargs_reset_static_parser(self): + # Test _PyArg_Parser initializations via _PyArg_UnpackKeywords() + # https://github.com/python/cpython/issues/122334 + code = textwrap.dedent(""" + try: + import _ssl + except ModuleNotFoundError: + _ssl = None + if _ssl is not None: + _ssl.txt2obj(txt='1.3') + print('1') + + import _queue + _queue.SimpleQueue().put_nowait(item=None) + print('2') + """) + out, err = self.run_embedded_interpreter("test_repeated_init_exec", code) + self.assertEqual(out, '1\n2\n' * INIT_LOOPS) + + class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): maxDiff = 4096 UTF8_MODE_ERRORS = ('surrogatepass' if MS_WINDOWS else 'surrogateescape') diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index ccba0f91..2e50ae0f 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -1455,6 +1455,27 @@ class SpamEnum(Enum): spam = nonmember(SpamEnumIsInner) self.assertTrue(SpamEnum.spam is SpamEnumIsInner) + def test_using_members_as_nonmember(self): + class Example(Flag): + A = 1 + B = 2 + ALL = nonmember(A | B) + + self.assertEqual(Example.A.value, 1) + self.assertEqual(Example.B.value, 2) + self.assertEqual(Example.ALL, 3) + self.assertIs(type(Example.ALL), int) + + class Example(Flag): + A = auto() + B = auto() + ALL = nonmember(A | B) + + self.assertEqual(Example.A.value, 1) + self.assertEqual(Example.B.value, 2) + self.assertEqual(Example.ALL, 3) + self.assertIs(type(Example.ALL), int) + def test_nested_classes_in_enum_with_member(self): """Support locally-defined nested classes.""" class Outer(Enum): @@ -1831,6 +1852,25 @@ def test_wrong_inheritance_order(self): class Wrong(Enum, str): NotHere = 'error before this point' + def test_raise_custom_error_on_creation(self): + class InvalidRgbColorError(ValueError): + def __init__(self, r, g, b): + self.r = r + self.g = g + self.b = b + super().__init__(f'({r}, {g}, {b}) is not a valid RGB color') + + with self.assertRaises(InvalidRgbColorError): + class RgbColor(Enum): + RED = (255, 0, 0) + GREEN = (0, 255, 0) + BLUE = (0, 0, 255) + INVALID = (256, 0, 0) + + def __init__(self, r, g, b): + if not all(0 <= val <= 255 for val in (r, g, b)): + raise InvalidRgbColorError(r, g, b) + def test_intenum_transitivity(self): class number(IntEnum): one = 1 @@ -5136,7 +5176,7 @@ def test_convert_value_lookup_priority(self): filter=lambda x: x.startswith('CONVERT_TEST_')) # We don't want the reverse lookup value to vary when there are # multiple possible names for a given value. It should always - # report the first lexigraphical name in that case. + # report the first lexicographical name in that case. self.assertEqual(test_type(5).name, 'CONVERT_TEST_NAME_A') def test_convert_int(self): diff --git a/Lib/test/test_eof.py b/Lib/test/test_eof.py index be4fd73b..e3773834 100644 --- a/Lib/test/test_eof.py +++ b/Lib/test/test_eof.py @@ -1,6 +1,7 @@ """test script for a few new invalid token catches""" import sys +from codecs import BOM_UTF8 from test import support from test.support import os_helper from test.support import script_helper @@ -11,67 +12,158 @@ class EOFTestCase(unittest.TestCase): def test_EOF_single_quote(self): expect = "unterminated string literal (detected at line 1) (, line 1)" for quote in ("'", "\""): - try: + with self.assertRaises(SyntaxError) as cm: eval(f"""{quote}this is a test\ """) - except SyntaxError as msg: - self.assertEqual(str(msg), expect) - self.assertEqual(msg.offset, 1) - else: - raise support.TestFailed + self.assertEqual(str(cm.exception), expect) + self.assertEqual(cm.exception.offset, 1) def test_EOFS(self): - expect = ("unterminated triple-quoted string literal (detected at line 1) (, line 1)") - try: - eval("""'''this is a test""") - except SyntaxError as msg: - self.assertEqual(str(msg), expect) - self.assertEqual(msg.offset, 1) - else: - raise support.TestFailed + expect = ("unterminated triple-quoted string literal (detected at line 3) (, line 1)") + with self.assertRaises(SyntaxError) as cm: + eval("""ä = '''thîs is \na \ntest""") + self.assertEqual(str(cm.exception), expect) + self.assertEqual(cm.exception.text, "ä = '''thîs is ") + self.assertEqual(cm.exception.offset, 5) + + with self.assertRaises(SyntaxError) as cm: + eval("""ä = '''thîs is \na \ntest""".encode()) + self.assertEqual(str(cm.exception), expect) + self.assertEqual(cm.exception.text, "ä = '''thîs is ") + self.assertEqual(cm.exception.offset, 5) + + with self.assertRaises(SyntaxError) as cm: + eval(BOM_UTF8 + """ä = '''thîs is \na \ntest""".encode()) + self.assertEqual(str(cm.exception), expect) + self.assertEqual(cm.exception.text, "ä = '''thîs is ") + self.assertEqual(cm.exception.offset, 5) + + with self.assertRaises(SyntaxError) as cm: + eval("""# coding: latin1\nä = '''thîs is \na \ntest""".encode('latin1')) + self.assertEqual(str(cm.exception), "unterminated triple-quoted string literal (detected at line 4) (, line 2)") + self.assertEqual(cm.exception.text, "ä = '''thîs is ") + self.assertEqual(cm.exception.offset, 5) def test_EOFS_with_file(self): expect = ("(, line 1)") with os_helper.temp_dir() as temp_dir: - file_name = script_helper.make_script(temp_dir, 'foo', """'''this is \na \ntest""") - rc, out, err = script_helper.assert_python_failure(file_name) - self.assertIn(b'unterminated triple-quoted string literal (detected at line 3)', err) + file_name = script_helper.make_script(temp_dir, 'foo', + """ä = '''thîs is \na \ntest""") + rc, out, err = script_helper.assert_python_failure('-X', 'utf8', file_name) + err = err.decode().splitlines() + self.assertEqual(err[-3:], [ + " ä = '''thîs is ", + ' ^', + 'SyntaxError: unterminated triple-quoted string literal (detected at line 3)']) + + file_name = script_helper.make_script(temp_dir, 'foo', + """ä = '''thîs is \na \ntest""".encode()) + rc, out, err = script_helper.assert_python_failure('-X', 'utf8', file_name) + err = err.decode().splitlines() + self.assertEqual(err[-3:], [ + " ä = '''thîs is ", + ' ^', + 'SyntaxError: unterminated triple-quoted string literal (detected at line 3)']) + + file_name = script_helper.make_script(temp_dir, 'foo', + BOM_UTF8 + """ä = '''thîs is \na \ntest""".encode()) + rc, out, err = script_helper.assert_python_failure('-X', 'utf8', file_name) + err = err.decode().splitlines() + self.assertEqual(err[-3:], [ + " ä = '''thîs is ", + ' ^', + 'SyntaxError: unterminated triple-quoted string literal (detected at line 3)']) + + file_name = script_helper.make_script(temp_dir, 'foo', + """# coding: latin1\nä = '''thîs is \na \ntest""".encode('latin1')) + rc, out, err = script_helper.assert_python_failure('-X', 'utf8', file_name) + err = err.decode().splitlines() + self.assertEqual(err[-3:], [ + " ä = '''thîs is ", + ' ^', + 'SyntaxError: unterminated triple-quoted string literal (detected at line 4)']) @warnings_helper.ignore_warnings(category=SyntaxWarning) def test_eof_with_line_continuation(self): expect = "unexpected EOF while parsing (, line 1)" - try: + with self.assertRaises(SyntaxError) as cm: compile('"\\Xhh" \\', '', 'exec') - except SyntaxError as msg: - self.assertEqual(str(msg), expect) - else: - raise support.TestFailed + self.assertEqual(str(cm.exception), expect) def test_line_continuation_EOF(self): """A continuation at the end of input must be an error; bpo2180.""" expect = 'unexpected EOF while parsing (, line 1)' - with self.assertRaises(SyntaxError) as excinfo: - exec('x = 5\\') - self.assertEqual(str(excinfo.exception), expect) - with self.assertRaises(SyntaxError) as excinfo: + with self.assertRaises(SyntaxError) as cm: + exec('ä = 5\\') + self.assertEqual(str(cm.exception), expect) + self.assertEqual(cm.exception.text, 'ä = 5\\\n') + self.assertEqual(cm.exception.offset, 7) + + with self.assertRaises(SyntaxError) as cm: + exec('ä = 5\\'.encode()) + self.assertEqual(str(cm.exception), expect) + self.assertEqual(cm.exception.text, 'ä = 5\\\n') + self.assertEqual(cm.exception.offset, 7) + + with self.assertRaises(SyntaxError) as cm: + exec('# coding:latin1\nä = 5\\'.encode('latin1')) + self.assertEqual(str(cm.exception), + 'unexpected EOF while parsing (, line 2)') + self.assertEqual(cm.exception.text, 'ä = 5\\\n') + self.assertEqual(cm.exception.offset, 7) + + with self.assertRaises(SyntaxError) as cm: + exec(BOM_UTF8 + 'ä = 5\\'.encode()) + self.assertEqual(str(cm.exception), expect) + self.assertEqual(cm.exception.text, 'ä = 5\\\n') + self.assertEqual(cm.exception.offset, 7) + + with self.assertRaises(SyntaxError) as cm: exec('\\') - self.assertEqual(str(excinfo.exception), expect) + self.assertEqual(str(cm.exception), expect) @unittest.skipIf(not sys.executable, "sys.executable required") def test_line_continuation_EOF_from_file_bpo2180(self): """Ensure tok_nextc() does not add too many ending newlines.""" with os_helper.temp_dir() as temp_dir: file_name = script_helper.make_script(temp_dir, 'foo', '\\') - rc, out, err = script_helper.assert_python_failure(file_name) - self.assertIn(b'unexpected EOF while parsing', err) - self.assertIn(b'line 1', err) - self.assertIn(b'\\', err) - - file_name = script_helper.make_script(temp_dir, 'foo', 'y = 6\\') - rc, out, err = script_helper.assert_python_failure(file_name) - self.assertIn(b'unexpected EOF while parsing', err) - self.assertIn(b'line 1', err) - self.assertIn(b'y = 6\\', err) + rc, out, err = script_helper.assert_python_failure('-X', 'utf8', file_name) + err = err.decode().splitlines() + self.assertEqual(err[-2:], [ + ' \\', + 'SyntaxError: unexpected EOF while parsing']) + self.assertEqual(err[-3][-8:], ', line 1', err) + + file_name = script_helper.make_script(temp_dir, 'foo', 'ä = 6\\') + rc, out, err = script_helper.assert_python_failure('-X', 'utf8', file_name) + err = err.decode().splitlines() + self.assertEqual(err[-3:], [ + ' ä = 6\\', + ' ^', + 'SyntaxError: unexpected EOF while parsing']) + self.assertEqual(err[-4][-8:], ', line 1', err) + + file_name = script_helper.make_script(temp_dir, 'foo', + '# coding:latin1\n' + 'ä = 7\\'.encode('latin1')) + rc, out, err = script_helper.assert_python_failure('-X', 'utf8', file_name) + err = err.decode().splitlines() + self.assertEqual(err[-3:], [ + ' ä = 7\\', + ' ^', + 'SyntaxError: unexpected EOF while parsing']) + self.assertEqual(err[-4][-8:], ', line 2', err) + + file_name = script_helper.make_script(temp_dir, 'foo', + BOM_UTF8 + 'ä = 8\\'.encode()) + rc, out, err = script_helper.assert_python_failure('-X', 'utf8', file_name) + err = err.decode().splitlines() + self.assertEqual(err[-3:], [ + ' ä = 8\\', + ' ^', + 'SyntaxError: unexpected EOF while parsing']) + self.assertEqual(err[-4][-8:], ', line 1', err) + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index b738ec6a..72c86eec 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -7,6 +7,8 @@ import pickle import weakref import errno +from codecs import BOM_UTF8 +from itertools import product from textwrap import dedent from test.support import (captured_stderr, check_impl_detail, @@ -314,8 +316,8 @@ def baz(): check('def f():\n global x\n nonlocal x', 2, 3) # Errors thrown by future.c - check('from __future__ import doesnt_exist', 1, 1) - check('from __future__ import braces', 1, 1) + check('from __future__ import doesnt_exist', 1, 24) + check('from __future__ import braces', 1, 24) check('x=1\nfrom __future__ import division', 2, 1) check('foo(1=2)', 1, 5) check('def f():\n x, y: int', 2, 3) @@ -1332,6 +1334,29 @@ def test_unicode_errors_no_object(self): for klass in klasses: self.assertEqual(str(klass.__new__(klass)), "") + def test_unicode_error_str_does_not_crash(self): + # Test that str(UnicodeError(...)) does not crash. + # See https://github.com/python/cpython/issues/123378. + + for start, end, objlen in product( + range(-5, 5), + range(-5, 5), + range(7), + ): + obj = 'a' * objlen + with self.subTest('encode', objlen=objlen, start=start, end=end): + exc = UnicodeEncodeError('utf-8', obj, start, end, '') + self.assertIsInstance(str(exc), str) + + with self.subTest('translate', objlen=objlen, start=start, end=end): + exc = UnicodeTranslateError(obj, start, end, '') + self.assertIsInstance(str(exc), str) + + encoded = obj.encode() + with self.subTest('decode', objlen=objlen, start=start, end=end): + exc = UnicodeDecodeError('utf-8', encoded, start, end, '') + self.assertIsInstance(str(exc), str) + @no_tracing def test_badisinstance(self): # Bug #2542: if issubclass(e, MyException) raises an exception, @@ -1820,6 +1845,8 @@ def f(): except self.failureException: with support.captured_stderr() as err: sys.__excepthook__(*sys.exc_info()) + else: + self.fail("assertRaisesRegex should have failed.") self.assertIn("aab", err.getvalue()) @@ -1969,7 +1996,115 @@ def test_copy_pickle(self): self.assertEqual(exc.name, orig.name) self.assertEqual(exc.path, orig.path) + +def run_script(source): + if isinstance(source, str): + with open(TESTFN, 'w', encoding='utf-8') as testfile: + testfile.write(dedent(source)) + else: + with open(TESTFN, 'wb') as testfile: + testfile.write(source) + _rc, _out, err = script_helper.assert_python_failure('-Wd', '-X', 'utf8', TESTFN) + return err.decode('utf-8').splitlines() + +class AssertionErrorTests(unittest.TestCase): + def tearDown(self): + unlink(TESTFN) + + def test_assertion_error_location(self): + cases = [ + ('assert None', + [ + ' assert None', + ' ^^^^', + 'AssertionError', + ], + ), + ('assert 0', + [ + ' assert 0', + ' ^', + 'AssertionError', + ], + ), + ('assert 1 > 2', + [ + ' assert 1 > 2', + ' ^^^^^', + 'AssertionError', + ], + ), + ('assert 1 > 2 and 3 > 2', + [ + ' assert 1 > 2 and 3 > 2', + ' ^^^^^^^^^^^^^^^', + 'AssertionError', + ], + ), + ('assert 1 > 2, "messäge"', + [ + ' assert 1 > 2, "messäge"', + ' ^^^^^', + 'AssertionError: messäge', + ], + ), + ('assert 1 > 2, "messäge"'.encode(), + [ + ' assert 1 > 2, "messäge"', + ' ^^^^^', + 'AssertionError: messäge', + ], + ), + ('# coding: latin1\nassert 1 > 2, "messäge"'.encode('latin1'), + [ + ' assert 1 > 2, "messäge"', + ' ^^^^^', + 'AssertionError: messäge', + ], + ), + + # Multiline: + (""" + assert ( + 1 > 2) + """, + [ + ' 1 > 2)', + ' ^^^^^', + 'AssertionError', + ], + ), + (""" + assert ( + 1 > 2), "Message" + """, + [ + ' 1 > 2), "Message"', + ' ^^^^^', + 'AssertionError: Message', + ], + ), + (""" + assert ( + 1 > 2), \\ + "Message" + """, + [ + ' 1 > 2), \\', + ' ^^^^^', + 'AssertionError: Message', + ], + ), + ] + for source, expected in cases: + with self.subTest(source=source): + result = run_script(source) + self.assertEqual(result[-3:], expected) + + class SyntaxErrorTests(unittest.TestCase): + maxDiff = None + def test_range_of_offsets(self): cases = [ # Basic range from 2->7 @@ -2061,45 +2196,103 @@ def test_range_of_offsets(self): the_exception = exc def test_encodings(self): + self.addCleanup(unlink, TESTFN) source = ( '# -*- coding: cp437 -*-\n' '"┬ó┬ó┬ó┬ó┬ó┬ó" + f(4, x for x in range(1))\n' ) - try: - with open(TESTFN, 'w', encoding='cp437') as testfile: - testfile.write(source) - rc, out, err = script_helper.assert_python_failure('-Wd', '-X', 'utf8', TESTFN) - err = err.decode('utf-8').splitlines() - - self.assertEqual(err[-3], ' "┬ó┬ó┬ó┬ó┬ó┬ó" + f(4, x for x in range(1))') - self.assertEqual(err[-2], ' ^^^^^^^^^^^^^^^^^^^') - finally: - unlink(TESTFN) + err = run_script(source.encode('cp437')) + self.assertEqual(err[-3], ' "┬ó┬ó┬ó┬ó┬ó┬ó" + f(4, x for x in range(1))') + self.assertEqual(err[-2], ' ^^^^^^^^^^^^^^^^^^^') # Check backwards tokenizer errors source = '# -*- coding: ascii -*-\n\n(\n' - try: - with open(TESTFN, 'w', encoding='ascii') as testfile: - testfile.write(source) - rc, out, err = script_helper.assert_python_failure('-Wd', '-X', 'utf8', TESTFN) - err = err.decode('utf-8').splitlines() - - self.assertEqual(err[-3], ' (') - self.assertEqual(err[-2], ' ^') - finally: - unlink(TESTFN) + err = run_script(source) + self.assertEqual(err[-3], ' (') + self.assertEqual(err[-2], ' ^') def test_non_utf8(self): # Check non utf-8 characters - try: - with open(TESTFN, 'bw') as testfile: - testfile.write(b"\x89") - rc, out, err = script_helper.assert_python_failure('-Wd', '-X', 'utf8', TESTFN) - err = err.decode('utf-8').splitlines() + self.addCleanup(unlink, TESTFN) + err = run_script(b"\x89") + self.assertIn("SyntaxError: Non-UTF-8 code starting with '\\x89' in file", err[-1]) - self.assertIn("SyntaxError: Non-UTF-8 code starting with '\\x89' in file", err[-1]) - finally: - unlink(TESTFN) + def test_string_source(self): + def try_compile(source): + with self.assertRaises(SyntaxError) as cm: + compile(source, '', 'exec') + return cm.exception + + exc = try_compile('return "ä"') + self.assertEqual(str(exc), "'return' outside function (, line 1)") + self.assertIsNone(exc.text) + self.assertEqual(exc.offset, 1) + self.assertEqual(exc.end_offset, 12) + + exc = try_compile('return "ä"'.encode()) + self.assertEqual(str(exc), "'return' outside function (, line 1)") + self.assertIsNone(exc.text) + self.assertEqual(exc.offset, 1) + self.assertEqual(exc.end_offset, 12) + + exc = try_compile(BOM_UTF8 + 'return "ä"'.encode()) + self.assertEqual(str(exc), "'return' outside function (, line 1)") + self.assertIsNone(exc.text) + self.assertEqual(exc.offset, 1) + self.assertEqual(exc.end_offset, 12) + + exc = try_compile('# coding: latin1\nreturn "ä"'.encode('latin1')) + self.assertEqual(str(exc), "'return' outside function (, line 2)") + self.assertIsNone(exc.text) + self.assertEqual(exc.offset, 1) + self.assertEqual(exc.end_offset, 12) + + exc = try_compile('return "ä" #' + 'ä'*1000) + self.assertEqual(str(exc), "'return' outside function (, line 1)") + self.assertIsNone(exc.text) + self.assertEqual(exc.offset, 1) + self.assertEqual(exc.end_offset, 12) + + exc = try_compile('return "ä" # ' + 'ä'*1000) + self.assertEqual(str(exc), "'return' outside function (, line 1)") + self.assertIsNone(exc.text) + self.assertEqual(exc.offset, 1) + self.assertEqual(exc.end_offset, 12) + + def test_file_source(self): + self.addCleanup(unlink, TESTFN) + err = run_script('return "ä"') + # NOTE: Offset is calculated incorrectly for non-ASCII strings. + self.assertEqual(err[-3::2], [ + ' return "ä"', + "SyntaxError: 'return' outside function"]) + + err = run_script('return "ä"'.encode()) + self.assertEqual(err[-3::2], [ + ' return "ä"', + "SyntaxError: 'return' outside function"]) + + err = run_script(BOM_UTF8 + 'return "ä"'.encode()) + self.assertEqual(err[-3::2], [ + ' return "ä"', + "SyntaxError: 'return' outside function"]) + + err = run_script('# coding: latin1\nreturn "ä"'.encode('latin1')) + self.assertEqual(err[-3::2], [ + ' return "ä"', + "SyntaxError: 'return' outside function"]) + + err = run_script('return "ä" #' + 'ä'*1000) + self.assertEqual(err[-2:], [ + ' ^^^^^^^^^^^', + "SyntaxError: 'return' outside function"]) + self.assertEqual(err[-3][:100], ' return "ä" #' + 'ä'*84) + + err = run_script('return "ä" # ' + 'ä'*1000) + self.assertEqual(err[-2:], [ + ' ^^^^^^^^^^^', + "SyntaxError: 'return' outside function"]) + self.assertEqual(err[-3][:100], ' return "ä" # ' + 'ä'*83) def test_attributes_new_constructor(self): args = ("bad.py", 1, 2, "abcdefg", 1, 100) diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py index d0473500..dc817d93 100644 --- a/Lib/test/test_faulthandler.py +++ b/Lib/test/test_faulthandler.py @@ -236,7 +236,7 @@ def test_sigfpe(self): faulthandler._sigfpe() """, 3, - 'Floating point exception') + 'Floating-point exception') @unittest.skipIf(_testcapi is None, 'need _testcapi') @unittest.skipUnless(hasattr(signal, 'SIGBUS'), 'need signal.SIGBUS') diff --git a/Lib/test/test_filecmp.py b/Lib/test/test_filecmp.py index 9b5ac12b..41d6059f 100644 --- a/Lib/test/test_filecmp.py +++ b/Lib/test/test_filecmp.py @@ -111,6 +111,39 @@ def test_cmpfiles(self): (['file'], ['file2'], []), "Comparing mismatched directories fails") + def test_cmpfiles_invalid_names(self): + # See https://github.com/python/cpython/issues/122400. + for file, desc in [ + ('\x00', 'NUL bytes filename'), + (__file__ + '\x00', 'filename with embedded NUL bytes'), + ("\uD834\uDD1E.py", 'surrogate codes (MUSICAL SYMBOL G CLEF)'), + ('a' * 1_000_000, 'very long filename'), + ]: + for other_dir in [self.dir, self.dir_same, self.dir_diff]: + with self.subTest(f'cmpfiles: {desc}', other_dir=other_dir): + res = filecmp.cmpfiles(self.dir, other_dir, [file]) + self.assertTupleEqual(res, ([], [], [file])) + + def test_dircmp_invalid_names(self): + for bad_dir, desc in [ + ('\x00', 'NUL bytes dirname'), + (f'Top{os.sep}Mid\x00', 'dirname with embedded NUL bytes'), + ("\uD834\uDD1E", 'surrogate codes (MUSICAL SYMBOL G CLEF)'), + ('a' * 1_000_000, 'very long dirname'), + ]: + d1 = filecmp.dircmp(self.dir, bad_dir) + d2 = filecmp.dircmp(bad_dir, self.dir) + for target in [ + # attributes where os.listdir() raises OSError or ValueError + 'left_list', 'right_list', + 'left_only', 'right_only', 'common', + ]: + with self.subTest(f'dircmp(ok, bad): {desc}', target=target): + with self.assertRaises((OSError, ValueError)): + getattr(d1, target) + with self.subTest(f'dircmp(bad, ok): {desc}', target=target): + with self.assertRaises((OSError, ValueError)): + getattr(d2, target) def _assert_lists(self, actual, expected): """Assert that two lists are equal, up to ordering.""" diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py index 32aaf3a8..0c1adabd 100644 --- a/Lib/test/test_float.py +++ b/Lib/test/test_float.py @@ -8,6 +8,7 @@ import unittest from test import support +from test.support.testcase import FloatsAreIdenticalMixin from test.test_grammar import (VALID_UNDERSCORE_LITERALS, INVALID_UNDERSCORE_LITERALS) from math import isinf, isnan, copysign, ldexp @@ -152,7 +153,7 @@ def check(s): # non-UTF-8 byte string check(b'123\xa0') - @support.run_with_locale('LC_NUMERIC', 'fr_FR', 'de_DE') + @support.run_with_locale('LC_NUMERIC', 'fr_FR', 'de_DE', '') def test_float_with_comma(self): # set locale to something that doesn't use '.' for the decimal point # float must not accept the locale specific decimal point but @@ -828,7 +829,7 @@ def test_short_repr(self): self.assertEqual(repr(float(negs)), str(float(negs))) @support.requires_IEEE_754 -class RoundTestCase(unittest.TestCase): +class RoundTestCase(unittest.TestCase, FloatsAreIdenticalMixin): def test_inf_nan(self): self.assertRaises(OverflowError, round, INF) @@ -858,10 +859,10 @@ def test_large_n(self): def test_small_n(self): for n in [-308, -309, -400, 1-2**31, -2**31, -2**31-1, -2**100]: - self.assertEqual(round(123.456, n), 0.0) - self.assertEqual(round(-123.456, n), -0.0) - self.assertEqual(round(1e300, n), 0.0) - self.assertEqual(round(1e-320, n), 0.0) + self.assertFloatsAreIdentical(round(123.456, n), 0.0) + self.assertFloatsAreIdentical(round(-123.456, n), -0.0) + self.assertFloatsAreIdentical(round(1e300, n), 0.0) + self.assertFloatsAreIdentical(round(1e-320, n), 0.0) def test_overflow(self): self.assertRaises(OverflowError, round, 1.6e308, -308) @@ -1052,21 +1053,14 @@ def test_nan_signs(self): fromHex = float.fromhex toHex = float.hex -class HexFloatTestCase(unittest.TestCase): +class HexFloatTestCase(FloatsAreIdenticalMixin, unittest.TestCase): MAX = fromHex('0x.fffffffffffff8p+1024') # max normal MIN = fromHex('0x1p-1022') # min normal TINY = fromHex('0x0.0000000000001p-1022') # min subnormal EPS = fromHex('0x0.0000000000001p0') # diff between 1.0 and next float up def identical(self, x, y): - # check that floats x and y are identical, or that both - # are NaNs - if isnan(x) or isnan(y): - if isnan(x) == isnan(y): - return - elif x == y and (x != 0.0 or copysign(1.0, x) == copysign(1.0, y)): - return - self.fail('%r not identical to %r' % (x, y)) + self.assertFloatsAreIdentical(x, y) def test_ends(self): self.identical(self.MIN, ldexp(1.0, -1022)) diff --git a/Lib/test/test_format.py b/Lib/test/test_format.py index 6fa49dbc..5998ee55 100644 --- a/Lib/test/test_format.py +++ b/Lib/test/test_format.py @@ -35,7 +35,7 @@ def testformat(formatstr, args, output=None, limit=None, overflowok=False): # when 'limit' is specified, it determines how many characters # must match exactly; lengths must always match. # ex: limit=5, '12345678' matches '12345___' - # (mainly for floating point format tests for which an exact match + # (mainly for floating-point format tests for which an exact match # can't be guaranteed due to rounding and representation errors) elif output and limit is not None and ( len(result)!=len(output) or result[:limit]!=output[:limit]): diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py index bbfb1b27..f4e763fe 100644 --- a/Lib/test/test_fractions.py +++ b/Lib/test/test_fractions.py @@ -97,7 +97,7 @@ def typed_approx_eq(a, b): class Symbolic: """Simple non-numeric class for testing mixed arithmetic. - It is not Integral, Rational, Real or Complex, and cannot be conveted + It is not Integral, Rational, Real or Complex, and cannot be converted to int, float or complex. but it supports some arithmetic operations. """ def __init__(self, value): @@ -922,21 +922,21 @@ def testMixedPower(self): self.assertTypedEquals(Root(4) ** F(2, 1), Root(4, F(1))) self.assertTypedEquals(Root(4) ** F(-2, 1), Root(4, -F(1))) self.assertTypedEquals(Root(4) ** F(-2, 3), Root(4, -3.0)) - self.assertEqual(F(3, 2) ** SymbolicReal('X'), SymbolicReal('1.5 ** X')) + self.assertEqual(F(3, 2) ** SymbolicReal('X'), SymbolicReal('3/2 ** X')) self.assertEqual(SymbolicReal('X') ** F(3, 2), SymbolicReal('X ** 1.5')) - self.assertTypedEquals(F(3, 2) ** Rect(2, 0), Polar(2.25, 0.0)) - self.assertTypedEquals(F(1, 1) ** Rect(2, 3), Polar(1.0, 0.0)) + self.assertTypedEquals(F(3, 2) ** Rect(2, 0), Polar(F(9,4), 0.0)) + self.assertTypedEquals(F(1, 1) ** Rect(2, 3), Polar(F(1), 0.0)) self.assertTypedEquals(F(3, 2) ** RectComplex(2, 0), Polar(2.25, 0.0)) self.assertTypedEquals(F(1, 1) ** RectComplex(2, 3), Polar(1.0, 0.0)) self.assertTypedEquals(Polar(4, 2) ** F(3, 2), Polar(8.0, 3.0)) self.assertTypedEquals(Polar(4, 2) ** F(3, 1), Polar(64, 6)) self.assertTypedEquals(Polar(4, 2) ** F(-3, 1), Polar(0.015625, -6)) self.assertTypedEquals(Polar(4, 2) ** F(-3, 2), Polar(0.125, -3.0)) - self.assertEqual(F(3, 2) ** SymbolicComplex('X'), SymbolicComplex('1.5 ** X')) + self.assertEqual(F(3, 2) ** SymbolicComplex('X'), SymbolicComplex('3/2 ** X')) self.assertEqual(SymbolicComplex('X') ** F(3, 2), SymbolicComplex('X ** 1.5')) - self.assertEqual(F(3, 2) ** Symbolic('X'), Symbolic('1.5 ** X')) + self.assertEqual(F(3, 2) ** Symbolic('X'), Symbolic('3/2 ** X')) self.assertEqual(Symbolic('X') ** F(3, 2), Symbolic('X ** 1.5')) def testMixingWithDecimal(self): diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py index fb364e9c..da1ab4ef 100644 --- a/Lib/test/test_fstring.py +++ b/Lib/test/test_fstring.py @@ -8,6 +8,7 @@ # Unicode identifiers in tests is allowed by PEP 3131. import ast +import datetime import os import re import types @@ -18,7 +19,7 @@ from test.support.os_helper import temp_cwd from test.support.script_helper import assert_python_failure, assert_python_ok -a_global = 'global variable' +a_global = "global variable" # You could argue that I'm too strict in looking for specific error # values with assertRaisesRegex, but without it it's way too easy to @@ -27,6 +28,7 @@ # worthwhile tradeoff. When I switched to this method, I found many # examples where I wasn't testing what I thought I was. + class TestCase(unittest.TestCase): def assertAllRaise(self, exception_type, regex, error_strings): for str in error_strings: @@ -38,43 +40,45 @@ def test__format__lookup(self): # Make sure __format__ is looked up on the type, not the instance. class X: def __format__(self, spec): - return 'class' + return "class" x = X() # Add a bound __format__ method to the 'y' instance, but not # the 'x' instance. y = X() - y.__format__ = types.MethodType(lambda self, spec: 'instance', y) + y.__format__ = types.MethodType(lambda self, spec: "instance", y) - self.assertEqual(f'{y}', format(y)) - self.assertEqual(f'{y}', 'class') + self.assertEqual(f"{y}", format(y)) + self.assertEqual(f"{y}", "class") self.assertEqual(format(x), format(y)) # __format__ is not called this way, but still make sure it # returns what we expect (so we can make sure we're bypassing # it). - self.assertEqual(x.__format__(''), 'class') - self.assertEqual(y.__format__(''), 'instance') + self.assertEqual(x.__format__(""), "class") + self.assertEqual(y.__format__(""), "instance") # This is how __format__ is actually called. - self.assertEqual(type(x).__format__(x, ''), 'class') - self.assertEqual(type(y).__format__(y, ''), 'class') + self.assertEqual(type(x).__format__(x, ""), "class") + self.assertEqual(type(y).__format__(y, ""), "class") def test_ast(self): # Inspired by http://bugs.python.org/issue24975 class X: def __init__(self): self.called = False + def __call__(self): self.called = True return 4 + x = X() expr = """ a = 10 f'{a * x()}'""" t = ast.parse(expr) - c = compile(t, '', 'exec') + c = compile(t, "", "exec") # Make sure x was not called. self.assertFalse(x.called) @@ -280,7 +284,6 @@ def test_ast_line_numbers_duplicate_expression(self): self.assertEqual(binop.right.col_offset, 27) def test_ast_numbers_fstring_with_formatting(self): - t = ast.parse('f"Here is that pesky {xxx:.3f} again"') self.assertEqual(len(t.body), 1) self.assertEqual(t.body[0].lineno, 1) @@ -436,24 +439,12 @@ def test_ast_line_numbers_with_parentheses(self): x, y = t.body # Check the single quoted string offsets first. - offsets = [ - (elt.col_offset, elt.end_col_offset) - for elt in x.value.elts - ] - self.assertTrue(all( - offset == (4, 10) - for offset in offsets - )) + offsets = [(elt.col_offset, elt.end_col_offset) for elt in x.value.elts] + self.assertTrue(all(offset == (4, 10) for offset in offsets)) # Check the triple quoted string offsets. - offsets = [ - (elt.col_offset, elt.end_col_offset) - for elt in y.value.elts - ] - self.assertTrue(all( - offset == (4, 14) - for offset in offsets - )) + offsets = [(elt.col_offset, elt.end_col_offset) for elt in y.value.elts] + self.assertTrue(all(offset == (4, 14) for offset in offsets)) expr = """ x = ( @@ -516,463 +507,573 @@ def test_ast_fstring_empty_format_spec(self): def test_docstring(self): def f(): - f'''Not a docstring''' + f"""Not a docstring""" + self.assertIsNone(f.__doc__) + def g(): - '''Not a docstring''' \ - f'' + """Not a docstring""" f"" + self.assertIsNone(g.__doc__) def test_literal_eval(self): - with self.assertRaisesRegex(ValueError, 'malformed node or string'): + with self.assertRaisesRegex(ValueError, "malformed node or string"): ast.literal_eval("f'x'") def test_ast_compile_time_concat(self): - x = [''] + x = [""] expr = """x[0] = 'foo' f'{3}'""" t = ast.parse(expr) - c = compile(t, '', 'exec') + c = compile(t, "", "exec") exec(c) - self.assertEqual(x[0], 'foo3') + self.assertEqual(x[0], "foo3") def test_compile_time_concat_errors(self): - self.assertAllRaise(SyntaxError, - 'cannot mix bytes and nonbytes literals', - [r"""f'' b''""", - r"""b'' f''""", - ]) + self.assertAllRaise( + SyntaxError, + "cannot mix bytes and nonbytes literals", + [ + r"""f'' b''""", + r"""b'' f''""", + ], + ) def test_literal(self): - self.assertEqual(f'', '') - self.assertEqual(f'a', 'a') - self.assertEqual(f' ', ' ') + self.assertEqual(f"", "") + self.assertEqual(f"a", "a") + self.assertEqual(f" ", " ") def test_unterminated_string(self): - self.assertAllRaise(SyntaxError, 'unterminated string', - [r"""f'{"x'""", - r"""f'{"x}'""", - r"""f'{("x'""", - r"""f'{("x}'""", - ]) + self.assertAllRaise( + SyntaxError, + "unterminated string", + [ + r"""f'{"x'""", + r"""f'{"x}'""", + r"""f'{("x'""", + r"""f'{("x}'""", + ], + ) @unittest.skipIf(support.is_wasi, "exhausts limited stack on WASI") def test_mismatched_parens(self): - self.assertAllRaise(SyntaxError, r"closing parenthesis '\}' " - r"does not match opening parenthesis '\('", - ["f'{((}'", - ]) - self.assertAllRaise(SyntaxError, r"closing parenthesis '\)' " - r"does not match opening parenthesis '\['", - ["f'{a[4)}'", - ]) - self.assertAllRaise(SyntaxError, r"closing parenthesis '\]' " - r"does not match opening parenthesis '\('", - ["f'{a(4]}'", - ]) - self.assertAllRaise(SyntaxError, r"closing parenthesis '\}' " - r"does not match opening parenthesis '\['", - ["f'{a[4}'", - ]) - self.assertAllRaise(SyntaxError, r"closing parenthesis '\}' " - r"does not match opening parenthesis '\('", - ["f'{a(4}'", - ]) - self.assertRaises(SyntaxError, eval, "f'{" + "("*500 + "}'") + self.assertAllRaise( + SyntaxError, + r"closing parenthesis '\}' " r"does not match opening parenthesis '\('", + [ + "f'{((}'", + ], + ) + self.assertAllRaise( + SyntaxError, + r"closing parenthesis '\)' " r"does not match opening parenthesis '\['", + [ + "f'{a[4)}'", + ], + ) + self.assertAllRaise( + SyntaxError, + r"closing parenthesis '\]' " r"does not match opening parenthesis '\('", + [ + "f'{a(4]}'", + ], + ) + self.assertAllRaise( + SyntaxError, + r"closing parenthesis '\}' " r"does not match opening parenthesis '\['", + [ + "f'{a[4}'", + ], + ) + self.assertAllRaise( + SyntaxError, + r"closing parenthesis '\}' " r"does not match opening parenthesis '\('", + [ + "f'{a(4}'", + ], + ) + self.assertRaises(SyntaxError, eval, "f'{" + "(" * 500 + "}'") @unittest.skipIf(support.is_wasi, "exhausts limited stack on WASI") def test_fstring_nested_too_deeply(self): - self.assertAllRaise(SyntaxError, - "f-string: expressions nested too deeply", - ['f"{1+2:{1+2:{1+1:{1}}}}"']) + self.assertAllRaise( + SyntaxError, + "f-string: expressions nested too deeply", + ['f"{1+2:{1+2:{1+1:{1}}}}"'], + ) def create_nested_fstring(n): if n == 0: return "1+1" - prev = create_nested_fstring(n-1) + prev = create_nested_fstring(n - 1) return f'f"{{{prev}}}"' - self.assertAllRaise(SyntaxError, - "too many nested f-strings", - [create_nested_fstring(160)]) + self.assertAllRaise( + SyntaxError, "too many nested f-strings", [create_nested_fstring(160)] + ) def test_syntax_error_in_nested_fstring(self): # See gh-104016 for more information on this crash - self.assertAllRaise(SyntaxError, - "invalid syntax", - ['f"{1 1:' + ('{f"1:' * 199)]) + self.assertAllRaise( + SyntaxError, "invalid syntax", ['f"{1 1:' + ('{f"1:' * 199)] + ) def test_double_braces(self): - self.assertEqual(f'{{', '{') - self.assertEqual(f'a{{', 'a{') - self.assertEqual(f'{{b', '{b') - self.assertEqual(f'a{{b', 'a{b') - self.assertEqual(f'}}', '}') - self.assertEqual(f'a}}', 'a}') - self.assertEqual(f'}}b', '}b') - self.assertEqual(f'a}}b', 'a}b') - self.assertEqual(f'{{}}', '{}') - self.assertEqual(f'a{{}}', 'a{}') - self.assertEqual(f'{{b}}', '{b}') - self.assertEqual(f'{{}}c', '{}c') - self.assertEqual(f'a{{b}}', 'a{b}') - self.assertEqual(f'a{{}}c', 'a{}c') - self.assertEqual(f'{{b}}c', '{b}c') - self.assertEqual(f'a{{b}}c', 'a{b}c') - - self.assertEqual(f'{{{10}', '{10') - self.assertEqual(f'}}{10}', '}10') - self.assertEqual(f'}}{{{10}', '}{10') - self.assertEqual(f'}}a{{{10}', '}a{10') - - self.assertEqual(f'{10}{{', '10{') - self.assertEqual(f'{10}}}', '10}') - self.assertEqual(f'{10}}}{{', '10}{') - self.assertEqual(f'{10}}}a{{' '}', '10}a{}') + self.assertEqual(f"{{", "{") + self.assertEqual(f"a{{", "a{") + self.assertEqual(f"{{b", "{b") + self.assertEqual(f"a{{b", "a{b") + self.assertEqual(f"}}", "}") + self.assertEqual(f"a}}", "a}") + self.assertEqual(f"}}b", "}b") + self.assertEqual(f"a}}b", "a}b") + self.assertEqual(f"{{}}", "{}") + self.assertEqual(f"a{{}}", "a{}") + self.assertEqual(f"{{b}}", "{b}") + self.assertEqual(f"{{}}c", "{}c") + self.assertEqual(f"a{{b}}", "a{b}") + self.assertEqual(f"a{{}}c", "a{}c") + self.assertEqual(f"{{b}}c", "{b}c") + self.assertEqual(f"a{{b}}c", "a{b}c") + + self.assertEqual(f"{{{10}", "{10") + self.assertEqual(f"}}{10}", "}10") + self.assertEqual(f"}}{{{10}", "}{10") + self.assertEqual(f"}}a{{{10}", "}a{10") + + self.assertEqual(f"{10}{{", "10{") + self.assertEqual(f"{10}}}", "10}") + self.assertEqual(f"{10}}}{{", "10}{") + self.assertEqual(f"{10}}}a{{" "}", "10}a{}") # Inside of strings, don't interpret doubled brackets. - self.assertEqual(f'{"{{}}"}', '{{}}') + self.assertEqual(f'{"{{}}"}', "{{}}") - self.assertAllRaise(TypeError, 'unhashable type', - ["f'{ {{}} }'", # dict in a set - ]) + self.assertAllRaise( + TypeError, + "unhashable type", + [ + "f'{ {{}} }'", # dict in a set + ], + ) def test_compile_time_concat(self): - x = 'def' - self.assertEqual('abc' f'## {x}ghi', 'abc## defghi') - self.assertEqual('abc' f'{x}' 'ghi', 'abcdefghi') - self.assertEqual('abc' f'{x}' 'gh' f'i{x:4}', 'abcdefghidef ') - self.assertEqual('{x}' f'{x}', '{x}def') - self.assertEqual('{x' f'{x}', '{xdef') - self.assertEqual('{x}' f'{x}', '{x}def') - self.assertEqual('{{x}}' f'{x}', '{{x}}def') - self.assertEqual('{{x' f'{x}', '{{xdef') - self.assertEqual('x}}' f'{x}', 'x}}def') - self.assertEqual(f'{x}' 'x}}', 'defx}}') - self.assertEqual(f'{x}' '', 'def') - self.assertEqual('' f'{x}' '', 'def') - self.assertEqual('' f'{x}', 'def') - self.assertEqual(f'{x}' '2', 'def2') - self.assertEqual('1' f'{x}' '2', '1def2') - self.assertEqual('1' f'{x}', '1def') - self.assertEqual(f'{x}' f'-{x}', 'def-def') - self.assertEqual('' f'', '') - self.assertEqual('' f'' '', '') - self.assertEqual('' f'' '' f'', '') - self.assertEqual(f'', '') - self.assertEqual(f'' '', '') - self.assertEqual(f'' '' f'', '') - self.assertEqual(f'' '' f'' '', '') + x = "def" + self.assertEqual("abc" f"## {x}ghi", "abc## defghi") + self.assertEqual("abc" f"{x}" "ghi", "abcdefghi") + self.assertEqual("abc" f"{x}" "gh" f"i{x:4}", "abcdefghidef ") + self.assertEqual("{x}" f"{x}", "{x}def") + self.assertEqual("{x" f"{x}", "{xdef") + self.assertEqual("{x}" f"{x}", "{x}def") + self.assertEqual("{{x}}" f"{x}", "{{x}}def") + self.assertEqual("{{x" f"{x}", "{{xdef") + self.assertEqual("x}}" f"{x}", "x}}def") + self.assertEqual(f"{x}" "x}}", "defx}}") + self.assertEqual(f"{x}" "", "def") + self.assertEqual("" f"{x}" "", "def") + self.assertEqual("" f"{x}", "def") + self.assertEqual(f"{x}" "2", "def2") + self.assertEqual("1" f"{x}" "2", "1def2") + self.assertEqual("1" f"{x}", "1def") + self.assertEqual(f"{x}" f"-{x}", "def-def") + self.assertEqual("" f"", "") + self.assertEqual("" f"" "", "") + self.assertEqual("" f"" "" f"", "") + self.assertEqual(f"", "") + self.assertEqual(f"" "", "") + self.assertEqual(f"" "" f"", "") + self.assertEqual(f"" "" f"" "", "") # This is not really [f'{'] + [f'}'] since we treat the inside # of braces as a purely new context, so it is actually f'{ and # then eval(' f') (a valid expression) and then }' which would # constitute a valid f-string. - self.assertEqual(f'{' f'}', ' f') + self.assertEqual(f'{' f'}', " f") - self.assertAllRaise(SyntaxError, "expecting '}'", - ['''f'{3' f"}"''', # can't concat to get a valid f-string - ]) + self.assertAllRaise( + SyntaxError, + "expecting '}'", + [ + '''f'{3' f"}"''', # can't concat to get a valid f-string + ], + ) def test_comments(self): # These aren't comments, since they're in strings. - d = {'#': 'hash'} - self.assertEqual(f'{"#"}', '#') - self.assertEqual(f'{d["#"]}', 'hash') - - self.assertAllRaise(SyntaxError, "'{' was never closed", - ["f'{1#}'", # error because everything after '#' is a comment - "f'{#}'", - "f'one: {1#}'", - "f'{1# one} {2 this is a comment still#}'", - ]) - self.assertAllRaise(SyntaxError, r"f-string: unmatched '\)'", - ["f'{)#}'", # When wrapped in parens, this becomes - # '()#)'. Make sure that doesn't compile. - ]) - self.assertEqual(f'''A complex trick: { + d = {"#": "hash"} + self.assertEqual(f'{"#"}', "#") + self.assertEqual(f'{d["#"]}', "hash") + + self.assertAllRaise( + SyntaxError, + "'{' was never closed", + [ + "f'{1#}'", # error because everything after '#' is a comment + "f'{#}'", + "f'one: {1#}'", + "f'{1# one} {2 this is a comment still#}'", + ], + ) + self.assertAllRaise( + SyntaxError, + r"f-string: unmatched '\)'", + [ + "f'{)#}'", # When wrapped in parens, this becomes + # '()#)'. Make sure that doesn't compile. + ], + ) + self.assertEqual( + f"""A complex trick: { 2 # two -}''', 'A complex trick: 2') - self.assertEqual(f''' +}""", + "A complex trick: 2", + ) + self.assertEqual( + f""" { -40 # fourty +40 # forty + # plus 2 # two -}''', '\n42') - self.assertEqual(f''' +}""", + "\n42", + ) + self.assertEqual( + f""" { -40 # fourty +40 # forty + # plus 2 # two -}''', '\n42') +}""", + "\n42", + ) - self.assertEqual(f''' + self.assertEqual( + f""" # this is not a comment { # the following operation it's 3 # this is a number -* 2}''', '\n# this is not a comment\n6') - self.assertEqual(f''' +* 2}""", + "\n# this is not a comment\n6", + ) + self.assertEqual( + f""" {# f'a {comment}' 86 # constant # nothing more -}''', '\n86') - - self.assertAllRaise(SyntaxError, r"f-string: valid expression required before '}'", - ["""f''' +}""", + "\n86", + ) + + self.assertAllRaise( + SyntaxError, + r"f-string: valid expression required before '}'", + [ + """f''' { # only a comment }''' -""", # this is equivalent to f'{}' - ]) +""", # this is equivalent to f'{}' + ], + ) def test_many_expressions(self): # Create a string with many expressions in it. Note that # because we have a space in here as a literal, we're actually # going to use twice as many ast nodes: one for each literal # plus one for each expression. - def build_fstr(n, extra=''): - return "f'" + ('{x} ' * n) + extra + "'" + def build_fstr(n, extra=""): + return "f'" + ("{x} " * n) + extra + "'" - x = 'X' + x = "X" width = 1 # Test around 256. for i in range(250, 260): - self.assertEqual(eval(build_fstr(i)), (x+' ')*i) + self.assertEqual(eval(build_fstr(i)), (x + " ") * i) # Test concatenating 2 largs fstrings. - self.assertEqual(eval(build_fstr(255)*256), (x+' ')*(255*256)) + self.assertEqual(eval(build_fstr(255) * 256), (x + " ") * (255 * 256)) - s = build_fstr(253, '{x:{width}} ') - self.assertEqual(eval(s), (x+' ')*254) + s = build_fstr(253, "{x:{width}} ") + self.assertEqual(eval(s), (x + " ") * 254) # Test lots of expressions and constants, concatenated. s = "f'{1}' 'x' 'y'" * 1024 - self.assertEqual(eval(s), '1xy' * 1024) + self.assertEqual(eval(s), "1xy" * 1024) def test_format_specifier_expressions(self): width = 10 precision = 4 - value = decimal.Decimal('12.34567') - self.assertEqual(f'result: {value:{width}.{precision}}', 'result: 12.35') - self.assertEqual(f'result: {value:{width!r}.{precision}}', 'result: 12.35') - self.assertEqual(f'result: {value:{width:0}.{precision:1}}', 'result: 12.35') - self.assertEqual(f'result: {value:{1}{0:0}.{precision:1}}', 'result: 12.35') - self.assertEqual(f'result: {value:{ 1}{ 0:0}.{ precision:1}}', 'result: 12.35') - self.assertEqual(f'{10:#{1}0x}', ' 0xa') - self.assertEqual(f'{10:{"#"}1{0}{"x"}}', ' 0xa') - self.assertEqual(f'{-10:-{"#"}1{0}x}', ' -0xa') - self.assertEqual(f'{-10:{"-"}#{1}0{"x"}}', ' -0xa') - self.assertEqual(f'{10:#{3 != {4:5} and width}x}', ' 0xa') - self.assertEqual(f'result: {value:{width:{0}}.{precision:1}}', 'result: 12.35') - - self.assertAllRaise(SyntaxError, "f-string: expecting ':' or '}'", - ["""f'{"s"!r{":10"}}'""", - # This looks like a nested format spec. - ]) - - self.assertAllRaise(SyntaxError, - "f-string: expecting a valid expression after '{'", - [# Invalid syntax inside a nested spec. - "f'{4:{/5}}'", - ]) - - self.assertAllRaise(SyntaxError, 'f-string: invalid conversion character', - [# No expansion inside conversion or for - # the : or ! itself. - """f'{"s"!{"r"}}'""", - ]) + value = decimal.Decimal("12.34567") + self.assertEqual(f"result: {value:{width}.{precision}}", "result: 12.35") + self.assertEqual(f"result: {value:{width!r}.{precision}}", "result: 12.35") + self.assertEqual( + f"result: {value:{width:0}.{precision:1}}", "result: 12.35" + ) + self.assertEqual( + f"result: {value:{1}{0:0}.{precision:1}}", "result: 12.35" + ) + self.assertEqual( + f"result: {value:{ 1}{ 0:0}.{ precision:1}}", "result: 12.35" + ) + self.assertEqual(f"{10:#{1}0x}", " 0xa") + self.assertEqual(f'{10:{"#"}1{0}{"x"}}', " 0xa") + self.assertEqual(f'{-10:-{"#"}1{0}x}', " -0xa") + self.assertEqual(f'{-10:{"-"}#{1}0{"x"}}', " -0xa") + self.assertEqual(f"{10:#{3 != {4:5} and width}x}", " 0xa") + self.assertEqual( + f"result: {value:{width:{0}}.{precision:1}}", "result: 12.35" + ) + + self.assertAllRaise( + SyntaxError, + "f-string: expecting ':' or '}'", + [ + """f'{"s"!r{":10"}}'""", + # This looks like a nested format spec. + ], + ) + + self.assertAllRaise( + SyntaxError, + "f-string: expecting a valid expression after '{'", + [ # Invalid syntax inside a nested spec. + "f'{4:{/5}}'", + ], + ) + + self.assertAllRaise( + SyntaxError, + "f-string: invalid conversion character", + [ # No expansion inside conversion or for + # the : or ! itself. + """f'{"s"!{"r"}}'""", + ], + ) def test_custom_format_specifier(self): class CustomFormat: def __format__(self, format_spec): return format_spec - self.assertEqual(f'{CustomFormat():\n}', '\n') - self.assertEqual(f'{CustomFormat():\u2603}', '☃') + self.assertEqual(f"{CustomFormat():\n}", "\n") + self.assertEqual(f"{CustomFormat():\u2603}", "☃") with self.assertWarns(SyntaxWarning): - exec(r'f"{F():¯\_(ツ)_/¯}"', {'F': CustomFormat}) + exec(r'f"{F():¯\_(ツ)_/¯}"', {"F": CustomFormat}) def test_side_effect_order(self): class X: def __init__(self): self.i = 0 + def __format__(self, spec): self.i += 1 return str(self.i) x = X() - self.assertEqual(f'{x} {x}', '1 2') + self.assertEqual(f"{x} {x}", "1 2") def test_missing_expression(self): - self.assertAllRaise(SyntaxError, - "f-string: valid expression required before '}'", - ["f'{}'", - "f'{ }'" - "f' {} '", - "f'{10:{ }}'", - "f' { } '", - - # The Python parser ignores also the following - # whitespace characters in additional to a space. - "f'''{\t\f\r\n}'''", - ]) - - self.assertAllRaise(SyntaxError, - "f-string: valid expression required before '!'", - ["f'{!r}'", - "f'{ !r}'", - "f'{!}'", - "f'''{\t\f\r\n!a}'''", - - # Catch empty expression before the - # missing closing brace. - "f'{!'", - "f'{!s:'", - - # Catch empty expression before the - # invalid conversion. - "f'{!x}'", - "f'{ !xr}'", - "f'{!x:}'", - "f'{!x:a}'", - "f'{ !xr:}'", - "f'{ !xr:a}'", - ]) - - self.assertAllRaise(SyntaxError, - "f-string: valid expression required before ':'", - ["f'{:}'", - "f'{ :!}'", - "f'{:2}'", - "f'''{\t\f\r\n:a}'''", - "f'{:'", - ]) - - self.assertAllRaise(SyntaxError, - "f-string: valid expression required before '='", - ["f'{=}'", - "f'{ =}'", - "f'{ =:}'", - "f'{ =!}'", - "f'''{\t\f\r\n=}'''", - "f'{='", - ]) + self.assertAllRaise( + SyntaxError, + "f-string: valid expression required before '}'", + [ + "f'{}'", + "f'{ }'" "f' {} '", + "f'{10:{ }}'", + "f' { } '", + # The Python parser ignores also the following + # whitespace characters in additional to a space. + "f'''{\t\f\r\n}'''", + ], + ) + + self.assertAllRaise( + SyntaxError, + "f-string: valid expression required before '!'", + [ + "f'{!r}'", + "f'{ !r}'", + "f'{!}'", + "f'''{\t\f\r\n!a}'''", + # Catch empty expression before the + # missing closing brace. + "f'{!'", + "f'{!s:'", + # Catch empty expression before the + # invalid conversion. + "f'{!x}'", + "f'{ !xr}'", + "f'{!x:}'", + "f'{!x:a}'", + "f'{ !xr:}'", + "f'{ !xr:a}'", + ], + ) + + self.assertAllRaise( + SyntaxError, + "f-string: valid expression required before ':'", + [ + "f'{:}'", + "f'{ :!}'", + "f'{:2}'", + "f'''{\t\f\r\n:a}'''", + "f'{:'", + "F'{[F'{:'}[F'{:'}]]]", + ], + ) + + self.assertAllRaise( + SyntaxError, + "f-string: valid expression required before '='", + [ + "f'{=}'", + "f'{ =}'", + "f'{ =:}'", + "f'{ =!}'", + "f'''{\t\f\r\n=}'''", + "f'{='", + ], + ) # Different error message is raised for other whitespace characters. - self.assertAllRaise(SyntaxError, r"invalid non-printable character U\+00A0", - ["f'''{\xa0}'''", - "\xa0", - ]) + self.assertAllRaise( + SyntaxError, + r"invalid non-printable character U\+00A0", + [ + "f'''{\xa0}'''", + "\xa0", + ], + ) def test_parens_in_expressions(self): - self.assertEqual(f'{3,}', '(3,)') - - self.assertAllRaise(SyntaxError, - "f-string: expecting a valid expression after '{'", - ["f'{,}'", - ]) - - self.assertAllRaise(SyntaxError, r"f-string: unmatched '\)'", - ["f'{3)+(4}'", - ]) + self.assertEqual(f"{3,}", "(3,)") + + self.assertAllRaise( + SyntaxError, + "f-string: expecting a valid expression after '{'", + [ + "f'{,}'", + ], + ) + + self.assertAllRaise( + SyntaxError, + r"f-string: unmatched '\)'", + [ + "f'{3)+(4}'", + ], + ) def test_newlines_before_syntax_error(self): - self.assertAllRaise(SyntaxError, - "f-string: expecting a valid expression after '{'", - ["f'{.}'", "\nf'{.}'", "\n\nf'{.}'"]) + self.assertAllRaise( + SyntaxError, + "f-string: expecting a valid expression after '{'", + ["f'{.}'", "\nf'{.}'", "\n\nf'{.}'"], + ) def test_backslashes_in_string_part(self): - self.assertEqual(f'\t', '\t') - self.assertEqual(r'\t', '\\t') - self.assertEqual(rf'\t', '\\t') - self.assertEqual(f'{2}\t', '2\t') - self.assertEqual(f'{2}\t{3}', '2\t3') - self.assertEqual(f'\t{3}', '\t3') - - self.assertEqual(f'\u0394', '\u0394') - self.assertEqual(r'\u0394', '\\u0394') - self.assertEqual(rf'\u0394', '\\u0394') - self.assertEqual(f'{2}\u0394', '2\u0394') - self.assertEqual(f'{2}\u0394{3}', '2\u03943') - self.assertEqual(f'\u0394{3}', '\u03943') - - self.assertEqual(f'\U00000394', '\u0394') - self.assertEqual(r'\U00000394', '\\U00000394') - self.assertEqual(rf'\U00000394', '\\U00000394') - self.assertEqual(f'{2}\U00000394', '2\u0394') - self.assertEqual(f'{2}\U00000394{3}', '2\u03943') - self.assertEqual(f'\U00000394{3}', '\u03943') - - self.assertEqual(f'\N{GREEK CAPITAL LETTER DELTA}', '\u0394') - self.assertEqual(f'{2}\N{GREEK CAPITAL LETTER DELTA}', '2\u0394') - self.assertEqual(f'{2}\N{GREEK CAPITAL LETTER DELTA}{3}', '2\u03943') - self.assertEqual(f'\N{GREEK CAPITAL LETTER DELTA}{3}', '\u03943') - self.assertEqual(f'2\N{GREEK CAPITAL LETTER DELTA}', '2\u0394') - self.assertEqual(f'2\N{GREEK CAPITAL LETTER DELTA}3', '2\u03943') - self.assertEqual(f'\N{GREEK CAPITAL LETTER DELTA}3', '\u03943') - - self.assertEqual(f'\x20', ' ') - self.assertEqual(r'\x20', '\\x20') - self.assertEqual(rf'\x20', '\\x20') - self.assertEqual(f'{2}\x20', '2 ') - self.assertEqual(f'{2}\x20{3}', '2 3') - self.assertEqual(f'\x20{3}', ' 3') - - self.assertEqual(f'2\x20', '2 ') - self.assertEqual(f'2\x203', '2 3') - self.assertEqual(f'\x203', ' 3') + self.assertEqual(f"\t", "\t") + self.assertEqual(r"\t", "\\t") + self.assertEqual(rf"\t", "\\t") + self.assertEqual(f"{2}\t", "2\t") + self.assertEqual(f"{2}\t{3}", "2\t3") + self.assertEqual(f"\t{3}", "\t3") + + self.assertEqual(f"\u0394", "\u0394") + self.assertEqual(r"\u0394", "\\u0394") + self.assertEqual(rf"\u0394", "\\u0394") + self.assertEqual(f"{2}\u0394", "2\u0394") + self.assertEqual(f"{2}\u0394{3}", "2\u03943") + self.assertEqual(f"\u0394{3}", "\u03943") + + self.assertEqual(f"\U00000394", "\u0394") + self.assertEqual(r"\U00000394", "\\U00000394") + self.assertEqual(rf"\U00000394", "\\U00000394") + self.assertEqual(f"{2}\U00000394", "2\u0394") + self.assertEqual(f"{2}\U00000394{3}", "2\u03943") + self.assertEqual(f"\U00000394{3}", "\u03943") + + self.assertEqual(f"\N{GREEK CAPITAL LETTER DELTA}", "\u0394") + self.assertEqual(f"{2}\N{GREEK CAPITAL LETTER DELTA}", "2\u0394") + self.assertEqual(f"{2}\N{GREEK CAPITAL LETTER DELTA}{3}", "2\u03943") + self.assertEqual(f"\N{GREEK CAPITAL LETTER DELTA}{3}", "\u03943") + self.assertEqual(f"2\N{GREEK CAPITAL LETTER DELTA}", "2\u0394") + self.assertEqual(f"2\N{GREEK CAPITAL LETTER DELTA}3", "2\u03943") + self.assertEqual(f"\N{GREEK CAPITAL LETTER DELTA}3", "\u03943") + + self.assertEqual(f"\x20", " ") + self.assertEqual(r"\x20", "\\x20") + self.assertEqual(rf"\x20", "\\x20") + self.assertEqual(f"{2}\x20", "2 ") + self.assertEqual(f"{2}\x20{3}", "2 3") + self.assertEqual(f"\x20{3}", " 3") + + self.assertEqual(f"2\x20", "2 ") + self.assertEqual(f"2\x203", "2 3") + self.assertEqual(f"\x203", " 3") with self.assertWarns(SyntaxWarning): # invalid escape sequence value = eval(r"f'\{6*7}'") - self.assertEqual(value, '\\42') + self.assertEqual(value, "\\42") with self.assertWarns(SyntaxWarning): # invalid escape sequence value = eval(r"f'\g'") - self.assertEqual(value, '\\g') - self.assertEqual(f'\\{6*7}', '\\42') - self.assertEqual(fr'\{6*7}', '\\42') + self.assertEqual(value, "\\g") + self.assertEqual(f"\\{6*7}", "\\42") + self.assertEqual(rf"\{6*7}", "\\42") - AMPERSAND = 'spam' + AMPERSAND = "spam" # Get the right unicode character (&), or pick up local variable # depending on the number of backslashes. - self.assertEqual(f'\N{AMPERSAND}', '&') - self.assertEqual(f'\\N{AMPERSAND}', '\\Nspam') - self.assertEqual(fr'\N{AMPERSAND}', '\\Nspam') - self.assertEqual(f'\\\N{AMPERSAND}', '\\&') + self.assertEqual(f"\N{AMPERSAND}", "&") + self.assertEqual(f"\\N{AMPERSAND}", "\\Nspam") + self.assertEqual(rf"\N{AMPERSAND}", "\\Nspam") + self.assertEqual(f"\\\N{AMPERSAND}", "\\&") def test_misformed_unicode_character_name(self): # These test are needed because unicode names are parsed # differently inside f-strings. - self.assertAllRaise(SyntaxError, r"\(unicode error\) 'unicodeescape' codec can't decode bytes in position .*: malformed \\N character escape", - [r"f'\N'", - r"f'\N '", - r"f'\N '", # See bpo-46503. - r"f'\N{'", - r"f'\N{GREEK CAPITAL LETTER DELTA'", - - # Here are the non-f-string versions, - # which should give the same errors. - r"'\N'", - r"'\N '", - r"'\N '", - r"'\N{'", - r"'\N{GREEK CAPITAL LETTER DELTA'", - ]) + self.assertAllRaise( + SyntaxError, + r"\(unicode error\) 'unicodeescape' codec can't decode bytes in position .*: malformed \\N character escape", + [ + r"f'\N'", + r"f'\N '", + r"f'\N '", # See bpo-46503. + r"f'\N{'", + r"f'\N{GREEK CAPITAL LETTER DELTA'", + # Here are the non-f-string versions, + # which should give the same errors. + r"'\N'", + r"'\N '", + r"'\N '", + r"'\N{'", + r"'\N{GREEK CAPITAL LETTER DELTA'", + ], + ) def test_backslashes_in_expression_part(self): - self.assertEqual(f"{( + self.assertEqual( + f"{( 1 + 2 - )}", "3") - - self.assertEqual("\N{LEFT CURLY BRACKET}", '{') - self.assertEqual(f'{"\N{LEFT CURLY BRACKET}"}', '{') - self.assertEqual(rf'{"\N{LEFT CURLY BRACKET}"}', '{') - - self.assertAllRaise(SyntaxError, - "f-string: valid expression required before '}'", - ["f'{\n}'", - ]) + )}", + "3", + ) + + self.assertEqual("\N{LEFT CURLY BRACKET}", "{") + self.assertEqual(f'{"\N{LEFT CURLY BRACKET}"}', "{") + self.assertEqual(rf'{"\N{LEFT CURLY BRACKET}"}', "{") + + self.assertAllRaise( + SyntaxError, + "f-string: valid expression required before '}'", + [ + "f'{\n}'", + ], + ) def test_invalid_backslashes_inside_fstring_context(self): # All of these variations are invalid python syntax, @@ -990,23 +1091,27 @@ def test_invalid_backslashes_inside_fstring_context(self): r"\\"[0], ] ] - self.assertAllRaise(SyntaxError, 'unexpected character after line continuation', - cases) + self.assertAllRaise( + SyntaxError, "unexpected character after line continuation", cases + ) def test_no_escapes_for_braces(self): """ Only literal curly braces begin an expression. """ # \x7b is '{'. - self.assertEqual(f'\x7b1+1}}', '{1+1}') - self.assertEqual(f'\x7b1+1', '{1+1') - self.assertEqual(f'\u007b1+1', '{1+1') - self.assertEqual(f'\N{LEFT CURLY BRACKET}1+1\N{RIGHT CURLY BRACKET}', '{1+1}') + self.assertEqual(f"\x7b1+1}}", "{1+1}") + self.assertEqual(f"\x7b1+1", "{1+1") + self.assertEqual(f"\u007b1+1", "{1+1") + self.assertEqual(f"\N{LEFT CURLY BRACKET}1+1\N{RIGHT CURLY BRACKET}", "{1+1}") def test_newlines_in_expressions(self): - self.assertEqual(f'{0}', '0') - self.assertEqual(rf'''{3+ -4}''', '7') + self.assertEqual(f"{0}", "0") + self.assertEqual( + rf"""{3+ +4}""", + "7", + ) def test_lambda(self): x = 5 @@ -1017,57 +1122,61 @@ def test_lambda(self): # lambda doesn't work without parens, because the colon # makes the parser think it's a format_spec # emit warning if we can match a format_spec - self.assertAllRaise(SyntaxError, - "f-string: lambda expressions are not allowed " - "without parentheses", - ["f'{lambda x:x}'", - "f'{lambda :x}'", - "f'{lambda *arg, :x}'", - "f'{1, lambda:x}'", - "f'{lambda x:}'", - "f'{lambda :}'", - ]) + self.assertAllRaise( + SyntaxError, + "f-string: lambda expressions are not allowed " "without parentheses", + [ + "f'{lambda x:x}'", + "f'{lambda :x}'", + "f'{lambda *arg, :x}'", + "f'{1, lambda:x}'", + "f'{lambda x:}'", + "f'{lambda :}'", + ], + ) # Ensure the detection of invalid lambdas doesn't trigger detection # for valid lambdas in the second error pass with self.assertRaisesRegex(SyntaxError, "invalid syntax"): compile("lambda name_3=f'{name_4}': {name_3}\n1 $ 1", "", "exec") # but don't emit the paren warning in general cases - with self.assertRaisesRegex(SyntaxError, "f-string: expecting a valid expression after '{'"): + with self.assertRaisesRegex( + SyntaxError, "f-string: expecting a valid expression after '{'" + ): eval("f'{+ lambda:None}'") def test_valid_prefixes(self): - self.assertEqual(F'{1}', "1") - self.assertEqual(FR'{2}', "2") - self.assertEqual(fR'{3}', "3") + self.assertEqual(f"{1}", "1") + self.assertEqual(Rf"{2}", "2") + self.assertEqual(Rf"{3}", "3") def test_roundtrip_raw_quotes(self): - self.assertEqual(fr"\'", "\\'") - self.assertEqual(fr'\"', '\\"') - self.assertEqual(fr'\"\'', '\\"\\\'') - self.assertEqual(fr'\'\"', '\\\'\\"') - self.assertEqual(fr'\"\'\"', '\\"\\\'\\"') - self.assertEqual(fr'\'\"\'', '\\\'\\"\\\'') - self.assertEqual(fr'\"\'\"\'', '\\"\\\'\\"\\\'') + self.assertEqual(rf"\'", "\\'") + self.assertEqual(rf"\"", '\\"') + self.assertEqual(rf"\"\'", "\\\"\\'") + self.assertEqual(rf"\'\"", "\\'\\\"") + self.assertEqual(rf"\"\'\"", '\\"\\\'\\"') + self.assertEqual(rf"\'\"\'", "\\'\\\"\\'") + self.assertEqual(rf"\"\'\"\'", "\\\"\\'\\\"\\'") def test_fstring_backslash_before_double_bracket(self): deprecated_cases = [ - (r"f'\{{\}}'", '\\{\\}'), - (r"f'\{{'", '\\{'), - (r"f'\{{{1+1}'", '\\{2'), - (r"f'\}}{1+1}'", '\\}2'), - (r"f'{1+1}\}}'", '2\\}') + (r"f'\{{\}}'", "\\{\\}"), + (r"f'\{{'", "\\{"), + (r"f'\{{{1+1}'", "\\{2"), + (r"f'\}}{1+1}'", "\\}2"), + (r"f'{1+1}\}}'", "2\\}"), ] for case, expected_result in deprecated_cases: with self.subTest(case=case, expected_result=expected_result): with self.assertWarns(SyntaxWarning): result = eval(case) self.assertEqual(result, expected_result) - self.assertEqual(fr'\{{\}}', '\\{\\}') - self.assertEqual(fr'\{{', '\\{') - self.assertEqual(fr'\{{{1+1}', '\\{2') - self.assertEqual(fr'\}}{1+1}', '\\}2') - self.assertEqual(fr'{1+1}\}}', '2\\}') + self.assertEqual(rf"\{{\}}", "\\{\\}") + self.assertEqual(rf"\{{", "\\{") + self.assertEqual(rf"\{{{1+1}", "\\{2") + self.assertEqual(rf"\}}{1+1}", "\\}2") + self.assertEqual(rf"{1+1}\}}", "2\\}") def test_fstring_backslash_before_double_bracket_warns_once(self): with self.assertWarns(SyntaxWarning) as w: @@ -1076,18 +1185,18 @@ def test_fstring_backslash_before_double_bracket_warns_once(self): self.assertEqual(w.warnings[0].category, SyntaxWarning) def test_fstring_backslash_prefix_raw(self): - self.assertEqual(f'\\', '\\') - self.assertEqual(f'\\\\', '\\\\') - self.assertEqual(fr'\\', r'\\') - self.assertEqual(fr'\\\\', r'\\\\') - self.assertEqual(rf'\\', r'\\') - self.assertEqual(rf'\\\\', r'\\\\') - self.assertEqual(Rf'\\', R'\\') - self.assertEqual(Rf'\\\\', R'\\\\') - self.assertEqual(fR'\\', R'\\') - self.assertEqual(fR'\\\\', R'\\\\') - self.assertEqual(FR'\\', R'\\') - self.assertEqual(FR'\\\\', R'\\\\') + self.assertEqual(f"\\", "\\") + self.assertEqual(f"\\\\", "\\\\") + self.assertEqual(rf"\\", r"\\") + self.assertEqual(rf"\\\\", r"\\\\") + self.assertEqual(rf"\\", r"\\") + self.assertEqual(rf"\\\\", r"\\\\") + self.assertEqual(Rf"\\", R"\\") + self.assertEqual(Rf"\\\\", R"\\\\") + self.assertEqual(Rf"\\", R"\\") + self.assertEqual(Rf"\\\\", R"\\\\") + self.assertEqual(Rf"\\", R"\\") + self.assertEqual(Rf"\\\\", R"\\\\") def test_fstring_format_spec_greedy_matching(self): self.assertEqual(f"{1:}}}", "1}") @@ -1097,8 +1206,8 @@ def test_yield(self): # Not terribly useful, but make sure the yield turns # a function into a generator def fn(y): - f'y:{yield y*2}' - f'{yield}' + f"y:{yield y*2}" + f"{yield}" g = fn(4) self.assertEqual(next(g), 8) @@ -1106,15 +1215,15 @@ def fn(y): def test_yield_send(self): def fn(x): - yield f'x:{yield (lambda i: x * i)}' + yield f"x:{yield (lambda i: x * i)}" g = fn(10) the_lambda = next(g) self.assertEqual(the_lambda(4), 40) - self.assertEqual(g.send('string'), 'x:string') + self.assertEqual(g.send("string"), "x:string") def test_expressions_with_triple_quoted_strings(self): - self.assertEqual(f"{'''x'''}", 'x') + self.assertEqual(f"{'''x'''}", "x") self.assertEqual(f"{'''eric's'''}", "eric's") # Test concatenation within an expression @@ -1127,263 +1236,302 @@ def test_expressions_with_triple_quoted_strings(self): def test_multiple_vars(self): x = 98 - y = 'abc' - self.assertEqual(f'{x}{y}', '98abc') + y = "abc" + self.assertEqual(f"{x}{y}", "98abc") - self.assertEqual(f'X{x}{y}', 'X98abc') - self.assertEqual(f'{x}X{y}', '98Xabc') - self.assertEqual(f'{x}{y}X', '98abcX') + self.assertEqual(f"X{x}{y}", "X98abc") + self.assertEqual(f"{x}X{y}", "98Xabc") + self.assertEqual(f"{x}{y}X", "98abcX") - self.assertEqual(f'X{x}Y{y}', 'X98Yabc') - self.assertEqual(f'X{x}{y}Y', 'X98abcY') - self.assertEqual(f'{x}X{y}Y', '98XabcY') + self.assertEqual(f"X{x}Y{y}", "X98Yabc") + self.assertEqual(f"X{x}{y}Y", "X98abcY") + self.assertEqual(f"{x}X{y}Y", "98XabcY") - self.assertEqual(f'X{x}Y{y}Z', 'X98YabcZ') + self.assertEqual(f"X{x}Y{y}Z", "X98YabcZ") def test_closure(self): def outer(x): def inner(): - return f'x:{x}' + return f"x:{x}" + return inner - self.assertEqual(outer('987')(), 'x:987') - self.assertEqual(outer(7)(), 'x:7') + self.assertEqual(outer("987")(), "x:987") + self.assertEqual(outer(7)(), "x:7") def test_arguments(self): y = 2 + def f(x, width): - return f'x={x*y:{width}}' + return f"x={x*y:{width}}" - self.assertEqual(f('foo', 10), 'x=foofoo ') - x = 'bar' - self.assertEqual(f(10, 10), 'x= 20') + self.assertEqual(f("foo", 10), "x=foofoo ") + x = "bar" + self.assertEqual(f(10, 10), "x= 20") def test_locals(self): value = 123 - self.assertEqual(f'v:{value}', 'v:123') + self.assertEqual(f"v:{value}", "v:123") def test_missing_variable(self): with self.assertRaises(NameError): - f'v:{value}' + f"v:{value}" def test_missing_format_spec(self): class O: def __format__(self, spec): if not spec: - return '*' + return "*" return spec - self.assertEqual(f'{O():x}', 'x') - self.assertEqual(f'{O()}', '*') - self.assertEqual(f'{O():}', '*') + self.assertEqual(f"{O():x}", "x") + self.assertEqual(f"{O()}", "*") + self.assertEqual(f"{O():}", "*") - self.assertEqual(f'{3:}', '3') - self.assertEqual(f'{3!s:}', '3') + self.assertEqual(f"{3:}", "3") + self.assertEqual(f"{3!s:}", "3") def test_global(self): - self.assertEqual(f'g:{a_global}', 'g:global variable') - self.assertEqual(f'g:{a_global!r}', "g:'global variable'") + self.assertEqual(f"g:{a_global}", "g:global variable") + self.assertEqual(f"g:{a_global!r}", "g:'global variable'") - a_local = 'local variable' - self.assertEqual(f'g:{a_global} l:{a_local}', - 'g:global variable l:local variable') - self.assertEqual(f'g:{a_global!r}', - "g:'global variable'") - self.assertEqual(f'g:{a_global} l:{a_local!r}', - "g:global variable l:'local variable'") + a_local = "local variable" + self.assertEqual( + f"g:{a_global} l:{a_local}", "g:global variable l:local variable" + ) + self.assertEqual(f"g:{a_global!r}", "g:'global variable'") + self.assertEqual( + f"g:{a_global} l:{a_local!r}", "g:global variable l:'local variable'" + ) - self.assertIn("module 'unittest' from", f'{unittest}') + self.assertIn("module 'unittest' from", f"{unittest}") def test_shadowed_global(self): - a_global = 'really a local' - self.assertEqual(f'g:{a_global}', 'g:really a local') - self.assertEqual(f'g:{a_global!r}', "g:'really a local'") - - a_local = 'local variable' - self.assertEqual(f'g:{a_global} l:{a_local}', - 'g:really a local l:local variable') - self.assertEqual(f'g:{a_global!r}', - "g:'really a local'") - self.assertEqual(f'g:{a_global} l:{a_local!r}', - "g:really a local l:'local variable'") + a_global = "really a local" + self.assertEqual(f"g:{a_global}", "g:really a local") + self.assertEqual(f"g:{a_global!r}", "g:'really a local'") + + a_local = "local variable" + self.assertEqual( + f"g:{a_global} l:{a_local}", "g:really a local l:local variable" + ) + self.assertEqual(f"g:{a_global!r}", "g:'really a local'") + self.assertEqual( + f"g:{a_global} l:{a_local!r}", "g:really a local l:'local variable'" + ) def test_call(self): def foo(x): - return 'x=' + str(x) + return "x=" + str(x) - self.assertEqual(f'{foo(10)}', 'x=10') + self.assertEqual(f"{foo(10)}", "x=10") def test_nested_fstrings(self): y = 5 - self.assertEqual(f'{f"{0}"*3}', '000') - self.assertEqual(f'{f"{y}"*3}', '555') + self.assertEqual(f'{f"{0}"*3}', "000") + self.assertEqual(f'{f"{y}"*3}', "555") def test_invalid_string_prefixes(self): - single_quote_cases = ["fu''", - "uf''", - "Fu''", - "fU''", - "Uf''", - "uF''", - "ufr''", - "urf''", - "fur''", - "fru''", - "rfu''", - "ruf''", - "FUR''", - "Fur''", - "fb''", - "fB''", - "Fb''", - "FB''", - "bf''", - "bF''", - "Bf''", - "BF''",] + single_quote_cases = [ + "fu''", + "uf''", + "Fu''", + "fU''", + "Uf''", + "uF''", + "ufr''", + "urf''", + "fur''", + "fru''", + "rfu''", + "ruf''", + "FUR''", + "Fur''", + "fb''", + "fB''", + "Fb''", + "FB''", + "bf''", + "bF''", + "Bf''", + "BF''", + ] double_quote_cases = [case.replace("'", '"') for case in single_quote_cases] - self.assertAllRaise(SyntaxError, 'invalid syntax', - single_quote_cases + double_quote_cases) + self.assertAllRaise( + SyntaxError, "invalid syntax", single_quote_cases + double_quote_cases + ) def test_leading_trailing_spaces(self): - self.assertEqual(f'{ 3}', '3') - self.assertEqual(f'{ 3}', '3') - self.assertEqual(f'{3 }', '3') - self.assertEqual(f'{3 }', '3') + self.assertEqual(f"{ 3}", "3") + self.assertEqual(f"{ 3}", "3") + self.assertEqual(f"{3 }", "3") + self.assertEqual(f"{3 }", "3") - self.assertEqual(f'expr={ {x: y for x, y in [(1, 2), ]}}', - 'expr={1: 2}') - self.assertEqual(f'expr={ {x: y for x, y in [(1, 2), ]} }', - 'expr={1: 2}') + self.assertEqual(f"expr={ {x: y for x, y in [(1, 2), ]}}", "expr={1: 2}") + self.assertEqual(f"expr={ {x: y for x, y in [(1, 2), ]} }", "expr={1: 2}") def test_not_equal(self): # There's a special test for this because there's a special # case in the f-string parser to look for != as not ending an # expression. Normally it would, while looking for !s or !r. - self.assertEqual(f'{3!=4}', 'True') - self.assertEqual(f'{3!=4:}', 'True') - self.assertEqual(f'{3!=4!s}', 'True') - self.assertEqual(f'{3!=4!s:.3}', 'Tru') + self.assertEqual(f"{3!=4}", "True") + self.assertEqual(f"{3!=4:}", "True") + self.assertEqual(f"{3!=4!s}", "True") + self.assertEqual(f"{3!=4!s:.3}", "Tru") def test_equal_equal(self): # Because an expression ending in = has special meaning, # there's a special test for ==. Make sure it works. - self.assertEqual(f'{0==1}', 'False') + self.assertEqual(f"{0==1}", "False") def test_conversions(self): - self.assertEqual(f'{3.14:10.10}', ' 3.14') - self.assertEqual(f'{3.14!s:10.10}', '3.14 ') - self.assertEqual(f'{3.14!r:10.10}', '3.14 ') - self.assertEqual(f'{3.14!a:10.10}', '3.14 ') + self.assertEqual(f"{3.14:10.10}", " 3.14") + self.assertEqual(f"{3.14!s:10.10}", "3.14 ") + self.assertEqual(f"{3.14!r:10.10}", "3.14 ") + self.assertEqual(f"{3.14!a:10.10}", "3.14 ") - self.assertEqual(f'{"a"}', 'a') + self.assertEqual(f'{"a"}', "a") self.assertEqual(f'{"a"!r}', "'a'") self.assertEqual(f'{"a"!a}', "'a'") # Conversions can have trailing whitespace after them since it # does not provide any significance self.assertEqual(f"{3!s }", "3") - self.assertEqual(f'{3.14!s :10.10}', '3.14 ') + self.assertEqual(f"{3.14!s :10.10}", "3.14 ") # Not a conversion. self.assertEqual(f'{"a!r"}', "a!r") # Not a conversion, but show that ! is allowed in a format spec. - self.assertEqual(f'{3.14:!<10.10}', '3.14!!!!!!') - - self.assertAllRaise(SyntaxError, "f-string: expecting '}'", - ["f'{3!'", - "f'{3!s'", - "f'{3!g'", - ]) - - self.assertAllRaise(SyntaxError, 'f-string: missing conversion character', - ["f'{3!}'", - "f'{3!:'", - "f'{3!:}'", - ]) - - for conv_identifier in 'g', 'A', 'G', 'ä', 'ɐ': - self.assertAllRaise(SyntaxError, - "f-string: invalid conversion character %r: " - "expected 's', 'r', or 'a'" % conv_identifier, - ["f'{3!" + conv_identifier + "}'"]) - - for conv_non_identifier in '3', '!': - self.assertAllRaise(SyntaxError, - "f-string: invalid conversion character", - ["f'{3!" + conv_non_identifier + "}'"]) - - for conv in ' s', ' s ': - self.assertAllRaise(SyntaxError, - "f-string: conversion type must come right after the" - " exclamanation mark", - ["f'{3!" + conv + "}'"]) - - self.assertAllRaise(SyntaxError, - "f-string: invalid conversion character 'ss': " - "expected 's', 'r', or 'a'", - ["f'{3!ss}'", - "f'{3!ss:}'", - "f'{3!ss:s}'", - ]) + self.assertEqual(f"{3.14:!<10.10}", "3.14!!!!!!") + + self.assertAllRaise( + SyntaxError, + "f-string: expecting '}'", + [ + "f'{3!'", + "f'{3!s'", + "f'{3!g'", + ], + ) + + self.assertAllRaise( + SyntaxError, + "f-string: missing conversion character", + [ + "f'{3!}'", + "f'{3!:'", + "f'{3!:}'", + ], + ) + + for conv_identifier in "g", "A", "G", "ä", "ɐ": + self.assertAllRaise( + SyntaxError, + "f-string: invalid conversion character %r: " + "expected 's', 'r', or 'a'" % conv_identifier, + ["f'{3!" + conv_identifier + "}'"], + ) + + for conv_non_identifier in "3", "!": + self.assertAllRaise( + SyntaxError, + "f-string: invalid conversion character", + ["f'{3!" + conv_non_identifier + "}'"], + ) + + for conv in " s", " s ": + self.assertAllRaise( + SyntaxError, + "f-string: conversion type must come right after the" + " exclamanation mark", + ["f'{3!" + conv + "}'"], + ) + + self.assertAllRaise( + SyntaxError, + "f-string: invalid conversion character 'ss': " "expected 's', 'r', or 'a'", + [ + "f'{3!ss}'", + "f'{3!ss:}'", + "f'{3!ss:s}'", + ], + ) def test_assignment(self): - self.assertAllRaise(SyntaxError, r'invalid syntax', - ["f'' = 3", - "f'{0}' = x", - "f'{x}' = x", - ]) + self.assertAllRaise( + SyntaxError, + r"invalid syntax", + [ + "f'' = 3", + "f'{0}' = x", + "f'{x}' = x", + ], + ) def test_del(self): - self.assertAllRaise(SyntaxError, 'invalid syntax', - ["del f''", - "del '' f''", - ]) + self.assertAllRaise( + SyntaxError, + "invalid syntax", + [ + "del f''", + "del '' f''", + ], + ) def test_mismatched_braces(self): - self.assertAllRaise(SyntaxError, "f-string: single '}' is not allowed", - ["f'{{}'", - "f'{{}}}'", - "f'}'", - "f'x}'", - "f'x}x'", - r"f'\u007b}'", - - # Can't have { or } in a format spec. - "f'{3:}>10}'", - "f'{3:}}>10}'", - ]) - - self.assertAllRaise(SyntaxError, "f-string: expecting '}'", - ["f'{3'", - "f'{3!'", - "f'{3:'", - "f'{3!s'", - "f'{3!s:'", - "f'{3!s:3'", - "f'x{'", - "f'x{x'", - "f'{x'", - "f'{3:s'", - "f'{{{'", - "f'{{}}{'", - "f'{'", - "f'{i='", # See gh-93418. - ]) - - self.assertAllRaise(SyntaxError, - "f-string: expecting a valid expression after '{'", - ["f'{3:{{>10}'", - ]) + self.assertAllRaise( + SyntaxError, + "f-string: single '}' is not allowed", + [ + "f'{{}'", + "f'{{}}}'", + "f'}'", + "f'x}'", + "f'x}x'", + r"f'\u007b}'", + # Can't have { or } in a format spec. + "f'{3:}>10}'", + "f'{3:}}>10}'", + ], + ) + + self.assertAllRaise( + SyntaxError, + "f-string: expecting '}'", + [ + "f'{3'", + "f'{3!'", + "f'{3:'", + "f'{3!s'", + "f'{3!s:'", + "f'{3!s:3'", + "f'x{'", + "f'x{x'", + "f'{x'", + "f'{3:s'", + "f'{{{'", + "f'{{}}{'", + "f'{'", + "f'{i='", # See gh-93418. + ], + ) + + self.assertAllRaise( + SyntaxError, + "f-string: expecting a valid expression after '{'", + [ + "f'{3:{{>10}'", + ], + ) # But these are just normal strings. - self.assertEqual(f'{"{"}', '{') - self.assertEqual(f'{"}"}', '}') - self.assertEqual(f'{3:{"}"}>10}', '}}}}}}}}}3') - self.assertEqual(f'{2:{"{"}>10}', '{{{{{{{{{2') + self.assertEqual(f'{"{"}', "{") + self.assertEqual(f'{"}"}', "}") + self.assertEqual(f'{3:{"}"}>10}', "}}}}}}}}}3") + self.assertEqual(f'{2:{"{"}>10}', "{{{{{{{{{2") def test_if_conditional(self): # There's special logic in compile.c to test if the @@ -1392,7 +1540,7 @@ def test_if_conditional(self): def test_fstring(x, expected): flag = 0 - if f'{x}': + if f"{x}": flag = 1 else: flag = 2 @@ -1400,7 +1548,7 @@ def test_fstring(x, expected): def test_concat_empty(x, expected): flag = 0 - if '' f'{x}': + if "" f"{x}": flag = 1 else: flag = 2 @@ -1408,137 +1556,149 @@ def test_concat_empty(x, expected): def test_concat_non_empty(x, expected): flag = 0 - if ' ' f'{x}': + if " " f"{x}": flag = 1 else: flag = 2 self.assertEqual(flag, expected) - test_fstring('', 2) - test_fstring(' ', 1) + test_fstring("", 2) + test_fstring(" ", 1) - test_concat_empty('', 2) - test_concat_empty(' ', 1) + test_concat_empty("", 2) + test_concat_empty(" ", 1) - test_concat_non_empty('', 1) - test_concat_non_empty(' ', 1) + test_concat_non_empty("", 1) + test_concat_non_empty(" ", 1) def test_empty_format_specifier(self): - x = 'test' - self.assertEqual(f'{x}', 'test') - self.assertEqual(f'{x:}', 'test') - self.assertEqual(f'{x!s:}', 'test') - self.assertEqual(f'{x!r:}', "'test'") + x = "test" + self.assertEqual(f"{x}", "test") + self.assertEqual(f"{x:}", "test") + self.assertEqual(f"{x!s:}", "test") + self.assertEqual(f"{x!r:}", "'test'") def test_str_format_differences(self): - d = {'a': 'string', - 0: 'integer', - } + d = { + "a": "string", + 0: "integer", + } a = 0 - self.assertEqual(f'{d[0]}', 'integer') - self.assertEqual(f'{d["a"]}', 'string') - self.assertEqual(f'{d[a]}', 'integer') - self.assertEqual('{d[a]}'.format(d=d), 'string') - self.assertEqual('{d[0]}'.format(d=d), 'integer') + self.assertEqual(f"{d[0]}", "integer") + self.assertEqual(f'{d["a"]}', "string") + self.assertEqual(f"{d[a]}", "integer") + self.assertEqual("{d[a]}".format(d=d), "string") + self.assertEqual("{d[0]}".format(d=d), "integer") def test_errors(self): # see issue 26287 - self.assertAllRaise(TypeError, 'unsupported', - [r"f'{(lambda: 0):x}'", - r"f'{(0,):x}'", - ]) - self.assertAllRaise(ValueError, 'Unknown format code', - [r"f'{1000:j}'", - r"f'{1000:j}'", - ]) + self.assertAllRaise( + TypeError, + "unsupported", + [ + r"f'{(lambda: 0):x}'", + r"f'{(0,):x}'", + ], + ) + self.assertAllRaise( + ValueError, + "Unknown format code", + [ + r"f'{1000:j}'", + r"f'{1000:j}'", + ], + ) def test_filename_in_syntaxerror(self): # see issue 38964 with temp_cwd() as cwd: - file_path = os.path.join(cwd, 't.py') - with open(file_path, 'w', encoding="utf-8") as f: - f.write('f"{a b}"') # This generates a SyntaxError - _, _, stderr = assert_python_failure(file_path, - PYTHONIOENCODING='ascii') - self.assertIn(file_path.encode('ascii', 'backslashreplace'), stderr) + file_path = os.path.join(cwd, "t.py") + with open(file_path, "w", encoding="utf-8") as f: + f.write('f"{a b}"') # This generates a SyntaxError + _, _, stderr = assert_python_failure(file_path, PYTHONIOENCODING="ascii") + self.assertIn(file_path.encode("ascii", "backslashreplace"), stderr) def test_loop(self): for i in range(1000): - self.assertEqual(f'i:{i}', 'i:' + str(i)) + self.assertEqual(f"i:{i}", "i:" + str(i)) def test_dict(self): - d = {'"': 'dquote', - "'": 'squote', - 'foo': 'bar', - } - self.assertEqual(f'''{d["'"]}''', 'squote') - self.assertEqual(f"""{d['"']}""", 'dquote') + d = { + '"': "dquote", + "'": "squote", + "foo": "bar", + } + self.assertEqual(f"""{d["'"]}""", "squote") + self.assertEqual(f"""{d['"']}""", "dquote") - self.assertEqual(f'{d["foo"]}', 'bar') - self.assertEqual(f"{d['foo']}", 'bar') + self.assertEqual(f'{d["foo"]}', "bar") + self.assertEqual(f"{d['foo']}", "bar") def test_backslash_char(self): # Check eval of a backslash followed by a control char. # See bpo-30682: this used to raise an assert in pydebug mode. - self.assertEqual(eval('f"\\\n"'), '') - self.assertEqual(eval('f"\\\r"'), '') + self.assertEqual(eval('f"\\\n"'), "") + self.assertEqual(eval('f"\\\r"'), "") def test_debug_conversion(self): - x = 'A string' - self.assertEqual(f'{x=}', 'x=' + repr(x)) - self.assertEqual(f'{x =}', 'x =' + repr(x)) - self.assertEqual(f'{x=!s}', 'x=' + str(x)) - self.assertEqual(f'{x=!r}', 'x=' + repr(x)) - self.assertEqual(f'{x=!a}', 'x=' + ascii(x)) + x = "A string" + self.assertEqual(f"{x=}", "x=" + repr(x)) + self.assertEqual(f"{x =}", "x =" + repr(x)) + self.assertEqual(f"{x=!s}", "x=" + str(x)) + self.assertEqual(f"{x=!r}", "x=" + repr(x)) + self.assertEqual(f"{x=!a}", "x=" + ascii(x)) x = 2.71828 - self.assertEqual(f'{x=:.2f}', 'x=' + format(x, '.2f')) - self.assertEqual(f'{x=:}', 'x=' + format(x, '')) - self.assertEqual(f'{x=!r:^20}', 'x=' + format(repr(x), '^20')) - self.assertEqual(f'{x=!s:^20}', 'x=' + format(str(x), '^20')) - self.assertEqual(f'{x=!a:^20}', 'x=' + format(ascii(x), '^20')) + self.assertEqual(f"{x=:.2f}", "x=" + format(x, ".2f")) + self.assertEqual(f"{x=:}", "x=" + format(x, "")) + self.assertEqual(f"{x=!r:^20}", "x=" + format(repr(x), "^20")) + self.assertEqual(f"{x=!s:^20}", "x=" + format(str(x), "^20")) + self.assertEqual(f"{x=!a:^20}", "x=" + format(ascii(x), "^20")) x = 9 - self.assertEqual(f'{3*x+15=}', '3*x+15=42') + self.assertEqual(f"{3*x+15=}", "3*x+15=42") # There is code in ast.c that deals with non-ascii expression values. So, # use a unicode identifier to trigger that. tenπ = 31.4 - self.assertEqual(f'{tenπ=:.2f}', 'tenπ=31.40') + self.assertEqual(f"{tenπ=:.2f}", "tenπ=31.40") # Also test with Unicode in non-identifiers. - self.assertEqual(f'{"Σ"=}', '"Σ"=\'Σ\'') + self.assertEqual(f'{"Σ"=}', "\"Σ\"='Σ'") # Make sure nested fstrings still work. - self.assertEqual(f'{f"{3.1415=:.1f}":*^20}', '*****3.1415=3.1*****') + self.assertEqual(f'{f"{3.1415=:.1f}":*^20}', "*****3.1415=3.1*****") # Make sure text before and after an expression with = works # correctly. - pi = 'π' - self.assertEqual(f'alpha α {pi=} ω omega', "alpha α pi='π' ω omega") + pi = "π" + self.assertEqual(f"alpha α {pi=} ω omega", "alpha α pi='π' ω omega") # Check multi-line expressions. - self.assertEqual(f'''{ + self.assertEqual( + f"""{ 3 -=}''', '\n3\n=3') +=}""", + "\n3\n=3", + ) # Since = is handled specially, make sure all existing uses of # it still work. - self.assertEqual(f'{0==1}', 'False') - self.assertEqual(f'{0!=1}', 'True') - self.assertEqual(f'{0<=1}', 'True') - self.assertEqual(f'{0>=1}', 'False') - self.assertEqual(f'{(x:="5")}', '5') - self.assertEqual(x, '5') - self.assertEqual(f'{(x:=5)}', '5') + self.assertEqual(f"{0==1}", "False") + self.assertEqual(f"{0!=1}", "True") + self.assertEqual(f"{0<=1}", "True") + self.assertEqual(f"{0>=1}", "False") + self.assertEqual(f'{(x:="5")}', "5") + self.assertEqual(x, "5") + self.assertEqual(f"{(x:=5)}", "5") self.assertEqual(x, 5) - self.assertEqual(f'{"="}', '=') + self.assertEqual(f'{"="}', "=") x = 20 # This isn't an assignment expression, it's 'x', with a format # spec of '=10'. See test_walrus: you need to use parens. - self.assertEqual(f'{x:=10}', ' 20') + self.assertEqual(f"{x:=10}", " 20") # Test named function parameters, to make sure '=' parsing works # there. @@ -1547,40 +1707,53 @@ def f(a): oldx = x x = a return oldx + x = 0 - self.assertEqual(f'{f(a="3=")}', '0') - self.assertEqual(x, '3=') - self.assertEqual(f'{f(a=4)}', '3=') + self.assertEqual(f'{f(a="3=")}', "0") + self.assertEqual(x, "3=") + self.assertEqual(f"{f(a=4)}", "3=") self.assertEqual(x, 4) + # Check debug expressions in format spec + y = 20 + self.assertEqual(f"{2:{y=}}", "yyyyyyyyyyyyyyyyyyy2") + self.assertEqual( + f"{datetime.datetime.now():h1{y=}h2{y=}h3{y=}}", "h1y=20h2y=20h3y=20" + ) + # Make sure __format__ is being called. class C: def __format__(self, s): - return f'FORMAT-{s}' + return f"FORMAT-{s}" + def __repr__(self): - return 'REPR' + return "REPR" - self.assertEqual(f'{C()=}', 'C()=REPR') - self.assertEqual(f'{C()=!r}', 'C()=REPR') - self.assertEqual(f'{C()=:}', 'C()=FORMAT-') - self.assertEqual(f'{C()=: }', 'C()=FORMAT- ') - self.assertEqual(f'{C()=:x}', 'C()=FORMAT-x') - self.assertEqual(f'{C()=!r:*^20}', 'C()=********REPR********') + self.assertEqual(f"{C()=}", "C()=REPR") + self.assertEqual(f"{C()=!r}", "C()=REPR") + self.assertEqual(f"{C()=:}", "C()=FORMAT-") + self.assertEqual(f"{C()=: }", "C()=FORMAT- ") + self.assertEqual(f"{C()=:x}", "C()=FORMAT-x") + self.assertEqual(f"{C()=!r:*^20}", "C()=********REPR********") + self.assertEqual(f"{C():{20=}}", "FORMAT-20=20") self.assertRaises(SyntaxError, eval, "f'{C=]'") # Make sure leading and following text works. - x = 'foo' - self.assertEqual(f'X{x=}Y', 'Xx='+repr(x)+'Y') + x = "foo" + self.assertEqual(f"X{x=}Y", "Xx=" + repr(x) + "Y") # Make sure whitespace around the = works. - self.assertEqual(f'X{x =}Y', 'Xx ='+repr(x)+'Y') - self.assertEqual(f'X{x= }Y', 'Xx= '+repr(x)+'Y') - self.assertEqual(f'X{x = }Y', 'Xx = '+repr(x)+'Y') + self.assertEqual(f"X{x =}Y", "Xx =" + repr(x) + "Y") + self.assertEqual(f"X{x= }Y", "Xx= " + repr(x) + "Y") + self.assertEqual(f"X{x = }Y", "Xx = " + repr(x) + "Y") self.assertEqual(f"sadsd {1 + 1 = :{1 + 1:1d}f}", "sadsd 1 + 1 = 2.000000") - self.assertEqual(f"{1+2 = # my comment - }", '1+2 = \n 3') + self.assertEqual( + f"{1+2 = # my comment + }", + "1+2 = \n 3", + ) # These next lines contains tabs. Backslash escapes don't # work in f-strings. @@ -1588,56 +1761,59 @@ def __repr__(self): # this will be to dynamically created and exec the f-strings. But # that's such a hassle I'll save it for another day. For now, convert # the tabs to spaces just to shut up patchcheck. - #self.assertEqual(f'X{x =}Y', 'Xx\t='+repr(x)+'Y') - #self.assertEqual(f'X{x = }Y', 'Xx\t=\t'+repr(x)+'Y') + # self.assertEqual(f'X{x =}Y', 'Xx\t='+repr(x)+'Y') + # self.assertEqual(f'X{x = }Y', 'Xx\t=\t'+repr(x)+'Y') def test_walrus(self): x = 20 # This isn't an assignment expression, it's 'x', with a format # spec of '=10'. - self.assertEqual(f'{x:=10}', ' 20') + self.assertEqual(f"{x:=10}", " 20") # This is an assignment expression, which requires parens. - self.assertEqual(f'{(x:=10)}', '10') + self.assertEqual(f"{(x:=10)}", "10") self.assertEqual(x, 10) def test_invalid_syntax_error_message(self): - with self.assertRaisesRegex(SyntaxError, - "f-string: expecting '=', or '!', or ':', or '}'"): + with self.assertRaisesRegex( + SyntaxError, "f-string: expecting '=', or '!', or ':', or '}'" + ): compile("f'{a $ b}'", "?", "exec") def test_with_two_commas_in_format_specifier(self): error_msg = re.escape("Cannot specify ',' with ','.") with self.assertRaisesRegex(ValueError, error_msg): - f'{1:,,}' + f"{1:,,}" def test_with_two_underscore_in_format_specifier(self): error_msg = re.escape("Cannot specify '_' with '_'.") with self.assertRaisesRegex(ValueError, error_msg): - f'{1:__}' + f"{1:__}" def test_with_a_commas_and_an_underscore_in_format_specifier(self): error_msg = re.escape("Cannot specify both ',' and '_'.") with self.assertRaisesRegex(ValueError, error_msg): - f'{1:,_}' + f"{1:,_}" def test_with_an_underscore_and_a_comma_in_format_specifier(self): error_msg = re.escape("Cannot specify both ',' and '_'.") with self.assertRaisesRegex(ValueError, error_msg): - f'{1:_,}' + f"{1:_,}" def test_syntax_error_for_starred_expressions(self): with self.assertRaisesRegex(SyntaxError, "can't use starred expression here"): compile("f'{*a}'", "?", "exec") - with self.assertRaisesRegex(SyntaxError, - "f-string: expecting a valid expression after '{'"): + with self.assertRaisesRegex( + SyntaxError, "f-string: expecting a valid expression after '{'" + ): compile("f'{**a}'", "?", "exec") def test_not_closing_quotes(self): self.assertAllRaise(SyntaxError, "unterminated f-string literal", ['f"', "f'"]) - self.assertAllRaise(SyntaxError, "unterminated triple-quoted f-string literal", - ['f"""', "f'''"]) + self.assertAllRaise( + SyntaxError, "unterminated triple-quoted f-string literal", ['f"""', "f'''"] + ) # Ensure that the errors are reported at the correct line number. data = '''\ x = 1 + 1 @@ -1653,42 +1829,52 @@ def test_not_closing_quotes(self): except SyntaxError as e: self.assertEqual(e.text, 'z = f"""') self.assertEqual(e.lineno, 3) + def test_syntax_error_after_debug(self): - self.assertAllRaise(SyntaxError, "f-string: expecting a valid expression after '{'", - [ - "f'{1=}{;'", - "f'{1=}{+;'", - "f'{1=}{2}{;'", - "f'{1=}{3}{;'", - ]) - self.assertAllRaise(SyntaxError, "f-string: expecting '=', or '!', or ':', or '}'", - [ - "f'{1=}{1;'", - "f'{1=}{1;}'", - ]) + self.assertAllRaise( + SyntaxError, + "f-string: expecting a valid expression after '{'", + [ + "f'{1=}{;'", + "f'{1=}{+;'", + "f'{1=}{2}{;'", + "f'{1=}{3}{;'", + ], + ) + self.assertAllRaise( + SyntaxError, + "f-string: expecting '=', or '!', or ':', or '}'", + [ + "f'{1=}{1;'", + "f'{1=}{1;}'", + ], + ) def test_debug_in_file(self): with temp_cwd(): - script = 'script.py' - with open('script.py', 'w') as f: + script = "script.py" + with open("script.py", "w") as f: f.write(f"""\ print(f'''{{ 3 =}}''')""") _, stdout, _ = assert_python_ok(script) - self.assertEqual(stdout.decode('utf-8').strip().replace('\r\n', '\n').replace('\r', '\n'), - "3\n=3") + self.assertEqual( + stdout.decode("utf-8").strip().replace("\r\n", "\n").replace("\r", "\n"), + "3\n=3", + ) def test_syntax_warning_infinite_recursion_in_file(self): with temp_cwd(): - script = 'script.py' - with open(script, 'w') as f: + script = "script.py" + with open(script, "w") as f: f.write(r"print(f'\{1}')") _, stdout, stderr = assert_python_ok(script) - self.assertIn(rb'\1', stdout) + self.assertIn(rb"\1", stdout) self.assertEqual(len(stderr.strip().splitlines()), 2) -if __name__ == '__main__': + +if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_funcattrs.py b/Lib/test/test_funcattrs.py index 35b473d5..7ab1b0b5 100644 --- a/Lib/test/test_funcattrs.py +++ b/Lib/test/test_funcattrs.py @@ -76,7 +76,12 @@ def test___globals__(self): (AttributeError, TypeError)) def test___builtins__(self): - self.assertIs(self.b.__builtins__, __builtins__) + if __name__ == "__main__": + builtins_dict = __builtins__.__dict__ + else: + builtins_dict = __builtins__ + + self.assertIs(self.b.__builtins__, builtins_dict) self.cannot_set_attr(self.b, '__builtins__', 2, (AttributeError, TypeError)) @@ -86,7 +91,7 @@ def func(s): return len(s) ns = {} func2 = type(func)(func.__code__, ns) self.assertIs(func2.__globals__, ns) - self.assertIs(func2.__builtins__, __builtins__) + self.assertIs(func2.__builtins__, builtins_dict) # Make sure that the function actually works. self.assertEqual(func2("abc"), 3) diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py index 7f1b80a5..ff71fd53 100644 --- a/Lib/test/test_functools.py +++ b/Lib/test/test_functools.py @@ -564,6 +564,14 @@ class B: method = functools.partialmethod(func=capture, a=1) def test_repr(self): + self.assertEqual(repr(vars(self.A)['nothing']), + 'functools.partialmethod({})'.format(capture)) + self.assertEqual(repr(vars(self.A)['positional']), + 'functools.partialmethod({}, 1)'.format(capture)) + self.assertEqual(repr(vars(self.A)['keywords']), + 'functools.partialmethod({}, a=2)'.format(capture)) + self.assertEqual(repr(vars(self.A)['spec_keywords']), + 'functools.partialmethod({}, self=1, func=2)'.format(capture)) self.assertEqual(repr(vars(self.A)['both']), 'functools.partialmethod({}, 3, b=4)'.format(capture)) diff --git a/Lib/test/test_future_stmt/test_future.py b/Lib/test/test_future_stmt/test_future.py index 5a85e08e..a06e0510 100644 --- a/Lib/test/test_future_stmt/test_future.py +++ b/Lib/test/test_future_stmt/test_future.py @@ -55,7 +55,7 @@ def test_future_multiple_features(self): def test_badfuture3(self): with self.assertRaises(SyntaxError) as cm: from test.test_future_stmt import badsyntax_future3 - self.check_syntax_error(cm.exception, "badsyntax_future3", 3) + self.check_syntax_error(cm.exception, "badsyntax_future3", 3, 24) def test_badfuture4(self): with self.assertRaises(SyntaxError) as cm: @@ -80,12 +80,12 @@ def test_badfuture7(self): def test_badfuture8(self): with self.assertRaises(SyntaxError) as cm: from test.test_future_stmt import badsyntax_future8 - self.check_syntax_error(cm.exception, "badsyntax_future8", 3) + self.check_syntax_error(cm.exception, "badsyntax_future8", 3, 24) def test_badfuture9(self): with self.assertRaises(SyntaxError) as cm: from test.test_future_stmt import badsyntax_future9 - self.check_syntax_error(cm.exception, "badsyntax_future9", 3) + self.check_syntax_error(cm.exception, "badsyntax_future9", 3, 39) def test_badfuture10(self): with self.assertRaises(SyntaxError) as cm: diff --git a/Lib/test/test_gdb/__init__.py b/Lib/test/test_gdb/__init__.py index 99557739..0dd72178 100644 --- a/Lib/test/test_gdb/__init__.py +++ b/Lib/test/test_gdb/__init__.py @@ -24,6 +24,9 @@ if support.check_cflags_pgo(): raise unittest.SkipTest("test_gdb is not reliable on PGO builds") +if support.check_bolt_optimized(): + raise unittest.SkipTest("test_gdb is not reliable on BOLT optimized builds") + def load_tests(*args): return support.load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_generators.py b/Lib/test/test_generators.py index e0da9152..ea6eada0 100644 --- a/Lib/test/test_generators.py +++ b/Lib/test/test_generators.py @@ -6,6 +6,7 @@ import unittest import weakref import inspect +import types from test import support @@ -89,9 +90,12 @@ def gen(): self.assertEqual(gc.garbage, old_garbage) def test_lambda_generator(self): - # Issue #23192: Test that a lambda returning a generator behaves + # bpo-23192, gh-119897: Test that a lambda returning a generator behaves # like the equivalent function f = lambda: (yield 1) + self.assertIsInstance(f(), types.GeneratorType) + self.assertEqual(next(f()), 1) + def g(): return (yield 1) # test 'yield from' @@ -450,26 +454,6 @@ def g(): self.assertIsInstance(cm.exception.value, StopIteration) self.assertEqual(cm.exception.value.value, 2) - def test_close_releases_frame_locals(self): - # See gh-118272 - - class Foo: - pass - - f = Foo() - f_wr = weakref.ref(f) - - def genfn(): - a = f - yield - - g = genfn() - next(g) - del f - g.close() - support.gc_collect() - self.assertIsNone(f_wr()) - class GeneratorThrowTest(unittest.TestCase): @@ -2161,6 +2145,16 @@ def printsolution(self, x): ... SyntaxError: 'yield' outside function +>>> f=lambda: (yield from (1,2)), (yield from (3,4)) +Traceback (most recent call last): + ... +SyntaxError: 'yield from' outside function + +>>> yield from [1,2] +Traceback (most recent call last): + ... +SyntaxError: 'yield from' outside function + >>> def f(): x = yield = y Traceback (most recent call last): ... diff --git a/Lib/test/test_genericpath.py b/Lib/test/test_genericpath.py index bdfc5bfe..3eefb722 100644 --- a/Lib/test/test_genericpath.py +++ b/Lib/test/test_genericpath.py @@ -158,6 +158,11 @@ def test_exists(self): self.assertIs(self.pathmodule.lexists(filename + '\x00'), False) self.assertIs(self.pathmodule.lexists(bfilename + b'\x00'), False) + # Keyword arguments are accepted + self.assertIs(self.pathmodule.exists(path=filename), True) + if self.pathmodule is not genericpath: + self.assertIs(self.pathmodule.lexists(path=filename), True) + @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") @unittest.skipIf(is_emscripten, "Emscripten pipe fds have no stat") def test_exists_fd(self): diff --git a/Lib/test/test_getopt.py b/Lib/test/test_getopt.py index c8b3442d..2b7d0c4c 100644 --- a/Lib/test/test_getopt.py +++ b/Lib/test/test_getopt.py @@ -1,11 +1,12 @@ # test_getopt.py # David Goodger 2000-08-19 -from test.support.os_helper import EnvironmentVarGuard import doctest -import unittest - import getopt +import sys +import unittest +from test.support.i18n_helper import TestTranslationsBase, update_translation_snapshots +from test.support.os_helper import EnvironmentVarGuard sentinel = object() @@ -173,10 +174,20 @@ def test_libref_examples(): ['a1', 'a2'] """ + +class TestTranslations(TestTranslationsBase): + def test_translations(self): + self.assertMsgidsEqual(getopt) + + def load_tests(loader, tests, pattern): tests.addTest(doctest.DocTestSuite()) return tests -if __name__ == "__main__": +if __name__ == '__main__': + # To regenerate translation snapshots + if len(sys.argv) > 1 and sys.argv[1] == '--snapshot-update': + update_translation_snapshots(getopt) + sys.exit(0) unittest.main() diff --git a/Lib/test/test_getpath.py b/Lib/test/test_getpath.py index b9cbe1d9..3b613a56 100644 --- a/Lib/test/test_getpath.py +++ b/Lib/test/test_getpath.py @@ -557,7 +557,7 @@ def test_framework_macos(self): ns.add_known_dir("/Library/Frameworks/Python.framework/Versions/9.8/lib/python9.8/lib-dynload") ns.add_known_file("/Library/Frameworks/Python.framework/Versions/9.8/lib/python9.8/os.py") - # This is definitely not the stdlib (see discusion in bpo-46890) + # This is definitely not the stdlib (see discussion in bpo-46890) #ns.add_known_file("/Library/Frameworks/lib/python98.zip") expected = dict( @@ -605,7 +605,7 @@ def test_alt_framework_macos(self): ns.add_known_dir("/Library/Frameworks/DebugPython.framework/Versions/9.8/lib/python9.8/lib-dynload") ns.add_known_xfile("/Library/Frameworks/DebugPython.framework/Versions/9.8/lib/python9.8/os.py") - # This is definitely not the stdlib (see discusion in bpo-46890) + # This is definitely not the stdlib (see discussion in bpo-46890) #ns.add_known_xfile("/Library/lib/python98.zip") expected = dict( executable="/Library/Frameworks/DebugPython.framework/Versions/9.8/bin/python9.8", diff --git a/Lib/test/test_http_cookies.py b/Lib/test/test_http_cookies.py index 925c8697..8879902a 100644 --- a/Lib/test/test_http_cookies.py +++ b/Lib/test/test_http_cookies.py @@ -5,6 +5,7 @@ import doctest from http import cookies import pickle +from test import support class CookieTests(unittest.TestCase): @@ -58,6 +59,43 @@ def test_basic(self): for k, v in sorted(case['dict'].items()): self.assertEqual(C[k].value, v) + def test_unquote(self): + cases = [ + (r'a="b=\""', 'b="'), + (r'a="b=\\"', 'b=\\'), + (r'a="b=\="', 'b=='), + (r'a="b=\n"', 'b=n'), + (r'a="b=\042"', 'b="'), + (r'a="b=\134"', 'b=\\'), + (r'a="b=\377"', 'b=\xff'), + (r'a="b=\400"', 'b=400'), + (r'a="b=\42"', 'b=42'), + (r'a="b=\\042"', 'b=\\042'), + (r'a="b=\\134"', 'b=\\134'), + (r'a="b=\\\""', 'b=\\"'), + (r'a="b=\\\042"', 'b=\\"'), + (r'a="b=\134\""', 'b=\\"'), + (r'a="b=\134\042"', 'b=\\"'), + ] + for encoded, decoded in cases: + with self.subTest(encoded): + C = cookies.SimpleCookie() + C.load(encoded) + self.assertEqual(C['a'].value, decoded) + + @support.requires_resource('cpu') + def test_unquote_large(self): + n = 10**6 + for encoded in r'\\', r'\134': + with self.subTest(encoded): + data = 'a="b=' + encoded*n + ';"' + C = cookies.SimpleCookie() + C.load(data) + value = C['a'].value + self.assertEqual(value[:3], 'b=\\') + self.assertEqual(value[-2:], '\\;') + self.assertEqual(len(value), n + 3) + def test_load(self): C = cookies.SimpleCookie() C.load('Customer="WILE_E_COYOTE"; Version=1; Path=/acme') diff --git a/Lib/test/test_imaplib.py b/Lib/test/test_imaplib.py index 69f995f4..1d701281 100644 --- a/Lib/test/test_imaplib.py +++ b/Lib/test/test_imaplib.py @@ -57,7 +57,7 @@ def timevalues(self): timezone(timedelta(0, 2 * 60 * 60))), '"18-May-2033 05:33:20 +0200"'] - @run_with_locale('LC_ALL', 'de_DE', 'fr_FR') + @run_with_locale('LC_ALL', 'de_DE', 'fr_FR', '') # DST rules included to work around quirk where the Gnu C library may not # otherwise restore the previous time zone @run_with_tz('STD-1DST,M3.2.0,M11.1.0') diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py index c6accc41..81b2f33a 100644 --- a/Lib/test/test_import/__init__.py +++ b/Lib/test/test_import/__init__.py @@ -787,6 +787,19 @@ def test_issue105979(self): self.assertIn("Frozen object named 'x' is invalid", str(cm.exception)) + def test_create_dynamic_null(self): + with self.assertRaisesRegex(ValueError, 'embedded null character'): + class Spec: + name = "a\x00b" + origin = "abc" + _imp.create_dynamic(Spec()) + + with self.assertRaisesRegex(ValueError, 'embedded null character'): + class Spec2: + name = "abc" + origin = "a\x00b" + _imp.create_dynamic(Spec2()) + @skip_if_dont_write_bytecode class FilePermissionTests(unittest.TestCase): diff --git a/Lib/test/test_importlib/fixtures.py b/Lib/test/test_importlib/fixtures.py index 73e5da2b..9339d68f 100644 --- a/Lib/test/test_importlib/fixtures.py +++ b/Lib/test/test_importlib/fixtures.py @@ -245,6 +245,44 @@ def setUp(self): build_files(EggInfoPkgPipInstalledNoToplevel.files, prefix=self.site_dir) +class EggInfoPkgPipInstalledExternalDataFiles(OnSysPath, SiteDir): + files: FilesSpec = { + "egg_with_module_pkg.egg-info": { + "PKG-INFO": "Name: egg_with_module-pkg", + # SOURCES.txt is made from the source archive, and contains files + # (setup.py) that are not present after installation. + "SOURCES.txt": """ + egg_with_module.py + setup.py + egg_with_module.json + egg_with_module_pkg.egg-info/PKG-INFO + egg_with_module_pkg.egg-info/SOURCES.txt + egg_with_module_pkg.egg-info/top_level.txt + """, + # installed-files.txt is written by pip, and is a strictly more + # accurate source than SOURCES.txt as to the installed contents of + # the package. + "installed-files.txt": """ + ../../../etc/jupyter/jupyter_notebook_config.d/relative.json + /etc/jupyter/jupyter_notebook_config.d/absolute.json + ../egg_with_module.py + PKG-INFO + SOURCES.txt + top_level.txt + """, + # missing top_level.txt (to trigger fallback to installed-files.txt) + }, + "egg_with_module.py": """ + def main(): + print("hello world") + """, + } + + def setUp(self): + super().setUp() + build_files(EggInfoPkgPipInstalledExternalDataFiles.files, prefix=self.site_dir) + + class EggInfoPkgPipInstalledNoModules(OnSysPath, SiteDir): files: FilesSpec = { "egg_with_no_modules_pkg.egg-info": { diff --git a/Lib/test/test_importlib/resources/test_files.py b/Lib/test/test_importlib/resources/test_files.py index 26c8b04e..038aac0a 100644 --- a/Lib/test/test_importlib/resources/test_files.py +++ b/Lib/test/test_importlib/resources/test_files.py @@ -108,6 +108,42 @@ def test_implicit_files(self): _path.build(spec, self.site_dir) assert importlib.import_module('somepkg').val == 'resources are the best' + def test_implicit_files_zip_submodule(self): + """ + Special test for gh-121735 for Python 3.12. + """ + import os + import zipfile + + def create_zip_from_directory(source_dir, zip_filename): + with zipfile.ZipFile(zip_filename, 'w') as zipf: + for root, _, files in os.walk(source_dir): + for file in files: + file_path = os.path.join(root, file) + # Ensure files are at the root + arcname = os.path.relpath(file_path, source_dir) + zipf.write(file_path, arcname) + + set_val = textwrap.dedent( + """ + import importlib.resources as res + val = res.files().joinpath('res.txt').read_text(encoding='utf-8') + """ + ) + spec = { + 'somepkg': { + '__init__.py': set_val, + 'submod.py': set_val, + 'res.txt': 'resources are the best', + }, + } + build_dir = self.fixtures.enter_context(os_helper.temp_dir()) + _path.build(spec, build_dir) + zip_file = os.path.join(self.site_dir, 'thepkg.zip') + create_zip_from_directory(build_dir, zip_file) + self.fixtures.enter_context(import_helper.DirsOnSysPath(zip_file)) + assert importlib.import_module('somepkg.submod').val == 'resources are the best' + if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_importlib/test_api.py b/Lib/test/test_importlib/test_api.py index ecf2c47c..ef01a3f6 100644 --- a/Lib/test/test_importlib/test_api.py +++ b/Lib/test/test_importlib/test_api.py @@ -8,6 +8,8 @@ import sys from test.support import import_helper from test.support import os_helper +from test import support +import traceback import types import unittest import warnings @@ -354,6 +356,20 @@ def test_module_missing_spec(self): with self.assertRaises(ModuleNotFoundError): self.init.reload(module) + def test_reload_traceback_with_non_str(self): + # gh-125519 + with support.captured_stdout() as stdout: + try: + self.init.reload("typing") + except TypeError as exc: + traceback.print_exception(exc, file=stdout) + else: + self.fail("Expected TypeError to be raised") + printed_traceback = stdout.getvalue() + self.assertIn("TypeError", printed_traceback) + self.assertNotIn("AttributeError", printed_traceback) + self.assertNotIn("module.__spec__.name", printed_traceback) + (Frozen_ReloadTests, Source_ReloadTests diff --git a/Lib/test/test_importlib/test_metadata_api.py b/Lib/test/test_importlib/test_metadata_api.py index 33c6e85e..29b261ba 100644 --- a/Lib/test/test_importlib/test_metadata_api.py +++ b/Lib/test/test_importlib/test_metadata_api.py @@ -29,6 +29,7 @@ class APITests( fixtures.EggInfoPkg, fixtures.EggInfoPkgPipInstalledNoToplevel, fixtures.EggInfoPkgPipInstalledNoModules, + fixtures.EggInfoPkgPipInstalledExternalDataFiles, fixtures.EggInfoPkgSourcesFallback, fixtures.DistInfoPkg, fixtures.DistInfoPkgWithDot, diff --git a/Lib/test/test_importlib/test_util.py b/Lib/test/test_importlib/test_util.py index e018af2e..553e2087 100644 --- a/Lib/test/test_importlib/test_util.py +++ b/Lib/test/test_importlib/test_util.py @@ -6,12 +6,14 @@ importlib_util = util.import_importlib('importlib.util') import importlib.util +from importlib import _bootstrap_external import os import pathlib import re import string import sys from test import support +from test.support import os_helper import textwrap import types import unittest @@ -758,5 +760,35 @@ def test_complete_multi_phase_init_module(self): self.run_with_own_gil(script) +class MiscTests(unittest.TestCase): + def test_atomic_write_should_notice_incomplete_writes(self): + import _pyio + + oldwrite = os.write + seen_write = False + + truncate_at_length = 100 + + # Emulate an os.write that only writes partial data. + def write(fd, data): + nonlocal seen_write + seen_write = True + return oldwrite(fd, data[:truncate_at_length]) + + # Need to patch _io to be _pyio, so that io.FileIO is affected by the + # os.write patch. + with (support.swap_attr(_bootstrap_external, '_io', _pyio), + support.swap_attr(os, 'write', write)): + with self.assertRaises(OSError): + # Make sure we write something longer than the point where we + # truncate. + content = b'x' * (truncate_at_length * 2) + _bootstrap_external._write_atomic(os_helper.TESTFN, content) + assert seen_write + + with self.assertRaises(OSError): + os.stat(support.os_helper.TESTFN) # Check that the file did not get written. + + if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_inspect/inspect_stringized_annotations_pep695.py b/Lib/test/test_inspect/inspect_stringized_annotations_pep695.py new file mode 100644 index 00000000..39bfe2ed --- /dev/null +++ b/Lib/test/test_inspect/inspect_stringized_annotations_pep695.py @@ -0,0 +1,87 @@ +from __future__ import annotations +from typing import Callable, Unpack + + +class A[T, *Ts, **P]: + x: T + y: tuple[*Ts] + z: Callable[P, str] + + +class B[T, *Ts, **P]: + T = int + Ts = str + P = bytes + x: T + y: Ts + z: P + + +Eggs = int +Spam = str + + +class C[Eggs, **Spam]: + x: Eggs + y: Spam + + +def generic_function[T, *Ts, **P]( + x: T, *y: Unpack[Ts], z: P.args, zz: P.kwargs +) -> None: ... + + +def generic_function_2[Eggs, **Spam](x: Eggs, y: Spam): pass + + +class D: + Foo = int + Bar = str + + def generic_method[Foo, **Bar]( + self, x: Foo, y: Bar + ) -> None: ... + + def generic_method_2[Eggs, **Spam](self, x: Eggs, y: Spam): pass + + +# Eggs is `int` in globals, a TypeVar in type_params, and `str` in locals: +class E[Eggs]: + Eggs = str + x: Eggs + + + +def nested(): + from types import SimpleNamespace + from inspect import get_annotations + + Eggs = bytes + Spam = memoryview + + + class F[Eggs, **Spam]: + x: Eggs + y: Spam + + def generic_method[Eggs, **Spam](self, x: Eggs, y: Spam): pass + + + def generic_function[Eggs, **Spam](x: Eggs, y: Spam): pass + + + # Eggs is `int` in globals, `bytes` in the function scope, + # a TypeVar in the type_params, and `str` in locals: + class G[Eggs]: + Eggs = str + x: Eggs + + + return SimpleNamespace( + F=F, + F_annotations=get_annotations(F, eval_str=True), + F_meth_annotations=get_annotations(F.generic_method, eval_str=True), + G_annotations=get_annotations(G, eval_str=True), + generic_func=generic_function, + generic_func_annotations=get_annotations(generic_function, eval_str=True) + ) diff --git a/Lib/test/test_inspect/test_inspect.py b/Lib/test/test_inspect/test_inspect.py index 4a6d2b3e..7d3153db 100644 --- a/Lib/test/test_inspect/test_inspect.py +++ b/Lib/test/test_inspect/test_inspect.py @@ -17,6 +17,7 @@ import sys import types import textwrap +from typing import Unpack import unicodedata import unittest import unittest.mock @@ -40,6 +41,7 @@ from test.test_inspect import inspect_stock_annotations from test.test_inspect import inspect_stringized_annotations from test.test_inspect import inspect_stringized_annotations_2 +from test.test_inspect import inspect_stringized_annotations_pep695 # Functions tested in this suite: @@ -199,6 +201,7 @@ def test_iscoroutine(self): inspect.iscoroutinefunction( functools.partial(functools.partial( gen_coroutine_function_example)))) + self.assertFalse(inspect.iscoroutinefunction(inspect)) self.assertFalse(inspect.iscoroutine(gen_coro)) self.assertTrue( @@ -1361,6 +1364,56 @@ def f(self): self.assertIn(('f', b.f), inspect.getmembers(b)) self.assertIn(('f', b.f), inspect.getmembers(b, inspect.ismethod)) + def test_getmembers_custom_dir(self): + class CorrectDir: + def __init__(self, attr): + self.attr = attr + def method(self): + return self.attr + 1 + def __dir__(self): + return ['attr', 'method'] + + cd = CorrectDir(5) + self.assertEqual(inspect.getmembers(cd), [ + ('attr', 5), + ('method', cd.method), + ]) + self.assertEqual(inspect.getmembers(cd, inspect.ismethod), [ + ('method', cd.method), + ]) + + def test_getmembers_custom_broken_dir(self): + # inspect.getmembers calls `dir()` on the passed object inside. + # if `__dir__` mentions some non-existent attribute, + # we still need to return others correctly. + class BrokenDir: + existing = 1 + def method(self): + return self.existing + 1 + def __dir__(self): + return ['method', 'missing', 'existing'] + + bd = BrokenDir() + self.assertEqual(inspect.getmembers(bd), [ + ('existing', 1), + ('method', bd.method), + ]) + self.assertEqual(inspect.getmembers(bd, inspect.ismethod), [ + ('method', bd.method), + ]) + + def test_getmembers_custom_duplicated_dir(self): + # Duplicates in `__dir__` must not fail and return just one result. + class DuplicatedDir: + attr = 1 + def __dir__(self): + return ['attr', 'attr'] + + dd = DuplicatedDir() + self.assertEqual(inspect.getmembers(dd), [ + ('attr', 1), + ]) + def test_getmembers_VirtualAttribute(self): class M(type): def __getattr__(cls, name): @@ -1504,6 +1557,117 @@ def wrapper(a, b): self.assertEqual(inspect.get_annotations(isa.MyClassWithLocalAnnotations), {'x': 'mytype'}) self.assertEqual(inspect.get_annotations(isa.MyClassWithLocalAnnotations, eval_str=True), {'x': int}) + def test_pep695_generic_class_with_future_annotations(self): + ann_module695 = inspect_stringized_annotations_pep695 + A_annotations = inspect.get_annotations(ann_module695.A, eval_str=True) + A_type_params = ann_module695.A.__type_params__ + self.assertIs(A_annotations["x"], A_type_params[0]) + self.assertEqual(A_annotations["y"].__args__[0], Unpack[A_type_params[1]]) + self.assertIs(A_annotations["z"].__args__[0], A_type_params[2]) + + def test_pep695_generic_class_with_future_annotations_and_local_shadowing(self): + B_annotations = inspect.get_annotations( + inspect_stringized_annotations_pep695.B, eval_str=True + ) + self.assertEqual(B_annotations, {"x": int, "y": str, "z": bytes}) + + def test_pep695_generic_class_with_future_annotations_name_clash_with_global_vars(self): + ann_module695 = inspect_stringized_annotations_pep695 + C_annotations = inspect.get_annotations(ann_module695.C, eval_str=True) + self.assertEqual( + set(C_annotations.values()), + set(ann_module695.C.__type_params__) + ) + + def test_pep_695_generic_function_with_future_annotations(self): + ann_module695 = inspect_stringized_annotations_pep695 + generic_func_annotations = inspect.get_annotations( + ann_module695.generic_function, eval_str=True + ) + func_t_params = ann_module695.generic_function.__type_params__ + self.assertEqual( + generic_func_annotations.keys(), {"x", "y", "z", "zz", "return"} + ) + self.assertIs(generic_func_annotations["x"], func_t_params[0]) + self.assertEqual(generic_func_annotations["y"], Unpack[func_t_params[1]]) + self.assertIs(generic_func_annotations["z"].__origin__, func_t_params[2]) + self.assertIs(generic_func_annotations["zz"].__origin__, func_t_params[2]) + + def test_pep_695_generic_function_with_future_annotations_name_clash_with_global_vars(self): + self.assertEqual( + set( + inspect.get_annotations( + inspect_stringized_annotations_pep695.generic_function_2, + eval_str=True + ).values() + ), + set( + inspect_stringized_annotations_pep695.generic_function_2.__type_params__ + ) + ) + + def test_pep_695_generic_method_with_future_annotations(self): + ann_module695 = inspect_stringized_annotations_pep695 + generic_method_annotations = inspect.get_annotations( + ann_module695.D.generic_method, eval_str=True + ) + params = { + param.__name__: param + for param in ann_module695.D.generic_method.__type_params__ + } + self.assertEqual( + generic_method_annotations, + {"x": params["Foo"], "y": params["Bar"], "return": None} + ) + + def test_pep_695_generic_method_with_future_annotations_name_clash_with_global_vars(self): + self.assertEqual( + set( + inspect.get_annotations( + inspect_stringized_annotations_pep695.D.generic_method_2, + eval_str=True + ).values() + ), + set( + inspect_stringized_annotations_pep695.D.generic_method_2.__type_params__ + ) + ) + + def test_pep_695_generic_method_with_future_annotations_name_clash_with_global_and_local_vars(self): + self.assertEqual( + inspect.get_annotations( + inspect_stringized_annotations_pep695.E, eval_str=True + ), + {"x": str}, + ) + + def test_pep_695_generics_with_future_annotations_nested_in_function(self): + results = inspect_stringized_annotations_pep695.nested() + + self.assertEqual( + set(results.F_annotations.values()), + set(results.F.__type_params__) + ) + self.assertEqual( + set(results.F_meth_annotations.values()), + set(results.F.generic_method.__type_params__) + ) + self.assertNotEqual( + set(results.F_meth_annotations.values()), + set(results.F.__type_params__) + ) + self.assertEqual( + set(results.F_meth_annotations.values()).intersection(results.F.__type_params__), + set() + ) + + self.assertEqual(results.G_annotations, {"x": str}) + + self.assertEqual( + set(results.generic_func_annotations.values()), + set(results.generic_func.__type_params__) + ) + class TestFormatAnnotation(unittest.TestCase): def test_typing_replacement(self): @@ -1616,6 +1780,19 @@ def g(local_ref): builtin_vars, unbound_names) self.assertEqual(inspect.getclosurevars(C().f(_arg)), expected) + def test_attribute_same_name_as_global_var(self): + class C: + _global_ref = object() + def f(): + print(C._global_ref, _global_ref) + nonlocal_vars = {"C": C} + global_vars = {"_global_ref": _global_ref} + builtin_vars = {"print": print} + unbound_names = {"_global_ref"} + expected = inspect.ClosureVars(nonlocal_vars, global_vars, + builtin_vars, unbound_names) + self.assertEqual(inspect.getclosurevars(f), expected) + def test_nonlocal_vars(self): # More complex tests of nonlocal resolution def _nonlocal_vars(f): diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index daa40a6b..d85040a3 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -645,11 +645,9 @@ def test_large_file_ops(self): def test_with_open(self): for bufsize in (0, 100): - f = None with self.open(os_helper.TESTFN, "wb", bufsize) as f: f.write(b"xxx") self.assertEqual(f.closed, True) - f = None try: with self.open(os_helper.TESTFN, "wb", bufsize) as f: 1/0 @@ -1156,6 +1154,21 @@ def test_disallow_instantiation(self): _io = self._io support.check_disallow_instantiation(self, _io._BytesIOBuffer) + def test_stringio_setstate(self): + # gh-127182: Calling __setstate__() with invalid arguments must not crash + obj = self._io.StringIO() + with self.assertRaisesRegex( + TypeError, + 'initial_value must be str or None, not int', + ): + obj.__setstate__((1, '', 0, {})) + + obj.__setstate__((None, '', 0, {})) # should not crash + self.assertEqual(obj.getvalue(), '') + + obj.__setstate__(('', '', 0, {})) + self.assertEqual(obj.getvalue(), '') + class PyIOTest(IOTest): pass @@ -4066,6 +4079,28 @@ def write(self, data): t.write("x"*chunk_size) self.assertEqual([b"abcdef", b"ghi", b"x"*chunk_size], buf._write_stack) + def test_issue119506(self): + chunk_size = 8192 + + class MockIO(self.MockRawIO): + written = False + def write(self, data): + if not self.written: + self.written = True + t.write("middle") + return super().write(data) + + buf = MockIO() + t = self.TextIOWrapper(buf) + t.write("abc") + t.write("def") + # writing data which size >= chunk_size cause flushing buffer before write. + t.write("g" * chunk_size) + t.flush() + + self.assertEqual([b"abcdef", b"middle", b"g"*chunk_size], + buf._write_stack) + class PyTextIOWrapperTest(TextIOWrapperTest): io = pyio diff --git a/Lib/test/test_ipaddress.py b/Lib/test/test_ipaddress.py index e5cbf602..3c8a928b 100644 --- a/Lib/test/test_ipaddress.py +++ b/Lib/test/test_ipaddress.py @@ -2408,6 +2408,8 @@ def testReservedIpv6(self): self.assertTrue(ipaddress.ip_address('2001:30::').is_global) self.assertFalse(ipaddress.ip_address('2001:40::').is_global) self.assertFalse(ipaddress.ip_address('2002::').is_global) + # gh-124217: conform with RFC 9637 + self.assertFalse(ipaddress.ip_address('3fff::').is_global) # some generic IETF reserved addresses self.assertEqual(True, ipaddress.ip_address('100::').is_reserved) @@ -2421,6 +2423,30 @@ def testIpv4Mapped(self): self.assertEqual(ipaddress.ip_address('::ffff:c0a8:101').ipv4_mapped, ipaddress.ip_address('192.168.1.1')) + def testIpv4MappedProperties(self): + # Test that an IPv4 mapped IPv6 address has + # the same properties as an IPv4 address. + for addr4 in ( + "178.62.3.251", # global + "169.254.169.254", # link local + "127.0.0.1", # loopback + "224.0.0.1", # multicast + "192.168.0.1", # private + "0.0.0.0", # unspecified + "100.64.0.1", # public and not global + ): + with self.subTest(addr4): + ipv4 = ipaddress.IPv4Address(addr4) + ipv6 = ipaddress.IPv6Address(f"::ffff:{addr4}") + + self.assertEqual(ipv4.is_global, ipv6.is_global) + self.assertEqual(ipv4.is_private, ipv6.is_private) + self.assertEqual(ipv4.is_reserved, ipv6.is_reserved) + self.assertEqual(ipv4.is_multicast, ipv6.is_multicast) + self.assertEqual(ipv4.is_unspecified, ipv6.is_unspecified) + self.assertEqual(ipv4.is_link_local, ipv6.is_link_local) + self.assertEqual(ipv4.is_loopback, ipv6.is_loopback) + def testIpv4MappedPrivateCheck(self): self.assertEqual( True, ipaddress.ip_address('::ffff:192.168.1.1').is_private) diff --git a/Lib/test/test_iter.py b/Lib/test/test_iter.py index 9606d5be..1b9f3cf7 100644 --- a/Lib/test/test_iter.py +++ b/Lib/test/test_iter.py @@ -5,11 +5,13 @@ from test.support import cpython_only from test.support.os_helper import TESTFN, unlink from test.support import check_free_after_iterating, ALWAYS_EQ, NEVER_EQ +from test.support import BrokenIter import pickle import collections.abc import functools import contextlib import builtins +import traceback # Test result of triple loop (too big to inline) TRIPLETS = [(0, 0, 0), (0, 0, 1), (0, 0, 2), @@ -1143,6 +1145,46 @@ def test_error_iter(self): self.assertRaises(TypeError, iter, typ()) self.assertRaises(ZeroDivisionError, iter, BadIterableClass()) + def test_exception_locations(self): + # The location of an exception raised from __init__ or + # __next__ should should be the iterator expression + + def init_raises(): + try: + for x in BrokenIter(init_raises=True): + pass + except Exception as e: + return e + + def next_raises(): + try: + for x in BrokenIter(next_raises=True): + pass + except Exception as e: + return e + + def iter_raises(): + try: + for x in BrokenIter(iter_raises=True): + pass + except Exception as e: + return e + + for func, expected in [(init_raises, "BrokenIter(init_raises=True)"), + (next_raises, "BrokenIter(next_raises=True)"), + (iter_raises, "BrokenIter(iter_raises=True)"), + ]: + with self.subTest(func): + exc = func() + f = traceback.extract_tb(exc.__traceback__)[0] + indent = 16 + co = func.__code__ + self.assertEqual(f.lineno, co.co_firstlineno + 2) + self.assertEqual(f.end_lineno, co.co_firstlineno + 2) + self.assertEqual(f.line[f.colno - indent : f.end_colno - indent], + expected) + + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_itertools.py b/Lib/test/test_itertools.py index 3d20e70f..5b01f93b 100644 --- a/Lib/test/test_itertools.py +++ b/Lib/test/test_itertools.py @@ -599,6 +599,8 @@ def test_count(self): self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)]) self.assertRaises(TypeError, count, 2, 3, 4) self.assertRaises(TypeError, count, 'a') + self.assertEqual(take(3, count(maxsize)), + [maxsize, maxsize + 1, maxsize + 2]) self.assertEqual(take(10, count(maxsize-5)), list(range(maxsize-5, maxsize+5))) self.assertEqual(take(10, count(-maxsize-5)), @@ -621,6 +623,15 @@ def test_count(self): self.assertEqual(next(c), -8) self.assertEqual(repr(count(10.25)), 'count(10.25)') self.assertEqual(repr(count(10.0)), 'count(10.0)') + + self.assertEqual(repr(count(maxsize)), f'count({maxsize})') + c = count(maxsize - 1) + self.assertEqual(repr(c), f'count({maxsize - 1})') + next(c) # c is now at masize + self.assertEqual(repr(c), f'count({maxsize})') + next(c) + self.assertEqual(repr(c), f'count({maxsize + 1})') + self.assertEqual(type(next(count(10.0))), float) for i in (-sys.maxsize-5, -sys.maxsize+5 ,-10, -1, 0, 10, sys.maxsize-5, sys.maxsize+5): # Test repr @@ -654,6 +665,12 @@ def test_count_with_stride(self): self.assertEqual(take(20, count(-maxsize-15, 3)), take(20, range(-maxsize-15,-maxsize+100, 3))) self.assertEqual(take(3, count(10, maxsize+5)), list(range(10, 10+3*(maxsize+5), maxsize+5))) + self.assertEqual(take(3, count(maxsize, 2)), + [maxsize, maxsize + 2, maxsize + 4]) + self.assertEqual(take(3, count(maxsize, maxsize)), + [maxsize, 2 * maxsize, 3 * maxsize]) + self.assertEqual(take(3, count(-maxsize, maxsize)), + [-maxsize, 0, maxsize]) self.assertEqual(take(3, count(2, 1.25)), [2, 3.25, 4.5]) self.assertEqual(take(3, count(2, 3.25-4j)), [2, 5.25-4j, 8.5-8j]) self.assertEqual(take(3, count(Decimal('1.1'), Decimal('.1'))), @@ -695,6 +712,20 @@ def test_count_with_stride(self): for proto in range(pickle.HIGHEST_PROTOCOL + 1): self.pickletest(proto, count(i, j)) + c = count(maxsize -2, 2) + self.assertEqual(repr(c), f'count({maxsize - 2}, 2)') + next(c) # c is now at masize + self.assertEqual(repr(c), f'count({maxsize}, 2)') + next(c) + self.assertEqual(repr(c), f'count({maxsize + 2}, 2)') + + c = count(maxsize + 1, -1) + self.assertEqual(repr(c), f'count({maxsize + 1}, -1)') + next(c) # c is now at masize + self.assertEqual(repr(c), f'count({maxsize}, -1)') + next(c) + self.assertEqual(repr(c), f'count({maxsize - 1}, -1)') + def test_cycle(self): self.assertEqual(take(10, cycle('abc')), list('abcabcabca')) self.assertEqual(list(cycle('')), []) @@ -1612,10 +1643,11 @@ def test_tee(self): self.assertEqual(len(result), n) self.assertEqual([list(x) for x in result], [list('abc')]*n) - # tee pass-through to copyable iterator + # tee objects are independent (see bug gh-123884) a, b = tee('abc') c, d = tee(a) - self.assertTrue(a is c) + e, f = tee(c) + self.assertTrue(len({a, b, c, d, e, f}) == 6) # test tee_new t1, t2 = tee('abc') @@ -2029,6 +2061,172 @@ def test_islice_recipe(self): self.assertEqual(next(c), 3) + def test_tee_recipe(self): + + # Begin tee() recipe ########################################### + + def tee(iterable, n=2): + if n < 0: + raise ValueError + if n == 0: + return () + iterator = _tee(iterable) + result = [iterator] + for _ in range(n - 1): + result.append(_tee(iterator)) + return tuple(result) + + class _tee: + + def __init__(self, iterable): + it = iter(iterable) + if isinstance(it, _tee): + self.iterator = it.iterator + self.link = it.link + else: + self.iterator = it + self.link = [None, None] + + def __iter__(self): + return self + + def __next__(self): + link = self.link + if link[1] is None: + link[0] = next(self.iterator) + link[1] = [None, None] + value, self.link = link + return value + + # End tee() recipe ############################################# + + n = 200 + + a, b = tee([]) # test empty iterator + self.assertEqual(list(a), []) + self.assertEqual(list(b), []) + + a, b = tee(irange(n)) # test 100% interleaved + self.assertEqual(lzip(a,b), lzip(range(n), range(n))) + + a, b = tee(irange(n)) # test 0% interleaved + self.assertEqual(list(a), list(range(n))) + self.assertEqual(list(b), list(range(n))) + + a, b = tee(irange(n)) # test dealloc of leading iterator + for i in range(100): + self.assertEqual(next(a), i) + del a + self.assertEqual(list(b), list(range(n))) + + a, b = tee(irange(n)) # test dealloc of trailing iterator + for i in range(100): + self.assertEqual(next(a), i) + del b + self.assertEqual(list(a), list(range(100, n))) + + for j in range(5): # test randomly interleaved + order = [0]*n + [1]*n + random.shuffle(order) + lists = ([], []) + its = tee(irange(n)) + for i in order: + value = next(its[i]) + lists[i].append(value) + self.assertEqual(lists[0], list(range(n))) + self.assertEqual(lists[1], list(range(n))) + + # test argument format checking + self.assertRaises(TypeError, tee) + self.assertRaises(TypeError, tee, 3) + self.assertRaises(TypeError, tee, [1,2], 'x') + self.assertRaises(TypeError, tee, [1,2], 3, 'x') + + # tee object should be instantiable + a, b = tee('abc') + c = type(a)('def') + self.assertEqual(list(c), list('def')) + + # test long-lagged and multi-way split + a, b, c = tee(range(2000), 3) + for i in range(100): + self.assertEqual(next(a), i) + self.assertEqual(list(b), list(range(2000))) + self.assertEqual([next(c), next(c)], list(range(2))) + self.assertEqual(list(a), list(range(100,2000))) + self.assertEqual(list(c), list(range(2,2000))) + + # test invalid values of n + self.assertRaises(TypeError, tee, 'abc', 'invalid') + self.assertRaises(ValueError, tee, [], -1) + + for n in range(5): + result = tee('abc', n) + self.assertEqual(type(result), tuple) + self.assertEqual(len(result), n) + self.assertEqual([list(x) for x in result], [list('abc')]*n) + + # tee objects are independent (see bug gh-123884) + a, b = tee('abc') + c, d = tee(a) + e, f = tee(c) + self.assertTrue(len({a, b, c, d, e, f}) == 6) + + # test tee_new + t1, t2 = tee('abc') + tnew = type(t1) + self.assertRaises(TypeError, tnew) + self.assertRaises(TypeError, tnew, 10) + t3 = tnew(t1) + self.assertTrue(list(t1) == list(t2) == list(t3) == list('abc')) + + # test that tee objects are weak referencable + a, b = tee(range(10)) + p = weakref.proxy(a) + self.assertEqual(getattr(p, '__class__'), type(b)) + del a + gc.collect() # For PyPy or other GCs. + self.assertRaises(ReferenceError, getattr, p, '__class__') + + ans = list('abc') + long_ans = list(range(10000)) + + # Tests not applicable to the tee() recipe + if False: + # check copy + a, b = tee('abc') + self.assertEqual(list(copy.copy(a)), ans) + self.assertEqual(list(copy.copy(b)), ans) + a, b = tee(list(range(10000))) + self.assertEqual(list(copy.copy(a)), long_ans) + self.assertEqual(list(copy.copy(b)), long_ans) + + # check partially consumed copy + a, b = tee('abc') + take(2, a) + take(1, b) + self.assertEqual(list(copy.copy(a)), ans[2:]) + self.assertEqual(list(copy.copy(b)), ans[1:]) + self.assertEqual(list(a), ans[2:]) + self.assertEqual(list(b), ans[1:]) + a, b = tee(range(10000)) + take(100, a) + take(60, b) + self.assertEqual(list(copy.copy(a)), long_ans[100:]) + self.assertEqual(list(copy.copy(b)), long_ans[60:]) + self.assertEqual(list(a), long_ans[100:]) + self.assertEqual(list(b), long_ans[60:]) + + # Issue 13454: Crash when deleting backward iterator from tee() + forward, backward = tee(repeat(None, 2000)) # 20000000 + try: + any(forward) # exhaust the iterator + del backward + except: + del forward, backward + raise + + class TestGC(unittest.TestCase): def makecycle(self, iterator, container): diff --git a/Lib/test/test_json/test_decode.py b/Lib/test/test_json/test_decode.py index 79fb239b..2250af96 100644 --- a/Lib/test/test_json/test_decode.py +++ b/Lib/test/test_json/test_decode.py @@ -16,6 +16,12 @@ def test_float(self): self.assertIsInstance(rval, float) self.assertEqual(rval, 1.0) + def test_nonascii_digits_rejected(self): + # JSON specifies only ascii digits, see gh-125687 + for num in ["1\uff10", "0.\uff10", "0e\uff10"]: + with self.assertRaises(self.JSONDecodeError): + self.loads(num) + def test_bytes(self): self.assertEqual(self.loads(b"1"), 1) diff --git a/Lib/test/test_json/test_scanstring.py b/Lib/test/test_json/test_scanstring.py index 2d3ee8a8..cca556a3 100644 --- a/Lib/test/test_json/test_scanstring.py +++ b/Lib/test/test_json/test_scanstring.py @@ -116,6 +116,11 @@ def test_bad_escapes(self): '"\\u012z"', '"\\u0x12"', '"\\u0X12"', + '"\\u{0}"'.format("\uff10" * 4), + '"\\u 123"', + '"\\u-123"', + '"\\u+123"', + '"\\u1_23"', '"\\ud834\\"', '"\\ud834\\u"', '"\\ud834\\ud"', @@ -127,6 +132,11 @@ def test_bad_escapes(self): '"\\ud834\\udd2z"', '"\\ud834\\u0x20"', '"\\ud834\\u0X20"', + '"\\ud834\\u{0}"'.format("\uff10" * 4), + '"\\ud834\\u 123"', + '"\\ud834\\u-123"', + '"\\ud834\\u+123"', + '"\\ud834\\u1_23"', ] for s in bad_escapes: with self.assertRaises(self.JSONDecodeError, msg=s): diff --git a/Lib/test/test_largefile.py b/Lib/test/test_largefile.py index 3b0930fe..282400c6 100644 --- a/Lib/test/test_largefile.py +++ b/Lib/test/test_largefile.py @@ -142,6 +142,9 @@ def test_truncate(self): f.truncate(1) self.assertEqual(f.tell(), 0) # else pointer moved f.seek(0) + # Verify readall on a truncated file is well behaved. read() + # without a size can be unbounded, this should get just the byte + # that remains. self.assertEqual(len(f.read()), 1) # else wasn't truncated def test_seekable(self): @@ -152,6 +155,22 @@ def test_seekable(self): f.seek(pos) self.assertTrue(f.seekable()) + @bigmemtest(size=size, memuse=2, dry_run=False) + def test_seek_readall(self, _size): + # Seek which doesn't change position should readall successfully. + with self.open(TESTFN, 'rb') as f: + self.assertEqual(f.seek(0, os.SEEK_CUR), 0) + self.assertEqual(len(f.read()), size + 1) + + # Seek which changes (or might change) position should readall + # successfully. + with self.open(TESTFN, 'rb') as f: + self.assertEqual(f.seek(20, os.SEEK_SET), 20) + self.assertEqual(len(f.read()), size - 19) + + with self.open(TESTFN, 'rb') as f: + self.assertEqual(f.seek(-3, os.SEEK_END), size - 2) + self.assertEqual(len(f.read()), 3) def skip_no_disk_space(path, required): def decorator(fun): diff --git a/Lib/test/test_linecache.py b/Lib/test/test_linecache.py index e42df3d9..008f8c8f 100644 --- a/Lib/test/test_linecache.py +++ b/Lib/test/test_linecache.py @@ -276,6 +276,37 @@ def test_loader(self): self.assertEqual(linecache.getlines(filename, module_globals), ['source for x.y.z\n']) + def test_invalid_names(self): + for name, desc in [ + ('\x00', 'NUL bytes filename'), + (__file__ + '\x00', 'filename with embedded NUL bytes'), + # A filename with surrogate codes. A UnicodeEncodeError is raised + # by os.stat() upon querying, which is a subclass of ValueError. + ("\uD834\uDD1E.py", 'surrogate codes (MUSICAL SYMBOL G CLEF)'), + # For POSIX platforms, an OSError will be raised but for Windows + # platforms, a ValueError is raised due to the path_t converter. + # See: https://github.com/python/cpython/issues/122170 + ('a' * 1_000_000, 'very long filename'), + ]: + with self.subTest(f'updatecache: {desc}'): + linecache.clearcache() + lines = linecache.updatecache(name) + self.assertListEqual(lines, []) + self.assertNotIn(name, linecache.cache) + + # hack into the cache (it shouldn't be allowed + # but we never know what people do...) + for key, fullname in [(name, 'ok'), ('key', name), (name, name)]: + with self.subTest(f'checkcache: {desc}', + key=key, fullname=fullname): + linecache.clearcache() + linecache.cache[key] = (0, 1234, [], fullname) + linecache.checkcache(key) + self.assertNotIn(key, linecache.cache) + + # just to be sure that we did not mess with cache + linecache.clearcache() + class LineCacheInvalidationTests(unittest.TestCase): def setUp(self): diff --git a/Lib/test/test_list.py b/Lib/test/test_list.py index 2969c6e2..77264ed7 100644 --- a/Lib/test/test_list.py +++ b/Lib/test/test_list.py @@ -229,6 +229,31 @@ def __eq__(self, other): list4 = [1] self.assertFalse(list3 == list4) + def test_lt_operator_modifying_operand(self): + # See gh-120298 + class evil: + def __lt__(self, other): + other.clear() + return NotImplemented + + a = [[evil()]] + with self.assertRaises(TypeError): + a[0] < a + + def test_list_index_modifing_operand(self): + # See gh-120384 + class evil: + def __init__(self, lst): + self.lst = lst + def __iter__(self): + yield from self.lst + self.lst.clear() + + lst = list(range(5)) + operand = evil(lst) + with self.assertRaises(ValueError): + lst[::-1] = operand + @cpython_only def test_preallocation(self): iterable = [0] * 10 diff --git a/Lib/test/test_listcomps.py b/Lib/test/test_listcomps.py index df1debf3..2065afd4 100644 --- a/Lib/test/test_listcomps.py +++ b/Lib/test/test_listcomps.py @@ -1,8 +1,11 @@ import doctest import textwrap +import traceback import types import unittest +from test.support import BrokenIter + doctests = """ ########### Tests borrowed from or inspired by test_genexps.py ############ @@ -168,6 +171,31 @@ def test_references___class__(self): """ self._check_in_scopes(code, raises=NameError) + def test_references___class___defined(self): + code = """ + __class__ = 2 + res = [__class__ for x in [1]] + """ + self._check_in_scopes( + code, outputs={"res": [2]}, scopes=["module", "function"]) + self._check_in_scopes(code, raises=NameError, scopes=["class"]) + + def test_references___class___enclosing(self): + code = """ + __class__ = 2 + class C: + res = [__class__ for x in [1]] + res = C.res + """ + self._check_in_scopes(code, raises=NameError) + + def test_super_and_class_cell_in_sibling_comps(self): + code = """ + [super for _ in [1]] + [__class__ for _ in [1]] + """ + self._check_in_scopes(code, raises=NameError) + def test_inner_cell_shadows_outer(self): code = """ items = [(lambda: i) for i in range(5)] @@ -681,6 +709,42 @@ def test_multiple_comprehension_name_reuse(self): self._check_in_scopes(code, {"x": 2, "y": [3]}, ns={"x": 3}, scopes=["class"]) self._check_in_scopes(code, {"x": 2, "y": [2]}, ns={"x": 3}, scopes=["function", "module"]) + def test_exception_locations(self): + # The location of an exception raised from __init__ or + # __next__ should should be the iterator expression + + def init_raises(): + try: + [x for x in BrokenIter(init_raises=True)] + except Exception as e: + return e + + def next_raises(): + try: + [x for x in BrokenIter(next_raises=True)] + except Exception as e: + return e + + def iter_raises(): + try: + [x for x in BrokenIter(iter_raises=True)] + except Exception as e: + return e + + for func, expected in [(init_raises, "BrokenIter(init_raises=True)"), + (next_raises, "BrokenIter(next_raises=True)"), + (iter_raises, "BrokenIter(iter_raises=True)"), + ]: + with self.subTest(func): + exc = func() + f = traceback.extract_tb(exc.__traceback__)[0] + indent = 16 + co = func.__code__ + self.assertEqual(f.lineno, co.co_firstlineno + 2) + self.assertEqual(f.end_lineno, co.co_firstlineno + 2) + self.assertEqual(f.line[f.colno - indent : f.end_colno - indent], + expected) + __test__ = {'doctests' : doctests} def load_tests(loader, tests, pattern): diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py index b0d79985..cde80a4e 100644 --- a/Lib/test/test_locale.py +++ b/Lib/test/test_locale.py @@ -353,6 +353,8 @@ def setUp(self): is_emscripten or is_wasi, "musl libc issue on Emscripten/WASI, bpo-46390" ) + @unittest.skipIf(sys.platform.startswith("netbsd"), + "gh-124108: NetBSD doesn't support UTF-8 for LC_COLLATE") def test_strcoll_with_diacritic(self): self.assertLess(locale.strcoll('à', 'b'), 0) @@ -362,6 +364,8 @@ def test_strcoll_with_diacritic(self): is_emscripten or is_wasi, "musl libc issue on Emscripten/WASI, bpo-46390" ) + @unittest.skipIf(sys.platform.startswith("netbsd"), + "gh-124108: NetBSD doesn't support UTF-8 for LC_COLLATE") def test_strxfrm_with_diacritic(self): self.assertLess(locale.strxfrm('à'), locale.strxfrm('b')) diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 6dd1b6f8..5112c2e7 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -60,6 +60,7 @@ import weakref from http.server import HTTPServer, BaseHTTPRequestHandler +from unittest.mock import patch from urllib.parse import urlparse, parse_qs from socketserver import (ThreadingUDPServer, DatagramRequestHandler, ThreadingTCPServer, StreamRequestHandler) @@ -2381,6 +2382,32 @@ class CustomListener(logging.handlers.QueueListener): class CustomQueue(queue.Queue): pass +class CustomQueueProtocol: + def __init__(self, maxsize=0): + self.queue = queue.Queue(maxsize) + + def __getattr__(self, attribute): + queue = object.__getattribute__(self, 'queue') + return getattr(queue, attribute) + +class CustomQueueFakeProtocol(CustomQueueProtocol): + # An object implementing the minimial Queue API for + # the logging module but with incorrect signatures. + # + # The object will be considered a valid queue class since we + # do not check the signatures (only callability of methods) + # but will NOT be usable in production since a TypeError will + # be raised due to the extra argument in 'put_nowait'. + def put_nowait(self): + pass + +class CustomQueueWrongProtocol(CustomQueueProtocol): + put_nowait = None + +class MinimalQueueProtocol: + def put_nowait(self, x): pass + def get(self): pass + def queueMaker(): return queue.Queue() @@ -3866,19 +3893,18 @@ def do_queuehandler_configuration(self, qspec, lspec): self.addCleanup(os.remove, fn) @threading_helper.requires_working_threading() + @support.requires_subprocess() def test_config_queue_handler(self): - q = CustomQueue() - dq = { - '()': __name__ + '.CustomQueue', - 'maxsize': 10 - } + qs = [CustomQueue(), CustomQueueProtocol()] + dqs = [{'()': f'{__name__}.{cls}', 'maxsize': 10} + for cls in ['CustomQueue', 'CustomQueueProtocol']] dl = { '()': __name__ + '.listenerMaker', 'arg1': None, 'arg2': None, 'respect_handler_level': True } - qvalues = (None, __name__ + '.queueMaker', __name__ + '.CustomQueue', dq, q) + qvalues = (None, __name__ + '.queueMaker', __name__ + '.CustomQueue', *dqs, *qs) lvalues = (None, __name__ + '.CustomListener', dl, CustomListener) for qspec, lspec in itertools.product(qvalues, lvalues): self.do_queuehandler_configuration(qspec, lspec) @@ -3894,12 +3920,115 @@ def test_config_queue_handler(self): msg = str(ctx.exception) self.assertEqual(msg, "Unable to configure handler 'ah'") + def _apply_simple_queue_listener_configuration(self, qspec): + self.apply_config({ + "version": 1, + "handlers": { + "queue_listener": { + "class": "logging.handlers.QueueHandler", + "queue": qspec, + }, + }, + }) + + @threading_helper.requires_working_threading() + @support.requires_subprocess() + @patch("multiprocessing.Manager") + def test_config_queue_handler_does_not_create_multiprocessing_manager(self, manager): + # gh-120868, gh-121723, gh-124653 + + for qspec in [ + {"()": "queue.Queue", "maxsize": -1}, + queue.Queue(), + # queue.SimpleQueue does not inherit from queue.Queue + queue.SimpleQueue(), + # CustomQueueFakeProtocol passes the checks but will not be usable + # since the signatures are incompatible. Checking the Queue API + # without testing the type of the actual queue is a trade-off + # between usability and the work we need to do in order to safely + # check that the queue object correctly implements the API. + CustomQueueFakeProtocol(), + MinimalQueueProtocol(), + ]: + with self.subTest(qspec=qspec): + self._apply_simple_queue_listener_configuration(qspec) + manager.assert_not_called() + + @patch("multiprocessing.Manager") + def test_config_queue_handler_invalid_config_does_not_create_multiprocessing_manager(self, manager): + # gh-120868, gh-121723 + + for qspec in [object(), CustomQueueWrongProtocol()]: + with self.subTest(qspec=qspec), self.assertRaises(ValueError): + self._apply_simple_queue_listener_configuration(qspec) + manager.assert_not_called() + + @skip_if_tsan_fork + @support.requires_subprocess() + @unittest.skipUnless(support.Py_DEBUG, "requires a debug build for testing" + " assertions in multiprocessing") + def test_config_reject_simple_queue_handler_multiprocessing_context(self): + # multiprocessing.SimpleQueue does not implement 'put_nowait' + # and thus cannot be used as a queue-like object (gh-124653) + + import multiprocessing + + if support.MS_WINDOWS: + start_methods = ['spawn'] + else: + start_methods = ['spawn', 'fork', 'forkserver'] + + for start_method in start_methods: + with self.subTest(start_method=start_method): + ctx = multiprocessing.get_context(start_method) + qspec = ctx.SimpleQueue() + with self.assertRaises(ValueError): + self._apply_simple_queue_listener_configuration(qspec) + + @skip_if_tsan_fork + @support.requires_subprocess() + @unittest.skipUnless(support.Py_DEBUG, "requires a debug build for testing" + "assertions in multiprocessing") + def test_config_queue_handler_multiprocessing_context(self): + # regression test for gh-121723 + if support.MS_WINDOWS: + start_methods = ['spawn'] + else: + start_methods = ['spawn', 'fork', 'forkserver'] + for start_method in start_methods: + with self.subTest(start_method=start_method): + ctx = multiprocessing.get_context(start_method) + with ctx.Manager() as manager: + q = manager.Queue() + records = [] + # use 1 process and 1 task per child to put 1 record + with ctx.Pool(1, initializer=self._mpinit_issue121723, + initargs=(q, "text"), maxtasksperchild=1): + records.append(q.get(timeout=60)) + self.assertTrue(q.empty()) + self.assertEqual(len(records), 1) + + @staticmethod + def _mpinit_issue121723(qspec, message_to_log): + # static method for pickling support + logging.config.dictConfig({ + 'version': 1, + 'disable_existing_loggers': True, + 'handlers': { + 'log_to_parent': { + 'class': 'logging.handlers.QueueHandler', + 'queue': qspec + } + }, + 'root': {'handlers': ['log_to_parent'], 'level': 'DEBUG'} + }) + # log a message (this creates a record put in the queue) + logging.getLogger().info(message_to_log) + + @support.requires_subprocess() def test_multiprocessing_queues(self): # See gh-119819 - # will skip test if it's not available - import_helper.import_module('_multiprocessing') - cd = copy.deepcopy(self.config_queue_handler) from multiprocessing import Queue as MQ, Manager as MM q1 = MQ() # this can't be pickled @@ -5956,13 +6085,28 @@ def test_emit_after_closing_in_write_mode(self): self.assertEqual(fp.read().strip(), '1') class RotatingFileHandlerTest(BaseFileTest): - @unittest.skipIf(support.is_wasi, "WASI does not have /dev/null.") def test_should_not_rollover(self): - # If maxbytes is zero rollover never occurs + # If file is empty rollover never occurs + rh = logging.handlers.RotatingFileHandler( + self.fn, encoding="utf-8", maxBytes=1) + self.assertFalse(rh.shouldRollover(None)) + rh.close() + + # If maxBytes is zero rollover never occurs + rh = logging.handlers.RotatingFileHandler( + self.fn, encoding="utf-8", maxBytes=0) + self.assertFalse(rh.shouldRollover(None)) + rh.close() + + with open(self.fn, 'wb') as f: + f.write(b'\n') rh = logging.handlers.RotatingFileHandler( self.fn, encoding="utf-8", maxBytes=0) self.assertFalse(rh.shouldRollover(None)) rh.close() + + @unittest.skipIf(support.is_wasi, "WASI does not have /dev/null.") + def test_should_not_rollover_non_file(self): # bpo-45401 - test with special file # We set maxBytes to 1 so that rollover would normally happen, except # for the check for regular files @@ -5972,18 +6116,47 @@ def test_should_not_rollover(self): rh.close() def test_should_rollover(self): - rh = logging.handlers.RotatingFileHandler(self.fn, encoding="utf-8", maxBytes=1) + with open(self.fn, 'wb') as f: + f.write(b'\n') + rh = logging.handlers.RotatingFileHandler(self.fn, encoding="utf-8", maxBytes=2) self.assertTrue(rh.shouldRollover(self.next_rec())) rh.close() def test_file_created(self): # checks that the file is created and assumes it was created # by us + os.unlink(self.fn) rh = logging.handlers.RotatingFileHandler(self.fn, encoding="utf-8") rh.emit(self.next_rec()) self.assertLogFile(self.fn) rh.close() + def test_max_bytes(self, delay=False): + kwargs = {'delay': delay} if delay else {} + os.unlink(self.fn) + rh = logging.handlers.RotatingFileHandler( + self.fn, encoding="utf-8", backupCount=2, maxBytes=100, **kwargs) + self.assertIs(os.path.exists(self.fn), not delay) + small = logging.makeLogRecord({'msg': 'a'}) + large = logging.makeLogRecord({'msg': 'b'*100}) + self.assertFalse(rh.shouldRollover(small)) + self.assertFalse(rh.shouldRollover(large)) + rh.emit(small) + self.assertLogFile(self.fn) + self.assertFalse(os.path.exists(self.fn + ".1")) + self.assertFalse(rh.shouldRollover(small)) + self.assertTrue(rh.shouldRollover(large)) + rh.emit(large) + self.assertTrue(os.path.exists(self.fn)) + self.assertLogFile(self.fn + ".1") + self.assertFalse(os.path.exists(self.fn + ".2")) + self.assertTrue(rh.shouldRollover(small)) + self.assertTrue(rh.shouldRollover(large)) + rh.close() + + def test_max_bytes_delay(self): + self.test_max_bytes(delay=True) + def test_rollover_filenames(self): def namer(name): return name + ".test" @@ -5992,11 +6165,15 @@ def namer(name): rh.namer = namer rh.emit(self.next_rec()) self.assertLogFile(self.fn) + self.assertFalse(os.path.exists(namer(self.fn + ".1"))) rh.emit(self.next_rec()) self.assertLogFile(namer(self.fn + ".1")) + self.assertFalse(os.path.exists(namer(self.fn + ".2"))) rh.emit(self.next_rec()) self.assertLogFile(namer(self.fn + ".2")) self.assertFalse(os.path.exists(namer(self.fn + ".3"))) + rh.emit(self.next_rec()) + self.assertFalse(os.path.exists(namer(self.fn + ".3"))) rh.close() def test_namer_rotator_inheritance(self): diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index 0b015580..600946ee 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -187,6 +187,9 @@ def result_check(expected, got, ulp_tol=5, abs_tol=0.0): # Check exactly equal (applies also to strings representing exceptions) if got == expected: + if not got and not expected: + if math.copysign(1, got) != math.copysign(1, expected): + return f"expected {expected}, got {got} (zero has wrong sign)" return None failure = "not equal" @@ -809,11 +812,13 @@ def testHypot(self): # Test allowable types (those with __float__) self.assertEqual(hypot(12.0, 5.0), 13.0) self.assertEqual(hypot(12, 5), 13) - self.assertEqual(hypot(1, -1), math.sqrt(2)) - self.assertEqual(hypot(1, FloatLike(-1.)), math.sqrt(2)) + self.assertEqual(hypot(0.75, -1), 1.25) + self.assertEqual(hypot(-1, 0.75), 1.25) + self.assertEqual(hypot(0.75, FloatLike(-1.)), 1.25) + self.assertEqual(hypot(FloatLike(-1.), 0.75), 1.25) self.assertEqual(hypot(Decimal(12), Decimal(5)), 13) self.assertEqual(hypot(Fraction(12, 32), Fraction(5, 32)), Fraction(13, 32)) - self.assertEqual(hypot(bool(1), bool(0), bool(1), bool(1)), math.sqrt(3)) + self.assertEqual(hypot(True, False, True, True, True), 2.0) # Test corner cases self.assertEqual(hypot(0.0, 0.0), 0.0) # Max input is zero @@ -969,9 +974,9 @@ def testDist(self): self.assertEqual(dist((D(14), D(1)), (D(2), D(-4))), D(13)) self.assertEqual(dist((F(14, 32), F(1, 32)), (F(2, 32), F(-4, 32))), F(13, 32)) - self.assertEqual(dist((True, True, False, True, False), - (True, False, True, True, False)), - sqrt(2.0)) + self.assertEqual(dist((True, True, False, False, True, True), + (True, False, True, False, False, False)), + 2.0) # Test corner cases self.assertEqual(dist((13.25, 12.5, -3.25), @@ -1397,7 +1402,7 @@ def __repr__(self): return f'Flt({int(self)})' def baseline_sumprod(p, q): - """This defines the target behavior including expections and special values. + """This defines the target behavior including exceptions and special values. However, it is subject to rounding errors, so float inputs should be exactly representable with only a few bits. """ @@ -1881,7 +1886,7 @@ def testTan(self): try: self.assertTrue(math.isnan(math.tan(INF))) self.assertTrue(math.isnan(math.tan(NINF))) - except: + except ValueError: self.assertRaises(ValueError, math.tan, INF) self.assertRaises(ValueError, math.tan, NINF) self.assertTrue(math.isnan(math.tan(NAN))) @@ -2051,6 +2056,13 @@ def test_testfile(self): except OverflowError: result = 'OverflowError' + # C99+ says for math.h's sqrt: If the argument is +∞ or ±0, it is + # returned, unmodified. On another hand, for csqrt: If z is ±0+0i, + # the result is +0+0i. Lets correct zero sign of er to follow + # first convention. + if id in ['sqrt0002', 'sqrt0003', 'sqrt1001', 'sqrt1023']: + er = math.copysign(er, ar) + # Default tolerances ulp_tol, abs_tol = 5, 0.0 diff --git a/Lib/test/test_memoryview.py b/Lib/test/test_memoryview.py index 0eb2a367..2d4bf5f1 100644 --- a/Lib/test/test_memoryview.py +++ b/Lib/test/test_memoryview.py @@ -18,6 +18,10 @@ from test.support import import_helper +class MyObject: + pass + + class AbstractMemoryTests: source_bytes = b"abcdef" @@ -228,8 +232,6 @@ def __init__(self, base): self.m = memoryview(base) class MySource(tp): pass - class MyObject: - pass # Create a reference cycle through a memoryview object. # This exercises mbuf_clear(). @@ -656,5 +658,26 @@ def __bool__(self): m[0] = MyBool() self.assertEqual(ba[:8], b'\0'*8) + def test_buffer_reference_loop(self): + m = memoryview(b'abc').__buffer__(0) + o = MyObject() + o.m = m + o.o = o + wr = weakref.ref(o) + del m, o + gc.collect() + self.assertIsNone(wr()) + + def test_picklebuffer_reference_loop(self): + pb = pickle.PickleBuffer(memoryview(b'abc')) + o = MyObject() + o.pb = pb + o.o = o + wr = weakref.ref(o) + del pb, o + gc.collect() + self.assertIsNone(wr()) + + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_ntpath.py b/Lib/test/test_ntpath.py index 9c6715b2..4924db98 100644 --- a/Lib/test/test_ntpath.py +++ b/Lib/test/test_ntpath.py @@ -743,6 +743,9 @@ def test_abspath(self): tester('ntpath.abspath("C:\\spam. . .")', "C:\\spam") tester('ntpath.abspath("C:/nul")', "\\\\.\\nul") tester('ntpath.abspath("C:\\nul")', "\\\\.\\nul") + self.assertTrue(ntpath.isabs(ntpath.abspath("C:spam"))) + self.assertEqual(ntpath.abspath("C:\x00"), ntpath.join(ntpath.abspath("C:"), "\x00")) + self.assertEqual(ntpath.abspath("\x00:spam"), "\x00:\\spam") tester('ntpath.abspath("//..")', "\\\\") tester('ntpath.abspath("//../")', "\\\\..\\") tester('ntpath.abspath("//../..")', "\\\\..\\") diff --git a/Lib/test/test_optparse.py b/Lib/test/test_optparse.py index 28b27446..8655a053 100644 --- a/Lib/test/test_optparse.py +++ b/Lib/test/test_optparse.py @@ -15,7 +15,7 @@ from io import StringIO from test import support from test.support import os_helper - +from test.support.i18n_helper import TestTranslationsBase, update_translation_snapshots import optparse from optparse import make_option, Option, \ @@ -1656,5 +1656,14 @@ def test__all__(self): support.check__all__(self, optparse, not_exported=not_exported) +class TestTranslations(TestTranslationsBase): + def test_translations(self): + self.assertMsgidsEqual(optparse) + + if __name__ == '__main__': + # To regenerate translation snapshots + if len(sys.argv) > 1 and sys.argv[1] == '--snapshot-update': + update_translation_snapshots(optparse) + sys.exit(0) unittest.main() diff --git a/Lib/test/test_ordered_dict.py b/Lib/test/test_ordered_dict.py index 4571b23d..9f131a91 100644 --- a/Lib/test/test_ordered_dict.py +++ b/Lib/test/test_ordered_dict.py @@ -2,7 +2,9 @@ import contextlib import copy import gc +import operator import pickle +import re from random import randrange, shuffle import struct import sys @@ -739,11 +741,44 @@ def test_ordered_dict_items_result_gc(self): # when it's mutated and returned from __next__: self.assertTrue(gc.is_tracked(next(it))) + +class _TriggerSideEffectOnEqual: + count = 0 # number of calls to __eq__ + trigger = 1 # count value when to trigger side effect + + def __eq__(self, other): + if self.__class__.count == self.__class__.trigger: + self.side_effect() + self.__class__.count += 1 + return True + + def __hash__(self): + # all instances represent the same key + return -1 + + def side_effect(self): + raise NotImplementedError + class PurePythonOrderedDictTests(OrderedDictTests, unittest.TestCase): module = py_coll OrderedDict = py_coll.OrderedDict + def test_issue119004_attribute_error(self): + class Key(_TriggerSideEffectOnEqual): + def side_effect(self): + del dict1[TODEL] + + TODEL = Key() + dict1 = self.OrderedDict(dict.fromkeys((0, TODEL, 4.2))) + dict2 = self.OrderedDict(dict.fromkeys((0, Key(), 4.2))) + # This causes an AttributeError due to the linked list being changed + msg = re.escape("'NoneType' object has no attribute 'key'") + self.assertRaisesRegex(AttributeError, msg, operator.eq, dict1, dict2) + self.assertEqual(Key.count, 2) + self.assertDictEqual(dict1, dict.fromkeys((0, 4.2))) + self.assertDictEqual(dict2, dict.fromkeys((0, Key(), 4.2))) + class CPythonBuiltinDictTests(unittest.TestCase): """Builtin dict preserves insertion order. @@ -764,8 +799,85 @@ class CPythonBuiltinDictTests(unittest.TestCase): del method +class CPythonOrderedDictSideEffects: + + def check_runtime_error_issue119004(self, dict1, dict2): + msg = re.escape("OrderedDict mutated during iteration") + self.assertRaisesRegex(RuntimeError, msg, operator.eq, dict1, dict2) + + def test_issue119004_change_size_by_clear(self): + class Key(_TriggerSideEffectOnEqual): + def side_effect(self): + dict1.clear() + + dict1 = self.OrderedDict(dict.fromkeys((0, Key(), 4.2))) + dict2 = self.OrderedDict(dict.fromkeys((0, Key(), 4.2))) + self.check_runtime_error_issue119004(dict1, dict2) + self.assertEqual(Key.count, 2) + self.assertDictEqual(dict1, {}) + self.assertDictEqual(dict2, dict.fromkeys((0, Key(), 4.2))) + + def test_issue119004_change_size_by_delete_key(self): + class Key(_TriggerSideEffectOnEqual): + def side_effect(self): + del dict1[TODEL] + + TODEL = Key() + dict1 = self.OrderedDict(dict.fromkeys((0, TODEL, 4.2))) + dict2 = self.OrderedDict(dict.fromkeys((0, Key(), 4.2))) + self.check_runtime_error_issue119004(dict1, dict2) + self.assertEqual(Key.count, 2) + self.assertDictEqual(dict1, dict.fromkeys((0, 4.2))) + self.assertDictEqual(dict2, dict.fromkeys((0, Key(), 4.2))) + + def test_issue119004_change_linked_list_by_clear(self): + class Key(_TriggerSideEffectOnEqual): + def side_effect(self): + dict1.clear() + dict1['a'] = dict1['b'] = 'c' + + dict1 = self.OrderedDict(dict.fromkeys((0, Key(), 4.2))) + dict2 = self.OrderedDict(dict.fromkeys((0, Key(), 4.2))) + self.check_runtime_error_issue119004(dict1, dict2) + self.assertEqual(Key.count, 2) + self.assertDictEqual(dict1, dict.fromkeys(('a', 'b'), 'c')) + self.assertDictEqual(dict2, dict.fromkeys((0, Key(), 4.2))) + + def test_issue119004_change_linked_list_by_delete_key(self): + class Key(_TriggerSideEffectOnEqual): + def side_effect(self): + del dict1[TODEL] + dict1['a'] = 'c' + + TODEL = Key() + dict1 = self.OrderedDict(dict.fromkeys((0, TODEL, 4.2))) + dict2 = self.OrderedDict(dict.fromkeys((0, Key(), 4.2))) + self.check_runtime_error_issue119004(dict1, dict2) + self.assertEqual(Key.count, 2) + self.assertDictEqual(dict1, {0: None, 'a': 'c', 4.2: None}) + self.assertDictEqual(dict2, dict.fromkeys((0, Key(), 4.2))) + + def test_issue119004_change_size_by_delete_key_in_dict_eq(self): + class Key(_TriggerSideEffectOnEqual): + trigger = 0 + def side_effect(self): + del dict1[TODEL] + + TODEL = Key() + dict1 = self.OrderedDict(dict.fromkeys((0, TODEL, 4.2))) + dict2 = self.OrderedDict(dict.fromkeys((0, Key(), 4.2))) + self.assertEqual(Key.count, 0) + # the side effect is in dict.__eq__ and modifies the length + self.assertNotEqual(dict1, dict2) + self.assertEqual(Key.count, 2) + self.assertDictEqual(dict1, dict.fromkeys((0, 4.2))) + self.assertDictEqual(dict2, dict.fromkeys((0, Key(), 4.2))) + + @unittest.skipUnless(c_coll, 'requires the C version of the collections module') -class CPythonOrderedDictTests(OrderedDictTests, unittest.TestCase): +class CPythonOrderedDictTests(OrderedDictTests, + CPythonOrderedDictSideEffects, + unittest.TestCase): module = c_coll OrderedDict = c_coll.OrderedDict diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 88037059..1d6d92e0 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -824,7 +824,7 @@ def ns_to_sec(ns): return (ns * 1e-9) + 0.5e-9 def test_utime_by_indexed(self): - # pass times as floating point seconds as the second indexed parameter + # pass times as floating-point seconds as the second indexed parameter def set_time(filename, ns): atime_ns, mtime_ns = ns atime = self.ns_to_sec(atime_ns) @@ -1823,9 +1823,10 @@ def test_win32_mkdir_700(self): os.mkdir(path, mode=0o700) out = subprocess.check_output(["cacls.exe", path, "/s"], encoding="oem") os.rmdir(path) + out = out.strip().rsplit(" ", 1)[1] self.assertEqual( - out.strip(), - f'{path} "D:P(A;OICI;FA;;;SY)(A;OICI;FA;;;BA)(A;OICI;FA;;;OW)"', + out, + '"D:P(A;OICI;FA;;;SY)(A;OICI;FA;;;BA)(A;OICI;FA;;;OW)"', ) def tearDown(self): @@ -3095,7 +3096,8 @@ class Win32NtTests(unittest.TestCase): def test_getfinalpathname_handles(self): nt = import_helper.import_module('nt') ctypes = import_helper.import_module('ctypes') - import ctypes.wintypes + # Ruff false positive -- it thinks we're redefining `ctypes` here + import ctypes.wintypes # noqa: F811 kernel = ctypes.WinDLL('Kernel32.dll', use_last_error=True) kernel.GetCurrentProcess.restype = ctypes.wintypes.HANDLE @@ -3885,10 +3887,10 @@ def _check_xattrs_str(self, s, getxattr, setxattr, removexattr, listxattr, **kwa xattr.remove("user.test") self.assertEqual(set(listxattr(fn)), xattr) self.assertEqual(getxattr(fn, s("user.test2"), **kwargs), b"foo") - setxattr(fn, s("user.test"), b"a"*1024, **kwargs) - self.assertEqual(getxattr(fn, s("user.test"), **kwargs), b"a"*1024) + setxattr(fn, s("user.test"), b"a"*256, **kwargs) + self.assertEqual(getxattr(fn, s("user.test"), **kwargs), b"a"*256) removexattr(fn, s("user.test"), **kwargs) - many = sorted("user.test{}".format(i) for i in range(100)) + many = sorted("user.test{}".format(i) for i in range(32)) for thing in many: setxattr(fn, thing, b"x", **kwargs) self.assertEqual(set(listxattr(fn)), set(init_xattr) | set(many)) diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index ca604df7..4437f878 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -831,6 +831,14 @@ class PureWindowsPathTest(_BasePurePathTest, unittest.TestCase): ], }) + def test_constructor_nested_foreign_flavour(self): + # See GH-125069. + p1 = pathlib.PurePosixPath('b/c:\\d') + p2 = pathlib.PurePosixPath('b/', 'c:\\d') + self.assertEqual(p1, p2) + self.assertEqual(self.cls(p1), self.cls('b/c:/d')) + self.assertEqual(self.cls(p2), self.cls('b/c:/d')) + def test_drive_root_parts(self): check = self._check_drive_root_parts # First part is anchored. diff --git a/Lib/test/test_patma.py b/Lib/test/test_patma.py index 3dbd19df..6fe5360b 100644 --- a/Lib/test/test_patma.py +++ b/Lib/test/test_patma.py @@ -1,6 +1,7 @@ import array import collections import dataclasses +import dis import enum import inspect import sys @@ -3083,6 +3084,24 @@ class Keys: self.assertIs(y, None) self.assertIs(z, None) +class TestSourceLocations(unittest.TestCase): + def test_jump_threading(self): + # See gh-123048 + def f(): + x = 0 + v = 1 + match v: + case 1: + if x < 0: + x = 1 + case 2: + if x < 0: + x = 1 + x += 1 + + for inst in dis.get_instructions(f): + if inst.opcode in dis.hasjrel or inst.opcode in dis.hasjabs: + self.assertIsNotNone(inst.positions.lineno, "jump without location") class TestTracing(unittest.TestCase): diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index 24324a37..bd61de0a 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -352,6 +352,42 @@ def test_pdb_breakpoint_commands(): 4 """ +def test_pdb_breakpoint_on_annotated_function_def(): + """Test breakpoints on function definitions with annotation. + + >>> def foo[T](): + ... return 0 + + >>> def bar() -> int: + ... return 0 + + >>> def foobar[T]() -> int: + ... return 0 + + >>> reset_Breakpoint() + + >>> def test_function(): + ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() + ... pass + + >>> with PdbTestInput([ # doctest: +NORMALIZE_WHITESPACE + ... 'break foo', + ... 'break bar', + ... 'break foobar', + ... 'continue', + ... ]): + ... test_function() + > (3)test_function() + -> pass + (Pdb) break foo + Breakpoint 1 at :1 + (Pdb) break bar + Breakpoint 2 at :1 + (Pdb) break foobar + Breakpoint 3 at :1 + (Pdb) continue + """ + def test_pdb_breakpoints_preserved_across_interactive_sessions(): """Breakpoints are remembered between interactive sessions @@ -446,6 +482,38 @@ def test_pdb_pp_repr_exc(): (Pdb) continue """ +def test_pdb_empty_line(): + """Test that empty line repeats the last command. + + >>> def test_function(): + ... x = 1 + ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() + ... pass + ... y = 2 + + >>> with PdbTestInput([ # doctest: +NORMALIZE_WHITESPACE + ... 'p x', + ... '', # Should repeat p x + ... 'n ;; p 0 ;; p x', # Fill cmdqueue with multiple commands + ... '', # Should still repeat p x + ... 'continue', + ... ]): + ... test_function() + > (4)test_function() + -> pass + (Pdb) p x + 1 + (Pdb) + 1 + (Pdb) n ;; p 0 ;; p x + 0 + 1 + > (5)test_function() + -> y = 2 + (Pdb) + 1 + (Pdb) continue + """ def do_nothing(): pass @@ -2251,6 +2319,20 @@ def test_issue26053(self): self.assertRegex(res, "Restarting .* with arguments:\na b c") self.assertRegex(res, "Restarting .* with arguments:\nd e f") + def test_step_into_botframe(self): + # gh-125422 + # pdb should not be able to step into the botframe (bdb.py) + script = "x = 1" + commands = """ + step + step + step + quit + """ + stdout, _ = self.run_pdb_script(script, commands) + self.assertIn("The program finished", stdout) + self.assertNotIn("bdb.py", stdout) + def test_pdbrc_basic(self): script = textwrap.dedent(""" a = 1 @@ -2708,6 +2790,16 @@ def _create_fake_frozen_module(): # verify that pdb found the source of the "frozen" function self.assertIn('x = "Sentinel string for gh-93696"', stdout, "Sentinel statement not found") + def test_empty_file(self): + script = '' + commands = 'q\n' + # We check that pdb stopped at line 0, but anything reasonable + # is acceptable here, as long as it does not halt + stdout, _ = self.run_pdb_script(script, commands) + self.assertIn('main.py(0)', stdout) + stdout, _ = self.run_pdb_module(script, commands) + self.assertIn('__main__.py(0)', stdout) + def test_non_utf8_encoding(self): script_dir = os.path.join(os.path.dirname(__file__), 'encoded_modules') for filename in os.listdir(script_dir): diff --git a/Lib/test/test_pickle.py b/Lib/test/test_pickle.py index 1a55da39..32fb3590 100644 --- a/Lib/test/test_pickle.py +++ b/Lib/test/test_pickle.py @@ -16,6 +16,7 @@ from test.pickletester import AbstractHookTests from test.pickletester import AbstractUnpickleTests +from test.pickletester import AbstractPicklingErrorTests from test.pickletester import AbstractPickleTests from test.pickletester import AbstractPickleModuleTests from test.pickletester import AbstractPersistentPicklerTests @@ -55,6 +56,18 @@ def loads(self, buf, **kwds): return u.load() +class PyPicklingErrorTests(AbstractPicklingErrorTests, unittest.TestCase): + + pickler = pickle._Pickler + + def dumps(self, arg, proto=None, **kwargs): + f = io.BytesIO() + p = self.pickler(f, proto, **kwargs) + p.dump(arg) + f.seek(0) + return bytes(f.read()) + + class PyPicklerTests(AbstractPickleTests, unittest.TestCase): pickler = pickle._Pickler @@ -88,6 +101,8 @@ def loads(self, buf, **kwds): return pickle.loads(buf, **kwds) test_framed_write_sizes_with_delayed_writer = None + test_find_class = None + test_custom_find_class = None class PersistentPicklerUnpicklerMixin(object): @@ -245,6 +260,9 @@ class CUnpicklerTests(PyUnpicklerTests): bad_stack_errors = (pickle.UnpicklingError,) truncated_errors = (pickle.UnpicklingError,) + class CPicklingErrorTests(PyPicklingErrorTests): + pickler = _pickle.Pickler + class CPicklerTests(PyPicklerTests): pickler = _pickle.Pickler unpickler = _pickle.Unpickler diff --git a/Lib/test/test_pickletools.py b/Lib/test/test_pickletools.py index d37af79e..5cb9ce43 100644 --- a/Lib/test/test_pickletools.py +++ b/Lib/test/test_pickletools.py @@ -1,3 +1,4 @@ +import io import pickle import pickletools from test import support @@ -62,6 +63,397 @@ def test_optimize_binput_and_memoize(self): self.assertNotIn(pickle.BINPUT, pickled2) +class SimpleReader: + def __init__(self, data): + self.data = data + self.pos = 0 + + def read(self, n): + data = self.data[self.pos: self.pos + n] + self.pos += n + return data + + def readline(self): + nl = self.data.find(b'\n', self.pos) + 1 + if not nl: + nl = len(self.data) + data = self.data[self.pos: nl] + self.pos = nl + return data + + +class GenopsTests(unittest.TestCase): + def test_genops(self): + it = pickletools.genops(b'(I123\nK\x12J\x12\x34\x56\x78t.') + self.assertEqual([(item[0].name,) + item[1:] for item in it], [ + ('MARK', None, 0), + ('INT', 123, 1), + ('BININT1', 0x12, 6), + ('BININT', 0x78563412, 8), + ('TUPLE', None, 13), + ('STOP', None, 14), + ]) + + def test_from_file(self): + f = io.BytesIO(b'prefix(I123\nK\x12J\x12\x34\x56\x78t.suffix') + self.assertEqual(f.read(6), b'prefix') + it = pickletools.genops(f) + self.assertEqual([(item[0].name,) + item[1:] for item in it], [ + ('MARK', None, 6), + ('INT', 123, 7), + ('BININT1', 0x12, 12), + ('BININT', 0x78563412, 14), + ('TUPLE', None, 19), + ('STOP', None, 20), + ]) + self.assertEqual(f.read(), b'suffix') + + def test_without_pos(self): + f = SimpleReader(b'(I123\nK\x12J\x12\x34\x56\x78t.') + it = pickletools.genops(f) + self.assertEqual([(item[0].name,) + item[1:] for item in it], [ + ('MARK', None, None), + ('INT', 123, None), + ('BININT1', 0x12, None), + ('BININT', 0x78563412, None), + ('TUPLE', None, None), + ('STOP', None, None), + ]) + + def test_no_stop(self): + it = pickletools.genops(b'N') + item = next(it) + self.assertEqual(item[0].name, 'NONE') + with self.assertRaisesRegex(ValueError, + 'pickle exhausted before seeing STOP'): + next(it) + + def test_truncated_data(self): + it = pickletools.genops(b'I123') + with self.assertRaisesRegex(ValueError, + 'no newline found when trying to read stringnl'): + next(it) + it = pickletools.genops(b'J\x12\x34') + with self.assertRaisesRegex(ValueError, + 'not enough data in stream to read int4'): + next(it) + + def test_unknown_opcode(self): + it = pickletools.genops(b'N\xff') + item = next(it) + self.assertEqual(item[0].name, 'NONE') + with self.assertRaisesRegex(ValueError, + r"at position 1, opcode b'\\xff' unknown"): + next(it) + + def test_unknown_opcode_without_pos(self): + f = SimpleReader(b'N\xff') + it = pickletools.genops(f) + item = next(it) + self.assertEqual(item[0].name, 'NONE') + with self.assertRaisesRegex(ValueError, + r"at position , opcode b'\\xff' unknown"): + next(it) + + +class DisTests(unittest.TestCase): + maxDiff = None + + def check_dis(self, data, expected, **kwargs): + out = io.StringIO() + pickletools.dis(data, out=out, **kwargs) + self.assertEqual(out.getvalue(), expected) + + def check_dis_error(self, data, expected, expected_error, **kwargs): + out = io.StringIO() + with self.assertRaisesRegex(ValueError, expected_error): + pickletools.dis(data, out=out, **kwargs) + self.assertEqual(out.getvalue(), expected) + + def test_mark(self): + self.check_dis(b'(N(tl.', '''\ + 0: ( MARK + 1: N NONE + 2: ( MARK + 3: t TUPLE (MARK at 2) + 4: l LIST (MARK at 0) + 5: . STOP +highest protocol among opcodes = 0 +''') + + def test_indentlevel(self): + self.check_dis(b'(N(tl.', '''\ + 0: ( MARK + 1: N NONE + 2: ( MARK + 3: t TUPLE (MARK at 2) + 4: l LIST (MARK at 0) + 5: . STOP +highest protocol among opcodes = 0 +''', indentlevel=2) + + def test_mark_without_pos(self): + self.check_dis(SimpleReader(b'(N(tl.'), '''\ +( MARK +N NONE +( MARK +t TUPLE (MARK at unknown opcode offset) +l LIST (MARK at unknown opcode offset) +. STOP +highest protocol among opcodes = 0 +''') + + def test_no_mark(self): + self.check_dis_error(b'Nt.', '''\ + 0: N NONE + 1: t TUPLE no MARK exists on stack +''', 'no MARK exists on stack') + + def test_put(self): + self.check_dis(b'Np0\nq\x01r\x02\x00\x00\x00\x94.', '''\ + 0: N NONE + 1: p PUT 0 + 4: q BINPUT 1 + 6: r LONG_BINPUT 2 + 11: \\x94 MEMOIZE (as 3) + 12: . STOP +highest protocol among opcodes = 4 +''') + + def test_put_redefined(self): + self.check_dis_error(b'Np1\np1\n.', '''\ + 0: N NONE + 1: p PUT 1 + 4: p PUT 1 +''', 'memo key 1 already defined') + self.check_dis_error(b'Np1\nq\x01.', '''\ + 0: N NONE + 1: p PUT 1 + 4: q BINPUT 1 +''', 'memo key 1 already defined') + self.check_dis_error(b'Np1\nr\x01\x00\x00\x00.', '''\ + 0: N NONE + 1: p PUT 1 + 4: r LONG_BINPUT 1 +''', 'memo key 1 already defined') + self.check_dis_error(b'Np1\n\x94.', '''\ + 0: N NONE + 1: p PUT 1 + 4: \\x94 MEMOIZE (as 1) +''', 'memo key None already defined') + + def test_put_empty_stack(self): + self.check_dis_error(b'p0\n', '''\ + 0: p PUT 0 +''', "stack is empty -- can't store into memo") + + def test_put_markobject(self): + self.check_dis_error(b'(p0\n', '''\ + 0: ( MARK + 1: p PUT 0 +''', "can't store markobject in the memo") + + def test_get(self): + self.check_dis(b'(Np1\ng1\nh\x01j\x01\x00\x00\x00t.', '''\ + 0: ( MARK + 1: N NONE + 2: p PUT 1 + 5: g GET 1 + 8: h BINGET 1 + 10: j LONG_BINGET 1 + 15: t TUPLE (MARK at 0) + 16: . STOP +highest protocol among opcodes = 1 +''') + + def test_get_without_put(self): + self.check_dis_error(b'g1\n.', '''\ + 0: g GET 1 +''', 'memo key 1 has never been stored into') + self.check_dis_error(b'h\x01.', '''\ + 0: h BINGET 1 +''', 'memo key 1 has never been stored into') + self.check_dis_error(b'j\x01\x00\x00\x00.', '''\ + 0: j LONG_BINGET 1 +''', 'memo key 1 has never been stored into') + + def test_memo(self): + memo = {} + self.check_dis(b'Np1\n.', '''\ + 0: N NONE + 1: p PUT 1 + 4: . STOP +highest protocol among opcodes = 0 +''', memo=memo) + self.check_dis(b'g1\n.', '''\ + 0: g GET 1 + 3: . STOP +highest protocol among opcodes = 0 +''', memo=memo) + + def test_mark_pop(self): + self.check_dis(b'(N00N.', '''\ + 0: ( MARK + 1: N NONE + 2: 0 POP + 3: 0 POP (MARK at 0) + 4: N NONE + 5: . STOP +highest protocol among opcodes = 0 +''') + + def test_too_small_stack(self): + self.check_dis_error(b'a', '''\ + 0: a APPEND +''', 'tries to pop 2 items from stack with only 0 items') + self.check_dis_error(b']a', '''\ + 0: ] EMPTY_LIST + 1: a APPEND +''', 'tries to pop 2 items from stack with only 1 items') + + def test_no_stop(self): + self.check_dis_error(b'N', '''\ + 0: N NONE +''', 'pickle exhausted before seeing STOP') + + def test_truncated_data(self): + self.check_dis_error(b'NI123', '''\ + 0: N NONE +''', 'no newline found when trying to read stringnl') + self.check_dis_error(b'NJ\x12\x34', '''\ + 0: N NONE +''', 'not enough data in stream to read int4') + + def test_unknown_opcode(self): + self.check_dis_error(b'N\xff', '''\ + 0: N NONE +''', r"at position 1, opcode b'\\xff' unknown") + + def test_stop_not_empty_stack(self): + self.check_dis_error(b']N.', '''\ + 0: ] EMPTY_LIST + 1: N NONE + 2: . STOP +highest protocol among opcodes = 1 +''', r'stack not empty after STOP: \[list\]') + + def test_annotate(self): + self.check_dis(b'(Nt.', '''\ + 0: ( MARK Push markobject onto the stack. + 1: N NONE Push None on the stack. + 2: t TUPLE (MARK at 0) Build a tuple out of the topmost stack slice, after markobject. + 3: . STOP Stop the unpickling machine. +highest protocol among opcodes = 0 +''', annotate=1) + self.check_dis(b'(Nt.', '''\ + 0: ( MARK Push markobject onto the stack. + 1: N NONE Push None on the stack. + 2: t TUPLE (MARK at 0) Build a tuple out of the topmost stack slice, after markobject. + 3: . STOP Stop the unpickling machine. +highest protocol among opcodes = 0 +''', annotate=20) + self.check_dis(b'(((((((ttttttt.', '''\ + 0: ( MARK Push markobject onto the stack. + 1: ( MARK Push markobject onto the stack. + 2: ( MARK Push markobject onto the stack. + 3: ( MARK Push markobject onto the stack. + 4: ( MARK Push markobject onto the stack. + 5: ( MARK Push markobject onto the stack. + 6: ( MARK Push markobject onto the stack. + 7: t TUPLE (MARK at 6) Build a tuple out of the topmost stack slice, after markobject. + 8: t TUPLE (MARK at 5) Build a tuple out of the topmost stack slice, after markobject. + 9: t TUPLE (MARK at 4) Build a tuple out of the topmost stack slice, after markobject. + 10: t TUPLE (MARK at 3) Build a tuple out of the topmost stack slice, after markobject. + 11: t TUPLE (MARK at 2) Build a tuple out of the topmost stack slice, after markobject. + 12: t TUPLE (MARK at 1) Build a tuple out of the topmost stack slice, after markobject. + 13: t TUPLE (MARK at 0) Build a tuple out of the topmost stack slice, after markobject. + 14: . STOP Stop the unpickling machine. +highest protocol among opcodes = 0 +''', annotate=20) + + def test_string(self): + self.check_dis(b"S'abc'\n.", '''\ + 0: S STRING 'abc' + 7: . STOP +highest protocol among opcodes = 0 +''') + self.check_dis(b'S"abc"\n.', '''\ + 0: S STRING 'abc' + 7: . STOP +highest protocol among opcodes = 0 +''') + self.check_dis(b"S'\xc3\xb5'\n.", '''\ + 0: S STRING '\\xc3\\xb5' + 6: . STOP +highest protocol among opcodes = 0 +''') + + def test_string_without_quotes(self): + self.check_dis_error(b"Sabc'\n.", '', + 'no string quotes around b"abc\'"') + self.check_dis_error(b'Sabc"\n.', '', + "no string quotes around b'abc\"'") + self.check_dis_error(b"S'abc\n.", '', + '''strinq quote b"'" not found at both ends of b"'abc"''') + self.check_dis_error(b'S"abc\n.', '', + r"""strinq quote b'"' not found at both ends of b'"abc'""") + self.check_dis_error(b"S'abc\"\n.", '', + r"""strinq quote b"'" not found at both ends of b'\\'abc"'""") + self.check_dis_error(b"S\"abc'\n.", '', + r"""strinq quote b'"' not found at both ends of b'"abc\\''""") + + def test_binstring(self): + self.check_dis(b"T\x03\x00\x00\x00abc.", '''\ + 0: T BINSTRING 'abc' + 8: . STOP +highest protocol among opcodes = 1 +''') + self.check_dis(b"T\x02\x00\x00\x00\xc3\xb5.", '''\ + 0: T BINSTRING '\\xc3\\xb5' + 7: . STOP +highest protocol among opcodes = 1 +''') + + def test_short_binstring(self): + self.check_dis(b"U\x03abc.", '''\ + 0: U SHORT_BINSTRING 'abc' + 5: . STOP +highest protocol among opcodes = 1 +''') + self.check_dis(b"U\x02\xc3\xb5.", '''\ + 0: U SHORT_BINSTRING '\\xc3\\xb5' + 4: . STOP +highest protocol among opcodes = 1 +''') + + def test_global(self): + self.check_dis(b"cmodule\nname\n.", '''\ + 0: c GLOBAL 'module name' + 13: . STOP +highest protocol among opcodes = 0 +''') + self.check_dis(b"cm\xc3\xb6dule\nn\xc3\xa4me\n.", '''\ + 0: c GLOBAL 'm\xf6dule n\xe4me' + 15: . STOP +highest protocol among opcodes = 0 +''') + + def test_inst(self): + self.check_dis(b"(imodule\nname\n.", '''\ + 0: ( MARK + 1: i INST 'module name' (MARK at 0) + 14: . STOP +highest protocol among opcodes = 0 +''') + + def test_persid(self): + self.check_dis(b"Pabc\n.", '''\ + 0: P PERSID 'abc' + 5: . STOP +highest protocol among opcodes = 0 +''') + + class MiscTestCase(unittest.TestCase): def test__all__(self): not_exported = { diff --git a/Lib/test/test_pkgutil.py b/Lib/test/test_pkgutil.py index d095f440..ca692755 100644 --- a/Lib/test/test_pkgutil.py +++ b/Lib/test/test_pkgutil.py @@ -522,7 +522,43 @@ def test_mixed_namespace(self): del sys.modules['foo.bar'] del sys.modules['foo.baz'] - # XXX: test .pkg files + + def test_extend_path_argument_types(self): + pkgname = 'foo' + dirname_0 = self.create_init(pkgname) + + # If the input path is not a list it is returned unchanged + self.assertEqual('notalist', pkgutil.extend_path('notalist', 'foo')) + self.assertEqual(('not', 'a', 'list'), pkgutil.extend_path(('not', 'a', 'list'), 'foo')) + self.assertEqual(123, pkgutil.extend_path(123, 'foo')) + self.assertEqual(None, pkgutil.extend_path(None, 'foo')) + + # Cleanup + shutil.rmtree(dirname_0) + del sys.path[0] + + + def test_extend_path_pkg_files(self): + pkgname = 'foo' + dirname_0 = self.create_init(pkgname) + + with open(os.path.join(dirname_0, 'bar.pkg'), 'w') as pkg_file: + pkg_file.write('\n'.join([ + 'baz', + '/foo/bar/baz', + '', + '#comment' + ])) + + extended_paths = pkgutil.extend_path(sys.path, 'bar') + + self.assertEqual(extended_paths[:-2], sys.path) + self.assertEqual(extended_paths[-2], 'baz') + self.assertEqual(extended_paths[-1], '/foo/bar/baz') + + # Cleanup + shutil.rmtree(dirname_0) + del sys.path[0] class NestedNamespacePackageTest(unittest.TestCase): @@ -588,8 +624,11 @@ def test_get_loader_handles_missing_spec_attribute(self): mod = type(sys)(name) del mod.__spec__ with CleanImport(name): - sys.modules[name] = mod - loader = pkgutil.get_loader(name) + try: + sys.modules[name] = mod + loader = pkgutil.get_loader(name) + finally: + sys.modules.pop(name, None) self.assertIsNone(loader) @ignore_warnings(category=DeprecationWarning) @@ -598,8 +637,11 @@ def test_get_loader_handles_spec_attribute_none(self): mod = type(sys)(name) mod.__spec__ = None with CleanImport(name): - sys.modules[name] = mod - loader = pkgutil.get_loader(name) + try: + sys.modules[name] = mod + loader = pkgutil.get_loader(name) + finally: + sys.modules.pop(name, None) self.assertIsNone(loader) @ignore_warnings(category=DeprecationWarning) diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index 7ed45acf..e225b891 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -6,12 +6,14 @@ from test.support import warnings_helper from test.support.script_helper import assert_python_ok +import copy import errno import sys import signal import time import os import platform +import pickle import stat import tempfile import unittest @@ -411,8 +413,10 @@ def test_posix_fallocate(self): # issue33655: Also ignore EINVAL on *BSD since ZFS is also # often used there. if inst.errno == errno.EINVAL and sys.platform.startswith( - ('sunos', 'freebsd', 'netbsd', 'openbsd', 'gnukfreebsd')): + ('sunos', 'freebsd', 'openbsd', 'gnukfreebsd')): raise unittest.SkipTest("test may fail on ZFS filesystems") + elif inst.errno == errno.EOPNOTSUPP and sys.platform.startswith("netbsd"): + raise unittest.SkipTest("test may fail on FFS filesystems") else: raise finally: @@ -1306,6 +1310,19 @@ def test_get_and_set_scheduler_and_param(self): param = posix.sched_param(sched_priority=-large) self.assertRaises(OverflowError, posix.sched_setparam, 0, param) + @requires_sched + def test_sched_param(self): + param = posix.sched_param(1) + for proto in range(pickle.HIGHEST_PROTOCOL+1): + newparam = pickle.loads(pickle.dumps(param, proto)) + self.assertEqual(newparam, param) + newparam = copy.copy(param) + self.assertIsNot(newparam, param) + self.assertEqual(newparam, param) + newparam = copy.deepcopy(param) + self.assertIsNot(newparam, param) + self.assertEqual(newparam, param) + @unittest.skipUnless(hasattr(posix, "sched_rr_get_interval"), "no function") def test_sched_rr_get_interval(self): try: diff --git a/Lib/test/test_posixpath.py b/Lib/test/test_posixpath.py index 932d8a35..cc4fd2f4 100644 --- a/Lib/test/test_posixpath.py +++ b/Lib/test/test_posixpath.py @@ -347,13 +347,19 @@ def test_expanduser_pwd(self): "no home directory on VxWorks") def test_expanduser_pwd2(self): pwd = import_helper.import_module('pwd') - for e in pwd.getpwall(): - name = e.pw_name - home = e.pw_dir + for all_entry in pwd.getpwall(): + name = all_entry.pw_name + + # gh-121200: pw_dir can be different between getpwall() and + # getpwnam(), so use getpwnam() pw_dir as expanduser() does. + entry = pwd.getpwnam(name) + home = entry.pw_dir home = home.rstrip('/') or '/' - self.assertEqual(posixpath.expanduser('~' + name), home) - self.assertEqual(posixpath.expanduser(os.fsencode('~' + name)), - os.fsencode(home)) + + with self.subTest(all_entry=all_entry, entry=entry): + self.assertEqual(posixpath.expanduser('~' + name), home) + self.assertEqual(posixpath.expanduser(os.fsencode('~' + name)), + os.fsencode(home)) NORMPATH_CASES = [ ("", "."), diff --git a/Lib/test/test_property.py b/Lib/test/test_property.py index 4de2bb37..4d632cd8 100644 --- a/Lib/test/test_property.py +++ b/Lib/test/test_property.py @@ -406,7 +406,7 @@ def getter3(self): self.assertEqual(p2.__doc__, "doc-A") # Case-3: with no user-provided doc new getter doc - # takes precendence + # takes precedence p = property(getter2, None, None, None) p2 = p.getter(getter3) @@ -431,6 +431,40 @@ def getter3(self): self.assertEqual(p.__doc__, "user") self.assertEqual(p2.__doc__, "user") + @unittest.skipIf(sys.flags.optimize >= 2, + "Docstrings are omitted with -O2 and above") + def test_prefer_explicit_doc(self): + # Issue 25757: subclasses of property lose docstring + self.assertEqual(property(doc="explicit doc").__doc__, "explicit doc") + self.assertEqual(PropertySub(doc="explicit doc").__doc__, "explicit doc") + + class Foo: + spam = PropertySub(doc="spam explicit doc") + + @spam.getter + def spam(self): + """ignored as doc already set""" + return 1 + + def _stuff_getter(self): + """ignored as doc set directly""" + stuff = PropertySub(doc="stuff doc argument", fget=_stuff_getter) + + #self.assertEqual(Foo.spam.__doc__, "spam explicit doc") + self.assertEqual(Foo.stuff.__doc__, "stuff doc argument") + + def test_property_no_doc_on_getter(self): + # If a property's getter has no __doc__ then the property's doc should + # be None; test that this is consistent with subclasses as well; see + # GH-2487 + class NoDoc: + @property + def __doc__(self): + raise AttributeError + + self.assertEqual(property(NoDoc()).__doc__, None) + self.assertEqual(PropertySub(NoDoc()).__doc__, None) + @unittest.skipIf(sys.flags.optimize >= 2, "Docstrings are omitted with -O2 and above") def test_property_setter_copies_getter_docstring(self): diff --git a/Lib/test/test_pyclbr.py b/Lib/test/test_pyclbr.py index 23453e34..5415fa08 100644 --- a/Lib/test/test_pyclbr.py +++ b/Lib/test/test_pyclbr.py @@ -78,7 +78,8 @@ def ismethod(oclass, obj, name): objname = obj.__name__ if objname.startswith("__") and not objname.endswith("__"): - objname = "_%s%s" % (oclass.__name__, objname) + if stripped_typename := oclass.__name__.lstrip('_'): + objname = f"_{stripped_typename}{objname}" return objname == name # Make sure the toplevel functions and classes are the same. @@ -111,12 +112,16 @@ def ismethod(oclass, obj, name): for m in py_item.__dict__.keys(): if ismethod(py_item, getattr(py_item, m), m): actualMethods.append(m) - foundMethods = [] - for m in value.methods.keys(): - if m[:2] == '__' and m[-2:] != '__': - foundMethods.append('_'+name+m) - else: - foundMethods.append(m) + + if stripped_typename := name.lstrip('_'): + foundMethods = [] + for m in value.methods.keys(): + if m.startswith('__') and not m.endswith('__'): + foundMethods.append(f"_{stripped_typename}{m}") + else: + foundMethods.append(m) + else: + foundMethods = list(value.methods.keys()) try: self.assertListEq(foundMethods, actualMethods, ignore) @@ -150,8 +155,9 @@ def test_easy(self): "DocTestCase", '_DocTestSuite')) self.checkModule('difflib', ignore=("Match",)) - def test_decorators(self): - self.checkModule('test.pyclbr_input', ignore=['om']) + def test_cases(self): + # see test.pyclbr_input for the rationale behind the ignored symbols + self.checkModule('test.pyclbr_input', ignore=['om', 'f']) def test_nested(self): mb = pyclbr diff --git a/Lib/test/test_pydoc/test_pydoc.py b/Lib/test/test_pydoc/test_pydoc.py index a35257c8..6e80b543 100644 --- a/Lib/test/test_pydoc/test_pydoc.py +++ b/Lib/test/test_pydoc/test_pydoc.py @@ -15,6 +15,7 @@ import types import typing import unittest +import unittest.mock import urllib.parse import xml.etree import xml.etree.ElementTree @@ -377,6 +378,11 @@ def html2text(html): class PydocBaseTest(unittest.TestCase): + def tearDown(self): + # Self-testing. Mocking only works if sys.modules['pydoc'] and pydoc + # are the same. But some pydoc functions reload the module and change + # sys.modules, so check that it was restored. + self.assertIs(sys.modules['pydoc'], pydoc) def _restricted_walk_packages(self, walk_packages, path=None): """ @@ -408,6 +414,8 @@ def call_url_handler(self, url, expected_title): class PydocDocTest(unittest.TestCase): maxDiff = None + def tearDown(self): + self.assertIs(sys.modules['pydoc'], pydoc) @unittest.skipIf(hasattr(sys, 'gettrace') and sys.gettrace(), 'trace function introduces __locals__ unexpectedly') @@ -656,16 +664,13 @@ def test_fail_help_output_redirect(self): @unittest.skipIf(hasattr(sys, 'gettrace') and sys.gettrace(), 'trace function introduces __locals__ unexpectedly') + @unittest.mock.patch('pydoc.pager') @requires_docstrings - def test_help_output_redirect(self): + def test_help_output_redirect(self, pager_mock): # issue 940286, if output is set in Helper, then all output from # Helper.help should be redirected - getpager_old = pydoc.getpager - getpager_new = lambda: (lambda x: x) self.maxDiff = None - buf = StringIO() - helper = pydoc.Helper(output=buf) unused, doc_loc = get_pydoc_text(pydoc_mod) module = "test.test_pydoc.pydoc_mod" help_header = """ @@ -675,21 +680,112 @@ def test_help_output_redirect(self): help_header = textwrap.dedent(help_header) expected_help_pattern = help_header + expected_text_pattern - pydoc.getpager = getpager_new - try: + with captured_output('stdout') as output, \ + captured_output('stderr') as err, \ + StringIO() as buf: + helper = pydoc.Helper(output=buf) + helper.help(module) + result = buf.getvalue().strip() + expected_text = expected_help_pattern % ( + (doc_loc,) + + expected_text_data_docstrings + + (inspect.getabsfile(pydoc_mod),)) + self.assertEqual('', output.getvalue()) + self.assertEqual('', err.getvalue()) + self.assertEqual(expected_text, result) + + pager_mock.assert_not_called() + + @unittest.skipIf(hasattr(sys, 'gettrace') and sys.gettrace(), + 'trace function introduces __locals__ unexpectedly') + @requires_docstrings + @unittest.mock.patch('pydoc.pager') + def test_help_output_redirect_various_requests(self, pager_mock): + # issue 940286, if output is set in Helper, then all output from + # Helper.help should be redirected + + def run_pydoc_for_request(request, expected_text_part): + """Helper function to run pydoc with its output redirected""" with captured_output('stdout') as output, \ - captured_output('stderr') as err: - helper.help(module) + captured_output('stderr') as err, \ + StringIO() as buf: + helper = pydoc.Helper(output=buf) + helper.help(request) result = buf.getvalue().strip() - expected_text = expected_help_pattern % ( - (doc_loc,) + - expected_text_data_docstrings + - (inspect.getabsfile(pydoc_mod),)) - self.assertEqual('', output.getvalue()) - self.assertEqual('', err.getvalue()) - self.assertEqual(expected_text, result) - finally: - pydoc.getpager = getpager_old + self.assertEqual('', output.getvalue(), msg=f'failed on request "{request}"') + self.assertEqual('', err.getvalue(), msg=f'failed on request "{request}"') + self.assertIn(expected_text_part, result, msg=f'failed on request "{request}"') + pager_mock.assert_not_called() + + self.maxDiff = None + + # test for "keywords" + run_pydoc_for_request('keywords', 'Here is a list of the Python keywords.') + # test for "symbols" + run_pydoc_for_request('symbols', 'Here is a list of the punctuation symbols') + # test for "topics" + run_pydoc_for_request('topics', 'Here is a list of available topics.') + # test for "modules" skipped, see test_modules() + # test for symbol "%" + run_pydoc_for_request('%', 'The power operator') + # test for special True, False, None keywords + run_pydoc_for_request('True', 'class bool(int)') + run_pydoc_for_request('False', 'class bool(int)') + run_pydoc_for_request('None', 'class NoneType(object)') + # test for keyword "assert" + run_pydoc_for_request('assert', 'The "assert" statement') + # test for topic "TYPES" + run_pydoc_for_request('TYPES', 'The standard type hierarchy') + # test for "pydoc.Helper.help" + run_pydoc_for_request('pydoc.Helper.help', 'Help on function help in pydoc.Helper:') + # test for pydoc.Helper.help + run_pydoc_for_request(pydoc.Helper.help, 'Help on function help in module pydoc:') + # test for pydoc.Helper() instance skipped because it is always meant to be interactive + + def test_showtopic(self): + with captured_stdout() as showtopic_io: + helper = pydoc.Helper() + helper.showtopic('with') + helptext = showtopic_io.getvalue() + self.assertIn('The "with" statement', helptext) + + def test_fail_showtopic(self): + with captured_stdout() as showtopic_io: + helper = pydoc.Helper() + helper.showtopic('abd') + expected = "no documentation found for 'abd'" + self.assertEqual(expected, showtopic_io.getvalue().strip()) + + @unittest.mock.patch('pydoc.pager') + def test_fail_showtopic_output_redirect(self, pager_mock): + with StringIO() as buf: + helper = pydoc.Helper(output=buf) + helper.showtopic("abd") + expected = "no documentation found for 'abd'" + self.assertEqual(expected, buf.getvalue().strip()) + + pager_mock.assert_not_called() + + @unittest.skipIf(hasattr(sys, 'gettrace') and sys.gettrace(), + 'trace function introduces __locals__ unexpectedly') + @requires_docstrings + @unittest.mock.patch('pydoc.pager') + def test_showtopic_output_redirect(self, pager_mock): + # issue 940286, if output is set in Helper, then all output from + # Helper.showtopic should be redirected + self.maxDiff = None + + with captured_output('stdout') as output, \ + captured_output('stderr') as err, \ + StringIO() as buf: + helper = pydoc.Helper(output=buf) + helper.showtopic('with') + result = buf.getvalue().strip() + self.assertEqual('', output.getvalue()) + self.assertEqual('', err.getvalue()) + self.assertIn('The "with" statement', result) + + pager_mock.assert_not_called() def test_lambda_with_return_annotation(self): func = lambda a, b, c: 1 @@ -1062,15 +1158,20 @@ def test_modules_search_builtin(self): self.assertTrue(result.startswith(expected)) def test_importfile(self): - loaded_pydoc = pydoc.importfile(pydoc.__file__) + try: + loaded_pydoc = pydoc.importfile(pydoc.__file__) - self.assertIsNot(loaded_pydoc, pydoc) - self.assertEqual(loaded_pydoc.__name__, 'pydoc') - self.assertEqual(loaded_pydoc.__file__, pydoc.__file__) - self.assertEqual(loaded_pydoc.__spec__, pydoc.__spec__) + self.assertIsNot(loaded_pydoc, pydoc) + self.assertEqual(loaded_pydoc.__name__, 'pydoc') + self.assertEqual(loaded_pydoc.__file__, pydoc.__file__) + self.assertEqual(loaded_pydoc.__spec__, pydoc.__spec__) + finally: + sys.modules['pydoc'] = pydoc class TestDescriptions(unittest.TestCase): + def tearDown(self): + self.assertIs(sys.modules['pydoc'], pydoc) def test_module(self): # Check that pydocfodder module can be described @@ -1416,6 +1517,8 @@ def a_fn_with_https_link(): class PydocFodderTest(unittest.TestCase): + def tearDown(self): + self.assertIs(sys.modules['pydoc'], pydoc) def getsection(self, text, beginline, endline): lines = text.splitlines() @@ -1543,6 +1646,8 @@ def test_html_doc_routines_in_module(self): ) class PydocServerTest(unittest.TestCase): """Tests for pydoc._start_server""" + def tearDown(self): + self.assertIs(sys.modules['pydoc'], pydoc) def test_server(self): # Minimal test that starts the server, checks that it works, then stops @@ -1605,9 +1710,14 @@ def test_url_requests(self): ("foobar", "Pydoc: Error - foobar"), ] - with self.restrict_walk_packages(): - for url, title in requests: - self.call_url_handler(url, title) + self.assertIs(sys.modules['pydoc'], pydoc) + try: + with self.restrict_walk_packages(): + for url, title in requests: + self.call_url_handler(url, title) + finally: + # Some requests reload the module and change sys.modules. + sys.modules['pydoc'] = pydoc class TestHelper(unittest.TestCase): @@ -1617,6 +1727,9 @@ def test_keywords(self): class PydocWithMetaClasses(unittest.TestCase): + def tearDown(self): + self.assertIs(sys.modules['pydoc'], pydoc) + @unittest.skipIf(hasattr(sys, 'gettrace') and sys.gettrace(), 'trace function introduces __locals__ unexpectedly') @requires_docstrings diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index e279412e..fbab4953 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -820,31 +820,137 @@ def test_named_unicode_escapes(self): self.checkPatternError(br'\N{LESS-THAN SIGN}', r'bad escape \N', 0) self.checkPatternError(br'[\N{LESS-THAN SIGN}]', r'bad escape \N', 1) - def test_string_boundaries(self): + def test_word_boundaries(self): # See http://bugs.python.org/issue10713 - self.assertEqual(re.search(r"\b(abc)\b", "abc").group(1), - "abc") + self.assertEqual(re.search(r"\b(abc)\b", "abc").group(1), "abc") + self.assertEqual(re.search(r"\b(abc)\b", "abc", re.ASCII).group(1), "abc") + self.assertEqual(re.search(br"\b(abc)\b", b"abc").group(1), b"abc") + self.assertEqual(re.search(br"\b(abc)\b", b"abc", re.LOCALE).group(1), b"abc") + self.assertEqual(re.search(r"\b(ьюя)\b", "ьюя").group(1), "ьюя") + self.assertIsNone(re.search(r"\b(ьюя)\b", "ьюя", re.ASCII)) + # There's a word boundary between a word and a non-word. + self.assertTrue(re.match(r".\b", "a=")) + self.assertTrue(re.match(r".\b", "a=", re.ASCII)) + self.assertTrue(re.match(br".\b", b"a=")) + self.assertTrue(re.match(br".\b", b"a=", re.LOCALE)) + self.assertTrue(re.match(r".\b", "я=")) + self.assertIsNone(re.match(r".\b", "я=", re.ASCII)) + # There's a word boundary between a non-word and a word. + self.assertTrue(re.match(r".\b", "=a")) + self.assertTrue(re.match(r".\b", "=a", re.ASCII)) + self.assertTrue(re.match(br".\b", b"=a")) + self.assertTrue(re.match(br".\b", b"=a", re.LOCALE)) + self.assertTrue(re.match(r".\b", "=я")) + self.assertIsNone(re.match(r".\b", "=я", re.ASCII)) + # There is no word boundary inside a word. + self.assertIsNone(re.match(r".\b", "ab")) + self.assertIsNone(re.match(r".\b", "ab", re.ASCII)) + self.assertIsNone(re.match(br".\b", b"ab")) + self.assertIsNone(re.match(br".\b", b"ab", re.LOCALE)) + self.assertIsNone(re.match(r".\b", "юя")) + self.assertIsNone(re.match(r".\b", "юя", re.ASCII)) + # There is no word boundary between a non-word characters. + self.assertIsNone(re.match(r".\b", "=-")) + self.assertIsNone(re.match(r".\b", "=-", re.ASCII)) + self.assertIsNone(re.match(br".\b", b"=-")) + self.assertIsNone(re.match(br".\b", b"=-", re.LOCALE)) + # There is no non-boundary match between a word and a non-word. + self.assertIsNone(re.match(r".\B", "a=")) + self.assertIsNone(re.match(r".\B", "a=", re.ASCII)) + self.assertIsNone(re.match(br".\B", b"a=")) + self.assertIsNone(re.match(br".\B", b"a=", re.LOCALE)) + self.assertIsNone(re.match(r".\B", "я=")) + self.assertTrue(re.match(r".\B", "я=", re.ASCII)) + # There is no non-boundary match between a non-word and a word. + self.assertIsNone(re.match(r".\B", "=a")) + self.assertIsNone(re.match(r".\B", "=a", re.ASCII)) + self.assertIsNone(re.match(br".\B", b"=a")) + self.assertIsNone(re.match(br".\B", b"=a", re.LOCALE)) + self.assertIsNone(re.match(r".\B", "=я")) + self.assertTrue(re.match(r".\B", "=я", re.ASCII)) + # There's a non-boundary match inside a word. + self.assertTrue(re.match(r".\B", "ab")) + self.assertTrue(re.match(r".\B", "ab", re.ASCII)) + self.assertTrue(re.match(br".\B", b"ab")) + self.assertTrue(re.match(br".\B", b"ab", re.LOCALE)) + self.assertTrue(re.match(r".\B", "юя")) + self.assertTrue(re.match(r".\B", "юя", re.ASCII)) + # There's a non-boundary match between a non-word characters. + self.assertTrue(re.match(r".\B", "=-")) + self.assertTrue(re.match(r".\B", "=-", re.ASCII)) + self.assertTrue(re.match(br".\B", b"=-")) + self.assertTrue(re.match(br".\B", b"=-", re.LOCALE)) # There's a word boundary at the start of a string. self.assertTrue(re.match(r"\b", "abc")) + self.assertTrue(re.match(r"\b", "abc", re.ASCII)) + self.assertTrue(re.match(br"\b", b"abc")) + self.assertTrue(re.match(br"\b", b"abc", re.LOCALE)) + self.assertTrue(re.match(r"\b", "ьюя")) + self.assertIsNone(re.match(r"\b", "ьюя", re.ASCII)) + # There's a word boundary at the end of a string. + self.assertTrue(re.fullmatch(r".+\b", "abc")) + self.assertTrue(re.fullmatch(r".+\b", "abc", re.ASCII)) + self.assertTrue(re.fullmatch(br".+\b", b"abc")) + self.assertTrue(re.fullmatch(br".+\b", b"abc", re.LOCALE)) + self.assertTrue(re.fullmatch(r".+\b", "ьюя")) + self.assertIsNone(re.search(r"\b", "ьюя", re.ASCII)) # A non-empty string includes a non-boundary zero-length match. - self.assertTrue(re.search(r"\B", "abc")) + self.assertEqual(re.search(r"\B", "abc").span(), (1, 1)) + self.assertEqual(re.search(r"\B", "abc", re.ASCII).span(), (1, 1)) + self.assertEqual(re.search(br"\B", b"abc").span(), (1, 1)) + self.assertEqual(re.search(br"\B", b"abc", re.LOCALE).span(), (1, 1)) + self.assertEqual(re.search(r"\B", "ьюя").span(), (1, 1)) + self.assertEqual(re.search(r"\B", "ьюя", re.ASCII).span(), (0, 0)) # There is no non-boundary match at the start of a string. - self.assertFalse(re.match(r"\B", "abc")) + self.assertIsNone(re.match(r"\B", "abc")) + self.assertIsNone(re.match(r"\B", "abc", re.ASCII)) + self.assertIsNone(re.match(br"\B", b"abc")) + self.assertIsNone(re.match(br"\B", b"abc", re.LOCALE)) + self.assertIsNone(re.match(r"\B", "ьюя")) + self.assertTrue(re.match(r"\B", "ьюя", re.ASCII)) + # There is no non-boundary match at the end of a string. + self.assertIsNone(re.fullmatch(r".+\B", "abc")) + self.assertIsNone(re.fullmatch(r".+\B", "abc", re.ASCII)) + self.assertIsNone(re.fullmatch(br".+\B", b"abc")) + self.assertIsNone(re.fullmatch(br".+\B", b"abc", re.LOCALE)) + self.assertIsNone(re.fullmatch(r".+\B", "ьюя")) + self.assertTrue(re.fullmatch(r".+\B", "ьюя", re.ASCII)) # However, an empty string contains no word boundaries, and also no # non-boundaries. - self.assertIsNone(re.search(r"\B", "")) + self.assertIsNone(re.search(r"\b", "")) + self.assertIsNone(re.search(r"\b", "", re.ASCII)) + self.assertIsNone(re.search(br"\b", b"")) + self.assertIsNone(re.search(br"\b", b"", re.LOCALE)) # This one is questionable and different from the perlre behaviour, # but describes current behavior. - self.assertIsNone(re.search(r"\b", "")) + self.assertIsNone(re.search(r"\B", "")) + self.assertIsNone(re.search(r"\B", "", re.ASCII)) + self.assertIsNone(re.search(br"\B", b"")) + self.assertIsNone(re.search(br"\B", b"", re.LOCALE)) # A single word-character string has two boundaries, but no # non-boundary gaps. self.assertEqual(len(re.findall(r"\b", "a")), 2) + self.assertEqual(len(re.findall(r"\b", "a", re.ASCII)), 2) + self.assertEqual(len(re.findall(br"\b", b"a")), 2) + self.assertEqual(len(re.findall(br"\b", b"a", re.LOCALE)), 2) self.assertEqual(len(re.findall(r"\B", "a")), 0) + self.assertEqual(len(re.findall(r"\B", "a", re.ASCII)), 0) + self.assertEqual(len(re.findall(br"\B", b"a")), 0) + self.assertEqual(len(re.findall(br"\B", b"a", re.LOCALE)), 0) # If there are no words, there are no boundaries self.assertEqual(len(re.findall(r"\b", " ")), 0) + self.assertEqual(len(re.findall(r"\b", " ", re.ASCII)), 0) + self.assertEqual(len(re.findall(br"\b", b" ")), 0) + self.assertEqual(len(re.findall(br"\b", b" ", re.LOCALE)), 0) self.assertEqual(len(re.findall(r"\b", " ")), 0) + self.assertEqual(len(re.findall(r"\b", " ", re.ASCII)), 0) + self.assertEqual(len(re.findall(br"\b", b" ")), 0) + self.assertEqual(len(re.findall(br"\b", b" ", re.LOCALE)), 0) # Can match around the whitespace. self.assertEqual(len(re.findall(r"\B", " ")), 2) + self.assertEqual(len(re.findall(r"\B", " ", re.ASCII)), 2) + self.assertEqual(len(re.findall(br"\B", b" ")), 2) + self.assertEqual(len(re.findall(br"\B", b" ", re.LOCALE)), 2) def test_bigcharset(self): self.assertEqual(re.match("([\u2222\u2223])", @@ -967,6 +1073,39 @@ def test_ignore_case_set(self): self.assertTrue(re.match(br'[19a]', b'a', re.I)) self.assertTrue(re.match(br'[19a]', b'A', re.I)) self.assertTrue(re.match(br'[19A]', b'a', re.I)) + self.assertTrue(re.match(r'[19\xc7]', '\xc7', re.I)) + self.assertTrue(re.match(r'[19\xc7]', '\xe7', re.I)) + self.assertTrue(re.match(r'[19\xe7]', '\xc7', re.I)) + self.assertTrue(re.match(r'[19\xe7]', '\xe7', re.I)) + self.assertTrue(re.match(r'[19\u0400]', '\u0400', re.I)) + self.assertTrue(re.match(r'[19\u0400]', '\u0450', re.I)) + self.assertTrue(re.match(r'[19\u0450]', '\u0400', re.I)) + self.assertTrue(re.match(r'[19\u0450]', '\u0450', re.I)) + self.assertTrue(re.match(r'[19\U00010400]', '\U00010400', re.I)) + self.assertTrue(re.match(r'[19\U00010400]', '\U00010428', re.I)) + self.assertTrue(re.match(r'[19\U00010428]', '\U00010400', re.I)) + self.assertTrue(re.match(r'[19\U00010428]', '\U00010428', re.I)) + + self.assertTrue(re.match(br'[19A]', b'A', re.I)) + self.assertTrue(re.match(br'[19a]', b'a', re.I)) + self.assertTrue(re.match(br'[19a]', b'A', re.I)) + self.assertTrue(re.match(br'[19A]', b'a', re.I)) + self.assertTrue(re.match(r'[19A]', 'A', re.I|re.A)) + self.assertTrue(re.match(r'[19a]', 'a', re.I|re.A)) + self.assertTrue(re.match(r'[19a]', 'A', re.I|re.A)) + self.assertTrue(re.match(r'[19A]', 'a', re.I|re.A)) + self.assertTrue(re.match(r'[19\xc7]', '\xc7', re.I|re.A)) + self.assertIsNone(re.match(r'[19\xc7]', '\xe7', re.I|re.A)) + self.assertIsNone(re.match(r'[19\xe7]', '\xc7', re.I|re.A)) + self.assertTrue(re.match(r'[19\xe7]', '\xe7', re.I|re.A)) + self.assertTrue(re.match(r'[19\u0400]', '\u0400', re.I|re.A)) + self.assertIsNone(re.match(r'[19\u0400]', '\u0450', re.I|re.A)) + self.assertIsNone(re.match(r'[19\u0450]', '\u0400', re.I|re.A)) + self.assertTrue(re.match(r'[19\u0450]', '\u0450', re.I|re.A)) + self.assertTrue(re.match(r'[19\U00010400]', '\U00010400', re.I|re.A)) + self.assertIsNone(re.match(r'[19\U00010400]', '\U00010428', re.I|re.A)) + self.assertIsNone(re.match(r'[19\U00010428]', '\U00010400', re.I|re.A)) + self.assertTrue(re.match(r'[19\U00010428]', '\U00010428', re.I|re.A)) # Two different characters have the same lowercase. assert 'K'.lower() == '\u212a'.lower() == 'k' # 'K' @@ -1003,8 +1142,10 @@ def test_ignore_case_range(self): self.assertTrue(re.match(br'[9-a]', b'_', re.I)) self.assertIsNone(re.match(br'[9-A]', b'_', re.I)) self.assertTrue(re.match(r'[\xc0-\xde]', '\xd7', re.I)) + self.assertTrue(re.match(r'[\xc0-\xde]', '\xe7', re.I)) self.assertIsNone(re.match(r'[\xc0-\xde]', '\xf7', re.I)) self.assertTrue(re.match(r'[\xe0-\xfe]', '\xf7', re.I)) + self.assertTrue(re.match(r'[\xe0-\xfe]', '\xc7', re.I)) self.assertIsNone(re.match(r'[\xe0-\xfe]', '\xd7', re.I)) self.assertTrue(re.match(r'[\u0430-\u045f]', '\u0450', re.I)) self.assertTrue(re.match(r'[\u0430-\u045f]', '\u0400', re.I)) @@ -1015,6 +1156,26 @@ def test_ignore_case_range(self): self.assertTrue(re.match(r'[\U00010400-\U00010427]', '\U00010428', re.I)) self.assertTrue(re.match(r'[\U00010400-\U00010427]', '\U00010400', re.I)) + self.assertTrue(re.match(r'[\xc0-\xde]', '\xd7', re.I|re.A)) + self.assertIsNone(re.match(r'[\xc0-\xde]', '\xe7', re.I|re.A)) + self.assertTrue(re.match(r'[\xe0-\xfe]', '\xf7', re.I|re.A)) + self.assertIsNone(re.match(r'[\xe0-\xfe]', '\xc7', re.I|re.A)) + self.assertTrue(re.match(r'[\u0430-\u045f]', '\u0450', re.I|re.A)) + self.assertIsNone(re.match(r'[\u0430-\u045f]', '\u0400', re.I|re.A)) + self.assertIsNone(re.match(r'[\u0400-\u042f]', '\u0450', re.I|re.A)) + self.assertTrue(re.match(r'[\u0400-\u042f]', '\u0400', re.I|re.A)) + self.assertTrue(re.match(r'[\U00010428-\U0001044f]', '\U00010428', re.I|re.A)) + self.assertIsNone(re.match(r'[\U00010428-\U0001044f]', '\U00010400', re.I|re.A)) + self.assertIsNone(re.match(r'[\U00010400-\U00010427]', '\U00010428', re.I|re.A)) + self.assertTrue(re.match(r'[\U00010400-\U00010427]', '\U00010400', re.I|re.A)) + + self.assertTrue(re.match(r'[N-\x7f]', 'A', re.I|re.A)) + self.assertTrue(re.match(r'[n-\x7f]', 'Z', re.I|re.A)) + self.assertTrue(re.match(r'[N-\uffff]', 'A', re.I|re.A)) + self.assertTrue(re.match(r'[n-\uffff]', 'Z', re.I|re.A)) + self.assertTrue(re.match(r'[N-\U00010000]', 'A', re.I|re.A)) + self.assertTrue(re.match(r'[n-\U00010000]', 'Z', re.I|re.A)) + # Two different characters have the same lowercase. assert 'K'.lower() == '\u212a'.lower() == 'k' # 'K' self.assertTrue(re.match(r'[J-M]', '\u212a', re.I)) @@ -1052,47 +1213,76 @@ def test_not_literal(self): def test_possible_set_operations(self): s = bytes(range(128)).decode() - with self.assertWarns(FutureWarning): + with self.assertWarnsRegex(FutureWarning, 'Possible set difference') as w: p = re.compile(r'[0-9--1]') + self.assertEqual(w.filename, __file__) self.assertEqual(p.findall(s), list('-./0123456789')) + with self.assertWarnsRegex(FutureWarning, 'Possible set difference') as w: + self.assertEqual(re.findall(r'[0-9--2]', s), list('-./0123456789')) + self.assertEqual(w.filename, __file__) + self.assertEqual(re.findall(r'[--1]', s), list('-./01')) - with self.assertWarns(FutureWarning): + + with self.assertWarnsRegex(FutureWarning, 'Possible set difference') as w: p = re.compile(r'[%--1]') + self.assertEqual(w.filename, __file__) self.assertEqual(p.findall(s), list("%&'()*+,-1")) - with self.assertWarns(FutureWarning): + + with self.assertWarnsRegex(FutureWarning, 'Possible set difference ') as w: p = re.compile(r'[%--]') + self.assertEqual(w.filename, __file__) self.assertEqual(p.findall(s), list("%&'()*+,-")) - with self.assertWarns(FutureWarning): + with self.assertWarnsRegex(FutureWarning, 'Possible set intersection ') as w: p = re.compile(r'[0-9&&1]') + self.assertEqual(w.filename, __file__) self.assertEqual(p.findall(s), list('&0123456789')) - with self.assertWarns(FutureWarning): + with self.assertWarnsRegex(FutureWarning, 'Possible set intersection ') as w: + self.assertEqual(re.findall(r'[0-8&&1]', s), list('&012345678')) + self.assertEqual(w.filename, __file__) + + with self.assertWarnsRegex(FutureWarning, 'Possible set intersection ') as w: p = re.compile(r'[\d&&1]') + self.assertEqual(w.filename, __file__) self.assertEqual(p.findall(s), list('&0123456789')) + self.assertEqual(re.findall(r'[&&1]', s), list('&1')) - with self.assertWarns(FutureWarning): + with self.assertWarnsRegex(FutureWarning, 'Possible set union ') as w: p = re.compile(r'[0-9||a]') + self.assertEqual(w.filename, __file__) self.assertEqual(p.findall(s), list('0123456789a|')) - with self.assertWarns(FutureWarning): + + with self.assertWarnsRegex(FutureWarning, 'Possible set union ') as w: p = re.compile(r'[\d||a]') + self.assertEqual(w.filename, __file__) self.assertEqual(p.findall(s), list('0123456789a|')) + self.assertEqual(re.findall(r'[||1]', s), list('1|')) - with self.assertWarns(FutureWarning): + with self.assertWarnsRegex(FutureWarning, 'Possible set symmetric difference ') as w: p = re.compile(r'[0-9~~1]') + self.assertEqual(w.filename, __file__) self.assertEqual(p.findall(s), list('0123456789~')) - with self.assertWarns(FutureWarning): + + with self.assertWarnsRegex(FutureWarning, 'Possible set symmetric difference ') as w: p = re.compile(r'[\d~~1]') + self.assertEqual(w.filename, __file__) self.assertEqual(p.findall(s), list('0123456789~')) + self.assertEqual(re.findall(r'[~~1]', s), list('1~')) - with self.assertWarns(FutureWarning): + with self.assertWarnsRegex(FutureWarning, 'Possible nested set ') as w: p = re.compile(r'[[0-9]|]') + self.assertEqual(w.filename, __file__) self.assertEqual(p.findall(s), list('0123456789[]')) + with self.assertWarnsRegex(FutureWarning, 'Possible nested set ') as w: + self.assertEqual(re.findall(r'[[0-8]|]', s), list('012345678[]')) + self.assertEqual(w.filename, __file__) - with self.assertWarns(FutureWarning): + with self.assertWarnsRegex(FutureWarning, 'Possible nested set ') as w: p = re.compile(r'[[:digit:]|]') + self.assertEqual(w.filename, __file__) self.assertEqual(p.findall(s), list(':[]dgit')) def test_search_coverage(self): @@ -2411,6 +2601,12 @@ def test_bug_gh106052(self): self.assertEqual(re.match("(?>(?:ab?c){1,3})", "aca").span(), (0, 2)) self.assertEqual(re.match("(?:ab?c){1,3}+", "aca").span(), (0, 2)) + def test_bug_gh101955(self): + # Possessive quantifier with nested alternative with capture groups + self.assertEqual(re.match('((x)|y|z)*+', 'xyz').groups(), ('z', 'x')) + self.assertEqual(re.match('((x)|y|z){3}+', 'xyz').groups(), ('z', 'x')) + self.assertEqual(re.match('((x)|y|z){3,}+', 'xyz').groups(), ('z', 'x')) + @unittest.skipIf(multiprocessing is None, 'test requires multiprocessing') def test_regression_gh94675(self): pattern = re.compile(r'(?<=[({}])(((//[^\n]*)?[\n])([\000-\040])*)*' @@ -2431,6 +2627,50 @@ def test_regression_gh94675(self): p.terminate() p.join() + def test_fail(self): + self.assertEqual(re.search(r'12(?!)|3', '123')[0], '3') + + def test_character_set_any(self): + # The union of complementary character sets matches any character + # and is equivalent to "(?s:.)". + s = '1x\n' + for p in r'[\s\S]', r'[\d\D]', r'[\w\W]', r'[\S\s]', r'\s|\S': + with self.subTest(pattern=p): + self.assertEqual(re.findall(p, s), list(s)) + self.assertEqual(re.fullmatch('(?:' + p + ')+', s).group(), s) + + def test_character_set_none(self): + # Negation of the union of complementary character sets does not match + # any character. + s = '1x\n' + for p in r'[^\s\S]', r'[^\d\D]', r'[^\w\W]', r'[^\S\s]': + with self.subTest(pattern=p): + self.assertIsNone(re.search(p, s)) + self.assertIsNone(re.search('(?s:.)' + p, s)) + + def check_interrupt(self, pattern, string, maxcount): + class Interrupt(Exception): + pass + p = re.compile(pattern) + for n in range(maxcount): + try: + p._fail_after(n, Interrupt) + p.match(string) + return n + except Interrupt: + pass + finally: + p._fail_after(-1, None) + + @unittest.skipUnless(hasattr(re.Pattern, '_fail_after'), 'requires debug build') + def test_memory_leaks(self): + self.check_interrupt(r'(.)*:', 'abc:', 100) + self.check_interrupt(r'([^:])*?:', 'abc:', 100) + self.check_interrupt(r'([^:])*+:', 'abc:', 100) + self.check_interrupt(r'(.){2,4}:', 'abc:', 100) + self.check_interrupt(r'([^:]){2,4}?:', 'abc:', 100) + self.check_interrupt(r'([^:]){2,4}+:', 'abc:', 100) + def get_debug_out(pat): with captured_stdout() as out: diff --git a/Lib/test/test_readline.py b/Lib/test/test_readline.py index 6c2726d3..fab124ae 100644 --- a/Lib/test/test_readline.py +++ b/Lib/test/test_readline.py @@ -12,6 +12,7 @@ from test.support.os_helper import unlink, temp_dir, TESTFN from test.support.pty_helper import run_pty from test.support.script_helper import assert_python_ok +from test.support.threading_helper import requires_working_threading # Skip tests if there is no readline module readline = import_module('readline') @@ -132,6 +133,32 @@ def test_nonascii_history(self): self.assertEqual(readline.get_history_item(1), "entrée 1") self.assertEqual(readline.get_history_item(2), "entrée 22") + def test_write_read_limited_history(self): + previous_length = readline.get_history_length() + self.addCleanup(readline.set_history_length, previous_length) + + readline.clear_history() + readline.add_history("first line") + readline.add_history("second line") + readline.add_history("third line") + + readline.set_history_length(2) + self.assertEqual(readline.get_history_length(), 2) + readline.write_history_file(TESTFN) + self.addCleanup(os.remove, TESTFN) + + readline.clear_history() + self.assertEqual(readline.get_current_history_length(), 0) + self.assertEqual(readline.get_history_length(), 2) + + readline.read_history_file(TESTFN) + self.assertEqual(readline.get_history_item(1), "second line") + self.assertEqual(readline.get_history_item(2), "third line") + self.assertEqual(readline.get_history_item(3), None) + + # Readline seems to report an additional history element. + self.assertIn(readline.get_current_history_length(), (2, 3)) + class TestReadline(unittest.TestCase): @@ -320,6 +347,50 @@ def test_history_size(self): self.assertEqual(len(lines), history_size) self.assertEqual(lines[-1].strip(), b"last input") + @requires_working_threading() + def test_gh123321_threadsafe(self): + """gh-123321: readline should be thread-safe and not crash""" + script = textwrap.dedent(r""" + import threading + from test.support.threading_helper import join_thread + + def func(): + input() + + thread1 = threading.Thread(target=func) + thread2 = threading.Thread(target=func) + thread1.start() + thread2.start() + join_thread(thread1) + join_thread(thread2) + print("done") + """) + + output = run_pty(script, input=b"input1\rinput2\r") + + self.assertIn(b"done", output) + + + def test_write_read_limited_history(self): + previous_length = readline.get_history_length() + self.addCleanup(readline.set_history_length, previous_length) + + readline.add_history("first line") + readline.add_history("second line") + readline.add_history("third line") + + readline.set_history_length(2) + self.assertEqual(readline.get_history_length(), 2) + readline.write_history_file(TESTFN) + self.addCleanup(os.remove, TESTFN) + + readline.read_history_file(TESTFN) + # Without clear_history() there's no good way to test if + # the correct entries are present (we're combining history limiting and + # possible deduplication with arbitrary previous content). + # So, we've only tested that the read did not fail. + # See TestHistoryManipulation for the full test. + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index 8135a3fd..75196ac0 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -21,6 +21,8 @@ import tempfile import textwrap import unittest +from xml.etree import ElementTree + from test import support from test.support import os_helper from test.libregrtest import cmdline @@ -2221,6 +2223,44 @@ def test_pass(self): self.check_executed_tests(output, testname, stats=1, parallel=True) self.assertNotIn('SPAM SPAM SPAM', output) + def test_xml(self): + code = textwrap.dedent(r""" + import unittest + from test import support + + class VerboseTests(unittest.TestCase): + def test_failed(self): + print("abc \x1b def") + self.fail() + """) + testname = self.create_test(code=code) + + # Run sequentially + filename = os_helper.TESTFN + self.addCleanup(os_helper.unlink, filename) + + output = self.run_tests(testname, "--junit-xml", filename, + exitcode=EXITCODE_BAD_TEST) + self.check_executed_tests(output, testname, + failed=testname, + stats=TestStats(1, 1, 0)) + + # Test generated XML + with open(filename, encoding="utf8") as fp: + content = fp.read() + + testsuite = ElementTree.fromstring(content) + self.assertEqual(int(testsuite.get('tests')), 1) + self.assertEqual(int(testsuite.get('errors')), 0) + self.assertEqual(int(testsuite.get('failures')), 1) + + testcase = testsuite[0][0] + self.assertEqual(testcase.get('status'), 'run') + self.assertEqual(testcase.get('result'), 'completed') + self.assertGreater(float(testcase.get('time')), 0) + for out in testcase.iter('system-out'): + self.assertEqual(out.text, r"abc \x1b def") + class TestUtils(unittest.TestCase): def test_format_duration(self): @@ -2403,6 +2443,25 @@ def id(self): self.assertTrue(match_test(test_chdir)) self.assertFalse(match_test(test_copy)) + def test_sanitize_xml(self): + sanitize_xml = utils.sanitize_xml + + # escape invalid XML characters + self.assertEqual(sanitize_xml('abc \x1b\x1f def'), + r'abc \x1b\x1f def') + self.assertEqual(sanitize_xml('nul:\x00, bell:\x07'), + r'nul:\x00, bell:\x07') + self.assertEqual(sanitize_xml('surrogate:\uDC80'), + r'surrogate:\udc80') + self.assertEqual(sanitize_xml('illegal \uFFFE and \uFFFF'), + r'illegal \ufffe and \uffff') + + # no escape for valid XML characters + self.assertEqual(sanitize_xml('a\n\tb'), + 'a\n\tb') + self.assertEqual(sanitize_xml('valid t\xe9xt \u20ac'), + 'valid t\xe9xt \u20ac') + if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_repl.py b/Lib/test/test_repl.py index ddb4aa68..f2f18a25 100644 --- a/Lib/test/test_repl.py +++ b/Lib/test/test_repl.py @@ -146,5 +146,42 @@ def f(): self.assertEqual(traceback_lines, expected_lines) +class TestAsyncioREPLContextVars(unittest.TestCase): + def test_toplevel_contextvars_sync(self): + user_input = dedent("""\ + from contextvars import ContextVar + var = ContextVar("var", default="failed") + var.set("ok") + """) + p = spawn_repl("-m", "asyncio") + p.stdin.write(user_input) + user_input2 = dedent(""" + print(f"toplevel contextvar test: {var.get()}") + """) + p.stdin.write(user_input2) + output = kill_python(p) + self.assertEqual(p.returncode, 0) + expected = "toplevel contextvar test: ok" + self.assertIn(expected, output, expected) + + def test_toplevel_contextvars_async(self): + user_input = dedent("""\ + from contextvars import ContextVar + var = ContextVar('var', default='failed') + """) + p = spawn_repl("-m", "asyncio") + p.stdin.write(user_input+"\n") + user_input2 = "async def set_var(): var.set('ok')\n" + p.stdin.write(user_input2+"\n") + user_input3 = "await set_var()\n" + p.stdin.write(user_input3+"\n") + user_input4 = "print(f'toplevel contextvar test: {var.get()}')\n" + p.stdin.write(user_input4+"\n") + output = kill_python(p) + self.assertEqual(p.returncode, 0) + expected = "toplevel contextvar test: ok" + self.assertIn(expected, output, expected) + + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_reprlib.py b/Lib/test/test_reprlib.py index 4a896db2..e2a67ef3 100644 --- a/Lib/test/test_reprlib.py +++ b/Lib/test/test_reprlib.py @@ -580,6 +580,50 @@ def test_invalid_indent(self): with self.assertRaisesRegex(expected_error, expected_msg): r.repr(test_object) + def test_shadowed_stdlib_array(self): + # Issue #113570: repr() should not be fooled by an array + class array: + def __repr__(self): + return "not array.array" + + self.assertEqual(r(array()), "not array.array") + + def test_shadowed_builtin(self): + # Issue #113570: repr() should not be fooled + # by a shadowed builtin function + class list: + def __repr__(self): + return "not builtins.list" + + self.assertEqual(r(list()), "not builtins.list") + + def test_custom_repr(self): + class MyRepr(Repr): + + def repr_TextIOWrapper(self, obj, level): + if obj.name in {'', '', ''}: + return obj.name + return repr(obj) + + aRepr = MyRepr() + self.assertEqual(aRepr.repr(sys.stdin), "") + + def test_custom_repr_class_with_spaces(self): + class TypeWithSpaces: + pass + + t = TypeWithSpaces() + type(t).__name__ = "type with spaces" + self.assertEqual(type(t).__name__, "type with spaces") + + class MyRepr(Repr): + def repr_type_with_spaces(self, obj, level): + return "Type With Spaces" + + + aRepr = MyRepr() + self.assertEqual(aRepr.repr(t), "Type With Spaces") + def write_file(path, text): with open(path, 'w', encoding='ASCII') as fp: fp.write(text) diff --git a/Lib/test/test_runpy.py b/Lib/test/test_runpy.py index 9c849410..3f68962a 100644 --- a/Lib/test/test_runpy.py +++ b/Lib/test/test_runpy.py @@ -660,8 +660,10 @@ def test_basic_script_with_pathlike_object(self): with temp_dir() as script_dir: mod_name = 'script' script_name = FakePath(self._make_test_script(script_dir, mod_name)) - self._check_script(script_name, "", script_name, - script_name, expect_spec=False) + self._check_script(script_name, "", + os.fsdecode(script_name), + os.fsdecode(script_name), + expect_spec=False) def test_basic_script_no_suffix(self): with temp_dir() as script_dir: diff --git a/Lib/test/test_scope.py b/Lib/test/test_scope.py index 6e46dfa9..24a366ef 100644 --- a/Lib/test/test_scope.py +++ b/Lib/test/test_scope.py @@ -810,6 +810,30 @@ def dig(self): gc_collect() # For PyPy or other GCs. self.assertIsNone(ref()) + def test_multiple_nesting(self): + # Regression test for https://github.com/python/cpython/issues/121863 + class MultiplyNested: + def f1(self): + __arg = 1 + class D: + def g(self, __arg): + return __arg + return D().g(_MultiplyNested__arg=2) + + def f2(self): + __arg = 1 + class D: + def g(self, __arg): + return __arg + return D().g + + inst = MultiplyNested() + with self.assertRaises(TypeError): + inst.f1() + + closure = inst.f2() + with self.assertRaises(TypeError): + closure(_MultiplyNested__arg=2) if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_setcomps.py b/Lib/test/test_setcomps.py index 976fa885..0bb02ef1 100644 --- a/Lib/test/test_setcomps.py +++ b/Lib/test/test_setcomps.py @@ -1,6 +1,9 @@ import doctest +import traceback import unittest +from test.support import BrokenIter + doctests = """ ########### Tests mostly copied from test_listcomps.py ############ @@ -148,6 +151,42 @@ """ +class SetComprehensionTest(unittest.TestCase): + def test_exception_locations(self): + # The location of an exception raised from __init__ or + # __next__ should should be the iterator expression + + def init_raises(): + try: + {x for x in BrokenIter(init_raises=True)} + except Exception as e: + return e + + def next_raises(): + try: + {x for x in BrokenIter(next_raises=True)} + except Exception as e: + return e + + def iter_raises(): + try: + {x for x in BrokenIter(iter_raises=True)} + except Exception as e: + return e + + for func, expected in [(init_raises, "BrokenIter(init_raises=True)"), + (next_raises, "BrokenIter(next_raises=True)"), + (iter_raises, "BrokenIter(iter_raises=True)"), + ]: + with self.subTest(func): + exc = func() + f = traceback.extract_tb(exc.__traceback__)[0] + indent = 16 + co = func.__code__ + self.assertEqual(f.lineno, co.co_firstlineno + 2) + self.assertEqual(f.end_lineno, co.co_firstlineno + 2) + self.assertEqual(f.line[f.colno - indent : f.end_colno - indent], + expected) __test__ = {'doctests' : doctests} diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py index 7bc5d12e..c553ea09 100644 --- a/Lib/test/test_shutil.py +++ b/Lib/test/test_shutil.py @@ -71,18 +71,17 @@ def wrap(*args, **kwargs): os.rename = builtin_rename return wrap -def write_file(path, content, binary=False): +def create_file(path, content=b''): """Write *content* to a file located at *path*. If *path* is a tuple instead of a string, os.path.join will be used to - make a path. If *binary* is true, the file will be opened in binary - mode. + make a path. """ if isinstance(path, tuple): path = os.path.join(*path) - mode = 'wb' if binary else 'w' - encoding = None if binary else "utf-8" - with open(path, mode, encoding=encoding) as fp: + if isinstance(content, str): + content = content.encode() + with open(path, 'xb') as fp: fp.write(content) def write_test_file(path, size): @@ -191,7 +190,7 @@ def test_rmtree_works_on_bytes(self): tmp = self.mkdtemp() victim = os.path.join(tmp, 'killme') os.mkdir(victim) - write_file(os.path.join(victim, 'somefile'), 'foo') + create_file(os.path.join(victim, 'somefile'), 'foo') victim = os.fsencode(victim) self.assertIsInstance(victim, bytes) shutil.rmtree(victim) @@ -243,7 +242,7 @@ def test_rmtree_works_on_symlinks(self): for d in dir1, dir2, dir3: os.mkdir(d) file1 = os.path.join(tmp, 'file1') - write_file(file1, 'foo') + create_file(file1, 'foo') link1 = os.path.join(dir1, 'link1') os.symlink(dir2, link1) link2 = os.path.join(dir1, 'link2') @@ -305,7 +304,7 @@ def test_rmtree_works_on_junctions(self): for d in dir1, dir2, dir3: os.mkdir(d) file1 = os.path.join(tmp, 'file1') - write_file(file1, 'foo') + create_file(file1, 'foo') link1 = os.path.join(dir1, 'link1') _winapi.CreateJunction(dir2, link1) link2 = os.path.join(dir1, 'link2') @@ -327,8 +326,8 @@ def test_rmtree_errors_onerror(self): # existing file tmpdir = self.mkdtemp() - write_file((tmpdir, "tstfile"), "") filename = os.path.join(tmpdir, "tstfile") + create_file(filename) with self.assertRaises(NotADirectoryError) as cm: shutil.rmtree(filename) self.assertEqual(cm.exception.filename, filename) @@ -359,8 +358,8 @@ def test_rmtree_errors_onexc(self): # existing file tmpdir = self.mkdtemp() - write_file((tmpdir, "tstfile"), "") filename = os.path.join(tmpdir, "tstfile") + create_file(filename) with self.assertRaises(NotADirectoryError) as cm: shutil.rmtree(filename) self.assertEqual(cm.exception.filename, filename) @@ -549,7 +548,7 @@ def raiser(fn, *args, **kwargs): os.lstat = raiser os.mkdir(TESTFN) - write_file((TESTFN, 'foo'), 'foo') + create_file((TESTFN, 'foo'), 'foo') shutil.rmtree(TESTFN) finally: os.lstat = orig_lstat @@ -622,7 +621,7 @@ def test_rmtree_with_dir_fd(self): self.addCleanup(os.close, dir_fd) os.mkdir(fullname) os.mkdir(os.path.join(fullname, 'subdir')) - write_file(os.path.join(fullname, 'subdir', 'somefile'), 'foo') + create_file(os.path.join(fullname, 'subdir', 'somefile'), 'foo') self.assertTrue(os.path.exists(fullname)) shutil.rmtree(victim, dir_fd=dir_fd) self.assertFalse(os.path.exists(fullname)) @@ -662,7 +661,7 @@ def test_rmtree_on_junction(self): src = os.path.join(TESTFN, 'cheese') dst = os.path.join(TESTFN, 'shop') os.mkdir(src) - open(os.path.join(src, 'spam'), 'wb').close() + create_file(os.path.join(src, 'spam')) _winapi.CreateJunction(src, dst) self.assertRaises(OSError, shutil.rmtree, dst) shutil.rmtree(dst, ignore_errors=True) @@ -704,9 +703,9 @@ def test_copytree_simple(self): dst_dir = os.path.join(self.mkdtemp(), 'destination') self.addCleanup(shutil.rmtree, src_dir) self.addCleanup(shutil.rmtree, os.path.dirname(dst_dir)) - write_file((src_dir, 'test.txt'), '123') + create_file((src_dir, 'test.txt'), '123') os.mkdir(os.path.join(src_dir, 'test_dir')) - write_file((src_dir, 'test_dir', 'test.txt'), '456') + create_file((src_dir, 'test_dir', 'test.txt'), '456') shutil.copytree(src_dir, dst_dir) self.assertTrue(os.path.isfile(os.path.join(dst_dir, 'test.txt'))) @@ -724,11 +723,11 @@ def test_copytree_dirs_exist_ok(self): self.addCleanup(shutil.rmtree, src_dir) self.addCleanup(shutil.rmtree, dst_dir) - write_file((src_dir, 'nonexisting.txt'), '123') + create_file((src_dir, 'nonexisting.txt'), '123') os.mkdir(os.path.join(src_dir, 'existing_dir')) os.mkdir(os.path.join(dst_dir, 'existing_dir')) - write_file((dst_dir, 'existing_dir', 'existing.txt'), 'will be replaced') - write_file((src_dir, 'existing_dir', 'existing.txt'), 'has been replaced') + create_file((dst_dir, 'existing_dir', 'existing.txt'), 'will be replaced') + create_file((src_dir, 'existing_dir', 'existing.txt'), 'has been replaced') shutil.copytree(src_dir, dst_dir, dirs_exist_ok=True) self.assertTrue(os.path.isfile(os.path.join(dst_dir, 'nonexisting.txt'))) @@ -751,7 +750,7 @@ def test_copytree_symlinks(self): sub_dir = os.path.join(src_dir, 'sub') os.mkdir(src_dir) os.mkdir(sub_dir) - write_file((src_dir, 'file.txt'), 'foo') + create_file((src_dir, 'file.txt'), 'foo') src_link = os.path.join(sub_dir, 'link') dst_link = os.path.join(dst_dir, 'sub/link') os.symlink(os.path.join(src_dir, 'file.txt'), @@ -782,16 +781,16 @@ def test_copytree_with_exclude(self): src_dir = self.mkdtemp() try: dst_dir = join(self.mkdtemp(), 'destination') - write_file((src_dir, 'test.txt'), '123') - write_file((src_dir, 'test.tmp'), '123') + create_file((src_dir, 'test.txt'), '123') + create_file((src_dir, 'test.tmp'), '123') os.mkdir(join(src_dir, 'test_dir')) - write_file((src_dir, 'test_dir', 'test.txt'), '456') + create_file((src_dir, 'test_dir', 'test.txt'), '456') os.mkdir(join(src_dir, 'test_dir2')) - write_file((src_dir, 'test_dir2', 'test.txt'), '456') + create_file((src_dir, 'test_dir2', 'test.txt'), '456') os.mkdir(join(src_dir, 'test_dir2', 'subdir')) os.mkdir(join(src_dir, 'test_dir2', 'subdir2')) - write_file((src_dir, 'test_dir2', 'subdir', 'test.txt'), '456') - write_file((src_dir, 'test_dir2', 'subdir2', 'test.py'), '456') + create_file((src_dir, 'test_dir2', 'subdir', 'test.txt'), '456') + create_file((src_dir, 'test_dir2', 'subdir2', 'test.py'), '456') # testing glob-like patterns try: @@ -850,7 +849,7 @@ def test_copytree_arg_types_of_ignore(self): os.mkdir(join(src_dir)) os.mkdir(join(src_dir, 'test_dir')) os.mkdir(os.path.join(src_dir, 'test_dir', 'subdir')) - write_file((src_dir, 'test_dir', 'subdir', 'test.txt'), '456') + create_file((src_dir, 'test_dir', 'subdir', 'test.txt'), '456') invokations = [] @@ -890,9 +889,9 @@ def test_copytree_retains_permissions(self): self.addCleanup(shutil.rmtree, tmp_dir) os.chmod(src_dir, 0o777) - write_file((src_dir, 'permissive.txt'), '123') + create_file((src_dir, 'permissive.txt'), '123') os.chmod(os.path.join(src_dir, 'permissive.txt'), 0o777) - write_file((src_dir, 'restrictive.txt'), '456') + create_file((src_dir, 'restrictive.txt'), '456') os.chmod(os.path.join(src_dir, 'restrictive.txt'), 0o600) restrictive_subdir = tempfile.mkdtemp(dir=src_dir) self.addCleanup(os_helper.rmtree, restrictive_subdir) @@ -935,8 +934,7 @@ def custom_cpfun(a, b): flag = [] src = self.mkdtemp() dst = tempfile.mktemp(dir=self.mkdtemp()) - with open(os.path.join(src, 'foo'), 'w', encoding='utf-8') as f: - f.close() + create_file(os.path.join(src, 'foo')) shutil.copytree(src, dst, copy_function=custom_cpfun) self.assertEqual(len(flag), 1) @@ -971,9 +969,9 @@ def test_copytree_named_pipe(self): def test_copytree_special_func(self): src_dir = self.mkdtemp() dst_dir = os.path.join(self.mkdtemp(), 'destination') - write_file((src_dir, 'test.txt'), '123') + create_file((src_dir, 'test.txt'), '123') os.mkdir(os.path.join(src_dir, 'test_dir')) - write_file((src_dir, 'test_dir', 'test.txt'), '456') + create_file((src_dir, 'test_dir', 'test.txt'), '456') copied = [] def _copy(src, dst): @@ -986,7 +984,7 @@ def _copy(src, dst): def test_copytree_dangling_symlinks(self): src_dir = self.mkdtemp() valid_file = os.path.join(src_dir, 'test.txt') - write_file(valid_file, 'abc') + create_file(valid_file, 'abc') dir_a = os.path.join(src_dir, 'dir_a') os.mkdir(dir_a) for d in src_dir, dir_a: @@ -1014,8 +1012,7 @@ def test_copytree_symlink_dir(self): src_dir = self.mkdtemp() dst_dir = os.path.join(self.mkdtemp(), 'destination') os.mkdir(os.path.join(src_dir, 'real_dir')) - with open(os.path.join(src_dir, 'real_dir', 'test.txt'), 'wb'): - pass + create_file(os.path.join(src_dir, 'real_dir', 'test.txt')) os.symlink(os.path.join(src_dir, 'real_dir'), os.path.join(src_dir, 'link_to_dir'), target_is_directory=True) @@ -1035,7 +1032,7 @@ def test_copytree_return_value(self): dst_dir = src_dir + "dest" self.addCleanup(shutil.rmtree, dst_dir, True) src = os.path.join(src_dir, 'foo') - write_file(src, 'foo') + create_file(src, 'foo') rv = shutil.copytree(src_dir, dst_dir) self.assertEqual(['foo'], os.listdir(rv)) @@ -1047,7 +1044,7 @@ def test_copytree_subdirectory(self): dst_dir = os.path.join(src_dir, "somevendor", "1.0") os.makedirs(src_dir) src = os.path.join(src_dir, 'pol') - write_file(src, 'pol') + create_file(src, 'pol') rv = shutil.copytree(src_dir, dst_dir) self.assertEqual(['pol'], os.listdir(rv)) @@ -1062,8 +1059,8 @@ def test_copymode_follow_symlinks(self): dst = os.path.join(tmp_dir, 'bar') src_link = os.path.join(tmp_dir, 'baz') dst_link = os.path.join(tmp_dir, 'quux') - write_file(src, 'foo') - write_file(dst, 'foo') + create_file(src, 'foo') + create_file(dst, 'foo') os.symlink(src, src_link) os.symlink(dst, dst_link) os.chmod(src, stat.S_IRWXU|stat.S_IRWXG) @@ -1095,8 +1092,8 @@ def test_copymode_symlink_to_symlink(self): dst = os.path.join(tmp_dir, 'bar') src_link = os.path.join(tmp_dir, 'baz') dst_link = os.path.join(tmp_dir, 'quux') - write_file(src, 'foo') - write_file(dst, 'foo') + create_file(src, 'foo') + create_file(dst, 'foo') os.symlink(src, src_link) os.symlink(dst, dst_link) os.chmod(src, stat.S_IRWXU|stat.S_IRWXG) @@ -1126,8 +1123,8 @@ def test_copymode_symlink_to_symlink_wo_lchmod(self): dst = os.path.join(tmp_dir, 'bar') src_link = os.path.join(tmp_dir, 'baz') dst_link = os.path.join(tmp_dir, 'quux') - write_file(src, 'foo') - write_file(dst, 'foo') + create_file(src, 'foo') + create_file(dst, 'foo') os.symlink(src, src_link) os.symlink(dst, dst_link) shutil.copymode(src_link, dst_link, follow_symlinks=False) # silent fail @@ -1141,11 +1138,11 @@ def test_copystat_symlinks(self): dst = os.path.join(tmp_dir, 'bar') src_link = os.path.join(tmp_dir, 'baz') dst_link = os.path.join(tmp_dir, 'qux') - write_file(src, 'foo') + create_file(src, 'foo') src_stat = os.stat(src) os.utime(src, (src_stat.st_atime, src_stat.st_mtime - 42.0)) # ensure different mtimes - write_file(dst, 'bar') + create_file(dst, 'bar') self.assertNotEqual(os.stat(src).st_mtime, os.stat(dst).st_mtime) os.symlink(src, src_link) os.symlink(dst, dst_link) @@ -1185,8 +1182,8 @@ def test_copystat_handles_harmless_chflags_errors(self): tmpdir = self.mkdtemp() file1 = os.path.join(tmpdir, 'file1') file2 = os.path.join(tmpdir, 'file2') - write_file(file1, 'xxx') - write_file(file2, 'xxx') + create_file(file1, 'xxx') + create_file(file2, 'xxx') def make_chflags_raiser(err): ex = OSError() @@ -1212,9 +1209,9 @@ def _chflags_raiser(path, flags, *, follow_symlinks=True): def test_copyxattr(self): tmp_dir = self.mkdtemp() src = os.path.join(tmp_dir, 'foo') - write_file(src, 'foo') + create_file(src, 'foo') dst = os.path.join(tmp_dir, 'bar') - write_file(dst, 'bar') + create_file(dst, 'bar') # no xattr == no problem shutil._copyxattr(src, dst) @@ -1228,7 +1225,7 @@ def test_copyxattr(self): os.getxattr(dst, 'user.foo')) # check errors don't affect other attrs os.remove(dst) - write_file(dst, 'bar') + create_file(dst, 'bar') os_error = OSError(errno.EPERM, 'EPERM') def _raise_on_user_foo(fname, attr, val, **kwargs): @@ -1258,15 +1255,15 @@ def _raise_on_src(fname, *, follow_symlinks=True): # test that shutil.copystat copies xattrs src = os.path.join(tmp_dir, 'the_original') srcro = os.path.join(tmp_dir, 'the_original_ro') - write_file(src, src) - write_file(srcro, srcro) + create_file(src, src) + create_file(srcro, srcro) os.setxattr(src, 'user.the_value', b'fiddly') os.setxattr(srcro, 'user.the_value', b'fiddly') os.chmod(srcro, 0o444) dst = os.path.join(tmp_dir, 'the_copy') dstro = os.path.join(tmp_dir, 'the_copy_ro') - write_file(dst, dst) - write_file(dstro, dstro) + create_file(dst, dst) + create_file(dstro, dstro) shutil.copystat(src, dst) shutil.copystat(srcro, dstro) self.assertEqual(os.getxattr(dst, 'user.the_value'), b'fiddly') @@ -1282,13 +1279,13 @@ def test_copyxattr_symlinks(self): tmp_dir = self.mkdtemp() src = os.path.join(tmp_dir, 'foo') src_link = os.path.join(tmp_dir, 'baz') - write_file(src, 'foo') + create_file(src, 'foo') os.symlink(src, src_link) os.setxattr(src, 'trusted.foo', b'42') os.setxattr(src_link, 'trusted.foo', b'43', follow_symlinks=False) dst = os.path.join(tmp_dir, 'bar') dst_link = os.path.join(tmp_dir, 'qux') - write_file(dst, 'bar') + create_file(dst, 'bar') os.symlink(dst, dst_link) shutil._copyxattr(src_link, dst_link, follow_symlinks=False) self.assertEqual(os.getxattr(dst_link, 'trusted.foo', follow_symlinks=False), b'43') @@ -1301,7 +1298,7 @@ def test_copyxattr_symlinks(self): def _copy_file(self, method): fname = 'test.txt' tmpdir = self.mkdtemp() - write_file((tmpdir, fname), 'xxx') + create_file((tmpdir, fname), 'xxx') file1 = os.path.join(tmpdir, fname) tmpdir2 = self.mkdtemp() method(file1, tmpdir2) @@ -1320,7 +1317,7 @@ def test_copy_symlinks(self): src = os.path.join(tmp_dir, 'foo') dst = os.path.join(tmp_dir, 'bar') src_link = os.path.join(tmp_dir, 'baz') - write_file(src, 'foo') + create_file(src, 'foo') os.symlink(src, src_link) if hasattr(os, 'lchmod'): os.lchmod(src_link, stat.S_IRWXU | stat.S_IRWXO) @@ -1362,7 +1359,7 @@ def test_copy2_symlinks(self): src = os.path.join(tmp_dir, 'foo') dst = os.path.join(tmp_dir, 'bar') src_link = os.path.join(tmp_dir, 'baz') - write_file(src, 'foo') + create_file(src, 'foo') os.symlink(src, src_link) if hasattr(os, 'lchmod'): os.lchmod(src_link, stat.S_IRWXU | stat.S_IRWXO) @@ -1396,7 +1393,7 @@ def test_copy2_xattr(self): tmp_dir = self.mkdtemp() src = os.path.join(tmp_dir, 'foo') dst = os.path.join(tmp_dir, 'bar') - write_file(src, 'foo') + create_file(src, 'foo') os.setxattr(src, 'user.foo', b'42') shutil.copy2(src, dst) self.assertEqual( @@ -1410,7 +1407,7 @@ def test_copy_return_value(self): src_dir = self.mkdtemp() dst_dir = self.mkdtemp() src = os.path.join(src_dir, 'foo') - write_file(src, 'foo') + create_file(src, 'foo') rv = fn(src, dst_dir) self.assertEqual(rv, os.path.join(dst_dir, 'foo')) rv = fn(src, os.path.join(dst_dir, 'bar')) @@ -1427,7 +1424,7 @@ def _test_copy_dir(self, copy_func): src_file = os.path.join(src_dir, 'foo') dir2 = self.mkdtemp() dst = os.path.join(src_dir, 'does_not_exist/') - write_file(src_file, 'foo') + create_file(src_file, 'foo') if sys.platform == "win32": err = PermissionError else: @@ -1447,7 +1444,7 @@ def test_copyfile_symlinks(self): dst = os.path.join(tmp_dir, 'dst') dst_link = os.path.join(tmp_dir, 'dst_link') link = os.path.join(tmp_dir, 'link') - write_file(src, 'foo') + create_file(src, 'foo') os.symlink(src, link) # don't follow shutil.copyfile(link, dst_link, follow_symlinks=False) @@ -1464,8 +1461,7 @@ def test_dont_copy_file_onto_link_to_itself(self): src = os.path.join(TESTFN, 'cheese') dst = os.path.join(TESTFN, 'shop') try: - with open(src, 'w', encoding='utf-8') as f: - f.write('cheddar') + create_file(src, 'cheddar') try: os.link(src, dst) except PermissionError as e: @@ -1484,8 +1480,7 @@ def test_dont_copy_file_onto_symlink_to_itself(self): src = os.path.join(TESTFN, 'cheese') dst = os.path.join(TESTFN, 'shop') try: - with open(src, 'w', encoding='utf-8') as f: - f.write('cheddar') + create_file(src, 'cheddar') # Using `src` here would mean we end up with a symlink pointing # to TESTFN/TESTFN/cheese, while it should point at # TESTFN/cheese. @@ -1520,7 +1515,7 @@ def test_copyfile_return_value(self): dst_dir = self.mkdtemp() dst_file = os.path.join(dst_dir, 'bar') src_file = os.path.join(src_dir, 'foo') - write_file(src_file, 'foo') + create_file(src_file, 'foo') rv = shutil.copyfile(src_file, dst_file) self.assertTrue(os.path.exists(rv)) self.assertEqual(read_file(src_file), read_file(dst_file)) @@ -1530,7 +1525,7 @@ def test_copyfile_same_file(self): # are the same. src_dir = self.mkdtemp() src_file = os.path.join(src_dir, 'foo') - write_file(src_file, 'foo') + create_file(src_file, 'foo') self.assertRaises(SameFileError, shutil.copyfile, src_file, src_file) # But Error should work too, to stay backward compatible. self.assertRaises(Error, shutil.copyfile, src_file, src_file) @@ -1547,7 +1542,7 @@ def test_copyfile_nonexistent_dir(self): src_dir = self.mkdtemp() src_file = os.path.join(src_dir, 'foo') dst = os.path.join(src_dir, 'does_not_exist/') - write_file(src_file, 'foo') + create_file(src_file, 'foo') self.assertRaises(FileNotFoundError, shutil.copyfile, src_file, dst) def test_copyfile_copy_dir(self): @@ -1558,7 +1553,7 @@ def test_copyfile_copy_dir(self): src_file = os.path.join(src_dir, 'foo') dir2 = self.mkdtemp() dst = os.path.join(src_dir, 'does_not_exist/') - write_file(src_file, 'foo') + create_file(src_file, 'foo') if sys.platform == "win32": err = PermissionError else: @@ -1584,13 +1579,13 @@ def _create_files(self, base_dir='dist'): root_dir = self.mkdtemp() dist = os.path.join(root_dir, base_dir) os.makedirs(dist, exist_ok=True) - write_file((dist, 'file1'), 'xxx') - write_file((dist, 'file2'), 'xxx') + create_file((dist, 'file1'), 'xxx') + create_file((dist, 'file2'), 'xxx') os.mkdir(os.path.join(dist, 'sub')) - write_file((dist, 'sub', 'file3'), 'xxx') + create_file((dist, 'sub', 'file3'), 'xxx') os.mkdir(os.path.join(dist, 'sub2')) if base_dir: - write_file((root_dir, 'outer'), 'xxx') + create_file((root_dir, 'outer'), 'xxx') return root_dir, base_dir @support.requires_zlib() @@ -2170,7 +2165,7 @@ def test_disk_usage(self): def test_chown(self): dirname = self.mkdtemp() filename = tempfile.mktemp(dir=dirname) - write_file(filename, 'testing chown function') + create_file(filename, 'testing chown function') with self.assertRaises(ValueError): shutil.chown(filename) @@ -2231,37 +2226,41 @@ def check_chown(path, uid=None, gid=None): class TestWhich(BaseTest, unittest.TestCase): def setUp(self): - self.temp_dir = self.mkdtemp(prefix="Tmp") + temp_dir = self.mkdtemp(prefix="Tmp") + base_dir = os.path.join(temp_dir, TESTFN + '-basedir') + os.mkdir(base_dir) + self.dir = os.path.join(base_dir, TESTFN + '-dir') + os.mkdir(self.dir) + self.other_dir = os.path.join(base_dir, TESTFN + '-dir2') + os.mkdir(self.other_dir) # Give the temp_file an ".exe" suffix for all. # It's needed on Windows and not harmful on other platforms. - self.temp_file = tempfile.NamedTemporaryFile(dir=self.temp_dir, - prefix="Tmp", - suffix=".Exe") - os.chmod(self.temp_file.name, stat.S_IXUSR) - self.addCleanup(self.temp_file.close) - self.dir, self.file = os.path.split(self.temp_file.name) + self.file = TESTFN + '.Exe' + self.filepath = os.path.join(self.dir, self.file) + self.create_file(self.filepath) self.env_path = self.dir self.curdir = os.curdir self.ext = ".EXE" - def to_text_type(self, s): - ''' - In this class we're testing with str, so convert s to a str - ''' - if isinstance(s, bytes): - return s.decode() - return s + to_text_type = staticmethod(os.fsdecode) + + def create_file(self, path): + create_file(path) + os.chmod(path, 0o755) + + def assertNormEqual(self, actual, expected): + self.assertEqual(os.path.normcase(actual), os.path.normcase(expected)) def test_basic(self): # Given an EXE in a directory, it should be returned. rv = shutil.which(self.file, path=self.dir) - self.assertEqual(rv, self.temp_file.name) + self.assertEqual(rv, self.filepath) def test_absolute_cmd(self): # When given the fully qualified path to an executable that exists, # it should be returned. - rv = shutil.which(self.temp_file.name, path=self.temp_dir) - self.assertEqual(rv, self.temp_file.name) + rv = shutil.which(self.filepath, path=self.other_dir) + self.assertEqual(rv, self.filepath) def test_relative_cmd(self): # When given the relative path with a directory part to an executable @@ -2269,7 +2268,7 @@ def test_relative_cmd(self): base_dir, tail_dir = os.path.split(self.dir) relpath = os.path.join(tail_dir, self.file) with os_helper.change_cwd(path=base_dir): - rv = shutil.which(relpath, path=self.temp_dir) + rv = shutil.which(relpath, path=self.other_dir) self.assertEqual(rv, relpath) # But it shouldn't be searched in PATH directories (issue #16957). with os_helper.change_cwd(path=self.dir): @@ -2280,9 +2279,8 @@ def test_relative_cmd(self): "test is for non win32") def test_cwd_non_win32(self): # Issue #16957 - base_dir = os.path.dirname(self.dir) with os_helper.change_cwd(path=self.dir): - rv = shutil.which(self.file, path=base_dir) + rv = shutil.which(self.file, path=self.other_dir) # non-win32: shouldn't match in the current directory. self.assertIsNone(rv) @@ -2292,57 +2290,32 @@ def test_cwd_win32(self): base_dir = os.path.dirname(self.dir) with os_helper.change_cwd(path=self.dir): with unittest.mock.patch('shutil._win_path_needs_curdir', return_value=True): - rv = shutil.which(self.file, path=base_dir) + rv = shutil.which(self.file, path=self.other_dir) # Current directory implicitly on PATH self.assertEqual(rv, os.path.join(self.curdir, self.file)) with unittest.mock.patch('shutil._win_path_needs_curdir', return_value=False): - rv = shutil.which(self.file, path=base_dir) + rv = shutil.which(self.file, path=self.other_dir) # Current directory not on PATH self.assertIsNone(rv) @unittest.skipUnless(sys.platform == "win32", "test is for win32") def test_cwd_win32_added_before_all_other_path(self): - base_dir = pathlib.Path(os.fsdecode(self.dir)) - - elsewhere_in_path_dir = base_dir / 'dir1' - elsewhere_in_path_dir.mkdir() - match_elsewhere_in_path = elsewhere_in_path_dir / 'hello.exe' - match_elsewhere_in_path.touch() - - exe_in_cwd = base_dir / 'hello.exe' - exe_in_cwd.touch() - - with os_helper.change_cwd(path=base_dir): - with unittest.mock.patch('shutil._win_path_needs_curdir', return_value=True): - rv = shutil.which('hello.exe', path=elsewhere_in_path_dir) - - self.assertEqual(os.path.abspath(rv), os.path.abspath(exe_in_cwd)) - - @unittest.skipUnless(sys.platform == "win32", - "test is for win32") - def test_pathext_match_before_path_full_match(self): - base_dir = pathlib.Path(os.fsdecode(self.dir)) - dir1 = base_dir / 'dir1' - dir2 = base_dir / 'dir2' - dir1.mkdir() - dir2.mkdir() - - pathext_match = dir1 / 'hello.com.exe' - path_match = dir2 / 'hello.com' - pathext_match.touch() - path_match.touch() - - test_path = os.pathsep.join([str(dir1), str(dir2)]) - assert os.path.basename(shutil.which( - 'hello.com', path=test_path, mode = os.F_OK - )).lower() == 'hello.com.exe' + other_file_path = os.path.join(self.other_dir, self.file) + self.create_file(other_file_path) + with unittest.mock.patch('shutil._win_path_needs_curdir', return_value=True): + with os_helper.change_cwd(path=self.dir): + rv = shutil.which(self.file, path=self.other_dir) + self.assertEqual(rv, os.path.join(self.curdir, self.file)) + with os_helper.change_cwd(path=self.other_dir): + rv = shutil.which(self.file, path=self.dir) + self.assertEqual(rv, os.path.join(self.curdir, self.file)) @os_helper.skip_if_dac_override def test_non_matching_mode(self): # Set the file read-only and ask for writeable files. - os.chmod(self.temp_file.name, stat.S_IREAD) - if os.access(self.temp_file.name, os.W_OK): + os.chmod(self.filepath, stat.S_IREAD) + if os.access(self.filepath, os.W_OK): self.skipTest("can't set the file read-only") rv = shutil.which(self.file, path=self.dir, mode=os.W_OK) self.assertIsNone(rv) @@ -2364,13 +2337,13 @@ def test_pathext_checking(self): # Ask for the file without the ".exe" extension, then ensure that # it gets found properly with the extension. rv = shutil.which(self.file[:-4], path=self.dir) - self.assertEqual(rv, self.temp_file.name[:-4] + self.ext) + self.assertEqual(rv, self.filepath[:-4] + self.ext) def test_environ_path(self): with os_helper.EnvironmentVarGuard() as env: env['PATH'] = self.env_path rv = shutil.which(self.file) - self.assertEqual(rv, self.temp_file.name) + self.assertEqual(rv, self.filepath) def test_environ_path_empty(self): # PATH='': no match @@ -2384,12 +2357,9 @@ def test_environ_path_empty(self): self.assertIsNone(rv) def test_environ_path_cwd(self): - expected_cwd = os.path.basename(self.temp_file.name) + expected_cwd = self.file if sys.platform == "win32": - curdir = os.curdir - if isinstance(expected_cwd, bytes): - curdir = os.fsencode(curdir) - expected_cwd = os.path.join(curdir, expected_cwd) + expected_cwd = os.path.join(self.curdir, expected_cwd) # PATH=':': explicitly looks in the current directory with os_helper.EnvironmentVarGuard() as env: @@ -2414,14 +2384,14 @@ def test_environ_path_missing(self): create=True), \ support.swap_attr(os, 'defpath', self.dir): rv = shutil.which(self.file) - self.assertEqual(rv, self.temp_file.name) + self.assertEqual(rv, self.filepath) # with confstr with unittest.mock.patch('os.confstr', return_value=self.dir, \ create=True), \ support.swap_attr(os, 'defpath', ''): rv = shutil.which(self.file) - self.assertEqual(rv, self.temp_file.name) + self.assertEqual(rv, self.filepath) def test_empty_path(self): base_dir = os.path.dirname(self.dir) @@ -2439,50 +2409,88 @@ def test_empty_path_no_PATH(self): @unittest.skipUnless(sys.platform == "win32", 'test specific to Windows') def test_pathext(self): - ext = self.to_text_type(".xyz") - temp_filexyz = tempfile.NamedTemporaryFile(dir=self.temp_dir, - prefix=self.to_text_type("Tmp2"), suffix=ext) - os.chmod(temp_filexyz.name, stat.S_IXUSR) - self.addCleanup(temp_filexyz.close) - - # strip path and extension - program = os.path.basename(temp_filexyz.name) - program = os.path.splitext(program)[0] - + ext = '.xyz' + cmd = self.to_text_type(TESTFN2) + cmdext = cmd + self.to_text_type(ext) + filepath = os.path.join(self.dir, cmdext) + self.create_file(filepath) with os_helper.EnvironmentVarGuard() as env: - env['PATHEXT'] = ext if isinstance(ext, str) else ext.decode() - rv = shutil.which(program, path=self.temp_dir) - self.assertEqual(rv, temp_filexyz.name) + env['PATHEXT'] = ext + self.assertEqual(shutil.which(cmd, path=self.dir), filepath) + self.assertEqual(shutil.which(cmdext, path=self.dir), filepath) # Issue 40592: See https://bugs.python.org/issue40592 @unittest.skipUnless(sys.platform == "win32", 'test specific to Windows') def test_pathext_with_empty_str(self): - ext = self.to_text_type(".xyz") - temp_filexyz = tempfile.NamedTemporaryFile(dir=self.temp_dir, - prefix=self.to_text_type("Tmp2"), suffix=ext) - self.addCleanup(temp_filexyz.close) + ext = '.xyz' + cmd = self.to_text_type(TESTFN2) + cmdext = cmd + self.to_text_type(ext) + filepath = os.path.join(self.dir, cmdext) + self.create_file(filepath) + with os_helper.EnvironmentVarGuard() as env: + env['PATHEXT'] = ext + ';' # note the ; + self.assertEqual(shutil.which(cmd, path=self.dir), filepath) + self.assertEqual(shutil.which(cmdext, path=self.dir), filepath) - # strip path and extension - program = os.path.basename(temp_filexyz.name) - program = os.path.splitext(program)[0] + @unittest.skipUnless(sys.platform == "win32", 'test specific to Windows') + def test_pathext_with_multidot_extension(self): + ext = '.foo.bar' + cmd = self.to_text_type(TESTFN2) + cmdext = cmd + self.to_text_type(ext) + filepath = os.path.join(self.dir, cmdext) + self.create_file(filepath) + with os_helper.EnvironmentVarGuard() as env: + env['PATHEXT'] = ext + self.assertEqual(shutil.which(cmd, path=self.dir), filepath) + self.assertEqual(shutil.which(cmdext, path=self.dir), filepath) + @unittest.skipUnless(sys.platform == "win32", 'test specific to Windows') + def test_pathext_with_null_extension(self): + cmd = self.to_text_type(TESTFN2) + cmddot = cmd + self.to_text_type('.') + filepath = os.path.join(self.dir, cmd) + self.create_file(filepath) with os_helper.EnvironmentVarGuard() as env: - env['PATHEXT'] = f"{ext if isinstance(ext, str) else ext.decode()};" # note the ; - rv = shutil.which(program, path=self.temp_dir) - self.assertEqual(rv, temp_filexyz.name) + env['PATHEXT'] = '.xyz' + self.assertIsNone(shutil.which(cmd, path=self.dir)) + self.assertIsNone(shutil.which(cmddot, path=self.dir)) + env['PATHEXT'] = '.xyz;.' # note the . + self.assertEqual(shutil.which(cmd, path=self.dir), filepath) + self.assertEqual(shutil.which(cmddot, path=self.dir), + filepath + self.to_text_type('.')) + env['PATHEXT'] = '.xyz;..' # multiple dots + self.assertEqual(shutil.which(cmd, path=self.dir), filepath) + self.assertEqual(shutil.which(cmddot, path=self.dir), + filepath + self.to_text_type('.')) + + @unittest.skipUnless(sys.platform == "win32", 'test specific to Windows') + def test_pathext_extension_ends_with_dot(self): + ext = '.xyz' + cmd = self.to_text_type(TESTFN2) + cmdext = cmd + self.to_text_type(ext) + dot = self.to_text_type('.') + filepath = os.path.join(self.dir, cmdext) + self.create_file(filepath) + with os_helper.EnvironmentVarGuard() as env: + env['PATHEXT'] = ext + '.' + self.assertEqual(shutil.which(cmd, path=self.dir), filepath) # cmd.exe hangs here + self.assertEqual(shutil.which(cmdext, path=self.dir), filepath) + self.assertIsNone(shutil.which(cmd + dot, path=self.dir)) + self.assertIsNone(shutil.which(cmdext + dot, path=self.dir)) # See GH-75586 @unittest.skipUnless(sys.platform == "win32", 'test specific to Windows') def test_pathext_applied_on_files_in_path(self): + ext = '.xyz' + cmd = self.to_text_type(TESTFN2) + cmdext = cmd + self.to_text_type(ext) + filepath = os.path.join(self.dir, cmdext) + self.create_file(filepath) with os_helper.EnvironmentVarGuard() as env: - env["PATH"] = self.temp_dir if isinstance(self.temp_dir, str) else self.temp_dir.decode() - env["PATHEXT"] = ".test" - - test_path = os.path.join(self.temp_dir, self.to_text_type("test_program.test")) - open(test_path, 'w').close() - os.chmod(test_path, 0o755) - - self.assertEqual(shutil.which(self.to_text_type("test_program")), test_path) + env["PATH"] = os.fsdecode(self.dir) + env["PATHEXT"] = ext + self.assertEqual(shutil.which(cmd), filepath) + self.assertEqual(shutil.which(cmdext), filepath) # See GH-75586 @unittest.skipUnless(sys.platform == "win32", 'test specific to Windows') @@ -2498,49 +2506,107 @@ def test_win_path_needs_curdir(self): self.assertFalse(shutil._win_path_needs_curdir('dontcare', os.X_OK)) need_curdir_mock.assert_called_once_with('dontcare') - # See GH-109590 @unittest.skipUnless(sys.platform == "win32", 'test specific to Windows') - def test_pathext_preferred_for_execute(self): - with os_helper.EnvironmentVarGuard() as env: - env["PATH"] = self.temp_dir if isinstance(self.temp_dir, str) else self.temp_dir.decode() - env["PATHEXT"] = ".test" - - exe = os.path.join(self.temp_dir, self.to_text_type("test.exe")) - open(exe, 'w').close() - os.chmod(exe, 0o755) + def test_same_dir_with_pathext_extension(self): + cmd = self.file # with .exe extension + # full match + self.assertNormEqual(shutil.which(cmd, path=self.dir), self.filepath) + self.assertNormEqual(shutil.which(cmd, path=self.dir, mode=os.F_OK), + self.filepath) + + cmd2 = cmd + self.to_text_type('.com') # with .exe.com extension + other_file_path = os.path.join(self.dir, cmd2) + self.create_file(other_file_path) + + # full match + self.assertNormEqual(shutil.which(cmd, path=self.dir), self.filepath) + self.assertNormEqual(shutil.which(cmd, path=self.dir, mode=os.F_OK), + self.filepath) + self.assertNormEqual(shutil.which(cmd2, path=self.dir), other_file_path) + self.assertNormEqual(shutil.which(cmd2, path=self.dir, mode=os.F_OK), + other_file_path) - # default behavior allows a direct match if nothing in PATHEXT matches - self.assertEqual(shutil.which(self.to_text_type("test.exe")), exe) - - dot_test = os.path.join(self.temp_dir, self.to_text_type("test.exe.test")) - open(dot_test, 'w').close() - os.chmod(dot_test, 0o755) - - # now we have a PATHEXT match, so it take precedence - self.assertEqual(shutil.which(self.to_text_type("test.exe")), dot_test) - - # but if we don't use os.X_OK we don't change the order based off PATHEXT - # and therefore get the direct match. - self.assertEqual(shutil.which(self.to_text_type("test.exe"), mode=os.F_OK), exe) - - # See GH-109590 @unittest.skipUnless(sys.platform == "win32", 'test specific to Windows') - def test_pathext_given_extension_preferred(self): - with os_helper.EnvironmentVarGuard() as env: - env["PATH"] = self.temp_dir if isinstance(self.temp_dir, str) else self.temp_dir.decode() - env["PATHEXT"] = ".exe2;.exe" + def test_same_dir_without_pathext_extension(self): + cmd = self.file[:-4] # without .exe extension + # pathext match + self.assertNormEqual(shutil.which(cmd, path=self.dir), self.filepath) + self.assertNormEqual(shutil.which(cmd, path=self.dir, mode=os.F_OK), + self.filepath) + + # without extension + other_file_path = os.path.join(self.dir, cmd) + self.create_file(other_file_path) + + # pathext match if mode contains X_OK + self.assertNormEqual(shutil.which(cmd, path=self.dir), self.filepath) + # full match + self.assertNormEqual(shutil.which(cmd, path=self.dir, mode=os.F_OK), + other_file_path) + self.assertNormEqual(shutil.which(self.file, path=self.dir), self.filepath) + self.assertNormEqual(shutil.which(self.file, path=self.dir, mode=os.F_OK), + self.filepath) - exe = os.path.join(self.temp_dir, self.to_text_type("test.exe")) - open(exe, 'w').close() - os.chmod(exe, 0o755) - - exe2 = os.path.join(self.temp_dir, self.to_text_type("test.exe2")) - open(exe2, 'w').close() - os.chmod(exe2, 0o755) + @unittest.skipUnless(sys.platform == "win32", 'test specific to Windows') + def test_dir_order_with_pathext_extension(self): + cmd = self.file # with .exe extension + search_path = os.pathsep.join([os.fsdecode(self.other_dir), + os.fsdecode(self.dir)]) + # full match in the second directory + self.assertNormEqual(shutil.which(cmd, path=search_path), self.filepath) + self.assertNormEqual(shutil.which(cmd, path=search_path, mode=os.F_OK), + self.filepath) + + cmd2 = cmd + self.to_text_type('.com') # with .exe.com extension + other_file_path = os.path.join(self.other_dir, cmd2) + self.create_file(other_file_path) + + # pathext match in the first directory + self.assertNormEqual(shutil.which(cmd, path=search_path), other_file_path) + self.assertNormEqual(shutil.which(cmd, path=search_path, mode=os.F_OK), + other_file_path) + # full match in the first directory + self.assertNormEqual(shutil.which(cmd2, path=search_path), other_file_path) + self.assertNormEqual(shutil.which(cmd2, path=search_path, mode=os.F_OK), + other_file_path) + + # full match in the first directory + search_path = os.pathsep.join([os.fsdecode(self.dir), + os.fsdecode(self.other_dir)]) + self.assertEqual(shutil.which(cmd, path=search_path), self.filepath) + self.assertEqual(shutil.which(cmd, path=search_path, mode=os.F_OK), + self.filepath) - # even though .exe2 is preferred in PATHEXT, we matched directly to test.exe - self.assertEqual(shutil.which(self.to_text_type("test.exe")), exe) - self.assertEqual(shutil.which(self.to_text_type("test")), exe2) + @unittest.skipUnless(sys.platform == "win32", 'test specific to Windows') + def test_dir_order_without_pathext_extension(self): + cmd = self.file[:-4] # without .exe extension + search_path = os.pathsep.join([os.fsdecode(self.other_dir), + os.fsdecode(self.dir)]) + # pathext match in the second directory + self.assertNormEqual(shutil.which(cmd, path=search_path), self.filepath) + self.assertNormEqual(shutil.which(cmd, path=search_path, mode=os.F_OK), + self.filepath) + + # without extension + other_file_path = os.path.join(self.other_dir, cmd) + self.create_file(other_file_path) + + # pathext match in the second directory + self.assertNormEqual(shutil.which(cmd, path=search_path), self.filepath) + # full match in the first directory + self.assertNormEqual(shutil.which(cmd, path=search_path, mode=os.F_OK), + other_file_path) + # full match in the second directory + self.assertNormEqual(shutil.which(self.file, path=search_path), self.filepath) + self.assertNormEqual(shutil.which(self.file, path=search_path, mode=os.F_OK), + self.filepath) + + # pathext match in the first directory + search_path = os.pathsep.join([os.fsdecode(self.dir), + os.fsdecode(self.other_dir)]) + self.assertNormEqual(shutil.which(cmd, path=search_path), self.filepath) + self.assertNormEqual(shutil.which(cmd, path=search_path, mode=os.F_OK), + self.filepath) class TestWhichBytes(TestWhich): @@ -2548,18 +2614,12 @@ def setUp(self): TestWhich.setUp(self) self.dir = os.fsencode(self.dir) self.file = os.fsencode(self.file) - self.temp_file.name = os.fsencode(self.temp_file.name) - self.temp_dir = os.fsencode(self.temp_dir) + self.filepath = os.fsencode(self.filepath) + self.other_dir = os.fsencode(self.other_dir) self.curdir = os.fsencode(self.curdir) self.ext = os.fsencode(self.ext) - def to_text_type(self, s): - ''' - In this class we're testing with bytes, so convert s to a bytes - ''' - if isinstance(s, str): - return s.encode() - return s + to_text_type = staticmethod(os.fsencode) class TestMove(BaseTest, unittest.TestCase): @@ -2570,8 +2630,7 @@ def setUp(self): self.dst_dir = self.mkdtemp() self.src_file = os.path.join(self.src_dir, filename) self.dst_file = os.path.join(self.dst_dir, filename) - with open(self.src_file, "wb") as f: - f.write(b"spam") + create_file(self.src_file, b"spam") def _check_move_file(self, src, dst, real_dst): with open(src, "rb") as f: @@ -2649,8 +2708,7 @@ def test_move_dir_altsep_to_dir(self): def test_existing_file_inside_dest_dir(self): # A file with the same name inside the destination dir already exists. - with open(self.dst_file, "wb"): - pass + create_file(self.dst_file) self.assertRaises(shutil.Error, shutil.move, self.src_file, self.dst_dir) def test_dont_move_dir_in_itself(self): @@ -3065,8 +3123,7 @@ def test_empty_file(self): dstname = TESTFN + 'dst' self.addCleanup(lambda: os_helper.unlink(srcname)) self.addCleanup(lambda: os_helper.unlink(dstname)) - with open(srcname, "wb"): - pass + create_file(srcname) with open(srcname, "rb") as src: with open(dstname, "wb") as dst: @@ -3189,7 +3246,7 @@ def test_blocksize_arg(self): self.assertEqual(blocksize, os.path.getsize(TESTFN)) # ...unless we're dealing with a small file. os_helper.unlink(TESTFN2) - write_file(TESTFN2, b"hello", binary=True) + create_file(TESTFN2, b"hello") self.addCleanup(os_helper.unlink, TESTFN2 + '3') self.assertRaises(ZeroDivisionError, shutil.copyfile, TESTFN2, TESTFN2 + '3') diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py index c7b9549d..a45527d7 100644 --- a/Lib/test/test_signal.py +++ b/Lib/test/test_signal.py @@ -122,6 +122,8 @@ def __repr__(self): self.assertEqual(signal.getsignal(signal.SIGHUP), hup) self.assertEqual(0, argument.repr_count) + @unittest.skipIf(sys.platform.startswith("netbsd"), + "gh-124083: strsignal is not supported on NetBSD") def test_strsignal(self): self.assertIn("Interrupt", signal.strsignal(signal.SIGINT)) self.assertIn("Terminated", signal.strsignal(signal.SIGTERM)) diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index cda95649..b40ad28f 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -558,19 +558,27 @@ class SocketPairTest(unittest.TestCase, ThreadableTest): def __init__(self, methodName='runTest'): unittest.TestCase.__init__(self, methodName=methodName) ThreadableTest.__init__(self) + self.cli = None + self.serv = None + + def socketpair(self): + # To be overridden by some child classes. + return socket.socketpair() def setUp(self): - self.serv, self.cli = socket.socketpair() + self.serv, self.cli = self.socketpair() def tearDown(self): - self.serv.close() + if self.serv: + self.serv.close() self.serv = None def clientSetUp(self): pass def clientTearDown(self): - self.cli.close() + if self.cli: + self.cli.close() self.cli = None ThreadableTest.clientTearDown(self) @@ -1623,7 +1631,7 @@ def test_getaddrinfo_int_port_overflow(self): try: socket.getaddrinfo(None, ULONG_MAX + 1, type=socket.SOCK_STREAM) except OverflowError: - # Platforms differ as to what values consitute a getaddrinfo() error + # Platforms differ as to what values constitute a getaddrinfo() error # return. Some fail for LONG_MAX+1, others ULONG_MAX+1, and Windows # silently accepts such huge "port" aka "service" numeric values. self.fail("Either no error or socket.gaierror expected.") @@ -4786,6 +4794,112 @@ def _testSend(self): self.assertEqual(msg, MSG) +class PurePythonSocketPairTest(SocketPairTest): + # Explicitly use socketpair AF_INET or AF_INET6 to ensure that is the + # code path we're using regardless platform is the pure python one where + # `_socket.socketpair` does not exist. (AF_INET does not work with + # _socket.socketpair on many platforms). + def socketpair(self): + # called by super().setUp(). + try: + return socket.socketpair(socket.AF_INET6) + except OSError: + return socket.socketpair(socket.AF_INET) + + # Local imports in this class make for easy security fix backporting. + + def setUp(self): + if hasattr(_socket, "socketpair"): + self._orig_sp = socket.socketpair + # This forces the version using the non-OS provided socketpair + # emulation via an AF_INET socket in Lib/socket.py. + socket.socketpair = socket._fallback_socketpair + else: + # This platform already uses the non-OS provided version. + self._orig_sp = None + super().setUp() + + def tearDown(self): + super().tearDown() + if self._orig_sp is not None: + # Restore the default socket.socketpair definition. + socket.socketpair = self._orig_sp + + def test_recv(self): + msg = self.serv.recv(1024) + self.assertEqual(msg, MSG) + + def _test_recv(self): + self.cli.send(MSG) + + def test_send(self): + self.serv.send(MSG) + + def _test_send(self): + msg = self.cli.recv(1024) + self.assertEqual(msg, MSG) + + def test_ipv4(self): + cli, srv = socket.socketpair(socket.AF_INET) + cli.close() + srv.close() + + def _test_ipv4(self): + pass + + @unittest.skipIf(not hasattr(_socket, 'IPPROTO_IPV6') or + not hasattr(_socket, 'IPV6_V6ONLY'), + "IPV6_V6ONLY option not supported") + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test') + def test_ipv6(self): + cli, srv = socket.socketpair(socket.AF_INET6) + cli.close() + srv.close() + + def _test_ipv6(self): + pass + + def test_injected_authentication_failure(self): + orig_getsockname = socket.socket.getsockname + inject_sock = None + + def inject_getsocketname(self): + nonlocal inject_sock + sockname = orig_getsockname(self) + # Connect to the listening socket ahead of the + # client socket. + if inject_sock is None: + inject_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + inject_sock.setblocking(False) + try: + inject_sock.connect(sockname[:2]) + except (BlockingIOError, InterruptedError): + pass + inject_sock.setblocking(True) + return sockname + + sock1 = sock2 = None + try: + socket.socket.getsockname = inject_getsocketname + with self.assertRaises(OSError): + sock1, sock2 = socket.socketpair() + finally: + socket.socket.getsockname = orig_getsockname + if inject_sock: + inject_sock.close() + if sock1: # This cleanup isn't needed on a successful test. + sock1.close() + if sock2: + sock2.close() + + def _test_injected_authentication_failure(self): + # No-op. Exists for base class threading infrastructure to call. + # We could refactor this test into its own lesser class along with the + # setUp and tearDown code to construct an ideal; it is simpler to keep + # it here and live with extra overhead one this _one_ failure test. + pass + + class NonBlockingTCPTests(ThreadedTCPSocketTest): def __init__(self, methodName='runTest'): @@ -4945,6 +5059,36 @@ def _testRecv(self): # send data: recv() will no longer block self.cli.sendall(MSG) + @support.cpython_only + def testLargeTimeout(self): + # gh-126876: Check that a timeout larger than INT_MAX is replaced with + # INT_MAX in the poll() code path. The following assertion must not + # fail: assert(INT_MIN <= ms && ms <= INT_MAX). + import _testcapi + large_timeout = _testcapi.INT_MAX + 1 + + # test recv() with large timeout + conn, addr = self.serv.accept() + self.addCleanup(conn.close) + try: + conn.settimeout(large_timeout) + except OverflowError: + # On Windows, settimeout() fails with OverflowError, whereas + # we want to test recv(). Just give up silently. + return + msg = conn.recv(len(MSG)) + + def _testLargeTimeout(self): + # test sendall() with large timeout + import _testcapi + large_timeout = _testcapi.INT_MAX + 1 + self.cli.connect((HOST, self.port)) + try: + self.cli.settimeout(large_timeout) + except OverflowError: + return + self.cli.sendall(MSG) + class FileObjectClassTestCase(SocketConnectedTest): """Unit tests for the object returned by socket.makefile() @@ -5147,6 +5291,8 @@ def _testMakefileClose(self): self.write_file.write(self.write_msg) self.write_file.flush() + @unittest.skipUnless(hasattr(sys, 'getrefcount'), + 'test needs sys.getrefcount()') def testMakefileCloseSocketDestroy(self): refcount_before = sys.getrefcount(self.cli_conn) self.read_file.close() diff --git a/Lib/test/test_sqlite3/test_regression.py b/Lib/test/test_sqlite3/test_regression.py index 7e8221e7..6ea47872 100644 --- a/Lib/test/test_sqlite3/test_regression.py +++ b/Lib/test/test_sqlite3/test_regression.py @@ -442,6 +442,7 @@ def test_table_lock_cursor_dealloc(self): con.commit() cur = con.execute("select t from t") del cur + support.gc_collect() con.execute("drop table t") con.commit() @@ -457,6 +458,7 @@ def dup(v): con.create_function("dup", 1, dup) cur = con.execute("select dup(t) from t") del cur + support.gc_collect() con.execute("drop table t") con.commit() diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index 9b59ddd8..aaddb759 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -2300,7 +2300,6 @@ def wrap_conn(self): # See also http://erickt.github.io/blog/2014/11/19/adventures-in-debugging-a-potential-osx-kernel-bug/ if e.errno != errno.EPROTOTYPE and sys.platform != "darwin": self.running = False - self.server.stop() self.close() return False else: @@ -2435,10 +2434,6 @@ def run(self): self.close() self.running = False - # normally, we'd just stop here, but for the test - # harness, we want to stop the server - self.server.stop() - def __init__(self, certificate=None, ssl_version=None, certreqs=None, cacerts=None, chatty=True, connectionchatty=False, starttls_server=False, @@ -2472,21 +2467,33 @@ def __init__(self, certificate=None, ssl_version=None, self.conn_errors = [] threading.Thread.__init__(self) self.daemon = True + self._in_context = False def __enter__(self): + if self._in_context: + raise ValueError('Re-entering ThreadedEchoServer context') + self._in_context = True self.start(threading.Event()) self.flag.wait() return self def __exit__(self, *args): + assert self._in_context + self._in_context = False self.stop() self.join() def start(self, flag=None): + if not self._in_context: + raise ValueError( + 'ThreadedEchoServer must be used as a context manager') self.flag = flag threading.Thread.start(self) def run(self): + if not self._in_context: + raise ValueError( + 'ThreadedEchoServer must be used as a context manager') self.sock.settimeout(1.0) self.sock.listen(5) self.active = True @@ -4817,7 +4824,7 @@ def non_linux_skip_if_other_okay_error(self, err): return # Expect the full test setup to always work on Linux. if (isinstance(err, ConnectionResetError) or (isinstance(err, OSError) and err.errno == errno.EINVAL) or - re.search('wrong.version.number', getattr(err, "reason", ""), re.I)): + re.search('wrong.version.number', str(getattr(err, "reason", "")), re.I)): # On Windows the TCP RST leads to a ConnectionResetError # (ECONNRESET) which Linux doesn't appear to surface to userspace. # If wrap_socket() winds up on the "if connected:" path and doing diff --git a/Lib/test/test_statistics.py b/Lib/test/test_statistics.py index 0080d996..d0e13bfb 100644 --- a/Lib/test/test_statistics.py +++ b/Lib/test/test_statistics.py @@ -1074,7 +1074,7 @@ def test_no_inplace_modifications(self): def test_order_doesnt_matter(self): # Test that the order of data points doesn't change the result. - # CAUTION: due to floating point rounding errors, the result actually + # CAUTION: due to floating-point rounding errors, the result actually # may depend on the order. Consider this test representing an ideal. # To avoid this test failing, only test with exact values such as ints # or Fractions. diff --git a/Lib/test/test_string_literals.py b/Lib/test/test_string_literals.py index 371e8193..c7c6f684 100644 --- a/Lib/test/test_string_literals.py +++ b/Lib/test/test_string_literals.py @@ -131,7 +131,7 @@ def test_eval_str_invalid_escape(self): self.assertEqual(exc.lineno, 1) self.assertEqual(exc.offset, 1) - # Check that the warning is raised ony once if there are syntax errors + # Check that the warning is raised only once if there are syntax errors with warnings.catch_warnings(record=True) as w: warnings.simplefilter('always', category=SyntaxWarning) diff --git a/Lib/test/test_strptime.py b/Lib/test/test_strptime.py index 05c8afc9..94b16635 100644 --- a/Lib/test/test_strptime.py +++ b/Lib/test/test_strptime.py @@ -5,13 +5,21 @@ import locale import re import os +import platform import sys from test import support -from test.support import skip_if_buggy_ucrt_strfptime +from test.support import skip_if_buggy_ucrt_strfptime, run_with_locales from datetime import date as datetime_date import _strptime +libc_ver = platform.libc_ver() +if libc_ver[0] == 'glibc': + glibc_ver = tuple(map(int, libc_ver[1].split('.'))) +else: + glibc_ver = None + + class getlang_Tests(unittest.TestCase): """Test _getlang""" def test_basic(self): @@ -206,8 +214,8 @@ class StrptimeTests(unittest.TestCase): """Tests for _strptime.strptime.""" def setUp(self): - """Create testing time tuple.""" - self.time_tuple = time.gmtime() + """Create testing time tuples.""" + self.time_tuple = time.localtime() def test_ValueError(self): # Make sure ValueError is raised when match fails or format is bad @@ -282,59 +290,73 @@ def test_strptime_exception_context(self): # additional check for IndexError branch (issue #19545) with self.assertRaises(ValueError) as e: _strptime._strptime_time('19', '%Y %') - self.assertIs(e.exception.__suppress_context__, True) + self.assertIsNone(e.exception.__context__) def test_unconverteddata(self): # Check ValueError is raised when there is unconverted data self.assertRaises(ValueError, _strptime._strptime_time, "10 12", "%m") - def helper(self, directive, position): + def roundtrip(self, fmt, position, time_tuple=None): """Helper fxn in testing.""" - strf_output = time.strftime("%" + directive, self.time_tuple) - strp_output = _strptime._strptime_time(strf_output, "%" + directive) - self.assertTrue(strp_output[position] == self.time_tuple[position], - "testing of '%s' directive failed; '%s' -> %s != %s" % - (directive, strf_output, strp_output[position], - self.time_tuple[position])) + if time_tuple is None: + time_tuple = self.time_tuple + strf_output = time.strftime(fmt, time_tuple) + strp_output = _strptime._strptime_time(strf_output, fmt) + self.assertEqual(strp_output[position], time_tuple[position], + "testing of %r format failed; %r -> %r != %r" % + (fmt, strf_output, strp_output[position], + time_tuple[position])) + if support.verbose >= 3: + print("testing of %r format: %r -> %r" % + (fmt, strf_output, strp_output[position])) def test_year(self): # Test that the year is handled properly - for directive in ('y', 'Y'): - self.helper(directive, 0) + self.roundtrip('%Y', 0) + self.roundtrip('%y', 0) + self.roundtrip('%Y', 0, (1900, 1, 1, 0, 0, 0, 0, 1, 0)) + # Must also make sure %y values are correct for bounds set by Open Group - for century, bounds in ((1900, ('69', '99')), (2000, ('00', '68'))): - for bound in bounds: - strp_output = _strptime._strptime_time(bound, '%y') - expected_result = century + int(bound) - self.assertTrue(strp_output[0] == expected_result, - "'y' test failed; passed in '%s' " - "and returned '%s'" % (bound, strp_output[0])) + strptime = _strptime._strptime_time + self.assertEqual(strptime('00', '%y')[0], 2000) + self.assertEqual(strptime('68', '%y')[0], 2068) + self.assertEqual(strptime('69', '%y')[0], 1969) + self.assertEqual(strptime('99', '%y')[0], 1999) def test_month(self): # Test for month directives - for directive in ('B', 'b', 'm'): - self.helper(directive, 1) + self.roundtrip('%m', 1) + + @run_with_locales('LC_TIME', 'C', 'en_US', 'fr_FR', 'de_DE', 'ja_JP', 'he_IL', '') + def test_month_locale(self): + # Test for month directives + self.roundtrip('%B', 1) + self.roundtrip('%b', 1) + for m in range(1, 13): + self.roundtrip('%B', 1, (1900, m, 1, 0, 0, 0, 0, 1, 0)) + self.roundtrip('%b', 1, (1900, m, 1, 0, 0, 0, 0, 1, 0)) def test_day(self): # Test for day directives - self.helper('d', 2) + self.roundtrip('%d %Y', 2) def test_hour(self): # Test hour directives - self.helper('H', 3) - strf_output = time.strftime("%I %p", self.time_tuple) - strp_output = _strptime._strptime_time(strf_output, "%I %p") - self.assertTrue(strp_output[3] == self.time_tuple[3], - "testing of '%%I %%p' directive failed; '%s' -> %s != %s" % - (strf_output, strp_output[3], self.time_tuple[3])) + self.roundtrip('%H', 3) + + # NB: Only works on locales with AM/PM + @run_with_locales('LC_TIME', 'C', 'en_US', 'ja_JP') + def test_hour_locale(self): + # Test hour directives + self.roundtrip('%I %p', 3) def test_minute(self): # Test minute directives - self.helper('M', 4) + self.roundtrip('%M', 4) def test_second(self): # Test second directives - self.helper('S', 5) + self.roundtrip('%S', 5) def test_fraction(self): # Test microseconds @@ -345,12 +367,18 @@ def test_fraction(self): def test_weekday(self): # Test weekday directives - for directive in ('A', 'a', 'w', 'u'): - self.helper(directive,6) + self.roundtrip('%w', 6) + self.roundtrip('%u', 6) + + @run_with_locales('LC_TIME', 'C', 'en_US', 'fr_FR', 'de_DE', 'ja_JP', '') + def test_weekday_locale(self): + # Test weekday directives + self.roundtrip('%A', 6) + self.roundtrip('%a', 6) def test_julian(self): # Test julian directives - self.helper('j', 7) + self.roundtrip('%j', 7) def test_offset(self): one_hour = 60 * 60 @@ -447,20 +475,121 @@ def test_bad_timezone(self): "time.daylight set to %s and passing in %s" % (time.tzname, tz_value, time.daylight, tz_name)) - def test_date_time(self): + # NB: Does not roundtrip in some locales due to the ambiguity of + # the date and time representation (bugs in locales?): + # * Seconds are not included: bem_ZM, bokmal, ff_SN, nb_NO, nn_NO, + # no_NO, norwegian, nynorsk. + # * Hours are in 12-hour notation without AM/PM indication: hy_AM, + # id_ID, ms_MY. + # * Year is not included: ha_NG. + # * Use non-Gregorian calendar: lo_LA, thai, th_TH. + # On Windows: ar_IN, ar_SA, fa_IR, ps_AF. + # + # BUG: Generates regexp that does not match the current date and time + # for lzh_TW. + @run_with_locales('LC_TIME', 'C', 'en_US', 'fr_FR', 'de_DE', 'ja_JP', + 'he_IL', 'eu_ES', 'ar_AE', 'mfe_MU', 'yo_NG', + 'csb_PL', 'br_FR', 'gez_ET', 'brx_IN', + 'my_MM', 'or_IN', 'shn_MM', 'az_IR') + def test_date_time_locale(self): # Test %c directive - for position in range(6): - self.helper('c', position) - - def test_date(self): + loc = locale.getlocale(locale.LC_TIME)[0] + if glibc_ver and glibc_ver < (2, 31) and loc == 'br_FR': + self.skipTest('%c in locale br_FR does not include time') + now = time.time() + self.roundtrip('%c', slice(0, 6), time.localtime(now)) + # 1 hour 20 minutes 30 seconds ago + self.roundtrip('%c', slice(0, 6), time.localtime(now - 4830)) + # 12 hours ago + self.roundtrip('%c', slice(0, 6), time.localtime(now - 12*3600)) + # different days of the week + for i in range(1, 7): + self.roundtrip('%c', slice(0, 6), time.localtime(now - i*24*3600)) + # different months + for i in range(1, 12): + self.roundtrip('%c', slice(0, 6), time.localtime(now - i*30*24*3600)) + # different year + self.roundtrip('%c', slice(0, 6), time.localtime(now - 366*24*3600)) + + # NB: Dates before 1969 do not roundtrip on some locales: + # az_IR, bo_CN, bo_IN, dz_BT, eu_ES, eu_FR, fa_IR, or_IN. + @support.run_with_tz('STD-1DST,M4.1.0,M10.1.0') + @run_with_locales('LC_TIME', 'C', 'en_US', 'fr_FR', 'de_DE', 'ja_JP', + 'he_IL', 'ar_AE', 'mfe_MU', 'yo_NG', + 'csb_PL', 'br_FR', 'gez_ET', 'brx_IN', + 'my_MM', 'shn_MM') + def test_date_time_locale2(self): + # Test %c directive + loc = locale.getlocale(locale.LC_TIME)[0] + if sys.platform.startswith('sunos'): + if loc in ('ar_AE',): + self.skipTest(f'locale {loc!r} may not work on this platform') + self.roundtrip('%c', slice(0, 6), (1900, 1, 1, 0, 0, 0, 0, 1, 0)) + self.roundtrip('%c', slice(0, 6), (1800, 1, 1, 0, 0, 0, 0, 1, 0)) + + # NB: Does not roundtrip because use non-Gregorian calendar: + # lo_LA, thai, th_TH. On Windows: ar_IN, ar_SA, fa_IR, ps_AF. + # BUG: Generates regexp that does not match the current date + # for lzh_TW. + @run_with_locales('LC_TIME', 'C', 'en_US', 'fr_FR', 'de_DE', 'ja_JP', + 'he_IL', 'eu_ES', 'ar_AE', + 'az_IR', 'my_MM', 'or_IN', 'shn_MM') + def test_date_locale(self): # Test %x directive - for position in range(0,3): - self.helper('x', position) - - def test_time(self): + now = time.time() + self.roundtrip('%x', slice(0, 3), time.localtime(now)) + # different days of the week + for i in range(1, 7): + self.roundtrip('%x', slice(0, 3), time.localtime(now - i*24*3600)) + # different months + for i in range(1, 12): + self.roundtrip('%x', slice(0, 3), time.localtime(now - i*30*24*3600)) + # different year + self.roundtrip('%x', slice(0, 3), time.localtime(now - 366*24*3600)) + + # NB: Dates before 1969 do not roundtrip on many locales, including C. + @unittest.skipIf( + support.is_emscripten or support.is_wasi, + "musl libc issue on Emscripten, bpo-46390" + ) + @run_with_locales('LC_TIME', 'en_US', 'fr_FR', 'de_DE', 'ja_JP', + 'eu_ES', 'ar_AE', 'my_MM', 'shn_MM') + def test_date_locale2(self): + # Test %x directive + loc = locale.getlocale(locale.LC_TIME)[0] + if sys.platform.startswith('sunos'): + if loc in ('en_US', 'de_DE', 'ar_AE'): + self.skipTest(f'locale {loc!r} may not work on this platform') + self.roundtrip('%x', slice(0, 3), (1900, 1, 1, 0, 0, 0, 0, 1, 0)) + self.roundtrip('%x', slice(0, 3), (1800, 1, 1, 0, 0, 0, 0, 1, 0)) + + # NB: Does not roundtrip in some locales due to the ambiguity of + # the time representation (bugs in locales?): + # * Seconds are not included: bokmal, ff_SN, nb_NO, nn_NO, no_NO, + # norwegian, nynorsk. + # * Hours are in 12-hour notation without AM/PM indication: hy_AM, + # ms_MY, sm_WS. + # BUG: Generates regexp that does not match the current time for lzh_TW. + @run_with_locales('LC_TIME', 'C', 'en_US', 'fr_FR', 'de_DE', 'ja_JP', + 'aa_ET', 'am_ET', 'az_IR', 'byn_ER', 'fa_IR', 'gez_ET', + 'my_MM', 'om_ET', 'or_IN', 'shn_MM', 'sid_ET', 'so_SO', + 'ti_ET', 'tig_ER', 'wal_ET') + def test_time_locale(self): # Test %X directive - for position in range(3,6): - self.helper('X', position) + loc = locale.getlocale(locale.LC_TIME)[0] + pos = slice(3, 6) + if glibc_ver and glibc_ver < (2, 29) and loc in { + 'aa_ET', 'am_ET', 'byn_ER', 'gez_ET', 'om_ET', + 'sid_ET', 'so_SO', 'ti_ET', 'tig_ER', 'wal_ET'}: + # Hours are in 12-hour notation without AM/PM indication. + # Ignore hours. + pos = slice(4, 6) + now = time.time() + self.roundtrip('%X', pos, time.localtime(now)) + # 1 hour 20 minutes 30 seconds ago + self.roundtrip('%X', pos, time.localtime(now - 4830)) + # 12 hours ago + self.roundtrip('%X', pos, time.localtime(now - 12*3600)) def test_percent(self): # Make sure % signs are handled properly @@ -710,13 +839,8 @@ def test_new_localetime(self): def test_TimeRE_recreation_locale(self): # The TimeRE instance should be recreated upon changing the locale. - locale_info = locale.getlocale(locale.LC_TIME) - try: - locale.setlocale(locale.LC_TIME, ('en_US', 'UTF8')) - except locale.Error: - self.skipTest('test needs en_US.UTF8 locale') - try: - _strptime._strptime_time('10', '%d') + with support.run_with_locale('LC_TIME', 'en_US.UTF8'): + _strptime._strptime_time('10 2004', '%d %Y') # Get id of current cache object. first_time_re = _strptime._TimeRE_cache try: @@ -732,10 +856,6 @@ def test_TimeRE_recreation_locale(self): # to the resetting to the original locale. except locale.Error: self.skipTest('test needs de_DE.UTF8 locale') - # Make sure we don't trample on the locale setting once we leave the - # test. - finally: - locale.setlocale(locale.LC_TIME, locale_info) @support.run_with_tz('STD-1DST,M4.1.0,M10.1.0') def test_TimeRE_recreation_timezone(self): diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py index 8d4b13a6..c683e5dd 100644 --- a/Lib/test/test_struct.py +++ b/Lib/test/test_struct.py @@ -96,6 +96,13 @@ def test_new_features(self): ('10s', b'helloworld', b'helloworld', b'helloworld', 0), ('11s', b'helloworld', b'helloworld\0', b'helloworld\0', 1), ('20s', b'helloworld', b'helloworld'+10*b'\0', b'helloworld'+10*b'\0', 1), + ('0p', b'helloworld', b'', b'', 1), + ('1p', b'helloworld', b'\x00', b'\x00', 1), + ('2p', b'helloworld', b'\x01h', b'\x01h', 1), + ('10p', b'helloworld', b'\x09helloworl', b'\x09helloworl', 1), + ('11p', b'helloworld', b'\x0Ahelloworld', b'\x0Ahelloworld', 0), + ('12p', b'helloworld', b'\x0Ahelloworld\0', b'\x0Ahelloworld\0', 1), + ('20p', b'helloworld', b'\x0Ahelloworld'+9*b'\0', b'\x0Ahelloworld'+9*b'\0', 1), ('b', 7, b'\7', b'\7', 0), ('b', -7, b'\371', b'\371', 0), ('B', 7, b'\7', b'\7', 0), @@ -339,6 +346,7 @@ def assertStructError(func, *args, **kwargs): def test_p_code(self): # Test p ("Pascal string") code. for code, input, expected, expectedback in [ + ('0p', b'abc', b'', b''), ('p', b'abc', b'\x00', b''), ('1p', b'abc', b'\x00', b''), ('2p', b'abc', b'\x01a', b'a'), @@ -521,6 +529,9 @@ def __bool__(self): for c in [b'\x01', b'\x7f', b'\xff', b'\x0f', b'\xf0']: self.assertTrue(struct.unpack('>?', c)[0]) + self.assertTrue(struct.unpack('', 'utf-8', + '{{', '', '\n', '_', 'x', '\0', '\N{CEDILLA}', '\xff', + ): + with self.subTest(s=s): + t = sys.intern(s) - print('------------------------') - interp = interpreters.create() - interp.run(textwrap.dedent(f''' - import sys - t = sys.intern({s!r}) - assert id(t) == {id(t)}, (id(t), {id(t)}) - ''')) + interp = interpreters.create() + interp.run(textwrap.dedent(f''' + import sys + + # set `s`, avoid parser interning & constant folding + s = str({s.encode()!r}, 'utf-8') + + t = sys.intern(s) + assert id(t) == {id(t)}, (id(t), {id(t)}) + ''')) + + @support.cpython_only + @requires_subinterpreters + def test_subinterp_intern_singleton(self): + # Implementation detail: singletons are used for 0- and 1-character + # latin1 strings. + for s in '', '\n', '_', 'x', '\0', '\N{CEDILLA}', '\xff': + with self.subTest(s=s): + interp = interpreters.create() + interp.run(textwrap.dedent(f''' + import sys + + # set `s`, avoid parser interning & constant folding + s = str({s.encode()!r}, 'utf-8') + + assert id(s) == {id(s)} + t = sys.intern(s) + assert id(t) == id(s), (id(t), id(s)) + ''')) def test_sys_flags(self): self.assertTrue(sys.flags) diff --git a/Lib/test/test_sys_setprofile.py b/Lib/test/test_sys_setprofile.py index bb8adc8b..f7703696 100644 --- a/Lib/test/test_sys_setprofile.py +++ b/Lib/test/test_sys_setprofile.py @@ -265,6 +265,10 @@ def g(p): f_ident = ident(f) g_ident = ident(g) self.check_events(g, [(1, 'call', g_ident), + (2, 'call', f_ident), + (2, 'return', f_ident), + # once more; the generator is being garbage collected + # and it will do a PY_THROW (2, 'call', f_ident), (2, 'return', f_ident), (1, 'return', g_ident), @@ -474,6 +478,20 @@ def f(): sys.setprofile(lambda *args: None) f() + def test_method_with_c_function(self): + # gh-122029 + # When we have a PyMethodObject whose im_func is a C function, we + # should record both the call and the return. f = classmethod(repr) + # is just a way to create a PyMethodObject with a C function. + class A: + f = classmethod(repr) + events = [] + sys.setprofile(lambda frame, event, args: events.append(event)) + A().f() + sys.setprofile(None) + # The last c_call is the call to sys.setprofile + self.assertEqual(events, ['c_call', 'c_return', 'c_call']) + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index 196fd60d..35985b34 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -1634,15 +1634,15 @@ def func(): EXPECTED_EVENTS = [ (0, 'call'), (2, 'line'), - (1, 'line'), (-3, 'call'), (-2, 'line'), (-2, 'return'), - (4, 'line'), (1, 'line'), + (4, 'line'), + (2, 'line'), (-2, 'call'), (-2, 'return'), - (1, 'return'), + (2, 'return'), ] # C level events should be the same as expected and the same as Python level. diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py index 1137c203..3468d0ce 100644 --- a/Lib/test/test_sysconfig.py +++ b/Lib/test/test_sysconfig.py @@ -3,6 +3,8 @@ import os import subprocess import shutil +import json +import textwrap from copy import copy from test.support import ( @@ -11,6 +13,7 @@ from test.support.import_helper import import_module from test.support.os_helper import (TESTFN, unlink, skip_unless_symlink, change_cwd) +from test.support.venv import VirtualEnvironment import sysconfig from sysconfig import (get_paths, get_platform, get_config_vars, @@ -90,6 +93,12 @@ def _cleanup_testfn(self): elif os.path.isdir(path): shutil.rmtree(path) + def venv(self, **venv_create_args): + return VirtualEnvironment.from_tmpdir( + prefix=f'{self.id()}-venv-', + **venv_create_args, + ) + def test_get_path_names(self): self.assertEqual(get_path_names(), sysconfig._SCHEME_KEYS) @@ -511,6 +520,72 @@ def test_osx_ext_suffix(self): suffix = sysconfig.get_config_var('EXT_SUFFIX') self.assertTrue(suffix.endswith('-darwin.so'), suffix) + @requires_subprocess() + def test_config_vars_depend_on_site_initialization(self): + script = textwrap.dedent(""" + import sysconfig + + config_vars = sysconfig.get_config_vars() + + import json + print(json.dumps(config_vars, indent=2)) + """) + + with self.venv() as venv: + site_config_vars = json.loads(venv.run('-c', script).stdout) + no_site_config_vars = json.loads(venv.run('-S', '-c', script).stdout) + + self.assertNotEqual(site_config_vars, no_site_config_vars) + # With the site initialization, the virtual environment should be enabled. + self.assertEqual(site_config_vars['base'], venv.prefix) + self.assertEqual(site_config_vars['platbase'], venv.prefix) + #self.assertEqual(site_config_vars['prefix'], venv.prefix) # # FIXME: prefix gets overwriten by _init_posix + # Without the site initialization, the virtual environment should be disabled. + self.assertEqual(no_site_config_vars['base'], site_config_vars['installed_base']) + self.assertEqual(no_site_config_vars['platbase'], site_config_vars['installed_platbase']) + + @requires_subprocess() + def test_config_vars_recalculation_after_site_initialization(self): + script = textwrap.dedent(""" + import sysconfig + + before = sysconfig.get_config_vars() + + import site + site.main() + + after = sysconfig.get_config_vars() + + import json + print(json.dumps({'before': before, 'after': after}, indent=2)) + """) + + with self.venv() as venv: + config_vars = json.loads(venv.run('-S', '-c', script).stdout) + + self.assertNotEqual(config_vars['before'], config_vars['after']) + self.assertEqual(config_vars['after']['base'], venv.prefix) + #self.assertEqual(config_vars['after']['prefix'], venv.prefix) # FIXME: prefix gets overwriten by _init_posix + #self.assertEqual(config_vars['after']['exec_prefix'], venv.prefix) # FIXME: exec_prefix gets overwriten by _init_posix + + @requires_subprocess() + def test_paths_depend_on_site_initialization(self): + script = textwrap.dedent(""" + import sysconfig + + paths = sysconfig.get_paths() + + import json + print(json.dumps(paths, indent=2)) + """) + + with self.venv() as venv: + site_paths = json.loads(venv.run('-c', script).stdout) + no_site_paths = json.loads(venv.run('-S', '-c', script).stdout) + + self.assertNotEqual(site_paths, no_site_paths) + + class MakefileTests(unittest.TestCase): @unittest.skipIf(sys.platform.startswith('win'), diff --git a/Lib/test/test_tabnanny.py b/Lib/test/test_tabnanny.py index cc122caf..30dcb3e3 100644 --- a/Lib/test/test_tabnanny.py +++ b/Lib/test/test_tabnanny.py @@ -315,7 +315,7 @@ def validate_cmd(self, *args, stdout="", stderr="", partial=False, expect_failur def test_with_errored_file(self): """Should displays error when errored python file is given.""" with TemporaryPyFile(SOURCE_CODES["wrong_indented"]) as file_path: - stderr = f"{file_path!r}: Token Error: " + stderr = f"{file_path!r}: Indentation Error: " stderr += ('unindent does not match any outer indentation level' ' (, line 3)') self.validate_cmd(file_path, stderr=stderr, expect_failure=True) diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index 3fbd25e7..e28d0311 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -1237,6 +1237,48 @@ def test_pax_number_fields(self): finally: tar.close() + def test_pax_header_bad_formats(self): + # The fields from the pax header have priority over the + # TarInfo. + pax_header_replacements = ( + b" foo=bar\n", + b"0 \n", + b"1 \n", + b"2 \n", + b"3 =\n", + b"4 =a\n", + b"1000000 foo=bar\n", + b"0 foo=bar\n", + b"-12 foo=bar\n", + b"000000000000000000000000036 foo=bar\n", + ) + pax_headers = {"foo": "bar"} + + for replacement in pax_header_replacements: + with self.subTest(header=replacement): + tar = tarfile.open(tmpname, "w", format=tarfile.PAX_FORMAT, + encoding="iso8859-1") + try: + t = tarfile.TarInfo() + t.name = "pax" # non-ASCII + t.uid = 1 + t.pax_headers = pax_headers + tar.addfile(t) + finally: + tar.close() + + with open(tmpname, "rb") as f: + data = f.read() + self.assertIn(b"11 foo=bar\n", data) + data = data.replace(b"11 foo=bar\n", replacement) + + with open(tmpname, "wb") as f: + f.truncate() + f.write(data) + + with self.assertRaisesRegex(tarfile.ReadError, r"method tar: ReadError\('invalid header'\)"): + tarfile.open(tmpname, encoding="iso8859-1") + class WriteTestBase(TarTest): # Put all write tests in here that are supposed to be tested diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py index ebdb58f9..743ff85d 100644 --- a/Lib/test/test_tcl.py +++ b/Lib/test/test_tcl.py @@ -51,7 +51,7 @@ def test_eval_null_in_result(self): def test_eval_surrogates_in_result(self): tcl = self.interp - self.assertIn(tcl.eval(r'set a "<\ud83d\udcbb>"'), '<\U0001f4bb>') + self.assertEqual(tcl.eval(r'set a "<\ud83d\udcbb>"'), '<\U0001f4bb>') def testEvalException(self): tcl = self.interp @@ -61,11 +61,30 @@ def testEvalException2(self): tcl = self.interp self.assertRaises(TclError,tcl.eval,'this is wrong') + def test_eval_returns_tcl_obj(self): + tcl = self.interp.tk + tcl.eval(r'set a "\u20ac \ud83d\udcbb \0 \udcab"; regexp -about $a') + a = tcl.eval('set a') + expected = '\u20ac \U0001f4bb \0 \udced\udcb2\udcab' + self.assertEqual(a, expected) + def testCall(self): tcl = self.interp tcl.call('set','a','1') self.assertEqual(tcl.call('set','a'),'1') + def test_call_passing_null(self): + tcl = self.interp + tcl.call('set', 'a', 'a\0b') # ASCII-only + self.assertEqual(tcl.getvar('a'), 'a\x00b') + self.assertEqual(tcl.call('set', 'a'), 'a\x00b') + self.assertEqual(tcl.eval('set a'), 'a\x00b') + + tcl.call('set', 'a', '\u20ac\0') # non-ASCII + self.assertEqual(tcl.getvar('a'), '\u20ac\x00') + self.assertEqual(tcl.call('set', 'a'), '\u20ac\x00') + self.assertEqual(tcl.eval('set a'), '\u20ac\x00') + def testCallException(self): tcl = self.interp self.assertRaises(TclError,tcl.call,'set','a') @@ -74,11 +93,35 @@ def testCallException2(self): tcl = self.interp self.assertRaises(TclError,tcl.call,'this','is','wrong') + def test_call_returns_tcl_obj(self): + tcl = self.interp.tk + tcl.eval(r'set a "\u20ac \ud83d\udcbb \0 \udcab"; regexp -about $a') + a = tcl.call('set', 'a') + expected = '\u20ac \U0001f4bb \0 \udced\udcb2\udcab' + if self.wantobjects: + self.assertEqual(str(a), expected) + self.assertEqual(a.string, expected) + self.assertEqual(a.typename, 'regexp') + else: + self.assertEqual(a, expected) + def testSetVar(self): tcl = self.interp tcl.setvar('a','1') self.assertEqual(tcl.eval('set a'),'1') + def test_setvar_passing_null(self): + tcl = self.interp + tcl.setvar('a', 'a\0b') # ASCII-only + self.assertEqual(tcl.getvar('a'), 'a\x00b') + self.assertEqual(tcl.call('set', 'a'), 'a\x00b') + self.assertEqual(tcl.eval('set a'), 'a\x00b') + + tcl.setvar('a', '\u20ac\0') # non-ASCII + self.assertEqual(tcl.getvar('a'), '\u20ac\x00') + self.assertEqual(tcl.call('set', 'a'), '\u20ac\x00') + self.assertEqual(tcl.eval('set a'), '\u20ac\x00') + def testSetVarArray(self): tcl = self.interp tcl.setvar('a(1)','1') @@ -102,6 +145,18 @@ def testGetVarArrayException(self): tcl = self.interp self.assertRaises(TclError,tcl.getvar,'a(1)') + def test_getvar_returns_tcl_obj(self): + tcl = self.interp.tk + tcl.eval(r'set a "\u20ac \ud83d\udcbb \0 \udcab"; regexp -about $a') + a = tcl.getvar('a') + expected = '\u20ac \U0001f4bb \0 \udced\udcb2\udcab' + if self.wantobjects: + self.assertEqual(str(a), expected) + self.assertEqual(a.string, expected) + self.assertEqual(a.typename, 'regexp') + else: + self.assertEqual(a, expected) + def testUnsetVar(self): tcl = self.interp tcl.setvar('a',1) @@ -219,10 +274,18 @@ def test_evalfile_surrogates_in_result(self): with open(filename, 'wb') as f: f.write(b""" set a "<\xed\xa0\xbd\xed\xb2\xbb>" + """) + if tcl_version >= (9, 0): + self.assertRaises(TclError, tcl.evalfile, filename) + else: + tcl.evalfile(filename) + self.assertEqual(tcl.eval('set a'), '<\U0001f4bb>') + + with open(filename, 'wb') as f: + f.write(b""" set b "<\\ud83d\\udcbb>" """) tcl.evalfile(filename) - self.assertEqual(tcl.eval('set a'), '<\U0001f4bb>') self.assertEqual(tcl.eval('set b'), '<\U0001f4bb>') def testEvalFileException(self): @@ -530,6 +593,24 @@ def float_eq(actual, expected): check((1, (2,), (3, 4), '5 6', ()), '1 2 {3 4} {5 6} {}') check([1, [2,], [3, 4], '5 6', []], '1 2 {3 4} {5 6} {}') + def test_passing_tcl_obj(self): + tcl = self.interp.tk + a = None + def testfunc(arg): + nonlocal a + a = arg + self.interp.createcommand('testfunc', testfunc) + self.addCleanup(self.interp.tk.deletecommand, 'testfunc') + tcl.eval(r'set a "\u20ac \ud83d\udcbb \0 \udcab"; regexp -about $a') + tcl.eval(r'testfunc $a') + expected = '\u20ac \U0001f4bb \0 \udced\udcb2\udcab' + if self.wantobjects >= 2: + self.assertEqual(str(a), expected) + self.assertEqual(a.string, expected) + self.assertEqual(a.typename, 'regexp') + else: + self.assertEqual(a, expected) + def test_splitlist(self): splitlist = self.interp.tk.splitlist call = self.interp.tk.call @@ -654,6 +735,7 @@ def test_new_tcl_obj(self): support.check_disallow_instantiation(self, _tkinter.TkttType) support.check_disallow_instantiation(self, _tkinter.TkappType) + class BigmemTclTest(unittest.TestCase): def setUp(self): diff --git a/Lib/test/test_termios.py b/Lib/test/test_termios.py index 58698ffa..11928f04 100644 --- a/Lib/test/test_termios.py +++ b/Lib/test/test_termios.py @@ -94,7 +94,7 @@ def test_tcsendbreak(self): try: termios.tcsendbreak(self.fd, 1) except termios.error as exc: - if exc.args[0] == errno.ENOTTY and sys.platform.startswith('freebsd'): + if exc.args[0] == errno.ENOTTY and sys.platform.startswith(('freebsd', "netbsd")): self.skipTest('termios.tcsendbreak() is not supported ' 'with pseudo-terminals (?) on this platform') raise diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 2e4b860b..75a56f78 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -1150,6 +1150,41 @@ def __del__(self): self.assertEqual(out.strip(), b"OK") self.assertIn(b"can't create new thread at interpreter shutdown", err) + def test_start_new_thread_failed(self): + # gh-109746: if Python fails to start newly created thread + # due to failure of underlying PyThread_start_new_thread() call, + # its state should be removed from interpreter' thread states list + # to avoid its double cleanup + try: + from resource import setrlimit, RLIMIT_NPROC + except ImportError as err: + self.skipTest(err) # RLIMIT_NPROC is specific to Linux and BSD + code = """if 1: + import resource + import _thread + + def f(): + print("shouldn't be printed") + + limits = resource.getrlimit(resource.RLIMIT_NPROC) + [_, hard] = limits + resource.setrlimit(resource.RLIMIT_NPROC, (0, hard)) + + try: + _thread.start_new_thread(f, ()) + except RuntimeError: + print('ok') + else: + print('!skip!') + """ + _, out, err = assert_python_ok("-u", "-c", code) + out = out.strip() + if b'!skip!' in out: + self.skipTest('RLIMIT_NPROC had no effect; probably superuser') + self.assertEqual(out, b'ok') + self.assertEqual(err, b'') + + class ThreadJoinOnShutdown(BaseTestCase): def _run_and_join(self, script): diff --git a/Lib/test/test_threading_local.py b/Lib/test/test_threading_local.py index f0b829a9..3a58afd8 100644 --- a/Lib/test/test_threading_local.py +++ b/Lib/test/test_threading_local.py @@ -208,6 +208,21 @@ def test_threading_local_clear_race(self): _testcapi.join_temporary_c_thread() + @support.cpython_only + def test_error(self): + class Loop(self._local): + attr = 1 + + # Trick the "if name == '__dict__':" test of __setattr__() + # to always be true + class NameCompareTrue: + def __eq__(self, other): + return True + + loop = Loop() + with self.assertRaisesRegex(AttributeError, 'Loop.*read-only'): + loop.__setattr__(NameCompareTrue(), 2) + class ThreadLocalTest(unittest.TestCase, BaseLocalTest): _local = _thread._local diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py index 02cc3f43..9463adda 100644 --- a/Lib/test/test_time.py +++ b/Lib/test/test_time.py @@ -2,7 +2,6 @@ from test.support import warnings_helper import decimal import enum -import locale import math import platform import sys @@ -15,7 +14,7 @@ except ImportError: _testcapi = None -from test.support import skip_if_buggy_ucrt_strfptime +from test.support import skip_if_buggy_ucrt_strfptime, SuppressCrashReport # Max year is only limited by the size of C int. SIZEOF_INT = sysconfig.get_config_var('SIZEOF_INT') or 4 @@ -178,8 +177,44 @@ def test_strftime(self): self.fail('conversion specifier: %r failed.' % format) self.assertRaises(TypeError, time.strftime, b'%S', tt) - # embedded null character - self.assertRaises(ValueError, time.strftime, '%S\0', tt) + + def test_strftime_invalid_format(self): + tt = time.gmtime(self.t) + with SuppressCrashReport(): + for i in range(1, 128): + format = ' %' + chr(i) + with self.subTest(format=format): + try: + time.strftime(format, tt) + except ValueError as exc: + self.assertEqual(str(exc), 'Invalid format string') + + def test_strftime_special(self): + tt = time.gmtime(self.t) + s1 = time.strftime('%c', tt) + s2 = time.strftime('%B', tt) + # gh-52551, gh-78662: Unicode strings should pass through strftime, + # independently from locale. + self.assertEqual(time.strftime('\U0001f40d', tt), '\U0001f40d') + self.assertEqual(time.strftime('\U0001f4bb%c\U0001f40d%B', tt), f'\U0001f4bb{s1}\U0001f40d{s2}') + self.assertEqual(time.strftime('%c\U0001f4bb%B\U0001f40d', tt), f'{s1}\U0001f4bb{s2}\U0001f40d') + # Lone surrogates should pass through. + self.assertEqual(time.strftime('\ud83d', tt), '\ud83d') + self.assertEqual(time.strftime('\udc0d', tt), '\udc0d') + self.assertEqual(time.strftime('\ud83d%c\udc0d%B', tt), f'\ud83d{s1}\udc0d{s2}') + self.assertEqual(time.strftime('%c\ud83d%B\udc0d', tt), f'{s1}\ud83d{s2}\udc0d') + self.assertEqual(time.strftime('%c\udc0d%B\ud83d', tt), f'{s1}\udc0d{s2}\ud83d') + # Surrogate pairs should not recombine. + self.assertEqual(time.strftime('\ud83d\udc0d', tt), '\ud83d\udc0d') + self.assertEqual(time.strftime('%c\ud83d\udc0d%B', tt), f'{s1}\ud83d\udc0d{s2}') + # Surrogate-escaped bytes should not recombine. + self.assertEqual(time.strftime('\udcf0\udc9f\udc90\udc8d', tt), '\udcf0\udc9f\udc90\udc8d') + self.assertEqual(time.strftime('%c\udcf0\udc9f\udc90\udc8d%B', tt), f'{s1}\udcf0\udc9f\udc90\udc8d{s2}') + # gh-124531: The null character should not terminate the format string. + self.assertEqual(time.strftime('\0', tt), '\0') + self.assertEqual(time.strftime('\0'*1000, tt), '\0'*1000) + self.assertEqual(time.strftime('\0%c\0%B', tt), f'\0{s1}\0{s2}') + self.assertEqual(time.strftime('%c\0%B\0', tt), f'{s1}\0{s2}\0') def _bounds_checking(self, func): # Make sure that strftime() checks the bounds of the various parts @@ -293,7 +328,7 @@ def test_strptime_exception_context(self): # additional check for IndexError branch (issue #19545) with self.assertRaises(ValueError) as e: time.strptime('19', '%Y %') - self.assertIs(e.exception.__suppress_context__, True) + self.assertIsNone(e.exception.__context__) def test_asctime(self): time.asctime(time.gmtime(self.t)) @@ -588,17 +623,8 @@ def test_get_clock_info(self): class TestLocale(unittest.TestCase): - def setUp(self): - self.oldloc = locale.setlocale(locale.LC_ALL) - - def tearDown(self): - locale.setlocale(locale.LC_ALL, self.oldloc) - + @support.run_with_locale('LC_ALL', 'fr_FR', '') def test_bug_3061(self): - try: - tmp = locale.setlocale(locale.LC_ALL, "fr_FR") - except locale.Error: - self.skipTest('could not set locale.LC_ALL to fr_FR') # This should not cause an exception time.strftime("%B", (2009,2,1,0,0,0,0,0,0)) diff --git a/Lib/test/test_tkinter/test_geometry_managers.py b/Lib/test/test_tkinter/test_geometry_managers.py index 59fe592b..1be474b3 100644 --- a/Lib/test/test_tkinter/test_geometry_managers.py +++ b/Lib/test/test_tkinter/test_geometry_managers.py @@ -10,6 +10,11 @@ requires('gui') +EXPECTED_FLOAT_ERRMSG = 'expected floating-point number but got "{}"' +EXPECTED_FLOAT_OR_EMPTY_ERRMSG = 'expected floating-point number (or "" )?but got "{}"' +EXPECTED_SCREEN_DISTANCE_ERRMSG = '(bad|expected) screen distance (but got )?"{}"' +EXPECTED_SCREEN_DISTANCE_OR_EMPTY_ERRMSG = '(bad|expected) screen distance (or "" but got )?"{}"' + class PackTest(AbstractWidgetTest, unittest.TestCase): test_keys = None @@ -317,7 +322,8 @@ def test_place_configure_x(self): self.assertEqual(f2.place_info()['x'], '-10') self.root.update() self.assertEqual(f2.winfo_x(), 190) - with self.assertRaisesRegex(TclError, 'bad screen distance "spam"'): + with self.assertRaisesRegex(TclError, + EXPECTED_SCREEN_DISTANCE_ERRMSG.format('spam')): f2.place_configure(in_=f, x='spam') def test_place_configure_y(self): @@ -334,7 +340,8 @@ def test_place_configure_y(self): self.assertEqual(f2.place_info()['y'], '-10') self.root.update() self.assertEqual(f2.winfo_y(), 110) - with self.assertRaisesRegex(TclError, 'bad screen distance "spam"'): + with self.assertRaisesRegex(TclError, + EXPECTED_SCREEN_DISTANCE_ERRMSG.format('spam')): f2.place_configure(in_=f, y='spam') def test_place_configure_relx(self): @@ -351,8 +358,7 @@ def test_place_configure_relx(self): self.assertEqual(f2.place_info()['relx'], '1') self.root.update() self.assertEqual(f2.winfo_x(), 200) - with self.assertRaisesRegex(TclError, 'expected floating-point number ' - 'but got "spam"'): + with self.assertRaisesRegex(TclError, EXPECTED_FLOAT_ERRMSG.format('spam')): f2.place_configure(in_=f, relx='spam') def test_place_configure_rely(self): @@ -369,8 +375,7 @@ def test_place_configure_rely(self): self.assertEqual(f2.place_info()['rely'], '1') self.root.update() self.assertEqual(f2.winfo_y(), 120) - with self.assertRaisesRegex(TclError, 'expected floating-point number ' - 'but got "spam"'): + with self.assertRaisesRegex(TclError, EXPECTED_FLOAT_ERRMSG.format('spam')): f2.place_configure(in_=f, rely='spam') def test_place_configure_anchor(self): @@ -391,7 +396,8 @@ def test_place_configure_width(self): f2.place_configure(width='') self.root.update() self.assertEqual(f2.winfo_width(), 30) - with self.assertRaisesRegex(TclError, 'bad screen distance "abcd"'): + with self.assertRaisesRegex(TclError, + EXPECTED_SCREEN_DISTANCE_OR_EMPTY_ERRMSG.format('abcd')): f2.place_configure(width='abcd') def test_place_configure_height(self): @@ -402,7 +408,8 @@ def test_place_configure_height(self): f2.place_configure(height='') self.root.update() self.assertEqual(f2.winfo_height(), 60) - with self.assertRaisesRegex(TclError, 'bad screen distance "abcd"'): + with self.assertRaisesRegex(TclError, + EXPECTED_SCREEN_DISTANCE_OR_EMPTY_ERRMSG.format('abcd')): f2.place_configure(height='abcd') def test_place_configure_relwidth(self): @@ -413,8 +420,7 @@ def test_place_configure_relwidth(self): f2.place_configure(relwidth='') self.root.update() self.assertEqual(f2.winfo_width(), 30) - with self.assertRaisesRegex(TclError, 'expected floating-point number ' - 'but got "abcd"'): + with self.assertRaisesRegex(TclError, EXPECTED_FLOAT_OR_EMPTY_ERRMSG.format('abcd')): f2.place_configure(relwidth='abcd') def test_place_configure_relheight(self): @@ -425,8 +431,7 @@ def test_place_configure_relheight(self): f2.place_configure(relheight='') self.root.update() self.assertEqual(f2.winfo_height(), 60) - with self.assertRaisesRegex(TclError, 'expected floating-point number ' - 'but got "abcd"'): + with self.assertRaisesRegex(TclError, EXPECTED_FLOAT_OR_EMPTY_ERRMSG.format('abcd')): f2.place_configure(relheight='abcd') def test_place_configure_bordermode(self): @@ -629,7 +634,8 @@ def test_grid_columnconfigure(self): self.assertEqual(self.root.grid_columnconfigure(0, 'weight'), 4) def test_grid_columnconfigure_minsize(self): - with self.assertRaisesRegex(TclError, 'bad screen distance "foo"'): + with self.assertRaisesRegex(TclError, + EXPECTED_SCREEN_DISTANCE_ERRMSG.format('foo')): self.root.grid_columnconfigure(0, minsize='foo') self.root.grid_columnconfigure(0, minsize=10) self.assertEqual(self.root.grid_columnconfigure(0, 'minsize'), 10) @@ -646,7 +652,8 @@ def test_grid_columnconfigure_weight(self): self.assertEqual(self.root.grid_columnconfigure(0)['weight'], 3) def test_grid_columnconfigure_pad(self): - with self.assertRaisesRegex(TclError, 'bad screen distance "foo"'): + with self.assertRaisesRegex(TclError, + EXPECTED_SCREEN_DISTANCE_ERRMSG.format('foo')): self.root.grid_columnconfigure(0, pad='foo') with self.assertRaisesRegex(TclError, 'invalid arg "-pad": ' 'should be non-negative'): @@ -683,7 +690,8 @@ def test_grid_rowconfigure(self): self.assertEqual(self.root.grid_rowconfigure(0, 'weight'), 4) def test_grid_rowconfigure_minsize(self): - with self.assertRaisesRegex(TclError, 'bad screen distance "foo"'): + with self.assertRaisesRegex(TclError, + EXPECTED_SCREEN_DISTANCE_ERRMSG.format('foo')): self.root.grid_rowconfigure(0, minsize='foo') self.root.grid_rowconfigure(0, minsize=10) self.assertEqual(self.root.grid_rowconfigure(0, 'minsize'), 10) @@ -700,7 +708,8 @@ def test_grid_rowconfigure_weight(self): self.assertEqual(self.root.grid_rowconfigure(0)['weight'], 3) def test_grid_rowconfigure_pad(self): - with self.assertRaisesRegex(TclError, 'bad screen distance "foo"'): + with self.assertRaisesRegex(TclError, + EXPECTED_SCREEN_DISTANCE_ERRMSG.format('foo')): self.root.grid_rowconfigure(0, pad='foo') with self.assertRaisesRegex(TclError, 'invalid arg "-pad": ' 'should be non-negative'): @@ -818,9 +827,11 @@ def test_grid_location(self): self.root.grid_location(0) with self.assertRaises(TypeError): self.root.grid_location(0, 0, 0) - with self.assertRaisesRegex(TclError, 'bad screen distance "x"'): + with self.assertRaisesRegex(TclError, + EXPECTED_SCREEN_DISTANCE_ERRMSG.format('x')): self.root.grid_location('x', 'y') - with self.assertRaisesRegex(TclError, 'bad screen distance "y"'): + with self.assertRaisesRegex(TclError, + EXPECTED_SCREEN_DISTANCE_ERRMSG.format('y')): self.root.grid_location('1c', 'y') t = self.root # de-maximize diff --git a/Lib/test/test_tkinter/test_misc.py b/Lib/test/test_tkinter/test_misc.py index fc128600..81866993 100644 --- a/Lib/test/test_tkinter/test_misc.py +++ b/Lib/test/test_tkinter/test_misc.py @@ -382,6 +382,15 @@ def test_info_patchlevel(self): self.assertEqual(vi.micro, 0) self.assertTrue(str(vi).startswith(f'{vi.major}.{vi.minor}')) + def test_embedded_null(self): + widget = tkinter.Entry(self.root) + widget.insert(0, 'abc\0def') # ASCII-only + widget.selection_range(0, 'end') + self.assertEqual(widget.selection_get(), 'abc\x00def') + widget.insert(0, '\u20ac\0') # non-ASCII + widget.selection_range(0, 'end') + self.assertEqual(widget.selection_get(), '\u20ac\0abc\x00def') + class EventTest(AbstractTkTest, unittest.TestCase): diff --git a/Lib/test/test_tkinter/test_variables.py b/Lib/test/test_tkinter/test_variables.py index c1d232e2..def7aec0 100644 --- a/Lib/test/test_tkinter/test_variables.py +++ b/Lib/test/test_tkinter/test_variables.py @@ -6,7 +6,7 @@ from tkinter import (Variable, StringVar, IntVar, DoubleVar, BooleanVar, Tcl, TclError) from test.support import ALWAYS_EQ -from test.test_tkinter.support import AbstractDefaultRootTest +from test.test_tkinter.support import AbstractDefaultRootTest, tcl_version class Var(Variable): @@ -112,6 +112,8 @@ def test_initialize(self): self.assertTrue(v.side_effect) def test_trace_old(self): + if tcl_version >= (9, 0): + self.skipTest('requires Tcl version < 9.0') # Old interface v = Variable(self.root) vname = str(v) diff --git a/Lib/test/test_tkinter/test_widgets.py b/Lib/test/test_tkinter/test_widgets.py index 24604b27..b020e1be 100644 --- a/Lib/test/test_tkinter/test_widgets.py +++ b/Lib/test/test_tkinter/test_widgets.py @@ -4,7 +4,7 @@ import os from test.support import requires -from test.test_tkinter.support import (requires_tk, +from test.test_tkinter.support import (requires_tk, tk_version, get_tk_patchlevel, widget_eq, AbstractDefaultRootTest) from test.test_tkinter.widget_tests import ( @@ -14,6 +14,9 @@ requires('gui') +EXPECTED_SCREEN_DISTANCE_ERRMSG = '(bad|expected) screen distance (but got )?"{}"' +EXPECTED_SCREEN_DISTANCE_OR_EMPTY_ERRMSG = '(bad|expected) screen distance (or "" but got )?"{}"' + def float_round(x): return float(round(x)) @@ -58,11 +61,11 @@ def test_configure_visual(self): @add_standard_options(StandardOptionsTests) class ToplevelTest(AbstractToplevelTest, unittest.TestCase): OPTIONS = ( - 'background', 'borderwidth', + 'background', 'backgroundimage', 'borderwidth', 'class', 'colormap', 'container', 'cursor', 'height', 'highlightbackground', 'highlightcolor', 'highlightthickness', 'menu', 'padx', 'pady', 'relief', 'screen', - 'takefocus', 'use', 'visual', 'width', + 'takefocus', 'tile', 'use', 'visual', 'width', ) def create(self, **kwargs): @@ -101,10 +104,10 @@ def test_configure_use(self): @add_standard_options(StandardOptionsTests) class FrameTest(AbstractToplevelTest, unittest.TestCase): OPTIONS = ( - 'background', 'borderwidth', + 'background', 'backgroundimage', 'borderwidth', 'class', 'colormap', 'container', 'cursor', 'height', 'highlightbackground', 'highlightcolor', 'highlightthickness', - 'padx', 'pady', 'relief', 'takefocus', 'visual', 'width', + 'padx', 'pady', 'relief', 'takefocus', 'tile', 'visual', 'width', ) def create(self, **kwargs): @@ -141,11 +144,9 @@ def test_configure_labelwidget(self): class AbstractLabelTest(AbstractWidgetTest, IntegerSizeTests): _conv_pixels = False - - def test_configure_highlightthickness(self): - widget = self.create() - self.checkPixelsParam(widget, 'highlightthickness', - 0, 1.3, 2.6, 6, -2, '10p') + _clip_highlightthickness = tk_version >= (8, 7) + _clip_pad = tk_version >= (8, 7) + _clip_borderwidth = tk_version >= (8, 7) @add_standard_options(StandardOptionsTests) @@ -277,6 +278,9 @@ class MenubuttonTest(AbstractLabelTest, unittest.TestCase): 'underline', 'width', 'wraplength', ) _conv_pixels = round + _clip_highlightthickness = True + _clip_pad = True + _clip_borderwidth = False def create(self, **kwargs): return tkinter.Menubutton(self.root, **kwargs) @@ -290,9 +294,6 @@ def test_configure_height(self): widget = self.create() self.checkIntegerParam(widget, 'height', 100, -100, 0, conv=str) - test_configure_highlightthickness = \ - StandardOptionsTests.test_configure_highlightthickness - def test_configure_image(self): widget = self.create() image = tkinter.PhotoImage(master=self.root, name='image1') @@ -313,16 +314,6 @@ def test_configure_menu(self): self.checkParam(widget, 'menu', menu, eq=widget_eq) menu.destroy() - def test_configure_padx(self): - widget = self.create() - self.checkPixelsParam(widget, 'padx', 3, 4.4, 5.6, '12m') - self.checkParam(widget, 'padx', -2, expected=0) - - def test_configure_pady(self): - widget = self.create() - self.checkPixelsParam(widget, 'pady', 3, 4.4, 5.6, '12m') - self.checkParam(widget, 'pady', -2, expected=0) - def test_configure_width(self): widget = self.create() self.checkIntegerParam(widget, 'width', 402, -402, 0, conv=str) @@ -347,7 +338,8 @@ class EntryTest(AbstractWidgetTest, unittest.TestCase): 'highlightbackground', 'highlightcolor', 'highlightthickness', 'insertbackground', 'insertborderwidth', 'insertofftime', 'insertontime', 'insertwidth', - 'invalidcommand', 'justify', 'readonlybackground', 'relief', + 'invalidcommand', 'justify', 'placeholder', 'placeholderforeground', + 'readonlybackground', 'relief', 'selectbackground', 'selectborderwidth', 'selectforeground', 'show', 'state', 'takefocus', 'textvariable', 'validate', 'validatecommand', 'width', 'xscrollcommand', @@ -441,8 +433,8 @@ class SpinboxTest(EntryTest, unittest.TestCase): 'increment', 'insertbackground', 'insertborderwidth', 'insertofftime', 'insertontime', 'insertwidth', - 'invalidcommand', 'justify', 'relief', 'readonlybackground', - 'repeatdelay', 'repeatinterval', + 'invalidcommand', 'justify', 'placeholder', 'placeholderforeground', + 'relief', 'readonlybackground', 'repeatdelay', 'repeatinterval', 'selectbackground', 'selectborderwidth', 'selectforeground', 'state', 'takefocus', 'textvariable', 'to', 'validate', 'validatecommand', 'values', @@ -489,8 +481,12 @@ def test_configure_from(self): widget = self.create() self.checkParam(widget, 'to', 100.0) self.checkFloatParam(widget, 'from', -10, 10.2, 11.7) - self.checkInvalidParam(widget, 'from', 200, - errmsg='-to value must be greater than -from value') + if tk_version >= (8, 7): + self.checkFloatParam(widget, 'from', 200, expected=100) + else: + self.checkInvalidParam( + widget, 'from', 200, + errmsg='-to value must be greater than -from value') def test_configure_increment(self): widget = self.create() @@ -500,8 +496,12 @@ def test_configure_to(self): widget = self.create() self.checkParam(widget, 'from', -100.0) self.checkFloatParam(widget, 'to', -10, 10.2, 11.7) - self.checkInvalidParam(widget, 'to', -200, - errmsg='-to value must be greater than -from value') + if tk_version >= (8, 7): + self.checkFloatParam(widget, 'to', -200, expected=-100) + else: + self.checkInvalidParam( + widget, 'to', -200, + errmsg='-to value must be greater than -from value') def test_configure_values(self): # XXX @@ -666,7 +666,7 @@ def test_configure_tabs(self): self.checkParam(widget, 'tabs', '2c left 4c 6c center', expected=('2c', 'left', '4c', '6c', 'center')) self.checkInvalidParam(widget, 'tabs', 'spam', - errmsg='bad screen distance "spam"') + errmsg=EXPECTED_SCREEN_DISTANCE_ERRMSG.format('spam')) def test_configure_tabstyle(self): widget = self.create() @@ -860,24 +860,27 @@ def test_create_line(self): def test_create_polygon(self): c = self.create() - i1 = c.create_polygon(20, 30, 40, 50, 60, 10) + tk87 = tk_version >= (8, 7) + # In Tk < 8.7 polygons are filled, but has no outline by default. + # This affects its size, so always explicitly specify outline. + i1 = c.create_polygon(20, 30, 40, 50, 60, 10, outline='red') self.assertEqual(c.coords(i1), [20.0, 30.0, 40.0, 50.0, 60.0, 10.0]) - self.assertEqual(c.bbox(i1), (19, 9, 61, 51)) + self.assertEqual(c.bbox(i1), (18, 8, 62, 52)) self.assertEqual(c.itemcget(i1, 'joinstyle'), 'round') self.assertEqual(c.itemcget(i1, 'smooth'), '0') self.assertEqual(c.itemcget(i1, 'splinestep'), '12') - i2 = c.create_polygon([21, 31, 41, 51, 61, 11]) + i2 = c.create_polygon([21, 31, 41, 51, 61, 11], outline='red') self.assertEqual(c.coords(i2), [21.0, 31.0, 41.0, 51.0, 61.0, 11.0]) - self.assertEqual(c.bbox(i2), (20, 10, 62, 52)) + self.assertEqual(c.bbox(i2), (19, 9, 63, 53)) - i3 = c.create_polygon((22, 32), (42, 52), (62, 12)) + i3 = c.create_polygon((22, 32), (42, 52), (62, 12), outline='red') self.assertEqual(c.coords(i3), [22.0, 32.0, 42.0, 52.0, 62.0, 12.0]) - self.assertEqual(c.bbox(i3), (21, 11, 63, 53)) + self.assertEqual(c.bbox(i3), (20, 10, 64, 54)) - i4 = c.create_polygon([(23, 33), (43, 53), (63, 13)]) + i4 = c.create_polygon([(23, 33), (43, 53), (63, 13)], outline='red') self.assertEqual(c.coords(i4), [23.0, 33.0, 43.0, 53.0, 63.0, 13.0]) - self.assertEqual(c.bbox(i4), (22, 12, 64, 54)) + self.assertEqual(c.bbox(i4), (21, 11, 65, 55)) self.assertRaises(TclError, c.create_polygon, 20, 30, 60) self.assertRaises(TclError, c.create_polygon, [20, 30, 60]) @@ -1174,18 +1177,16 @@ class ScrollbarTest(AbstractWidgetTest, unittest.TestCase): def create(self, **kwargs): return tkinter.Scrollbar(self.root, **kwargs) - def test_configure_activerelief(self): - widget = self.create() - self.checkReliefParam(widget, 'activerelief') - def test_configure_elementborderwidth(self): widget = self.create() - self.checkPixelsParam(widget, 'elementborderwidth', 4.3, 5.6, -2, '1m') + self.checkPixelsParam(widget, 'elementborderwidth', 4.3, 5.6, '1m') + expected = self._default_pixels if tk_version >= (8, 7) else -2 + self.checkParam(widget, 'elementborderwidth', -2, expected=expected) def test_configure_orient(self): widget = self.create() self.checkEnumParam(widget, 'orient', 'vertical', 'horizontal', - errmsg='bad orientation "{}": must be vertical or horizontal') + fullname='orientation', allow_empty=True) def test_activate(self): sb = self.create() @@ -1256,7 +1257,8 @@ def test_configure_proxyborderwidth(self): @requires_tk(8, 6, 5) def test_configure_proxyrelief(self): widget = self.create() - self.checkReliefParam(widget, 'proxyrelief') + self.checkReliefParam(widget, 'proxyrelief', + allow_empty=(tk_version >= (8, 7))) def test_configure_sashcursor(self): widget = self.create() @@ -1329,7 +1331,7 @@ def test_paneconfigure_height(self): p, b, c = self.create2() self.check_paneconfigure(p, b, 'height', 10, 10) self.check_paneconfigure_bad(p, b, 'height', - 'bad screen distance "badValue"') + EXPECTED_SCREEN_DISTANCE_OR_EMPTY_ERRMSG.format('badValue')) def test_paneconfigure_hide(self): p, b, c = self.create2() @@ -1341,19 +1343,19 @@ def test_paneconfigure_minsize(self): p, b, c = self.create2() self.check_paneconfigure(p, b, 'minsize', 10, 10) self.check_paneconfigure_bad(p, b, 'minsize', - 'bad screen distance "badValue"') + EXPECTED_SCREEN_DISTANCE_ERRMSG.format('badValue')) def test_paneconfigure_padx(self): p, b, c = self.create2() self.check_paneconfigure(p, b, 'padx', 1.3, 1) self.check_paneconfigure_bad(p, b, 'padx', - 'bad screen distance "badValue"') + EXPECTED_SCREEN_DISTANCE_ERRMSG.format('badValue')) def test_paneconfigure_pady(self): p, b, c = self.create2() self.check_paneconfigure(p, b, 'pady', 1.3, 1) self.check_paneconfigure_bad(p, b, 'pady', - 'bad screen distance "badValue"') + EXPECTED_SCREEN_DISTANCE_ERRMSG.format('badValue')) def test_paneconfigure_sticky(self): p, b, c = self.create2() @@ -1374,13 +1376,14 @@ def test_paneconfigure_width(self): p, b, c = self.create2() self.check_paneconfigure(p, b, 'width', 10, 10) self.check_paneconfigure_bad(p, b, 'width', - 'bad screen distance "badValue"') + EXPECTED_SCREEN_DISTANCE_OR_EMPTY_ERRMSG.format('badValue')) @add_standard_options(StandardOptionsTests) class MenuTest(AbstractWidgetTest, unittest.TestCase): OPTIONS = ( 'activebackground', 'activeborderwidth', 'activeforeground', + 'activerelief', 'background', 'borderwidth', 'cursor', 'disabledforeground', 'font', 'foreground', 'postcommand', 'relief', 'selectcolor', 'takefocus', @@ -1396,6 +1399,8 @@ def test_indexcommand_none(self): i = widget.index('none') self.assertIsNone(i) + test_configure_activerelief = requires_tk(8, 7)(StandardOptionsTests.test_configure_activerelief) + def test_configure_postcommand(self): widget = self.create() self.checkCommandParam(widget, 'postcommand') @@ -1414,14 +1419,10 @@ def test_configure_title(self): def test_configure_type(self): widget = self.create() - opts = ('normal, tearoff, or menubar' - if widget.info_patchlevel() < (8, 7) else - 'menubar, normal, or tearoff') - self.checkEnumParam( - widget, 'type', - 'normal', 'tearoff', 'menubar', - errmsg='bad type "{}": must be ' + opts, - ) + values = ('normal', 'tearoff', 'menubar') + self.checkEnumParam(widget, 'type', *values, + allow_empty=tk_version < (8, 7), + sort=tk_version >= (8, 7)) def test_entryconfigure(self): m1 = self.create() @@ -1467,6 +1468,10 @@ class MessageTest(AbstractWidgetTest, unittest.TestCase): 'takefocus', 'text', 'textvariable', 'width', ) _conv_pad_pixels = False + if tk_version >= (8, 7): + _conv_pixels = False + _clip_pad = tk_version >= (8, 7) + _clip_borderwidth = tk_version >= (8, 7) def create(self, **kwargs): return tkinter.Message(self.root, **kwargs) @@ -1475,6 +1480,26 @@ def test_configure_aspect(self): widget = self.create() self.checkIntegerParam(widget, 'aspect', 250, 0, -300) + def test_configure_padx(self): + widget = self.create() + self.checkPixelsParam(widget, 'padx', 3, 4.4, 5.6, '12m', + conv=self._conv_pad_pixels) + expected = self._default_pixels if self._clip_pad else -2 + self.checkParam(widget, 'padx', -2, expected=expected) + + def test_configure_pady(self): + widget = self.create() + self.checkPixelsParam(widget, 'pady', 3, 4.4, 5.6, '12m', + conv=self._conv_pad_pixels) + expected = self._default_pixels if self._clip_pad else -2 + self.checkParam(widget, 'pady', -2, expected=expected) + + def test_configure_width(self): + widget = self.create() + self.checkPixelsParam(widget, 'width', 402, 403.4, 404.6, 0, '5i') + expected = 0 if tk_version >= (8, 7) else -402 + self.checkParam(widget, 'width', -402, expected=expected) + class DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase): diff --git a/Lib/test/test_tkinter/widget_tests.py b/Lib/test/test_tkinter/widget_tests.py index 514b42be..3b75dc7b 100644 --- a/Lib/test/test_tkinter/widget_tests.py +++ b/Lib/test/test_tkinter/widget_tests.py @@ -1,7 +1,8 @@ # Common tests for test_tkinter/test_widgets.py and test_ttk/test_widgets.py +import re import tkinter -from test.test_tkinter.support import (AbstractTkTest, tk_version, +from test.test_tkinter.support import (AbstractTkTest, requires_tk, tk_version, pixels_conv, tcl_obj_eq) import test.support @@ -9,9 +10,14 @@ _sentinel = object() class AbstractWidgetTest(AbstractTkTest): + _default_pixels = '' if tk_version >= (9, 0) else -1 if tk_version >= (8, 7) else '' _conv_pixels = round _conv_pad_pixels = None _stringify = False + _clip_highlightthickness = True + _clip_pad = False + _clip_borderwidth = False + _allow_empty_justify = False @property def scaling(self): @@ -56,16 +62,13 @@ def checkParam(self, widget, name, value, *, expected=_sentinel, def checkInvalidParam(self, widget, name, value, errmsg=None): orig = widget[name] if errmsg is not None: - errmsg = errmsg.format(value) - with self.assertRaises(tkinter.TclError) as cm: + errmsg = errmsg.format(re.escape(str(value))) + errmsg = fr'\A{errmsg}\Z' + with self.assertRaisesRegex(tkinter.TclError, errmsg or ''): widget[name] = value - if errmsg is not None: - self.assertEqual(str(cm.exception), errmsg) self.assertEqual(widget[name], orig) - with self.assertRaises(tkinter.TclError) as cm: + with self.assertRaisesRegex(tkinter.TclError, errmsg or ''): widget.configure({name: value}) - if errmsg is not None: - self.assertEqual(str(cm.exception), errmsg) self.assertEqual(widget[name], orig) def checkParams(self, widget, name, *values, **kwargs): @@ -74,30 +77,26 @@ def checkParams(self, widget, name, *values, **kwargs): def checkIntegerParam(self, widget, name, *values, **kwargs): self.checkParams(widget, name, *values, **kwargs) - self.checkInvalidParam(widget, name, '', - errmsg='expected integer but got ""') - self.checkInvalidParam(widget, name, '10p', - errmsg='expected integer but got "10p"') - self.checkInvalidParam(widget, name, 3.2, - errmsg='expected integer but got "3.2"') + errmsg = 'expected integer but got "{}"' + self.checkInvalidParam(widget, name, '', errmsg=errmsg) + self.checkInvalidParam(widget, name, '10p', errmsg=errmsg) + self.checkInvalidParam(widget, name, 3.2, errmsg=errmsg) def checkFloatParam(self, widget, name, *values, conv=float, **kwargs): for value in values: self.checkParam(widget, name, value, conv=conv, **kwargs) - self.checkInvalidParam(widget, name, '', - errmsg='expected floating-point number but got ""') - self.checkInvalidParam(widget, name, 'spam', - errmsg='expected floating-point number but got "spam"') + errmsg = 'expected floating-point number but got "{}"' + self.checkInvalidParam(widget, name, '', errmsg=errmsg) + self.checkInvalidParam(widget, name, 'spam', errmsg=errmsg) def checkBooleanParam(self, widget, name): for value in (False, 0, 'false', 'no', 'off'): self.checkParam(widget, name, value, expected=0) for value in (True, 1, 'true', 'yes', 'on'): self.checkParam(widget, name, value, expected=1) - self.checkInvalidParam(widget, name, '', - errmsg='expected boolean value but got ""') - self.checkInvalidParam(widget, name, 'spam', - errmsg='expected boolean value but got "spam"') + errmsg = 'expected boolean value but got "{}"' + self.checkInvalidParam(widget, name, '', errmsg=errmsg) + self.checkInvalidParam(widget, name, 'spam', errmsg=errmsg) def checkColorParam(self, widget, name, *, allow_empty=None, **kwargs): self.checkParams(widget, name, @@ -120,16 +119,24 @@ def command(*args): self.assertTrue(widget[name]) self.checkParams(widget, name, '') - def checkEnumParam(self, widget, name, *values, errmsg=None, **kwargs): + def checkEnumParam(self, widget, name, *values, + errmsg=None, allow_empty=False, fullname=None, + sort=False, **kwargs): self.checkParams(widget, name, *values, **kwargs) if errmsg is None: + if sort: + if values[-1]: + values = tuple(sorted(values)) + else: + values = tuple(sorted(values[:-1])) + ('',) errmsg2 = ' %s "{}": must be %s%s or %s' % ( - name, + fullname or name, ', '.join(values[:-1]), ',' if len(values) > 2 else '', - values[-1]) - self.checkInvalidParam(widget, name, '', - errmsg='ambiguous' + errmsg2) + values[-1] or '""') + if '' not in values and not allow_empty: + self.checkInvalidParam(widget, name, '', + errmsg='ambiguous' + errmsg2) errmsg = 'bad' + errmsg2 self.checkInvalidParam(widget, name, 'spam', errmsg=errmsg) @@ -146,20 +153,21 @@ def checkPixelsParam(self, widget, name, *values, conv1 = round self.checkParam(widget, name, value, expected=expected, conv=conv1, **kwargs) - self.checkInvalidParam(widget, name, '6x', - errmsg='bad screen distance "6x"') - self.checkInvalidParam(widget, name, 'spam', - errmsg='bad screen distance "spam"') + errmsg = '(bad|expected) screen distance ((or "" )?but got )?"{}"' + self.checkInvalidParam(widget, name, '6x', errmsg=errmsg) + self.checkInvalidParam(widget, name, 'spam', errmsg=errmsg) - def checkReliefParam(self, widget, name): - self.checkParams(widget, name, - 'flat', 'groove', 'raised', 'ridge', 'solid', 'sunken') - errmsg='bad relief "spam": must be '\ - 'flat, groove, raised, ridge, solid, or sunken' + def checkReliefParam(self, widget, name, *, allow_empty=False): + values = ('flat', 'groove', 'raised', 'ridge', 'solid', 'sunken') + if allow_empty: + values += ('',) + self.checkParams(widget, name, *values) + errmsg = 'bad relief "{}": must be %s, or %s' % ( + ', '.join(values[:-1]), + values[-1] or '""') if tk_version < (8, 6): errmsg = None - self.checkInvalidParam(widget, name, 'spam', - errmsg=errmsg) + self.checkInvalidParam(widget, name, 'spam', errmsg=errmsg) def checkImageParam(self, widget, name): image = tkinter.PhotoImage(master=self.root, name='image1') @@ -193,6 +201,7 @@ def test_keys(self): aliases = { 'bd': 'borderwidth', 'bg': 'background', + 'bgimg': 'backgroundimage', 'fg': 'foreground', 'invcmd': 'invalidcommand', 'vcmd': 'validatecommand', @@ -235,6 +244,10 @@ def test_configure_activeforeground(self): widget = self.create() self.checkColorParam(widget, 'activeforeground') + def test_configure_activerelief(self): + widget = self.create() + self.checkReliefParam(widget, 'activerelief') + def test_configure_anchor(self): widget = self.create() self.checkEnumParam(widget, 'anchor', @@ -246,6 +259,11 @@ def test_configure_background(self): if 'bg' in self.OPTIONS: self.checkColorParam(widget, 'bg') + @requires_tk(8, 7) + def test_configure_backgroundimage(self): + widget = self.create() + self.checkImageParam(widget, 'backgroundimage') + def test_configure_bitmap(self): widget = self.create() self.checkParam(widget, 'bitmap', 'questhead') @@ -262,9 +280,14 @@ def test_configure_bitmap(self): def test_configure_borderwidth(self): widget = self.create() self.checkPixelsParam(widget, 'borderwidth', - 0, 1.3, 2.6, 6, -2, '10p') + 0, 1.3, 2.6, 6, '10p') + expected = 0 if self._clip_borderwidth else -2 + self.checkParam(widget, 'borderwidth', -2, expected=expected, + conv=self._conv_pixels) if 'bd' in self.OPTIONS: - self.checkPixelsParam(widget, 'bd', 0, 1.3, 2.6, 6, -2, '10p') + self.checkPixelsParam(widget, 'bd', 0, 1.3, 2.6, 6, '10p') + self.checkParam(widget, 'bd', -2, expected=expected, + conv=self._conv_pixels) def test_configure_compound(self): widget = self.create() @@ -287,8 +310,10 @@ def test_configure_font(self): widget = self.create() self.checkParam(widget, 'font', '-Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-*') - self.checkInvalidParam(widget, 'font', '', - errmsg='font "" doesn\'t exist') + is_ttk = widget.__class__.__module__ == 'tkinter.ttk' + if not is_ttk: + self.checkInvalidParam(widget, 'font', '', + errmsg='font "" doesn\'t exist') def test_configure_foreground(self): widget = self.create() @@ -308,7 +333,8 @@ def test_configure_highlightthickness(self): widget = self.create() self.checkPixelsParam(widget, 'highlightthickness', 0, 1.3, 2.6, 6, '10p') - self.checkParam(widget, 'highlightthickness', -2, expected=0, + expected = 0 if self._clip_highlightthickness else -2 + self.checkParam(widget, 'highlightthickness', -2, expected=expected, conv=self._conv_pixels) def test_configure_image(self): @@ -342,12 +368,11 @@ def test_configure_jump(self): def test_configure_justify(self): widget = self.create() - self.checkEnumParam(widget, 'justify', 'left', 'right', 'center', - errmsg='bad justification "{}": must be ' - 'left, right, or center') - self.checkInvalidParam(widget, 'justify', '', - errmsg='ambiguous justification "": must be ' - 'left, right, or center') + values = ('left', 'right', 'center') + if self._allow_empty_justify: + values += ('',) + self.checkEnumParam(widget, 'justify', *values, + fullname='justification') def test_configure_orient(self): widget = self.create() @@ -356,13 +381,29 @@ def test_configure_orient(self): def test_configure_padx(self): widget = self.create() - self.checkPixelsParam(widget, 'padx', 3, 4.4, 5.6, -2, '12m', + self.checkPixelsParam(widget, 'padx', 3, 4.4, 5.6, '12m', conv=self._conv_pad_pixels) + expected = 0 if self._clip_pad else -2 + self.checkParam(widget, 'padx', -2, expected=expected, + conv=self._conv_pad_pixels) def test_configure_pady(self): widget = self.create() - self.checkPixelsParam(widget, 'pady', 3, 4.4, 5.6, -2, '12m', + self.checkPixelsParam(widget, 'pady', 3, 4.4, 5.6, '12m', conv=self._conv_pad_pixels) + expected = 0 if self._clip_pad else -2 + self.checkParam(widget, 'pady', -2, expected=expected, + conv=self._conv_pad_pixels) + + @requires_tk(8, 7) + def test_configure_placeholder(self): + widget = self.create() + self.checkParam(widget, 'placeholder', 'xxx') + + @requires_tk(8, 7) + def test_configure_placeholderforeground(self): + widget = self.create() + self.checkColorParam(widget, 'placeholderforeground') def test_configure_relief(self): widget = self.create() @@ -409,13 +450,35 @@ def test_configure_textvariable(self): var = tkinter.StringVar(self.root) self.checkVariableParam(widget, 'textvariable', var) + @requires_tk(8, 7) + def test_configure_tile(self): + widget = self.create() + self.checkBooleanParam(widget, 'tile') + def test_configure_troughcolor(self): widget = self.create() self.checkColorParam(widget, 'troughcolor') def test_configure_underline(self): widget = self.create() - self.checkIntegerParam(widget, 'underline', 0, 1, 10) + self.checkParams(widget, 'underline', 0, 1, 10) + if tk_version >= (8, 7): + is_ttk = widget.__class__.__module__ == 'tkinter.ttk' + self.checkParam(widget, 'underline', '', + expected='' if is_ttk else self._default_pixels) + self.checkParam(widget, 'underline', '5+2', + expected='5+2' if is_ttk else 7) + self.checkParam(widget, 'underline', '5-2', + expected='5-2' if is_ttk else 3) + self.checkParam(widget, 'underline', 'end', expected='end') + self.checkParam(widget, 'underline', 'end-2', expected='end-2') + errmsg = (r'bad index "{}": must be integer\?\[\+-\]integer\?, ' + r'end\?\[\+-\]integer\?, or ""') + else: + errmsg = 'expected integer but got "{}"' + self.checkInvalidParam(widget, 'underline', '', errmsg=errmsg) + self.checkInvalidParam(widget, 'underline', '10p', errmsg=errmsg) + self.checkInvalidParam(widget, 'underline', 3.2, errmsg=errmsg) def test_configure_wraplength(self): widget = self.create() @@ -445,7 +508,8 @@ def test_configure_offrelief(self): def test_configure_overrelief(self): widget = self.create() - self.checkReliefParam(widget, 'overrelief') + self.checkReliefParam(widget, 'overrelief', + allow_empty=(tk_version >= (8, 7))) def test_configure_selectcolor(self): widget = self.create() diff --git a/Lib/test/test_tokenize.py b/Lib/test/test_tokenize.py index c52b58b4..2c4e7b96 100644 --- a/Lib/test/test_tokenize.py +++ b/Lib/test/test_tokenize.py @@ -233,7 +233,7 @@ def test_long(self): """) def test_float(self): - # Floating point numbers + # Floating-point numbers self.check_tokenize("x = 3.14159", """\ NAME 'x' (1, 0) (1, 1) OP '=' (1, 2) (1, 3) @@ -1204,6 +1204,31 @@ def test_closing_parenthesis_from_different_line(self): NAME 'x' (1, 3) (1, 4) """) + def test_multiline_non_ascii_fstring(self): + self.check_tokenize("""\ +a = f''' + Autorzy, którzy tą jednostkę mają wpisani jako AKTUALNA -- czyli'''""", """\ + NAME 'a' (1, 0) (1, 1) + OP '=' (1, 2) (1, 3) + FSTRING_START "f\'\'\'" (1, 4) (1, 8) + FSTRING_MIDDLE '\\n Autorzy, którzy tą jednostkę mają wpisani jako AKTUALNA -- czyli' (1, 8) (2, 68) + FSTRING_END "\'\'\'" (2, 68) (2, 71) + """) + + def test_multiline_non_ascii_fstring_with_expr(self): + self.check_tokenize("""\ +f''' + 🔗 This is a test {test_arg1}🔗 +🔗'''""", """\ + FSTRING_START "f\'\'\'" (1, 0) (1, 4) + FSTRING_MIDDLE '\\n 🔗 This is a test ' (1, 4) (2, 21) + OP '{' (2, 21) (2, 22) + NAME 'test_arg1' (2, 22) (2, 31) + OP '}' (2, 31) (2, 32) + FSTRING_MIDDLE '🔗\\n🔗' (2, 32) (3, 1) + FSTRING_END "\'\'\'" (3, 1) (3, 4) + """) + class GenerateTokensTest(TokenizeTest): def check_tokenize(self, s, expected): # Format the tokens in s in a table format. @@ -1891,6 +1916,26 @@ def test_roundtrip(self): self.check_roundtrip(r"f'\\\\N{{'") self.check_roundtrip(r"f'\\\\\\N{{'") self.check_roundtrip(r"f'\\\\\\\\N{{'") + + self.check_roundtrip(r"f'\n{{foo}}'") + self.check_roundtrip(r"f'\\n{{foo}}'") + self.check_roundtrip(r"f'\\\n{{foo}}'") + self.check_roundtrip(r"f'\\\\n{{foo}}'") + + self.check_roundtrip(r"f'\t{{foo}}'") + self.check_roundtrip(r"f'\\t{{foo}}'") + self.check_roundtrip(r"f'\\\t{{foo}}'") + self.check_roundtrip(r"f'\\\\t{{foo}}'") + + self.check_roundtrip(r"rf'\t{{foo}}'") + self.check_roundtrip(r"rf'\\t{{foo}}'") + self.check_roundtrip(r"rf'\\\t{{foo}}'") + self.check_roundtrip(r"rf'\\\\t{{foo}}'") + + self.check_roundtrip(r"rf'\{{foo}}'") + self.check_roundtrip(r"f'\\{{foo}}'") + self.check_roundtrip(r"rf'\\\{{foo}}'") + self.check_roundtrip(r"f'\\\\{{foo}}'") cases = [ """ if 1: diff --git a/Lib/test/test_tools/i18n_data/docstrings.pot b/Lib/test/test_tools/i18n_data/docstrings.pot new file mode 100644 index 00000000..5af1d414 --- /dev/null +++ b/Lib/test/test_tools/i18n_data/docstrings.pot @@ -0,0 +1,40 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2000-01-01 00:00+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" + + +#: docstrings.py:7 +#, docstring +msgid "" +msgstr "" + +#: docstrings.py:18 +#, docstring +msgid "" +"multiline\n" +" docstring\n" +" " +msgstr "" + +#: docstrings.py:25 +#, docstring +msgid "docstring1" +msgstr "" + +#: docstrings.py:30 +#, docstring +msgid "Hello, {}!" +msgstr "" + diff --git a/Lib/test/test_tools/i18n_data/docstrings.py b/Lib/test/test_tools/i18n_data/docstrings.py new file mode 100644 index 00000000..85d7f159 --- /dev/null +++ b/Lib/test/test_tools/i18n_data/docstrings.py @@ -0,0 +1,41 @@ +# Test docstring extraction +from gettext import gettext as _ + + +# Empty docstring +def test(x): + """""" + + +# Leading empty line +def test2(x): + + """docstring""" # XXX This should be extracted but isn't. + + +# XXX Multiline docstrings should be cleaned with `inspect.cleandoc`. +def test3(x): + """multiline + docstring + """ + + +# Multiple docstrings - only the first should be extracted +def test4(x): + """docstring1""" + """docstring2""" + + +def test5(x): + """Hello, {}!""".format("world!") # XXX This should not be extracted. + + +# Nested docstrings +def test6(x): + def inner(y): + """nested docstring""" # XXX This should be extracted but isn't. + + +class Outer: + class Inner: + "nested class docstring" # XXX This should be extracted but isn't. diff --git a/Lib/test/test_tools/i18n_data/fileloc.pot b/Lib/test/test_tools/i18n_data/fileloc.pot new file mode 100644 index 00000000..dbd28687 --- /dev/null +++ b/Lib/test/test_tools/i18n_data/fileloc.pot @@ -0,0 +1,35 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2000-01-01 00:00+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" + + +#: fileloc.py:5 fileloc.py:6 +msgid "foo" +msgstr "" + +#: fileloc.py:9 +msgid "bar" +msgstr "" + +#: fileloc.py:14 fileloc.py:18 +#, docstring +msgid "docstring" +msgstr "" + +#: fileloc.py:22 fileloc.py:26 +#, docstring +msgid "baz" +msgstr "" + diff --git a/Lib/test/test_tools/i18n_data/fileloc.py b/Lib/test/test_tools/i18n_data/fileloc.py new file mode 100644 index 00000000..c5d4d059 --- /dev/null +++ b/Lib/test/test_tools/i18n_data/fileloc.py @@ -0,0 +1,26 @@ +# Test file locations +from gettext import gettext as _ + +# Duplicate strings +_('foo') +_('foo') + +# Duplicate strings on the same line should only add one location to the output +_('bar'), _('bar') + + +# Duplicate docstrings +class A: + """docstring""" + + +def f(): + """docstring""" + + +# Duplicate message and docstring +_('baz') + + +def g(): + """baz""" diff --git a/Lib/test/test_tools/i18n_data/messages.pot b/Lib/test/test_tools/i18n_data/messages.pot new file mode 100644 index 00000000..ddfbd183 --- /dev/null +++ b/Lib/test/test_tools/i18n_data/messages.pot @@ -0,0 +1,67 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2000-01-01 00:00+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" + + +#: messages.py:5 +msgid "" +msgstr "" + +#: messages.py:8 messages.py:9 +msgid "parentheses" +msgstr "" + +#: messages.py:12 +msgid "Hello, world!" +msgstr "" + +#: messages.py:15 +msgid "" +"Hello,\n" +" multiline!\n" +msgstr "" + +#: messages.py:29 +msgid "Hello, {}!" +msgstr "" + +#: messages.py:33 +msgid "1" +msgstr "" + +#: messages.py:33 +msgid "2" +msgstr "" + +#: messages.py:34 messages.py:35 +msgid "A" +msgstr "" + +#: messages.py:34 messages.py:35 +msgid "B" +msgstr "" + +#: messages.py:36 +msgid "set" +msgstr "" + +#: messages.py:42 +msgid "nested string" +msgstr "" + +#: messages.py:47 +msgid "baz" +msgstr "" + diff --git a/Lib/test/test_tools/i18n_data/messages.py b/Lib/test/test_tools/i18n_data/messages.py new file mode 100644 index 00000000..f220294b --- /dev/null +++ b/Lib/test/test_tools/i18n_data/messages.py @@ -0,0 +1,64 @@ +# Test message extraction +from gettext import gettext as _ + +# Empty string +_("") + +# Extra parentheses +(_("parentheses")) +((_("parentheses"))) + +# Multiline strings +_("Hello, " + "world!") + +_("""Hello, + multiline! +""") + +# Invalid arguments +_() +_(None) +_(1) +_(False) +_(x="kwargs are not allowed") +_("foo", "bar") +_("something", x="something else") + +# .format() +_("Hello, {}!").format("world") # valid +_("Hello, {}!".format("world")) # invalid + +# Nested structures +_("1"), _("2") +arr = [_("A"), _("B")] +obj = {'a': _("A"), 'b': _("B")} +{{{_('set')}}} + + +# Nested functions and classes +def test(): + _("nested string") # XXX This should be extracted but isn't. + [_("nested string")] + + +class Foo: + def bar(self): + return _("baz") + + +def bar(x=_('default value')): # XXX This should be extracted but isn't. + pass + + +def baz(x=[_('default value')]): # XXX This should be extracted but isn't. + pass + + +# Shadowing _() +def _(x): + pass + + +def _(x="don't extract me"): + pass diff --git a/Lib/test/test_tools/test_i18n.py b/Lib/test/test_tools/test_i18n.py index c083a044..6f71f097 100644 --- a/Lib/test/test_tools/test_i18n.py +++ b/Lib/test/test_tools/test_i18n.py @@ -1,9 +1,11 @@ """Tests to cover the Tools/i18n package""" import os +import re import sys import unittest from textwrap import dedent +from pathlib import Path from test.support.script_helper import assert_python_ok from test.test_tools import skip_if_missing, toolsdir @@ -12,20 +14,47 @@ skip_if_missing() +DATA_DIR = Path(__file__).resolve().parent / 'i18n_data' + + +def normalize_POT_file(pot): + """Normalize the POT creation timestamp, charset and + file locations to make the POT file easier to compare. + + """ + # Normalize the creation date. + date_pattern = re.compile(r'"POT-Creation-Date: .+?\\n"') + header = r'"POT-Creation-Date: 2000-01-01 00:00+0000\\n"' + pot = re.sub(date_pattern, header, pot) + + # Normalize charset to UTF-8 (currently there's no way to specify the output charset). + charset_pattern = re.compile(r'"Content-Type: text/plain; charset=.+?\\n"') + charset = r'"Content-Type: text/plain; charset=UTF-8\\n"' + pot = re.sub(charset_pattern, charset, pot) + + # Normalize file location path separators in case this test is + # running on Windows (which uses '\'). + fileloc_pattern = re.compile(r'#:.+') + + def replace(match): + return match[0].replace(os.sep, "/") + pot = re.sub(fileloc_pattern, replace, pot) + return pot + class Test_pygettext(unittest.TestCase): """Tests for the pygettext.py tool""" - script = os.path.join(toolsdir,'i18n', 'pygettext.py') + script = Path(toolsdir, 'i18n', 'pygettext.py') def get_header(self, data): """ utility: return the header of a .po file as a dictionary """ headers = {} for line in data.split('\n'): - if not line or line.startswith(('#', 'msgid','msgstr')): + if not line or line.startswith(('#', 'msgid', 'msgstr')): continue line = line.strip('"') - key, val = line.split(':',1) + key, val = line.split(':', 1) headers[key] = val.strip() return headers @@ -53,23 +82,34 @@ def get_msgids(self, data): return msgids - def extract_docstrings_from_str(self, module_content): - """ utility: return all msgids extracted from module_content """ - filename = 'test_docstrings.py' - with temp_cwd(None) as cwd: + def assert_POT_equal(self, expected, actual): + """Check if two POT files are equal""" + self.maxDiff = None + self.assertEqual(normalize_POT_file(expected), normalize_POT_file(actual)) + + def extract_from_str(self, module_content, *, args=(), strict=True): + """Return all msgids extracted from module_content.""" + filename = 'test.py' + with temp_cwd(None): with open(filename, 'w', encoding='utf-8') as fp: fp.write(module_content) - assert_python_ok(self.script, '-D', filename) + res = assert_python_ok('-Xutf8', self.script, *args, filename) + if strict: + self.assertEqual(res.err, b'') with open('messages.pot', encoding='utf-8') as fp: data = fp.read() return self.get_msgids(data) + def extract_docstrings_from_str(self, module_content): + """Return all docstrings extracted from module_content.""" + return self.extract_from_str(module_content, args=('--docstrings',), strict=False) + def test_header(self): """Make sure the required fields are in the header, according to: http://www.gnu.org/software/gettext/manual/gettext.html#Header-Entry """ with temp_cwd(None) as cwd: - assert_python_ok(self.script) + assert_python_ok('-Xutf8', self.script) with open('messages.pot', encoding='utf-8') as fp: data = fp.read() header = self.get_header(data) @@ -96,7 +136,7 @@ def test_POT_Creation_Date(self): """ Match the date format from xgettext for POT-Creation-Date """ from datetime import datetime with temp_cwd(None) as cwd: - assert_python_ok(self.script) + assert_python_ok('-Xutf8', self.script) with open('messages.pot', encoding='utf-8') as fp: data = fp.read() header = self.get_header(data) @@ -310,6 +350,37 @@ def test_calls_in_fstring_with_partially_wrong_expression(self): self.assertNotIn('foo', msgids) self.assertIn('bar', msgids) + def test_function_and_class_names(self): + """Test that function and class names are not mistakenly extracted.""" + msgids = self.extract_from_str(dedent('''\ + def _(x): + pass + + def _(x="foo"): + pass + + async def _(x): + pass + + class _(object): + pass + ''')) + self.assertEqual(msgids, ['']) + + def test_pygettext_output(self): + """Test that the pygettext output exactly matches snapshots.""" + for input_file in DATA_DIR.glob('*.py'): + output_file = input_file.with_suffix('.pot') + with self.subTest(input_file=f'i18n_data/{input_file}'): + contents = input_file.read_text(encoding='utf-8') + with temp_cwd(None): + Path(input_file.name).write_text(contents) + assert_python_ok('-Xutf8', self.script, '--docstrings', input_file.name) + output = Path('messages.pot').read_text(encoding='utf-8') + + expected = output_file.read_text(encoding='utf-8') + self.assert_POT_equal(expected, output) + def test_files_list(self): """Make sure the directories are inspected for source files bpo-31920 @@ -318,21 +389,41 @@ def test_files_list(self): text2 = 'Text to translate2' text3 = 'Text to ignore' with temp_cwd(None), temp_dir(None) as sdir: - os.mkdir(os.path.join(sdir, 'pypkg')) - with open(os.path.join(sdir, 'pypkg', 'pymod.py'), 'w', - encoding='utf-8') as sfile: - sfile.write(f'_({text1!r})') - os.mkdir(os.path.join(sdir, 'pkg.py')) - with open(os.path.join(sdir, 'pkg.py', 'pymod2.py'), 'w', - encoding='utf-8') as sfile: - sfile.write(f'_({text2!r})') - os.mkdir(os.path.join(sdir, 'CVS')) - with open(os.path.join(sdir, 'CVS', 'pymod3.py'), 'w', - encoding='utf-8') as sfile: - sfile.write(f'_({text3!r})') - assert_python_ok(self.script, sdir) - with open('messages.pot', encoding='utf-8') as fp: - data = fp.read() + pymod = Path(sdir, 'pypkg', 'pymod.py') + pymod.parent.mkdir() + pymod.write_text(f'_({text1!r})', encoding='utf-8') + + pymod2 = Path(sdir, 'pkg.py', 'pymod2.py') + pymod2.parent.mkdir() + pymod2.write_text(f'_({text2!r})', encoding='utf-8') + + pymod3 = Path(sdir, 'CVS', 'pymod3.py') + pymod3.parent.mkdir() + pymod3.write_text(f'_({text3!r})', encoding='utf-8') + + assert_python_ok('-Xutf8', self.script, sdir) + data = Path('messages.pot').read_text(encoding='utf-8') self.assertIn(f'msgid "{text1}"', data) self.assertIn(f'msgid "{text2}"', data) self.assertNotIn(text3, data) + + +def update_POT_snapshots(): + for input_file in DATA_DIR.glob('*.py'): + output_file = input_file.with_suffix('.pot') + contents = input_file.read_bytes() + with temp_cwd(None): + Path(input_file.name).write_bytes(contents) + assert_python_ok('-Xutf8', Test_pygettext.script, '--docstrings', input_file.name) + output = Path('messages.pot').read_text(encoding='utf-8') + + output = normalize_POT_file(output) + output_file.write_text(output, encoding='utf-8') + + +if __name__ == '__main__': + # To regenerate POT files + if len(sys.argv) > 1 and sys.argv[1] == '--snapshot-update': + update_POT_snapshots() + sys.exit(0) + unittest.main() diff --git a/Lib/test/test_tools/test_makefile.py b/Lib/test/test_tools/test_makefile.py index e253bd00..f1f0cd87 100644 --- a/Lib/test/test_tools/test_makefile.py +++ b/Lib/test/test_tools/test_makefile.py @@ -51,7 +51,10 @@ def test_makefile_test_folders(self): if not dirs and not files: continue # Skip dirs with hidden-only files: - if files and all(filename.startswith('.') for filename in files): + if files and all( + filename.startswith('.') or filename == '__pycache__' + for filename in files + ): continue relpath = os.path.relpath(dirpath, support.STDLIB_DIR) diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py index d12b559c..119143e4 100644 --- a/Lib/test/test_traceback.py +++ b/Lib/test/test_traceback.py @@ -138,7 +138,7 @@ def test_no_caret_with_no_debug_ranges_flag_python_traceback(self): import traceback try: x = 1 / 0 - except: + except ZeroDivisionError: traceback.print_exc() """) try: @@ -386,9 +386,10 @@ class PurePythonExceptionFormattingMixin: def get_exception(self, callable, slice_start=0, slice_end=-1): try: callable() - self.fail("No exception thrown.") - except: + except BaseException: return traceback.format_exc().splitlines()[slice_start:slice_end] + else: + self.fail("No exception thrown.") callable_line = get_exception.__code__.co_firstlineno + 2 @@ -1490,7 +1491,7 @@ def test_context_suppression(self): try: try: raise Exception - except: + except Exception: raise ZeroDivisionError from None except ZeroDivisionError as _: e = _ @@ -1838,9 +1839,9 @@ def exc(): try: try: raise EG("eg1", [ValueError(1), TypeError(2)]) - except: + except EG: raise EG("eg2", [ValueError(3), TypeError(4)]) - except: + except EG: raise ImportError(5) expected = ( @@ -1889,7 +1890,7 @@ def exc(): except Exception as e: exc = e raise EG("eg", [VE(1), exc, VE(4)]) - except: + except EG: raise EG("top", [VE(5)]) expected = (f' + Exception Group Traceback (most recent call last):\n' @@ -2642,7 +2643,7 @@ def test_long_context_chain(self): def f(): try: 1/0 - except: + except ZeroDivisionError: f() try: @@ -2731,7 +2732,7 @@ def test_comparison_params_variations(self): def raise_exc(): try: raise ValueError('bad value') - except: + except ValueError: raise def raise_with_locals(): diff --git a/Lib/test/test_ttk/test_style.py b/Lib/test/test_ttk/test_style.py index 2b131862..5de29a39 100644 --- a/Lib/test/test_ttk/test_style.py +++ b/Lib/test/test_ttk/test_style.py @@ -227,13 +227,13 @@ def test_element_create_image(self): foreground='blue', background='yellow') img3 = tkinter.BitmapImage(master=self.root, file=imgfile, foreground='white', background='black') - style.element_create('Button.button', 'image', + style.element_create('TestButton.button', 'image', img1, ('pressed', img2), ('active', img3), border=(2, 4), sticky='we') - self.assertIn('Button.button', style.element_names()) + self.assertIn('TestButton.button', style.element_names()) - style.layout('Button', [('Button.button', {'sticky': 'news'})]) - b = ttk.Button(self.root, style='Button') + style.layout('TestButton', [('TestButton.button', {'sticky': 'news'})]) + b = ttk.Button(self.root, style='TestButton') b.pack(expand=True, fill='both') self.assertEqual(b.winfo_reqwidth(), 16) self.assertEqual(b.winfo_reqheight(), 16) diff --git a/Lib/test/test_ttk/test_widgets.py b/Lib/test/test_ttk/test_widgets.py index 308bbba1..ceba95c9 100644 --- a/Lib/test/test_ttk/test_widgets.py +++ b/Lib/test/test_ttk/test_widgets.py @@ -5,8 +5,9 @@ import sys from test.test_ttk_textonly import MockTclObj -from test.test_tkinter.support import (AbstractTkTest, tk_version, get_tk_patchlevel, - simulate_mouse_click, AbstractDefaultRootTest) +from test.test_tkinter.support import ( + AbstractTkTest, requires_tk, tk_version, get_tk_patchlevel, + simulate_mouse_click, AbstractDefaultRootTest) from test.test_tkinter.widget_tests import (add_standard_options, AbstractWidgetTest, StandardOptionsTests, IntegerSizeTests, PixelSizeTests) @@ -44,6 +45,10 @@ def padding_conv(value): self.checkParam(widget, 'padding', ('5p', '6p', '7p', '8p')) self.checkParam(widget, 'padding', (), expected='') + def test_configure_state(self): + widget = self.create() + self.checkParams(widget, 'state', 'active', 'disabled', 'readonly') + def test_configure_style(self): widget = self.create() self.assertEqual(widget['style'], '') @@ -57,6 +62,11 @@ def test_configure_style(self): self.assertEqual(widget2['class'], 'Foo') # XXX + def test_configure_relief(self): + widget = self.create() + self.checkReliefParam(widget, 'relief', + allow_empty=(tk_version >= (8, 7))) + class WidgetTest(AbstractTkTest, unittest.TestCase): """Tests methods available in every ttk widget.""" @@ -157,6 +167,7 @@ def test_configure_labelwidget(self): class AbstractLabelTest(AbstractWidgetTest): + _allow_empty_justify = True def checkImageParam(self, widget, name): image = tkinter.PhotoImage(master=self.root, name='image1') @@ -172,17 +183,13 @@ def checkImageParam(self, widget, name): errmsg='image "spam" doesn\'t exist') def test_configure_compound(self): - options = 'none text image center top bottom left right'.split() - errmsg = ( - 'bad compound "{}": must be' - f' {", ".join(options[:-1])}, or {options[-1]}' - ) + values = ('none', 'text', 'image', 'center', 'top', 'bottom', 'left', 'right') + if tk_version >= (8, 7): + values += ('',) widget = self.create() - self.checkEnumParam(widget, 'compound', *options, errmsg=errmsg) + self.checkEnumParam(widget, 'compound', *values, allow_empty=True) - def test_configure_state(self): - widget = self.create() - self.checkParams(widget, 'state', 'active', 'disabled', 'normal') + test_configure_justify = requires_tk(8, 7)(StandardOptionsTests.test_configure_justify) def test_configure_width(self): widget = self.create() @@ -199,21 +206,19 @@ class LabelTest(AbstractLabelTest, unittest.TestCase): 'underline', 'width', 'wraplength', ) _conv_pixels = False + _allow_empty_justify = tk_version >= (8, 7) def create(self, **kwargs): return ttk.Label(self.root, **kwargs) - def test_configure_font(self): - widget = self.create() - self.checkParam(widget, 'font', - '-Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-*') + test_configure_justify = StandardOptionsTests.test_configure_justify @add_standard_options(StandardTtkOptionsTests) class ButtonTest(AbstractLabelTest, unittest.TestCase): OPTIONS = ( 'class', 'command', 'compound', 'cursor', 'default', - 'image', 'padding', 'state', 'style', + 'image', 'justify', 'padding', 'state', 'style', 'takefocus', 'text', 'textvariable', 'underline', 'width', ) @@ -223,7 +228,9 @@ def create(self, **kwargs): def test_configure_default(self): widget = self.create() - self.checkEnumParam(widget, 'default', 'normal', 'active', 'disabled') + values = ('normal', 'active', 'disabled') + self.checkEnumParam(widget, 'default', *values, + sort=tk_version >= (8, 7)) def test_invoke(self): success = [] @@ -236,7 +243,7 @@ def test_invoke(self): class CheckbuttonTest(AbstractLabelTest, unittest.TestCase): OPTIONS = ( 'class', 'command', 'compound', 'cursor', - 'image', + 'image', 'justify', 'offvalue', 'onvalue', 'padding', 'state', 'style', 'takefocus', 'text', 'textvariable', @@ -275,7 +282,10 @@ def cb_test(): cbtn['command'] = '' res = cbtn.invoke() - self.assertFalse(str(res)) + if tk_version >= (8, 7) and self.wantobjects: + self.assertEqual(res, ()) + else: + self.assertEqual(str(res), '') self.assertLessEqual(len(success), 1) self.assertEqual(cbtn['offvalue'], cbtn.tk.globalgetvar(cbtn['variable'])) @@ -322,10 +332,12 @@ class EntryTest(AbstractWidgetTest, unittest.TestCase): 'background', 'class', 'cursor', 'exportselection', 'font', 'foreground', 'invalidcommand', 'justify', + 'placeholder', 'placeholderforeground', 'show', 'state', 'style', 'takefocus', 'textvariable', 'validate', 'validatecommand', 'width', 'xscrollcommand', ) - IDENTIFY_AS = 'Entry.field' if sys.platform == 'darwin' else 'textarea' + # bpo-27313: macOS Tk/Tcl may or may not report 'Entry.field'. + IDENTIFY_AS = {'Entry.field', 'textarea'} def setUp(self): super().setUp() @@ -344,11 +356,6 @@ def test_configure_show(self): self.checkParam(widget, 'show', '') self.checkParam(widget, 'show', ' ') - def test_configure_state(self): - widget = self.create() - self.checkParams(widget, 'state', - 'disabled', 'normal', 'readonly') - def test_configure_validate(self): widget = self.create() self.checkEnumParam(widget, 'validate', @@ -367,8 +374,7 @@ def test_identify(self): self.entry.pack() self.entry.update() - # bpo-27313: macOS Cocoa widget differs from X, allow either - self.assertEqual(self.entry.identify(5, 5), self.IDENTIFY_AS) + self.assertIn(self.entry.identify(5, 5), self.IDENTIFY_AS) self.assertEqual(self.entry.identify(-1, -1), "") self.assertRaises(tkinter.TclError, self.entry.identify, None, 5) @@ -449,12 +455,13 @@ class ComboboxTest(EntryTest, unittest.TestCase): OPTIONS = ( 'background', 'class', 'cursor', 'exportselection', 'font', 'foreground', 'height', 'invalidcommand', - 'justify', 'postcommand', 'show', 'state', 'style', + 'justify', 'placeholder', 'placeholderforeground', 'postcommand', + 'show', 'state', 'style', 'takefocus', 'textvariable', 'validate', 'validatecommand', 'values', 'width', 'xscrollcommand', ) - IDENTIFY_AS = 'Combobox.button' if sys.platform == 'darwin' else 'textarea' + IDENTIFY_AS = {'Combobox.button', 'textarea'} def setUp(self): super().setUp() @@ -513,7 +520,7 @@ def check_get_current(getval, currval): self.assertEqual(self.combo.get(), getval) self.assertEqual(self.combo.current(), currval) - self.assertEqual(self.combo['values'], '') + self.assertIn(self.combo['values'], ((), '')) check_get_current('', -1) self.checkParam(self.combo, 'values', 'mon tue wed thur', @@ -638,8 +645,14 @@ def test_insert(self): child2 = ttk.Label(self.root) child3 = ttk.Label(self.root) - self.assertRaises(tkinter.TclError, self.paned.insert, 0, child) + if tk_version >= (8, 7): + self.paned.insert(0, child) + self.assertEqual(self.paned.panes(), (str(child),)) + self.paned.forget(0) + else: + self.assertRaises(tkinter.TclError, self.paned.insert, 0, child) + self.assertEqual(self.paned.panes(), ()) self.paned.insert('end', child2) self.paned.insert(0, child) self.assertEqual(self.paned.panes(), (str(child), str(child2))) @@ -703,7 +716,7 @@ def test_sashpos(self): class RadiobuttonTest(AbstractLabelTest, unittest.TestCase): OPTIONS = ( 'class', 'command', 'compound', 'cursor', - 'image', + 'image', 'justify', 'padding', 'state', 'style', 'takefocus', 'text', 'textvariable', 'underline', 'value', 'variable', 'width', @@ -742,7 +755,10 @@ def cb_test(): cbtn2['command'] = '' res = cbtn2.invoke() - self.assertEqual(str(res), '') + if tk_version >= (8, 7) and self.wantobjects: + self.assertEqual(res, ()) + else: + self.assertEqual(str(res), '') self.assertLessEqual(len(success), 1) self.assertEqual(conv(cbtn2['value']), myvar.get()) self.assertEqual(myvar.get(), @@ -754,7 +770,7 @@ def cb_test(): class MenubuttonTest(AbstractLabelTest, unittest.TestCase): OPTIONS = ( 'class', 'compound', 'cursor', 'direction', - 'image', 'menu', 'padding', 'state', 'style', + 'image', 'justify', 'menu', 'padding', 'state', 'style', 'takefocus', 'text', 'textvariable', 'underline', 'width', ) @@ -762,10 +778,11 @@ class MenubuttonTest(AbstractLabelTest, unittest.TestCase): def create(self, **kwargs): return ttk.Menubutton(self.root, **kwargs) - def test_direction(self): + def test_configure_direction(self): widget = self.create() - self.checkEnumParam(widget, 'direction', - 'above', 'below', 'left', 'right', 'flush') + values = ('above', 'below', 'left', 'right', 'flush') + self.checkEnumParam(widget, 'direction', *values, + sort=tk_version >= (8, 7)) def test_configure_menu(self): widget = self.create() @@ -778,7 +795,7 @@ def test_configure_menu(self): class ScaleTest(AbstractWidgetTest, unittest.TestCase): OPTIONS = ( 'class', 'command', 'cursor', 'from', 'length', - 'orient', 'style', 'takefocus', 'to', 'value', 'variable', + 'orient', 'state', 'style', 'takefocus', 'to', 'value', 'variable', ) _conv_pixels = False default_orient = 'horizontal' @@ -800,6 +817,8 @@ def test_configure_length(self): widget = self.create() self.checkPixelsParam(widget, 'length', 130, 131.2, 135.6, '5i') + test_configure_state = requires_tk(8, 6, 9)(StandardTtkOptionsTests.test_configure_state) + def test_configure_to(self): widget = self.create() self.checkFloatParam(widget, 'to', 300, 14.9, 15.1, -10, conv=False) @@ -883,16 +902,28 @@ def test_set(self): @add_standard_options(StandardTtkOptionsTests) class ProgressbarTest(AbstractWidgetTest, unittest.TestCase): OPTIONS = ( - 'class', 'cursor', 'orient', 'length', - 'mode', 'maximum', 'phase', + 'anchor', 'class', 'cursor', 'font', 'foreground', 'justify', + 'orient', 'length', + 'mode', 'maximum', 'phase', 'text', 'wraplength', 'style', 'takefocus', 'value', 'variable', ) _conv_pixels = False + _allow_empty_justify = True default_orient = 'horizontal' def create(self, **kwargs): return ttk.Progressbar(self.root, **kwargs) + @requires_tk(8, 7) + def test_configure_anchor(self): + widget = self.create() + self.checkEnumParam(widget, 'anchor', + 'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw', 'center', '') + + test_configure_font = requires_tk(8, 7)(StandardOptionsTests.test_configure_font) + test_configure_foreground = requires_tk(8, 7)(StandardOptionsTests.test_configure_foreground) + test_configure_justify = requires_tk(8, 7)(StandardTtkOptionsTests.test_configure_justify) + def test_configure_length(self): widget = self.create() self.checkPixelsParam(widget, 'length', 100.1, 56.7, '2i') @@ -909,11 +940,15 @@ def test_configure_phase(self): # XXX pass + test_configure_text = requires_tk(8, 7)(StandardOptionsTests.test_configure_text) + def test_configure_value(self): widget = self.create() self.checkFloatParam(widget, 'value', 150.2, 77.7, 0, -10, conv=False) + test_configure_wraplength = requires_tk(8, 7)(StandardOptionsTests.test_configure_wraplength) + @unittest.skipIf(sys.platform == 'darwin', 'ttk.Scrollbar is special on MacOSX') @@ -928,11 +963,13 @@ def create(self, **kwargs): return ttk.Scrollbar(self.root, **kwargs) -@add_standard_options(IntegerSizeTests, StandardTtkOptionsTests) +@add_standard_options(StandardTtkOptionsTests) class NotebookTest(AbstractWidgetTest, unittest.TestCase): OPTIONS = ( 'class', 'cursor', 'height', 'padding', 'style', 'takefocus', 'width', ) + if tk_version >= (8, 7): + _conv_pixels = False def setUp(self): super().setUp() @@ -945,6 +982,20 @@ def setUp(self): def create(self, **kwargs): return ttk.Notebook(self.root, **kwargs) + def test_configure_height(self): + widget = self.create() + if get_tk_patchlevel(self.root) < (8, 6, 15): + self.checkIntegerParam(widget, 'height', 402, -402, 0) + else: + self.checkPixelsParam(widget, 'height', '10c', 402, -402, 0, conv=False) + + def test_configure_width(self): + widget = self.create() + if get_tk_patchlevel(self.root) < (8, 6, 15): + self.checkIntegerParam(widget, 'width', 402, -402, 0) + else: + self.checkPixelsParam(widget, 'width', '10c', 402, -402, 0, conv=False) + def test_tab_identifiers(self): self.nb.forget(0) self.nb.hide(self.child2) @@ -1051,7 +1102,11 @@ def test_insert(self): self.nb.insert(self.child1, child3) self.assertEqual(self.nb.tabs(), (str(child3), ) + tabs) self.nb.forget(child3) - self.assertRaises(tkinter.TclError, self.nb.insert, 2, child3) + if tk_version >= (8, 7): + self.nb.insert(2, child3) + self.assertEqual(self.nb.tabs(), (*tabs, str(child3))) + else: + self.assertRaises(tkinter.TclError, self.nb.insert, 2, child3) self.assertRaises(tkinter.TclError, self.nb.insert, -1, child3) # bad inserts @@ -1143,11 +1198,13 @@ class SpinboxTest(EntryTest, unittest.TestCase): OPTIONS = ( 'background', 'class', 'command', 'cursor', 'exportselection', 'font', 'foreground', 'format', 'from', 'increment', - 'invalidcommand', 'justify', 'show', 'state', 'style', + 'invalidcommand', 'justify', + 'placeholder', 'placeholderforeground', + 'show', 'state', 'style', 'takefocus', 'textvariable', 'to', 'validate', 'validatecommand', 'values', 'width', 'wrap', 'xscrollcommand', ) - IDENTIFY_AS = 'Spinbox.field' if sys.platform == 'darwin' else 'textarea' + IDENTIFY_AS = {'Spinbox.field', 'textarea'} def setUp(self): super().setUp() @@ -1317,8 +1374,9 @@ def test_configure_values(self): class TreeviewTest(AbstractWidgetTest, unittest.TestCase): OPTIONS = ( 'class', 'columns', 'cursor', 'displaycolumns', - 'height', 'padding', 'selectmode', 'show', - 'style', 'takefocus', 'xscrollcommand', 'yscrollcommand', + 'height', 'padding', 'selectmode', 'selecttype', 'show', 'striped', + 'style', 'takefocus', 'titlecolumns', 'titleitems', + 'xscrollcommand', 'yscrollcommand', ) def setUp(self): @@ -1333,7 +1391,8 @@ def test_configure_columns(self): self.checkParam(widget, 'columns', 'a b c', expected=('a', 'b', 'c')) self.checkParam(widget, 'columns', ('a', 'b', 'c')) - self.checkParam(widget, 'columns', '') + self.checkParam(widget, 'columns', '', + expected=() if tk_version >= (8, 7) else '') def test_configure_displaycolumns(self): widget = self.create() @@ -1345,11 +1404,12 @@ def test_configure_displaycolumns(self): expected=('#all',)) self.checkParam(widget, 'displaycolumns', (2, 1, 0)) self.checkInvalidParam(widget, 'displaycolumns', ('a', 'b', 'd'), - errmsg='Invalid column index d') + errmsg='Invalid column index "?d"?') + errmsg = 'Column index "?{}"? out of bounds' self.checkInvalidParam(widget, 'displaycolumns', (1, 2, 3), - errmsg='Column index 3 out of bounds') + errmsg=errmsg.format(3)) self.checkInvalidParam(widget, 'displaycolumns', (1, -2), - errmsg='Column index -2 out of bounds') + errmsg=errmsg.format(-2)) def test_configure_height(self): widget = self.create() @@ -1361,6 +1421,11 @@ def test_configure_selectmode(self): self.checkEnumParam(widget, 'selectmode', 'none', 'browse', 'extended') + @requires_tk(8, 7) + def test_configure_selecttype(self): + widget = self.create() + self.checkEnumParam(widget, 'selecttype', 'item', 'cell') + def test_configure_show(self): widget = self.create() self.checkParam(widget, 'show', 'tree headings', @@ -1370,6 +1435,23 @@ def test_configure_show(self): self.checkParam(widget, 'show', 'tree', expected=('tree',)) self.checkParam(widget, 'show', 'headings', expected=('headings',)) + @requires_tk(8, 7) + def test_configure_striped(self): + widget = self.create() + self.checkBooleanParam(widget, 'striped') + + @requires_tk(8, 7) + def test_configure_titlecolumns(self): + widget = self.create() + self.checkIntegerParam(widget, 'titlecolumns', 0, 1, 5) + self.checkInvalidParam(widget, 'titlecolumns', -2) + + @requires_tk(8, 7) + def test_configure_titleitems(self): + widget = self.create() + self.checkIntegerParam(widget, 'titleitems', 0, 1, 5) + self.checkInvalidParam(widget, 'titleitems', -2) + def test_bbox(self): self.tv.pack() self.assertEqual(self.tv.bbox(''), '') diff --git a/Lib/test/test_type_aliases.py b/Lib/test/test_type_aliases.py index f8b395fd..4c17933e 100644 --- a/Lib/test/test_type_aliases.py +++ b/Lib/test/test_type_aliases.py @@ -212,6 +212,19 @@ def test_generic(self): self.assertEqual(TA.__value__, list[T]) self.assertEqual(TA.__type_params__, (T,)) self.assertEqual(TA.__module__, __name__) + self.assertIs(type(TA[int]), types.GenericAlias) + + def test_not_generic(self): + TA = TypeAliasType("TA", list[int], type_params=()) + self.assertEqual(TA.__name__, "TA") + self.assertEqual(TA.__value__, list[int]) + self.assertEqual(TA.__type_params__, ()) + self.assertEqual(TA.__module__, __name__) + with self.assertRaisesRegex( + TypeError, + "Only generic type aliases are subscriptable", + ): + TA[int] def test_keywords(self): TA = TypeAliasType(name="TA", value=int) diff --git a/Lib/test/test_type_params.py b/Lib/test/test_type_params.py index eae91690..51055dd9 100644 --- a/Lib/test/test_type_params.py +++ b/Lib/test/test_type_params.py @@ -882,6 +882,7 @@ class C[T](Base, a=1, b=2, **kwargs): T, = C.__type_params__ self.assertEqual(T.__name__, "T") self.assertEqual(C.kwargs, {"a": 1, "b": 2, "c": 3}) + self.assertEqual(C.__bases__, (Base, Generic)) bases = (Base,) class C2[T](*bases, **kwargs): @@ -890,6 +891,22 @@ class C2[T](*bases, **kwargs): T, = C2.__type_params__ self.assertEqual(T.__name__, "T") self.assertEqual(C2.kwargs, {"c": 3}) + self.assertEqual(C2.__bases__, (Base, Generic)) + + def test_starargs_base(self): + class C1[T](*()): pass + + T, = C1.__type_params__ + self.assertEqual(T.__name__, "T") + self.assertEqual(C1.__bases__, (Generic,)) + + class Base: pass + bases = [Base] + class C2[T](*bases): pass + + T, = C2.__type_params__ + self.assertEqual(T.__name__, "T") + self.assertEqual(C2.__bases__, (Base, Generic)) class TypeParamsTraditionalTypeVarsTest(unittest.TestCase): diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py index 5ffe4085..9b2a5728 100644 --- a/Lib/test/test_types.py +++ b/Lib/test/test_types.py @@ -1,6 +1,10 @@ # Python test set -- part 6, built-in types -from test.support import run_with_locale, cpython_only, MISSING_C_DOCSTRINGS +from test.support import ( + run_with_locale, cpython_only, iter_builtin_types, iter_slot_wrappers, + MISSING_C_DOCSTRINGS, +) +from test.test_import import no_rerun import collections.abc from collections import namedtuple import copy @@ -9,6 +13,7 @@ import pickle import locale import sys +import textwrap import types import unittest.mock import weakref @@ -392,7 +397,7 @@ def test(i, format_spec, result): test(123456, "1=20", '11111111111111123456') test(123456, "*=20", '**************123456') - @run_with_locale('LC_NUMERIC', 'en_US.UTF8') + @run_with_locale('LC_NUMERIC', 'en_US.UTF8', '') def test_float__format__locale(self): # test locale support for __format__ code 'n' @@ -401,7 +406,7 @@ def test_float__format__locale(self): self.assertEqual(locale.format_string('%g', x, grouping=True), format(x, 'n')) self.assertEqual(locale.format_string('%.10g', x, grouping=True), format(x, '.10n')) - @run_with_locale('LC_NUMERIC', 'en_US.UTF8') + @run_with_locale('LC_NUMERIC', 'en_US.UTF8', '') def test_int__format__locale(self): # test locale support for __format__ code 'n' for integers @@ -2252,5 +2257,51 @@ def coro(): 'close', 'throw'})) +class SubinterpreterTests(unittest.TestCase): + + @classmethod + def setUpClass(cls): + global interpreters + try: + from test.support import interpreters + except ModuleNotFoundError: + raise unittest.SkipTest('subinterpreters required') + + @cpython_only + @no_rerun('channels (and queues) might have a refleak; see gh-122199') + def test_static_types_inherited_slots(self): + rch, sch = interpreters.create_channel() + + slots = [] + script = '' + for cls in iter_builtin_types(): + for slot, own in iter_slot_wrappers(cls): + slots.append((cls, slot, own)) + attr = f'{cls.__name__}.{slot}' + script += textwrap.dedent(f""" + sch.send_nowait('{attr}: ' + repr({attr})) + """) + + exec(script) + all_expected = [] + for cls, slot, _ in slots: + result = rch.recv() + assert result.startswith(f'{cls.__name__}.{slot}: '), (cls, slot, result) + all_expected.append(result) + + interp = interpreters.create() + interp.run(textwrap.dedent(f""" + from test.support import interpreters + sch = interpreters.SendChannel({sch.id}) + """)) + interp.run(script) + + for i, (cls, slot, _) in enumerate(slots): + with self.subTest(cls=cls, slot=slot): + expected = all_expected[i] + result = rch.recv() + self.assertEqual(result, expected) + + if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 4cf8d498..0e533757 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -579,6 +579,41 @@ def test_constructor(self): self.assertEqual(T.__name__, "T") self.assertEqual(T.__constraints__, ()) self.assertIs(T.__bound__, None) + self.assertIs(T.__covariant__, False) + self.assertIs(T.__contravariant__, False) + self.assertIs(T.__infer_variance__, False) + + T = TypeVar(name="T", bound=type) + self.assertEqual(T.__name__, "T") + self.assertEqual(T.__constraints__, ()) + self.assertIs(T.__bound__, type) + self.assertIs(T.__covariant__, False) + self.assertIs(T.__contravariant__, False) + self.assertIs(T.__infer_variance__, False) + + T = TypeVar(name="T", covariant=True) + self.assertEqual(T.__name__, "T") + self.assertEqual(T.__constraints__, ()) + self.assertIs(T.__bound__, None) + self.assertIs(T.__covariant__, True) + self.assertIs(T.__contravariant__, False) + self.assertIs(T.__infer_variance__, False) + + T = TypeVar(name="T", contravariant=True) + self.assertEqual(T.__name__, "T") + self.assertEqual(T.__constraints__, ()) + self.assertIs(T.__bound__, None) + self.assertIs(T.__covariant__, False) + self.assertIs(T.__contravariant__, True) + self.assertIs(T.__infer_variance__, False) + + T = TypeVar(name="T", infer_variance=True) + self.assertEqual(T.__name__, "T") + self.assertEqual(T.__constraints__, ()) + self.assertIs(T.__bound__, None) + self.assertIs(T.__covariant__, False) + self.assertIs(T.__contravariant__, False) + self.assertIs(T.__infer_variance__, True) def template_replace(templates: list[str], replacements: dict[str, list[str]]) -> list[tuple[str]]: @@ -3963,6 +3998,9 @@ class CustomProtocol(TestCase, Protocol): class CustomContextManager(typing.ContextManager, Protocol): pass + class CustomAsyncIterator(typing.AsyncIterator, Protocol): + pass + def test_non_runtime_protocol_isinstance_check(self): class P(Protocol): x: int @@ -4531,20 +4569,30 @@ def f(x: X): ... {'x': list[list[ForwardRef('X')]]} ) - def test_pep695_generic_with_future_annotations(self): + def test_pep695_generic_class_with_future_annotations(self): + original_globals = dict(ann_module695.__dict__) + hints_for_A = get_type_hints(ann_module695.A) A_type_params = ann_module695.A.__type_params__ self.assertIs(hints_for_A["x"], A_type_params[0]) self.assertEqual(hints_for_A["y"].__args__[0], Unpack[A_type_params[1]]) self.assertIs(hints_for_A["z"].__args__[0], A_type_params[2]) + # should not have changed as a result of the get_type_hints() calls! + self.assertEqual(ann_module695.__dict__, original_globals) + + def test_pep695_generic_class_with_future_annotations_and_local_shadowing(self): hints_for_B = get_type_hints(ann_module695.B) - self.assertEqual(hints_for_B.keys(), {"x", "y", "z"}) + self.assertEqual(hints_for_B, {"x": int, "y": str, "z": bytes}) + + def test_pep695_generic_class_with_future_annotations_name_clash_with_global_vars(self): + hints_for_C = get_type_hints(ann_module695.C) self.assertEqual( - set(hints_for_B.values()) ^ set(ann_module695.B.__type_params__), - set() + set(hints_for_C.values()), + set(ann_module695.C.__type_params__) ) + def test_pep_695_generic_function_with_future_annotations(self): hints_for_generic_function = get_type_hints(ann_module695.generic_function) func_t_params = ann_module695.generic_function.__type_params__ self.assertEqual( @@ -4555,6 +4603,54 @@ def test_pep695_generic_with_future_annotations(self): self.assertIs(hints_for_generic_function["z"].__origin__, func_t_params[2]) self.assertIs(hints_for_generic_function["zz"].__origin__, func_t_params[2]) + def test_pep_695_generic_function_with_future_annotations_name_clash_with_global_vars(self): + self.assertEqual( + set(get_type_hints(ann_module695.generic_function_2).values()), + set(ann_module695.generic_function_2.__type_params__) + ) + + def test_pep_695_generic_method_with_future_annotations(self): + hints_for_generic_method = get_type_hints(ann_module695.D.generic_method) + params = { + param.__name__: param + for param in ann_module695.D.generic_method.__type_params__ + } + self.assertEqual( + hints_for_generic_method, + {"x": params["Foo"], "y": params["Bar"], "return": types.NoneType} + ) + + def test_pep_695_generic_method_with_future_annotations_name_clash_with_global_vars(self): + self.assertEqual( + set(get_type_hints(ann_module695.D.generic_method_2).values()), + set(ann_module695.D.generic_method_2.__type_params__) + ) + + def test_pep_695_generics_with_future_annotations_nested_in_function(self): + results = ann_module695.nested() + + self.assertEqual( + set(results.hints_for_E.values()), + set(results.E.__type_params__) + ) + self.assertEqual( + set(results.hints_for_E_meth.values()), + set(results.E.generic_method.__type_params__) + ) + self.assertNotEqual( + set(results.hints_for_E_meth.values()), + set(results.E.__type_params__) + ) + self.assertEqual( + set(results.hints_for_E_meth.values()).intersection(results.E.__type_params__), + set() + ) + + self.assertEqual( + set(results.hints_for_generic_func.values()), + set(results.generic_func.__type_params__) + ) + def test_extended_generic_rules_subclassing(self): class T1(Tuple[T, KT]): ... class T2(Tuple[T, ...]): ... diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py index e43be357..19556eec 100644 --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -1676,7 +1676,7 @@ def test_startswith_endswith_errors(self): self.assertIn('str', exc) self.assertIn('tuple', exc) - @support.run_with_locale('LC_ALL', 'de_DE', 'fr_FR') + @support.run_with_locale('LC_ALL', 'de_DE', 'fr_FR', '') def test_format_float(self): # should not format with a comma, but always with C locale self.assertEqual('1.0', '%.1f' % 1.0) diff --git a/Lib/test/test_unittest/test_case.py b/Lib/test/test_unittest/test_case.py index ed5eb560..82a442a0 100644 --- a/Lib/test/test_unittest/test_case.py +++ b/Lib/test/test_unittest/test_case.py @@ -1132,6 +1132,8 @@ def testAssertMultiLineEqual(self): # need to remove the first line of the error message error = str(e).split('\n', 1)[1] self.assertEqual(sample_text_error, error) + else: + self.fail(f'{self.failureException} not raised') def testAssertEqualSingleLine(self): sample_text = "laden swallows fly slowly" @@ -1148,6 +1150,8 @@ def testAssertEqualSingleLine(self): # need to remove the first line of the error message error = str(e).split('\n', 1)[1] self.assertEqual(sample_text_error, error) + else: + self.fail(f'{self.failureException} not raised') def testAssertEqualwithEmptyString(self): '''Verify when there is an empty string involved, the diff output @@ -1165,6 +1169,8 @@ def testAssertEqualwithEmptyString(self): # need to remove the first line of the error message error = str(e).split('\n', 1)[1] self.assertEqual(sample_text_error, error) + else: + self.fail(f'{self.failureException} not raised') def testAssertEqualMultipleLinesMissingNewlineTerminator(self): '''Verifying format of diff output from assertEqual involving strings @@ -1185,6 +1191,8 @@ def testAssertEqualMultipleLinesMissingNewlineTerminator(self): # need to remove the first line of the error message error = str(e).split('\n', 1)[1] self.assertEqual(sample_text_error, error) + else: + self.fail(f'{self.failureException} not raised') def testAssertEqualMultipleLinesMismatchedNewlinesTerminators(self): '''Verifying format of diff output from assertEqual involving strings @@ -1208,6 +1216,8 @@ def testAssertEqualMultipleLinesMismatchedNewlinesTerminators(self): # need to remove the first line of the error message error = str(e).split('\n', 1)[1] self.assertEqual(sample_text_error, error) + else: + self.fail(f'{self.failureException} not raised') def testEqualityBytesWarning(self): if sys.flags.bytes_warning: diff --git a/Lib/test/test_unittest/test_util.py b/Lib/test/test_unittest/test_util.py new file mode 100644 index 00000000..d590a333 --- /dev/null +++ b/Lib/test/test_unittest/test_util.py @@ -0,0 +1,33 @@ +import unittest +from unittest.util import safe_repr, sorted_list_difference, unorderable_list_difference + + +class TestUtil(unittest.TestCase): + def test_safe_repr(self): + class RaisingRepr: + def __repr__(self): + raise ValueError("Invalid repr()") + + class LongRepr: + def __repr__(self): + return 'x' * 100 + + safe_repr(RaisingRepr()) + self.assertEqual(safe_repr('foo'), "'foo'") + self.assertEqual(safe_repr(LongRepr(), short=True), 'x'*80 + ' [truncated]...') + + def test_sorted_list_difference(self): + self.assertEqual(sorted_list_difference([], []), ([], [])) + self.assertEqual(sorted_list_difference([1, 2], [2, 3]), ([1], [3])) + self.assertEqual(sorted_list_difference([1, 2], [1, 3]), ([2], [3])) + self.assertEqual(sorted_list_difference([1, 1, 1], [1, 2, 3]), ([], [2, 3])) + self.assertEqual(sorted_list_difference([4], [1, 2, 3, 4]), ([], [1, 2, 3])) + self.assertEqual(sorted_list_difference([1, 1], [2]), ([1], [2])) + self.assertEqual(sorted_list_difference([2], [1, 1]), ([2], [1])) + self.assertEqual(sorted_list_difference([1, 2], [1, 1]), ([2], [])) + + def test_unorderable_list_difference(self): + self.assertEqual(unorderable_list_difference([], []), ([], [])) + self.assertEqual(unorderable_list_difference([1, 2], []), ([2, 1], [])) + self.assertEqual(unorderable_list_difference([], [1, 2]), ([], [1, 2])) + self.assertEqual(unorderable_list_difference([1, 2], [1, 3]), ([2], [3])) diff --git a/Lib/test/test_unittest/testmock/support.py b/Lib/test/test_unittest/testmock/support.py index 49986d65..6c535b79 100644 --- a/Lib/test/test_unittest/testmock/support.py +++ b/Lib/test/test_unittest/testmock/support.py @@ -14,3 +14,14 @@ def wibble(self): pass class X(object): pass + +# A standin for weurkzeug.local.LocalProxy - issue 119600 +def _inaccessible(*args, **kwargs): + raise AttributeError + + +class OpaqueProxy: + __getattribute__ = _inaccessible + + +g = OpaqueProxy() diff --git a/Lib/test/test_unittest/testmock/testhelpers.py b/Lib/test/test_unittest/testmock/testhelpers.py index 74785a83..c9c20f00 100644 --- a/Lib/test/test_unittest/testmock/testhelpers.py +++ b/Lib/test/test_unittest/testmock/testhelpers.py @@ -1127,6 +1127,14 @@ def test_propertymock_side_effect(self): p.assert_called_once_with() + def test_propertymock_attach(self): + m = Mock() + p = PropertyMock() + type(m).foo = p + m.attach_mock(p, 'foo') + self.assertEqual(m.mock_calls, []) + + class TestCallablePredicate(unittest.TestCase): def test_type(self): diff --git a/Lib/test/test_unittest/testmock/testmagicmethods.py b/Lib/test/test_unittest/testmock/testmagicmethods.py index a4feae7e..a8b52ce4 100644 --- a/Lib/test/test_unittest/testmock/testmagicmethods.py +++ b/Lib/test/test_unittest/testmock/testmagicmethods.py @@ -331,6 +331,45 @@ def test_magic_methods_fspath(self): self.assertEqual(os.fspath(mock), expected_path) mock.__fspath__.assert_called_once() + def test_magic_mock_does_not_reset_magic_returns(self): + # https://github.com/python/cpython/issues/123934 + for reset in (True, False): + with self.subTest(reset=reset): + mm = MagicMock() + self.assertIs(type(mm.__str__()), str) + mm.__str__.assert_called_once() + + self.assertIs(type(mm.__hash__()), int) + mm.__hash__.assert_called_once() + + for _ in range(3): + # Repeat reset several times to be sure: + mm.reset_mock(return_value=reset) + + self.assertIs(type(mm.__str__()), str) + mm.__str__.assert_called_once() + + self.assertIs(type(mm.__hash__()), int) + mm.__hash__.assert_called_once() + + def test_magic_mock_resets_manual_mocks(self): + mm = MagicMock() + mm.__iter__ = MagicMock(return_value=iter([1])) + mm.custom = MagicMock(return_value=2) + self.assertEqual(list(iter(mm)), [1]) + self.assertEqual(mm.custom(), 2) + + mm.reset_mock(return_value=True) + self.assertEqual(list(iter(mm)), []) + self.assertIsInstance(mm.custom(), MagicMock) + + def test_magic_mock_resets_manual_mocks_empty_iter(self): + mm = MagicMock() + mm.__iter__.return_value = [] + self.assertEqual(list(iter(mm)), []) + + mm.reset_mock(return_value=True) + self.assertEqual(list(iter(mm)), []) def test_magic_methods_and_spec(self): class Iterable(object): diff --git a/Lib/test/test_unittest/testmock/testmock.py b/Lib/test/test_unittest/testmock/testmock.py index 165e2c04..1eb1a1bf 100644 --- a/Lib/test/test_unittest/testmock/testmock.py +++ b/Lib/test/test_unittest/testmock/testmock.py @@ -118,6 +118,11 @@ def test_create_autospec_should_be_configurable_by_kwargs(self): # pass kwargs with respect to the parent mock. self.assertEqual(class_mock().return_value.meth.side_effect, None) + def test_create_autospec_correctly_handles_name(self): + class X: ... + mock = create_autospec(X, spec_set=True, name="Y") + self.assertEqual(mock._mock_name, "Y") + def test_repr(self): mock = Mock(name='foo') self.assertIn('foo', repr(mock)) diff --git a/Lib/test/test_unittest/testmock/testpatch.py b/Lib/test/test_unittest/testmock/testpatch.py index be75fda7..037c021e 100644 --- a/Lib/test/test_unittest/testmock/testpatch.py +++ b/Lib/test/test_unittest/testmock/testpatch.py @@ -745,6 +745,54 @@ def test_stop_idempotent(self): self.assertIsNone(patcher.stop()) + def test_exit_idempotent(self): + patcher = patch(foo_name, 'bar', 3) + with patcher: + patcher.stop() + + + def test_second_start_failure(self): + patcher = patch(foo_name, 'bar', 3) + patcher.start() + try: + self.assertRaises(RuntimeError, patcher.start) + finally: + patcher.stop() + + + def test_second_enter_failure(self): + patcher = patch(foo_name, 'bar', 3) + with patcher: + self.assertRaises(RuntimeError, patcher.start) + + + def test_second_start_after_stop(self): + patcher = patch(foo_name, 'bar', 3) + patcher.start() + patcher.stop() + patcher.start() + patcher.stop() + + + def test_property_setters(self): + mock_object = Mock() + mock_bar = mock_object.bar + patcher = patch.object(mock_object, 'bar', 'x') + with patcher: + self.assertEqual(patcher.is_local, False) + self.assertIs(patcher.target, mock_object) + self.assertEqual(patcher.temp_original, mock_bar) + patcher.is_local = True + patcher.target = mock_bar + patcher.temp_original = mock_object + self.assertEqual(patcher.is_local, True) + self.assertIs(patcher.target, mock_bar) + self.assertEqual(patcher.temp_original, mock_object) + # if changes are left intact, they may lead to disruption as shown below (it might be what someone needs though) + self.assertEqual(mock_bar.bar, mock_object) + self.assertEqual(mock_object.bar, 'x') + + def test_patchobject_start_stop(self): original = something patcher = patch.object(PTModule, 'something', 'foo') @@ -1098,7 +1146,7 @@ def test_new_callable_patch(self): self.assertIsNot(m1, m2) for mock in m1, m2: - self.assertNotCallable(m1) + self.assertNotCallable(mock) def test_new_callable_patch_object(self): @@ -1111,7 +1159,7 @@ def test_new_callable_patch_object(self): self.assertIsNot(m1, m2) for mock in m1, m2: - self.assertNotCallable(m1) + self.assertNotCallable(mock) def test_new_callable_keyword_arguments(self): @@ -2045,6 +2093,13 @@ def test(): pass with self.assertRaises(TypeError): test() + def test_patch_proxy_object(self): + @patch("test.test_unittest.testmock.support.g", new_callable=MagicMock()) + def test(_): + pass + + test() + if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_unpack_ex.py b/Lib/test/test_unpack_ex.py index c201d08f..9e2d54bd 100644 --- a/Lib/test/test_unpack_ex.py +++ b/Lib/test/test_unpack_ex.py @@ -26,6 +26,12 @@ >>> a == [7, 8, 9] True +Unpack nested implied tuple + + >>> [*[*a]] = [[7,8,9]] + >>> a == [[7,8,9]] + True + Unpack string... fun! >>> a, *b = 'one' diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index 2df74f5e..0710950e 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -19,7 +19,6 @@ ssl = None import sys import tempfile -from nturl2path import url2pathname, pathname2url from base64 import b64encode import collections @@ -719,10 +718,6 @@ def tearDown(self): def constructLocalFileUrl(self, filePath): filePath = os.path.abspath(filePath) - try: - filePath.encode("utf-8") - except UnicodeEncodeError: - raise unittest.SkipTest("filePath is not encodable to utf8") return "file://%s" % urllib.request.pathname2url(filePath) def createNewTempFile(self, data=b""): @@ -1529,39 +1524,119 @@ def test_quoting(self): (expect, result)) @unittest.skipUnless(sys.platform == 'win32', - 'test specific to the nturl2path functions.') - def test_prefixes(self): + 'test specific to Windows pathnames.') + def test_pathname2url_win(self): # Test special prefixes are correctly handled in pathname2url() - given = '\\\\?\\C:\\dir' - expect = '///C:/dir' - result = urllib.request.pathname2url(given) - self.assertEqual(expect, result, - "pathname2url() failed; %s != %s" % - (expect, result)) - given = '\\\\?\\unc\\server\\share\\dir' - expect = '/server/share/dir' - result = urllib.request.pathname2url(given) - self.assertEqual(expect, result, - "pathname2url() failed; %s != %s" % - (expect, result)) - + fn = urllib.request.pathname2url + self.assertEqual(fn('\\\\?\\C:\\dir'), '///C:/dir') + self.assertEqual(fn('\\\\?\\unc\\server\\share\\dir'), '//server/share/dir') + self.assertEqual(fn("C:"), '///C:') + self.assertEqual(fn("C:\\"), '///C:/') + self.assertEqual(fn('C:\\a\\b.c'), '///C:/a/b.c') + self.assertEqual(fn('C:\\a\\b.c\\'), '///C:/a/b.c/') + self.assertEqual(fn('C:\\a\\\\b.c'), '///C:/a//b.c') + self.assertEqual(fn('C:\\a\\b%#c'), '///C:/a/b%25%23c') + self.assertEqual(fn('C:\\a\\b\xe9'), '///C:/a/b%C3%A9') + self.assertEqual(fn('C:\\foo\\bar\\spam.foo'), "///C:/foo/bar/spam.foo") + # Long drive letter + self.assertRaises(IOError, fn, "XX:\\") + # No drive letter + self.assertEqual(fn("\\folder\\test\\"), '/folder/test/') + self.assertEqual(fn("\\\\folder\\test\\"), '//folder/test/') + self.assertEqual(fn("\\\\\\folder\\test\\"), '///folder/test/') + self.assertEqual(fn('\\\\some\\share\\'), '//some/share/') + self.assertEqual(fn('\\\\some\\share\\a\\b.c'), '//some/share/a/b.c') + self.assertEqual(fn('\\\\some\\share\\a\\b%#c\xe9'), '//some/share/a/b%25%23c%C3%A9') + # Alternate path separator + self.assertEqual(fn('C:/a/b.c'), '///C:/a/b.c') + self.assertEqual(fn('//some/share/a/b.c'), '//some/share/a/b.c') + self.assertEqual(fn('//?/C:/dir'), '///C:/dir') + self.assertEqual(fn('//?/unc/server/share/dir'), '//server/share/dir') + # Round-tripping + urls = ['///C:', + '/folder/test/', + '///C:/foo/bar/spam.foo'] + for url in urls: + self.assertEqual(fn(urllib.request.url2pathname(url)), url) + + @unittest.skipIf(sys.platform == 'win32', + 'test specific to POSIX pathnames') + def test_pathname2url_posix(self): + fn = urllib.request.pathname2url + self.assertEqual(fn('/'), '/') + self.assertEqual(fn('/a/b.c'), '/a/b.c') + self.assertEqual(fn('//a/b.c'), '////a/b.c') + self.assertEqual(fn('///a/b.c'), '/////a/b.c') + self.assertEqual(fn('////a/b.c'), '//////a/b.c') + self.assertEqual(fn('/a/b%#c'), '/a/b%25%23c') + + @unittest.skipUnless(os_helper.FS_NONASCII, 'need os_helper.FS_NONASCII') + def test_pathname2url_nonascii(self): + encoding = sys.getfilesystemencoding() + errors = sys.getfilesystemencodeerrors() + url = urllib.parse.quote(os_helper.FS_NONASCII, encoding=encoding, errors=errors) + self.assertEqual(urllib.request.pathname2url(os_helper.FS_NONASCII), url) @unittest.skipUnless(sys.platform == 'win32', - 'test specific to the urllib.url2path function.') - def test_ntpath(self): - given = ('/C:/', '///C:/', '/C|//') - expect = 'C:\\' - for url in given: - result = urllib.request.url2pathname(url) - self.assertEqual(expect, result, - 'urllib.request..url2pathname() failed; %s != %s' % - (expect, result)) - given = '///C|/path' - expect = 'C:\\path' - result = urllib.request.url2pathname(given) - self.assertEqual(expect, result, - 'urllib.request.url2pathname() failed; %s != %s' % - (expect, result)) + 'test specific to Windows pathnames.') + def test_url2pathname_win(self): + fn = urllib.request.url2pathname + self.assertEqual(fn('/C:/'), 'C:\\') + self.assertEqual(fn("///C|"), 'C:') + self.assertEqual(fn("///C:"), 'C:') + self.assertEqual(fn('///C:/'), 'C:\\') + self.assertEqual(fn('/C|//'), 'C:\\\\') + self.assertEqual(fn('///C|/path'), 'C:\\path') + # No DOS drive + self.assertEqual(fn("///C/test/"), '\\C\\test\\') + self.assertEqual(fn("////C/test/"), '\\\\C\\test\\') + # DOS drive paths + self.assertEqual(fn('C:/path/to/file'), 'C:\\path\\to\\file') + self.assertEqual(fn('C:/path/to/file/'), 'C:\\path\\to\\file\\') + self.assertEqual(fn('C:/path/to//file'), 'C:\\path\\to\\\\file') + self.assertEqual(fn('C|/path/to/file'), 'C:\\path\\to\\file') + self.assertEqual(fn('/C|/path/to/file'), 'C:\\path\\to\\file') + self.assertEqual(fn('///C|/path/to/file'), 'C:\\path\\to\\file') + self.assertEqual(fn("///C|/foo/bar/spam.foo"), 'C:\\foo\\bar\\spam.foo') + # Non-ASCII drive letter + self.assertRaises(IOError, fn, "///\u00e8|/") + # UNC paths + self.assertEqual(fn('//server/path/to/file'), '\\\\server\\path\\to\\file') + self.assertEqual(fn('////server/path/to/file'), '\\\\server\\path\\to\\file') + self.assertEqual(fn('/////server/path/to/file'), '\\\\server\\path\\to\\file') + # Localhost paths + self.assertEqual(fn('//localhost/C:/path/to/file'), 'C:\\path\\to\\file') + self.assertEqual(fn('//localhost/C|/path/to/file'), 'C:\\path\\to\\file') + self.assertEqual(fn('//localhost/path/to/file'), '\\path\\to\\file') + self.assertEqual(fn('//localhost//server/path/to/file'), '\\\\server\\path\\to\\file') + # Percent-encoded forward slashes are preserved for backwards compatibility + self.assertEqual(fn('C:/foo%2fbar'), 'C:\\foo/bar') + self.assertEqual(fn('//server/share/foo%2fbar'), '\\\\server\\share\\foo/bar') + # Round-tripping + paths = ['C:', + r'\C\test\\', + r'C:\foo\bar\spam.foo'] + for path in paths: + self.assertEqual(fn(urllib.request.pathname2url(path)), path) + + @unittest.skipIf(sys.platform == 'win32', + 'test specific to POSIX pathnames') + def test_url2pathname_posix(self): + fn = urllib.request.url2pathname + self.assertEqual(fn('/foo/bar'), '/foo/bar') + self.assertEqual(fn('//foo/bar'), '//foo/bar') + self.assertEqual(fn('///foo/bar'), '/foo/bar') + self.assertEqual(fn('////foo/bar'), '//foo/bar') + self.assertEqual(fn('//localhost/foo/bar'), '/foo/bar') + + @unittest.skipUnless(os_helper.FS_NONASCII, 'need os_helper.FS_NONASCII') + def test_url2pathname_nonascii(self): + encoding = sys.getfilesystemencoding() + errors = sys.getfilesystemencodeerrors() + url = os_helper.FS_NONASCII + self.assertEqual(urllib.request.url2pathname(url), os_helper.FS_NONASCII) + url = urllib.parse.quote(url, encoding=encoding, errors=errors) + self.assertEqual(urllib.request.url2pathname(url), os_helper.FS_NONASCII) class Utility_Tests(unittest.TestCase): """Testcase to test the various utility functions in the urllib.""" @@ -1645,60 +1720,5 @@ def test_with_method_arg(self): self.assertEqual(request.get_method(), 'HEAD') -class URL2PathNameTests(unittest.TestCase): - - def test_converting_drive_letter(self): - self.assertEqual(url2pathname("///C|"), 'C:') - self.assertEqual(url2pathname("///C:"), 'C:') - self.assertEqual(url2pathname("///C|/"), 'C:\\') - - def test_converting_when_no_drive_letter(self): - # cannot end a raw string in \ - self.assertEqual(url2pathname("///C/test/"), r'\\\C\test' '\\') - self.assertEqual(url2pathname("////C/test/"), r'\\C\test' '\\') - - def test_simple_compare(self): - self.assertEqual(url2pathname("///C|/foo/bar/spam.foo"), - r'C:\foo\bar\spam.foo') - - def test_non_ascii_drive_letter(self): - self.assertRaises(IOError, url2pathname, "///\u00e8|/") - - def test_roundtrip_url2pathname(self): - list_of_paths = ['C:', - r'\\\C\test\\', - r'C:\foo\bar\spam.foo' - ] - for path in list_of_paths: - self.assertEqual(url2pathname(pathname2url(path)), path) - -class PathName2URLTests(unittest.TestCase): - - def test_converting_drive_letter(self): - self.assertEqual(pathname2url("C:"), '///C:') - self.assertEqual(pathname2url("C:\\"), '///C:') - - def test_converting_when_no_drive_letter(self): - self.assertEqual(pathname2url(r"\\\folder\test" "\\"), - '/////folder/test/') - self.assertEqual(pathname2url(r"\\folder\test" "\\"), - '////folder/test/') - self.assertEqual(pathname2url(r"\folder\test" "\\"), - '/folder/test/') - - def test_simple_compare(self): - self.assertEqual(pathname2url(r'C:\foo\bar\spam.foo'), - "///C:/foo/bar/spam.foo" ) - - def test_long_drive_letter(self): - self.assertRaises(IOError, pathname2url, "XX:\\") - - def test_roundtrip_pathname2url(self): - list_of_paths = ['///C:', - '/////folder/test/', - '///C:/foo/bar/spam.foo'] - for path in list_of_paths: - self.assertEqual(pathname2url(url2pathname(path)), path) - if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py index 69cf1dc7..12b1053a 100644 --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -716,10 +716,6 @@ def test_processors(self): def sanepathname2url(path): - try: - path.encode("utf-8") - except UnicodeEncodeError: - raise unittest.SkipTest("path is not encodable to utf8") urlpath = urllib.request.pathname2url(path) if os.name == "nt" and urlpath.startswith("///"): urlpath = urlpath[2:] diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py index 4faad733..818e7e93 100644 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -207,6 +207,9 @@ def test_roundtrips(self): ('scheme://///path/to/file', ('scheme', '', '///path/to/file', '', '', ''), ('scheme', '', '///path/to/file', '', '')), + ('file:tmp/junk.txt', + ('file', '', 'tmp/junk.txt', '', '', ''), + ('file', '', 'tmp/junk.txt', '', '')), ('file:///tmp/junk.txt', ('file', '', '/tmp/junk.txt', '', '', ''), ('file', '', '/tmp/junk.txt', '', '')), @@ -216,6 +219,18 @@ def test_roundtrips(self): ('file://///tmp/junk.txt', ('file', '', '///tmp/junk.txt', '', '', ''), ('file', '', '///tmp/junk.txt', '', '')), + ('http:tmp/junk.txt', + ('http', '', 'tmp/junk.txt', '', '', ''), + ('http', '', 'tmp/junk.txt', '', '')), + ('http://example.com/tmp/junk.txt', + ('http', 'example.com', '/tmp/junk.txt', '', '', ''), + ('http', 'example.com', '/tmp/junk.txt', '', '')), + ('http:///example.com/tmp/junk.txt', + ('http', '', '/example.com/tmp/junk.txt', '', '', ''), + ('http', '', '/example.com/tmp/junk.txt', '', '')), + ('http:////example.com/tmp/junk.txt', + ('http', '', '//example.com/tmp/junk.txt', '', '', ''), + ('http', '', '//example.com/tmp/junk.txt', '', '')), ('imap://mail.python.org/mbox1', ('imap', 'mail.python.org', '/mbox1', '', '', ''), ('imap', 'mail.python.org', '/mbox1', '', '')), @@ -260,7 +275,8 @@ def _encode(t): ('', '', 'schème:path/to/file', '', '')), ] for url, parsed, split in str_cases + bytes_cases: - self.checkRoundtrips(url, parsed, split) + with self.subTest(url): + self.checkRoundtrips(url, parsed, split) def test_roundtrips_normalization(self): str_cases = [ @@ -292,7 +308,8 @@ def _encode(t): tuple(x.encode('ascii') for x in t[3])) bytes_cases = [_encode(x) for x in str_cases] for url, url2, parsed, split in str_cases + bytes_cases: - self.checkRoundtrips(url, parsed, split, url2) + with self.subTest(url): + self.checkRoundtrips(url, parsed, split, url2) def test_http_roundtrips(self): # urllib.parse.urlsplit treats 'http:' as an optimized special case, @@ -333,11 +350,17 @@ def _encode(t): self.checkRoundtrips(url, parsed, split) def checkJoin(self, base, relurl, expected): - str_components = (base, relurl, expected) - self.assertEqual(urllib.parse.urljoin(base, relurl), expected) - bytes_components = baseb, relurlb, expectedb = [ - x.encode('ascii') for x in str_components] - self.assertEqual(urllib.parse.urljoin(baseb, relurlb), expectedb) + with self.subTest(base=base, relurl=relurl): + self.assertEqual(urllib.parse.urljoin(base, relurl), expected) + baseb = base.encode('ascii') + relurlb = relurl.encode('ascii') + expectedb = expected.encode('ascii') + self.assertEqual(urllib.parse.urljoin(baseb, relurlb), expectedb) + + relurl = urllib.parse.urlunsplit(urllib.parse.urlsplit(relurl)) + self.assertEqual(urllib.parse.urljoin(base, relurl), expected) + relurlb = urllib.parse.urlunsplit(urllib.parse.urlsplit(relurlb)) + self.assertEqual(urllib.parse.urljoin(baseb, relurlb), expectedb) def test_unparse_parse(self): str_cases = ['Python', './Python','x-newscheme://foo.com/stuff','x://y','x:/y','x:/','/',] diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index feaf9784..8254a701 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -17,6 +17,7 @@ import sys import sysconfig import tempfile +import shlex from test.support import (captured_stdout, captured_stderr, skip_if_broken_multiprocessing_synchronize, verbose, requires_subprocess, is_emscripten, is_wasi, @@ -97,6 +98,10 @@ def get_text_file_contents(self, *args, encoding='utf-8'): result = f.read() return result + def assertEndsWith(self, string, tail): + if not string.endswith(tail): + self.fail(f"String {string!r} does not end with {tail!r}") + class BasicTest(BaseTest): """Test venv module functionality.""" @@ -446,6 +451,82 @@ def test_executable_symlinks(self): 'import sys; print(sys.executable)']) self.assertEqual(out.strip(), envpy.encode()) + # gh-124651: test quoted strings + @unittest.skipIf(os.name == 'nt', 'contains invalid characters on Windows') + def test_special_chars_bash(self): + """ + Test that the template strings are quoted properly (bash) + """ + rmtree(self.env_dir) + bash = shutil.which('bash') + if bash is None: + self.skipTest('bash required for this test') + env_name = '"\';&&$e|\'"' + env_dir = os.path.join(os.path.realpath(self.env_dir), env_name) + builder = venv.EnvBuilder(clear=True) + builder.create(env_dir) + activate = os.path.join(env_dir, self.bindir, 'activate') + test_script = os.path.join(self.env_dir, 'test_special_chars.sh') + with open(test_script, "w") as f: + f.write(f'source {shlex.quote(activate)}\n' + 'python -c \'import sys; print(sys.executable)\'\n' + 'python -c \'import os; print(os.environ["VIRTUAL_ENV"])\'\n' + 'deactivate\n') + out, err = check_output([bash, test_script]) + lines = out.splitlines() + self.assertTrue(env_name.encode() in lines[0]) + self.assertEndsWith(lines[1], env_name.encode()) + + # gh-124651: test quoted strings + @unittest.skipIf(os.name == 'nt', 'contains invalid characters on Windows') + def test_special_chars_csh(self): + """ + Test that the template strings are quoted properly (csh) + """ + rmtree(self.env_dir) + csh = shutil.which('tcsh') or shutil.which('csh') + if csh is None: + self.skipTest('csh required for this test') + env_name = '"\';&&$e|\'"' + env_dir = os.path.join(os.path.realpath(self.env_dir), env_name) + builder = venv.EnvBuilder(clear=True) + builder.create(env_dir) + activate = os.path.join(env_dir, self.bindir, 'activate.csh') + test_script = os.path.join(self.env_dir, 'test_special_chars.csh') + with open(test_script, "w") as f: + f.write(f'source {shlex.quote(activate)}\n' + 'python -c \'import sys; print(sys.executable)\'\n' + 'python -c \'import os; print(os.environ["VIRTUAL_ENV"])\'\n' + 'deactivate\n') + out, err = check_output([csh, test_script]) + lines = out.splitlines() + self.assertTrue(env_name.encode() in lines[0]) + self.assertEndsWith(lines[1], env_name.encode()) + + # gh-124651: test quoted strings on Windows + @unittest.skipUnless(os.name == 'nt', 'only relevant on Windows') + def test_special_chars_windows(self): + """ + Test that the template strings are quoted properly on Windows + """ + rmtree(self.env_dir) + env_name = "'&&^$e" + env_dir = os.path.join(os.path.realpath(self.env_dir), env_name) + builder = venv.EnvBuilder(clear=True) + builder.create(env_dir) + activate = os.path.join(env_dir, self.bindir, 'activate.bat') + test_batch = os.path.join(self.env_dir, 'test_special_chars.bat') + with open(test_batch, "w") as f: + f.write('@echo off\n' + f'"{activate}" & ' + f'{self.exe} -c "import sys; print(sys.executable)" & ' + f'{self.exe} -c "import os; print(os.environ[\'VIRTUAL_ENV\'])" & ' + 'deactivate') + out, err = check_output([test_batch]) + lines = out.splitlines() + self.assertTrue(env_name.encode() in lines[0]) + self.assertEndsWith(lines[1], env_name.encode()) + @unittest.skipUnless(os.name == 'nt', 'only relevant on Windows') def test_unicode_in_batch_file(self): """ @@ -782,6 +863,14 @@ def do_test_with_pip(self, system_site_packages): err = re.sub("^(WARNING: )?The directory .* or its parent directory " "is not owned or is not writable by the current user.*$", "", err, flags=re.MULTILINE) + # Ignore warning about missing optional module: + try: + import ssl + except ImportError: + err = re.sub( + "^WARNING: Disabling truststore since ssl support is missing$", + "", + err, flags=re.MULTILINE) self.assertEqual(err.rstrip(), "") # Being fairly specific regarding the expected behaviour for the # initial bundling phase in Python 3.4. If the output changes in diff --git a/Lib/test/test_warnings/__init__.py b/Lib/test/test_warnings/__init__.py index 83237f5f..a86750ab 100644 --- a/Lib/test/test_warnings/__init__.py +++ b/Lib/test/test_warnings/__init__.py @@ -1,10 +1,12 @@ from contextlib import contextmanager import linecache import os +import importlib from io import StringIO import re import sys import textwrap +import types import unittest from test import support from test.support import import_helper @@ -610,6 +612,97 @@ class NonWarningSubclass: self.module.warn('good warning category', MyWarningClass) self.assertIsInstance(cm.warning, Warning) + def check_module_globals(self, module_globals): + with original_warnings.catch_warnings(module=self.module, record=True) as w: + self.module.filterwarnings('default') + self.module.warn_explicit( + 'eggs', UserWarning, 'bar', 1, + module_globals=module_globals) + self.assertEqual(len(w), 1) + self.assertEqual(w[0].category, UserWarning) + self.assertEqual(str(w[0].message), 'eggs') + + def check_module_globals_error(self, module_globals, errmsg, errtype=ValueError): + if self.module is py_warnings: + self.check_module_globals(module_globals) + return + with original_warnings.catch_warnings(module=self.module, record=True) as w: + self.module.filterwarnings('always') + with self.assertRaisesRegex(errtype, re.escape(errmsg)): + self.module.warn_explicit( + 'eggs', UserWarning, 'bar', 1, + module_globals=module_globals) + self.assertEqual(len(w), 0) + + def check_module_globals_deprecated(self, module_globals, msg): + if self.module is py_warnings: + self.check_module_globals(module_globals) + return + with original_warnings.catch_warnings(module=self.module, record=True) as w: + self.module.filterwarnings('always') + self.module.warn_explicit( + 'eggs', UserWarning, 'bar', 1, + module_globals=module_globals) + self.assertEqual(len(w), 2) + self.assertEqual(w[0].category, DeprecationWarning) + self.assertEqual(str(w[0].message), msg) + self.assertEqual(w[1].category, UserWarning) + self.assertEqual(str(w[1].message), 'eggs') + + def test_gh86298_no_loader_and_no_spec(self): + self.check_module_globals({'__name__': 'bar'}) + + def test_gh86298_loader_is_none_and_no_spec(self): + self.check_module_globals({'__name__': 'bar', '__loader__': None}) + + def test_gh86298_no_loader_and_spec_is_none(self): + self.check_module_globals_error( + {'__name__': 'bar', '__spec__': None}, + 'Module globals is missing a __spec__.loader') + + def test_gh86298_loader_is_none_and_spec_is_none(self): + self.check_module_globals_error( + {'__name__': 'bar', '__loader__': None, '__spec__': None}, + 'Module globals is missing a __spec__.loader') + + def test_gh86298_loader_is_none_and_spec_loader_is_none(self): + self.check_module_globals_error( + {'__name__': 'bar', '__loader__': None, + '__spec__': types.SimpleNamespace(loader=None)}, + 'Module globals is missing a __spec__.loader') + + def test_gh86298_no_spec(self): + self.check_module_globals_deprecated( + {'__name__': 'bar', '__loader__': object()}, + 'Module globals is missing a __spec__.loader') + + def test_gh86298_spec_is_none(self): + self.check_module_globals_deprecated( + {'__name__': 'bar', '__loader__': object(), '__spec__': None}, + 'Module globals is missing a __spec__.loader') + + def test_gh86298_no_spec_loader(self): + self.check_module_globals_deprecated( + {'__name__': 'bar', '__loader__': object(), + '__spec__': types.SimpleNamespace()}, + 'Module globals is missing a __spec__.loader') + + def test_gh86298_loader_and_spec_loader_disagree(self): + self.check_module_globals_deprecated( + {'__name__': 'bar', '__loader__': object(), + '__spec__': types.SimpleNamespace(loader=object())}, + 'Module globals; __loader__ != __spec__.loader') + + def test_gh86298_no_loader_and_no_spec_loader(self): + self.check_module_globals_error( + {'__name__': 'bar', '__spec__': types.SimpleNamespace()}, + 'Module globals is missing a __spec__.loader', AttributeError) + + def test_gh86298_no_loader_with_spec_loader_okay(self): + self.check_module_globals( + {'__name__': 'bar', + '__spec__': types.SimpleNamespace(loader=object())}) + class CWarnTests(WarnTests, unittest.TestCase): module = c_warnings @@ -858,37 +951,46 @@ def test_issue31285(self): # warn_explicit() should neither raise a SystemError nor cause an # assertion failure, in case the return value of get_source() has a # bad splitlines() method. - def get_bad_loader(splitlines_ret_val): + get_source_called = [] + def get_module_globals(*, splitlines_ret_val): + class BadSource(str): + def splitlines(self): + return splitlines_ret_val + class BadLoader: def get_source(self, fullname): - class BadSource(str): - def splitlines(self): - return splitlines_ret_val + get_source_called.append(splitlines_ret_val) return BadSource('spam') - return BadLoader() + + loader = BadLoader() + spec = importlib.machinery.ModuleSpec('foobar', loader) + return {'__loader__': loader, + '__spec__': spec, + '__name__': 'foobar'} + wmod = self.module with original_warnings.catch_warnings(module=wmod): wmod.filterwarnings('default', category=UserWarning) + linecache.clearcache() with support.captured_stderr() as stderr: wmod.warn_explicit( 'foo', UserWarning, 'bar', 1, - module_globals={'__loader__': get_bad_loader(42), - '__name__': 'foobar'}) + module_globals=get_module_globals(splitlines_ret_val=42)) self.assertIn('UserWarning: foo', stderr.getvalue()) + self.assertEqual(get_source_called, [42]) - show = wmod._showwarnmsg - try: + linecache.clearcache() + with support.swap_attr(wmod, '_showwarnmsg', None): del wmod._showwarnmsg with support.captured_stderr() as stderr: wmod.warn_explicit( 'eggs', UserWarning, 'bar', 1, - module_globals={'__loader__': get_bad_loader([42]), - '__name__': 'foobar'}) + module_globals=get_module_globals(splitlines_ret_val=[42])) self.assertIn('UserWarning: eggs', stderr.getvalue()) - finally: - wmod._showwarnmsg = show + self.assertEqual(get_source_called, [42, [42]]) + linecache.clearcache() @support.cpython_only def test_issue31411(self): diff --git a/Lib/test/test_winconsoleio.py b/Lib/test/test_winconsoleio.py index cf8b1058..459d2192 100644 --- a/Lib/test/test_winconsoleio.py +++ b/Lib/test/test_winconsoleio.py @@ -126,6 +126,29 @@ def test_write_empty_data(self): with ConIO('CONOUT$', 'w') as f: self.assertEqual(f.write(b''), 0) + @requires_resource('console') + def test_write(self): + testcases = [] + with ConIO('CONOUT$', 'w') as f: + for a in [ + b'', + b'abc', + b'\xc2\xa7\xe2\x98\x83\xf0\x9f\x90\x8d', + b'\xff'*10, + ]: + for b in b'\xc2\xa7', b'\xe2\x98\x83', b'\xf0\x9f\x90\x8d': + testcases.append(a + b) + for i in range(1, len(b)): + data = a + b[:i] + testcases.append(data + b'z') + testcases.append(data + b'\xff') + # incomplete multibyte sequence + with self.subTest(data=data): + self.assertEqual(f.write(data), len(a)) + for data in testcases: + with self.subTest(data=data): + self.assertEqual(f.write(data), len(data)) + def assertStdinRoundTrip(self, text): stdin = open('CONIN$', 'r') old_stdin = sys.stdin diff --git a/Lib/test/test_with.py b/Lib/test/test_with.py index d8190232..839cdec6 100644 --- a/Lib/test/test_with.py +++ b/Lib/test/test_with.py @@ -5,6 +5,7 @@ __email__ = "mbland at acm dot org" import sys +import traceback import unittest from collections import deque from contextlib import _GeneratorContextManager, contextmanager, nullcontext @@ -170,7 +171,10 @@ def __exit__(self, *args): def shouldThrow(): ct = EnterThrows() self.foo = None - with ct as self.foo: + # Ruff complains that we're redefining `self.foo` here, + # but the whole point of the test is to check that `self.foo` + # is *not* redefined (because `__enter__` raises) + with ct as self.foo: # ruff: noqa: F811 pass self.assertRaises(RuntimeError, shouldThrow) self.assertEqual(self.foo, None) @@ -251,7 +255,6 @@ def testInlineGeneratorBoundSyntax(self): self.assertAfterWithGeneratorInvariantsNoError(foo) def testInlineGeneratorBoundToExistingVariable(self): - foo = None with mock_contextmanager_generator() as foo: self.assertInWithGeneratorInvariants(foo) self.assertAfterWithGeneratorInvariantsNoError(foo) @@ -749,5 +752,48 @@ def testEnterReturnsTuple(self): self.assertEqual(10, b1) self.assertEqual(20, b2) + def testExceptionLocation(self): + # The location of an exception raised from + # __init__, __enter__ or __exit__ of a context + # manager should be just the context manager expression, + # pinpointing the precise context manager in case there + # is more than one. + + def init_raises(): + try: + with self.Dummy(), self.InitRaises() as cm, self.Dummy() as d: + pass + except Exception as e: + return e + + def enter_raises(): + try: + with self.EnterRaises(), self.Dummy() as d: + pass + except Exception as e: + return e + + def exit_raises(): + try: + with self.ExitRaises(), self.Dummy() as d: + pass + except Exception as e: + return e + + for func, expected in [(init_raises, "self.InitRaises()"), + (enter_raises, "self.EnterRaises()"), + (exit_raises, "self.ExitRaises()"), + ]: + with self.subTest(func): + exc = func() + f = traceback.extract_tb(exc.__traceback__)[0] + indent = 16 + co = func.__code__ + self.assertEqual(f.lineno, co.co_firstlineno + 2) + self.assertEqual(f.end_lineno, co.co_firstlineno + 2) + self.assertEqual(f.line[f.colno - indent : f.end_colno - indent], + expected) + + if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py index 9c382d14..f8c2e5cc 100644 --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -2343,6 +2343,22 @@ def test_39495_treebuilder_start(self): self.assertRaises(TypeError, ET.TreeBuilder().start, "tag") self.assertRaises(TypeError, ET.TreeBuilder().start, "tag", None) + def test_issue123213_correct_extend_exception(self): + # Does not hide the internal exception when extending the element + self.assertRaises(ZeroDivisionError, ET.Element('tag').extend, + (1/0 for i in range(2))) + + # Still raises the TypeError when extending with a non-iterable + self.assertRaises(TypeError, ET.Element('tag').extend, None) + + # Preserves the TypeError message when extending with a generator + def f(): + raise TypeError("mymessage") + + self.assertRaisesRegex( + TypeError, 'mymessage', + ET.Element('tag').extend, (f() for i in range(2))) + # -------------------------------------------------------------------- @@ -3669,6 +3685,22 @@ def test_setslice_negative_steps(self): e[1::-sys.maxsize<<64] = [ET.Element('d')] self.assertEqual(self._subelem_tags(e), ['a0', 'd', 'a2', 'a3']) + def test_issue123213_setslice_exception(self): + e = ET.Element('tag') + # Does not hide the internal exception when assigning to the element + with self.assertRaises(ZeroDivisionError): + e[:1] = (1/0 for i in range(2)) + + # Still raises the TypeError when assigning with a non-iterable + with self.assertRaises(TypeError): + e[:1] = None + + # Preserve the original TypeError message when assigning. + def f(): + raise TypeError("mymessage") + + with self.assertRaisesRegex(TypeError, 'mymessage'): + e[:1] = (f() for i in range(2)) class IOTest(unittest.TestCase): def test_encoding(self): @@ -4009,7 +4041,7 @@ class BoolTest(unittest.TestCase): def test_warning(self): e = ET.fromstring('') msg = ( - r"Testing an element's truth value will raise an exception in " + r"Testing an element's truth value will always return True in " r"future versions. " r"Use specific 'len\(elem\)' or 'elem is not None' test instead.") with self.assertWarnsRegex(DeprecationWarning, msg): diff --git a/Lib/test/test_zipfile/_path/test_path.py b/Lib/test/test_zipfile/_path/test_path.py index 06d5aab6..616c4e8c 100644 --- a/Lib/test/test_zipfile/_path/test_path.py +++ b/Lib/test/test_zipfile/_path/test_path.py @@ -4,6 +4,7 @@ import pathlib import pickle import sys +import time import unittest import zipfile @@ -472,6 +473,18 @@ def test_glob_recursive(self, alpharep): assert list(root.glob("**/*.txt")) == list(root.rglob("*.txt")) + @pass_alpharep + def test_glob_dirs(self, alpharep): + root = zipfile.Path(alpharep) + assert list(root.glob('b')) == [zipfile.Path(alpharep, "b/")] + assert list(root.glob('b*')) == [zipfile.Path(alpharep, "b/")] + + @pass_alpharep + def test_glob_subdir(self, alpharep): + root = zipfile.Path(alpharep) + assert list(root.glob('g/h')) == [zipfile.Path(alpharep, "g/h/")] + assert list(root.glob('g*/h*')) == [zipfile.Path(alpharep, "g/h/")] + @pass_alpharep def test_glob_subdirs(self, alpharep): root = zipfile.Path(alpharep) @@ -577,3 +590,87 @@ def test_getinfo_missing(self, alpharep): zipfile.Path(alpharep) with self.assertRaises(KeyError): alpharep.getinfo('does-not-exist') + + def test_malformed_paths(self): + """ + Path should handle malformed paths gracefully. + + Paths with leading slashes are not visible. + + Paths with dots are treated like regular files. + """ + data = io.BytesIO() + zf = zipfile.ZipFile(data, "w") + zf.writestr("/one-slash.txt", b"content") + zf.writestr("//two-slash.txt", b"content") + zf.writestr("../parent.txt", b"content") + zf.filename = '' + root = zipfile.Path(zf) + assert list(map(str, root.iterdir())) == ['../'] + assert root.joinpath('..').joinpath('parent.txt').read_bytes() == b'content' + + def test_unsupported_names(self): + """ + Path segments with special characters are readable. + + On some platforms or file systems, characters like + ``:`` and ``?`` are not allowed, but they are valid + in the zip file. + """ + data = io.BytesIO() + zf = zipfile.ZipFile(data, "w") + zf.writestr("path?", b"content") + zf.writestr("V: NMS.flac", b"fLaC...") + zf.filename = '' + root = zipfile.Path(zf) + contents = root.iterdir() + assert next(contents).name == 'path?' + assert next(contents).name == 'V: NMS.flac' + assert root.joinpath('V: NMS.flac').read_bytes() == b"fLaC..." + + def test_backslash_not_separator(self): + """ + In a zip file, backslashes are not separators. + """ + data = io.BytesIO() + zf = zipfile.ZipFile(data, "w") + zf.writestr(DirtyZipInfo.for_name("foo\\bar", zf), b"content") + zf.filename = '' + root = zipfile.Path(zf) + (first,) = root.iterdir() + assert not first.is_dir() + assert first.name == 'foo\\bar' + + @pass_alpharep + def test_interface(self, alpharep): + from importlib.resources.abc import Traversable + + zf = zipfile.Path(alpharep) + assert isinstance(zf, Traversable) + + +class DirtyZipInfo(zipfile.ZipInfo): + """ + Bypass name sanitization. + """ + + def __init__(self, filename, *args, **kwargs): + super().__init__(filename, *args, **kwargs) + self.filename = filename + + @classmethod + def for_name(cls, name, archive): + """ + Construct the same way that ZipFile.writestr does. + + TODO: extract this functionality and re-use + """ + self = cls(filename=name, date_time=time.localtime(time.time())[:6]) + self.compress_type = archive.compression + self.compress_level = archive.compresslevel + if self.filename.endswith('/'): # pragma: no cover + self.external_attr = 0o40775 << 16 # drwxrwxr-x + self.external_attr |= 0x10 # MS-DOS directory flag + else: + self.external_attr = 0o600 << 16 # ?rw------- + return self diff --git a/Lib/test/test_zipfile/test_core.py b/Lib/test/test_zipfile/test_core.py index 5b32f80d..86efccd2 100644 --- a/Lib/test/test_zipfile/test_core.py +++ b/Lib/test/test_zipfile/test_core.py @@ -1117,7 +1117,7 @@ def test_force_zip64(self): # Because this is hard to verify by parsing the data as a zip, the raw # bytes are checked to ensure that they line up with the zip spec. # The spec for this can be found at: https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT - # The relevent sections for this test are: + # The relevant sections for this test are: # - 4.3.7 for local file header # - 4.5.3 for zip64 extra field @@ -1188,7 +1188,7 @@ def test_unseekable_zip_known_filesize(self): # in as a zip, this test looks at the raw bytes created to ensure that # the correct data has been generated. # The spec for this can be found at: https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT - # The relevent sections for this test are: + # The relevant sections for this test are: # - 4.3.7 for local file header # - 4.3.9 for the data descriptor # - 4.5.3 for zip64 extra field diff --git a/Lib/test/test_zipimport.py b/Lib/test/test_zipimport.py index 14c19719..12fd9826 100644 --- a/Lib/test/test_zipimport.py +++ b/Lib/test/test_zipimport.py @@ -50,8 +50,11 @@ def module_path_to_dotted_name(path): TESTMOD = "ziptestmodule" +TESTMOD2 = "ziptestmodule2" +TESTMOD3 = "ziptestmodule3" TESTPACK = "ziptestpackage" TESTPACK2 = "ziptestpackage2" +TESTPACK3 = "ziptestpackage3" TEMP_DIR = os.path.abspath("junk95142") TEMP_ZIP = os.path.abspath("junk95142.zip") @@ -92,8 +95,10 @@ def makeTree(self, files, dirName=TEMP_DIR): # defined by files under the directory dirName. self.addCleanup(os_helper.rmtree, dirName) - for name, (mtime, data) in files.items(): - path = os.path.join(dirName, name) + for name, data in files.items(): + if isinstance(data, tuple): + mtime, data = data + path = os.path.join(dirName, *name.split('/')) if path[-1] == os.sep: if not os.path.isdir(path): os.makedirs(path) @@ -104,22 +109,18 @@ def makeTree(self, files, dirName=TEMP_DIR): with open(path, 'wb') as fp: fp.write(data) - def makeZip(self, files, zipName=TEMP_ZIP, **kw): + def makeZip(self, files, zipName=TEMP_ZIP, *, + comment=None, file_comment=None, stuff=None, prefix='', **kw): # Create a zip archive based set of modules/packages - # defined by files in the zip file zipName. If the - # key 'stuff' exists in kw it is prepended to the archive. + # defined by files in the zip file zipName. + # If stuff is not None, it is prepended to the archive. self.addCleanup(os_helper.unlink, zipName) - with ZipFile(zipName, "w") as z: - for name, (mtime, data) in files.items(): - zinfo = ZipInfo(name, time.localtime(mtime)) - zinfo.compress_type = self.compression - z.writestr(zinfo, data) - comment = kw.get("comment", None) + with ZipFile(zipName, "w", compression=self.compression) as z: + self.writeZip(z, files, file_comment=file_comment, prefix=prefix) if comment is not None: z.comment = comment - stuff = kw.get("stuff", None) if stuff is not None: # Prepend 'stuff' to the start of the zipfile with open(zipName, "rb") as f: @@ -128,20 +129,41 @@ def makeZip(self, files, zipName=TEMP_ZIP, **kw): f.write(stuff) f.write(data) - def doTest(self, expected_ext, files, *modules, **kw): + def writeZip(self, z, files, *, file_comment=None, prefix=''): + for name, data in files.items(): + if isinstance(data, tuple): + mtime, data = data + else: + mtime = NOW + name = name.replace(os.sep, '/') + zinfo = ZipInfo(prefix + name, time.localtime(mtime)) + zinfo.compress_type = self.compression + if file_comment is not None: + zinfo.comment = file_comment + if data is None: + zinfo.CRC = 0 + z.mkdir(zinfo) + else: + assert name[-1] != '/' + z.writestr(zinfo, data) + + def doTest(self, expected_ext, files, *modules, call=None, **kw): + if 'prefix' not in kw: + kw['prefix'] = 'pre/fix/' + prefix = kw['prefix'] self.makeZip(files, **kw) - sys.path.insert(0, TEMP_ZIP) + zip_path = os.path.join(TEMP_ZIP, *prefix.split('/')[:-1]) + sys.path.insert(0, zip_path) mod = importlib.import_module(".".join(modules)) - call = kw.get('call') if call is not None: call(mod) if expected_ext: file = mod.get_file() - self.assertEqual(file, os.path.join(TEMP_ZIP, + self.assertEqual(file, os.path.join(zip_path, *modules) + expected_ext) def testAFakeZlib(self): @@ -167,7 +189,7 @@ def testAFakeZlib(self): self.skipTest('zlib is a builtin module') if "zlib" in sys.modules: del sys.modules["zlib"] - files = {"zlib.py": (NOW, test_src)} + files = {"zlib.py": test_src} try: self.doTest(".py", files, "zlib") except ImportError: @@ -178,16 +200,16 @@ def testAFakeZlib(self): self.fail("expected test to raise ImportError") def testPy(self): - files = {TESTMOD + ".py": (NOW, test_src)} + files = {TESTMOD + ".py": test_src} self.doTest(".py", files, TESTMOD) def testPyc(self): - files = {TESTMOD + pyc_ext: (NOW, test_pyc)} + files = {TESTMOD + pyc_ext: test_pyc} self.doTest(pyc_ext, files, TESTMOD) def testBoth(self): - files = {TESTMOD + ".py": (NOW, test_src), - TESTMOD + pyc_ext: (NOW, test_pyc)} + files = {TESTMOD + ".py": test_src, + TESTMOD + pyc_ext: test_pyc} self.doTest(pyc_ext, files, TESTMOD) def testUncheckedHashBasedPyc(self): @@ -220,22 +242,22 @@ def check(mod): self.doTest(None, files, TESTMOD, call=check) def testEmptyPy(self): - files = {TESTMOD + ".py": (NOW, "")} + files = {TESTMOD + ".py": ""} self.doTest(None, files, TESTMOD) def testBadMagic(self): # make pyc magic word invalid, forcing loading from .py badmagic_pyc = bytearray(test_pyc) badmagic_pyc[0] ^= 0x04 # flip an arbitrary bit - files = {TESTMOD + ".py": (NOW, test_src), - TESTMOD + pyc_ext: (NOW, badmagic_pyc)} + files = {TESTMOD + ".py": test_src, + TESTMOD + pyc_ext: badmagic_pyc} self.doTest(".py", files, TESTMOD) def testBadMagic2(self): # make pyc magic word invalid, causing an ImportError badmagic_pyc = bytearray(test_pyc) badmagic_pyc[0] ^= 0x04 # flip an arbitrary bit - files = {TESTMOD + pyc_ext: (NOW, badmagic_pyc)} + files = {TESTMOD + pyc_ext: badmagic_pyc} try: self.doTest(".py", files, TESTMOD) self.fail("This should not be reached") @@ -248,22 +270,22 @@ def testBadMTime(self): # flip the second bit -- not the first as that one isn't stored in the # .py's mtime in the zip archive. badtime_pyc[11] ^= 0x02 - files = {TESTMOD + ".py": (NOW, test_src), - TESTMOD + pyc_ext: (NOW, badtime_pyc)} + files = {TESTMOD + ".py": test_src, + TESTMOD + pyc_ext: badtime_pyc} self.doTest(".py", files, TESTMOD) def test2038MTime(self): # Make sure we can handle mtimes larger than what a 32-bit signed number # can hold. twenty_thirty_eight_pyc = make_pyc(test_co, 2**32 - 1, len(test_src)) - files = {TESTMOD + ".py": (NOW, test_src), - TESTMOD + pyc_ext: (NOW, twenty_thirty_eight_pyc)} + files = {TESTMOD + ".py": test_src, + TESTMOD + pyc_ext: twenty_thirty_eight_pyc} self.doTest(".py", files, TESTMOD) def testPackage(self): packdir = TESTPACK + os.sep - files = {packdir + "__init__" + pyc_ext: (NOW, test_pyc), - packdir + TESTMOD + pyc_ext: (NOW, test_pyc)} + files = {packdir + "__init__" + pyc_ext: test_pyc, + packdir + TESTMOD + pyc_ext: test_pyc} self.doTest(pyc_ext, files, TESTPACK, TESTMOD) def testSubPackage(self): @@ -271,9 +293,9 @@ def testSubPackage(self): # archives. packdir = TESTPACK + os.sep packdir2 = packdir + TESTPACK2 + os.sep - files = {packdir + "__init__" + pyc_ext: (NOW, test_pyc), - packdir2 + "__init__" + pyc_ext: (NOW, test_pyc), - packdir2 + TESTMOD + pyc_ext: (NOW, test_pyc)} + files = {packdir + "__init__" + pyc_ext: test_pyc, + packdir2 + "__init__" + pyc_ext: test_pyc, + packdir2 + TESTMOD + pyc_ext: test_pyc} self.doTest(pyc_ext, files, TESTPACK, TESTPACK2, TESTMOD) def testSubNamespacePackage(self): @@ -282,9 +304,9 @@ def testSubNamespacePackage(self): packdir = TESTPACK + os.sep packdir2 = packdir + TESTPACK2 + os.sep # The first two files are just directory entries (so have no data). - files = {packdir: (NOW, ""), - packdir2: (NOW, ""), - packdir2 + TESTMOD + pyc_ext: (NOW, test_pyc)} + files = {packdir: None, + packdir2: None, + packdir2 + TESTMOD + pyc_ext: test_pyc} self.doTest(pyc_ext, files, TESTPACK, TESTPACK2, TESTMOD) def testMixedNamespacePackage(self): @@ -292,19 +314,19 @@ def testMixedNamespacePackage(self): # real filesystem and a zip archive. packdir = TESTPACK + os.sep packdir2 = packdir + TESTPACK2 + os.sep - packdir3 = packdir2 + TESTPACK + '3' + os.sep - files1 = {packdir: (NOW, ""), - packdir + TESTMOD + pyc_ext: (NOW, test_pyc), - packdir2: (NOW, ""), - packdir3: (NOW, ""), - packdir3 + TESTMOD + pyc_ext: (NOW, test_pyc), - packdir2 + TESTMOD + '3' + pyc_ext: (NOW, test_pyc), - packdir2 + TESTMOD + pyc_ext: (NOW, test_pyc)} - files2 = {packdir: (NOW, ""), - packdir + TESTMOD + '2' + pyc_ext: (NOW, test_pyc), - packdir2: (NOW, ""), - packdir2 + TESTMOD + '2' + pyc_ext: (NOW, test_pyc), - packdir2 + TESTMOD + pyc_ext: (NOW, test_pyc)} + packdir3 = packdir2 + TESTPACK3 + os.sep + files1 = {packdir: None, + packdir + TESTMOD + pyc_ext: test_pyc, + packdir2: None, + packdir3: None, + packdir3 + TESTMOD + pyc_ext: test_pyc, + packdir2 + TESTMOD3 + pyc_ext: test_pyc, + packdir2 + TESTMOD + pyc_ext: test_pyc} + files2 = {packdir: None, + packdir + TESTMOD2 + pyc_ext: test_pyc, + packdir2: None, + packdir2 + TESTMOD2 + pyc_ext: test_pyc, + packdir2 + TESTMOD + pyc_ext: test_pyc} zip1 = os.path.abspath("path1.zip") self.makeZip(files1, zip1) @@ -337,8 +359,8 @@ def testMixedNamespacePackage(self): mod = importlib.import_module('.'.join((TESTPACK, TESTMOD))) self.assertEqual("path1.zip", mod.__file__.split(os.sep)[-3]) - # And TESTPACK/(TESTMOD + '2') only exists in path2. - mod = importlib.import_module('.'.join((TESTPACK, TESTMOD + '2'))) + # And TESTPACK/(TESTMOD2) only exists in path2. + mod = importlib.import_module('.'.join((TESTPACK, TESTMOD2))) self.assertEqual(os.path.basename(TEMP_DIR), mod.__file__.split(os.sep)[-3]) @@ -355,13 +377,13 @@ def testMixedNamespacePackage(self): self.assertEqual(os.path.basename(TEMP_DIR), mod.__file__.split(os.sep)[-4]) - # subpkg.TESTMOD + '2' only exists in zip2. - mod = importlib.import_module('.'.join((subpkg, TESTMOD + '2'))) + # subpkg.TESTMOD2 only exists in zip2. + mod = importlib.import_module('.'.join((subpkg, TESTMOD2))) self.assertEqual(os.path.basename(TEMP_DIR), mod.__file__.split(os.sep)[-4]) - # Finally subpkg.TESTMOD + '3' only exists in zip1. - mod = importlib.import_module('.'.join((subpkg, TESTMOD + '3'))) + # Finally subpkg.TESTMOD3 only exists in zip1. + mod = importlib.import_module('.'.join((subpkg, TESTMOD3))) self.assertEqual('path1.zip', mod.__file__.split(os.sep)[-4]) def testNamespacePackage(self): @@ -369,22 +391,22 @@ def testNamespacePackage(self): # archives. packdir = TESTPACK + os.sep packdir2 = packdir + TESTPACK2 + os.sep - packdir3 = packdir2 + TESTPACK + '3' + os.sep - files1 = {packdir: (NOW, ""), - packdir + TESTMOD + pyc_ext: (NOW, test_pyc), - packdir2: (NOW, ""), - packdir3: (NOW, ""), - packdir3 + TESTMOD + pyc_ext: (NOW, test_pyc), - packdir2 + TESTMOD + '3' + pyc_ext: (NOW, test_pyc), - packdir2 + TESTMOD + pyc_ext: (NOW, test_pyc)} + packdir3 = packdir2 + TESTPACK3 + os.sep + files1 = {packdir: None, + packdir + TESTMOD + pyc_ext: test_pyc, + packdir2: None, + packdir3: None, + packdir3 + TESTMOD + pyc_ext: test_pyc, + packdir2 + TESTMOD3 + pyc_ext: test_pyc, + packdir2 + TESTMOD + pyc_ext: test_pyc} zip1 = os.path.abspath("path1.zip") self.makeZip(files1, zip1) - files2 = {packdir: (NOW, ""), - packdir + TESTMOD + '2' + pyc_ext: (NOW, test_pyc), - packdir2: (NOW, ""), - packdir2 + TESTMOD + '2' + pyc_ext: (NOW, test_pyc), - packdir2 + TESTMOD + pyc_ext: (NOW, test_pyc)} + files2 = {packdir: None, + packdir + TESTMOD2 + pyc_ext: test_pyc, + packdir2: None, + packdir2 + TESTMOD2 + pyc_ext: test_pyc, + packdir2 + TESTMOD + pyc_ext: test_pyc} zip2 = os.path.abspath("path2.zip") self.makeZip(files2, zip2) @@ -413,8 +435,8 @@ def testNamespacePackage(self): mod = importlib.import_module('.'.join((TESTPACK, TESTMOD))) self.assertEqual("path1.zip", mod.__file__.split(os.sep)[-3]) - # And TESTPACK/(TESTMOD + '2') only exists in path2. - mod = importlib.import_module('.'.join((TESTPACK, TESTMOD + '2'))) + # And TESTPACK/(TESTMOD2) only exists in path2. + mod = importlib.import_module('.'.join((TESTPACK, TESTMOD2))) self.assertEqual("path2.zip", mod.__file__.split(os.sep)[-3]) # One level deeper... @@ -429,29 +451,22 @@ def testNamespacePackage(self): mod = importlib.import_module('.'.join((subpkg, TESTMOD))) self.assertEqual('path2.zip', mod.__file__.split(os.sep)[-4]) - # subpkg.TESTMOD + '2' only exists in zip2. - mod = importlib.import_module('.'.join((subpkg, TESTMOD + '2'))) + # subpkg.TESTMOD2 only exists in zip2. + mod = importlib.import_module('.'.join((subpkg, TESTMOD2))) self.assertEqual('path2.zip', mod.__file__.split(os.sep)[-4]) - # Finally subpkg.TESTMOD + '3' only exists in zip1. - mod = importlib.import_module('.'.join((subpkg, TESTMOD + '3'))) + # Finally subpkg.TESTMOD3 only exists in zip1. + mod = importlib.import_module('.'.join((subpkg, TESTMOD3))) self.assertEqual('path1.zip', mod.__file__.split(os.sep)[-4]) def testZipImporterMethods(self): packdir = TESTPACK + os.sep packdir2 = packdir + TESTPACK2 + os.sep - files = {packdir + "__init__" + pyc_ext: (NOW, test_pyc), - packdir2 + "__init__" + pyc_ext: (NOW, test_pyc), - packdir2 + TESTMOD + pyc_ext: (NOW, test_pyc), - "spam" + pyc_ext: (NOW, test_pyc)} - - self.addCleanup(os_helper.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) + files = {packdir + "__init__" + pyc_ext: test_pyc, + packdir2 + "__init__" + pyc_ext: test_pyc, + packdir2 + TESTMOD + pyc_ext: test_pyc, + "spam" + pyc_ext: test_pyc} + self.makeZip(files, file_comment=b"spam") zi = zipimport.zipimporter(TEMP_ZIP) self.assertEqual(zi.archive, TEMP_ZIP) @@ -507,17 +522,11 @@ def testZipImporterMethods(self): def testInvalidateCaches(self): packdir = TESTPACK + os.sep packdir2 = packdir + TESTPACK2 + os.sep - files = {packdir + "__init__" + pyc_ext: (NOW, test_pyc), - packdir2 + "__init__" + pyc_ext: (NOW, test_pyc), - packdir2 + TESTMOD + pyc_ext: (NOW, test_pyc), - "spam" + pyc_ext: (NOW, test_pyc)} - self.addCleanup(os_helper.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) + files = {packdir + "__init__" + pyc_ext: test_pyc, + packdir2 + "__init__" + pyc_ext: test_pyc, + packdir2 + TESTMOD + pyc_ext: test_pyc, + "spam" + pyc_ext: test_pyc} + self.makeZip(files, file_comment=b"spam") zi = zipimport.zipimporter(TEMP_ZIP) self.assertEqual(zi._files.keys(), files.keys()) @@ -525,14 +534,10 @@ def testInvalidateCaches(self): zi.invalidate_caches() self.assertEqual(zi._files.keys(), files.keys()) # Add a new file to the ZIP archive - newfile = {"spam2" + pyc_ext: (NOW, test_pyc)} + newfile = {"spam2" + pyc_ext: test_pyc} files.update(newfile) - with ZipFile(TEMP_ZIP, "a") as z: - for name, (mtime, data) in newfile.items(): - zinfo = ZipInfo(name, time.localtime(mtime)) - zinfo.compress_type = self.compression - zinfo.comment = b"spam" - z.writestr(zinfo, data) + with ZipFile(TEMP_ZIP, "a", compression=self.compression) as z: + self.writeZip(z, newfile, file_comment=b"spam") # Check that we can detect the new file after invalidating the cache zi.invalidate_caches() self.assertEqual(zi._files.keys(), files.keys()) @@ -549,16 +554,9 @@ def testInvalidateCaches(self): def testZipImporterMethodsInSubDirectory(self): packdir = TESTPACK + os.sep packdir2 = packdir + TESTPACK2 + os.sep - files = {packdir2 + "__init__" + pyc_ext: (NOW, test_pyc), - packdir2 + TESTMOD + pyc_ext: (NOW, test_pyc)} - - self.addCleanup(os_helper.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) + files = {packdir2 + "__init__" + pyc_ext: test_pyc, + packdir2 + TESTMOD + pyc_ext: test_pyc} + self.makeZip(files, file_comment=b"eggs") zi = zipimport.zipimporter(TEMP_ZIP + os.sep + packdir) self.assertEqual(zi.archive, TEMP_ZIP) @@ -623,9 +621,9 @@ def get_file(): if __loader__.get_data("some.data") != b"some data": raise AssertionError("bad data")\n""" pyc = make_pyc(compile(src, "", "exec"), NOW, len(src)) - files = {TESTMOD + pyc_ext: (NOW, pyc), - "some.data": (NOW, "some data")} - self.doTest(pyc_ext, files, TESTMOD) + files = {TESTMOD + pyc_ext: pyc, + "some.data": "some data"} + self.doTest(pyc_ext, files, TESTMOD, prefix='') def testDefaultOptimizationLevel(self): # zipimport should use the default optimization level (#28131) @@ -633,7 +631,7 @@ def testDefaultOptimizationLevel(self): def test(val): assert(val) return val\n""" - files = {TESTMOD + '.py': (NOW, src)} + files = {TESTMOD + '.py': src} self.makeZip(files) sys.path.insert(0, TEMP_ZIP) mod = importlib.import_module(TESTMOD) @@ -646,7 +644,7 @@ def test(val): def testImport_WithStuff(self): # try importing from a zipfile which contains additional # stuff at the beginning of the file - files = {TESTMOD + ".py": (NOW, test_src)} + files = {TESTMOD + ".py": test_src} self.doTest(".py", files, TESTMOD, stuff=b"Some Stuff"*31) @@ -654,18 +652,18 @@ def assertModuleSource(self, module): self.assertEqual(inspect.getsource(module), test_src) def testGetSource(self): - files = {TESTMOD + ".py": (NOW, test_src)} + files = {TESTMOD + ".py": test_src} self.doTest(".py", files, TESTMOD, call=self.assertModuleSource) def testGetCompiledSource(self): pyc = make_pyc(compile(test_src, "", "exec"), NOW, len(test_src)) - files = {TESTMOD + ".py": (NOW, test_src), - TESTMOD + pyc_ext: (NOW, pyc)} + files = {TESTMOD + ".py": test_src, + TESTMOD + pyc_ext: pyc} self.doTest(pyc_ext, files, TESTMOD, call=self.assertModuleSource) def runDoctest(self, callback): - files = {TESTMOD + ".py": (NOW, test_src), - "xyz.txt": (NOW, ">>> log.append(True)\n")} + files = {TESTMOD + ".py": test_src, + "xyz.txt": ">>> log.append(True)\n"} self.doTest(".py", files, TESTMOD, call=callback) def doDoctestFile(self, module): @@ -717,29 +715,21 @@ def doTraceback(self, module): raise AssertionError("This ought to be impossible") def testTraceback(self): - files = {TESTMOD + ".py": (NOW, raise_src)} + files = {TESTMOD + ".py": raise_src} self.doTest(None, files, TESTMOD, call=self.doTraceback) @unittest.skipIf(os_helper.TESTFN_UNENCODABLE is None, "need an unencodable filename") def testUnencodable(self): filename = os_helper.TESTFN_UNENCODABLE + ".zip" - self.addCleanup(os_helper.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) + self.makeZip({TESTMOD + ".py": test_src}, filename) spec = zipimport.zipimporter(filename).find_spec(TESTMOD) mod = importlib.util.module_from_spec(spec) spec.loader.exec_module(mod) def testBytesPath(self): filename = os_helper.TESTFN + ".zip" - self.addCleanup(os_helper.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) + self.makeZip({TESTMOD + ".py": test_src}, filename) zipimport.zipimporter(filename) with self.assertRaises(TypeError): @@ -750,15 +740,15 @@ def testBytesPath(self): zipimport.zipimporter(memoryview(os.fsencode(filename))) def testComment(self): - files = {TESTMOD + ".py": (NOW, test_src)} + files = {TESTMOD + ".py": test_src} self.doTest(".py", files, TESTMOD, comment=b"comment") def testBeginningCruftAndComment(self): - files = {TESTMOD + ".py": (NOW, test_src)} + files = {TESTMOD + ".py": test_src} self.doTest(".py", files, TESTMOD, stuff=b"cruft" * 64, comment=b"hi") def testLargestPossibleComment(self): - files = {TESTMOD + ".py": (NOW, test_src)} + files = {TESTMOD + ".py": test_src} self.doTest(".py", files, TESTMOD, comment=b"c" * ((1 << 16) - 1)) diff --git a/Lib/test/test_zlib.py b/Lib/test/test_zlib.py index 0a13986a..9611a0d2 100644 --- a/Lib/test/test_zlib.py +++ b/Lib/test/test_zlib.py @@ -7,7 +7,7 @@ import pickle import random import sys -from test.support import bigmemtest, _1G, _4G, skip_on_s390x +from test.support import bigmemtest, _1G, _4G, is_s390x zlib = import_helper.import_module('zlib') @@ -34,8 +34,9 @@ def _zlib_runtime_version_tuple(zlib_version=zlib.ZLIB_RUNTIME_VERSION): ZLIB_RUNTIME_VERSION_TUPLE = _zlib_runtime_version_tuple() -# bpo-46623: On s390x, when a hardware accelerator is used, using different -# ways to compress data with zlib can produce different compressed data. +# bpo-46623: When a hardware accelerator is used (currently only on s390x), +# using different ways to compress data with zlib can produce different +# compressed data. # Simplified test_pair() code: # # def func1(data): @@ -58,8 +59,10 @@ def _zlib_runtime_version_tuple(zlib_version=zlib.ZLIB_RUNTIME_VERSION): # # zlib.decompress(func1(data)) == zlib.decompress(func2(data)) == data # -# Make the assumption that s390x always has an accelerator to simplify the skip -# condition. +# To simplify the skip condition, make the assumption that s390x always has an +# accelerator, and nothing else has it. +HW_ACCELERATED = is_s390x + class VersionTestCase(unittest.TestCase): @@ -224,12 +227,14 @@ def test_keywords(self): bufsize=zlib.DEF_BUF_SIZE), HAMLET_SCENE) - @skip_on_s390x def test_speech128(self): # compress more data data = HAMLET_SCENE * 128 x = zlib.compress(data) - self.assertEqual(zlib.compress(bytearray(data)), x) + # With hardware acceleration, the compressed bytes + # might not be identical. + if not HW_ACCELERATED: + self.assertEqual(zlib.compress(bytearray(data)), x) for ob in x, bytearray(x): self.assertEqual(zlib.decompress(ob), data) @@ -276,7 +281,6 @@ def test_64bit_compress(self, size): class CompressObjectTestCase(BaseCompressTestCase, unittest.TestCase): # Test compression object - @skip_on_s390x def test_pair(self): # straightforward compress/decompress objects datasrc = HAMLET_SCENE * 128 @@ -287,7 +291,10 @@ def test_pair(self): x1 = co.compress(data) x2 = co.flush() self.assertRaises(zlib.error, co.flush) # second flush should not work - self.assertEqual(x1 + x2, datazip) + # With hardware acceleration, the compressed bytes might not + # be identical. + if not HW_ACCELERATED: + self.assertEqual(x1 + x2, datazip) for v1, v2 in ((x1, x2), (bytearray(x1), bytearray(x2))): dco = zlib.decompressobj() y1 = dco.decompress(v1 + v2) @@ -499,20 +506,16 @@ def test_flushes(self): for sync in sync_opt: for level in range(10): - try: + with self.subTest(sync=sync, level=level): obj = zlib.compressobj( level ) a = obj.compress( data[:3000] ) b = obj.flush( sync ) c = obj.compress( data[3000:] ) d = obj.flush() - except: - print("Error for flush mode={}, level={}" - .format(sync, level)) - raise - self.assertEqual(zlib.decompress(b''.join([a,b,c,d])), - data, ("Decompress failed: flush " - "mode=%i, level=%i") % (sync, level)) - del obj + self.assertEqual(zlib.decompress(b''.join([a,b,c,d])), + data, ("Decompress failed: flush " + "mode=%i, level=%i") % (sync, level)) + del obj @unittest.skipUnless(hasattr(zlib, 'Z_SYNC_FLUSH'), 'requires zlib.Z_SYNC_FLUSH') diff --git a/Lib/test/translationdata/argparse/msgids.txt b/Lib/test/translationdata/argparse/msgids.txt new file mode 100644 index 00000000..a1b4f94d --- /dev/null +++ b/Lib/test/translationdata/argparse/msgids.txt @@ -0,0 +1,36 @@ + (default: %(default)s) +%(heading)s: +%(prog)s: error: %(message)s\n +%r is not callable +'required' is an invalid argument for positionals +.__call__() not defined +ambiguous option: %(option)s could match %(matches)s +argument "-" with mode %r +argument %(argument_name)s: %(message)s +can't open '%(filename)s': %(error)s +cannot have multiple subparser arguments +cannot merge actions - two groups are named %r +conflicting subparser alias: %s +conflicting subparser: %s +dest= is required for options like %r +expected at least one argument +expected at most one argument +expected one argument +ignored explicit argument %r +invalid %(type)s value: %(value)r +invalid choice: %(value)r (choose from %(choices)s) +invalid conflict_resolution value: %r +invalid option string %(option)r: must start with a character %(prefix_chars)r +mutually exclusive arguments must be optional +not allowed with argument %s +one of the arguments %s is required +options +positional arguments +show program's version number and exit +show this help message and exit +subcommands +the following arguments are required: %s +unexpected option string: %s +unknown parser %(parser_name)r (choices: %(choices)s) +unrecognized arguments: %s +usage: \ No newline at end of file diff --git a/Lib/test/translationdata/getopt/msgids.txt b/Lib/test/translationdata/getopt/msgids.txt new file mode 100644 index 00000000..1ffab1f3 --- /dev/null +++ b/Lib/test/translationdata/getopt/msgids.txt @@ -0,0 +1,6 @@ +option -%s not recognized +option -%s requires argument +option --%s must not have an argument +option --%s not a unique prefix +option --%s not recognized +option --%s requires argument \ No newline at end of file diff --git a/Lib/test/translationdata/optparse/msgids.txt b/Lib/test/translationdata/optparse/msgids.txt new file mode 100644 index 00000000..ac5317c7 --- /dev/null +++ b/Lib/test/translationdata/optparse/msgids.txt @@ -0,0 +1,14 @@ +%prog [options] +%s option does not take a value +Options +Usage +Usage: %s\n +ambiguous option: %s (%s?) +complex +floating-point +integer +no such option: %s +option %s: invalid %s value: %r +option %s: invalid choice: %r (choose from %s) +show program's version number and exit +show this help message and exit \ No newline at end of file diff --git a/Lib/test/typinganndata/ann_module695.py b/Lib/test/typinganndata/ann_module695.py index 2ede9fe3..b6f3b06b 100644 --- a/Lib/test/typinganndata/ann_module695.py +++ b/Lib/test/typinganndata/ann_module695.py @@ -17,6 +17,56 @@ class B[T, *Ts, **P]: z: P +Eggs = int +Spam = str + + +class C[Eggs, **Spam]: + x: Eggs + y: Spam + + def generic_function[T, *Ts, **P]( x: T, *y: *Ts, z: P.args, zz: P.kwargs ) -> None: ... + + +def generic_function_2[Eggs, **Spam](x: Eggs, y: Spam): pass + + +class D: + Foo = int + Bar = str + + def generic_method[Foo, **Bar]( + self, x: Foo, y: Bar + ) -> None: ... + + def generic_method_2[Eggs, **Spam](self, x: Eggs, y: Spam): pass + + +def nested(): + from types import SimpleNamespace + from typing import get_type_hints + + Eggs = bytes + Spam = memoryview + + + class E[Eggs, **Spam]: + x: Eggs + y: Spam + + def generic_method[Eggs, **Spam](self, x: Eggs, y: Spam): pass + + + def generic_function[Eggs, **Spam](x: Eggs, y: Spam): pass + + + return SimpleNamespace( + E=E, + hints_for_E=get_type_hints(E), + hints_for_E_meth=get_type_hints(E.generic_method), + generic_func=generic_function, + hints_for_generic_func=get_type_hints(generic_function) + ) diff --git a/Lib/threading.py b/Lib/threading.py index 98cb43c6..0bba85d0 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -332,7 +332,7 @@ def wait(self, timeout=None): awakened or timed out, it re-acquires the lock and returns. When the timeout argument is present and not None, it should be a - floating point number specifying a timeout for the operation in seconds + floating-point number specifying a timeout for the operation in seconds (or fractions thereof). When the underlying lock is an RLock, it is not released using its @@ -642,7 +642,7 @@ def wait(self, timeout=None): the optional timeout occurs. When the timeout argument is present and not None, it should be a - floating point number specifying a timeout for the operation in seconds + floating-point number specifying a timeout for the operation in seconds (or fractions thereof). This method returns the internal flag on exit, so it will always return @@ -685,6 +685,8 @@ def __init__(self, parties, action=None, timeout=None): default for all subsequent 'wait()' calls. """ + if parties < 1: + raise ValueError("parties must be > 0") self._cond = Condition(Lock()) self._action = action self._timeout = timeout @@ -1120,7 +1122,7 @@ def join(self, timeout=None): or until the optional timeout occurs. When the timeout argument is present and not None, it should be a - floating point number specifying a timeout for the operation in seconds + floating-point number specifying a timeout for the operation in seconds (or fractions thereof). As join() always returns None, you must call is_alive() after join() to decide whether a timeout happened -- if the thread is still alive, the join() call timed out. diff --git a/Lib/tkinter/simpledialog.py b/Lib/tkinter/simpledialog.py index 538bbfc3..2c1417f7 100644 --- a/Lib/tkinter/simpledialog.py +++ b/Lib/tkinter/simpledialog.py @@ -357,7 +357,7 @@ def askinteger(title, prompt, **kw): class _QueryFloat(_QueryDialog): - errormessage = "Not a floating point value." + errormessage = "Not a floating-point value." def getresult(self): return self.getdouble(self.entry.get()) diff --git a/Lib/tkinter/ttk.py b/Lib/tkinter/ttk.py index efeabb7a..5d1c9d77 100644 --- a/Lib/tkinter/ttk.py +++ b/Lib/tkinter/ttk.py @@ -683,7 +683,10 @@ def current(self, newindex=None): returns the index of the current value in the list of values or -1 if the current value does not appear in the list.""" if newindex is None: - return self.tk.getint(self.tk.call(self._w, "current")) + res = self.tk.call(self._w, "current") + if res == '': + return -1 + return self.tk.getint(res) return self.tk.call(self._w, "current", newindex) @@ -1515,7 +1518,7 @@ def __init__(self, master=None, variable=None, from_=0, to=10, **kw): self.label.place(anchor='n' if label_side == 'top' else 's') # update the label as scale or variable changes - self.__tracecb = self._variable.trace_variable('w', self._adjust) + self.__tracecb = self._variable.trace_add('write', self._adjust) self.bind('', self._adjust) self.bind('', self._adjust) @@ -1523,7 +1526,7 @@ def __init__(self, master=None, variable=None, from_=0, to=10, **kw): def destroy(self): """Destroy this widget and possibly its associated variable.""" try: - self._variable.trace_vdelete('w', self.__tracecb) + self._variable.trace_remove('write', self.__tracecb) except AttributeError: pass else: diff --git a/Lib/token.py b/Lib/token.py index 487f6edd..e26d36bd 100644 --- a/Lib/token.py +++ b/Lib/token.py @@ -1,7 +1,8 @@ """Token constants.""" # Auto-generated by Tools/build/generate_token.py -__all__ = ['tok_name', 'ISTERMINAL', 'ISNONTERMINAL', 'ISEOF'] +__all__ = ['tok_name', 'ISTERMINAL', 'ISNONTERMINAL', 'ISEOF', + 'EXACT_TOKEN_TYPES'] ENDMARKER = 0 NAME = 1 diff --git a/Lib/tokenize.py b/Lib/tokenize.py index 7af7a5cc..b2dff8e6 100644 --- a/Lib/tokenize.py +++ b/Lib/tokenize.py @@ -202,7 +202,7 @@ def escape_brackets(self, token): characters[-2::-1] ) ) - if n_backslashes % 2 == 0: + if n_backslashes % 2 == 0 or characters[-1] != "N": characters.append(character) else: consume_until_next_bracket = True diff --git a/Lib/turtle.py b/Lib/turtle.py index 811c5dfa..92ac58f8 100644 --- a/Lib/turtle.py +++ b/Lib/turtle.py @@ -1719,7 +1719,7 @@ def xcor(self): >>> reset() >>> turtle.left(60) >>> turtle.forward(100) - >>> print turtle.xcor() + >>> print(turtle.xcor()) 50.0 """ return self._position[0] @@ -1733,7 +1733,7 @@ def ycor(self): >>> reset() >>> turtle.left(60) >>> turtle.forward(100) - >>> print turtle.ycor() + >>> print(turtle.ycor()) 86.6025403784 """ return self._position[1] @@ -2336,7 +2336,7 @@ def isvisible(self): Example (for a Turtle instance named turtle): >>> turtle.hideturtle() - >>> print turtle.isvisible(): + >>> print(turtle.isvisible()) False """ return self._shown diff --git a/Lib/turtledemo/clock.py b/Lib/turtledemo/clock.py index 9f8585bd..318f1260 100755 --- a/Lib/turtledemo/clock.py +++ b/Lib/turtledemo/clock.py @@ -1,8 +1,7 @@ #!/usr/bin/env python3 -# -*- coding: cp1252 -*- """ turtle-example-suite: - tdemo_clock.py + turtledemo/clock.py Enhanced clock-program, showing date and time @@ -13,6 +12,9 @@ from turtle import * from datetime import datetime +dtfont = "TkFixedFont", 14, "bold" +current_day = None + def jump(distanz, winkel=0): penup() right(winkel) @@ -53,11 +55,23 @@ def clockface(radius): jump(-radius) rt(6) +def display_date_time(): + global current_day + writer.clear() + now = datetime.now() + current_day = now.day + writer.home() + writer.forward(distance=65) + writer.write(wochentag(now), align="center", font=dtfont) + writer.back(distance=150) + writer.write(datum(now), align="center", font=dtfont) + writer.forward(distance=85) + def setup(): global second_hand, minute_hand, hour_hand, writer mode("logo") make_hand_shape("second_hand", 125, 25) - make_hand_shape("minute_hand", 130, 25) + make_hand_shape("minute_hand", 115, 25) make_hand_shape("hour_hand", 90, 25) clockface(160) second_hand = Turtle() @@ -75,10 +89,10 @@ def setup(): hand.speed(0) ht() writer = Turtle() - #writer.mode("logo") writer.ht() writer.pu() writer.bk(85) + display_date_time() def wochentag(t): wochentag = ["Monday", "Tuesday", "Wednesday", @@ -100,18 +114,11 @@ def tick(): stunde = t.hour + minute/60.0 try: tracer(False) # Terminator can occur here - writer.clear() - writer.home() - writer.forward(65) - writer.write(wochentag(t), - align="center", font=("Courier", 14, "bold")) - writer.back(150) - writer.write(datum(t), - align="center", font=("Courier", 14, "bold")) - writer.forward(85) second_hand.setheading(6*sekunde) # or here minute_hand.setheading(6*minute) hour_hand.setheading(30*stunde) + if t.day != current_day: + display_date_time() tracer(True) ontimer(tick, 100) except Terminator: diff --git a/Lib/turtledemo/sorting_animate.py b/Lib/turtledemo/sorting_animate.py index d25a0ab6..1c6aae80 100755 --- a/Lib/turtledemo/sorting_animate.py +++ b/Lib/turtledemo/sorting_animate.py @@ -7,7 +7,7 @@ Sorts a shelf of 10 blocks using insertion sort, selection sort and quicksort. -Shelfs are implemented using builtin lists. +Shelves are implemented using builtin lists. Blocks are turtles with shape "square", but stretched to rectangles by shapesize() diff --git a/Lib/typing.py b/Lib/typing.py index 882dc4da..a271416d 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -927,15 +927,24 @@ def _evaluate(self, globalns, localns, type_params=None, *, recursive_guard): globalns = getattr( sys.modules.get(self.__forward_module__, None), '__dict__', globalns ) + + # type parameters require some special handling, + # as they exist in their own scope + # but `eval()` does not have a dedicated parameter for that scope. + # For classes, names in type parameter scopes should override + # names in the global scope (which here are called `localns`!), + # but should in turn be overridden by names in the class scope + # (which here are called `globalns`!) if type_params: - # "Inject" type parameters into the local namespace - # (unless they are shadowed by assignments *in* the local namespace), - # as a way of emulating annotation scopes when calling `eval()` - locals_to_pass = {param.__name__: param for param in type_params} | localns - else: - locals_to_pass = localns + globalns, localns = dict(globalns), dict(localns) + for param in type_params: + param_name = param.__name__ + if not self.__forward_is_class__ or param_name not in globalns: + globalns[param_name] = param + localns.pop(param_name, None) + type_ = _type_check( - eval(self.__forward_code__, globalns, locals_to_pass), + eval(self.__forward_code__, globalns, localns), "Forward references must evaluate to types.", is_argument=self.__forward_is_argument__, allow_special_forms=self.__forward_is_class__, @@ -1806,7 +1815,8 @@ def _allow_reckless_class_checks(depth=2): _PROTO_ALLOWLIST = { 'collections.abc': [ 'Callable', 'Awaitable', 'Iterable', 'Iterator', 'AsyncIterable', - 'Hashable', 'Sized', 'Container', 'Collection', 'Reversible', 'Buffer', + 'AsyncIterator', 'Hashable', 'Sized', 'Container', 'Collection', + 'Reversible', 'Buffer', ], 'contextlib': ['AbstractContextManager', 'AbstractAsyncContextManager'], } diff --git a/Lib/unittest/async_case.py b/Lib/unittest/async_case.py index bd2a4711..2abfb790 100644 --- a/Lib/unittest/async_case.py +++ b/Lib/unittest/async_case.py @@ -5,6 +5,7 @@ from .case import TestCase +__unittest = True class IsolatedAsyncioTestCase(TestCase): # Names intentionally have a long prefix diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 486e0c63..c4ce8f8a 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -598,7 +598,9 @@ def __set_side_effect(self, value): side_effect = property(__get_side_effect, __set_side_effect) - def reset_mock(self, visited=None,*, return_value=False, side_effect=False): + def reset_mock(self, visited=None, *, + return_value: bool = False, + side_effect: bool = False): "Restore the mock object to its initial state." if visited is None: visited = [] @@ -800,6 +802,9 @@ def __setattr__(self, name, value): mock_name = f'{self._extract_mock_name()}.{name}' raise AttributeError(f'Cannot set {mock_name}') + if isinstance(value, PropertyMock): + self.__dict__[name] = value + return return object.__setattr__(self, name, value) @@ -1324,6 +1329,7 @@ def __init__( self.autospec = autospec self.kwargs = kwargs self.additional_patchers = [] + self.is_started = False def copy(self): @@ -1436,6 +1442,9 @@ def get_original(self): def __enter__(self): """Perform the patch.""" + if self.is_started: + raise RuntimeError("Patch is already started") + new, spec, spec_set = self.new, self.spec, self.spec_set autospec, kwargs = self.autospec, self.kwargs new_callable = self.new_callable @@ -1478,13 +1487,12 @@ def __enter__(self): if isinstance(original, type): # If we're patching out a class and there is a spec inherit = True - if spec is None and _is_async_obj(original): - Klass = AsyncMock - else: - Klass = MagicMock - _kwargs = {} + + # Determine the Klass to use if new_callable is not None: Klass = new_callable + elif spec is None and _is_async_obj(original): + Klass = AsyncMock elif spec is not None or spec_set is not None: this_spec = spec if spec_set is not None: @@ -1497,7 +1505,12 @@ def __enter__(self): Klass = AsyncMock elif not_callable: Klass = NonCallableMagicMock + else: + Klass = MagicMock + else: + Klass = MagicMock + _kwargs = {} if spec is not None: _kwargs['spec'] = spec if spec_set is not None: @@ -1563,6 +1576,7 @@ def __enter__(self): self.temp_original = original self.is_local = local self._exit_stack = contextlib.ExitStack() + self.is_started = True try: setattr(self.target, self.attribute, new_attr) if self.attribute_name is not None: @@ -1582,6 +1596,9 @@ def __enter__(self): def __exit__(self, *exc_info): """Undo the patch.""" + if not self.is_started: + return + if self.is_local and self.temp_original is not DEFAULT: setattr(self.target, self.attribute, self.temp_original) else: @@ -1598,6 +1615,7 @@ def __exit__(self, *exc_info): del self.target exit_stack = self._exit_stack del self._exit_stack + self.is_started = False return exit_stack.__exit__(*exc_info) @@ -2182,6 +2200,17 @@ def mock_add_spec(self, spec, spec_set=False): self._mock_add_spec(spec, spec_set) self._mock_set_magics() + def reset_mock(self, /, *args, return_value: bool = False, **kwargs): + if ( + return_value + and self._mock_name + and _is_magic(self._mock_name) + ): + # Don't reset return values for magic methods, + # otherwise `m.__str__` will start + # to return `MagicMock` instances, instead of `str` instances. + return_value = False + super().reset_mock(*args, return_value=return_value, **kwargs) class MagicProxy(Base): @@ -2718,6 +2747,12 @@ def create_autospec(spec, spec_set=False, instance=False, _parent=None, if not unsafe: _check_spec_arg_typos(kwargs) + _name = kwargs.pop('name', _name) + _new_name = _name + if _parent is None: + # for a top level object no _new_name should be set + _new_name = '' + _kwargs.update(kwargs) Klass = MagicMock @@ -2735,13 +2770,6 @@ def create_autospec(spec, spec_set=False, instance=False, _parent=None, elif is_type and instance and not _instance_callable(spec): Klass = NonCallableMagicMock - _name = _kwargs.pop('name', _name) - - _new_name = _name - if _parent is None: - # for a top level object no _new_name should be set - _new_name = '' - mock = Klass(parent=_parent, _new_parent=_parent, _new_name=_new_name, name=_name, **_kwargs) diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index 3932bb99..24815952 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -525,9 +525,13 @@ def urlunsplit(components): empty query; the RFC states that these are equivalent).""" scheme, netloc, url, query, fragment, _coerce_result = ( _coerce_args(*components)) - if netloc or (scheme and scheme in uses_netloc) or url[:2] == '//': + if netloc: if url and url[:1] != '/': url = '/' + url - url = '//' + (netloc or '') + url + url = '//' + netloc + url + elif url[:2] == '//': + url = '//' + url + elif scheme and scheme in uses_netloc and (not url or url[:1] == '/'): + url = '//' + url if scheme: url = scheme + ':' + url if query: diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index 7228a355..9a559f44 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -1681,12 +1681,27 @@ def data_open(self, req): def url2pathname(pathname): """OS-specific conversion from a relative URL of the 'file' scheme to a file system path; not recommended for general use.""" - return unquote(pathname) + if pathname[:3] == '///': + # URL has an empty authority section, so the path begins on the + # third character. + pathname = pathname[2:] + elif pathname[:12] == '//localhost/': + # Skip past 'localhost' authority. + pathname = pathname[11:] + encoding = sys.getfilesystemencoding() + errors = sys.getfilesystemencodeerrors() + return unquote(pathname, encoding=encoding, errors=errors) def pathname2url(pathname): """OS-specific conversion from a file system path to a relative URL of the 'file' scheme; not recommended for general use.""" - return quote(pathname) + if pathname[:2] == '//': + # Add explicitly empty authority to avoid interpreting the path + # as authority. + pathname = '//' + pathname + encoding = sys.getfilesystemencoding() + errors = sys.getfilesystemencodeerrors() + return quote(pathname, encoding=encoding, errors=errors) ftpcache = {} diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py index d5dec4ab..aeb522c3 100644 --- a/Lib/venv/__init__.py +++ b/Lib/venv/__init__.py @@ -11,6 +11,7 @@ import sys import sysconfig import types +import shlex CORE_VENV_DEPS = ('pip',) @@ -422,11 +423,41 @@ def replace_variables(self, text, context): :param context: The information for the environment creation request being processed. """ - text = text.replace('__VENV_DIR__', context.env_dir) - text = text.replace('__VENV_NAME__', context.env_name) - text = text.replace('__VENV_PROMPT__', context.prompt) - text = text.replace('__VENV_BIN_NAME__', context.bin_name) - text = text.replace('__VENV_PYTHON__', context.env_exe) + replacements = { + '__VENV_DIR__': context.env_dir, + '__VENV_NAME__': context.env_name, + '__VENV_PROMPT__': context.prompt, + '__VENV_BIN_NAME__': context.bin_name, + '__VENV_PYTHON__': context.env_exe, + } + + def quote_ps1(s): + """ + This should satisfy PowerShell quoting rules [1], unless the quoted + string is passed directly to Windows native commands [2]. + [1]: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_quoting_rules + [2]: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_parsing#passing-arguments-that-contain-quote-characters + """ + s = s.replace("'", "''") + return f"'{s}'" + + def quote_bat(s): + return s + + # gh-124651: need to quote the template strings properly + quote = shlex.quote + script_path = context.script_path + if script_path.endswith('.ps1'): + quote = quote_ps1 + elif script_path.endswith('.bat'): + quote = quote_bat + else: + # fallbacks to POSIX shell compliant quote + quote = shlex.quote + + replacements = {key: quote(s) for key, s in replacements.items()} + for key, quoted in replacements.items(): + text = text.replace(key, quoted) return text def install_scripts(self, context, path): @@ -466,6 +497,7 @@ def install_scripts(self, context, path): with open(srcfile, 'rb') as f: data = f.read() if not srcfile.endswith(('.exe', '.pdb')): + context.script_path = srcfile try: data = data.decode('utf-8') data = self.replace_variables(data, context) diff --git a/Lib/venv/scripts/common/activate b/Lib/venv/scripts/common/activate index d5914e0c..74825877 100644 --- a/Lib/venv/scripts/common/activate +++ b/Lib/venv/scripts/common/activate @@ -14,8 +14,9 @@ deactivate () { unset _OLD_VIRTUAL_PYTHONHOME fi - # Call hash to forget past commands. Without forgetting - # past commands the $PATH changes we made may not be respected + # Call hash to forget past locations. Without forgetting + # past locations the $PATH changes we made may not be respected. + # See "man bash" for more details. hash is usually a builtin of your shell hash -r 2> /dev/null if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then @@ -39,14 +40,14 @@ deactivate nondestructive if [ "${OSTYPE:-}" = "cygwin" ] || [ "${OSTYPE:-}" = "msys" ] ; then # transform D:\path\to\venv to /d/path/to/venv on MSYS # and to /cygdrive/d/path/to/venv on Cygwin - export VIRTUAL_ENV=$(cygpath "__VENV_DIR__") + export VIRTUAL_ENV=$(cygpath __VENV_DIR__) else # use the path as-is - export VIRTUAL_ENV="__VENV_DIR__" + export VIRTUAL_ENV=__VENV_DIR__ fi _OLD_VIRTUAL_PATH="$PATH" -PATH="$VIRTUAL_ENV/__VENV_BIN_NAME__:$PATH" +PATH="$VIRTUAL_ENV/"__VENV_BIN_NAME__":$PATH" export PATH # unset PYTHONHOME if set @@ -59,9 +60,9 @@ fi if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then _OLD_VIRTUAL_PS1="${PS1:-}" - PS1="__VENV_PROMPT__${PS1:-}" + PS1=__VENV_PROMPT__"${PS1:-}" export PS1 - VIRTUAL_ENV_PROMPT="__VENV_PROMPT__" + VIRTUAL_ENV_PROMPT=__VENV_PROMPT__ export VIRTUAL_ENV_PROMPT fi diff --git a/Lib/venv/scripts/nt/activate.bat b/Lib/venv/scripts/nt/activate.bat index 5daa45af..c2c6dd29 100644 --- a/Lib/venv/scripts/nt/activate.bat +++ b/Lib/venv/scripts/nt/activate.bat @@ -8,7 +8,7 @@ if defined _OLD_CODEPAGE ( "%SystemRoot%\System32\chcp.com" 65001 > nul ) -set VIRTUAL_ENV=__VENV_DIR__ +set "VIRTUAL_ENV=__VENV_DIR__" if not defined PROMPT set PROMPT=$P$G @@ -24,8 +24,8 @@ set PYTHONHOME= if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH% if not defined _OLD_VIRTUAL_PATH set _OLD_VIRTUAL_PATH=%PATH% -set PATH=%VIRTUAL_ENV%\__VENV_BIN_NAME__;%PATH% -set VIRTUAL_ENV_PROMPT=__VENV_PROMPT__ +set "PATH=%VIRTUAL_ENV%\__VENV_BIN_NAME__;%PATH%" +set "VIRTUAL_ENV_PROMPT=__VENV_PROMPT__" :END if defined _OLD_CODEPAGE ( diff --git a/Lib/venv/scripts/posix/activate.csh b/Lib/venv/scripts/posix/activate.csh index 5e8d66fa..08f79296 100644 --- a/Lib/venv/scripts/posix/activate.csh +++ b/Lib/venv/scripts/posix/activate.csh @@ -9,17 +9,17 @@ alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PA # Unset irrelevant variables. deactivate nondestructive -setenv VIRTUAL_ENV "__VENV_DIR__" +setenv VIRTUAL_ENV __VENV_DIR__ set _OLD_VIRTUAL_PATH="$PATH" -setenv PATH "$VIRTUAL_ENV/__VENV_BIN_NAME__:$PATH" +setenv PATH "$VIRTUAL_ENV/"__VENV_BIN_NAME__":$PATH" set _OLD_VIRTUAL_PROMPT="$prompt" if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then - set prompt = "__VENV_PROMPT__$prompt" - setenv VIRTUAL_ENV_PROMPT "__VENV_PROMPT__" + set prompt = __VENV_PROMPT__"$prompt" + setenv VIRTUAL_ENV_PROMPT __VENV_PROMPT__ endif alias pydoc python -m pydoc diff --git a/Lib/venv/scripts/posix/activate.fish b/Lib/venv/scripts/posix/activate.fish index 91ad6442..508cab0d 100644 --- a/Lib/venv/scripts/posix/activate.fish +++ b/Lib/venv/scripts/posix/activate.fish @@ -33,10 +33,10 @@ end # Unset irrelevant variables. deactivate nondestructive -set -gx VIRTUAL_ENV "__VENV_DIR__" +set -gx VIRTUAL_ENV __VENV_DIR__ set -gx _OLD_VIRTUAL_PATH $PATH -set -gx PATH "$VIRTUAL_ENV/__VENV_BIN_NAME__" $PATH +set -gx PATH "$VIRTUAL_ENV/"__VENV_BIN_NAME__ $PATH # Unset PYTHONHOME if set. if set -q PYTHONHOME @@ -56,7 +56,7 @@ if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" set -l old_status $status # Output the venv prompt; color taken from the blue of the Python logo. - printf "%s%s%s" (set_color 4B8BBE) "__VENV_PROMPT__" (set_color normal) + printf "%s%s%s" (set_color 4B8BBE) __VENV_PROMPT__ (set_color normal) # Restore the return status of the previous command. echo "exit $old_status" | . @@ -65,5 +65,5 @@ if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" end set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" - set -gx VIRTUAL_ENV_PROMPT "__VENV_PROMPT__" + set -gx VIRTUAL_ENV_PROMPT __VENV_PROMPT__ end diff --git a/Lib/webbrowser.py b/Lib/webbrowser.py index ba6711e4..13b9e85f 100755 --- a/Lib/webbrowser.py +++ b/Lib/webbrowser.py @@ -30,7 +30,7 @@ def register(name, klass, instance=None, *, preferred=False): # Preferred browsers go to the front of the list. # Need to match to the default browser returned by xdg-settings, which # may be of the form e.g. "firefox.desktop". - if preferred or (_os_preferred_browser and name in _os_preferred_browser): + if preferred or (_os_preferred_browser and f'{name}.desktop' == _os_preferred_browser): _tryorder.insert(0, name) else: _tryorder.append(name) @@ -77,6 +77,9 @@ def open(url, new=0, autoraise=True): - 1: a new browser window. - 2: a new browser page ("tab"). If possible, autoraise raises the window (the default) or not. + + If opening the browser succeeds, return True. + If there is a problem, return False. """ if _tryorder is None: with _lock: diff --git a/Lib/xml/etree/ElementTree.py b/Lib/xml/etree/ElementTree.py index fd2cc870..c657b52d 100644 --- a/Lib/xml/etree/ElementTree.py +++ b/Lib/xml/etree/ElementTree.py @@ -201,7 +201,7 @@ def __len__(self): def __bool__(self): warnings.warn( - "Testing an element's truth value will raise an exception in " + "Testing an element's truth value will always return True in " "future versions. " "Use specific 'len(elem)' or 'elem is not None' test instead.", DeprecationWarning, stacklevel=2 diff --git a/Lib/zipfile/__init__.py b/Lib/zipfile/__init__.py index 91358156..cf71c6db 100644 --- a/Lib/zipfile/__init__.py +++ b/Lib/zipfile/__init__.py @@ -295,7 +295,7 @@ def _EndRecData(fpin): fpin.seek(-sizeEndCentDir, 2) except OSError: return None - data = fpin.read() + data = fpin.read(sizeEndCentDir) if (len(data) == sizeEndCentDir and data[0:4] == stringEndArchive and data[-2:] == b"\000\000"): @@ -315,9 +315,9 @@ def _EndRecData(fpin): # record signature. The comment is the last item in the ZIP file and may be # up to 64K long. It is assumed that the "end of central directory" magic # number does not appear in the comment. - maxCommentStart = max(filesize - (1 << 16) - sizeEndCentDir, 0) + maxCommentStart = max(filesize - ZIP_MAX_COMMENT - sizeEndCentDir, 0) fpin.seek(maxCommentStart, 0) - data = fpin.read() + data = fpin.read(ZIP_MAX_COMMENT + sizeEndCentDir) start = data.rfind(stringEndArchive) if start >= 0: # found the magic number; attempt to unpack and interpret diff --git a/Lib/zipfile/_path/__init__.py b/Lib/zipfile/_path/__init__.py index 78c41356..645cfafd 100644 --- a/Lib/zipfile/_path/__init__.py +++ b/Lib/zipfile/_path/__init__.py @@ -1,3 +1,12 @@ +""" +A Path-like interface for zipfiles. + +This codebase is shared between zipfile.Path in the stdlib +and zipp in PyPI. See +https://github.com/python/importlib_metadata/wiki/Development-Methodology +for more detail. +""" + import io import posixpath import zipfile @@ -34,7 +43,7 @@ def _parents(path): def _ancestry(path): """ Given a path with elements separated by - posixpath.sep, generate all elements of that path + posixpath.sep, generate all elements of that path. >>> list(_ancestry('b/d')) ['b/d', 'b'] @@ -46,9 +55,14 @@ def _ancestry(path): ['b'] >>> list(_ancestry('')) [] + + Multiple separators are treated like a single. + + >>> list(_ancestry('//b//d///f//')) + ['//b//d///f', '//b//d', '//b'] """ path = path.rstrip(posixpath.sep) - while path and path != posixpath.sep: + while path.rstrip(posixpath.sep): yield path path, tail = posixpath.split(path) @@ -174,7 +188,10 @@ def _extract_text_encoding(encoding=None, *args, **kwargs): class Path: """ - A pathlib-compatible interface for zip files. + A :class:`importlib.resources.abc.Traversable` interface for zip files. + + Implements many of the features users enjoy from + :class:`pathlib.Path`. Consider a zip file with this structure:: @@ -286,7 +303,7 @@ def open(self, mode='r', *args, pwd=None, **kwargs): if self.is_dir(): raise IsADirectoryError(self) zip_mode = mode[0] - if not self.exists() and zip_mode == 'r': + if zip_mode == 'r' and not self.exists(): raise FileNotFoundError(self) stream = self.root.open(self.at, zip_mode, pwd=pwd) if 'b' in mode: diff --git a/Lib/zipfile/_path/glob.py b/Lib/zipfile/_path/glob.py index 4a2e665e..d5213533 100644 --- a/Lib/zipfile/_path/glob.py +++ b/Lib/zipfile/_path/glob.py @@ -2,6 +2,19 @@ def translate(pattern): + return match_dirs(translate_core(pattern)) + + +def match_dirs(pattern): + """ + Ensure that zipfile.Path directory names are matched. + + zipfile.Path directory names always end in a slash. + """ + return rf'{pattern}[/]?' + + +def translate_core(pattern): r""" Given a glob pattern, produce a regex that matches it. diff --git a/Lib/zipimport.py b/Lib/zipimport.py index a7333a4c..7669abd6 100644 --- a/Lib/zipimport.py +++ b/Lib/zipimport.py @@ -254,17 +254,9 @@ def load_module(self, fullname): def get_resource_reader(self, fullname): - """Return the ResourceReader for a package in a zip file. - - If 'fullname' is a package within the zip file, return the - 'ResourceReader' object for the package. Otherwise return None. - """ - try: - if not self.is_package(fullname): - return None - except ZipImportError: - return None + """Return the ResourceReader for a module in a zip file.""" from importlib.readers import ZipReader + return ZipReader(self, fullname) diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index d24cb76f..90f2b685 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -246,9 +246,9 @@ def library_recipes(): result.extend([ dict( - name="OpenSSL 3.0.13", - url="https://www.openssl.org/source/openssl-3.0.13.tar.gz", - checksum='88525753f79d3bec27d2fa7c66aa0b92b3aa9498dafd93d7cfa4b3780cdae313', + name="OpenSSL 3.0.15", + url="https://github.com/openssl/openssl/releases/download/openssl-3.0.15/openssl-3.0.15.tar.gz", + checksum='23c666d0edf20f14249b3d8f0368acaee9ab585b09e1de82107c66e1f3ec9533', buildrecipe=build_universal_openssl, configure=None, install=None, @@ -264,10 +264,10 @@ def library_recipes(): tk_patches = ['backport_gh71383_fix.patch', 'tk868_on_10_8_10_9.patch', 'backport_gh110950_fix.patch'] else: - tcl_tk_ver='8.6.14' - tcl_checksum='5880225babf7954c58d4fb0f5cf6279104ce1cd6aa9b71e9a6322540e1c4de66' + tcl_tk_ver='8.6.15' + tcl_checksum='861e159753f2e2fbd6ec1484103715b0be56be3357522b858d3cbb5f893ffef1' - tk_checksum='8ffdb720f47a6ca6107eac2dd877e30b0ef7fac14f3a84ebbd0b3612cee41a94' + tk_checksum='550969f35379f952b3020f3ab7b9dd5bfd11c1ef7c9b7c6a75f5c49aca793fec' tk_patches = [] diff --git a/Mac/BuildScript/resources/ReadMe.rtf b/Mac/BuildScript/resources/ReadMe.rtf index 384840cd..a5d47e31 100644 --- a/Mac/BuildScript/resources/ReadMe.rtf +++ b/Mac/BuildScript/resources/ReadMe.rtf @@ -1,4 +1,4 @@ -{\rtf1\ansi\ansicpg1252\cocoartf2709 +{\rtf1\ansi\ansicpg1252\cocoartf2761 \cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fswiss\fcharset0 Helvetica-Bold;\f2\fswiss\fcharset0 Helvetica-Oblique; \f3\fmodern\fcharset0 CourierNewPSMT;\f4\fmodern\fcharset0 Courier;} {\colortbl;\red255\green255\blue255;} @@ -11,8 +11,9 @@ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 \f1\b \cf0 \ul \ulc0 Certificate verification and OpenSSL\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 -\f0\b0 \ulnone \ +\f0\b0 \cf0 \ulnone \ This package includes its own private copy of OpenSSL 3.0. The trust certificates in system and user keychains managed by the \f2\i Keychain Access \f0\i0 application and the @@ -31,18 +32,21 @@ The bundled \f3 pip \f0 has its own default certificate store for verifying download connections.\ \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 -\f1\b \ul Install Options\ +\f1\b \cf0 \ul Install Options\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 -\f0\b0 \ulnone \ +\f0\b0 \cf0 \ulnone \ You can control some aspects of what is installed by this package. To see the options, click on the \f4 Customize \f0 button in the \f4 Installation Type \f0 step of the macOS installer app. Click on a package name in the list shown to see more information about that option,\ \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 -\f1\b \ul Using IDLE or other Tk applications +\f1\b \cf0 \ul Using IDLE or other Tk applications \f0\b0 \ulnone \ \ This package includes its own private version of Tcl/Tk 8.6. It does not use any system-supplied or third-party supplied versions of Tcl/Tk.\ @@ -60,19 +64,30 @@ Due to new security checks on macOS 10.15 Catalina, when launching IDLE macOS ma \f0\b0 button to proceed.\ \ -\f1\b \ul Apple Silicon Mac support\ +\f1\b \ul Minimum supported macOS version is now macOS 10.13\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 -\f0\b0 \ulnone \ -On Apple Silicon Macs, it is possible to run Python either with native ARM64 code or under Intel 64 emulation using Rosetta2. This option might be useful for testing or if binary wheels are not yet available with native ARM64 binaries. To easily force Python to run in emulation mode, invoke it from a command line shell with the +\f0\b0 \cf0 \ulnone \ +As of Python 3.12.6, as previously announced, this installer now supports running on macOS 10.13 High Sierra and newer systems. If you have a need for running Python 3.12 on older macOS systems, pre-built versions for these systems may be available from third-party distributors (such as MacPorts) or Python can be built from source ({\field{\*\fldinst{HYPERLINK "https://www.python.org/downloads/source/"}}{\fldrslt https://www.python.org/downloads/source/}}).\ + \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 + +\f1\b \cf0 \ul Apple Silicon Mac support\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 + +\f0\b0 \cf0 \ulnone \ +On Apple Silicon Macs, it is possible to run Python either with native ARM64 code or under Intel 64 emulation using Rosetta 2. This option might be useful for testing or if binary wheels are not yet available with native ARM64 binaries. To easily force Python to run in emulation mode, invoke it from a command line shell with the \f4 python3-intel64 \f0 command instead of just \f4 python3 \f0 .\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 -\f1\b \ul \ +\f1\b \cf0 \ul \ Other changes\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 -\f0\b0 \ulnone \ +\f0\b0 \cf0 \ulnone \ For other changes in this release, see the \f2\i What's new \f0\i0 section in the {\field{\*\fldinst{HYPERLINK "https://www.python.org/doc/"}}{\fldrslt Documentation Set}} for this release and its diff --git a/Mac/BuildScript/resources/install_certificates.command b/Mac/BuildScript/resources/install_certificates.command index 19b4adac..b10e18e1 100755 --- a/Mac/BuildScript/resources/install_certificates.command +++ b/Mac/BuildScript/resources/install_certificates.command @@ -10,22 +10,52 @@ import os import os.path +import platform import ssl import stat import subprocess import sys -STAT_0o775 = ( stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR - | stat.S_IRGRP | stat.S_IWGRP | stat.S_IXGRP - | stat.S_IROTH | stat.S_IXOTH ) +STAT_0o775 = ( + stat.S_IRUSR + | stat.S_IWUSR + | stat.S_IXUSR + | stat.S_IRGRP + | stat.S_IWGRP + | stat.S_IXGRP + | stat.S_IROTH + | stat.S_IXOTH +) + def main(): - openssl_dir, openssl_cafile = os.path.split( - ssl.get_default_verify_paths().openssl_cafile) + pip_call = [sys.executable, "-E", "-s", "-m", "pip"] + macos_release = tuple([int(n) for n in platform.mac_ver()[0].split(".")[0:2]]) + old_macos = macos_release < (10, 13) + if old_macos: + pip_version_string = subprocess.check_output(pip_call + ["-V"]).decode().strip() + # Silence warning to user to upgrade pip + pip_call.append("--disable-pip-version-check") + pip_version = tuple( + [int(n) for n in pip_version_string.split()[1].split(".")[0:2]] + ) + if pip_version >= (24, 2): + print( + f" -- WARNING: this version of pip may not work on this older version of macOS.\n" + f" found {pip_version_string}\n" + f" (See https://github.com/pypa/pip/issues/12901 for more information.)\n" + f" Attempting to revert to an older version of pip.\n" + f" -- pip install --use-deprecated=legacy-certs pip==24.1.2\n" + ) + subprocess.check_call( + pip_call + ["install", "--use-deprecated=legacy-certs", "pip==24.1.2"] + ) + openssl_dir, openssl_cafile = os.path.split( + ssl.get_default_verify_paths().openssl_cafile + ) print(" -- pip install --upgrade certifi") - subprocess.check_call([sys.executable, - "-E", "-s", "-m", "pip", "install", "--upgrade", "certifi"]) + subprocess.check_call(pip_call + ["install", "--upgrade", "certifi"]) import certifi @@ -42,7 +72,16 @@ def main(): print(" -- setting permissions") os.chmod(openssl_cafile, STAT_0o775) print(" -- update complete") + if old_macos: + print( + f" -- WARNING: Future releases of this Python installer may not support this older macOS version.\n" + ) -if __name__ == '__main__': - main() + +if __name__ == "__main__": + try: + main() + except subprocess.SubprocessError: + print(" -- WARNING: Install Certificates failed") + sys.exit(1) EOF diff --git a/Makefile.pre.in b/Makefile.pre.in index 4a957fb0..083f4c75 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -167,7 +167,7 @@ SHLIB_SUFFIX= @SHLIB_SUFFIX@ EXT_SUFFIX= @EXT_SUFFIX@ LDSHARED= @LDSHARED@ $(PY_LDFLAGS) BLDSHARED= @BLDSHARED@ $(PY_CORE_LDFLAGS) -LDCXXSHARED= @LDCXXSHARED@ +LDCXXSHARED= @LDCXXSHARED@ $(PY_LDFLAGS) DESTSHARED= $(BINLIBDEST)/lib-dynload # List of exported symbols for AIX @@ -2120,6 +2120,7 @@ LIBSUBDIRS= asyncio \ __phello__ TESTSUBDIRS= idlelib/idle_test \ test \ + test/test_ast \ test/audiodata \ test/certdata \ test/certdata/capath \ @@ -2234,6 +2235,7 @@ TESTSUBDIRS= idlelib/idle_test \ test/test_tomllib/data/valid/dates-and-times \ test/test_tomllib/data/valid/multiline-basic-str \ test/test_tools \ + test/test_tools/i18n_data \ test/test_ttk \ test/test_unittest \ test/test_unittest/testmock \ @@ -2245,6 +2247,10 @@ TESTSUBDIRS= idlelib/idle_test \ test/test_zoneinfo/data \ test/tokenizedata \ test/tracedmodules \ + test/translationdata \ + test/translationdata/argparse \ + test/translationdata/getopt \ + test/translationdata/optparse \ test/typinganndata \ test/wheeldata \ test/xmltestdata \ diff --git a/Misc/ACKS b/Misc/ACKS index 88bac0a8..0f8b79f2 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -516,6 +516,7 @@ Michael Ernst Ben Escoto Andy Eskilsson André Espaze +Lucas Esposito Stefan Esser Nicolas Estibals Jonathan Eunice @@ -722,6 +723,7 @@ Larry Hastings Tim Hatch Zac Hatfield-Dodds Shane Hathaway +Akinori Hattori Michael Haubenwallner Janko Hauser Flavian Hautbois @@ -744,6 +746,7 @@ Kasun Herath Chris Herborth Ivan Herman Jürgen Hermann +Joshua Jay Herman Gary Herron Ernie Hershey Thomas Herve @@ -1086,6 +1089,7 @@ Ivan Levkivskyi Ben Lewis William Lewis Akira Li +Jiahao Li Robert Li Xuanji Li Zekun Li @@ -1135,6 +1139,7 @@ Mark Lutz Taras Lyapun Jim Lynch Mikael Lyngvig +Ilya Lyubavski Jeff MacDonald John Machin Andrew I MacIntyre @@ -1303,6 +1308,7 @@ Hrvoje Nikšić Gregory Nofi Jesse Noller Bill Noon +Janek Nouvertné Stefan Norberg Tim Northover Joe Norton @@ -1633,6 +1639,7 @@ Scott Schram Robin Schreiber Chad J. Schroeder Simon-Martin Schroeder +Brian Schubert Christian Schubert Sam Schulenburg Andreas Schwab @@ -1787,6 +1794,7 @@ Reuben Sumner Eryk Sun Sanjay Sundaresan Marek Šuppa +Danica J. Sutherland Hisao Suzuki Kalle Svensson Andrew Svetlov diff --git a/Misc/HISTORY b/Misc/HISTORY index 3cf3a0bf..08b53c02 100644 --- a/Misc/HISTORY +++ b/Misc/HISTORY @@ -3952,7 +3952,7 @@ Library - Issue #18626: the inspect module now offers a basic command line introspection interface (Initial patch by Claudiu Popa) -- Issue #3015: Fixed tkinter with wantobject=False. Any Tcl command call +- Issue #3015: Fixed tkinter with ``wantobjects=False``. Any Tcl command call returned empty string. - Issue #19037: The mailbox module now makes all changes to maildir files @@ -5590,7 +5590,7 @@ Library - Issue #16248: Disable code execution from the user's home directory by tkinter when the -E flag is passed to Python. Patch by Zachary Ware. -- Issue #13390: New function :func:`sys.getallocatedblocks()` returns the +- Issue #13390: New function :func:`sys.getallocatedblocks` returns the number of memory blocks currently allocated. - Issue #16628: Fix a memory leak in ctypes.resize(). @@ -6157,7 +6157,7 @@ Tests starting with a ".". Patch by Sebastian Kreft. - Issue #13390: The ``-R`` option to regrtest now also checks for memory - allocation leaks, using :func:`sys.getallocatedblocks()`. + allocation leaks, using :func:`sys.getallocatedblocks`. - Issue #16559: Add more tests for the json module, including some from the official test suite at json.org. Patch by Serhiy Storchaka. diff --git a/Misc/NEWS b/Misc/NEWS index db250160..ce9de61c 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -2,6 +2,1023 @@ Python News +++++++++++ +What's New in Python 3.12.8 final? +================================== + +*Release date: 2024-12-03* + +macOS +----- + +- gh-124448: Update bundled Tcl/Tk in macOS installer to 8.6.15. + +Windows +------- + +- gh-126911: Update credits command output. + +- gh-125315: Avoid crashing in :mod:`platform` due to slow WMI calls on some + Windows machines. + +- gh-125550: Enable the :ref:`launcher` to detect Python 3.14 installs from + the Windows Store. + +- gh-124448: Updated bundled Tcl/Tk to 8.6.15. + +Tools/Demos +----------- + +- gh-126807: Fix extraction warnings in :program:`pygettext.py` caused by + mistaking function definitions for function calls. + +Tests +----- + +- gh-126909: Fix test_os extended attribute tests to work on filesystems + with 1 KiB xattr size limit. + +- gh-125041: Re-enable skipped tests for :mod:`zlib` on the s390x + architecture: only skip checks of the compressed bytes, which can be + different between zlib's software implementation and the + hardware-accelerated implementation. + +- gh-124295: Add translation tests to the :mod:`argparse` module. + +Security +-------- + +- gh-126623: Upgrade libexpat to 2.6.4 + +Library +------- + +- gh-127303: Publicly expose :data:`~token.EXACT_TOKEN_TYPES` in + :attr:`!token.__all__`. + +- gh-123967: Fix faulthandler for trampoline frames. If the top-most frame + is a trampoline frame, skip it. Patch by Victor Stinner. + +- gh-127182: Fix :meth:`!io.StringIO.__setstate__` crash, when :const:`None` + was passed as the first value. + +- gh-127217: Fix :func:`urllib.request.pathname2url` for paths starting with + multiple slashes on Posix. + +- gh-127035: Fix :mod:`shutil.which` on Windows. Now it looks at direct + match if and only if the command ends with a PATHEXT extension or X_OK is + not in mode. Support extensionless files if "." is in PATHEXT. Support + PATHEXT extensions that end with a dot. + +- gh-127078: Fix issue where :func:`urllib.request.url2pathname` failed to + discard an extra slash before a UNC drive in the URL path on Windows. + +- gh-126766: Fix issue where :func:`urllib.request.url2pathname` failed to + discard any 'localhost' authority present in the URL. + +- gh-126997: Fix support of STRING and GLOBAL opcodes with non-ASCII + arguments in :mod:`pickletools`. :func:`pickletools.dis` now outputs + non-ASCII bytes in STRING, BINSTRING and SHORT_BINSTRING arguments as + escaped (``\xXX``). + +- gh-126618: Fix the representation of :class:`itertools.count` objects when + the count value is :data:`sys.maxsize`. + +- gh-85168: Fix issue where :func:`urllib.request.url2pathname` and + :func:`~urllib.request.pathname2url` always used UTF-8 when quoting and + unquoting file URIs. They now use the :term:`filesystem encoding and error + handler`. + +- gh-67877: Fix memory leaks when :mod:`regular expression ` matching + terminates abruptly, either because of a signal or because memory + allocation fails. + +- gh-126789: Fixed the values of :py:func:`sysconfig.get_config_vars`, + :py:func:`sysconfig.get_paths`, and their siblings when the :py:mod:`site` + initialization happens after :py:mod:`sysconfig` has built a cache for + :py:func:`sysconfig.get_config_vars`. + +- gh-126188: Update bundled pip to 24.3.1 + +- gh-126766: Fix issue where :func:`urllib.request.url2pathname` failed to + discard two leading slashes introducing an empty authority section. + +- gh-126727: ``locale.nl_langinfo(locale.ERA)`` now returns multiple era + description segments separated by semicolons. Previously it only returned + the first segment on platforms with Glibc. + +- gh-126699: Allow :class:`collections.abc.AsyncIterator` to be a base for + Protocols. + +- gh-104745: Limit starting a patcher (from :func:`unittest.mock.patch` or + :func:`unittest.mock.patch.object`) more than once without stopping it + +- gh-126595: Fix a crash when instantiating :class:`itertools.count` with an + initial count of :data:`sys.maxsize` on debug builds. Patch by Bénédikt + Tran. + +- gh-120423: Fix issue where :func:`urllib.request.pathname2url` mishandled + Windows paths with embedded forward slashes. + +- gh-126565: Improve performances of :meth:`zipfile.Path.open` for + non-reading modes. + +- gh-126505: Fix bugs in compiling case-insensitive :mod:`regular + expressions ` with character classes containing non-BMP characters: + upper-case non-BMP character did was ignored and the ASCII flag was + ignored when matching a character range whose upper bound is beyond the + BMP region. + +- gh-117378: Fixed the :mod:`multiprocessing` ``"forkserver"`` start method + forkserver process to correctly inherit the parent's :data:`sys.path` + during the importing of :func:`multiprocessing.set_forkserver_preload` + modules in the same manner as :data:`sys.path` is configured in workers + before executing work items. + + This bug caused some forkserver module preloading to silently fail to + preload. This manifested as a performance degration in child processes + when the ``sys.path`` was required due to additional repeated work in + every worker. + + It could also have a side effect of ``""`` remaining in :data:`sys.path` + during forkserver preload imports instead of the absolute path from + :func:`os.getcwd` at multiprocessing import time used in the worker + ``sys.path``. + + The ``sys.path`` differences between phases in the child process could + potentially have caused preload to import incorrect things from the wrong + location. We are unaware of that actually having happened in practice. + +- gh-125679: The :class:`multiprocessing.Lock` and + :class:`multiprocessing.RLock` ``repr`` values no longer say "unknown" on + macOS. + +- gh-126476: Raise :class:`calendar.IllegalMonthError` (now a subclass of + :class:`IndexError`) for :func:`calendar.month` when the input month is + not correct. + +- gh-126489: The Python implementation of :mod:`pickle` no longer calls + :meth:`pickle.Pickler.persistent_id` for the result of + :meth:`!persistent_id`. + +- gh-126303: Fix pickling and copying of :class:`os.sched_param` objects. + +- gh-126138: Fix a use-after-free crash on :class:`asyncio.Task` objects + whose underlying coroutine yields an object that implements an evil + :meth:`~object.__getattribute__`. Patch by Nico Posada. + +- gh-126220: Fix crash in :class:`!cProfile.Profile` and + :class:`!_lsprof.Profiler` when their callbacks were directly called with + 0 arguments. + +- gh-126212: Fix issue where :func:`urllib.request.pathname2url` and + :func:`~urllib.request.url2pathname` removed slashes from Windows DOS + drive paths and URLs. + +- gh-126205: Fix issue where :func:`urllib.request.pathname2url` generated + URLs beginning with four slashes (rather than two) when given a Windows + UNC path. + +- gh-126105: Fix a crash in :mod:`ast` when the :attr:`ast.AST._fields` + attribute is deleted. + +- gh-126106: Fixes a possible ``NULL`` pointer dereference in :mod:`ssl`. + +- gh-126080: Fix a use-after-free crash on :class:`asyncio.Task` objects for + which the underlying event loop implements an evil + :meth:`~object.__getattribute__`. Reported by Nico-Posada. Patch by + Bénédikt Tran. + +- gh-126083: Fixed a reference leak in :class:`asyncio.Task` objects when + reinitializing the same object with a non-``None`` context. Patch by Nico + Posada. + +- gh-125984: Fix use-after-free crashes on :class:`asyncio.Future` objects + for which the underlying event loop implements an evil + :meth:`~object.__getattribute__`. Reported by Nico-Posada. Patch by + Bénédikt Tran. + +- gh-125969: Fix an out-of-bounds crash when an evil + :meth:`asyncio.loop.call_soon` mutates the length of the internal + callbacks list. Patch by Bénédikt Tran. + +- gh-125966: Fix a use-after-free crash in + :meth:`asyncio.Future.remove_done_callback`. Patch by Bénédikt Tran. + +- gh-125789: Fix possible crash when mutating list of callbacks returned by + :attr:`!asyncio.Future._callbacks`. It now always returns a new copy in C + implementation :mod:`!_asyncio`. Patch by Kumar Aditya. + +- gh-124452: Fix an issue in + :meth:`email.policy.EmailPolicy.header_source_parse` and + :meth:`email.policy.Compat32.header_source_parse` that introduced spurious + leading whitespaces into header values when the header includes a newline + character after the header name delimiter (``:``) and before the value. + +- gh-125884: Fixed the bug for :mod:`pdb` where it can't set breakpoints on + functions with certain annotations. + +- gh-125355: Fix several bugs in + :meth:`argparse.ArgumentParser.parse_intermixed_args`. + + * The parser no longer changes temporarily during parsing. + * Default values are not processed twice. + * Required mutually exclusive groups containing positional arguments are now supported. + * The missing arguments report now includes the names of all required optional and positional arguments. + * Unknown options can be intermixed with positional arguments in parse_known_intermixed_args(). + +- gh-125682: Reject non-ASCII digits in the Python implementation of + :func:`json.loads` conforming to the JSON specification. + +- gh-125660: Reject invalid unicode escapes for Python implementation of + :func:`json.loads`. + +- gh-125259: Fix the notes removal logic for errors thrown in enum + initialization. + +- gh-125519: Improve traceback if :func:`importlib.reload` is called with an + object that is not a module. Patch by Alex Waygood. + +- gh-125451: Fix deadlock when + :class:`concurrent.futures.ProcessPoolExecutor` shuts down concurrently + with an error when feeding a job to a worker process. + +- gh-125422: Fixed the bug where :mod:`pdb` and :mod:`bdb` can step into the + bottom caller frame. + +- gh-100141: Fixed the bug where :mod:`pdb` will be stuck in an infinite + loop when debugging an empty file. + +- gh-53203: Fix :func:`time.strptime` for ``%c``, ``%x`` and ``%X`` formats + in many locales that use non-ASCII digits, like Persian, Burmese, Odia and + Shan. + +- gh-125254: Fix a bug where ArgumentError includes the incorrect ambiguous + option in :mod:`argparse`. + +- gh-61011: Fix inheritance of nested mutually exclusive groups from parent + parser in :class:`argparse.ArgumentParser`. Previously, all nested + mutually exclusive groups lost their connection to the group containing + them and were displayed as belonging directly to the parser. + +- gh-52551: Fix encoding issues in :func:`time.strftime`, the + :meth:`~datetime.datetime.strftime` method of the :mod:`datetime` classes + :class:`~datetime.datetime`, :class:`~datetime.date` and + :class:`~datetime.time` and formatting of these classes. Characters not + encodable in the current locale are now acceptable in the format string. + Surrogate pairs and sequence of surrogatescape-encoded bytes are no longer + recombinated. Embedded null character no longer terminates the format + string. + +- gh-125118: Don't copy arbitrary values to :c:expr:`_Bool` in the + :mod:`struct` module. + +- gh-125069: Fix an issue where providing a :class:`pathlib.PurePath` object + as an initializer argument to a second :class:`~pathlib.PurePath` object + with a different flavour resulted in arguments to the former object's + initializer being joined by the latter object's flavour. + +- gh-124969: Fix ``locale.nl_langinfo(locale.ALT_DIGITS)`` on platforms with + glibc. Now it returns a string consisting of up to 100 semicolon-separated + symbols (an empty string in most locales) on all Posix platforms. + Previously it only returned the first symbol or an empty string. + +- gh-124958: Fix refcycles in exceptions raised from + :class:`asyncio.TaskGroup` and the python implementation of + :class:`asyncio.Future` + +- gh-53203: Fix :func:`time.strptime` for ``%c`` and ``%x`` formats in many + locales: Arabic, Bislama, Breton, Bodo, Kashubian, Chuvash, Estonian, + French, Irish, Ge'ez, Gurajati, Manx Gaelic, Hebrew, Hindi, Chhattisgarhi, + Haitian Kreyol, Japanese, Kannada, Korean, Marathi, Malay, Norwegian, + Nynorsk, Punjabi, Rajasthani, Tok Pisin, Yoruba, Yue Chinese, Yau/Nungon + and Chinese. + +- gh-124917: Allow calling :func:`os.path.exists` and + :func:`os.path.lexists` with keyword arguments on Windows. Fixes a + regression in 3.12.4. + +- gh-124653: Fix detection of the minimal Queue API needed by the + :mod:`logging` module. Patch by Bénédikt Tran. + +- gh-124858: Fix reference cycles left in tracebacks in + :func:`asyncio.open_connection` when used with ``happy_eyeballs_delay`` + +- gh-124390: Fixed :exc:`AssertionError` when using + :func:`!asyncio.staggered.staggered_race` with + :attr:`asyncio.eager_task_factory`. + +- gh-124651: Properly quote template strings in :mod:`venv` activation + scripts. + +- gh-124594: All :mod:`asyncio` REPL prompts run in the same :class:`context + `. Contributed by Bartosz Sławecki. + +- gh-120378: Fix a crash related to an integer overflow in + :func:`curses.resizeterm` and :func:`curses.resize_term`. + +- gh-123884: Fixed bug in itertools.tee() handling of other tee inputs (a + tee in a tee). The output now has the promised *n* independent new + iterators. Formerly, the first iterator was identical (not independent) + to the input iterator. This would sometimes give surprising results. + +- gh-123978: Remove broken :func:`time.thread_time` and + :func:`time.thread_time_ns` on NetBSD. + +- gh-124008: Fix possible crash (in debug build), incorrect output or + returning incorrect value from raw binary ``write()`` when writing to + console on Windows. + +- gh-123370: Fix the canvas not clearing after running turtledemo clock. + +- gh-120754: Update unbounded ``read`` calls in :mod:`zipfile` to specify an + explicit ``size`` putting a limit on how much data they may read. This + also updates handling around ZIP max comment size to match the standard + instead of reading comments that are one byte too long. + +- gh-70764: Fixed an issue where :func:`inspect.getclosurevars` would + incorrectly classify an attribute name as a global variable when the name + exists both as an attribute name and a global variable. + +- gh-119826: Always return an absolute path for :func:`os.path.abspath` on + Windows. + +- gh-117766: Always use :func:`str` to print ``choices`` in :mod:`argparse`. + +- gh-101955: Fix SystemError when match regular expression pattern + containing some combination of possessive quantifier, alternative and + capture group. + +- gh-88110: Fixed :class:`multiprocessing.Process` reporting a ``.exitcode`` + of 1 even on success when using the ``"fork"`` start method while using a + :class:`concurrent.futures.ThreadPoolExecutor`. + +- gh-71936: Fix a race condition in :class:`multiprocessing.pool.Pool`. + +- bpo-46128: Strip :class:`unittest.IsolatedAsyncioTestCase` stack frames + from reported stacktraces. + +- bpo-14074: Fix :mod:`argparse` metavar processing to allow positional + arguments to have a tuple metavar. + +IDLE +---- + +- gh-122392: Increase currently inadequate vertical spacing for the IDLE + browsers (path, module, and stack) on high-resolution monitors. + +Documentation +------------- + +- gh-125277: Require Sphinx 7.2.6 or later to build the Python + documentation. Patch by Adam Turner. + +- gh-125018: The :mod:`importlib.metadata` documentation now includes + semantic cross-reference targets for the significant documented APIs. This + means intersphinx references like :func:`importlib.metadata.version` will + now work as expected. + +- gh-121277: Writers of CPython's documentation can now use ``next`` as the + version for the ``versionchanged``, ``versionadded``, ``deprecated`` + directives. + +- gh-60712: Include the :class:`object` type in the lists of documented + types. Change by Furkan Onder and Martin Panter. + +Core and Builtins +----------------- + +- gh-113841: Fix possible undefined behavior division by zero in + :class:`complex`'s :c:func:`_Py_c_pow`. + +- gh-126341: Now :exc:`ValueError` is raised instead of :exc:`SystemError` + when trying to iterate over a released :class:`memoryview` object. + +- gh-126066: Fix :mod:`importlib` to not write an incomplete .pyc files when + a ulimit or some other operating system mechanism is preventing the write + to go through fully. + +- gh-126139: Provide better error location when attempting to use a + :term:`future statement <__future__>` with an unknown future feature. + +- gh-125008: Fix :func:`tokenize.untokenize` producing invalid syntax for + double braces preceded by certain escape characters. + +- gh-123378: Fix a crash in the :meth:`~object.__str__` method of + :exc:`UnicodeError` objects when the :attr:`UnicodeError.start` and + :attr:`UnicodeError.end` values are invalid or out-of-range. Patch by + Bénédikt Tran. + +- gh-116510: Fix a crash caused by immortal interned strings being shared + between sub-interpreters that use basic single-phase init. In that case, + the string can be used by an interpreter that outlives the interpreter + that created and interned it. For interpreters that share obmalloc state, + also share the interned dict with the main interpreter. + +- gh-118950: Fix bug where SSLProtocol.connection_lost wasn't getting called + when OSError was thrown on writing to socket. + +- gh-113570: Fixed a bug in ``reprlib.repr`` where it incorrectly called the + repr method on shadowed Python built-in types. + +- gh-109746: If :func:`!_thread.start_new_thread` fails to start a new + thread, it deletes its state from interpreter and thus avoids its repeated + cleanup on finalization. + +C API +----- + +- gh-113601: Removed debug build assertions related to interning strings, + which were falsely triggered by stable ABI extensions. + +Build +----- + +- gh-89640: Hard-code float word ordering as little endian on WASM. + +- gh-89640: Improve detection of float word ordering on Linux when link-time + optimizations are enabled. + + +What's New in Python 3.12.7 final? +================================== + +*Release date: 2024-10-01* + +Windows +------- + +- gh-123915: Ensure that ``Tools\msi\buildrelease.bat`` uses different + directories for AMD64 and ARM64 builds. + +- gh-117505: Fixes an issue with the Windows installer not running ensurepip + in a fully isolated environment. This could cause unexpected interactions + with the user site-packages. + +Tests +----- + +- gh-124378: Updated ``test_ttk`` to pass with Tcl/Tk 8.6.15. + +Security +-------- + +- gh-122792: Changed IPv4-mapped ``ipaddress.IPv6Address`` to consistently + use the mapped IPv4 address value for deciding properties. Properties + which have their behavior fixed are ``is_multicast``, ``is_reserved``, + ``is_link_local``, ``is_global``, and ``is_unspecified``. + +Library +------- + +- gh-116850: Fix :mod:`argparse` for namespaces with not directly writable + dict (e.g. classes). + +- gh-58573: Fix conflicts between abbreviated long options in the parent + parser and subparsers in :mod:`argparse`. + +- gh-61181: Fix support of :ref:`choices` with string value in + :mod:`argparse`. Substrings of the specified string no longer considered + valid values. + +- gh-80259: Fix :mod:`argparse` support of positional arguments with + ``nargs='?'``, ``default=argparse.SUPPRESS`` and specified ``type``. + +- gh-124498: Fix :class:`typing.TypeAliasType` not to be generic, when + ``type_params`` is an empty tuple. + +- gh-124345: :mod:`argparse` vim supports abbreviated single-dash long + options separated by ``=`` from its value. + +- gh-104860: Fix disallowing abbreviation of single-dash long options in + :mod:`argparse` with ``allow_abbrev=False``. + +- gh-63143: Fix parsing mutually exclusive arguments in :mod:`argparse`. + Arguments with the value identical to the default value (e.g. booleans, + small integers, empty or 1-character strings) are no longer considered + "not present". + +- gh-72795: Positional arguments with :ref:`nargs` equal to ``'*'`` or + :data:`!argparse.REMAINDER` are no longer required. This allows to use + positional argument with ``nargs='*'`` and without ``default`` in mutually + exclusive group and improves error message about required arguments. + +- gh-59317: Fix parsing positional argument with :ref:`nargs` equal to + ``'?'`` or ``'*'`` if it is preceded by an option and another positional + argument. + +- gh-53780: :mod:`argparse` now ignores the first ``"--"`` (double dash) + between an option and command. + +- gh-124217: Add RFC 9637 reserved IPv6 block ``3fff::/20`` in + :mod:`ipaddress` module. + +- gh-124248: Fixed potential crash when using :mod:`struct` to process + zero-width 'Pascal string' fields (``0p``). + +- gh-81691: Fix handling of multiple ``"--"`` (double dashes) in + :mod:`argparse`. Only the first one has now been removed, all subsequent + ones are now taken literally. + +- gh-87041: Fix a bug in :mod:`argparse` where lengthy subparser argument + help is incorrectly indented. + +- gh-124171: Add workaround for broken :c:func:`!fmod()` implementations on + Windows, that loose zero sign (e.g. ``fmod(-10, 1)`` returns ``0.0``). + Patch by Sergey B Kirpichev. + +- gh-123934: Fix :class:`unittest.mock.MagicMock` reseting magic methods + return values after ``.reset_mock(return_value=True)`` was called. + +- gh-123935: Fix parent slots detection for dataclasses that inherit from + classes with ``__dictoffset__``. + +- gh-123892: Add ``"_wmi"`` to :data:`sys.stdlib_module_names`. Patch by + Victor Stinner. + +- gh-116810: Resolve a memory leak introduced in CPython 3.10's :mod:`ssl` + when the :attr:`ssl.SSLSocket.session` property was accessed. Speeds up + read and write access to said property by no longer unnecessarily cloning + session objects via serialization. + +- gh-121735: When working with zip archives, importlib.resources now + properly honors module-adjacent references (e.g. ``files(pkg.mod)`` and + not just ``files(pkg)``). + +- gh-119004: Fix a crash in :ref:`OrderedDict.__eq__ + ` when operands are mutated during the + check. Patch by Bénédikt Tran. + +- bpo-44864: Do not translate user-provided strings in + :class:`argparse.ArgumentParser`. + +IDLE +---- + +- gh-112938: Fix uninteruptable hang when Shell gets rapid continuous + output. + +Core and Builtins +----------------- + +- gh-116510: Fix a bug that can cause a crash when sub-interpreters use + "basic" single-phase extension modules. Shared objects could refer to + PyGC_Head nodes that had been freed as part of interpreter cleanup. + +- gh-124188: Fix reading and decoding a line from the source file witn + non-UTF-8 encoding for syntax errors raised in the compiler. + +- gh-77894: Fix possible crash in the garbage collector when it tries to + break a reference loop containing a :class:`memoryview` object. Now a + :class:`!memoryview` object can only be cleared if there are no buffers + that refer it. + +- gh-98442: Fix too wide source locations of the cleanup instructions of a + with statement. + +- gh-113993: Strings interned with :func:`sys.intern` are again + garbage-collected when no longer used, as per the documentation. Strings + interned with the C function :c:func:`PyUnicode_InternInPlace` are still + immortal. Internals of the string interning mechanism have been changed. + This may affect performance and identities of :class:`str` objects. + +C API +----- + +- gh-113993: :c:func:`PyUnicode_InternInPlace` no longer prevents its + argument from being garbage collected. + + Several functions that take ``char *`` are now documented as possibly + preventing string objects from being garbage collected; refer to their + documentation for details: :c:func:`PyUnicode_InternFromString`, + :c:func:`PyDict_SetItemString`, :c:func:`PyObject_SetAttrString`, + :c:func:`PyObject_DelAttrString`, :c:func:`PyUnicode_InternFromString`, + and ``PyModule_Add*`` convenience functions. + +Build +----- + +- gh-124487: Windows builds now use Windows 8.1 as their API baseline + (installation already required Windows 8.1). + +- gh-123917: Fix the check for the ``crypt()`` function in the configure + script. Patch by Paul Smith and Victor Stinner. + + +What's New in Python 3.12.6 final? +================================== + +*Release date: 2024-09-06* + +macOS +----- + +- gh-123418: Updated macOS installer build to use OpenSSL 3.0.15. + +Windows +------- + +- gh-123418: Updated Windows build to use OpenSSL 3.0.15. + +- gh-100256: :mod:`mimetypes` no longer fails when it encounters an + inaccessible registry key. + +- gh-79846: Makes :code:`ssl.create_default_context()` ignore invalid + certificates in the Windows certificate store + +Tools/Demos +----------- + +- gh-123418: Update GitHub CI workflows to use OpenSSL 3.0.15 and + multissltests to use 3.0.15, 3.1.7, and 3.2.3. + +Tests +----- + +- gh-101525: Skip ``test_gdb`` if the binary is relocated by BOLT. Patch by + Donghee Na. + +Security +-------- + +- gh-123678: Upgrade libexpat to 2.6.3 + +- gh-121285: Remove backtracking from tarfile header parsing for + ``hdrcharset``, PAX, and GNU sparse headers. + +Library +------- + +- gh-123270: Applied a more surgical fix for malformed payloads in + :class:`zipfile.Path` causing infinite loops (gh-122905) without breaking + contents using legitimate characters. + +- gh-123213: :meth:`xml.etree.ElementTree.Element.extend` and + :class:`~xml.etree.ElementTree.Element` assignment no longer hide the + internal exception if an erronous generator is passed. Patch by Bar Harel. + +- gh-85110: Preserve relative path in URL without netloc in + :func:`urllib.parse.urlunsplit` and :func:`urllib.parse.urlunparse`. + +- gh-123067: Fix quadratic complexity in parsing ``"``-quoted cookie values + with backslashes by :mod:`http.cookies`. + +- gh-122903: ``zipfile.Path.glob`` now correctly matches directories instead + of silently omitting them. + +- gh-122905: :class:`zipfile.Path` objects now sanitize names from the + zipfile. + +- gh-122695: Fixed double-free when using :func:`gc.get_referents` with a + freed :class:`asyncio.Future` iterator. + +- gh-116263: :class:`logging.handlers.RotatingFileHandler` no longer rolls + over empty log files. + +- gh-118814: Fix the :class:`typing.TypeVar` constructor when name is passed + by keyword. + +- gh-122478: Remove internal frames from tracebacks shown in + :class:`code.InteractiveInterpreter` with non-default + :func:`sys.excepthook`. Save correct tracebacks in + :attr:`sys.last_traceback` and update ``__traceback__`` attribute of + :attr:`sys.last_value` and :attr:`sys.last_exc`. + +- gh-113785: :mod:`csv` now correctly parses numeric fields (when used with + :const:`csv.QUOTE_NONNUMERIC`) which start with an escape character. + +- gh-112182: :meth:`!asyncio.futures.Future.set_exception` now transforms + :exc:`StopIteration` into :exc:`RuntimeError` instead of hanging or other + misbehavior. Patch contributed by Jamie Phan. + +- gh-108172: ``webbrowser`` honors OS preferred browser on Linux when its + desktop entry name contains the text of a known browser name. + +- gh-102988: :func:`email.utils.getaddresses` and + :func:`email.utils.parseaddr` now return ``('', '')`` 2-tuples in more + situations where invalid email addresses are encountered instead of + potentially inaccurate values. Add optional *strict* parameter to these + two functions: use ``strict=False`` to get the old behavior, accept + malformed inputs. ``getattr(email.utils, 'supports_strict_parsing', + False)`` can be use to check if the *strict* paramater is available. Patch + by Thomas Dwyer and Victor Stinner to improve the CVE-2023-27043 fix. + +- gh-99437: :func:`runpy.run_path` now decodes path-like objects, making + sure __file__ and sys.argv[0] of the module being run are always strings. + +IDLE +---- + +- gh-120083: Add explicit black IDLE Hovertip foreground color needed for + recent macOS. Fixes Sonoma showing unreadable white on pale yellow. Patch + by John Riggles. + +Core and Builtins +----------------- + +- gh-123321: Prevent Parser/myreadline race condition from segfaulting on + multi-threaded use. Patch by Bar Harel and Amit Wienner. + +- gh-122982: Extend the deprecation period for bool inversion (``~``) by two + years. + +- gh-123229: Fix valgrind warning by initializing the f-string buffers to 0 + in the tokenizer. Patch by Pablo Galindo + +- gh-123142: Fix too-wide source location in exception tracebacks coming + from broken iterables in comprehensions. + +- gh-123048: Fix a bug where pattern matching code could emit a + :opcode:`JUMP_FORWARD` with no source location. + +- gh-123083: Fix a potential use-after-free in ``STORE_ATTR_WITH_HINT``. + +- gh-122527: Fix a crash that occurred when a ``PyStructSequence`` was + deallocated after its type's dictionary was cleared by the GC. The type's + :c:member:`~PyTypeObject.tp_basicsize` now accounts for non-sequence + fields that aren't included in the :c:macro:`Py_SIZE` of the sequence. + +- gh-93691: Fix source locations of instructions generated for with + statements. + +Build +----- + +- gh-123297: Propagate the value of ``LDFLAGS`` to ``LDCXXSHARED`` in + :mod:`sysconfig`. Patch by Pablo Galindo + + +What's New in Python 3.12.5 final? +================================== + +*Release date: 2024-08-06* + +Windows +------- + +- gh-122573: The Windows build of CPython now requires 3.10 or newer. + +Tests +----- + +- gh-59022: Add tests for :func:`pkgutil.extend_path`. Patch by Andreas + Stocker. + +- gh-99242: :func:`os.getloadavg` may throw :exc:`OSError` when running + regression tests under certain conditions (e.g. chroot). This error is now + caught and ignored, since reporting load average is optional. + +- gh-121084: Fix test_typing random leaks. Clear typing ABC caches when + running tests for refleaks (``-R`` option): call ``_abc_caches_clear()`` + on typing abstract classes and their subclasses. Patch by Victor Stinner. + +- gh-121160: Add a test for :func:`readline.set_history_length`. Note that + this test may fail on readline libraries. + +- gh-121200: Fix ``test_expanduser_pwd2()`` of ``test_posixpath``. Call + ``getpwnam()`` to get ``pw_dir``, since it can be different than + ``getpwall()`` ``pw_dir``. Patch by Victor Stinner. + +- gh-121188: When creating the JUnit XML file, regrtest now escapes + characters which are invalid in XML, such as the chr(27) control character + used in ANSI escape sequences. Patch by Victor Stinner. + +Security +-------- + +- gh-121957: Fixed missing audit events around interactive use of Python, + now also properly firing for ``python -i``, as well as for ``python -m + asyncio``. The event in question is ``cpython.run_stdin``. + +- gh-122133: Authenticate the socket connection for the + ``socket.socketpair()`` fallback on platforms where ``AF_UNIX`` is not + available like Windows. + + Patch by Gregory P. Smith and Seth Larson + . Reported by Ellie + +Library +------- + +- gh-122744: Bump the version of pip bundled in ensurepip to version 24.2. + +- gh-122334: Fix crash when importing :mod:`ssl` after the main interpreter + restarts. + +- gh-87320: In :class:`code.InteractiveInterpreter`, handle exceptions + caused by calling a non-default :func:`sys.excepthook`. Before, the + exception bubbled up to the caller, ending the REPL. + +- gh-122400: Handle :exc:`ValueError`\s raised by :func:`os.stat` in + :class:`filecmp.dircmp` and :func:`filecmp.cmpfiles`. Patch by Bénédikt + Tran. + +- gh-122311: Fix some error messages in :mod:`pickle`. + +- gh-121650: :mod:`email` headers with embedded newlines are now quoted on + output. The :mod:`~email.generator` will now refuse to serialize (write) + headers that are unsafely folded or delimited; see + :attr:`~email.policy.Policy.verify_generated_headers`. (Contributed by Bas + Bloemsaat and Petr Viktorin in :gh:`121650`.) + +- gh-122332: Fixed segfault with :meth:`asyncio.Task.get_coro` when using an + eager task factory. + +- gh-122170: Handle :exc:`ValueError`\s raised by :func:`os.stat` in + :mod:`linecache`. Patch by Bénédikt Tran. + +- gh-121723: Make :func:`logging.config.dictConfig` accept any object + implementing the Queue public API. See the :ref:`queue configuration + ` section for details. Patch by Bénédikt Tran. + +- gh-82951: Serializing objects with complex ``__qualname__`` (such as + unbound methods and nested classes) by name no longer involves serializing + parent objects by value in pickle protocols < 4. + +- gh-120930: Fixed a bug introduced by gh-92081 that added an incorrect + extra blank to encoded words occurring in wrapped headers. + +- gh-121474: Fix missing sanity check for ``parties`` arg in + :class:`threading.Barrier` constructor. Patch by Clinton Christian + (pygeek). + +- gh-121025: Improve the :meth:`~object.__repr__` of + :class:`functools.partialmethod`. Patch by Bénédikt Tran. + +- gh-121018: Fixed issues where :meth:`!argparse.ArgumentParser.parse_args` + did not honor ``exit_on_error=False``. Based on patch by Ben Hsing. + +- gh-119614: Fix truncation of strings with embedded null characters in some + internal operations in :mod:`tkinter`. + +- gh-120910: When reading installed files from an egg, use + ``relative_to(walk_up=True)`` to honor files installed outside of the + installation root. + +- gh-101830: Accessing the :mod:`tkinter` object's string representation no + longer converts the underlying Tcl object to a string on Windows. + +- gh-120811: Fix possible memory leak in :meth:`contextvars.Context.run`. + +- gh-120769: Make empty line in :mod:`pdb` repeats the last command even + when the command is from ``cmdqueue``. + +- gh-120732: Fix ``name`` passing to :class:`unittest.mock.Mock` object when + using :func:`unittest.mock.create_autospec`. + +- gh-120495: Fix incorrect exception handling in Tab Nanny. Patch by + Wulian233. + +- gh-120343: Fix column offset reporting for tokens that come after + multiline f-strings in the :mod:`tokenize` module. + +- gh-119600: Fix :func:`unittest.mock.patch` to not read attributes of the + target when ``new_callable`` is set. Patch by Robert Collins. + +- gh-120289: Fixed the use-after-free issue in :mod:`cProfile` by + disallowing ``disable()`` and ``clear()`` in external timers. + +- gh-114053: Fix edge-case bug where :func:`typing.get_type_hints` would + produce incorrect results if type parameters in a class scope were + overridden by assignments in a class scope and ``from __future__ import + annotations`` semantics were enabled. Patch by Alex Waygood. + +- gh-114053: Fix erroneous :exc:`NameError` when calling + :func:`inspect.get_annotations` with ``eval_str=True``` on a class that + made use of :pep:`695` type parameters in a module that had ``from + __future__ import annotations`` at the top of the file. Patch by Alex + Waygood. + +- gh-120268: Prohibit passing ``None`` to pure-Python + :meth:`datetime.date.fromtimestamp` to achieve consistency with + C-extension implementation. + +- gh-120244: Fix memory leak in :func:`re.sub` when the replacement string + contains backreferences. + +- gh-120211: Fix :mod:`tkinter.ttk` with Tcl/Tk 9.0. + +- gh-71587: Fix crash in C version of :meth:`datetime.datetime.strptime` + when called again on the restarted interpreter. + +- gh-117983: Defer the ``threading`` import in ``importlib.util`` until lazy + loading is used. + +- gh-119698: Fix :meth:`symtable.Class.get_methods` and document its + behaviour. Patch by Bénédikt Tran. + +- gh-120121: Add :exc:`concurrent.futures.InvalidStateError` to module's + ``__all__``. + +- gh-112672: Support building :mod:`tkinter` with Tcl 9.0. + +- gh-65454: :func:`unittest.mock.Mock.attach_mock` no longer triggers a call + to a ``PropertyMock`` being attached. + +- gh-81936: :meth:`!help` and :meth:`!showtopic` methods now respect a + configured *output* argument to :class:`!pydoc.Helper` and not use the + pager in such cases. Patch by Enrico Tröger. + +- gh-119577: The :exc:`DeprecationWarning` emitted when testing the truth + value of an :class:`xml.etree.ElementTree.Element` now describes + unconditionally returning ``True`` in a future version rather than raising + an exception in Python 3.14. + +- gh-119506: Fix :meth:`!io.TextIOWrapper.write` method breaks internal + buffer when the method is called again during flushing internal buffer. + +- gh-119189: When using the ``**`` operator or :func:`pow` with + :class:`~fractions.Fraction` as the base and an exponent that is not + rational, a float, or a complex, the fraction is no longer converted to a + float. + +- gh-105623: Fix performance degradation in + :class:`logging.handlers.RotatingFileHandler`. Patch by Craig Robson. + +- bpo-39324: Add mime type mapping for .md <-> text/markdown + +IDLE +---- + +- gh-122482: Change About IDLE to direct users to discuss.python.org instead + of the now unused idle-dev email and mailing list. + +- gh-78889: Stop Shell freezes by blocking user access to non-method + sys.stdout.shell attributes, which are all private. + +- gh-120104: Fix padding in config and search dialog windows in IDLE. + +Documentation +------------- + +- gh-121749: Fix documentation for :c:func:`PyModule_AddObjectRef`. + +- gh-120012: Clarify the behaviours of :meth:`multiprocessing.Queue.empty` + and :meth:`multiprocessing.SimpleQueue.empty` on closed queues. Patch by + Bénédikt Tran. + +Core and Builtins +----------------- + +- gh-122208: Dictionary watchers now only deliver the PyDict_EVENT_ADDED + event when the insertion is in a known good state to succeed. + +- gh-122300: Preserve AST nodes for f-string with single-element format + specifiers. Patch by Pablo Galindo + +- gh-122029: Emit ``c_call`` events in :func:`sys.setprofile` when a + ``PyMethodObject`` pointing to a ``PyCFunction`` is called. + +- gh-122026: Fix a bug that caused the tokenizer to not correctly identify + mismatched parentheses inside f-strings in some situations. Patch by Pablo + Galindo + +- gh-121657: Improve the :exc:`SyntaxError` message if the user tries to use + :keyword:`yield from ` outside a function. + +- gh-117482: Unexpected slot wrappers are no longer created for builtin + static types in subinterpreters. + +- gh-121439: Allow tuples of length 20 in the freelist to be reused. + +- gh-121130: Fix f-strings with debug expressions in format specifiers. + Patch by Pablo Galindo + +- gh-120722: Correctly set the bytecode position on return instructions + within lambdas. Patch by Jelle Zijlstra. + +- gh-120384: Fix an array out of bounds crash in ``list_ass_subscript``, + which could be invoked via some specificly tailored input: including + concurrent modification of a list object, where one thread assigns a slice + and another clears it. + +- gh-120380: Fix Python implementation of :class:`pickle.Pickler` for + :class:`bytes` and :class:`bytearray` objects when using protocol version + 5. Patch by Bénédikt Tran. + +- gh-93691: Fix source locations of instructions generated for the iterator + of a for statement. + +- gh-120198: Fix a crash when multiple threads read and write to the same + ``__class__`` of an object concurrently. + +- gh-120298: Fix use-after free in ``list_richcompare_impl`` which can be + invoked via some specificly tailored evil input. + +- gh-119666: Fix a compiler crash in the case where two comprehensions in + class scope both reference ``__class__``. + +- bpo-24766: Fix handling of ``doc`` argument to subclasses of ``property``. + +Build +----- + +- gh-120671: Fix failing configure tests due to a missing space when + appending to CFLAGS. + +- gh-115983: Skip building test modules that must be built as shared under + WASI. + + What's New in Python 3.12.4 final? ================================== @@ -10,136 +1027,134 @@ What's New in Python 3.12.4 final? Security -------- -- gh-issue-118486: :func:`os.mkdir` on Windows now accepts *mode* of - ``0o700`` to restrict the new directory to the current user. This fixes +- gh-118486: :func:`os.mkdir` on Windows now accepts *mode* of ``0o700`` to + restrict the new directory to the current user. This fixes :cve:`2024-4030` affecting :func:`tempfile.mkdtemp` in scenarios where the base temporary directory is more permissive than the default. -- gh-issue-116741: Update bundled libexpat to 2.6.2 +- gh-116741: Update bundled libexpat to 2.6.2 -- gh-issue-117233: Detect BLAKE2, SHA3, Shake, & truncated SHA512 support in - the OpenSSL-ish libcrypto library at build time. This allows - :mod:`hashlib` to be used with libraries that do not to support every - algorithm that upstream OpenSSL does. +- gh-117233: Detect BLAKE2, SHA3, Shake, & truncated SHA512 support in the + OpenSSL-ish libcrypto library at build time. This allows :mod:`hashlib` + to be used with libraries that do not to support every algorithm that + upstream OpenSSL does. Core and Builtins ----------------- -- gh-issue-119821: Fix execution of :ref:`annotation scopes - ` within classes when ``globals`` is set to a non-dict. - Patch by Jelle Zijlstra. - -- gh-issue-118263: Speed up :func:`os.path.normpath` with a direct C call. - -- gh-issue-119311: Fix bug where names are unexpectedly mangled in the bases - of generic classes. +- gh-119821: Fix execution of :ref:`annotation scopes ` + within classes when ``globals`` is set to a non-dict. Patch by Jelle + Zijlstra. -- gh-issue-119395: Fix bug where names appearing after a generic class are - mangled as if they are in the generic class. +- gh-119311: Fix bug where names are unexpectedly mangled in the bases of + generic classes. -- gh-issue-118507: Fix :func:`os.path.isfile` on Windows for pipes. +- gh-119395: Fix bug where names appearing after a generic class are mangled + as if they are in the generic class. -- gh-issue-119213: Non-builtin modules built with argument clinic were - crashing if used in a subinterpreter before the main interpreter. The - objects that were causing the problem by leaking between interpreters - carelessly have been fixed. +- gh-119213: Non-builtin modules built with argument clinic were crashing if + used in a subinterpreter before the main interpreter. The objects that + were causing the problem by leaking between interpreters carelessly have + been fixed. -- gh-issue-119011: Fixes ``type.__type_params__`` to return an empty tuple - instead of a descriptor. +- gh-119011: Fixes ``type.__type_params__`` to return an empty tuple instead + of a descriptor. -- gh-issue-118997: Fix _Py_ClearImmortal() assertion: use _Py_IsImmortal() - to tolerate reference count lower than _Py_IMMORTAL_REFCNT. Fix the - assertion for the stable ABI, when a C extension is built with Python 3.11 - or lower. Patch by Victor Stinner. +- gh-118997: Fix _Py_ClearImmortal() assertion: use _Py_IsImmortal() to + tolerate reference count lower than _Py_IMMORTAL_REFCNT. Fix the assertion + for the stable ABI, when a C extension is built with Python 3.11 or lower. + Patch by Victor Stinner. -- gh-issue-118513: Fix incorrect :exc:`UnboundLocalError` when two - comprehensions in the same function both reference the same name, and in - one comprehension the name is bound while in the other it's an implicit +- gh-118513: Fix incorrect :exc:`UnboundLocalError` when two comprehensions + in the same function both reference the same name, and in one + comprehension the name is bound while in the other it's an implicit global. -- gh-issue-118164: Break a loop between the Python implementation of the +- gh-118164: Break a loop between the Python implementation of the :mod:`decimal` module and the Python code for integer to string conversion. Also optimize integer to string conversion for values in the range from 9_000 to 135_000 decimal digits. -- gh-issue-118272: Fix bug where ``generator.close`` does not free the - generator frame's locals. +- gh-118272: Fix bug where ``generator.close`` does not free the generator + frame's locals. -- gh-issue-116767: Fix crash in compiler on 'async with' that has many - context managers. +- gh-116767: Fix crash in compiler on 'async with' that has many context + managers. -- gh-issue-117894: Prevent ``agen.aclose()`` objects being re-used after +- gh-117894: Prevent ``agen.aclose()`` objects being re-used after ``.throw()``. -- gh-issue-117881: prevent concurrent access to an async generator via +- gh-117881: prevent concurrent access to an async generator via athrow().throw() or asend().throw() -- gh-issue-115874: Fixed a possible segfault during garbage collection of +- gh-115874: Fixed a possible segfault during garbage collection of ``_asyncio.FutureIter`` objects Library ------- -- gh-issue-119819: Fix regression to allow logging configuration with +- gh-119819: Fix regression to allow logging configuration with multiprocessing queue types. -- gh-issue-89727: Fix issue with :func:`shutil.rmtree` where a +- gh-89727: Fix issue with :func:`shutil.rmtree` where a :exc:`RecursionError` is raised on deep directory trees. -- gh-issue-89727: Partially fix issue with :func:`shutil.rmtree` where a +- gh-89727: Partially fix issue with :func:`shutil.rmtree` where a :exc:`RecursionError` is raised on deep directory trees. A recursion error is no longer raised when :data:`!rmtree.avoids_symlink_attacks` is false. -- gh-issue-119118: Fix performance regression in the :mod:`tokenize` module - by caching the ``line`` token attribute and calculating the column offset +- gh-119118: Fix performance regression in the :mod:`tokenize` module by + caching the ``line`` token attribute and calculating the column offset more efficiently. -- gh-issue-89727: Fix issue with :func:`os.fwalk` where a - :exc:`RecursionError` was raised on deep directory trees by adjusting the - implementation to be iterative instead of recursive. +- gh-89727: Fix issue with :func:`os.fwalk` where a :exc:`RecursionError` + was raised on deep directory trees by adjusting the implementation to be + iterative instead of recursive. -- gh-issue-113892: Now, the method ``sock_connect`` of +- gh-118263: Speed up :func:`os.path.normpath` with a direct C call. + +- gh-113892: Now, the method ``sock_connect`` of :class:`asyncio.ProactorEventLoop` raises a :exc:`ValueError` if given socket is not in non-blocking mode, as well as in other loop implementations. -- gh-issue-119174: Fix high DPI causes turtledemo(turtle-graphics examples) +- gh-118507: Fix :func:`os.path.isfile` on Windows for pipes. + +- gh-119174: Fix high DPI causes turtledemo(turtle-graphics examples) windows blurry Patch by Wulian233 and Terry Jan Reedy -- gh-issue-118643: Fix an AttributeError in the :mod:`email` module when - re-fold a long address list. Also fix more cases of incorrect encoding of - the address separator in the address list. +- gh-118643: Fix an AttributeError in the :mod:`email` module when re-fold a + long address list. Also fix more cases of incorrect encoding of the + address separator in the address list. -- gh-issue-58933: Make :mod:`pdb` return to caller frame correctly when +- gh-58933: Make :mod:`pdb` return to caller frame correctly when ``f_trace`` of the caller frame is not set -- gh-issue-118868: Fixed issue where kwargs were no longer passed to the - logging handler QueueHandler +- gh-118868: Fixed issue where kwargs were no longer passed to the logging + handler QueueHandler -- gh-issue-118164: The Python implementation of the ``decimal`` module could +- gh-118164: The Python implementation of the ``decimal`` module could appear to hang in relatively small power cases (like ``2**117``) if context precision was set to a very high value. A different method to check for exactly representable results is used now that doesn't rely on computing ``10**precision`` (which could be effectively too large to compute). -- gh-issue-118404: Fix :func:`inspect.signature` for non-comparable - callables. +- gh-118404: Fix :func:`inspect.signature` for non-comparable callables. -- gh-issue-118314: Fix an edge case in :func:`binascii.a2b_base64` strict - mode, where excessive padding is not detected when no padding is - necessary. +- gh-118314: Fix an edge case in :func:`binascii.a2b_base64` strict mode, + where excessive padding is not detected when no padding is necessary. -- gh-issue-118042: Fix an unraisable exception in +- gh-118042: Fix an unraisable exception in :meth:`!telnetlib.Telnet.__del__` when the ``__init__()`` method was not called. -- gh-issue-118221: Fix a bug where :func:`!sqlite3.iterdump` could fail if a +- gh-118221: Fix a bug where :func:`!sqlite3.iterdump` could fail if a custom :attr:`row factory ` was used. Patch by Erlend Aasland. -- gh-issue-118013: Fix regression introduced in gh-103193 that meant that - calling :func:`inspect.getattr_static` on an instance would cause a strong +- gh-118013: Fix regression introduced in gh-103193 that meant that calling + :func:`inspect.getattr_static` on an instance would cause a strong reference to that instance's class to persist in an internal cache in the :mod:`inspect` module. This caused unexpected memory consumption if the class was dynamically created, the class held strong references to other @@ -149,61 +1164,61 @@ Library function should still be significantly faster than it was in Python 3.11. Patch by Alex Waygood. -- gh-issue-90848: Fixed :func:`unittest.mock.create_autospec` to configure - parent mock with keyword arguments. +- gh-90848: Fixed :func:`unittest.mock.create_autospec` to configure parent + mock with keyword arguments. -- gh-issue-118168: Fix incorrect argument substitution when - :data:`typing.Unpack` is used with the builtin :class:`tuple`. - :data:`!typing.Unpack` now raises :exc:`TypeError` when used with certain - invalid types. Patch by Jelle Zijlstra. +- gh-118168: Fix incorrect argument substitution when :data:`typing.Unpack` + is used with the builtin :class:`tuple`. :data:`!typing.Unpack` now raises + :exc:`TypeError` when used with certain invalid types. Patch by Jelle + Zijlstra. -- gh-issue-118033: Fix :func:`dataclasses.dataclass` not creating a +- gh-118033: Fix :func:`dataclasses.dataclass` not creating a ``__weakref__`` slot when subclassing :class:`typing.Generic`. -- gh-issue-117535: Do not try to get the source line for made up file name - "sys" in :mod:`warnings`. +- gh-117535: Do not try to get the source line for made up file name "sys" + in :mod:`warnings`. -- gh-issue-114053: Fix erroneous :exc:`NameError` when calling +- gh-114053: Fix erroneous :exc:`NameError` when calling :func:`typing.get_type_hints` on a class that made use of :pep:`695` type parameters in a module that had ``from __future__ import annotations`` at the top of the file. Patch by Alex Waygood. -- gh-issue-117995: Don't raise :exc:`DeprecationWarning` when a - :term:`sequence` of parameters is used to bind indexed, nameless - placeholders. See also :gh:`100668`. +- gh-117995: Don't raise :exc:`DeprecationWarning` when a :term:`sequence` + of parameters is used to bind indexed, nameless placeholders. See also + :gh:`100668`. -- gh-issue-80361: Fix TypeError in :func:`email.message.Message.get_payload` - when the charset is :rfc:`2231` encoded. +- gh-80361: Fix TypeError in :func:`email.message.Message.get_payload` when + the charset is :rfc:`2231` encoded. -- gh-issue-86650: Fix IndexError when parse some emails with invalid - Message-ID (including one-off addresses generated by Microsoft Outlook). +- gh-86650: Fix IndexError when parse some emails with invalid Message-ID + (including one-off addresses generated by Microsoft Outlook). -- gh-issue-117691: Improve the error messages emitted by :mod:`tarfile` +- gh-117691: Improve the error messages emitted by :mod:`tarfile` deprecation warnings relating to PEP 706. If a ``filter`` argument is not provided to ``extract()`` or ``extractall``, the deprecation warning now points to the line in the user's code where the relevant function was called. Patch by Alex Waygood. -- gh-issue-77102: :mod:`site` module now parses ``.pth`` file with UTF-8 - first, and :term:`locale encoding` if ``UnicodeDecodeError`` happened. It +- gh-77102: :mod:`site` module now parses ``.pth`` file with UTF-8 first, + and :term:`locale encoding` if ``UnicodeDecodeError`` happened. It supported only locale encoding before. -- gh-issue-117692: Fixes a bug when :class:`doctest.DocTestFinder` was - failing on wrapped ``builtin_function_or_method``. +- gh-117692: Fixes a bug when :class:`doctest.DocTestFinder` was failing on + wrapped ``builtin_function_or_method``. -- gh-issue-117566: :meth:`ipaddress.IPv6Address.is_loopback` will now return +- gh-117566: :meth:`ipaddress.IPv6Address.is_loopback` will now return ``True`` for IPv4-mapped loopback addresses, i.e. addresses in the ``::ffff:127.0.0.0/104`` address space. -- gh-issue-117503: Fix support of non-ASCII user names in bytes paths in +- gh-117503: Fix support of non-ASCII user names in bytes paths in :func:`os.path.expanduser` on Posix. -- gh-issue-117313: Only treat ``'\n'``, ``'\r'`` and ``'\r\n'`` as line - separators in re-folding the :mod:`email` messages. Preserve control - characters ``'\v'``, ``'\f'``, ``'\x1c'``, ``'\x1d'`` and ``'\x1e'`` and - Unicode line separators ``'\x85'``, ``'\u2028'`` and ``'\u2029'`` as is. +- gh-117313: Only treat ``'\n'``, ``'\r'`` and ``'\r\n'`` as line separators + in re-folding the :mod:`email` messages. Preserve control characters + ``'\v'``, ``'\f'``, ``'\x1c'``, ``'\x1d'`` and ``'\x1e'`` and Unicode line + separators ``'\x85'``, ``'\u2028'`` and ``'\u2029'`` as is. -- gh-issue-113171: Fixed various false positives and false negatives in +- gh-113171: Fixed various false positives and false negatives in * :attr:`ipaddress.IPv4Address.is_private` (see these docs for details) * :attr:`ipaddress.IPv4Address.is_global` @@ -213,19 +1228,19 @@ Library Also in the corresponding :class:`ipaddress.IPv4Network` and :class:`ipaddress.IPv6Network` attributes. -- gh-issue-103956: Fix lack of newline characters in :mod:`trace` module - output when line tracing is enabled but source code line for current frame - is not available. +- gh-103956: Fix lack of newline characters in :mod:`trace` module output + when line tracing is enabled but source code line for current frame is not + available. -- gh-issue-92081: Fix missing spaces in email headers when the spaces are - mixed with encoded 8-bit characters. +- gh-92081: Fix missing spaces in email headers when the spaces are mixed + with encoded 8-bit characters. -- gh-issue-103194: Prepare Tkinter for C API changes in Tcl 8.7/9.0 to avoid +- gh-103194: Prepare Tkinter for C API changes in Tcl 8.7/9.0 to avoid :class:`_tkinter.Tcl_Obj` being unexpectedly returned instead of :class:`bool`, :class:`str`, :class:`bytearray`, or :class:`int`. -- gh-issue-87106: Fixed handling in :meth:`inspect.Signature.bind` of - keyword arguments having the same name as positional-only arguments when a +- gh-87106: Fixed handling in :meth:`inspect.Signature.bind` of keyword + arguments having the same name as positional-only arguments when a variadic keyword argument (e.g. ``**kwargs``) is present. - bpo-45767: Fix integer conversion in :func:`os.major`, :func:`os.minor`, @@ -238,7 +1253,7 @@ Library - bpo-30988: Fix parsing of emails with invalid address headers having a leading or trailing dot. Patch by tsufeki. -- gh-issue-67693: Fix :func:`urllib.parse.urlunparse` and +- gh-67693: Fix :func:`urllib.parse.urlunparse` and :func:`urllib.parse.urlunsplit` for URIs with path starting with multiple slashes and no authority. Based on patch by Ashwin Ramaswami. @@ -249,45 +1264,44 @@ Library Documentation ------------- -- gh-issue-117928: The minimum Sphinx version required for the documentation - is now 6.2.1. +- gh-117928: The minimum Sphinx version required for the documentation is + now 6.2.1. -- gh-issue-91565: Changes to documentation files and config outputs to - reflect the new location for reporting bugs - i.e. GitHub rather than - bugs.python.org. +- gh-91565: Changes to documentation files and config outputs to reflect the + new location for reporting bugs - i.e. GitHub rather than bugs.python.org. Tests ----- -- gh-issue-119050: regrtest test runner: Add XML support to the refleak - checker (-R option). Patch by Victor Stinner. +- gh-119050: regrtest test runner: Add XML support to the refleak checker + (-R option). Patch by Victor Stinner. Windows ------- -- gh-issue-119690: Adds Unicode support and fixes audit events for +- gh-119690: Adds Unicode support and fixes audit events for ``_winapi.CreateNamedPipe``. -- gh-issue-119070: Fixes ``py.exe`` handling of shebangs like ``/usr/bin/env +- gh-119070: Fixes ``py.exe`` handling of shebangs like ``/usr/bin/env python3.12``, which were previously interpreted as ``python3.exe`` instead of ``python3.12.exe``. -- gh-issue-118347: Fixes launcher updates not being installed. +- gh-118347: Fixes launcher updates not being installed. -- gh-issue-115009: Update Windows installer to use SQLite 3.45.3. +- gh-115009: Update Windows installer to use SQLite 3.45.3. -- gh-issue-90329: Suppress the warning displayed on virtual environment - creation when the requested and created paths differ only by a short (8.3 - style) name. Warnings will continue to be shown if a junction or symlink - in the path caused the venv to be created in a different location than - originally requested. +- gh-90329: Suppress the warning displayed on virtual environment creation + when the requested and created paths differ only by a short (8.3 style) + name. Warnings will continue to be shown if a junction or symlink in the + path caused the venv to be created in a different location than originally + requested. macOS ----- -- gh-issue-115009: Update macOS installer to use SQLite 3.45.3. +- gh-115009: Update macOS installer to use SQLite 3.45.3. -- gh-issue-116145: Update macOS installer to Tcl/Tk 8.6.14. +- gh-116145: Update macOS installer to Tcl/Tk 8.6.14. IDLE ---- @@ -297,14 +1311,14 @@ IDLE C API ----- -- gh-issue-119585: Fix crash when a thread state that was created by +- gh-119585: Fix crash when a thread state that was created by :c:func:`PyGILState_Ensure` calls a destructor that during :c:func:`PyThreadState_Clear` that calls back into :c:func:`PyGILState_Ensure` and :c:func:`PyGILState_Release`. This might occur when in the free-threaded build or when using thread-local variables whose destructors call :c:func:`PyGILState_Ensure`. -- gh-issue-117534: Improve validation logic in the C implementation of +- gh-117534: Improve validation logic in the C implementation of :meth:`datetime.fromisoformat` to better handle invalid years. Patch by Vlad Efanov. @@ -317,7 +1331,7 @@ What's New in Python 3.12.3 final? Security -------- -- gh-issue-115398: Allow controlling Expat >=2.6.0 reparse deferral +- gh-115398: Allow controlling Expat >=2.6.0 reparse deferral (:cve:`2023-52425`) by adding five new methods: * :meth:`xml.etree.ElementTree.XMLParser.flush` @@ -326,12 +1340,12 @@ Security * :meth:`xml.parsers.expat.xmlparser.SetReparseDeferralEnabled` * :meth:`xml.sax.expatreader.ExpatParser.flush` -- gh-issue-115399: Update bundled libexpat to 2.6.0 +- gh-115399: Update bundled libexpat to 2.6.0 -- gh-issue-115243: Fix possible crashes in :meth:`collections.deque.index` - when the deque is concurrently modified. +- gh-115243: Fix possible crashes in :meth:`collections.deque.index` when + the deque is concurrently modified. -- gh-issue-114572: :meth:`ssl.SSLContext.cert_store_stats` and +- gh-114572: :meth:`ssl.SSLContext.cert_store_stats` and :meth:`ssl.SSLContext.get_ca_certs` now correctly lock access to the certificate store, when the :class:`ssl.SSLContext` is shared across multiple threads. @@ -339,126 +1353,125 @@ Security Core and Builtins ----------------- -- gh-issue-109120: Added handle of incorrect star expressions, e.g ``f(3, - *)``. Patch by Grigoryev Semyon +- gh-109120: Added handle of incorrect star expressions, e.g ``f(3, *)``. + Patch by Grigoryev Semyon -- gh-issue-99108: Updated the :mod:`hashlib` built-in `HACL\* project`_ C - code from upstream that we use for many implementations when they are not +- gh-99108: Updated the :mod:`hashlib` built-in `HACL\* project`_ C code + from upstream that we use for many implementations when they are not present via OpenSSL in a given build. This also avoids the rare potential for a C symbol name one definition rule linking issue. .. _HACL\* project: https://github.com/hacl-star/hacl-star -- gh-issue-116735: For ``INSTRUMENTED_CALL_FUNCTION_EX``, set ``arg0`` to +- gh-116735: For ``INSTRUMENTED_CALL_FUNCTION_EX``, set ``arg0`` to ``sys.monitoring.MISSING`` instead of ``None`` for :monitoring-event:`CALL` event. -- gh-issue-113964: Starting new threads and process creation through +- gh-113964: Starting new threads and process creation through :func:`os.fork` are now only prevented once all non-daemon threads exit. -- gh-issue-116604: Respect the status of the garbage collector when indirect - calls are made via :c:func:`PyErr_CheckSignals` and the evaluation - breaker. Patch by Pablo Galindo +- gh-116604: Respect the status of the garbage collector when indirect calls + are made via :c:func:`PyErr_CheckSignals` and the evaluation breaker. + Patch by Pablo Galindo -- gh-issue-116626: Ensure ``INSTRUMENTED_CALL_FUNCTION_EX`` always emits +- gh-116626: Ensure ``INSTRUMENTED_CALL_FUNCTION_EX`` always emits :monitoring-event:`CALL` -- gh-issue-116296: Fix possible refleak in :meth:`!object.__reduce__` - internal error handling. +- gh-116296: Fix possible refleak in :meth:`!object.__reduce__` internal + error handling. -- gh-issue-116034: Fix location of the error on a failed assertion. +- gh-116034: Fix location of the error on a failed assertion. -- gh-issue-115823: Properly calculate error ranges in the parser when - raising :exc:`SyntaxError` exceptions caused by invalid byte sequences. - Patch by Pablo Galindo +- gh-115823: Properly calculate error ranges in the parser when raising + :exc:`SyntaxError` exceptions caused by invalid byte sequences. Patch by + Pablo Galindo -- gh-issue-112087: For an empty reverse iterator for list will be reduced to +- gh-112087: For an empty reverse iterator for list will be reduced to :func:`reversed`. Patch by Donghee Na. -- gh-issue-115154: Fix a bug that was causing the - :func:`tokenize.untokenize` function to handle unicode named literals - incorrectly. Patch by Pablo Galindo +- gh-115154: Fix a bug that was causing the :func:`tokenize.untokenize` + function to handle unicode named literals incorrectly. Patch by Pablo + Galindo -- gh-issue-114828: Fix compilation crashes in uncommon code examples using +- gh-114828: Fix compilation crashes in uncommon code examples using :func:`super` inside a comprehension in a class body. -- gh-issue-115011: Setters for members with an unsigned integer type now - support the same range of valid values for objects that has a +- gh-115011: Setters for members with an unsigned integer type now support + the same range of valid values for objects that has a :meth:`~object.__index__` method as for :class:`int`. -- gh-issue-112215: Change the C recursion limits to more closely reflect the +- gh-112215: Change the C recursion limits to more closely reflect the underlying platform limits. -- gh-issue-96497: Fix incorrect resolution of mangled class variables used - in assignment expressions in comprehensions. +- gh-96497: Fix incorrect resolution of mangled class variables used in + assignment expressions in comprehensions. Library ------- -- gh-issue-117467: Preserve mailbox ownership when rewriting in +- gh-117467: Preserve mailbox ownership when rewriting in :func:`mailbox.mbox.flush`. Patch by Tony Mountifield. -- gh-issue-117310: Fixed an unlikely early & extra ``Py_DECREF`` triggered - crash in :mod:`ssl` when creating a new ``_ssl._SSLContext`` if CPython - was built implausibly such that the default cipher list is empty **or** - the SSL library it was linked against reports a failure from its C +- gh-117310: Fixed an unlikely early & extra ``Py_DECREF`` triggered crash + in :mod:`ssl` when creating a new ``_ssl._SSLContext`` if CPython was + built implausibly such that the default cipher list is empty **or** the + SSL library it was linked against reports a failure from its C ``SSL_CTX_set_cipher_list()`` API. -- gh-issue-117178: Fix regression in lazy loading of self-referential - modules, introduced in gh-114781. +- gh-117178: Fix regression in lazy loading of self-referential modules, + introduced in gh-114781. -- gh-issue-117084: Fix :mod:`zipfile` extraction for directory entries with - the name containing backslashes on Windows. +- gh-117084: Fix :mod:`zipfile` extraction for directory entries with the + name containing backslashes on Windows. -- gh-issue-117110: Fix a bug that prevents subclasses of :class:`typing.Any` - to be instantiated with arguments. Patch by Chris Fu. +- gh-117110: Fix a bug that prevents subclasses of :class:`typing.Any` to be + instantiated with arguments. Patch by Chris Fu. -- gh-issue-90872: On Windows, :meth:`subprocess.Popen.wait` no longer calls +- gh-90872: On Windows, :meth:`subprocess.Popen.wait` no longer calls ``WaitForSingleObject()`` with a negative timeout: pass ``0`` ms if the timeout is negative. Patch by Victor Stinner. -- gh-issue-116957: configparser: Don't leave ConfigParser values in an - invalid state (stored as a list instead of a str) after an earlier read - raised DuplicateSectionError or DuplicateOptionError. +- gh-116957: configparser: Don't leave ConfigParser values in an invalid + state (stored as a list instead of a str) after an earlier read raised + DuplicateSectionError or DuplicateOptionError. -- gh-issue-90095: Ignore empty lines and comments in ``.pdbrc`` +- gh-90095: Ignore empty lines and comments in ``.pdbrc`` -- gh-issue-116764: Restore support of ``None`` and other false values in +- gh-116764: Restore support of ``None`` and other false values in :mod:`urllib.parse` functions :func:`~urllib.parse.parse_qs` and :func:`~urllib.parse.parse_qsl`. Also, they now raise a TypeError for non-zero integers and non-empty sequences. -- gh-issue-116811: In ``PathFinder.invalidate_caches``, delegate to +- gh-116811: In ``PathFinder.invalidate_caches``, delegate to ``MetadataPathFinder.invalidate_caches``. -- gh-issue-116600: Fix :func:`repr` for global :class:`~enum.Flag` members. +- gh-116600: Fix :func:`repr` for global :class:`~enum.Flag` members. -- gh-issue-116484: Change automatically generated - :class:`tkinter.Checkbutton` widget names to avoid collisions with - automatically generated :class:`tkinter.ttk.Checkbutton` widget names - within the same parent widget. +- gh-116484: Change automatically generated :class:`tkinter.Checkbutton` + widget names to avoid collisions with automatically generated + :class:`tkinter.ttk.Checkbutton` widget names within the same parent + widget. -- gh-issue-116401: Fix blocking :func:`os.fwalk` and :func:`shutil.rmtree` - on opening named pipe. +- gh-116401: Fix blocking :func:`os.fwalk` and :func:`shutil.rmtree` on + opening named pipe. -- gh-issue-116143: Fix a race in pydoc ``_start_server``, eliminating a - window in which ``_start_server`` can return a thread that is "serving" - but without a ``docserver`` set. +- gh-116143: Fix a race in pydoc ``_start_server``, eliminating a window in + which ``_start_server`` can return a thread that is "serving" but without + a ``docserver`` set. -- gh-issue-116325: :mod:`typing`: raise :exc:`SyntaxError` instead of +- gh-116325: :mod:`typing`: raise :exc:`SyntaxError` instead of :exc:`AttributeError` on forward references as empty strings. -- gh-issue-90535: Fix support of *interval* values > 1 in +- gh-90535: Fix support of *interval* values > 1 in :class:`logging.TimedRotatingFileHandler` for ``when='MIDNIGHT'`` and ``when='Wx'``. -- gh-issue-115978: Disable preadv(), readv(), pwritev(), and writev() on - WASI. +- gh-115978: Disable preadv(), readv(), pwritev(), and writev() on WASI. Under wasmtime for WASI 0.2, these functions don't pass test_posix (https://github.com/bytecodealliance/wasmtime/issues/7830). -- gh-issue-88352: Fix the computation of the next rollover time in the +- gh-88352: Fix the computation of the next rollover time in the :class:`logging.TimedRotatingFileHandler` handler. :meth:`!computeRollover` now always returns a timestamp larger than the specified time and works correctly during the DST change. @@ -466,105 +1479,104 @@ Library saving from data loss when run at midnight or during repeated time at the DST change. -- gh-issue-87115: Set ``__main__.__spec__`` to ``None`` when running a - script with :mod:`pdb` +- gh-87115: Set ``__main__.__spec__`` to ``None`` when running a script with + :mod:`pdb` -- gh-issue-76511: Fix UnicodeEncodeError in :meth:`email.Message.as_string` - that results when a message that claims to be in the ascii character set +- gh-76511: Fix UnicodeEncodeError in :meth:`email.Message.as_string` that + results when a message that claims to be in the ascii character set actually has non-ascii characters. Non-ascii characters are now replaced with the U+FFFD replacement character, like in the ``replace`` error handler. -- gh-issue-116040: [Enum] fix by-value calls when second value is falsey; - e.g. Cardinal(1, 0) +- gh-116040: [Enum] fix by-value calls when second value is falsey; e.g. + Cardinal(1, 0) -- gh-issue-75988: Fixed :func:`unittest.mock.create_autospec` to pass the - call through to the wrapped object to return the real result. +- gh-75988: Fixed :func:`unittest.mock.create_autospec` to pass the call + through to the wrapped object to return the real result. -- gh-issue-115881: Fix issue where :func:`ast.parse` would incorrectly flag +- gh-115881: Fix issue where :func:`ast.parse` would incorrectly flag conditional context managers (such as ``with (x() if y else z()): ...``) as invalid syntax if ``feature_version=(3, 8)`` was passed. This reverts changes to the grammar made as part of gh-94949. -- gh-issue-115886: Fix silent truncation of the name with an embedded null +- gh-115886: Fix silent truncation of the name with an embedded null character in :class:`multiprocessing.shared_memory.SharedMemory`. -- gh-issue-115809: Improve algorithm for computing which rolled-over log - files to delete in :class:`logging.TimedRotatingFileHandler`. It is now - reliable for handlers without ``namer`` and with arbitrary deterministic - ``namer`` that leaves the datetime part in the file name unmodified. +- gh-115809: Improve algorithm for computing which rolled-over log files to + delete in :class:`logging.TimedRotatingFileHandler`. It is now reliable + for handlers without ``namer`` and with arbitrary deterministic ``namer`` + that leaves the datetime part in the file name unmodified. -- gh-issue-74668: :mod:`urllib.parse` functions - :func:`~urllib.parse.parse_qs` and :func:`~urllib.parse.parse_qsl` now - support bytes arguments containing raw and percent-encoded non-ASCII data. +- gh-74668: :mod:`urllib.parse` functions :func:`~urllib.parse.parse_qs` and + :func:`~urllib.parse.parse_qsl` now support bytes arguments containing raw + and percent-encoded non-ASCII data. -- gh-issue-67044: :func:`csv.writer` now always quotes or escapes ``'\r'`` - and ``'\n'``, regardless of *lineterminator* value. +- gh-67044: :func:`csv.writer` now always quotes or escapes ``'\r'`` and + ``'\n'``, regardless of *lineterminator* value. -- gh-issue-115712: :func:`csv.writer()` now quotes empty fields if delimiter - is a space and skipinitialspace is true and raises exception if quoting is - not possible. +- gh-115712: :func:`csv.writer` now quotes empty fields if delimiter is a + space and skipinitialspace is true and raises exception if quoting is not + possible. -- gh-issue-112364: Fixed :func:`ast.unparse` to handle format_spec with - ``"``, ``'`` or ``\\``. Patched by Frank Hoffmann. +- gh-112364: Fixed :func:`ast.unparse` to handle format_spec with ``"``, + ``'`` or ``\\``. Patched by Frank Hoffmann. -- gh-issue-111358: Fix a bug in +- gh-111358: Fix a bug in :meth:`asyncio.BaseEventLoop.shutdown_default_executor` to ensure the timeout passed to the coroutine behaves as expected. -- gh-issue-115618: Fix improper decreasing the reference count for ``None`` +- gh-115618: Fix improper decreasing the reference count for ``None`` argument in :class:`property` methods :meth:`~property.getter`, :meth:`~property.setter` and :meth:`~property.deleter`. -- gh-issue-115570: A :exc:`DeprecationWarning` is no longer omitted on - access to the ``__doc__`` attributes of the deprecated ``typing.io`` and +- gh-115570: A :exc:`DeprecationWarning` is no longer omitted on access to + the ``__doc__`` attributes of the deprecated ``typing.io`` and ``typing.re`` pseudo-modules. -- gh-issue-112006: Fix :func:`inspect.unwrap` for types with the - ``__wrapper__`` data descriptor. +- gh-112006: Fix :func:`inspect.unwrap` for types with the ``__wrapper__`` + data descriptor. -- gh-issue-101293: Support callables with the ``__call__()`` method and - types with ``__new__()`` and ``__init__()`` methods set to class methods, - static methods, bound methods, partial functions, and other types of - methods and descriptors in :meth:`inspect.Signature.from_callable`. +- gh-101293: Support callables with the ``__call__()`` method and types with + ``__new__()`` and ``__init__()`` methods set to class methods, static + methods, bound methods, partial functions, and other types of methods and + descriptors in :meth:`inspect.Signature.from_callable`. -- gh-issue-115392: Fix a bug in :mod:`doctest` where incorrect line numbers - would be reported for decorated functions. +- gh-115392: Fix a bug in :mod:`doctest` where incorrect line numbers would + be reported for decorated functions. -- gh-issue-114563: Fix several :func:`format()` bugs when using the C - implementation of :class:`~decimal.Decimal`: * memory leak in some rare - cases when using the ``z`` format option (coerce negative 0) * incorrect - output when applying the ``z`` format option to type ``F`` (fixed-point - with capital ``NAN`` / ``INF``) * incorrect output when applying the ``#`` - format option (alternate form) +- gh-114563: Fix several :func:`format` bugs when using the C implementation + of :class:`~decimal.Decimal`: * memory leak in some rare cases when using + the ``z`` format option (coerce negative 0) * incorrect output when + applying the ``z`` format option to type ``F`` (fixed-point with capital + ``NAN`` / ``INF``) * incorrect output when applying the ``#`` format + option (alternate form) -- gh-issue-115197: ``urllib.request`` no longer resolves the hostname before +- gh-115197: ``urllib.request`` no longer resolves the hostname before checking it against the system's proxy bypass list on macOS and Windows. -- gh-issue-115165: Most exceptions are now ignored when attempting to set - the ``__orig_class__`` attribute on objects returned when calling +- gh-115165: Most exceptions are now ignored when attempting to set the + ``__orig_class__`` attribute on objects returned when calling :mod:`typing` generic aliases (including generic aliases created using :data:`typing.Annotated`). Previously only :exc:`AttributeError` was ignored. Patch by Dave Shawley. -- gh-issue-115133: Fix tests for - :class:`~xml.etree.ElementTree.XMLPullParser` with Expat 2.6.0. +- gh-115133: Fix tests for :class:`~xml.etree.ElementTree.XMLPullParser` + with Expat 2.6.0. -- gh-issue-115059: :meth:`io.BufferedRandom.read1` now flushes the - underlying write buffer. +- gh-115059: :meth:`io.BufferedRandom.read1` now flushes the underlying + write buffer. -- gh-issue-79382: Trailing ``**`` no longer allows to match files and - non-existing paths in recursive :func:`~glob.glob`. +- gh-79382: Trailing ``**`` no longer allows to match files and non-existing + paths in recursive :func:`~glob.glob`. -- gh-issue-114071: Support tuple subclasses using auto() for enum member - value. +- gh-114071: Support tuple subclasses using auto() for enum member value. -- gh-issue-114763: Protect modules loaded with - :class:`importlib.util.LazyLoader` from race conditions when multiple - threads try to access attributes before the loading is complete. +- gh-114763: Protect modules loaded with :class:`importlib.util.LazyLoader` + from race conditions when multiple threads try to access attributes before + the loading is complete. -- gh-issue-97959: Fix rendering class methods, bound methods, method and - function aliases in :mod:`pydoc`. Class methods no longer have "method of +- gh-97959: Fix rendering class methods, bound methods, method and function + aliases in :mod:`pydoc`. Class methods no longer have "method of builtins.type instance" note. Corresponding notes are now added for class and unbound methods. Method and function aliases now have references to the module or the class where the origin was defined if it differs from @@ -572,46 +1584,45 @@ Library Methods of builtin classes are now supported as well as methods of Python classes. -- gh-issue-112281: Allow creating :ref:`union of types` for +- gh-112281: Allow creating :ref:`union of types` for :class:`typing.Annotated` with unhashable metadata. -- gh-issue-111775: Fix - :meth:`importlib.resources.simple.ResourceHandle.open` for text mode, - added missed ``stream`` argument. +- gh-111775: Fix :meth:`importlib.resources.simple.ResourceHandle.open` for + text mode, added missed ``stream`` argument. -- gh-issue-90095: Make .pdbrc and -c work with any valid pdb commands. +- gh-90095: Make .pdbrc and -c work with any valid pdb commands. -- gh-issue-107155: Fix incorrect output of ``help(x)`` where ``x`` is a +- gh-107155: Fix incorrect output of ``help(x)`` where ``x`` is a :keyword:`lambda` function, which has an ``__annotations__`` dictionary attribute with a ``"return"`` key. -- gh-issue-105866: Fixed ``_get_slots`` bug which caused error when defining +- gh-105866: Fixed ``_get_slots`` bug which caused error when defining dataclasses with slots and a weakref_slot. -- gh-issue-60346: Fix ArgumentParser inconsistent with parse_known_args. +- gh-60346: Fix ArgumentParser inconsistent with parse_known_args. -- gh-issue-100985: Update HTTPSConnection to consistently wrap IPv6 - Addresses when using a proxy. +- gh-100985: Update HTTPSConnection to consistently wrap IPv6 Addresses when + using a proxy. -- gh-issue-100884: email: fix misfolding of comma in address-lists over - multiple lines in combination with unicode encoding. +- gh-100884: email: fix misfolding of comma in address-lists over multiple + lines in combination with unicode encoding. -- gh-issue-95782: Fix :func:`io.BufferedReader.tell`, - :func:`io.BufferedReader.seek`, :func:`_pyio.BufferedReader.tell`, +- gh-95782: Fix :func:`io.BufferedReader.tell`, + :func:`io.BufferedReader.seek`, :func:`!_pyio.BufferedReader.tell`, :func:`io.BufferedRandom.tell`, :func:`io.BufferedRandom.seek` and - :func:`_pyio.BufferedRandom.tell` being able to return negative offsets. + :func:`!_pyio.BufferedRandom.tell` being able to return negative offsets. -- gh-issue-96310: Fix a traceback in :mod:`argparse` when all options in a +- gh-96310: Fix a traceback in :mod:`argparse` when all options in a mutually exclusive group are suppressed. -- gh-issue-93205: Fixed a bug in +- gh-93205: Fixed a bug in :class:`logging.handlers.TimedRotatingFileHandler` where multiple rotating handler instances pointing to files with the same name but different extensions would conflict and not delete the correct files. - bpo-44865: Add missing call to localization function in :mod:`argparse`. -- bpo-43952: Fix :meth:`multiprocessing.connection.Listener.accept()` to +- bpo-43952: Fix :meth:`multiprocessing.connection.Listener.accept` to accept empty bytes as authkey. Not accepting empty bytes as key causes it to hang indefinitely. @@ -619,9 +1630,9 @@ Library allows getting source code for the ``__main__`` module when a custom loader is used. -- gh-issue-66543: Make :func:`mimetypes.guess_type` properly parsing of URLs - with only a host name, URLs containing fragment or query, and filenames - with only a UNC sharepoint on Windows. Based on patch by Dong-hee Na. +- gh-66543: Make :func:`mimetypes.guess_type` properly parsing of URLs with + only a host name, URLs containing fragment or query, and filenames with + only a UNC sharepoint on Windows. Based on patch by Dong-hee Na. - bpo-33775: Add 'default' and 'version' help text for localization in argparse. @@ -629,112 +1640,110 @@ Library Documentation ------------- -- gh-issue-115399: Document :cve:`2023-52425` of Expat <2.6.0 under "XML +- gh-115399: Document :cve:`2023-52425` of Expat <2.6.0 under "XML vulnerabilities". -- gh-issue-115233: Fix an example for :class:`~logging.LoggerAdapter` in the +- gh-115233: Fix an example for :class:`~logging.LoggerAdapter` in the Logging Cookbook. Tests ----- -- gh-issue-83434: Disable JUnit XML output (``--junit-xml=FILE`` command - line option) in regrtest when hunting for reference leaks (``-R`` option). +- gh-83434: Disable JUnit XML output (``--junit-xml=FILE`` command line + option) in regrtest when hunting for reference leaks (``-R`` option). Patch by Victor Stinner. -- gh-issue-117187: Fix XML tests for vanilla Expat <2.6.0. +- gh-117187: Fix XML tests for vanilla Expat <2.6.0. -- gh-issue-116333: Tests of TLS related things (error codes, etc) were - updated to be more lenient about specific error message strings and - behaviors as seen in the BoringSSL and AWS-LC forks of OpenSSL. +- gh-116333: Tests of TLS related things (error codes, etc) were updated to + be more lenient about specific error message strings and behaviors as seen + in the BoringSSL and AWS-LC forks of OpenSSL. -- gh-issue-115979: Update test_importlib so that it passes under WASI SDK - 21. +- gh-115979: Update test_importlib so that it passes under WASI SDK 21. -- gh-issue-112536: Add --tsan to test.regrtest for running TSAN tests in +- gh-112536: Add --tsan to test.regrtest for running TSAN tests in reasonable execution times. Patch by Donghee Na. -- gh-issue-116307: Added import helper ``isolated_modules`` as - ``CleanImport`` does not remove modules imported during the context. Use - it in importlib.resources tests to avoid leaving ``mod`` around to impede +- gh-116307: Added import helper ``isolated_modules`` as ``CleanImport`` + does not remove modules imported during the context. Use it in + importlib.resources tests to avoid leaving ``mod`` around to impede importlib.metadata tests. -- gh-issue-115720: Leak tests (``-R``, ``--huntrleaks``) now show a summary - of the number of leaks found in each iteration. +- gh-115720: Leak tests (``-R``, ``--huntrleaks``) now show a summary of the + number of leaks found in each iteration. -- gh-issue-115122: Add ``--bisect`` option to regrtest test runner: run - failed tests with ``test.bisect_cmd`` to identify failing tests. Patch by - Victor Stinner. +- gh-115122: Add ``--bisect`` option to regrtest test runner: run failed + tests with ``test.bisect_cmd`` to identify failing tests. Patch by Victor + Stinner. -- gh-issue-115596: Fix ``ProgramPriorityTests`` in ``test_os`` permanently +- gh-115596: Fix ``ProgramPriorityTests`` in ``test_os`` permanently changing the process priority. Build ----- -- gh-issue-116313: Get WASI builds to work under wasmtime 18 w/ WASI - 0.2/preview2 primitives. +- gh-116313: Get WASI builds to work under wasmtime 18 w/ WASI 0.2/preview2 + primitives. -- gh-issue-116117: Backport ``libb2``'s PR #42 to fix compiling CPython on - 32-bit Windows with ``clang-cl``. +- gh-116117: Backport ``libb2``'s PR #42 to fix compiling CPython on 32-bit + Windows with ``clang-cl``. -- gh-issue-115167: Avoid vendoring ``vcruntime140_threads.dll`` when - building with Visual Studio 2022 version 17.8. +- gh-115167: Avoid vendoring ``vcruntime140_threads.dll`` when building with + Visual Studio 2022 version 17.8. -- gh-issue-112536: Add support for thread sanitizer (TSAN) +- gh-112536: Add support for thread sanitizer (TSAN) Windows ------- -- gh-issue-117267: Ensure ``DirEntry.stat().st_ctime`` behaves consistently - with :func:`os.stat` during the deprecation period of ``st_ctime`` by +- gh-117267: Ensure ``DirEntry.stat().st_ctime`` behaves consistently with + :func:`os.stat` during the deprecation period of ``st_ctime`` by containing the same value as ``st_birthtime``. After the deprecation period, ``st_ctime`` will be the metadata change time (or unavailable through ``DirEntry``), and only ``st_birthtime`` will contain the creation time. -- gh-issue-116773: Fix instances of ``<_overlapped.Overlapped object at - 0xXXX> still has pending operation at deallocation, the process may - crash``. +- gh-116773: Fix instances of ``<_overlapped.Overlapped object at 0xXXX> + still has pending operation at deallocation, the process may crash``. -- gh-issue-91227: Fix the asyncio ProactorEventLoop implementation so that - sending a datagram to an address that is not listening does not prevent - receiving any more datagrams. +- gh-91227: Fix the asyncio ProactorEventLoop implementation so that sending + a datagram to an address that is not listening does not prevent receiving + any more datagrams. -- gh-issue-115554: The installer now has more strict rules about updating - the :ref:`launcher`. In general, most users only have a single launcher +- gh-115554: The installer now has more strict rules about updating the + :ref:`launcher`. In general, most users only have a single launcher installed and will see no difference. When multiple launchers have been installed, the option to install the launcher is disabled until all but one have been removed. Downgrading the launcher (which was never allowed) is now more obviously blocked. -- gh-issue-115543: :ref:`launcher` can now detect Python 3.13 when installed - from the Microsoft Store, and will install Python 3.12 by default when +- gh-115543: :ref:`launcher` can now detect Python 3.13 when installed from + the Microsoft Store, and will install Python 3.12 by default when :envvar:`PYLAUNCHER_ALLOW_INSTALL` is set. -- gh-issue-115049: Fixes ``py.exe`` launcher failing when run as users - without user profiles. +- gh-115049: Fixes ``py.exe`` launcher failing when run as users without + user profiles. -- gh-issue-115009: Update Windows installer to use SQLite 3.45.1. +- gh-115009: Update Windows installer to use SQLite 3.45.1. IDLE ---- -- gh-issue-88516: On macOS show a proxy icon in the title bar of editor - windows to match platform behaviour. +- gh-88516: On macOS show a proxy icon in the title bar of editor windows to + match platform behaviour. Tools/Demos ----------- -- gh-issue-113516: Don't set ``LDSHARED`` when building for WASI. +- gh-113516: Don't set ``LDSHARED`` when building for WASI. C API ----- -- gh-issue-117021: Fix integer overflow in :c:func:`PyLong_AsPid` on - non-Windows 64-bit platforms. +- gh-117021: Fix integer overflow in :c:func:`PyLong_AsPid` on non-Windows + 64-bit platforms. -- gh-issue-116869: Make the C API compatible with +- gh-116869: Make the C API compatible with ``-Werror=declaration-after-statement`` compiler flag again. Patch by Victor Stinner. @@ -747,123 +1756,118 @@ What's New in Python 3.12.2 final? Security -------- -- gh-issue-113659: Skip ``.pth`` files with names starting with a dot or - hidden file attribute. +- gh-113659: Skip ``.pth`` files with names starting with a dot or hidden + file attribute. Core and Builtins ----------------- -- gh-issue-114887: Changed socket type validation in +- gh-114887: Changed socket type validation in :meth:`~asyncio.loop.create_datagram_endpoint` to accept all non-stream sockets. This fixes a regression in compatibility with raw sockets. -- gh-issue-114388: Fix a :exc:`RuntimeWarning` emitted when assign an - integer-like value that is not an instance of :class:`int` to an attribute - that corresponds to a C struct member of :ref:`type ` - T_UINT and T_ULONG. Fix a double :exc:`RuntimeWarning` emitted when assign - a negative integer value to an attribute that corresponds to a C struct +- gh-114388: Fix a :exc:`RuntimeWarning` emitted when assign an integer-like + value that is not an instance of :class:`int` to an attribute that + corresponds to a C struct member of :ref:`type ` T_UINT + and T_ULONG. Fix a double :exc:`RuntimeWarning` emitted when assign a + negative integer value to an attribute that corresponds to a C struct member of type T_UINT. -- gh-issue-113703: Fix a regression in the :mod:`codeop` module that was - causing it to incorrectly identify incomplete f-strings. Patch by Pablo - Galindo +- gh-113703: Fix a regression in the :mod:`codeop` module that was causing + it to incorrectly identify incomplete f-strings. Patch by Pablo Galindo -- gh-issue-89811: Check for a valid ``tp_version_tag`` before performing - bytecode specializations that rely on this value being usable. +- gh-89811: Check for a valid ``tp_version_tag`` before performing bytecode + specializations that rely on this value being usable. -- gh-issue-113602: Fix an error that was causing the parser to try to - overwrite existing errors and crashing in the process. Patch by Pablo - Galindo +- gh-113602: Fix an error that was causing the parser to try to overwrite + existing errors and crashing in the process. Patch by Pablo Galindo -- gh-issue-113297: Fix segfault in the compiler on with statement with 19 - context managers. +- gh-113297: Fix segfault in the compiler on with statement with 19 context + managers. -- gh-issue-106905: Use per AST-parser state rather than global state to - track recursion depth within the AST parser to prevent potential race - condition due to simultaneous parsing. +- gh-106905: Use per AST-parser state rather than global state to track + recursion depth within the AST parser to prevent potential race condition + due to simultaneous parsing. The issue primarily showed up in 3.11 by multithreaded users of :func:`ast.parse`. In 3.12 a change to when garbage collection can be triggered prevented the race condition from occurring. -- gh-issue-112943: Correctly compute end column offsets for multiline tokens - in the :mod:`tokenize` module. Patch by Pablo Galindo +- gh-112943: Correctly compute end column offsets for multiline tokens in + the :mod:`tokenize` module. Patch by Pablo Galindo -- gh-issue-112716: Fix SystemError in the ``import`` statement and in +- gh-112716: Fix SystemError in the ``import`` statement and in ``__reduce__()`` methods of builtin types when ``__builtins__`` is not a dict. -- gh-issue-94606: Fix UnicodeEncodeError when - :func:`email.message.get_payload` reads a message with a Unicode surrogate - character and the message content is not well-formed for surrogateescape - encoding. Patch by Sidney Markowitz. +- gh-94606: Fix UnicodeEncodeError when :func:`email.message.get_payload` + reads a message with a Unicode surrogate character and the message content + is not well-formed for surrogateescape encoding. Patch by Sidney + Markowitz. Library ------- -- gh-issue-114965: Update bundled pip to 24.0 +- gh-114965: Update bundled pip to 24.0 -- gh-issue-114959: :mod:`tarfile` no longer ignores errors when trying to - extract a directory on top of a file. +- gh-114959: :mod:`tarfile` no longer ignores errors when trying to extract + a directory on top of a file. -- gh-issue-109475: Fix support of explicit option value "--" in - :mod:`argparse` (e.g. ``--option=--``). +- gh-109475: Fix support of explicit option value "--" in :mod:`argparse` + (e.g. ``--option=--``). -- gh-issue-110190: Fix ctypes structs with array on Windows ARM64 platform - by setting ``MAX_STRUCT_SIZE`` to 32 in stgdict. Patch by Diego Russo +- gh-110190: Fix ctypes structs with array on Windows ARM64 platform by + setting ``MAX_STRUCT_SIZE`` to 32 in stgdict. Patch by Diego Russo -- gh-issue-113280: Fix a leak of open socket in rare cases when error - occurred in :class:`ssl.SSLSocket` creation. +- gh-113280: Fix a leak of open socket in rare cases when error occurred in + :class:`ssl.SSLSocket` creation. -- gh-issue-77749: :meth:`email.policy.EmailPolicy.fold` now always encodes +- gh-77749: :meth:`email.policy.EmailPolicy.fold` now always encodes non-ASCII characters in headers if :attr:`~email.policy.EmailPolicy.utf8` is false. -- gh-issue-114492: Make the result of :func:`termios.tcgetattr` reproducible - on Alpine Linux. Previously it could leave a random garbage in some - fields. +- gh-114492: Make the result of :func:`termios.tcgetattr` reproducible on + Alpine Linux. Previously it could leave a random garbage in some fields. -- gh-issue-113267: Revert changes in :gh:`106584` which made calls of +- gh-113267: Revert changes in :gh:`106584` which made calls of ``TestResult`` methods ``startTest()`` and ``stopTest()`` unbalanced. -- gh-issue-75128: Ignore an :exc:`OSError` in +- gh-75128: Ignore an :exc:`OSError` in :meth:`asyncio.BaseEventLoop.create_server` when IPv6 is available but the interface cannot actually support it. -- gh-issue-114257: Dismiss the :exc:`FileNotFound` error in +- gh-114257: Dismiss the :exc:`FileNotFound` error in :func:`ctypes.util.find_library` and just return ``None`` on Linux. -- gh-issue-114328: The :func:`tty.setcbreak` and new - :func:`tty.cfmakecbreak` no longer clears the terminal input ICRLF flag. - This fixes a regression introduced in 3.12 that no longer matched how OSes - define cbreak mode in their ``stty(1)`` manual pages. +- gh-114328: The :func:`tty.setcbreak` and new :func:`tty.cfmakecbreak` no + longer clears the terminal input ICRLF flag. This fixes a regression + introduced in 3.12 that no longer matched how OSes define cbreak mode in + their ``stty(1)`` manual pages. -- gh-issue-101438: Avoid reference cycle in ElementTree.iterparse. The - iterator returned by ``ElementTree.iterparse`` may hold on to a file - descriptor. The reference cycle prevented prompt clean-up of the file - descriptor if the returned iterator was not exhausted. +- gh-101438: Avoid reference cycle in ElementTree.iterparse. The iterator + returned by ``ElementTree.iterparse`` may hold on to a file descriptor. + The reference cycle prevented prompt clean-up of the file descriptor if + the returned iterator was not exhausted. -- gh-issue-104522: :exc:`OSError` raised when run a subprocess now only has +- gh-104522: :exc:`OSError` raised when run a subprocess now only has *filename* attribute set to *cwd* if the error was caused by a failed attempt to change the current directory. -- gh-issue-114149: Enum: correctly handle tuple subclasses in custom - ``__new__``. +- gh-114149: Enum: correctly handle tuple subclasses in custom ``__new__``. -- gh-issue-109534: Fix a reference leak in +- gh-109534: Fix a reference leak in :class:`asyncio.selector_events.BaseSelectorEventLoop` when SSL handshakes fail. Patch contributed by Jamie Phan. -- gh-issue-114077: Fix possible :exc:`OverflowError` in +- gh-114077: Fix possible :exc:`OverflowError` in :meth:`socket.socket.sendfile` when pass *count* larger than 2 GiB on 32-bit platform. -- gh-issue-114014: Fixed a bug in :class:`fractions.Fraction` where an - invalid string using ``d`` in the decimals part creates a different error - compared to other invalid letters/characters. Patch by Jeremiah Gabriel - Pascual. +- gh-114014: Fixed a bug in :class:`fractions.Fraction` where an invalid + string using ``d`` in the decimals part creates a different error compared + to other invalid letters/characters. Patch by Jeremiah Gabriel Pascual. -- gh-issue-113951: Fix the behavior of ``tag_unbind()`` methods of +- gh-113951: Fix the behavior of ``tag_unbind()`` methods of :class:`tkinter.Text` and :class:`tkinter.Canvas` classes with three arguments. Previously, ``widget.tag_unbind(tag, sequence, funcid)`` destroyed the current binding for *sequence*, leaving *sequence* unbound, @@ -872,144 +1876,144 @@ Library command. It leaves *sequence* unbound only if *funcid* was the last bound command. -- gh-issue-113877: Fix :mod:`tkinter` method ``winfo_pathname()`` on 64-bit +- gh-113877: Fix :mod:`tkinter` method ``winfo_pathname()`` on 64-bit Windows. -- gh-issue-113661: unittest runner: Don't exit 5 if tests were skipped. The +- gh-113661: unittest runner: Don't exit 5 if tests were skipped. The intention of exiting 5 was to detect issues where the test suite wasn't discovered at all. If we skipped tests, it was correctly discovered. -- gh-issue-113781: Silence unraisable AttributeError when warnings are - emitted during Python finalization. +- gh-113781: Silence unraisable AttributeError when warnings are emitted + during Python finalization. -- gh-issue-112932: Restore the ability for :mod:`zipfile` to ``extractall`` - from zip files with a "/" directory entry in them as is commonly added to - zips by some wiki or bug tracker data exporters. +- gh-112932: Restore the ability for :mod:`zipfile` to ``extractall`` from + zip files with a "/" directory entry in them as is commonly added to zips + by some wiki or bug tracker data exporters. -- gh-issue-113594: Fix :exc:`UnicodeEncodeError` in :mod:`email` when - re-fold lines that contain unknown-8bit encoded part followed by - non-unknown-8bit encoded part. +- gh-113594: Fix :exc:`UnicodeEncodeError` in :mod:`email` when re-fold + lines that contain unknown-8bit encoded part followed by non-unknown-8bit + encoded part. -- gh-issue-113538: In :meth:`asyncio.StreamReaderProtocol.connection_made`, - there is callback that logs an error if the task wrapping the "connected +- gh-113538: In :meth:`asyncio.StreamReaderProtocol.connection_made`, there + is callback that logs an error if the task wrapping the "connected callback" fails. This callback would itself fail if the task was cancelled. Prevent this by checking whether the task was cancelled first. If so, close the transport but don't log an error. -- gh-issue-85567: Fix resource warnings for unclosed files in :mod:`pickle` - and :mod:`pickletools` command line interfaces. +- gh-85567: Fix resource warnings for unclosed files in :mod:`pickle` and + :mod:`pickletools` command line interfaces. -- gh-issue-101225: Increase the backlog for +- gh-101225: Increase the backlog for :class:`multiprocessing.connection.Listener` objects created by :mod:`multiprocessing.manager` and :mod:`multiprocessing.resource_sharer` to significantly reduce the risk of getting a connection refused error when creating a :class:`multiprocessing.connection.Connection` to them. -- gh-issue-113543: Make sure that ``webbrowser.MacOSXOSAScript`` sends +- gh-113543: Make sure that ``webbrowser.MacOSXOSAScript`` sends ``webbrowser.open`` audit event. -- gh-issue-113028: When a second reference to a string appears in the input - to :mod:`pickle`, and the Python implementation is in use, we are - guaranteed that a single copy gets pickled and a single object is shared - when reloaded. Previously, in protocol 0, when a string contained certain +- gh-113028: When a second reference to a string appears in the input to + :mod:`pickle`, and the Python implementation is in use, we are guaranteed + that a single copy gets pickled and a single object is shared when + reloaded. Previously, in protocol 0, when a string contained certain characters (e.g. newline) it resulted in duplicate objects. -- gh-issue-113421: Fix multiprocessing logger for ``%(filename)s``. +- gh-113421: Fix multiprocessing logger for ``%(filename)s``. -- gh-issue-111784: Fix segfaults in the ``_elementtree`` module. Fix first +- gh-111784: Fix segfaults in the ``_elementtree`` module. Fix first segfault during deallocation of ``_elementtree.XMLParser`` instances by keeping strong reference to ``pyexpat`` module in module state for capsule lifetime. Fix second segfault which happens in the same deallocation process by keeping strong reference to ``_elementtree`` module in ``XMLParser`` structure for ``_elementtree`` module lifetime. -- gh-issue-113407: Fix import of :mod:`unittest.mock` when CPython is built +- gh-113407: Fix import of :mod:`unittest.mock` when CPython is built without docstrings. -- gh-issue-113320: Fix regression in Python 3.12 where - :class:`~typing.Protocol` classes that were not marked as - :func:`runtime-checkable ` would be - unnecessarily introspected, potentially causing exceptions to be raised if - the protocol had problematic members. Patch by Alex Waygood. +- gh-113320: Fix regression in Python 3.12 where :class:`~typing.Protocol` + classes that were not marked as :func:`runtime-checkable + ` would be unnecessarily introspected, + potentially causing exceptions to be raised if the protocol had + problematic members. Patch by Alex Waygood. -- gh-issue-113358: Fix rendering tracebacks for exceptions with a broken +- gh-113358: Fix rendering tracebacks for exceptions with a broken ``__getattr__``. -- gh-issue-113214: Fix an ``AttributeError`` during asyncio SSL protocol - aborts in SSL-over-SSL scenarios. +- gh-113214: Fix an ``AttributeError`` during asyncio SSL protocol aborts in + SSL-over-SSL scenarios. -- gh-issue-113246: Update bundled pip to 23.3.2. +- gh-113246: Update bundled pip to 23.3.2. -- gh-issue-113199: Make ``http.client.HTTPResponse.read1`` and +- gh-113199: Make ``http.client.HTTPResponse.read1`` and ``http.client.HTTPResponse.readline`` close IO after reading all data when content length is known. Patch by Illia Volochii. -- gh-issue-113188: Fix :func:`shutil.copymode` and :func:`shutil.copystat` - on Windows. Previously they worked differenly if *dst* is a symbolic link: +- gh-113188: Fix :func:`shutil.copymode` and :func:`shutil.copystat` on + Windows. Previously they worked differenly if *dst* is a symbolic link: they modified the permission bits of *dst* itself rather than the file it points to if *follow_symlinks* is true or *src* is not a symbolic link, and did not modify the permission bits if *follow_symlinks* is false and *src* is a symbolic link. -- gh-issue-61648: Detect line numbers of properties in doctests. +- gh-61648: Detect line numbers of properties in doctests. -- gh-issue-112559: :func:`signal.signal` and :func:`signal.getsignal` no - longer call ``repr`` on callable handlers. :func:`asyncio.run` and +- gh-112559: :func:`signal.signal` and :func:`signal.getsignal` no longer + call ``repr`` on callable handlers. :func:`asyncio.run` and :meth:`asyncio.Runner.run` no longer call ``repr`` on the task results. Patch by Yilei Yang. -- gh-issue-110190: Fix ctypes structs with array on PPC64LE platform by - setting ``MAX_STRUCT_SIZE`` to 64 in stgdict. Patch by Diego Russo. +- gh-110190: Fix ctypes structs with array on PPC64LE platform by setting + ``MAX_STRUCT_SIZE`` to 64 in stgdict. Patch by Diego Russo. -- gh-issue-79429: Ignore FileNotFoundError when remove a temporary directory - in the multiprocessing finalizer. +- gh-79429: Ignore FileNotFoundError when remove a temporary directory in + the multiprocessing finalizer. -- gh-issue-81194: Fix a crash in :func:`socket.if_indextoname` with specific - value (UINT_MAX). Fix an integer overflow in :func:`socket.if_indextoname` - on 64-bit non-Windows platforms. +- gh-81194: Fix a crash in :func:`socket.if_indextoname` with specific value + (UINT_MAX). Fix an integer overflow in :func:`socket.if_indextoname` on + 64-bit non-Windows platforms. -- gh-issue-112343: Improve handling of pdb convenience variables to avoid +- gh-112343: Improve handling of pdb convenience variables to avoid replacing string contents. -- gh-issue-111615: Fix a regression caused by a fix to gh-93162 whereby you +- gh-111615: Fix a regression caused by a fix to gh-93162 whereby you couldn't configure a :class:`QueueHandler` without specifying handlers. -- gh-issue-111049: Fix crash during garbage collection of the - :class:`io.BytesIO` buffer object. +- gh-111049: Fix crash during garbage collection of the :class:`io.BytesIO` + buffer object. -- gh-issue-110345: Show the Tcl/Tk patchlevel (rather than version) in +- gh-110345: Show the Tcl/Tk patchlevel (rather than version) in :meth:`tkinter._test`. -- gh-issue-109858: Protect :mod:`zipfile` from "quoted-overlap" zipbomb. It - now raises BadZipFile when try to read an entry that overlaps with other - entry or central directory. +- gh-109858: Protect :mod:`zipfile` from "quoted-overlap" zipbomb. It now + raises BadZipFile when try to read an entry that overlaps with other entry + or central directory. -- gh-issue-114440: On Windows, closing the connection writer when cleaning - up a broken :class:`multiprocessing.Queue` queue is now done for all - queues, rather than only in :mod:`concurrent.futures` manager thread. This - can prevent a deadlock when a ``multiprocessing`` worker process - terminates without cleaning up. This completes the backport of patches by - Victor Stinner and Serhiy Storchaka. +- gh-114440: On Windows, closing the connection writer when cleaning up a + broken :class:`multiprocessing.Queue` queue is now done for all queues, + rather than only in :mod:`concurrent.futures` manager thread. This can + prevent a deadlock when a ``multiprocessing`` worker process terminates + without cleaning up. This completes the backport of patches by Victor + Stinner and Serhiy Storchaka. -- gh-issue-38807: Fix race condition in :mod:`trace`. Instead of checking if - a directory exists and creating it, directly call :func:`os.makedirs` with +- gh-38807: Fix race condition in :mod:`trace`. Instead of checking if a + directory exists and creating it, directly call :func:`os.makedirs` with the kwarg ``exist_ok=True``. -- gh-issue-75705: Set unixfrom envelope in :class:`mailbox.mbox` and +- gh-75705: Set unixfrom envelope in :class:`mailbox.mbox` and :class:`mailbox.MMDF`. -- gh-issue-106233: Fix stacklevel in ``InvalidTZPathWarning`` during +- gh-106233: Fix stacklevel in ``InvalidTZPathWarning`` during :mod:`zoneinfo` module import. -- gh-issue-105102: Allow :class:`ctypes.Union` to be nested in +- gh-105102: Allow :class:`ctypes.Union` to be nested in :class:`ctypes.Structure` when the system endianness is the opposite of the classes. -- gh-issue-104282: Fix null pointer dereference in +- gh-104282: Fix null pointer dereference in :func:`lzma._decode_filter_properties` due to improper handling of BCJ filters with properties of zero length. Patch by Radislav Chugunov. -- gh-issue-102512: When :func:`os.fork` is called from a foreign thread (aka +- gh-102512: When :func:`os.fork` is called from a foreign thread (aka ``_DummyThread``), the type of the thread in a child process is changed to ``_MainThread``. Also changed its name and daemonic status, it can be now joined. @@ -1033,22 +2037,22 @@ Library Documentation ------------- -- gh-issue-110746: Improved markup for valid options/values for methods +- gh-110746: Improved markup for valid options/values for methods ttk.treeview.column and ttk.treeview.heading, and for Layouts. -- gh-issue-95649: Document that the :mod:`asyncio` module contains code - taken from `v0.16.0 of the uvloop project +- gh-95649: Document that the :mod:`asyncio` module contains code taken from + `v0.16.0 of the uvloop project `_, as well as the required MIT licensing information. Tests ----- -- gh-issue-109980: Fix ``test_tarfile_vs_tar`` in ``test_shutil`` for macOS, - where system tar can include more information in the archive than +- gh-109980: Fix ``test_tarfile_vs_tar`` in ``test_shutil`` for macOS, where + system tar can include more information in the archive than :mod:`shutil.make_archive`. -- gh-issue-105089: Fix +- gh-105089: Fix ``test.test_zipfile.test_core.TestWithDirectory.test_create_directory_with_write`` test in AIX by doing a bitwise AND of 0xFFFF on mode , so that it will be in sync with ``zinfo.external_attr`` @@ -1058,13 +2062,12 @@ Tests Build ----- -- gh-issue-112305: Fixed the ``check-clean-src`` step performed on out of - tree builds to detect errant ``$(srcdir)/Python/frozen_modules/*.h`` files - and recommend appropriate source tree cleanup steps to get a working build +- gh-112305: Fixed the ``check-clean-src`` step performed on out of tree + builds to detect errant ``$(srcdir)/Python/frozen_modules/*.h`` files and + recommend appropriate source tree cleanup steps to get a working build again. -- gh-issue-112867: Fix the build for the case that - WITH_PYMALLOC_RADIX_TREE=0 set. +- gh-112867: Fix the build for the case that WITH_PYMALLOC_RADIX_TREE=0 set. - bpo-11102: The :func:`os.major`, :func:`os.makedev`, and :func:`os.minor` functions are now available on HP-UX v3. @@ -1074,30 +2077,30 @@ Build Windows ------- -- gh-issue-109991: Update Windows build to use OpenSSL 3.0.13. +- gh-109991: Update Windows build to use OpenSSL 3.0.13. -- gh-issue-111239: Update Windows builds to use zlib v1.3.1. +- gh-111239: Update Windows builds to use zlib v1.3.1. -- gh-issue-100107: The ``py.exe`` launcher will no longer attempt to run the +- gh-100107: The ``py.exe`` launcher will no longer attempt to run the Microsoft Store redirector when launching a script containing a ``/usr/bin/env`` shebang -- gh-issue-114096: Process privileges that are activated for creating - directory junctions are now restored afterwards, avoiding behaviour - changes in other parts of the program. +- gh-114096: Process privileges that are activated for creating directory + junctions are now restored afterwards, avoiding behaviour changes in other + parts of the program. -- gh-issue-111877: :func:`os.stat` calls were returning incorrect time - values for files that could not be accessed directly. +- gh-111877: :func:`os.stat` calls were returning incorrect time values for + files that could not be accessed directly. -- gh-issue-113009: :mod:`multiprocessing`: On Windows, fix a race condition - in ``Process.terminate()``: no longer set the ``returncode`` attribute to +- gh-113009: :mod:`multiprocessing`: On Windows, fix a race condition in + ``Process.terminate()``: no longer set the ``returncode`` attribute to always call ``WaitForSingleObject()`` in ``Process.wait()``. Previously, sometimes the process was still running after ``TerminateProcess()`` even if ``GetExitCodeProcess()`` is not ``STILL_ACTIVE``. Patch by Victor Stinner. -- gh-issue-87868: Correctly sort and remove duplicate environment variables - in :py:func:`!_winapi.CreateProcess`. +- gh-87868: Correctly sort and remove duplicate environment variables in + :py:func:`!_winapi.CreateProcess`. - bpo-37308: Fix mojibake in :class:`mmap.mmap` when using a non-ASCII *tagname* argument on Windows. @@ -1105,57 +2108,56 @@ Windows macOS ----- -- gh-issue-115009: Update macOS installer to use SQLite 3.45.1. +- gh-115009: Update macOS installer to use SQLite 3.45.1. -- gh-issue-109991: Update macOS installer to use OpenSSL 3.0.13. +- gh-109991: Update macOS installer to use OpenSSL 3.0.13. -- gh-issue-110459: Running ``configure ... --with-openssl-rpath=X/Y/Z`` no - longer fails to detect OpenSSL on macOS. +- gh-110459: Running ``configure ... --with-openssl-rpath=X/Y/Z`` no longer + fails to detect OpenSSL on macOS. -- gh-issue-74573: Document that :mod:`dbm.ndbm` can silently corrupt DBM - files on updates when exceeding undocumented platform limits, and can - crash (segmentation fault) when reading such a corrupted file. (FB8919203) +- gh-74573: Document that :mod:`dbm.ndbm` can silently corrupt DBM files on + updates when exceeding undocumented platform limits, and can crash + (segmentation fault) when reading such a corrupted file. (FB8919203) -- gh-issue-65701: The :program:`freeze` tool doesn't work with framework - builds of Python. Document this and bail out early when running the tool - with such a build. +- gh-65701: The :program:`freeze` tool doesn't work with framework builds of + Python. Document this and bail out early when running the tool with such a + build. -- gh-issue-108269: Set ``CFBundleAllowMixedLocalizations`` to true in the +- gh-108269: Set ``CFBundleAllowMixedLocalizations`` to true in the Info.plist for the framework, embedded Python.app and IDLE.app with framework installs on macOS. This allows applications to pick up the user's preferred locale when that's different from english. -- gh-issue-102362: Make sure the result of :func:`sysconfig.get_plaform` - includes at least a major and minor versions, even if - ``MACOSX_DEPLOYMENT_TARGET`` is set to only a major version during build - to match the format expected by pip. +- gh-102362: Make sure the result of :func:`sysconfig.get_plaform` includes + at least a major and minor versions, even if ``MACOSX_DEPLOYMENT_TARGET`` + is set to only a major version during build to match the format expected + by pip. -- gh-issue-110017: Disable a signal handling stress test on macOS due to a - bug in macOS (FB13453490). +- gh-110017: Disable a signal handling stress test on macOS due to a bug in + macOS (FB13453490). -- gh-issue-110820: Make sure the preprocessor definitions for +- gh-110820: Make sure the preprocessor definitions for ``ALIGNOF_MAX_ALIGN_T``, ``SIZEOF_LONG_DOUBLE`` and ``HAVE_GCC_ASM_FOR_X64`` are correct for Universal 2 builds on macOS. IDLE ---- -- gh-issue-96905: In idlelib code, stop redefining built-ins 'dict' and - 'object'. +- gh-96905: In idlelib code, stop redefining built-ins 'dict' and 'object'. -- gh-issue-72284: Improve the lists of features, editor key bindings, and - shell key bingings in the IDLE doc. +- gh-72284: Improve the lists of features, editor key bindings, and shell + key bingings in the IDLE doc. -- gh-issue-113903: Fix rare failure of test.test_idle, in test_configdialog. +- gh-113903: Fix rare failure of test.test_idle, in test_configdialog. -- gh-issue-113729: Fix the "Help -> IDLE Doc" menu bug in 3.11.7 and 3.12.1. +- gh-113729: Fix the "Help -> IDLE Doc" menu bug in 3.11.7 and 3.12.1. -- gh-issue-113269: Fix test_editor hang on macOS Catalina. +- gh-113269: Fix test_editor hang on macOS Catalina. -- gh-issue-112898: Fix processing unsaved files when quitting IDLE on macOS. +- gh-112898: Fix processing unsaved files when quitting IDLE on macOS. -- gh-issue-103820: Revise IDLE bindings so that events from mouse button 4/5 - on non-X11 windowing systems (i.e. Win32 and Aqua) are not mistaken for +- gh-103820: Revise IDLE bindings so that events from mouse button 4/5 on + non-X11 windowing systems (i.e. Win32 and Aqua) are not mistaken for scrolling. - bpo-13586: Enter the selected text when opening the "Replace" dialog. @@ -1163,14 +2165,14 @@ IDLE Tools/Demos ----------- -- gh-issue-109991: Update GitHub CI workflows to use OpenSSL 3.0.13 and +- gh-109991: Update GitHub CI workflows to use OpenSSL 3.0.13 and multissltests to use 1.1.1w, 3.0.13, 3.1.5, and 3.2.1. -- gh-issue-115015: Fix a bug in Argument Clinic that generated incorrect - code for methods with no parameters that use the :ref:`METH_METHOD | - METH_FASTCALL | METH_KEYWORDS ` - calling convention. Only the positional parameter count was checked; any - keyword argument passed would be silently accepted. +- gh-115015: Fix a bug in Argument Clinic that generated incorrect code for + methods with no parameters that use the :ref:`METH_METHOD | METH_FASTCALL + | METH_KEYWORDS ` calling + convention. Only the positional parameter count was checked; any keyword + argument passed would be silently accepted. What's New in Python 3.12.1 final? @@ -1181,150 +2183,148 @@ What's New in Python 3.12.1 final? Core and Builtins ----------------- -- gh-issue-112125: Fix None.__ne__(None) returning NotImplemented instead of - False +- gh-112125: Fix None.__ne__(None) returning NotImplemented instead of False -- gh-issue-112625: Fixes a bug where a bytearray object could be cleared - while iterating over an argument in the ``bytearray.join()`` method that - could result in reading memory after it was freed. +- gh-112625: Fixes a bug where a bytearray object could be cleared while + iterating over an argument in the ``bytearray.join()`` method that could + result in reading memory after it was freed. -- gh-issue-105967: Workaround a bug in Apple's macOS platform zlib library - where :func:`zlib.crc32` and :func:`binascii.crc32` could produce - incorrect results on multi-gigabyte inputs. Including when using - :mod:`zipfile` on zips containing large data. +- gh-105967: Workaround a bug in Apple's macOS platform zlib library where + :func:`zlib.crc32` and :func:`binascii.crc32` could produce incorrect + results on multi-gigabyte inputs. Including when using :mod:`zipfile` on + zips containing large data. -- gh-issue-112356: Stopped erroneously deleting a ``LOAD_NULL`` bytecode +- gh-112356: Stopped erroneously deleting a ``LOAD_NULL`` bytecode instruction when optimized twice. -- gh-issue-111058: Change coro.cr_frame/gen.gi_frame to return ``None`` - after the coroutine/generator has been closed. This fixes a bug where +- gh-111058: Change coro.cr_frame/gen.gi_frame to return ``None`` after the + coroutine/generator has been closed. This fixes a bug where :func:`~inspect.getcoroutinestate` and :func:`~inspect.getgeneratorstate` return the wrong state for a closed coroutine/generator. -- gh-issue-112388: Fix an error that was causing the parser to try to - overwrite tokenizer errors. Patch by pablo Galindo +- gh-112388: Fix an error that was causing the parser to try to overwrite + tokenizer errors. Patch by pablo Galindo -- gh-issue-112387: Fix error positions for decoded strings with backwards - tokenize errors. Patch by Pablo Galindo +- gh-112387: Fix error positions for decoded strings with backwards tokenize + errors. Patch by Pablo Galindo -- gh-issue-112367: Avoid undefined behaviour when using the perf trampolines - by not freeing the code arenas until shutdown. Patch by Pablo Galindo +- gh-112367: Avoid undefined behaviour when using the perf trampolines by + not freeing the code arenas until shutdown. Patch by Pablo Galindo -- gh-issue-112243: Don't include comments in f-string debug expressions. - Patch by Pablo Galindo +- gh-112243: Don't include comments in f-string debug expressions. Patch by + Pablo Galindo -- gh-issue-112266: Change docstrings of :attr:`~object.__dict__` and +- gh-112266: Change docstrings of :attr:`~object.__dict__` and :attr:`~object.__weakref__`. -- gh-issue-111654: Fix runtime crash when some error happens in opcode +- gh-111654: Fix runtime crash when some error happens in opcode ``LOAD_FROM_DICT_OR_DEREF``. -- gh-issue-109181: Speed up :obj:`Traceback` object creation by lazily - compute the line number. Patch by Pablo Galindo +- gh-109181: Speed up :obj:`Traceback` object creation by lazily compute the + line number. Patch by Pablo Galindo -- gh-issue-102388: Fix a bug where ``iso2022_jp_3`` and ``iso2022_jp_2004`` - codecs read out of bounds +- gh-102388: Fix a bug where ``iso2022_jp_3`` and ``iso2022_jp_2004`` codecs + read out of bounds -- gh-issue-111366: Fix an issue in the :mod:`codeop` that was causing +- gh-111366: Fix an issue in the :mod:`codeop` that was causing :exc:`SyntaxError` exceptions raised in the presence of invalid syntax to not contain precise error messages. Patch by Pablo Galindo -- gh-issue-111380: Fix a bug that was causing :exc:`SyntaxWarning` to appear - twice when parsing if invalid syntax is encountered later. Patch by Pablo +- gh-111380: Fix a bug that was causing :exc:`SyntaxWarning` to appear twice + when parsing if invalid syntax is encountered later. Patch by Pablo galindo -- gh-issue-94438: Fix a regression that prevented jumping across ``is None`` - and ``is not None`` when debugging. Patch by Savannah Ostrowski. +- gh-94438: Fix a regression that prevented jumping across ``is None`` and + ``is not None`` when debugging. Patch by Savannah Ostrowski. -- gh-issue-110938: Fix error messages for indented blocks with functions and +- gh-110938: Fix error messages for indented blocks with functions and classes with generic type parameters. Patch by Pablo Galindo -- gh-issue-109894: Fixed crash due to improperly initialized static +- gh-109894: Fixed crash due to improperly initialized static :exc:`MemoryError` in subinterpreter. -- gh-issue-110782: Fix crash when :class:`typing.TypeVar` is constructed - with a keyword argument. Patch by Jelle Zijlstra. +- gh-110782: Fix crash when :class:`typing.TypeVar` is constructed with a + keyword argument. Patch by Jelle Zijlstra. -- gh-issue-110696: Fix incorrect error message for invalid argument - unpacking. Patch by Pablo Galindo +- gh-110696: Fix incorrect error message for invalid argument unpacking. + Patch by Pablo Galindo -- gh-issue-110543: Fix regression in Python 3.12 where +- gh-110543: Fix regression in Python 3.12 where :meth:`types.CodeType.replace` would produce a broken code object if called on a module or class code object that contains a comprehension. Patch by Jelle Zijlstra. -- gh-issue-110514: Add ``PY_THROW`` to :func:`sys.setprofile` events +- gh-110514: Add ``PY_THROW`` to :func:`sys.setprofile` events -- gh-issue-110455: Guard ``assert(tstate->thread_id > 0)`` with ``#ifndef +- gh-110455: Guard ``assert(tstate->thread_id > 0)`` with ``#ifndef HAVE_PTHREAD_STUBS``. This allows for for pydebug builds to work under WASI which (currently) lacks thread support. -- gh-issue-110259: Correctly identify the format spec in f-strings (with - single or triple quotes) that have multiple lines in the expression part - and include a formatting spec. Patch by Pablo Galindo +- gh-110259: Correctly identify the format spec in f-strings (with single or + triple quotes) that have multiple lines in the expression part and include + a formatting spec. Patch by Pablo Galindo -- gh-issue-110237: Fix missing error checks for calls to ``PyList_Append`` - in ``_PyEval_MatchClass``. +- gh-110237: Fix missing error checks for calls to ``PyList_Append`` in + ``_PyEval_MatchClass``. -- gh-issue-109889: Fix the compiler's redundant NOP detection algorithm to - skip over NOPs with no line number when looking for the next instruction's +- gh-109889: Fix the compiler's redundant NOP detection algorithm to skip + over NOPs with no line number when looking for the next instruction's lineno. -- gh-issue-109853: ``sys.path[0]`` is now set correctly for subinterpreters. +- gh-109853: ``sys.path[0]`` is now set correctly for subinterpreters. -- gh-issue-105716: Subinterpreters now correctly handle the case where they - have threads running in the background. Before, such threads would - interfere with cleaning up and destroying them, as well as prevent running - another script. +- gh-105716: Subinterpreters now correctly handle the case where they have + threads running in the background. Before, such threads would interfere + with cleaning up and destroying them, as well as prevent running another + script. -- gh-issue-109793: The main thread no longer exits prematurely when a +- gh-109793: The main thread no longer exits prematurely when a subinterpreter is cleaned up during runtime finalization. The bug was a problem particularly because, when triggered, the Python process would always return with a 0 exitcode, even if it failed. -- gh-issue-109596: Fix some tokens in the grammar that were incorrectly - marked as soft keywords. Also fix some repeated rule names and ensure that - repeated rules are not allowed. Patch by Pablo Galindo +- gh-109596: Fix some tokens in the grammar that were incorrectly marked as + soft keywords. Also fix some repeated rule names and ensure that repeated + rules are not allowed. Patch by Pablo Galindo -- gh-issue-109351: Fix crash when compiling an invalid AST involving a named +- gh-109351: Fix crash when compiling an invalid AST involving a named (walrus) expression. -- gh-issue-109216: Fix possible memory leak in :opcode:`BUILD_MAP`. +- gh-109216: Fix possible memory leak in :opcode:`BUILD_MAP`. -- gh-issue-109207: Fix a SystemError in ``__repr__`` of symtable entry - object. +- gh-109207: Fix a SystemError in ``__repr__`` of symtable entry object. -- gh-issue-109179: Fix bug where the C traceback display drops notes from +- gh-109179: Fix bug where the C traceback display drops notes from :exc:`SyntaxError`. -- gh-issue-109052: Use the base opcode when comparing code objects to avoid +- gh-109052: Use the base opcode when comparing code objects to avoid interference from instrumentation -- gh-issue-88943: Improve syntax error for non-ASCII character that follows - a numerical literal. It now points on the invalid non-ASCII character, not +- gh-88943: Improve syntax error for non-ASCII character that follows a + numerical literal. It now points on the invalid non-ASCII character, not on the valid numerical literal. -- gh-issue-106931: Statically allocated string objects are now interned - globally instead of per-interpreter. This fixes a situation where such a - string would only be interned in a single interpreter. Normal string - objects are unaffected. +- gh-106931: Statically allocated string objects are now interned globally + instead of per-interpreter. This fixes a situation where such a string + would only be interned in a single interpreter. Normal string objects are + unaffected. Library ------- -- gh-issue-79325: Fix an infinite recursion error in +- gh-79325: Fix an infinite recursion error in :func:`tempfile.TemporaryDirectory` cleanup on Windows. -- gh-issue-112645: Remove deprecation error on passing ``onerror`` to +- gh-112645: Remove deprecation error on passing ``onerror`` to :func:`shutil.rmtree`. -- gh-issue-112618: Fix a caching bug relating to :data:`typing.Annotated`. +- gh-112618: Fix a caching bug relating to :data:`typing.Annotated`. ``Annotated[str, True]`` is no longer identical to ``Annotated[str, 1]``. -- gh-issue-112334: Fixed a performance regression in 3.12's - :mod:`subprocess` on Linux where it would no longer use the fast-path - ``vfork()`` system call when it should have due to a logic bug, instead - always falling back to the safe but slower ``fork()``. +- gh-112334: Fixed a performance regression in 3.12's :mod:`subprocess` on + Linux where it would no longer use the fast-path ``vfork()`` system call + when it should have due to a logic bug, instead always falling back to the + safe but slower ``fork()``. Also fixed a related 3.12 security regression: If a value of ``extra_groups=[]`` was passed to :mod:`subprocess.Popen` or related APIs, @@ -1335,248 +2335,239 @@ Library This was identified via code inspection in the process of fixing the first bug. -- gh-issue-110190: Fix ctypes structs with array on Arm platform by setting +- gh-110190: Fix ctypes structs with array on Arm platform by setting ``MAX_STRUCT_SIZE`` to 32 in stgdict. Patch by Diego Russo. -- gh-issue-112578: Fix a spurious :exc:`RuntimeWarning` when executing the +- gh-112578: Fix a spurious :exc:`RuntimeWarning` when executing the :mod:`zipfile` module. -- gh-issue-112509: Fix edge cases that could cause a key to be present in - both the ``__required_keys__`` and ``__optional_keys__`` attributes of a +- gh-112509: Fix edge cases that could cause a key to be present in both the + ``__required_keys__`` and ``__optional_keys__`` attributes of a :class:`typing.TypedDict`. Patch by Jelle Zijlstra. -- gh-issue-112414: Fix regression in Python 3.12 where calling :func:`repr` - on a module that had been imported using a custom :term:`loader` could - fail with :exc:`AttributeError`. Patch by Alex Waygood. +- gh-112414: Fix regression in Python 3.12 where calling :func:`repr` on a + module that had been imported using a custom :term:`loader` could fail + with :exc:`AttributeError`. Patch by Alex Waygood. -- gh-issue-112358: Revert change to :class:`struct.Struct` initialization - that broke some cases of subclassing. +- gh-112358: Revert change to :class:`struct.Struct` initialization that + broke some cases of subclassing. -- gh-issue-94722: Fix bug where comparison between instances of +- gh-94722: Fix bug where comparison between instances of :class:`~doctest.DocTest` fails if one of them has ``None`` as its lineno. -- gh-issue-112105: Make :func:`readline.set_completer_delims` work with - libedit +- gh-112105: Make :func:`readline.set_completer_delims` work with libedit -- gh-issue-111942: Fix SystemError in the TextIOWrapper constructor with +- gh-111942: Fix SystemError in the TextIOWrapper constructor with non-encodable "errors" argument in non-debug mode. -- gh-issue-109538: Issue warning message instead of having - :class:`RuntimeError` be displayed when event loop has already been closed - at :meth:`StreamWriter.__del__`. +- gh-109538: Issue warning message instead of having :class:`RuntimeError` + be displayed when event loop has already been closed at + :meth:`StreamWriter.__del__`. -- gh-issue-111942: Fix crashes in :meth:`io.TextIOWrapper.reconfigure` when - pass invalid arguments, e.g. non-string encoding. +- gh-111942: Fix crashes in :meth:`io.TextIOWrapper.reconfigure` when pass + invalid arguments, e.g. non-string encoding. -- gh-issue-111460: :mod:`curses`: restore wide character support (including +- gh-111460: :mod:`curses`: restore wide character support (including :func:`curses.unget_wch` and :meth:`~curses.window.get_wch`) on macOS, which was unavailable due to a regression in Python 3.12. -- gh-issue-103791: :class:`contextlib.suppress` now supports suppressing +- gh-103791: :class:`contextlib.suppress` now supports suppressing exceptions raised as part of a :exc:`BaseExceptionGroup`, in addition to the recent support for :exc:`ExceptionGroup`. -- gh-issue-111804: Remove posix.fallocate() under WASI as the underlying +- gh-111804: Remove posix.fallocate() under WASI as the underlying posix_fallocate() is not available in WASI preview2. -- gh-issue-111841: Fix truncating arguments on an embedded null character in +- gh-111841: Fix truncating arguments on an embedded null character in :meth:`os.putenv` and :meth:`os.unsetenv` on Windows. -- gh-issue-111541: Fix :mod:`doctest` for :exc:`SyntaxError` not-builtin +- gh-111541: Fix :mod:`doctest` for :exc:`SyntaxError` not-builtin subclasses. -- gh-issue-110894: Call loop exception handler for exceptions in +- gh-110894: Call loop exception handler for exceptions in ``client_connected_cb`` of :func:`asyncio.start_server` so that applications can handle it. Patch by Kumar Aditya. -- gh-issue-111531: Fix reference leaks in ``bind_class()`` and - ``bind_all()`` methods of :mod:`tkinter` widgets. +- gh-111531: Fix reference leaks in ``bind_class()`` and ``bind_all()`` + methods of :mod:`tkinter` widgets. -- gh-issue-111356: Added :func:`io.text_encoding()`, - :data:`io.DEFAULT_BUFFER_SIZE`, and :class:`io.IncrementalNewlineDecoder` - to ``io.__all__``. +- gh-111356: Added :func:`io.text_encoding`, :data:`io.DEFAULT_BUFFER_SIZE`, + and :class:`io.IncrementalNewlineDecoder` to ``io.__all__``. -- gh-issue-111342: Fixed typo in :func:`math.sumprod`. +- gh-111342: Fixed typo in :func:`math.sumprod`. -- gh-issue-68166: Remove mention of not supported "vsapi" element type in +- gh-68166: Remove mention of not supported "vsapi" element type in :meth:`tkinter.ttk.Style.element_create`. Add tests for ``element_create()`` and other ``ttk.Style`` methods. Add examples for ``element_create()`` in the documentation. -- gh-issue-75666: Fix the behavior of :mod:`tkinter` widget's ``unbind()`` - method with two arguments. Previously, ``widget.unbind(sequence, funcid)`` +- gh-75666: Fix the behavior of :mod:`tkinter` widget's ``unbind()`` method + with two arguments. Previously, ``widget.unbind(sequence, funcid)`` destroyed the current binding for *sequence*, leaving *sequence* unbound, and deleted the *funcid* command. Now it removes only *funcid* from the binding for *sequence*, keeping other commands, and deletes the *funcid* command. It leaves *sequence* unbound only if *funcid* was the last bound command. -- gh-issue-79033: Another attempt at fixing - :func:`asyncio.Server.wait_closed()`. It now blocks until both conditions - are true: the server is closed, *and* there are no more active - connections. (This means that in some cases where in 3.12.0 this function - would *incorrectly* have returned immediately, it will now block; in - particular, when there are no active connections but the server hasn't - been closed yet.) +- gh-79033: Another attempt at fixing :func:`asyncio.Server.wait_closed`. It + now blocks until both conditions are true: the server is closed, *and* + there are no more active connections. (This means that in some cases where + in 3.12.0 this function would *incorrectly* have returned immediately, it + will now block; in particular, when there are no active connections but + the server hasn't been closed yet.) -- gh-issue-111295: Fix :mod:`time` not checking for errors when - initializing. +- gh-111295: Fix :mod:`time` not checking for errors when initializing. -- gh-issue-111253: Add error checking during :mod:`!_socket` module init. +- gh-111253: Add error checking during :mod:`!_socket` module init. -- gh-issue-111251: Fix :mod:`_blake2` not checking for errors when - initializing. +- gh-111251: Fix :mod:`_blake2` not checking for errors when initializing. -- gh-issue-111174: Fix crash in :meth:`io.BytesIO.getbuffer` called - repeatedly for empty BytesIO. +- gh-111174: Fix crash in :meth:`io.BytesIO.getbuffer` called repeatedly for + empty BytesIO. -- gh-issue-111187: Postpone removal version for locale.getdefaultlocale() to +- gh-111187: Postpone removal version for locale.getdefaultlocale() to Python 3.15. -- gh-issue-111159: Fix :mod:`doctest` output comparison for exceptions with - notes. +- gh-111159: Fix :mod:`doctest` output comparison for exceptions with notes. -- gh-issue-110910: Fix invalid state handling in :class:`asyncio.TaskGroup` - and :class:`asyncio.Timeout`. They now raise proper RuntimeError if they - are improperly used and are left in consistent state after this. +- gh-110910: Fix invalid state handling in :class:`asyncio.TaskGroup` and + :class:`asyncio.Timeout`. They now raise proper RuntimeError if they are + improperly used and are left in consistent state after this. -- gh-issue-111092: Make turtledemo run without default root enabled. +- gh-111092: Make turtledemo run without default root enabled. -- gh-issue-110488: Fix a couple of issues in - :meth:`pathlib.PurePath.with_name`: a single dot was incorrectly - considered a valid name, and in :class:`PureWindowsPath`, a name with an - NTFS alternate data stream, like ``a:b``, was incorrectly considered - invalid. +- gh-110488: Fix a couple of issues in :meth:`pathlib.PurePath.with_name`: a + single dot was incorrectly considered a valid name, and in + :class:`PureWindowsPath`, a name with an NTFS alternate data stream, like + ``a:b``, was incorrectly considered invalid. -- gh-issue-110392: Fix :func:`tty.setraw` and :func:`tty.setcbreak`: - previously they returned partially modified list of the original tty - attributes. :func:`tty.cfmakeraw` and :func:`tty.cfmakecbreak` now make a - copy of the list of special characters before modifying it. +- gh-110392: Fix :func:`tty.setraw` and :func:`tty.setcbreak`: previously + they returned partially modified list of the original tty attributes. + :func:`tty.cfmakeraw` and :func:`tty.cfmakecbreak` now make a copy of the + list of special characters before modifying it. -- gh-issue-110590: Fix a bug in :meth:`!_sre.compile` where :exc:`TypeError` - would be overwritten by :exc:`OverflowError` when the *code* argument was - a list of non-ints. +- gh-110590: Fix a bug in :meth:`!_sre.compile` where :exc:`TypeError` would + be overwritten by :exc:`OverflowError` when the *code* argument was a list + of non-ints. -- gh-issue-65052: Prevent :mod:`pdb` from crashing when trying to display +- gh-65052: Prevent :mod:`pdb` from crashing when trying to display undisplayable objects -- gh-issue-110519: Deprecation warning about non-integer number in - :mod:`gettext` now alwais refers to the line in the user code where - gettext function or method is used. Previously it could refer to a line in - ``gettext`` code. +- gh-110519: Deprecation warning about non-integer number in :mod:`gettext` + now alwais refers to the line in the user code where gettext function or + method is used. Previously it could refer to a line in ``gettext`` code. -- gh-issue-110395: Ensure that :func:`select.kqueue` objects correctly - appear as closed in forked children, to prevent operations on an invalid - file descriptor. +- gh-110395: Ensure that :func:`select.kqueue` objects correctly appear as + closed in forked children, to prevent operations on an invalid file + descriptor. -- gh-issue-110378: :func:`~contextlib.contextmanager` and +- gh-110378: :func:`~contextlib.contextmanager` and :func:`~contextlib.asynccontextmanager` context managers now close an invalid underlying generator object that yields more then one value. -- gh-issue-110365: Fix :func:`termios.tcsetattr` bug that was overwritting +- gh-110365: Fix :func:`termios.tcsetattr` bug that was overwritting existing errors during parsing integers from ``term`` list. -- gh-issue-109653: Fix a Python 3.12 regression in the import time of +- gh-109653: Fix a Python 3.12 regression in the import time of :mod:`random`. Patch by Alex Waygood. -- gh-issue-110196: Add ``__reduce__`` method to :class:`IPv6Address` in - order to keep ``scope_id`` +- gh-110196: Add ``__reduce__`` method to :class:`IPv6Address` in order to + keep ``scope_id`` -- gh-issue-110036: On Windows, multiprocessing ``Popen.terminate()`` now - catchs :exc:`PermissionError` and get the process exit code. If the - process is still running, raise again the :exc:`PermissionError`. - Otherwise, the process terminated as expected: store its exit code. Patch - by Victor Stinner. +- gh-110036: On Windows, multiprocessing ``Popen.terminate()`` now catchs + :exc:`PermissionError` and get the process exit code. If the process is + still running, raise again the :exc:`PermissionError`. Otherwise, the + process terminated as expected: store its exit code. Patch by Victor + Stinner. -- gh-issue-110038: Fixed an issue that caused :meth:`KqueueSelector.select` - to not return all the ready events in some cases when a file descriptor is +- gh-110038: Fixed an issue that caused :meth:`KqueueSelector.select` to not + return all the ready events in some cases when a file descriptor is registered for both read and write. -- gh-issue-109631: :mod:`re` functions such as :func:`re.findall`, +- gh-109631: :mod:`re` functions such as :func:`re.findall`, :func:`re.split`, :func:`re.search` and :func:`re.sub` which perform short repeated matches can now be interrupted by user. -- gh-issue-109747: Improve errors for unsupported look-behind patterns. Now +- gh-109747: Improve errors for unsupported look-behind patterns. Now re.error is raised instead of OverflowError or RuntimeError for too large width of look-behind pattern. -- gh-issue-109818: Fix :func:`reprlib.recursive_repr` not copying +- gh-109818: Fix :func:`reprlib.recursive_repr` not copying ``__type_params__`` from decorated function. -- gh-issue-109047: :mod:`concurrent.futures`: The *executor manager thread* - now catches exceptions when adding an item to the *call queue*. During - Python finalization, creating a new thread can now raise - :exc:`RuntimeError`. Catch the exception and call ``terminate_broken()`` - in this case. Patch by Victor Stinner. +- gh-109047: :mod:`concurrent.futures`: The *executor manager thread* now + catches exceptions when adding an item to the *call queue*. During Python + finalization, creating a new thread can now raise :exc:`RuntimeError`. + Catch the exception and call ``terminate_broken()`` in this case. Patch by + Victor Stinner. -- gh-issue-109782: Ensure the signature of :func:`os.path.isdir` is - identical on all platforms. Patch by Amin Alaee. +- gh-109782: Ensure the signature of :func:`os.path.isdir` is identical on + all platforms. Patch by Amin Alaee. -- gh-issue-109590: :func:`shutil.which` will prefer files with an extension - in ``PATHEXT`` if the given mode includes ``os.X_OK`` on win32. If no +- gh-109590: :func:`shutil.which` will prefer files with an extension in + ``PATHEXT`` if the given mode includes ``os.X_OK`` on win32. If no ``PATHEXT`` match is found, a file without an extension in ``PATHEXT`` can be returned. This change will have :func:`shutil.which` act more similarly to previous behavior in Python 3.11. -- gh-issue-109786: Fix possible reference leaks and crash when re-enter the +- gh-109786: Fix possible reference leaks and crash when re-enter the ``__next__()`` method of :class:`itertools.pairwise`. -- gh-issue-109593: Avoid deadlocking on a reentrant call to the - multiprocessing resource tracker. Such a reentrant call, though unlikely, - can happen if a GC pass invokes the finalizer for a multiprocessing object - such as SemLock. +- gh-109593: Avoid deadlocking on a reentrant call to the multiprocessing + resource tracker. Such a reentrant call, though unlikely, can happen if a + GC pass invokes the finalizer for a multiprocessing object such as + SemLock. -- gh-issue-109613: Fix :func:`os.stat` and :meth:`os.DirEntry.stat`: check - for exceptions. Previously, on Python built in debug mode, these functions +- gh-109613: Fix :func:`os.stat` and :meth:`os.DirEntry.stat`: check for + exceptions. Previously, on Python built in debug mode, these functions could trigger a fatal Python error (and abort the process) when a function succeeded with an exception set. Patch by Victor Stinner. -- gh-issue-109375: The :mod:`pdb` ``alias`` command now prevents registering +- gh-109375: The :mod:`pdb` ``alias`` command now prevents registering aliases without arguments. -- gh-issue-107219: Fix a race condition in ``concurrent.futures``. When a - process in the process pool was terminated abruptly (while the future was - running or pending), close the connection write end. If the call queue is - blocked on sending bytes to a worker process, closing the connection write - end interrupts the send, so the queue can be closed. Patch by Victor - Stinner. +- gh-107219: Fix a race condition in ``concurrent.futures``. When a process + in the process pool was terminated abruptly (while the future was running + or pending), close the connection write end. If the call queue is blocked + on sending bytes to a worker process, closing the connection write end + interrupts the send, so the queue can be closed. Patch by Victor Stinner. -- gh-issue-50644: Attempts to pickle or create a shallow or deep copy of +- gh-50644: Attempts to pickle or create a shallow or deep copy of :mod:`codecs` streams now raise a TypeError. Previously, copying failed with a RecursionError, while pickling produced wrong results that eventually caused unpickling to fail with a RecursionError. -- gh-issue-108987: Fix :func:`_thread.start_new_thread` race condition. If a +- gh-108987: Fix :func:`_thread.start_new_thread` race condition. If a thread is created during Python finalization, the newly spawned thread now exits immediately instead of trying to access freed memory and lead to a crash. Patch by Victor Stinner. -- gh-issue-108791: Improved error handling in :mod:`pdb` command line - interface, making it produce more concise error messages. +- gh-108791: Improved error handling in :mod:`pdb` command line interface, + making it produce more concise error messages. -- gh-issue-105829: Fix concurrent.futures.ProcessPoolExecutor deadlock +- gh-105829: Fix concurrent.futures.ProcessPoolExecutor deadlock -- gh-issue-106584: Fix exit code for ``unittest`` if all tests are skipped. - Patch by Egor Eliseev. +- gh-106584: Fix exit code for ``unittest`` if all tests are skipped. Patch + by Egor Eliseev. -- gh-issue-102956: Fix returning of empty byte strings after seek in zipfile +- gh-102956: Fix returning of empty byte strings after seek in zipfile module -- gh-issue-84867: :class:`unittest.TestLoader` no longer loads test cases - from exact :class:`unittest.TestCase` and - :class:`unittest.FunctionTestCase` classes. +- gh-84867: :class:`unittest.TestLoader` no longer loads test cases from + exact :class:`unittest.TestCase` and :class:`unittest.FunctionTestCase` + classes. -- gh-issue-91133: Fix a bug in :class:`tempfile.TemporaryDirectory` cleanup, - which now no longer dereferences symlinks when working around file system +- gh-91133: Fix a bug in :class:`tempfile.TemporaryDirectory` cleanup, which + now no longer dereferences symlinks when working around file system permission errors. -- gh-issue-73561: Omit the interface scope from an IPv6 address when used as - Host header by :mod:`http.client`. +- gh-73561: Omit the interface scope from an IPv6 address when used as Host + header by :mod:`http.client`. -- gh-issue-86826: :mod:`zipinfo` now supports the full range of values in - the TZ string determined by RFC 8536 and detects all invalid formats. Both - Python and C implementations now raise exceptions of the same type on - invalid data. +- gh-86826: :mod:`zipinfo` now supports the full range of values in the TZ + string determined by RFC 8536 and detects all invalid formats. Both Python + and C implementations now raise exceptions of the same type on invalid + data. - bpo-43153: On Windows, ``tempfile.TemporaryDirectory`` previously masked a ``PermissionError`` with ``NotADirectoryError`` during directory cleanup. @@ -1598,164 +2589,163 @@ Library Documentation ------------- -- gh-issue-111699: Relocate ``smtpd`` deprecation notice to its own section - rather than under ``locale`` in What's New in Python 3.12 document +- gh-111699: Relocate ``smtpd`` deprecation notice to its own section rather + than under ``locale`` in What's New in Python 3.12 document -- gh-issue-108826: :mod:`dis` module command-line interface is now mentioned - in documentation. +- gh-108826: :mod:`dis` module command-line interface is now mentioned in + documentation. Tests ----- -- gh-issue-112769: The tests now correctly compare zlib version when +- gh-112769: The tests now correctly compare zlib version when :const:`zlib.ZLIB_RUNTIME_VERSION` contains non-integer suffixes. For example zlib-ng defines the version as ``1.3.0.zlib-ng``. -- gh-issue-110367: Make regrtest ``--verbose3`` option compatible with +- gh-110367: Make regrtest ``--verbose3`` option compatible with ``--huntrleaks -jN`` options. The ``./python -m test -j1 -R 3:3 --verbose3`` command now works as expected. Patch by Victor Stinner. -- gh-issue-111165: Remove no longer used functions ``run_unittest()`` and +- gh-111165: Remove no longer used functions ``run_unittest()`` and ``run_doctest()`` from the :mod:`test.support` module. -- gh-issue-110932: Fix regrtest if the ``SOURCE_DATE_EPOCH`` environment - variable is defined: use the variable value as the random seed. Patch by - Victor Stinner. +- gh-110932: Fix regrtest if the ``SOURCE_DATE_EPOCH`` environment variable + is defined: use the variable value as the random seed. Patch by Victor + Stinner. -- gh-issue-110995: test_gdb: Fix detection of gdb built without Python - scripting support. Patch by Victor Stinner. +- gh-110995: test_gdb: Fix detection of gdb built without Python scripting + support. Patch by Victor Stinner. -- gh-issue-110918: Test case matching patterns specified by options - ``--match``, ``--ignore``, ``--matchfile`` and ``--ignorefile`` are now - tested in the order of specification, and the last match determines - whether the test case be run or ignored. +- gh-110918: Test case matching patterns specified by options ``--match``, + ``--ignore``, ``--matchfile`` and ``--ignorefile`` are now tested in the + order of specification, and the last match determines whether the test + case be run or ignored. -- gh-issue-110647: Fix test_stress_modifying_handlers() of test_signal. - Patch by Victor Stinner. +- gh-110647: Fix test_stress_modifying_handlers() of test_signal. Patch by + Victor Stinner. -- gh-issue-103053: Fix test_tools.test_freeze on FreeBSD: run "make - distclean" instead of "make clean" in the copied source directory to - remove also the "python" program. Patch by Victor Stinner. +- gh-103053: Fix test_tools.test_freeze on FreeBSD: run "make distclean" + instead of "make clean" in the copied source directory to remove also the + "python" program. Patch by Victor Stinner. -- gh-issue-110167: Fix a deadlock in test_socket when server fails with a - timeout but the client is still running in its thread. Don't hold a lock - to call cleanup functions in doCleanups(). One of the cleanup function - waits until the client completes, whereas the client could deadlock if it - called addCleanup() in such situation. Patch by Victor Stinner. +- gh-110167: Fix a deadlock in test_socket when server fails with a timeout + but the client is still running in its thread. Don't hold a lock to call + cleanup functions in doCleanups(). One of the cleanup function waits until + the client completes, whereas the client could deadlock if it called + addCleanup() in such situation. Patch by Victor Stinner. -- gh-issue-110388: Add tests for :mod:`tty`. +- gh-110388: Add tests for :mod:`tty`. -- gh-issue-81002: Add tests for :mod:`termios`. +- gh-81002: Add tests for :mod:`termios`. -- gh-issue-110267: Add tests for pickling and copying PyStructSequence - objects. Patched by Xuehai Pan. +- gh-110267: Add tests for pickling and copying PyStructSequence objects. + Patched by Xuehai Pan. -- gh-issue-110031: Skip test_threading tests using thread+fork if Python is - built with Address Sanitizer (ASAN). Patch by Victor Stinner. +- gh-110031: Skip test_threading tests using thread+fork if Python is built + with Address Sanitizer (ASAN). Patch by Victor Stinner. -- gh-issue-110088: Fix test_asyncio timeouts: don't measure the maximum - duration, a test should not measure a CI performance. Only measure the - minimum duration when a task has a timeout or delay. Add ``CLOCK_RES`` to +- gh-110088: Fix test_asyncio timeouts: don't measure the maximum duration, + a test should not measure a CI performance. Only measure the minimum + duration when a task has a timeout or delay. Add ``CLOCK_RES`` to ``test_asyncio.utils``. Patch by Victor Stinner. -- gh-issue-109974: Fix race conditions in test_threading lock tests. Wait - until a condition is met rather than using :func:`time.sleep` with a - hardcoded number of seconds. Patch by Victor Stinner. +- gh-109974: Fix race conditions in test_threading lock tests. Wait until a + condition is met rather than using :func:`time.sleep` with a hardcoded + number of seconds. Patch by Victor Stinner. -- gh-issue-110033: Fix ``test_interprocess_signal()`` of ``test_signal``. - Make sure that the ``subprocess.Popen`` object is deleted before the test +- gh-110033: Fix ``test_interprocess_signal()`` of ``test_signal``. Make + sure that the ``subprocess.Popen`` object is deleted before the test raising an exception in a signal handler. Otherwise, ``Popen.__del__()`` can get the exception which is logged as ``Exception ignored in: ...`` and the test fails. Patch by Victor Stinner. -- gh-issue-109594: Fix test_timeout() of test_concurrent_futures.test_wait. - Remove the future which may or may not complete depending if it takes - longer than the timeout ot not. Keep the second future which does not - complete before wait() timeout. Patch by Victor Stinner. +- gh-109594: Fix test_timeout() of test_concurrent_futures.test_wait. Remove + the future which may or may not complete depending if it takes longer than + the timeout ot not. Keep the second future which does not complete before + wait() timeout. Patch by Victor Stinner. -- gh-issue-109972: Split test_gdb.py file into a test_gdb package made of - multiple tests, so tests can now be run in parallel. Patch by Victor - Stinner. +- gh-109972: Split test_gdb.py file into a test_gdb package made of multiple + tests, so tests can now be run in parallel. Patch by Victor Stinner. -- gh-issue-103053: Skip test_freeze_simple_script() of - test_tools.test_freeze if Python is built with ``./configure - --enable-optimizations``, which means with Profile Guided Optimization - (PGO): it just makes the test too slow. The freeze tool is tested by many - other CIs with other (faster) compiler flags. Patch by Victor Stinner. +- gh-103053: Skip test_freeze_simple_script() of test_tools.test_freeze if + Python is built with ``./configure --enable-optimizations``, which means + with Profile Guided Optimization (PGO): it just makes the test too slow. + The freeze tool is tested by many other CIs with other (faster) compiler + flags. Patch by Victor Stinner. -- gh-issue-109580: Skip ``test_perf_profiler`` if Python is built with ASAN, - MSAN or UBSAN sanitizer. Python does crash randomly in this test on such - build. Patch by Victor Stinner. +- gh-109580: Skip ``test_perf_profiler`` if Python is built with ASAN, MSAN + or UBSAN sanitizer. Python does crash randomly in this test on such build. + Patch by Victor Stinner. -- gh-issue-104736: Fix test_gdb on Python built with LLVM clang 16 on Linux +- gh-104736: Fix test_gdb on Python built with LLVM clang 16 on Linux ppc64le (ex: Fedora 38). Search patterns in gdb "bt" command output to detect when gdb fails to retrieve the traceback. For example, skip a test if ``Backtrace stopped: frame did not save the PC`` is found. Patch by Victor Stinner. -- gh-issue-108927: Fixed order dependence in running tests in the same - process when a test that has submodules (e.g. test_importlib) follows a - test that imports its submodule (e.g. test_importlib.util) and precedes a - test (e.g. test_unittest or test_compileall) that uses that submodule. +- gh-108927: Fixed order dependence in running tests in the same process + when a test that has submodules (e.g. test_importlib) follows a test that + imports its submodule (e.g. test_importlib.util) and precedes a test (e.g. + test_unittest or test_compileall) that uses that submodule. Build ----- -- gh-issue-112088: Add ``Tools/build/regen-configure.sh`` script to - regenerate the ``configure`` with an Ubuntu container image. The +- gh-112088: Add ``Tools/build/regen-configure.sh`` script to regenerate the + ``configure`` with an Ubuntu container image. The ``quay.io/tiran/cpython_autoconf:271`` container image (`tiran/cpython_autoconf `_) is no longer used. Patch by Victor Stinner. -- gh-issue-111046: For wasi-threads, memory is now exported to fix - compatibility issues with some wasm runtimes. +- gh-111046: For wasi-threads, memory is now exported to fix compatibility + issues with some wasm runtimes. -- gh-issue-103053: "make check-clean-src" now also checks if the "python" - program is found in the source directory: fail with an error if it does - exist. Patch by Victor Stinner. +- gh-103053: "make check-clean-src" now also checks if the "python" program + is found in the source directory: fail with an error if it does exist. + Patch by Victor Stinner. -- gh-issue-109191: Fix compile error when building with recent versions of +- gh-109191: Fix compile error when building with recent versions of libedit. Windows ------- -- gh-issue-111856: Fixes :func:`~os.fstat` on file systems that do not - support file ID requests. This includes FAT32 and exFAT. +- gh-111856: Fixes :func:`~os.fstat` on file systems that do not support + file ID requests. This includes FAT32 and exFAT. -- gh-issue-111293: Fix :data:`os.DirEntry.inode` dropping higher 64 bits of - a file id on some filesystems on Windows. +- gh-111293: Fix :data:`os.DirEntry.inode` dropping higher 64 bits of a file + id on some filesystems on Windows. -- gh-issue-110913: WindowsConsoleIO now correctly chunks large buffers - without splitting up UTF-8 sequences. +- gh-110913: WindowsConsoleIO now correctly chunks large buffers without + splitting up UTF-8 sequences. -- gh-issue-110437: Allows overriding the source of VC redistributables so - that releases can be guaranteed to never downgrade between updates. +- gh-110437: Allows overriding the source of VC redistributables so that + releases can be guaranteed to never downgrade between updates. -- gh-issue-109286: Update Windows installer to use SQLite 3.43.1. +- gh-109286: Update Windows installer to use SQLite 3.43.1. macOS ----- -- gh-issue-109981: Use ``/dev/fd`` on macOS to determine the number of open - files in ``test.support.os_helper.fd_count`` to avoid a crash with - "guarded" file descriptors when probing for open files. +- gh-109981: Use ``/dev/fd`` on macOS to determine the number of open files + in ``test.support.os_helper.fd_count`` to avoid a crash with "guarded" + file descriptors when probing for open files. -- gh-issue-110950: Update macOS installer to include an upstream Tcl/Tk fix - for the ``Secure coding is not enabled for restorable state!`` warning +- gh-110950: Update macOS installer to include an upstream Tcl/Tk fix for + the ``Secure coding is not enabled for restorable state!`` warning encountered in Tkinter on macOS 14 Sonoma. -- gh-issue-111015: Ensure that IDLE.app and Python Launcher.app are - installed with appropriate permissions on macOS builds. +- gh-111015: Ensure that IDLE.app and Python Launcher.app are installed with + appropriate permissions on macOS builds. -- gh-issue-109286: Update macOS installer to use SQLite 3.43.1. +- gh-109286: Update macOS installer to use SQLite 3.43.1. -- gh-issue-71383: Update macOS installer to include an upstream Tcl/Tk fix - for the ``ttk::ThemeChanged`` error encountered in Tkinter. +- gh-71383: Update macOS installer to include an upstream Tcl/Tk fix for the + ``ttk::ThemeChanged`` error encountered in Tkinter. -- gh-issue-92603: Update macOS installer to include a fix accepted by - upstream Tcl/Tk for a crash encountered after the first :meth:`tkinter.Tk` - instance is destroyed. +- gh-92603: Update macOS installer to include a fix accepted by upstream + Tcl/Tk for a crash encountered after the first :meth:`tkinter.Tk` instance + is destroyed. IDLE ---- @@ -1768,15 +2758,15 @@ IDLE C API ----- -- gh-issue-106560: Fix redundant declarations in the public C API. Declare +- gh-106560: Fix redundant declarations in the public C API. Declare PyBool_Type and PyLong_Type only once. Patch by Victor Stinner. -- gh-issue-112438: Fix support of format units "es", "et", "es#", and "et#" - in nested tuples in :c:func:`PyArg_ParseTuple`-like functions. +- gh-112438: Fix support of format units "es", "et", "es#", and "et#" in + nested tuples in :c:func:`PyArg_ParseTuple`-like functions. -- gh-issue-109521: :c:func:`PyImport_GetImporter` now sets RuntimeError if - it fails to get :data:`sys.path_hooks` or :data:`sys.path_importer_cache` - or they are not list and dict correspondingly. Previously it could return +- gh-109521: :c:func:`PyImport_GetImporter` now sets RuntimeError if it + fails to get :data:`sys.path_hooks` or :data:`sys.path_importer_cache` or + they are not list and dict correspondingly. Previously it could return NULL without setting error in obscure cases, crash or raise SystemError if these attributes have wrong type. @@ -1789,41 +2779,41 @@ What's New in Python 3.12.0 final? Core and Builtins ----------------- -- gh-issue-109823: Fix bug where compiler does not adjust labels when - removing an empty basic block which is a jump target. +- gh-109823: Fix bug where compiler does not adjust labels when removing an + empty basic block which is a jump target. -- gh-issue-109719: Fix missing jump target labels when compiler reorders - cold/warm blocks. +- gh-109719: Fix missing jump target labels when compiler reorders cold/warm + blocks. -- gh-issue-109627: Fix bug where the compiler does not assign a new jump - target label to a duplicated small exit block. +- gh-109627: Fix bug where the compiler does not assign a new jump target + label to a duplicated small exit block. Library ------- -- gh-issue-110045: Update the :mod:`symtable` module to support the new - scopes introduced by :pep:`695`. +- gh-110045: Update the :mod:`symtable` module to support the new scopes + introduced by :pep:`695`. Documentation ------------- -- gh-issue-109209: The minimum Sphinx version required for the documentation - is now 4.2. +- gh-109209: The minimum Sphinx version required for the documentation is + now 4.2. Windows ------- -- gh-issue-109991: Update Windows build to use OpenSSL 3.0.11. +- gh-109991: Update Windows build to use OpenSSL 3.0.11. macOS ----- -- gh-issue-109991: Update macOS installer to use OpenSSL 3.0.11. +- gh-109991: Update macOS installer to use OpenSSL 3.0.11. Tools/Demos ----------- -- gh-issue-109991: Update GitHub CI workflows to use OpenSSL 3.0.11 and +- gh-109991: Update GitHub CI workflows to use OpenSSL 3.0.11 and multissltests to use 1.1.1w, 3.0.11, and 3.1.3. @@ -1835,146 +2825,142 @@ What's New in Python 3.12.0 release candidate 3? Core and Builtins ----------------- -- gh-issue-109496: On a Python built in debug mode, :c:func:`Py_DECREF()` - now calls ``_Py_NegativeRefcount()`` if the object is a dangling pointer - to deallocated memory: memory filled with ``0xDD`` "dead byte" by the - debug hook on memory allocators. The fix is to check the reference count +- gh-109496: On a Python built in debug mode, :c:func:`Py_DECREF()` now + calls ``_Py_NegativeRefcount()`` if the object is a dangling pointer to + deallocated memory: memory filled with ``0xDD`` "dead byte" by the debug + hook on memory allocators. The fix is to check the reference count *before* checking for ``_Py_IsImmortal()``. Patch by Victor Stinner. -- gh-issue-109371: Deopted instructions correctly for tool initialization - and modified the incorrect assertion in instrumentation, when a previous - tool already sets INSTRUCTION events +- gh-109371: Deopted instructions correctly for tool initialization and + modified the incorrect assertion in instrumentation, when a previous tool + already sets INSTRUCTION events -- gh-issue-105658: Fix bug where the line trace of an except block ending - with a conditional includes an excess event with the line of the - conditional expression. +- gh-105658: Fix bug where the line trace of an except block ending with a + conditional includes an excess event with the line of the conditional + expression. -- gh-issue-109219: Fix compiling type param scopes that use a name which is - also free in an inner scope. +- gh-109219: Fix compiling type param scopes that use a name which is also + free in an inner scope. -- gh-issue-109341: Fix crash when compiling an invalid AST involving a +- gh-109341: Fix crash when compiling an invalid AST involving a :class:`ast.TypeAlias`. -- gh-issue-109195: Fix source location for the ``LOAD_*`` instruction - preceding a ``LOAD_SUPER_ATTR`` to load the ``super`` global (or shadowing - variable) so that it encompasses only the name ``super`` and not the - following parentheses. +- gh-109195: Fix source location for the ``LOAD_*`` instruction preceding a + ``LOAD_SUPER_ATTR`` to load the ``super`` global (or shadowing variable) + so that it encompasses only the name ``super`` and not the following + parentheses. -- gh-issue-109118: Disallow nested scopes (lambdas, generator expressions, - and comprehensions) within PEP 695 annotation scopes that are nested - within classes. +- gh-109118: Disallow nested scopes (lambdas, generator expressions, and + comprehensions) within PEP 695 annotation scopes that are nested within + classes. -- gh-issue-109114: Relax the detection of the error message for invalid - lambdas inside f-strings to not search for arbitrary replacement fields to - avoid false positives. Patch by Pablo Galindo +- gh-109114: Relax the detection of the error message for invalid lambdas + inside f-strings to not search for arbitrary replacement fields to avoid + false positives. Patch by Pablo Galindo -- gh-issue-109118: Fix interpreter crash when a NameError is raised inside - the type parameters of a generic class. +- gh-109118: Fix interpreter crash when a NameError is raised inside the + type parameters of a generic class. -- gh-issue-108976: Fix crash that occurs after de-instrumenting a code - object in a monitoring callback. +- gh-108976: Fix crash that occurs after de-instrumenting a code object in a + monitoring callback. -- gh-issue-108732: Make iteration variables of module- and class-scoped +- gh-108732: Make iteration variables of module- and class-scoped comprehensions visible to pdb and other tools that use ``frame.f_locals`` again. -- gh-issue-108959: Fix caret placement for error locations for subscript and +- gh-108959: Fix caret placement for error locations for subscript and binary operations that involve non-semantic parentheses and spaces. Patch by Pablo Galindo Library ------- -- gh-issue-108682: Enum: require ``names=()`` or ``type=...`` to create an - empty enum using the functional syntax. +- gh-108682: Enum: require ``names=()`` or ``type=...`` to create an empty + enum using the functional syntax. -- gh-issue-108843: Fix an issue in :func:`ast.unparse` when unparsing - f-strings containing many quote types. +- gh-108843: Fix an issue in :func:`ast.unparse` when unparsing f-strings + containing many quote types. Documentation ------------- -- gh-issue-102823: Document the return type of ``x // y`` when ``x`` and - ``y`` have type :class:`float`. +- gh-102823: Document the return type of ``x // y`` when ``x`` and ``y`` + have type :class:`float`. Tests ----- -- gh-issue-109396: Fix ``test_socket.test_hmac_sha1()`` in FIPS mode. Use a - longer key: FIPS mode requires at least of at least 112 bits. The previous - key was only 32 bits. Patch by Victor Stinner. +- gh-109396: Fix ``test_socket.test_hmac_sha1()`` in FIPS mode. Use a longer + key: FIPS mode requires at least of at least 112 bits. The previous key + was only 32 bits. Patch by Victor Stinner. -- gh-issue-104736: Fix test_gdb on Python built with LLVM clang 16 on Linux +- gh-104736: Fix test_gdb on Python built with LLVM clang 16 on Linux ppc64le (ex: Fedora 38). Search patterns in gdb "bt" command output to detect when gdb fails to retrieve the traceback. For example, skip a test if ``Backtrace stopped: frame did not save the PC`` is found. Patch by Victor Stinner. -- gh-issue-109237: Fix ``test_site.test_underpth_basic()`` when the working +- gh-109237: Fix ``test_site.test_underpth_basic()`` when the working directory contains at least one non-ASCII character: encode the ``._pth`` file to UTF-8 and enable the UTF-8 Mode to use UTF-8 for the child process stdout. Patch by Victor Stinner. -- gh-issue-109230: Fix ``test_pyexpat.test_exception()``: it can now be run - from a directory different than Python source code directory. Before, the - test failed in this case. Skip the test if Modules/pyexpat.c source is - not available. Skip also the test on Python implementations other than +- gh-109230: Fix ``test_pyexpat.test_exception()``: it can now be run from a + directory different than Python source code directory. Before, the test + failed in this case. Skip the test if Modules/pyexpat.c source is not + available. Skip also the test on Python implementations other than CPython. Patch by Victor Stinner. -- gh-issue-109015: Fix test_asyncio, test_imaplib and test_socket tests on - FreeBSD if the TCP blackhole is enabled (``sysctl - net.inet.tcp.blackhole``). Skip the few tests which failed with - ``ETIMEDOUT`` which such non standard configuration. Currently, the - `FreeBSD GCP image enables TCP and UDP blackhole - `_ (``sysctl +- gh-109015: Fix test_asyncio, test_imaplib and test_socket tests on FreeBSD + if the TCP blackhole is enabled (``sysctl net.inet.tcp.blackhole``). Skip + the few tests which failed with ``ETIMEDOUT`` which such non standard + configuration. Currently, the `FreeBSD GCP image enables TCP and UDP + blackhole `_ (``sysctl net.inet.tcp.blackhole=2`` and ``sysctl net.inet.udp.blackhole=1``). Patch by Victor Stinner. -- gh-issue-91960: Skip ``test_gdb`` if gdb is unable to retrieve Python - frame objects: if a frame is ````. When Python is built - with "clang -Og", gdb can fail to retrive the *frame* parameter of +- gh-91960: Skip ``test_gdb`` if gdb is unable to retrieve Python frame + objects: if a frame is ````. When Python is built with + "clang -Og", gdb can fail to retrive the *frame* parameter of ``_PyEval_EvalFrameDefault()``. In this case, tests like ``py_bt()`` are likely to fail. Without getting access to Python frames, ``python-gdb.py`` is mostly clueless on retrieving the Python traceback. Moreover, ``test_gdb`` is no longer skipped on macOS if Python is built with Clang. Patch by Victor Stinner. -- gh-issue-108962: Skip ``test_tempfile.test_flags()`` if ``chflags()`` - fails with "OSError: [Errno 45] Operation not supported" (ex: on FreeBSD - 13). Patch by Victor Stinner. +- gh-108962: Skip ``test_tempfile.test_flags()`` if ``chflags()`` fails with + "OSError: [Errno 45] Operation not supported" (ex: on FreeBSD 13). Patch + by Victor Stinner. -- gh-issue-108851: Fix ``test_tomllib`` recursion tests for WASI buildbots: - reduce the recursion limit and compute the maximum nested array/dict - depending on the current available recursion limit. Patch by Victor - Stinner. +- gh-108851: Fix ``test_tomllib`` recursion tests for WASI buildbots: reduce + the recursion limit and compute the maximum nested array/dict depending on + the current available recursion limit. Patch by Victor Stinner. -- gh-issue-108851: Add ``get_recursion_available()`` and - ``get_recursion_depth()`` functions to the :mod:`test.support` module. - Patch by Victor Stinner. +- gh-108851: Add ``get_recursion_available()`` and ``get_recursion_depth()`` + functions to the :mod:`test.support` module. Patch by Victor Stinner. -- gh-issue-108834: Add ``--fail-rerun option`` option to regrtest: if a test +- gh-108834: Add ``--fail-rerun option`` option to regrtest: if a test failed when then passed when rerun in verbose mode, exit the process with exit code 2 (error), instead of exit code 0 (success). Patch by Victor Stinner. -- gh-issue-108834: Rename regrtest ``--verbose2`` option (``-w``) to - ``--rerun``. Keep ``--verbose2`` as a deprecated alias. Patch by Victor - Stinner. +- gh-108834: Rename regrtest ``--verbose2`` option (``-w``) to ``--rerun``. + Keep ``--verbose2`` as a deprecated alias. Patch by Victor Stinner. -- gh-issue-108834: When regrtest reruns failed tests in verbose mode - (``./python -m test --rerun``), tests are now rerun in fresh worker - processes rather than being executed in the main process. If a test does - crash or is killed by a timeout, the main process can detect and handle - the killed worker process. Tests are rerun in parallel if the ``-jN`` - option is used to run tests in parallel. Patch by Victor Stinner. +- gh-108834: When regrtest reruns failed tests in verbose mode (``./python + -m test --rerun``), tests are now rerun in fresh worker processes rather + than being executed in the main process. If a test does crash or is killed + by a timeout, the main process can detect and handle the killed worker + process. Tests are rerun in parallel if the ``-jN`` option is used to run + tests in parallel. Patch by Victor Stinner. -- gh-issue-103186: Suppress and assert expected RuntimeWarnings in +- gh-103186: Suppress and assert expected RuntimeWarnings in test_sys_settrace.py Build ----- -- gh-issue-108740: Fix a race condition in ``make regen-all``. The +- gh-108740: Fix a race condition in ``make regen-all``. The ``deepfreeze.c`` source and files generated by Argument Clinic are now generated or updated before generating "global objects". Previously, some identifiers may miss depending on the order in which these files were @@ -1989,131 +2975,128 @@ What's New in Python 3.12.0 release candidate 2? Security -------- -- gh-issue-108310: Fixed an issue where instances of :class:`ssl.SSLSocket` - were vulnerable to a bypass of the TLS handshake and included protections - (like certificate verification) and treating sent unencrypted data as if - it were post-handshake TLS encrypted data. Security issue reported as +- gh-108310: Fixed an issue where instances of :class:`ssl.SSLSocket` were + vulnerable to a bypass of the TLS handshake and included protections (like + certificate verification) and treating sent unencrypted data as if it were + post-handshake TLS encrypted data. Security issue reported as :cve:`2023-40217` by Aapo Oksman. Patch by Gregory P. Smith. -- gh-issue-107774: PEP 669 specifies that - ``sys.monitoring.register_callback`` will generate an audit event. - Pre-releases of Python 3.12 did not generate the audit event. This is now - fixed. +- gh-107774: PEP 669 specifies that ``sys.monitoring.register_callback`` + will generate an audit event. Pre-releases of Python 3.12 did not generate + the audit event. This is now fixed. Core and Builtins ----------------- -- gh-issue-108520: Fix - :meth:`multiprocessing.synchronize.SemLock.__setstate__` to properly - initialize :attr:`multiprocessing.synchronize.SemLock._is_fork_ctx`. This - fixes a regression when passing a SemLock accross nested processes. +- gh-108520: Fix :meth:`multiprocessing.synchronize.SemLock.__setstate__` to + properly initialize + :attr:`multiprocessing.synchronize.SemLock._is_fork_ctx`. This fixes a + regression when passing a SemLock accross nested processes. Rename :attr:`multiprocessing.synchronize.SemLock.is_fork_ctx` to :attr:`multiprocessing.synchronize.SemLock._is_fork_ctx` to avoid exposing it as public API. -- gh-issue-108654: Restore locals shadowed by an inlined comprehension if - the comprehension raises an exception. +- gh-108654: Restore locals shadowed by an inlined comprehension if the + comprehension raises an exception. -- gh-issue-108487: Change an assert that would cause a spurious crash in a - devious case that should only trigger deoptimization. +- gh-108487: Change an assert that would cause a spurious crash in a devious + case that should only trigger deoptimization. -- gh-issue-106176: Use a ``WeakValueDictionary`` to track the lists - containing the modules each thread is currently importing. This helps - avoid a reference leak from keeping the list around longer than necessary. - Weakrefs are used as GC can't interrupt the cleanup. +- gh-106176: Use a ``WeakValueDictionary`` to track the lists containing the + modules each thread is currently importing. This helps avoid a reference + leak from keeping the list around longer than necessary. Weakrefs are used + as GC can't interrupt the cleanup. -- gh-issue-107901: Fix missing line number on :opcode:`JUMP_BACKWARD` at the - end of a for loop. +- gh-107901: Fix missing line number on :opcode:`JUMP_BACKWARD` at the end + of a for loop. -- gh-issue-108390: Raise an exception when setting a non-local event - (``RAISE``, ``EXCEPTION_HANDLED``, etc.) in - ``sys.monitoring.set_local_events``. +- gh-108390: Raise an exception when setting a non-local event (``RAISE``, + ``EXCEPTION_HANDLED``, etc.) in ``sys.monitoring.set_local_events``. Fixes crash when tracing in recursive calls to Python classes. -- gh-issue-91051: Fix abort / segfault when using all eight type watcher - slots, on platforms where ``char`` is signed by default. +- gh-91051: Fix abort / segfault when using all eight type watcher slots, on + platforms where ``char`` is signed by default. -- gh-issue-107724: In pre-release versions of 3.12, up to rc1, the - sys.monitoring callback function for the ``PY_THROW`` event was missing - the third, exception argument. That is now fixed. +- gh-107724: In pre-release versions of 3.12, up to rc1, the sys.monitoring + callback function for the ``PY_THROW`` event was missing the third, + exception argument. That is now fixed. -- gh-issue-107080: Trace refs builds (``--with-trace-refs``) were crashing - when used with isolated subinterpreters. The problematic global state has - been isolated to each interpreter. Other fixing the crashes, this change - does not affect users. +- gh-107080: Trace refs builds (``--with-trace-refs``) were crashing when + used with isolated subinterpreters. The problematic global state has been + isolated to each interpreter. Other fixing the crashes, this change does + not affect users. -- gh-issue-77377: Ensure that multiprocessing synchronization objects - created in a fork context are not sent to a different process created in a - spawn context. This changes a segfault into an actionable RuntimeError in - the parent process. +- gh-77377: Ensure that multiprocessing synchronization objects created in a + fork context are not sent to a different process created in a spawn + context. This changes a segfault into an actionable RuntimeError in the + parent process. Library ------- -- gh-issue-108469: :func:`ast.unparse` now supports new :term:`f-string` - syntax introduced in Python 3.12. Note that the :term:`f-string` quotes - are reselected for simplicity under the new syntax. (Patch by Steven Sun) +- gh-108469: :func:`ast.unparse` now supports new :term:`f-string` syntax + introduced in Python 3.12. Note that the :term:`f-string` quotes are + reselected for simplicity under the new syntax. (Patch by Steven Sun) -- gh-issue-108682: Enum: raise :exc:`TypeError` if ``super().__new__()`` is - called from a custom ``__new__``. +- gh-108682: Enum: raise :exc:`TypeError` if ``super().__new__()`` is called + from a custom ``__new__``. -- gh-issue-108295: Fix crashes related to use of weakrefs on +- gh-108295: Fix crashes related to use of weakrefs on :data:`typing.TypeVar`. -- gh-issue-64662: Fix support for virtual tables in +- gh-64662: Fix support for virtual tables in :meth:`sqlite3.Connection.iterdump`. Patch by Aviv Palivoda. -- gh-issue-108111: Fix a regression introduced in GH-101251 for 3.12, - resulting in an incorrect offset calculation in - :meth:`gzip.GzipFile.seek`. +- gh-108111: Fix a regression introduced in GH-101251 for 3.12, resulting in + an incorrect offset calculation in :meth:`gzip.GzipFile.seek`. -- gh-issue-105736: Harmonized the pure Python version of +- gh-105736: Harmonized the pure Python version of :class:`~collections.OrderedDict` with the C version. Now, both versions set up their internal state in ``__new__``. Formerly, the pure Python version did the set up in ``__init__``. -- gh-issue-108083: Fix bugs in the constructor of :mod:`sqlite3.Connection` - and :meth:`sqlite3.Connection.close` where exceptions could be leaked. - Patch by Erlend E. Aasland. +- gh-108083: Fix bugs in the constructor of :mod:`sqlite3.Connection` and + :meth:`sqlite3.Connection.close` where exceptions could be leaked. Patch + by Erlend E. Aasland. -- gh-issue-107963: Fix :func:`multiprocessing.set_forkserver_preload` to - check the given list of modules names. Patch by Donghee Na. +- gh-107963: Fix :func:`multiprocessing.set_forkserver_preload` to check the + given list of modules names. Patch by Donghee Na. -- gh-issue-106242: Fixes :func:`os.path.normpath` to handle embedded null +- gh-106242: Fixes :func:`os.path.normpath` to handle embedded null characters without truncating the path. -- gh-issue-107913: Fix possible losses of ``errno`` and ``winerror`` values - in :exc:`OSError` exceptions if they were cleared or modified by the - cleanup code before creating the exception object. +- gh-107913: Fix possible losses of ``errno`` and ``winerror`` values in + :exc:`OSError` exceptions if they were cleared or modified by the cleanup + code before creating the exception object. -- gh-issue-107845: :func:`tarfile.data_filter` now takes the location of - symlinks into account when determining their target, so it will no longer - reject some valid tarballs with ``LinkOutsideDestinationError``. +- gh-107845: :func:`tarfile.data_filter` now takes the location of symlinks + into account when determining their target, so it will no longer reject + some valid tarballs with ``LinkOutsideDestinationError``. -- gh-issue-107805: Fix signatures of module-level generated functions in +- gh-107805: Fix signatures of module-level generated functions in :mod:`turtle`. -- gh-issue-107715: Fix :meth:`doctest.DocTestFinder.find` in presence of - class names with special characters. Patch by Gertjan van Zwieten. +- gh-107715: Fix :meth:`doctest.DocTestFinder.find` in presence of class + names with special characters. Patch by Gertjan van Zwieten. -- gh-issue-100814: Passing a callable object as an option value to a Tkinter - image now raises the expected TclError instead of an AttributeError. +- gh-100814: Passing a callable object as an option value to a Tkinter image + now raises the expected TclError instead of an AttributeError. -- gh-issue-106684: Close :class:`asyncio.StreamWriter` when it is not closed - by application leading to memory leaks. Patch by Kumar Aditya. +- gh-106684: Close :class:`asyncio.StreamWriter` when it is not closed by + application leading to memory leaks. Patch by Kumar Aditya. -- gh-issue-107396: tarfiles; Fixed use before assignment of self.exception - for gzip decompression +- gh-107396: tarfiles; Fixed use before assignment of self.exception for + gzip decompression -- gh-issue-106052: :mod:`re` module: fix the matching of possessive - quantifiers in the case of a subpattern containing backtracking. +- gh-106052: :mod:`re` module: fix the matching of possessive quantifiers in + the case of a subpattern containing backtracking. -- gh-issue-100061: Fix a bug that causes wrong matches for regular - expressions with possessive qualifier. +- gh-100061: Fix a bug that causes wrong matches for regular expressions + with possessive qualifier. -- gh-issue-99203: Restore following CPython <= 3.10.5 behavior of +- gh-99203: Restore following CPython <= 3.10.5 behavior of :func:`shutil.make_archive`: do not create an empty archive if ``root_dir`` is not a directory, and, in that case, raise :class:`FileNotFoundError` or :class:`NotADirectoryError` regardless of @@ -2123,82 +3106,82 @@ Library Documentation ------------- -- gh-issue-105052: Update ``timeit`` doc to specify that time in seconds is - just the default. +- gh-105052: Update ``timeit`` doc to specify that time in seconds is just + the default. Tests ----- -- gh-issue-89392: Removed support of ``test_main()`` function in tests. They - now always use normal unittest test runner. +- gh-89392: Removed support of ``test_main()`` function in tests. They now + always use normal unittest test runner. -- gh-issue-108388: Convert test_concurrent_futures to a package of 7 - sub-tests. Patch by Victor Stinner. +- gh-108388: Convert test_concurrent_futures to a package of 7 sub-tests. + Patch by Victor Stinner. -- gh-issue-108388: Split test_multiprocessing_fork, +- gh-108388: Split test_multiprocessing_fork, test_multiprocessing_forkserver and test_multiprocessing_spawn into test packages. Each package is made of 4 sub-tests: processes, threads, manager and misc. It allows running more tests in parallel and so reduce the total test duration. Patch by Victor Stinner. -- gh-issue-105776: Fix test_cppext when the C compiler command ``-std=c11`` +- gh-105776: Fix test_cppext when the C compiler command ``-std=c11`` option: remove ``-std=`` options from the compiler command. Patch by Victor Stinner. -- gh-issue-107178: Add the C API test for functions in the Mapping Protocol, - the Sequence Protocol and some functions in the Object Protocol. +- gh-107178: Add the C API test for functions in the Mapping Protocol, the + Sequence Protocol and some functions in the Object Protocol. Build ----- -- gh-issue-63760: Fix Solaris build: no longer redefine the - ``gethostname()`` function. Solaris defines the function since 2005. Patch - by Victor Stinner, original patch by Jakub Kulík. +- gh-63760: Fix Solaris build: no longer redefine the ``gethostname()`` + function. Solaris defines the function since 2005. Patch by Victor + Stinner, original patch by Jakub Kulík. -- gh-issue-107814: When calling ``find_python.bat`` with ``-q`` it did not +- gh-107814: When calling ``find_python.bat`` with ``-q`` it did not properly silence the output of nuget. That is now fixed. Windows ------- -- gh-issue-107565: Update Windows build to use OpenSSL 3.0.10. +- gh-107565: Update Windows build to use OpenSSL 3.0.10. -- gh-issue-106242: Fixes :func:`~os.path.realpath` to behave consistently - when passed a path containing an embedded null character on Windows. In - strict mode, it now raises :exc:`OSError` instead of the unexpected +- gh-106242: Fixes :func:`~os.path.realpath` to behave consistently when + passed a path containing an embedded null character on Windows. In strict + mode, it now raises :exc:`OSError` instead of the unexpected :exc:`ValueError`, and in non-strict mode will make the path absolute. -- gh-issue-106844: Fix integer overflow and truncating by the null character - in :func:`!_winapi.LCMapStringEx` which affects :func:`ntpath.normcase`. +- gh-106844: Fix integer overflow and truncating by the null character in + :func:`!_winapi.LCMapStringEx` which affects :func:`ntpath.normcase`. macOS ----- -- gh-issue-107565: Update macOS installer to use OpenSSL 3.0.10. +- gh-107565: Update macOS installer to use OpenSSL 3.0.10. Tools/Demos ----------- -- gh-issue-107565: Update multissltests and GitHub CI workflows to use - OpenSSL 1.1.1v, 3.0.10, and 3.1.2. +- gh-107565: Update multissltests and GitHub CI workflows to use OpenSSL + 1.1.1v, 3.0.10, and 3.1.2. -- gh-issue-95065: Argument Clinic now supports overriding automatically - generated signature by using directive ``@text_signature``. +- gh-95065: Argument Clinic now supports overriding automatically generated + signature by using directive ``@text_signature``. C API ----- -- gh-issue-107916: C API functions :c:func:`PyErr_SetFromErrnoWithFilename`, +- gh-107916: C API functions :c:func:`PyErr_SetFromErrnoWithFilename`, :c:func:`PyErr_SetExcFromWindowsErrWithFilename` and :c:func:`PyErr_SetFromWindowsErrWithFilename` save now the error code before calling :c:func:`PyUnicode_DecodeFSDefault`. -- gh-issue-107915: Such C API functions as ``PyErr_SetString()``, +- gh-107915: Such C API functions as ``PyErr_SetString()``, ``PyErr_Format()``, ``PyErr_SetFromErrnoWithFilename()`` and many others no longer crash or ignore errors if it failed to format the error message or decode the filename. Instead, they keep a corresponding error. -- gh-issue-107810: Improve :exc:`DeprecationWarning` for uses of +- gh-107810: Improve :exc:`DeprecationWarning` for uses of :c:type:`PyType_Spec` with metaclasses that have custom ``tp_new``. @@ -2210,130 +3193,128 @@ What's New in Python 3.12.0 release candidate 1? Security -------- -- gh-issue-102988: Reverted the :mod:`email.utils` security improvement - change released in 3.12beta4 that unintentionally caused +- gh-102988: Reverted the :mod:`email.utils` security improvement change + released in 3.12beta4 that unintentionally caused :mod:`email.utils.getaddresses` to fail to parse email addresses with a comma in the quoted name field. See :gh:`106669`. -- gh-issue-102509: Start initializing ``ob_digit`` during creation of +- gh-102509: Start initializing ``ob_digit`` during creation of :c:type:`PyLongObject` objects. Patch by Illia Volochii. Core and Builtins ----------------- -- gh-issue-107263: Increase C recursion limit for functions other than the - main interpreter from 800 to 1500. This should allow functions like +- gh-107263: Increase C recursion limit for functions other than the main + interpreter from 800 to 1500. This should allow functions like ``list.__repr__`` and ``json.dumps`` to handle all the inputs that they could prior to 3.12 -- gh-issue-104432: Fix potential unaligned memory access on C APIs involving +- gh-104432: Fix potential unaligned memory access on C APIs involving returned sequences of ``char *`` pointers within the :mod:`grp` and :mod:`socket` modules. These were revealed using a ``-fsaniziter=alignment`` build on ARM macOS. Patch by Christopher Chavez. -- gh-issue-106898: Add the exception as the third argument to ``PY_UNIND`` +- gh-106898: Add the exception as the third argument to ``PY_UNIND`` callbacks in ``sys.monitoring``. This makes the ``PY_UNWIND`` callback consistent with the other exception hanlding callbacks. -- gh-issue-106895: Raise a ``ValueError`` when a monitoring callback funtion +- gh-106895: Raise a ``ValueError`` when a monitoring callback funtion returns ``DISABLE`` for events that cannot be disabled locally. -- gh-issue-106897: Add a ``RERAISE`` event to ``sys.monitoring``, which - occurs when an exception is reraised, either explicitly by a plain - ``raise`` statement, or implicitly in an ``except`` or ``finally`` block. +- gh-106897: Add a ``RERAISE`` event to ``sys.monitoring``, which occurs + when an exception is reraised, either explicitly by a plain ``raise`` + statement, or implicitly in an ``except`` or ``finally`` block. -- gh-issue-104621: Unsupported modules now always fail to be imported. +- gh-104621: Unsupported modules now always fail to be imported. -- gh-issue-106917: Fix classmethod-style :func:`super` method calls (i.e., - where the second argument to :func:`super`, or the implied second argument - drawn from ``self/cls`` in the case of zero-arg super, is a type) when the +- gh-106917: Fix classmethod-style :func:`super` method calls (i.e., where + the second argument to :func:`super`, or the implied second argument drawn + from ``self/cls`` in the case of zero-arg super, is a type) when the target of the call is not a classmethod. -- gh-issue-105699: Python no longer crashes due an infrequent race when +- gh-105699: Python no longer crashes due an infrequent race when initialzing per-interpreter interned strings. The crash would manifest when the interpreter was finalized. -- gh-issue-105699: Python no longer crashes due to an infrequent race in - setting ``Py_FileSystemDefaultEncoding`` and - ``Py_FileSystemDefaultEncodeErrors`` (both deprecated), when - simultaneously initializing two isolated subinterpreters. Now they are - only set during runtime initialization. +- gh-105699: Python no longer crashes due to an infrequent race in setting + ``Py_FileSystemDefaultEncoding`` and ``Py_FileSystemDefaultEncodeErrors`` + (both deprecated), when simultaneously initializing two isolated + subinterpreters. Now they are only set during runtime initialization. -- gh-issue-106092: Fix a segmentation fault caused by a use-after-free bug - in ``frame_dealloc`` when the trashcan delays the deallocation of a +- gh-106092: Fix a segmentation fault caused by a use-after-free bug in + ``frame_dealloc`` when the trashcan delays the deallocation of a ``PyFrameObject``. -- gh-issue-106719: No longer suppress arbitrary errors in the - ``__annotations__`` getter and setter in the type and module types. +- gh-106719: No longer suppress arbitrary errors in the ``__annotations__`` + getter and setter in the type and module types. -- gh-issue-106723: Propagate ``frozen_modules`` to multiprocessing spawned - process interpreters. +- gh-106723: Propagate ``frozen_modules`` to multiprocessing spawned process + interpreters. -- gh-issue-105235: Prevent out-of-bounds memory access during - ``mmap.find()`` calls. +- gh-105235: Prevent out-of-bounds memory access during ``mmap.find()`` + calls. Library ------- -- gh-issue-107077: Seems that in some conditions, OpenSSL will return +- gh-107077: Seems that in some conditions, OpenSSL will return ``SSL_ERROR_SYSCALL`` instead of ``SSL_ERROR_SSL`` when a certification verification has failed, but the error parameters will still contain ``ERR_LIB_SSL`` and ``SSL_R_CERTIFICATE_VERIFY_FAILED``. We are now detecting this situation and raising the appropiate ``ssl.SSLCertVerificationError``. Patch by Pablo Galindo -- gh-issue-107576: Fix :func:`types.get_original_bases` to only return +- gh-107576: Fix :func:`types.get_original_bases` to only return :attr:`!__orig_bases__` if it is present on ``cls`` directly. Patch by James Hilton-Balfe. -- gh-issue-46376: Prevent memory leak and use-after-free when using pointers - to pointers with ctypes +- gh-46376: Prevent memory leak and use-after-free when using pointers to + pointers with ctypes -- gh-issue-62519: Make :func:`gettext.pgettext` search plural definitions - when translation is not found. +- gh-62519: Make :func:`gettext.pgettext` search plural definitions when + translation is not found. -- gh-issue-83006: Document behavior of :func:`shutil.disk_usage` for - non-mounted filesystems on Unix. +- gh-83006: Document behavior of :func:`shutil.disk_usage` for non-mounted + filesystems on Unix. -- gh-issue-106186: Do not report ``MultipartInvariantViolationDefect`` - defect when the :class:`email.parser.Parser` class is used to parse emails - with ``headersonly=True``. +- gh-106186: Do not report ``MultipartInvariantViolationDefect`` defect when + the :class:`email.parser.Parser` class is used to parse emails with + ``headersonly=True``. -- gh-issue-105002: Fix invalid result from :meth:`PurePath.relative_to` - method when attempting to walk a "``..``" segment in *other* with - *walk_up* enabled. A :exc:`ValueError` exception is now raised in this - case. +- gh-105002: Fix invalid result from :meth:`PurePath.relative_to` method + when attempting to walk a "``..``" segment in *other* with *walk_up* + enabled. A :exc:`ValueError` exception is now raised in this case. -- gh-issue-106831: Fix potential missing ``NULL`` check of - ``d2i_SSL_SESSION`` result in ``_ssl.c``. +- gh-106831: Fix potential missing ``NULL`` check of ``d2i_SSL_SESSION`` + result in ``_ssl.c``. -- gh-issue-106774: Update the bundled copy of pip to version 23.2.1. +- gh-106774: Update the bundled copy of pip to version 23.2.1. -- gh-issue-106752: Fixed several bugs in zipfile.Path, including: in +- gh-106752: Fixed several bugs in zipfile.Path, including: in ``Path.match``, Windows separators are no longer honored (and never were meant to be); Fixed ``name``/``suffix``/``suffixes``/``stem`` operations when no filename is present and the Path is not at the root of the zipfile; Reworked glob for performance and more correct matching behavior. -- gh-issue-106602: Add __copy__ and __deepcopy__ in :mod:`enum` +- gh-106602: Add __copy__ and __deepcopy__ in :mod:`enum` -- gh-issue-106530: Revert a change to :func:`colorsys.rgb_to_hls` that - caused division by zero for certain almost-white inputs. Patch by Terry - Jan Reedy. +- gh-106530: Revert a change to :func:`colorsys.rgb_to_hls` that caused + division by zero for certain almost-white inputs. Patch by Terry Jan + Reedy. -- gh-issue-106403: Instances of :class:`typing.TypeVar`, +- gh-106403: Instances of :class:`typing.TypeVar`, :class:`typing.ParamSpec`, :class:`typing.ParamSpecArgs`, :class:`typing.ParamSpecKwargs`, and :class:`typing.TypeVarTuple` once again support weak references, fixing a regression introduced in Python 3.12.0 beta 1. Patch by Jelle Zijlstra. -- gh-issue-106350: Detect possible memory allocation failure in the - libtommath function :c:func:`mp_init` used by the ``_tkinter`` module. +- gh-106350: Detect possible memory allocation failure in the libtommath + function :c:func:`mp_init` used by the ``_tkinter`` module. -- gh-issue-106263: Fix crash when calling ``repr`` with a manually - constructed SignalDict object. Patch by Charlie Zhao. +- gh-106263: Fix crash when calling ``repr`` with a manually constructed + SignalDict object. Patch by Charlie Zhao. -- gh-issue-105626: Change the default return value of +- gh-105626: Change the default return value of :meth:`http.client.HTTPConnection.get_proxy_response_headers` to be ``None`` and not ``{}``. @@ -2343,74 +3324,72 @@ Library Documentation ------------- -- gh-issue-107305: Add documentation for :c:type:`PyInterpreterConfig` and +- gh-107305: Add documentation for :c:type:`PyInterpreterConfig` and :c:func:`Py_NewInterpreterFromConfig`. Also clarify some of the nearby docs relative to per-interpreter GIL. -- gh-issue-107008: Document the :mod:`curses` module variables +- gh-107008: Document the :mod:`curses` module variables :const:`~curses.LINES` and :const:`~curses.COLS`. -- gh-issue-106948: Add a number of standard external names to - ``nitpick_ignore``. +- gh-106948: Add a number of standard external names to ``nitpick_ignore``. -- gh-issue-54738: Add documentation on how to localize the :mod:`argparse` - module. +- gh-54738: Add documentation on how to localize the :mod:`argparse` module. Tests ----- -- gh-issue-107237: ``test_logging``: Fix ``test_udp_reconnection()`` by - increasing the timeout from 100 ms to 5 minutes (LONG_TIMEOUT). Patch by - Victor Stinner. +- gh-107237: ``test_logging``: Fix ``test_udp_reconnection()`` by increasing + the timeout from 100 ms to 5 minutes (LONG_TIMEOUT). Patch by Victor + Stinner. -- gh-issue-106714: test_capi: Fix test_no_FatalError_infinite_loop() to no - longer write a coredump, by using test.support.SuppressCrashReport. Patch - by Victor Stinner. +- gh-106714: test_capi: Fix test_no_FatalError_infinite_loop() to no longer + write a coredump, by using test.support.SuppressCrashReport. Patch by + Victor Stinner. -- gh-issue-104090: Avoid creating a reference to the test object in +- gh-104090: Avoid creating a reference to the test object in :meth:`~unittest.TestResult.collectedDurations`. -- gh-issue-106752: Moved tests for ``zipfile.Path`` into +- gh-106752: Moved tests for ``zipfile.Path`` into ``Lib/test/test_zipfile/_path``. Made ``zipfile._path`` a package. Build ----- -- gh-issue-106881: Check for ``linux/limits.h`` before including it in +- gh-106881: Check for ``linux/limits.h`` before including it in ``Modules/posixmodule.c``. -- gh-issue-106962: Detect MPI compilers in :file:`configure`. +- gh-106962: Detect MPI compilers in :file:`configure`. -- gh-issue-101538: Add experimental wasi-threads support. Patch by Takashi +- gh-101538: Add experimental wasi-threads support. Patch by Takashi Yamamoto. Windows ------- -- gh-issue-99079: Update Windows build to use OpenSSL 3.0.9 +- gh-99079: Update Windows build to use OpenSSL 3.0.9 macOS ----- -- gh-issue-99079: Update macOS installer to use OpenSSL 3.0.9. +- gh-99079: Update macOS installer to use OpenSSL 3.0.9. Tools/Demos ----------- -- gh-issue-106970: Fix bugs in the Argument Clinic ``destination - clear`` command; the destination buffers would never be cleared, and the +- gh-106970: Fix bugs in the Argument Clinic ``destination clear`` + command; the destination buffers would never be cleared, and the ``destination`` directive parser would simply continue to the fault handler after processing the command. Patch by Erlend E. Aasland. -- gh-issue-103186: ``freeze`` now fetches ``CONFIG_ARGS`` from the original +- gh-103186: ``freeze`` now fetches ``CONFIG_ARGS`` from the original CPython instance the Makefile uses to call utility scripts. Patch by Ijtaba Hussain. C API ----- -- gh-issue-107226: :c:func:`PyModule_AddObjectRef` is now only available in - the limited API version 3.10 or later. +- gh-107226: :c:func:`PyModule_AddObjectRef` is now only available in the + limited API version 3.10 or later. What's New in Python 3.12.0 beta 4? @@ -2421,122 +3400,114 @@ What's New in Python 3.12.0 beta 4? Security -------- -- gh-issue-102988: :cve:`2023-27043`: Prevent :func:`email.utils.parseaddr` - and :func:`email.utils.getaddresses` from returning the realname portion - of an invalid RFC2822 email header in the email address portion of the - 2-tuple returned after being parsed by - :class:`email._parseaddr.AddressList`. +- gh-102988: :cve:`2023-27043`: Prevent :func:`email.utils.parseaddr` and + :func:`email.utils.getaddresses` from returning the realname portion of an + invalid RFC2822 email header in the email address portion of the 2-tuple + returned after being parsed by :class:`email._parseaddr.AddressList`. Core and Builtins ----------------- -- gh-issue-106396: When the format specification of an f-string expression - is empty, the parser now generates an empty :class:`ast.JoinedStr` node - for it instead of an one-element :class:`ast.JoinedStr` with an empty - string :class:`ast.Constant`. +- gh-106396: When the format specification of an f-string expression is + empty, the parser now generates an empty :class:`ast.JoinedStr` node for + it instead of an one-element :class:`ast.JoinedStr` with an empty string + :class:`ast.Constant`. -- gh-issue-106145: Make ``end_lineno`` and ``end_col_offset`` required on +- gh-106145: Make ``end_lineno`` and ``end_col_offset`` required on ``type_param`` ast nodes. -- gh-issue-105979: Fix crash in :func:`!_imp.get_frozen_object` due to - improper exception handling. +- gh-105979: Fix crash in :func:`!_imp.get_frozen_object` due to improper + exception handling. -- gh-issue-98931: Ensure custom :exc:`SyntaxError` error messages are raised - for invalid imports with multiple targets. Patch by Pablo Galindo +- gh-98931: Ensure custom :exc:`SyntaxError` error messages are raised for + invalid imports with multiple targets. Patch by Pablo Galindo -- gh-issue-105908: Fixed bug where :gh:`99111` breaks future import +- gh-105908: Fixed bug where :gh:`99111` breaks future import ``barry_as_FLUFL`` in the Python REPL. -- gh-issue-105340: Include the comprehension iteration variable in - ``locals()`` inside a module- or class-scope comprehension. +- gh-105340: Include the comprehension iteration variable in ``locals()`` + inside a module- or class-scope comprehension. -- gh-issue-105486: Change the repr of ``ParamSpec`` list of args in +- gh-105486: Change the repr of ``ParamSpec`` list of args in ``types.GenericAlias``. -- gh-issue-101006: Improve error handling when read :mod:`marshal` data. +- gh-101006: Improve error handling when read :mod:`marshal` data. Library ------- -- gh-issue-106524: Fix crash in :func:`!_sre.template` with templates - containing invalid group indices. +- gh-106524: Fix crash in :func:`!_sre.template` with templates containing + invalid group indices. -- gh-issue-106510: Improve debug output for atomic groups in regular - expressions. +- gh-106510: Improve debug output for atomic groups in regular expressions. -- gh-issue-106503: Fix ref cycle in - :class:`!asyncio._SelectorSocketTransport` by removing ``_write_ready`` in - ``close``. +- gh-106503: Fix ref cycle in :class:`!asyncio._SelectorSocketTransport` by + removing ``_write_ready`` in ``close``. -- gh-issue-105497: Fix flag mask inversion when unnamed flags exist. +- gh-105497: Fix flag mask inversion when unnamed flags exist. -- gh-issue-90876: Prevent :mod:`multiprocessing.spawn` from failing to - *import* in environments where ``sys.executable`` is ``None``. This - regressed in 3.11 with the addition of support for path-like objects in - multiprocessing. +- gh-90876: Prevent :mod:`multiprocessing.spawn` from failing to *import* in + environments where ``sys.executable`` is ``None``. This regressed in 3.11 + with the addition of support for path-like objects in multiprocessing. -- gh-issue-106292: Check for an instance-dict cached value in the - :meth:`__get__` method of :func:`functools.cached_property`. This better - matches the pre-3.12 behavior and improves compatibility for users - subclassing :func:`functools.cached_property` and adding a :meth:`__set__` - method. +- gh-106292: Check for an instance-dict cached value in the :meth:`__get__` + method of :func:`functools.cached_property`. This better matches the + pre-3.12 behavior and improves compatibility for users subclassing + :func:`functools.cached_property` and adding a :meth:`__set__` method. -- gh-issue-106330: Fix incorrect matching of empty paths in +- gh-106330: Fix incorrect matching of empty paths in :meth:`pathlib.PurePath.match`. This bug was introduced in Python 3.12.0 beta 1. -- gh-issue-102541: Make pydoc.doc catch bad module ImportError when output - stream is not None. +- gh-102541: Make pydoc.doc catch bad module ImportError when output stream + is not None. -- gh-issue-106152: Added PY_THROW event hook for :mod:`cProfile` for - generators +- gh-106152: Added PY_THROW event hook for :mod:`cProfile` for generators -- gh-issue-106075: Added ``asyncio.taskgroups.__all__`` to - ``asyncio.__all__`` for export in star imports. +- gh-106075: Added ``asyncio.taskgroups.__all__`` to ``asyncio.__all__`` for + export in star imports. -- gh-issue-105987: Fix crash due to improper reference counting in - :mod:`asyncio` eager task factory internal routines. +- gh-105987: Fix crash due to improper reference counting in :mod:`asyncio` + eager task factory internal routines. -- gh-issue-105974: Fix bug where a :class:`typing.Protocol` class that had - one or more non-callable members would raise :exc:`TypeError` when +- gh-105974: Fix bug where a :class:`typing.Protocol` class that had one or + more non-callable members would raise :exc:`TypeError` when :func:`issubclass` was called against it, even if it defined a custom ``__subclasshook__`` method. The behaviour in Python 3.11 and lower -- which has now been restored -- was not to raise :exc:`TypeError` in these situations if a custom ``__subclasshook__`` method was defined. Patch by Alex Waygood. -- gh-issue-96145: Reverted addition of ``json.AttrDict``. +- gh-96145: Reverted addition of ``json.AttrDict``. -- gh-issue-105497: Fix flag inversion when alias/mask members exist. +- gh-105497: Fix flag inversion when alias/mask members exist. -- gh-issue-104554: Add RTSPS scheme support in urllib.parse +- gh-104554: Add RTSPS scheme support in urllib.parse -- gh-issue-94777: Fix hanging :mod:`multiprocessing` ``ProcessPoolExecutor`` - when a child process crashes while data is being written in the call - queue. +- gh-94777: Fix hanging :mod:`multiprocessing` ``ProcessPoolExecutor`` when + a child process crashes while data is being written in the call queue. Documentation ------------- -- gh-issue-106232: Make timeit doc command lines compatible with Windows by - using double quotes for arguments. This works on linux and macOS also. +- gh-106232: Make timeit doc command lines compatible with Windows by using + double quotes for arguments. This works on linux and macOS also. Tests ----- -- gh-issue-101634: When running the Python test suite with ``-jN`` option, - if a worker stdout cannot be decoded from the locale encoding report a - failed testn so the exitcode is non-zero. Patch by Victor Stinner. +- gh-101634: When running the Python test suite with ``-jN`` option, if a + worker stdout cannot be decoded from the locale encoding report a failed + testn so the exitcode is non-zero. Patch by Victor Stinner. Build ----- -- gh-issue-106118: Fix compilation for platforms without :data:`!O_CLOEXEC`. - The issue was introduced with Python 3.12b1 in :gh:`103295`. Patch by - Erlend Aasland. +- gh-106118: Fix compilation for platforms without :data:`!O_CLOEXEC`. The + issue was introduced with Python 3.12b1 in :gh:`103295`. Patch by Erlend + Aasland. -- gh-issue-104692: Include ``commoninstall`` as a prerequisite for - ``bininstall`` +- gh-104692: Include ``commoninstall`` as a prerequisite for ``bininstall`` This ensures that ``commoninstall`` is completed before ``bininstall`` is started when parallel builds are used (``make -j install``), and so the @@ -2546,14 +3517,14 @@ Build Tools/Demos ----------- -- gh-issue-106359: Argument Clinic now explicitly forbids "kwarg splats" in +- gh-106359: Argument Clinic now explicitly forbids "kwarg splats" in function calls used as annotations. C API ----- -- gh-issue-105227: The new :c:func:`PyType_GetDict` provides the dictionary - for the given type object that is normally exposed by ``cls.__dict__``. +- gh-105227: The new :c:func:`PyType_GetDict` provides the dictionary for + the given type object that is normally exposed by ``cls.__dict__``. Normally it's sufficient to use :c:member:`~PyTypeObject.tp_dict`, but for the static builtin types :c:member:`!tp_dict` is now always ``NULL``. :c:func:`!PyType_GetDict()` provides the correct dict object instead. @@ -2567,53 +3538,51 @@ What's New in Python 3.12.0 beta 3? Core and Builtins ----------------- -- gh-issue-105840: Fix possible crashes when specializing function calls - with too many ``__defaults__``. +- gh-105840: Fix possible crashes when specializing function calls with too + many ``__defaults__``. -- gh-issue-105831: Fix an f-string bug, where using a debug expression (the - ``=`` sign) that appears in the last line of a file results to the debug - buffer that holds the expression text being one character too small. +- gh-105831: Fix an f-string bug, where using a debug expression (the ``=`` + sign) that appears in the last line of a file results to the debug buffer + that holds the expression text being one character too small. -- gh-issue-105800: Correctly issue :exc:`SyntaxWarning` in f-strings if - invalid sequences are used. Patch by Pablo Galindo +- gh-105800: Correctly issue :exc:`SyntaxWarning` in f-strings if invalid + sequences are used. Patch by Pablo Galindo -- gh-issue-105587: The runtime can't guarantee that immortal objects will - not be mutated by Extensions. Thus, this modifies - _PyStaticObject_CheckRefcnt to warn instead of asserting. +- gh-105587: The runtime can't guarantee that immortal objects will not be + mutated by Extensions. Thus, this modifies _PyStaticObject_CheckRefcnt to + warn instead of asserting. -- gh-issue-105564: Don't include artificil newlines in the ``line`` - attribute of tokens in the APIs of the :mod:`tokenize` module. Patch by - Pablo Galindo +- gh-105564: Don't include artificil newlines in the ``line`` attribute of + tokens in the APIs of the :mod:`tokenize` module. Patch by Pablo Galindo -- gh-issue-105549: Tokenize separately ``NUMBER`` and ``NAME`` tokens that - are not ambiguous. Patch by Pablo Galindo. +- gh-105549: Tokenize separately ``NUMBER`` and ``NAME`` tokens that are not + ambiguous. Patch by Pablo Galindo. -- gh-issue-105588: Fix an issue that could result in crashes when compiling +- gh-105588: Fix an issue that could result in crashes when compiling malformed :mod:`ast` nodes. -- gh-issue-105375: Fix bugs in the :mod:`builtins` module where exceptions - could end up being overwritten. - -- gh-issue-105375: Fix bug in the compiler where an exception could end up - being overwritten. +- gh-105375: Fix bugs in the :mod:`builtins` module where exceptions could + end up being overwritten. -- gh-issue-105375: Improve error handling in - :c:func:`PyUnicode_BuildEncodingMap` where an exception could end up being +- gh-105375: Fix bug in the compiler where an exception could end up being overwritten. -- gh-issue-105435: Fix spurious newline character if file ends on a comment +- gh-105375: Improve error handling in :c:func:`PyUnicode_BuildEncodingMap` + where an exception could end up being overwritten. + +- gh-105435: Fix spurious newline character if file ends on a comment without a newline. Patch by Pablo Galindo -- gh-issue-105390: Correctly raise :exc:`tokenize.TokenError` exceptions - instead of :exc:`SyntaxError` for tokenize errors such as incomplete - input. Patch by Pablo Galindo +- gh-105390: Correctly raise :exc:`tokenize.TokenError` exceptions instead + of :exc:`SyntaxError` for tokenize errors such as incomplete input. Patch + by Pablo Galindo -- gh-issue-104812: The "pending call" machinery now works for all - interpreters, not just the main interpreter, and runs in all threads, not - just the main thread. Some calls are still only done in the main thread, - ergo in the main interpreter. This change does not affect signal handling - nor the existing public C-API (``Py_AddPendingCall()``), which both still - only target the main thread. The new functionality is meant strictly for +- gh-104812: The "pending call" machinery now works for all interpreters, + not just the main interpreter, and runs in all threads, not just the main + thread. Some calls are still only done in the main thread, ergo in the + main interpreter. This change does not affect signal handling nor the + existing public C-API (``Py_AddPendingCall()``), which both still only + target the main thread. The new functionality is meant strictly for internal use for now, since consequences of its use are not well understood yet outside some very restricted cases. This change brings the capability in line with the intention when the state was made @@ -2622,109 +3591,105 @@ Core and Builtins Library ------- -- gh-issue-105808: Fix a regression introduced in GH-101251 for 3.12, - causing :meth:`gzip.GzipFile.flush` to not flush the compressor (nor pass - along the ``zip_mode`` argument). +- gh-105808: Fix a regression introduced in GH-101251 for 3.12, causing + :meth:`gzip.GzipFile.flush` to not flush the compressor (nor pass along + the ``zip_mode`` argument). -- gh-issue-104799: Enable :func:`ast.unparse` to unparse function and class +- gh-104799: Enable :func:`ast.unparse` to unparse function and class definitions created without the new ``type_params`` field from :pep:`695`. Patch by Jelle Zijlstra. -- gh-issue-105745: Fix ``webbrowser.Konqueror.open`` method. +- gh-105745: Fix ``webbrowser.Konqueror.open`` method. -- gh-issue-105375: Fix a bug in :c:func:`!_Unpickler_SetInputStream` where - an exception could end up being overwritten in case of failure. +- gh-105375: Fix a bug in :c:func:`!_Unpickler_SetInputStream` where an + exception could end up being overwritten in case of failure. -- gh-issue-105375: Fix bugs in :mod:`sys` where exceptions could end up - being overwritten because of deferred error handling. +- gh-105375: Fix bugs in :mod:`sys` where exceptions could end up being + overwritten because of deferred error handling. -- gh-issue-105605: Harden :mod:`pyexpat` error handling during module +- gh-105605: Harden :mod:`pyexpat` error handling during module initialisation to prevent exceptions from possibly being overwritten, and objects from being dereferenced twice. -- gh-issue-105375: Fix bug in :mod:`decimal` where an exception could end up - being overwritten. +- gh-105375: Fix bug in :mod:`decimal` where an exception could end up being + overwritten. -- gh-issue-105375: Fix bugs in :mod:`!_datetime` where exceptions could be +- gh-105375: Fix bugs in :mod:`!_datetime` where exceptions could be overwritten in case of module initialisation failure. -- gh-issue-105375: Fix bugs in :mod:`!_ssl` initialisation which could lead - to leaked references and overwritten exceptions. +- gh-105375: Fix bugs in :mod:`!_ssl` initialisation which could lead to + leaked references and overwritten exceptions. -- gh-issue-105375: Fix a bug in :class:`array.array` where an exception - could end up being overwritten. +- gh-105375: Fix a bug in :class:`array.array` where an exception could end + up being overwritten. -- gh-issue-105375: Fix bugs in :mod:`_ctypes` where exceptions could end up - being overwritten. - -- gh-issue-105375: Fix a bug in the :mod:`posix` module where an exception - could be overwritten. +- gh-105375: Fix bugs in :mod:`_ctypes` where exceptions could end up being + overwritten. -- gh-issue-105375: Fix bugs in :mod:`!_elementtree` where exceptions could +- gh-105375: Fix a bug in the :mod:`posix` module where an exception could be overwritten. -- gh-issue-105375: Fix bugs in :mod:`zoneinfo` where exceptions could be +- gh-105375: Fix bugs in :mod:`!_elementtree` where exceptions could be overwritten. -- gh-issue-105375: Fix bugs in :mod:`errno` where exceptions could be +- gh-105375: Fix bugs in :mod:`zoneinfo` where exceptions could be overwritten. -- gh-issue-105375: Fix bugs in :mod:`pickle` where exceptions could be +- gh-105375: Fix bugs in :mod:`errno` where exceptions could be overwritten. + +- gh-105375: Fix bugs in :mod:`pickle` where exceptions could be overwritten. -- gh-issue-105375: Fix a bug in :mod:`sqlite3` where an exception could be +- gh-105375: Fix a bug in :mod:`sqlite3` where an exception could be overwritten in the :meth:`collation ` callback. -- gh-issue-105332: Revert pickling method from by-name back to by-value. +- gh-105332: Revert pickling method from by-name back to by-value. -- gh-issue-104310: In the beta 1 release we added a utility function for - extension module authors, to use when testing their module for support in - multiple interpreters or under a per-interpreter GIL. The name of that - function has changed from ``allowing_all_extensions`` to +- gh-104310: In the beta 1 release we added a utility function for extension + module authors, to use when testing their module for support in multiple + interpreters or under a per-interpreter GIL. The name of that function + has changed from ``allowing_all_extensions`` to ``_incompatible_extension_module_restrictions``. The default for the "disable_check" argument has change from ``True`` to ``False``, to better match the new function name. -- gh-issue-104996: Improve performance of :class:`pathlib.PurePath` - initialisation by deferring joining of paths when multiple arguments are - given. +- gh-104996: Improve performance of :class:`pathlib.PurePath` initialisation + by deferring joining of paths when multiple arguments are given. -- gh-issue-102541: Hide traceback in :func:`help` prompt, when import - failed. +- gh-102541: Hide traceback in :func:`help` prompt, when import failed. Tests ----- -- gh-issue-105084: When the Python build is configured - ``--with-wheel-pkg-dir``, tests requiring the ``setuptools`` and ``wheel`` - wheels will search for the wheels in ``WHEEL_PKG_DIR``. +- gh-105084: When the Python build is configured ``--with-wheel-pkg-dir``, + tests requiring the ``setuptools`` and ``wheel`` wheels will search for + the wheels in ``WHEEL_PKG_DIR``. Windows ------- -- gh-issue-105436: Ensure that an empty environment block is terminated by - two null characters, as is required by Windows. +- gh-105436: Ensure that an empty environment block is terminated by two + null characters, as is required by Windows. C API ----- -- gh-issue-105375: Fix a bug in :c:func:`PyErr_WarnExplicit` where an - exception could end up being overwritten if the API failed internally. +- gh-105375: Fix a bug in :c:func:`PyErr_WarnExplicit` where an exception + could end up being overwritten if the API failed internally. -- gh-issue-105603: We've renamed the new (in 3.12) - ``PyInterpreterConfig.own_gil`` to ``PyInterpreterConfig.gil`` and changed - the meaning of the value from "bool" to an integer with supported values - of ``PyInterpreterConfig_DEFAULT_GIL``, - ``PyInterpreterConfig_SHARED_GIL``, and ``PyInterpreterConfig_OWN_GIL``. - The default is "shared". +- gh-105603: We've renamed the new (in 3.12) ``PyInterpreterConfig.own_gil`` + to ``PyInterpreterConfig.gil`` and changed the meaning of the value from + "bool" to an integer with supported values of + ``PyInterpreterConfig_DEFAULT_GIL``, ``PyInterpreterConfig_SHARED_GIL``, + and ``PyInterpreterConfig_OWN_GIL``. The default is "shared". -- gh-issue-105387: In the limited C API version 3.12, :c:func:`Py_INCREF` - and :c:func:`Py_DECREF` functions are now implemented as opaque function - calls to hide implementation details. Patch by Victor Stinner. +- gh-105387: In the limited C API version 3.12, :c:func:`Py_INCREF` and + :c:func:`Py_DECREF` functions are now implemented as opaque function calls + to hide implementation details. Patch by Victor Stinner. -- gh-issue-103968: :c:func:`PyType_FromMetaclass` now allows metaclasses - with ``tp_new`` set to ``NULL``. +- gh-103968: :c:func:`PyType_FromMetaclass` now allows metaclasses with + ``tp_new`` set to ``NULL``. What's New in Python 3.12.0 beta 2? @@ -2735,67 +3700,66 @@ What's New in Python 3.12.0 beta 2? Security -------- -- gh-issue-103142: The version of OpenSSL used in our binary builds has been +- gh-103142: The version of OpenSSL used in our binary builds has been upgraded to 1.1.1u to address several CVEs. -- gh-issue-99108: Refresh our new HACL* built-in :mod:`hashlib` code from +- gh-99108: Refresh our new HACL* built-in :mod:`hashlib` code from upstream. Built-in SHA2 should be faster and an issue with SHA3 on 32-bit platforms is fixed. Core and Builtins ----------------- -- gh-issue-105259: Don't include newline character for trailing ``NEWLINE`` - tokens emitted in the :mod:`tokenize` module. Patch by Pablo Galindo +- gh-105259: Don't include newline character for trailing ``NEWLINE`` tokens + emitted in the :mod:`tokenize` module. Patch by Pablo Galindo -- gh-issue-105324: Fix the main function of the :mod:`tokenize` module when +- gh-105324: Fix the main function of the :mod:`tokenize` module when reading from ``sys.stdin``. Patch by Pablo Galindo -- gh-issue-98963: Restore the ability for a subclass of :class:`property` to +- gh-98963: Restore the ability for a subclass of :class:`property` to define ``__slots__`` or otherwise be dict-less by ignoring failures to set a docstring on such a class. This behavior had regressed in 3.12beta1. An :exc:`AttributeError` where there had not previously been one was disruptive to existing code. -- gh-issue-105194: Do not escape with backslashes f-string format - specifiers. Patch by Pablo Galindo +- gh-105194: Do not escape with backslashes f-string format specifiers. + Patch by Pablo Galindo -- gh-issue-105162: Fixed bug in generator.close()/throw() where an inner - iterator would be ignored when the outer iterator was instrumented. +- gh-105162: Fixed bug in generator.close()/throw() where an inner iterator + would be ignored when the outer iterator was instrumented. -- gh-issue-105164: Ensure annotations are set up correctly if the only - annotation in a block is within a :keyword:`match` block. Patch by Jelle - Zijlstra. +- gh-105164: Ensure annotations are set up correctly if the only annotation + in a block is within a :keyword:`match` block. Patch by Jelle Zijlstra. -- gh-issue-104799: Attributes of :mod:`ast` nodes that are lists now default - to the empty list if omitted. This means that some code that previously +- gh-104799: Attributes of :mod:`ast` nodes that are lists now default to + the empty list if omitted. This means that some code that previously raised :exc:`TypeError` when the AST node was used will now proceed with the empty list instead. Patch by Jelle Zijlstra. -- gh-issue-105035: Fix :func:`super` calls on types with custom +- gh-105035: Fix :func:`super` calls on types with custom :attr:`tp_getattro` implementation (e.g. meta-types.) -- gh-issue-105017: Show CRLF lines in the tokenize string attribute in both - NL and NEWLINE tokens. Patch by Marta Gómez. +- gh-105017: Show CRLF lines in the tokenize string attribute in both NL and + NEWLINE tokens. Patch by Marta Gómez. -- gh-issue-105013: Fix handling of multiline parenthesized lambdas in +- gh-105013: Fix handling of multiline parenthesized lambdas in :func:`inspect.getsource`. Patch by Pablo Galindo -- gh-issue-105017: Do not include an additional final ``NL`` token when - parsing files having CRLF lines. Patch by Marta Gómez. +- gh-105017: Do not include an additional final ``NL`` token when parsing + files having CRLF lines. Patch by Marta Gómez. -- gh-issue-104976: Ensure that trailing ``DEDENT`` - :class:`tokenize.TokenInfo` objects emitted by the :mod:`tokenize` module - are reported as in Python 3.11. Patch by Pablo Galindo +- gh-104976: Ensure that trailing ``DEDENT`` :class:`tokenize.TokenInfo` + objects emitted by the :mod:`tokenize` module are reported as in Python + 3.11. Patch by Pablo Galindo -- gh-issue-104972: Ensure that the ``line`` attribute in +- gh-104972: Ensure that the ``line`` attribute in :class:`tokenize.TokenInfo` objects in the :mod:`tokenize` module are always correct. Patch by Pablo Galindo -- gh-issue-104955: Fix signature for the new - :meth:`~object.__release_buffer__` slot. Patch by Jelle Zijlstra. +- gh-104955: Fix signature for the new :meth:`~object.__release_buffer__` + slot. Patch by Jelle Zijlstra. -- gh-issue-104690: Starting new threads and process creation through +- gh-104690: Starting new threads and process creation through :func:`os.fork` during interpreter shutdown (such as from :mod:`atexit` handlers) is no longer supported. It can lead to race condition between the main Python runtime thread freeing thread states while internal @@ -2803,152 +3767,150 @@ Core and Builtins created threads. Or forked children trying to use the mid-shutdown runtime and thread state in the child process. -- gh-issue-104879: Fix crash when accessing the ``__module__`` attribute of - type aliases defined outside a module. Patch by Jelle Zijlstra. +- gh-104879: Fix crash when accessing the ``__module__`` attribute of type + aliases defined outside a module. Patch by Jelle Zijlstra. -- gh-issue-104825: Tokens emitted by the :mod:`tokenize` module do not - include an implicit ``\n`` character in the ``line`` attribute anymore. - Patch by Pablo Galindo +- gh-104825: Tokens emitted by the :mod:`tokenize` module do not include an + implicit ``\n`` character in the ``line`` attribute anymore. Patch by + Pablo Galindo Library ------- -- gh-issue-105280: Fix bug where ``isinstance([], collections.abc.Mapping)`` - could evaluate to ``True`` if garbage collection happened at the wrong - time. The bug was caused by changes to the implementation of +- gh-105280: Fix bug where ``isinstance([], collections.abc.Mapping)`` could + evaluate to ``True`` if garbage collection happened at the wrong time. The + bug was caused by changes to the implementation of :class:`typing.Protocol` in Python 3.12. -- gh-issue-105239: Fix longstanding bug where ``issubclass(object, +- gh-105239: Fix longstanding bug where ``issubclass(object, typing.Protocol)`` would evaluate to ``True`` in some edge cases. Patch by Alex Waygood. -- gh-issue-105080: Fixed inconsistent signature on derived classes for +- gh-105080: Fixed inconsistent signature on derived classes for :func:`inspect.signature` -- gh-issue-105144: Fix a recent regression in the :mod:`typing` module. The +- gh-105144: Fix a recent regression in the :mod:`typing` module. The regression meant that doing ``class Foo(X, typing.Protocol)``, where ``X`` was a class that had :class:`abc.ABCMeta` as its metaclass, would then cause subsequent ``isinstance(1, X)`` calls to erroneously raise :exc:`TypeError`. Patch by Alex Waygood. -- gh-issue-105113: Improve performance of :meth:`pathlib.PurePath.match` by +- gh-105113: Improve performance of :meth:`pathlib.PurePath.match` by compiling an :class:`re.Pattern` object for the entire pattern. -- gh-issue-101588: Deprecate undocumented copy/deepcopy/pickle support for +- gh-101588: Deprecate undocumented copy/deepcopy/pickle support for itertools. -- gh-issue-103631: Fix - ``pathlib.PurePosixPath(pathlib.PureWindowsPath(...))`` not converting - path separators to restore 3.11 compatible behavior. +- gh-103631: Fix ``pathlib.PurePosixPath(pathlib.PureWindowsPath(...))`` not + converting path separators to restore 3.11 compatible behavior. -- gh-issue-104947: Make comparisons between :class:`pathlib.PureWindowsPath` +- gh-104947: Make comparisons between :class:`pathlib.PureWindowsPath` objects consistent across Windows and Posix to match 3.11 behavior. -- gh-issue-104935: Fix bugs with the interaction between +- gh-104935: Fix bugs with the interaction between :func:`typing.runtime_checkable` and :class:`typing.Generic` that were introduced by the :pep:`695` implementation. Patch by Jelle Zijlstra. -- gh-issue-104874: Document the ``__name__`` and ``__supertype__`` - attributes of :class:`typing.NewType`. Patch by Jelle Zijlstra. +- gh-104874: Document the ``__name__`` and ``__supertype__`` attributes of + :class:`typing.NewType`. Patch by Jelle Zijlstra. -- gh-issue-104799: Adjust the location of the (see :pep:`695`) - ``type_params`` field on :class:`ast.ClassDef`, - :class:`ast.AsyncFunctionDef`, and :class:`ast.FunctionDef` to better - preserve backward compatibility. Patch by Jelle Zijlstra +- gh-104799: Adjust the location of the (see :pep:`695`) ``type_params`` + field on :class:`ast.ClassDef`, :class:`ast.AsyncFunctionDef`, and + :class:`ast.FunctionDef` to better preserve backward compatibility. Patch + by Jelle Zijlstra -- gh-issue-104797: Allow :class:`typing.Protocol` classes to inherit from +- gh-104797: Allow :class:`typing.Protocol` classes to inherit from :class:`collections.abc.Buffer`. Patch by Jelle Zijlstra. -- gh-issue-104372: On Linux where :mod:`subprocess` can use the ``vfork()`` +- gh-104372: On Linux where :mod:`subprocess` can use the ``vfork()`` syscall for faster spawning, prevent the parent process from blocking other threads by dropping the GIL while it waits for the vfork'ed child process ``exec()`` outcome. This prevents spawning a binary from a slow filesystem from blocking the rest of the application. -- gh-issue-99108: We now release the GIL around built-in :mod:`hashlib` +- gh-99108: We now release the GIL around built-in :mod:`hashlib` computations of reasonable size for the SHA families and MD5 hash functions, matching what our OpenSSL backed hash computations already does. -- gh-issue-104399: Prepare the ``_tkinter`` module for building with Tcl 9.0 - and future libtommath by replacing usage of deprecated functions +- gh-104399: Prepare the ``_tkinter`` module for building with Tcl 9.0 and + future libtommath by replacing usage of deprecated functions :c:func:`mp_to_unsigned_bin_n` and :c:func:`mp_unsigned_bin_size` when necessary. -- gh-issue-102024: Reduce calls of ``_idle_semaphore.release()`` in +- gh-102024: Reduce calls of ``_idle_semaphore.release()`` in :func:`concurrent.futures.thread._worker`. Documentation ------------- -- gh-issue-89455: Add missing documentation for the ``max_group_depth`` and +- gh-89455: Add missing documentation for the ``max_group_depth`` and ``max_group_width`` parameters and the ``exceptions`` attribute of the :class:`traceback.TracebackException` class. -- gh-issue-89412: Add missing documentation for the ``end_lineno`` and +- gh-89412: Add missing documentation for the ``end_lineno`` and ``end_offset`` attributes of the :class:`traceback.TracebackException` class. -- gh-issue-104943: Remove mentions of old Python versions in +- gh-104943: Remove mentions of old Python versions in :class:`typing.NamedTuple`. Build ----- -- gh-issue-90005: Fix a regression in :file:`configure` where we could end - up unintentionally linking with ``libbsd``. +- gh-90005: Fix a regression in :file:`configure` where we could end up + unintentionally linking with ``libbsd``. -- gh-issue-89886: Autoconf 2.71 and aclocal 1.16.4 is now required to - regenerate :file:`!configure`. +- gh-89886: Autoconf 2.71 and aclocal 1.16.4 is now required to regenerate + :file:`!configure`. Windows ------- -- gh-issue-105146: Updated the links at the end of the installer to point to +- gh-105146: Updated the links at the end of the installer to point to Discourse rather than the mailing lists. -- gh-issue-103646: When installed from the Microsoft Store, ``pip`` no - longer defaults to per-user installs. However, as the install directory is +- gh-103646: When installed from the Microsoft Store, ``pip`` no longer + defaults to per-user installs. However, as the install directory is unwritable, it should automatically decide to do a per-user install anyway. This should resolve issues when ``pip`` is passed an option that conflicts with ``--user``. -- gh-issue-88745: Improve performance of :func:`shutil.copy2` by using the +- gh-88745: Improve performance of :func:`shutil.copy2` by using the operating system's ``CopyFile2`` function. This may result in subtle changes to metadata copied along with some files, bringing them in line with normal OS behavior. -- gh-issue-104820: Fixes :func:`~os.stat` and related functions on file - systems that do not support file ID requests. This includes FAT32 and - exFAT. +- gh-104820: Fixes :func:`~os.stat` and related functions on file systems + that do not support file ID requests. This includes FAT32 and exFAT. -- gh-issue-104803: Add :func:`os.path.isdevdrive` to detect whether a path - is on a Windows Dev Drive. Returns ``False`` on platforms that do not - support Dev Drive, and is absent on non-Windows platforms. +- gh-104803: Add :func:`os.path.isdevdrive` to detect whether a path is on a + Windows Dev Drive. Returns ``False`` on platforms that do not support Dev + Drive, and is absent on non-Windows platforms. macOS ----- -- gh-issue-103142: Update macOS installer to use OpenSSL 1.1.1u. +- gh-103142: Update macOS installer to use OpenSSL 1.1.1u. IDLE ---- -- gh-issue-104719: Remove IDLE's modification of tokenize.tabsize and test - other uses of tokenize data and methods. +- gh-104719: Remove IDLE's modification of tokenize.tabsize and test other + uses of tokenize data and methods. C API ----- -- gh-issue-105115: ``PyTypeObject.tp_bases`` (and ``tp_mro``) for builtin - static types are now shared by all interpreters, whereas in 3.12-beta1 - they were stored on ``PyInterpreterState``. Also note that now the tuples - are immortal objects. +- gh-105115: ``PyTypeObject.tp_bases`` (and ``tp_mro``) for builtin static + types are now shared by all interpreters, whereas in 3.12-beta1 they were + stored on ``PyInterpreterState``. Also note that now the tuples are + immortal objects. -- gh-issue-105071: Add ``PyUnstable_Exc_PrepReraiseStar`` to the unstable C - api to expose the implementation of :keyword:`except* `. +- gh-105071: Add ``PyUnstable_Exc_PrepReraiseStar`` to the unstable C api to + expose the implementation of :keyword:`except* `. -- gh-issue-104668: Don't call :c:var:`PyOS_InputHook` or +- gh-104668: Don't call :c:var:`PyOS_InputHook` or :c:var:`PyOS_ReadlineFunctionPointer` in subinterpreters, since it's generally difficult to avoid using global state in their registered callbacks. This also avoids situations where extensions may find @@ -2964,125 +3926,122 @@ What's New in Python 3.12.0 beta 1? Security -------- -- gh-issue-99889: Fixed a security in flaw in :func:`uu.decode` that could - allow for directory traversal based on the input if no ``out_file`` was +- gh-99889: Fixed a security in flaw in :func:`uu.decode` that could allow + for directory traversal based on the input if no ``out_file`` was specified. -- gh-issue-104049: Do not expose the local on-disk location in directory - indexes produced by :class:`http.client.SimpleHTTPRequestHandler`. +- gh-104049: Do not expose the local on-disk location in directory indexes + produced by :class:`http.client.SimpleHTTPRequestHandler`. -- gh-issue-99108: Upgrade built-in :mod:`hashlib` SHA3 implementation to a +- gh-99108: Upgrade built-in :mod:`hashlib` SHA3 implementation to a verified implementation from the ``HACL*`` project. Used when OpenSSL is not present or lacks SHA3. -- gh-issue-102153: :func:`urllib.parse.urlsplit` now strips leading C0 - control and space characters following the specification for URLs defined - by WHATWG in response to :cve:`2023-24329`. Patch by Illia Volochii. +- gh-102153: :func:`urllib.parse.urlsplit` now strips leading C0 control and + space characters following the specification for URLs defined by WHATWG in + response to :cve:`2023-24329`. Patch by Illia Volochii. Core and Builtins ----------------- -- gh-issue-102856: Implement PEP 701 changes in the :mod:`tokenize` module. - Patch by Marta Gómez Macías and Pablo Galindo Salgado +- gh-102856: Implement PEP 701 changes in the :mod:`tokenize` module. Patch + by Marta Gómez Macías and Pablo Galindo Salgado -- gh-issue-104615: Fix wrong ordering of assignments in code like ``a, a = - x, y``. Contributed by Carl Meyer. +- gh-104615: Fix wrong ordering of assignments in code like ``a, a = x, y``. + Contributed by Carl Meyer. -- gh-issue-104572: Improve syntax error message for invalid constructs in +- gh-104572: Improve syntax error message for invalid constructs in :pep:`695` contexts and in annotations when ``from __future__ import annotations`` is active. -- gh-issue-104482: Fix three error handling bugs in ast.c's validation of - pattern matching statements. +- gh-104482: Fix three error handling bugs in ast.c's validation of pattern + matching statements. -- gh-issue-102818: Do not add a frame to the traceback in the - ``sys.setprofile`` and ``sys.settrace`` trampoline functions. This ensures - that frames are not duplicated if an exception is raised in the callback - function, and ensures that frames are not omitted if a C callback is used - and that does not add the frame. +- gh-102818: Do not add a frame to the traceback in the ``sys.setprofile`` + and ``sys.settrace`` trampoline functions. This ensures that frames are + not duplicated if an exception is raised in the callback function, and + ensures that frames are not omitted if a C callback is used and that does + not add the frame. -- gh-issue-104405: Fix an issue where some :term:`bytecode` instructions - could ignore :pep:`523` when "inlining" calls. +- gh-104405: Fix an issue where some :term:`bytecode` instructions could + ignore :pep:`523` when "inlining" calls. -- gh-issue-103082: Change behavior of ``sys.monitoring.events.LINE`` events - in ``sys.monitoring``: Line events now occur when a new line is reached +- gh-103082: Change behavior of ``sys.monitoring.events.LINE`` events in + ``sys.monitoring``: Line events now occur when a new line is reached dynamically, instead of using a static approximation, as before. This makes the behavior very similar to that of "line" events in ``sys.settrace``. This should ease porting of tools from 3.11 to 3.12. -- gh-issue-104263: Fix ``float("nan")`` to produce a quiet NaN on platforms - (like MIPS) where the meaning of the signalling / quiet bit is inverted - from its usual meaning. Also introduce a new macro ``Py_INFINITY`` - matching C99's ``INFINITY``, and refactor internals to rely on C99's - ``NAN`` and ``INFINITY`` macros instead of hard-coding bit patterns for - infinities and NaNs. Thanks Sebastian Berg. - -- gh-issue-99113: Multi-phase init extension modules may now indicate that - they support running in subinterpreters that have their own GIL. This is - done by using ``Py_MOD_PER_INTERPRETER_GIL_SUPPORTED`` as the value for - the ``Py_mod_multiple_interpreters`` module def slot. Otherwise the - module, by default, cannot be imported in such subinterpreters. (This - does not affect the main interpreter or subinterpreters that do not have - their own GIL.) In addition to the isolation that multi-phase init - already normally requires, support for per-interpreter GIL involves one - additional constraint: thread-safety. If the module has external (linked) +- gh-104263: Fix ``float("nan")`` to produce a quiet NaN on platforms (like + MIPS) where the meaning of the signalling / quiet bit is inverted from its + usual meaning. Also introduce a new macro ``Py_INFINITY`` matching C99's + ``INFINITY``, and refactor internals to rely on C99's ``NAN`` and + ``INFINITY`` macros instead of hard-coding bit patterns for infinities and + NaNs. Thanks Sebastian Berg. + +- gh-99113: Multi-phase init extension modules may now indicate that they + support running in subinterpreters that have their own GIL. This is done + by using ``Py_MOD_PER_INTERPRETER_GIL_SUPPORTED`` as the value for the + ``Py_mod_multiple_interpreters`` module def slot. Otherwise the module, + by default, cannot be imported in such subinterpreters. (This does not + affect the main interpreter or subinterpreters that do not have their own + GIL.) In addition to the isolation that multi-phase init already normally + requires, support for per-interpreter GIL involves one additional + constraint: thread-safety. If the module has external (linked) dependencies and those libraries have any state that isn't thread-safe then the module must do the additional work to add thread-safety. This should be an uncommon case. -- gh-issue-99113: The GIL is now (optionally) per-interpreter. This is the +- gh-99113: The GIL is now (optionally) per-interpreter. This is the fundamental change for PEP 684. This is all made possible by virtue of the isolated state of each interpreter in the process. The behavior of the main interpreter remains unchanged. Likewise, interpreters created using ``Py_NewInterpreter()`` are not affected. To get an interpreter with its own GIL, call ``Py_NewInterpreterFromConfig()``. -- gh-issue-104108: Multi-phase init extension modules may now indicate - whether or not they actually support multiple interpreters. By default - such modules are expected to support use in multiple interpreters. In the - uncommon case that one does not, it may use the new +- gh-104108: Multi-phase init extension modules may now indicate whether or + not they actually support multiple interpreters. By default such modules + are expected to support use in multiple interpreters. In the uncommon + case that one does not, it may use the new ``Py_mod_multiple_interpreters`` module def slot. A value of ``0`` means the module does not support them. ``1`` means it does. The default is ``1``. -- gh-issue-104142: Fix an issue where :class:`list` or :class:`tuple` - repetition could fail to respect :pep:`683`. +- gh-104142: Fix an issue where :class:`list` or :class:`tuple` repetition + could fail to respect :pep:`683`. -- gh-issue-104078: Improve the performance of - :c:func:`PyObject_HasAttrString` +- gh-104078: Improve the performance of :c:func:`PyObject_HasAttrString` -- gh-issue-104066: Improve the performance of :func:`hasattr` for module - objects with a missing attribute. +- gh-104066: Improve the performance of :func:`hasattr` for module objects + with a missing attribute. -- gh-issue-104028: Reduce object creation while calling callback function - from gc. Patch by Donghee Na. +- gh-104028: Reduce object creation while calling callback function from gc. + Patch by Donghee Na. -- gh-issue-104018: Disallow the "z" format specifier in %-format of bytes - objects. +- gh-104018: Disallow the "z" format specifier in %-format of bytes objects. -- gh-issue-102213: Fix performance loss when accessing an object's - attributes with ``__getattr__`` defined. +- gh-102213: Fix performance loss when accessing an object's attributes with + ``__getattr__`` defined. -- gh-issue-103895: Improve handling of edge cases in showing +- gh-103895: Improve handling of edge cases in showing ``Exception.__notes__``. Ensures that the messages always end with a newline and that string/bytes are not exploded over multiple lines. Patch by Carey Metcalfe. -- gh-issue-103907: Don't modify the refcounts of known immortal objects +- gh-103907: Don't modify the refcounts of known immortal objects (:const:`True`, :const:`False`, and :const:`None`) in the main interpreter loop. -- gh-issue-103899: Provide a helpful hint in the :exc:`TypeError` message - when accidentally calling a :term:`module` object that has a callable - attribute of the same name (such as :func:`dis.dis` or - :class:`datetime.datetime`). +- gh-103899: Provide a helpful hint in the :exc:`TypeError` message when + accidentally calling a :term:`module` object that has a callable attribute + of the same name (such as :func:`dis.dis` or :class:`datetime.datetime`). -- gh-issue-103845: Remove both line and instruction instrumentation before - adding new ones for monitoring, to avoid newly added instrumentation being +- gh-103845: Remove both line and instruction instrumentation before adding + new ones for monitoring, to avoid newly added instrumentation being removed immediately. -- gh-issue-103763: Implement :pep:`695`, adding syntactic support for - generic classes, generic functions, and type aliases. +- gh-103763: Implement :pep:`695`, adding syntactic support for generic + classes, generic functions, and type aliases. A new ``type X = ...`` syntax is added for type aliases, which resolves at runtime to an instance of the new class ``typing.TypeAliasType``. The @@ -3105,91 +4064,90 @@ Core and Builtins Patch by Eric Traut, Larry Hastings, and Jelle Zijlstra. -- gh-issue-103801: Adds three minor linting fixes to the wasm module caught - that were caught by ruff. +- gh-103801: Adds three minor linting fixes to the wasm module caught that + were caught by ruff. -- gh-issue-103793: Optimized asyncio Task creation by deferring expensive - string formatting (task name generation) from Task creation to the first - time ``get_name`` is called. This makes asyncio benchmarks up to 5% - faster. +- gh-103793: Optimized asyncio Task creation by deferring expensive string + formatting (task name generation) from Task creation to the first time + ``get_name`` is called. This makes asyncio benchmarks up to 5% faster. -- gh-issue-102310: Change the error range for invalid bytes literals. +- gh-102310: Change the error range for invalid bytes literals. -- gh-issue-103590: Do not wrap a single exception raised from a - ``try-except*`` construct in an :exc:`ExceptionGroup`. +- gh-103590: Do not wrap a single exception raised from a ``try-except*`` + construct in an :exc:`ExceptionGroup`. -- gh-issue-103650: Change the perf map format to remove the '0x' prefix from - the addresses +- gh-103650: Change the perf map format to remove the '0x' prefix from the + addresses -- gh-issue-102856: Implement the required C tokenizer changes for PEP 701. - Patch by Pablo Galindo Salgado, Lysandros Nikolaou, Batuhan Taskaya, Marta - Gómez Macías and sunmy2019. +- gh-102856: Implement the required C tokenizer changes for PEP 701. Patch + by Pablo Galindo Salgado, Lysandros Nikolaou, Batuhan Taskaya, Marta Gómez + Macías and sunmy2019. -- gh-issue-100530: Clarify the error message raised when the called part of - a class pattern isn't actually a class. +- gh-100530: Clarify the error message raised when the called part of a + class pattern isn't actually a class. -- gh-issue-101517: Fix bug in line numbers of instructions emitted for +- gh-101517: Fix bug in line numbers of instructions emitted for :keyword:`except* `. -- gh-issue-103492: Clarify :exc:`SyntaxWarning` with literal ``is`` - comparison by specifying which literal is problematic, since comparisons - using ``is`` with e.g. ``None`` and bool literals are idiomatic. +- gh-103492: Clarify :exc:`SyntaxWarning` with literal ``is`` comparison by + specifying which literal is problematic, since comparisons using ``is`` + with e.g. ``None`` and bool literals are idiomatic. -- gh-issue-87729: Add :opcode:`LOAD_SUPER_ATTR` (and a specialization for +- gh-87729: Add :opcode:`LOAD_SUPER_ATTR` (and a specialization for ``super().method()``) to speed up ``super().method()`` and ``super().attr``. This makes ``super().method()`` roughly 2.3x faster and brings it within 20% of the performance of a simple method call. Patch by Vladimir Matveev and Carl Meyer. -- gh-issue-103488: Change the internal offset distinguishing yield and - return target addresses, so that the instruction pointer is correct for - exception handling and other stack unwinding. +- gh-103488: Change the internal offset distinguishing yield and return + target addresses, so that the instruction pointer is correct for exception + handling and other stack unwinding. -- gh-issue-82012: The bitwise inversion operator (``~``) on bool is - deprecated. It returns the bitwise inversion of the underlying ``int`` - representation such that ``bool(~True) == True``, which can be confusing. - Use ``not`` for logical negation of bools. In the rare case that you - really need the bitwise inversion of the underlying ``int``, convert to - int explicitly ``~int(x)``. +- gh-82012: The bitwise inversion operator (``~``) on bool is deprecated. It + returns the bitwise inversion of the underlying ``int`` representation + such that ``bool(~True) == True``, which can be confusing. Use ``not`` for + logical negation of bools. In the rare case that you really need the + bitwise inversion of the underlying ``int``, convert to int explicitly + ``~int(x)``. -- gh-issue-77757: Exceptions raised in a typeobject's ``__set_name__`` - method are no longer wrapped by a :exc:`RuntimeError`. Context information - is added to the exception as a :pep:`678` note. +- gh-77757: Exceptions raised in a typeobject's ``__set_name__`` method are + no longer wrapped by a :exc:`RuntimeError`. Context information is added + to the exception as a :pep:`678` note. -- gh-issue-103333: :exc:`AttributeError` now retains the ``name`` attribute - when pickled and unpickled. +- gh-103333: :exc:`AttributeError` now retains the ``name`` attribute when + pickled and unpickled. -- gh-issue-103242: Migrate :meth:`~ssl.SSLContext.set_ecdh_curve` method not - to use deprecated OpenSSL APIs. Patch by Donghee Na. +- gh-103242: Migrate :meth:`~ssl.SSLContext.set_ecdh_curve` method not to + use deprecated OpenSSL APIs. Patch by Donghee Na. -- gh-issue-103323: We've replaced our use of ``_PyRuntime.tstate_current`` - with a thread-local variable. This is a fairly low-level implementation - detail, and there should be no change in behavior. +- gh-103323: We've replaced our use of ``_PyRuntime.tstate_current`` with a + thread-local variable. This is a fairly low-level implementation detail, + and there should be no change in behavior. -- gh-issue-84436: The implementation of PEP-683 which adds Immortal Objects - by using a fixed reference count that skips reference counting to make +- gh-84436: The implementation of PEP-683 which adds Immortal Objects by + using a fixed reference count that skips reference counting to make objects truly immutable. -- gh-issue-102700: Allow built-in modules to be submodules. This allows - submodules to be statically linked into a CPython binary. +- gh-102700: Allow built-in modules to be submodules. This allows submodules + to be statically linked into a CPython binary. -- gh-issue-103082: Implement :pep:`669` Low Impact Monitoring for CPython. +- gh-103082: Implement :pep:`669` Low Impact Monitoring for CPython. -- gh-issue-88691: Reduce the number of inline :opcode:`CACHE` entries for +- gh-88691: Reduce the number of inline :opcode:`CACHE` entries for :opcode:`CALL`. -- gh-issue-102500: Make the buffer protocol accessible in Python code using - the new ``__buffer__`` and ``__release_buffer__`` magic methods. See +- gh-102500: Make the buffer protocol accessible in Python code using the + new ``__buffer__`` and ``__release_buffer__`` magic methods. See :pep:`688` for details. Patch by Jelle Zijlstra. -- gh-issue-97933: :pep:`709`: inline list, dict and set comprehensions to - improve performance and reduce bytecode size. +- gh-97933: :pep:`709`: inline list, dict and set comprehensions to improve + performance and reduce bytecode size. -- gh-issue-99184: Bypass instance attribute access of ``__name__`` in - ``repr`` of :class:`weakref.ref`. +- gh-99184: Bypass instance attribute access of ``__name__`` in ``repr`` of + :class:`weakref.ref`. -- gh-issue-98003: Complex function calls are now faster and consume no C - stack space. +- gh-98003: Complex function calls are now faster and consume no C stack + space. - bpo-39610: ``len()`` for 0-dimensional :class:`memoryview` objects (such as ``memoryview(ctypes.c_uint8(42))``) now raises a :exc:`TypeError`. @@ -3202,18 +4160,18 @@ Core and Builtins Library ------- -- gh-issue-104600: :func:`functools.update_wrapper` now sets the +- gh-104600: :func:`functools.update_wrapper` now sets the ``__type_params__`` attribute (added by :pep:`695`). -- gh-issue-104340: When an ``asyncio`` pipe protocol loses its connection - due to an error, and the caller doesn't await ``wait_closed()`` on the +- gh-104340: When an ``asyncio`` pipe protocol loses its connection due to + an error, and the caller doesn't await ``wait_closed()`` on the corresponding ``StreamWriter``, don't log a warning about an exception that was never retrieved. After all, according to the ``StreamWriter.close()`` docs, the ``wait_closed()`` call is optional ("not mandatory"). -- gh-issue-104555: Fix issue where an :func:`issubclass` check comparing a - class ``X`` against a :func:`runtime-checkable protocol +- gh-104555: Fix issue where an :func:`issubclass` check comparing a class + ``X`` against a :func:`runtime-checkable protocol ` ``Y`` with non-callable members would not cause :exc:`TypeError` to be raised if an :func:`isinstance` call had previously been made comparing an instance of ``X`` to ``Y``. This issue @@ -3221,198 +4179,196 @@ Library 3.12 due to some unrelated changes that were made to runtime-checkable protocols. Patch by Alex Waygood. -- gh-issue-104372: Refactored the ``_posixsubprocess`` internals to avoid - Python C API usage between fork and exec when marking ``pass_fds=`` file +- gh-104372: Refactored the ``_posixsubprocess`` internals to avoid Python C + API usage between fork and exec when marking ``pass_fds=`` file descriptors inheritable. -- gh-issue-104484: Added *case_sensitive* argument to +- gh-104484: Added *case_sensitive* argument to :meth:`pathlib.PurePath.match` -- gh-issue-75367: Fix data descriptor detection in +- gh-75367: Fix data descriptor detection in :func:`inspect.getattr_static`. -- gh-issue-104536: Fix a race condition in the internal +- gh-104536: Fix a race condition in the internal :mod:`multiprocessing.process` cleanup logic that could manifest as an unintended ``AttributeError`` when calling ``process.close()``. -- gh-issue-103857: Update datetime deprecations' stracktrace to point to the +- gh-103857: Update datetime deprecations' stracktrace to point to the calling line -- gh-issue-101520: Move the core functionality of the ``tracemalloc`` module - in the ``Python/`` folder, leaving just the module wrapper in - ``Modules/``. +- gh-101520: Move the core functionality of the ``tracemalloc`` module in + the ``Python/`` folder, leaving just the module wrapper in ``Modules/``. -- gh-issue-104392: Remove undocumented and unused ``_paramspec_tvars`` - attribute from some classes in :mod:`typing`. +- gh-104392: Remove undocumented and unused ``_paramspec_tvars`` attribute + from some classes in :mod:`typing`. -- gh-issue-102613: Fix issue where :meth:`pathlib.Path.glob` raised +- gh-102613: Fix issue where :meth:`pathlib.Path.glob` raised :exc:`RecursionError` when walking deep directory trees. -- gh-issue-103000: Improve performance of :func:`dataclasses.asdict` for the +- gh-103000: Improve performance of :func:`dataclasses.asdict` for the common case where *dict_factory* is ``dict``. Patch by David C Ellis. -- gh-issue-104301: Allow leading whitespace in disambiguated statements in +- gh-104301: Allow leading whitespace in disambiguated statements in :mod:`pdb`. -- gh-issue-104139: Teach :func:`urllib.parse.unsplit` to retain the ``"//"`` - when assembling ``itms-services://?action=generate-bugs`` style `Apple - Platform Deployment +- gh-104139: Teach :func:`urllib.parse.unsplit` to retain the ``"//"`` when + assembling ``itms-services://?action=generate-bugs`` style `Apple Platform + Deployment `_ URLs. -- gh-issue-104307: :func:`socket.getnameinfo` now releases the GIL while +- gh-104307: :func:`socket.getnameinfo` now releases the GIL while contacting the DNS server -- gh-issue-104310: Users may now use - ``importlib.util.allowing_all_extensions()`` (a context manager) to - temporarily disable the strict compatibility checks for importing - extension modules in subinterpreters. +- gh-104310: Users may now use ``importlib.util.allowing_all_extensions()`` + (a context manager) to temporarily disable the strict compatibility checks + for importing extension modules in subinterpreters. -- gh-issue-87695: Fix issue where :meth:`pathlib.Path.glob` raised - :exc:`OSError` when it encountered a symlink to an overly long path. +- gh-87695: Fix issue where :meth:`pathlib.Path.glob` raised :exc:`OSError` + when it encountered a symlink to an overly long path. -- gh-issue-104265: Prevent possible crash by disallowing instantiation of - the :class:`!_csv.Reader` and :class:`!_csv.Writer` types. The regression - was introduced in 3.10.0a4 with PR 23224 (:issue:`14935`). Patch by - Radislav Chugunov. +- gh-104265: Prevent possible crash by disallowing instantiation of the + :class:`!_csv.Reader` and :class:`!_csv.Writer` types. The regression was + introduced in 3.10.0a4 with PR 23224 (:issue:`14935`). Patch by Radislav + Chugunov. -- gh-issue-102613: Improve performance of :meth:`pathlib.Path.glob` when - expanding recursive wildcards ("``**``") by merging adjacent wildcards and +- gh-102613: Improve performance of :meth:`pathlib.Path.glob` when expanding + recursive wildcards ("``**``") by merging adjacent wildcards and de-duplicating results only when necessary. -- gh-issue-65772: Remove unneeded comments and code in turtle.py. +- gh-65772: Remove unneeded comments and code in turtle.py. -- gh-issue-90208: Fixed issue where :meth:`pathlib.Path.glob` returned - incomplete results when it encountered a :exc:`PermissionError`. This - method now suppresses all :exc:`OSError` exceptions, except those raised - from calling :meth:`~pathlib.Path.is_dir` on the top-level path. +- gh-90208: Fixed issue where :meth:`pathlib.Path.glob` returned incomplete + results when it encountered a :exc:`PermissionError`. This method now + suppresses all :exc:`OSError` exceptions, except those raised from calling + :meth:`~pathlib.Path.is_dir` on the top-level path. -- gh-issue-104144: Optimize :class:`asyncio.TaskGroup` when using +- gh-104144: Optimize :class:`asyncio.TaskGroup` when using :func:`asyncio.eager_task_factory`. Skip scheduling a done callback if a TaskGroup task completes eagerly. -- gh-issue-104144: Optimize :func:`asyncio.gather` when using +- gh-104144: Optimize :func:`asyncio.gather` when using :func:`asyncio.eager_task_factory` to complete eagerly if all fututres completed eagerly. Avoid scheduling done callbacks for futures that complete eagerly. -- gh-issue-104114: Fix issue where :meth:`pathlib.Path.glob` returns paths - using the case of non-wildcard segments for corresponding path segments, - rather than the real filesystem case. +- gh-104114: Fix issue where :meth:`pathlib.Path.glob` returns paths using + the case of non-wildcard segments for corresponding path segments, rather + than the real filesystem case. -- gh-issue-104104: Improve performance of :meth:`pathlib.Path.glob` by using +- gh-104104: Improve performance of :meth:`pathlib.Path.glob` by using :const:`re.IGNORECASE` to implement case-insensitive matching. -- gh-issue-104102: Improve performance of :meth:`pathlib.Path.glob` when +- gh-104102: Improve performance of :meth:`pathlib.Path.glob` when evaluating patterns that contain ``'../'`` segments. -- gh-issue-103822: Update the return type of ``weekday`` to the newly added - Day attribute +- gh-103822: Update the return type of ``weekday`` to the newly added Day + attribute -- gh-issue-103629: Update the ``repr`` of :class:`typing.Unpack` according - to :pep:`692`. +- gh-103629: Update the ``repr`` of :class:`typing.Unpack` according to + :pep:`692`. -- gh-issue-103963: Make :mod:`dis` display the names of the args for +- gh-103963: Make :mod:`dis` display the names of the args for :opcode:`!CALL_INTRINSIC_*`. -- gh-issue-104035: Do not ignore user-defined ``__getstate__`` and +- gh-104035: Do not ignore user-defined ``__getstate__`` and ``__setstate__`` methods for slotted frozen dataclasses. -- gh-issue-103987: In :mod:`mmap`, fix several bugs that could lead to - access to memory-mapped files after they have been invalidated. +- gh-103987: In :mod:`mmap`, fix several bugs that could lead to access to + memory-mapped files after they have been invalidated. -- gh-issue-103977: Improve import time of :mod:`platform` module. +- gh-103977: Improve import time of :mod:`platform` module. -- gh-issue-88773: Added :func:`turtle.teleport` to the :mod:`turtle` module - to move a turtle to a new point without tracing a line, visible or - invisible. Patch by Liam Gersten. +- gh-88773: Added :func:`turtle.teleport` to the :mod:`turtle` module to + move a turtle to a new point without tracing a line, visible or invisible. + Patch by Liam Gersten. -- gh-issue-103935: Use :func:`io.open_code` for files to be executed instead - of raw :func:`open` +- gh-103935: Use :func:`io.open_code` for files to be executed instead of + raw :func:`open` -- gh-issue-68968: Fixed garbled output of - :meth:`~unittest.TestCase.assertEqual` when an input lacks final newline. +- gh-68968: Fixed garbled output of :meth:`~unittest.TestCase.assertEqual` + when an input lacks final newline. -- gh-issue-100370: Fix potential :exc:`OverflowError` in +- gh-100370: Fix potential :exc:`OverflowError` in :meth:`sqlite3.Connection.blobopen` for 32-bit builds. Patch by Erlend E. Aasland. -- gh-issue-102628: Substitute CTRL-D with CTRL-Z in :mod:`sqlite3` CLI - banner when running on Windows. +- gh-102628: Substitute CTRL-D with CTRL-Z in :mod:`sqlite3` CLI banner when + running on Windows. -- gh-issue-103636: Module-level attributes ``January`` and ``February`` are +- gh-103636: Module-level attributes ``January`` and ``February`` are deprecated from :mod:`calendar`. -- gh-issue-103583: Isolate :mod:`!_multibytecodec` and codecs extension - modules. Patches by Erlend E. Aasland. +- gh-103583: Isolate :mod:`!_multibytecodec` and codecs extension modules. + Patches by Erlend E. Aasland. -- gh-issue-103848: Add checks to ensure that ``[`` bracketed ``]`` hosts - found by :func:`urllib.parse.urlsplit` are of IPv6 or IPvFuture format. +- gh-103848: Add checks to ensure that ``[`` bracketed ``]`` hosts found by + :func:`urllib.parse.urlsplit` are of IPv6 or IPvFuture format. -- gh-issue-103872: Update the bundled copy of pip to version 23.1.2. +- gh-103872: Update the bundled copy of pip to version 23.1.2. -- gh-issue-99944: Make :mod:`dis` display the value of oparg of +- gh-99944: Make :mod:`dis` display the value of oparg of :opcode:`KW_NAMES`. -- gh-issue-74940: The C.UTF-8 locale is no longer converted to en_US.UTF-8, +- gh-74940: The C.UTF-8 locale is no longer converted to en_US.UTF-8, enabling the use of UTF-8 encoding on systems which have no locales installed. -- gh-issue-103861: Fix ``zipfile.Zipfile`` creating invalid zip files when +- gh-103861: Fix ``zipfile.Zipfile`` creating invalid zip files when ``force_zip64`` was used to add files to them. Patch by Carey Metcalfe. -- gh-issue-103857: Deprecated :meth:`datetime.datetime.utcnow` and +- gh-103857: Deprecated :meth:`datetime.datetime.utcnow` and :meth:`datetime.datetime.utcfromtimestamp`. (Patch by Paul Ganssle) -- gh-issue-103839: Avoid compilation error due to tommath.h not being found - when building Tkinter against Tcl 8.7 built with bundled libtommath. +- gh-103839: Avoid compilation error due to tommath.h not being found when + building Tkinter against Tcl 8.7 built with bundled libtommath. -- gh-issue-103791: :class:`contextlib.suppress` now supports suppressing +- gh-103791: :class:`contextlib.suppress` now supports suppressing exceptions raised as part of an :exc:`ExceptionGroup`. If other exceptions exist on the group, they are re-raised in a group that does not contain the suppressed exceptions. -- gh-issue-90750: Use :meth:`datetime.datetime.fromisocalendar` in the +- gh-90750: Use :meth:`datetime.datetime.fromisocalendar` in the implementation of :meth:`datetime.datetime.strptime`, which should now accept only valid ISO dates. (Patch by Paul Ganssle) -- gh-issue-103685: Prepare :meth:`tkinter.Menu.index` for Tk 8.7 so that it - does not raise ``TclError: expected integer but got ""`` when it should - return ``None``. +- gh-103685: Prepare :meth:`tkinter.Menu.index` for Tk 8.7 so that it does + not raise ``TclError: expected integer but got ""`` when it should return + ``None``. -- gh-issue-81403: :class:`urllib.request.CacheFTPHandler` no longer raises +- gh-81403: :class:`urllib.request.CacheFTPHandler` no longer raises :class:`URLError` if a cached FTP instance is reused. ftplib's endtransfer method calls voidresp to drain the connection to handle FTP instance reuse properly. -- gh-issue-103699: Add ``__orig_bases__`` to non-generic TypedDicts, - call-based TypedDicts, and call-based NamedTuples. Other TypedDicts and - NamedTuples already had the attribute. +- gh-103699: Add ``__orig_bases__`` to non-generic TypedDicts, call-based + TypedDicts, and call-based NamedTuples. Other TypedDicts and NamedTuples + already had the attribute. -- gh-issue-103693: Add convenience variable feature to :mod:`pdb` +- gh-103693: Add convenience variable feature to :mod:`pdb` -- gh-issue-92248: Deprecate ``type``, ``choices``, and ``metavar`` - parameters of ``argparse.BooleanOptionalAction``. +- gh-92248: Deprecate ``type``, ``choices``, and ``metavar`` parameters of + ``argparse.BooleanOptionalAction``. -- gh-issue-89415: Add :mod:`socket` constants for source-specific multicast. - Patch by Reese Hyde. +- gh-89415: Add :mod:`socket` constants for source-specific multicast. Patch + by Reese Hyde. -- gh-issue-103673: :mod:`socketserver` gains ``ForkingUnixStreamServer`` and +- gh-103673: :mod:`socketserver` gains ``ForkingUnixStreamServer`` and ``ForkingUnixDatagramServer`` classes. Patch by Jay Berry. -- gh-issue-103636: Added Enum for months and days in the calendar module. +- gh-103636: Added Enum for months and days in the calendar module. -- gh-issue-84976: Create a new ``Lib/_pydatetime.py`` file that defines the - Python version of the ``datetime`` module, and make ``datetime`` import - the contents of the new library only if the C implementation is missing. +- gh-84976: Create a new ``Lib/_pydatetime.py`` file that defines the Python + version of the ``datetime`` module, and make ``datetime`` import the + contents of the new library only if the C implementation is missing. Currently, the full Python implementation is defined and then deleted if the C implementation is not available, slowing down ``import datetime`` unnecessarily. -- gh-issue-103596: Attributes/methods are no longer shadowed by same-named - enum members, although they may be shadowed by enum.property's. +- gh-103596: Attributes/methods are no longer shadowed by same-named enum + members, although they may be shadowed by enum.property's. -- gh-issue-103584: Updated ``importlib.metadata`` with changes from +- gh-103584: Updated ``importlib.metadata`` with changes from ``importlib_metadata`` 5.2 through 6.5.0, including: Support ``installed-files.txt`` for ``Distribution.files`` when present. ``PackageMetadata`` now stipulates an additional ``get`` method allowing @@ -3425,64 +4381,63 @@ Library expectation that ``PackageMetadata.__getitem__`` will return ``None`` for missing keys. In the future, it will raise a ``KeyError``. -- gh-issue-103578: Fixed a bug where :mod:`pdb` crashes when reading source - file with different encoding by replacing :func:`io.open` with +- gh-103578: Fixed a bug where :mod:`pdb` crashes when reading source file + with different encoding by replacing :func:`io.open` with :func:`io.open_code`. The new method would also call into the hook set by :c:func:`PyFile_SetOpenCodeHook`. -- gh-issue-103556: Now creating :class:`inspect.Signature` objects with +- gh-103556: Now creating :class:`inspect.Signature` objects with positional-only parameter with a default followed by a positional-or-keyword parameter without one is impossible. -- gh-issue-103559: Update the bundled copy of pip to version 23.1.1. +- gh-103559: Update the bundled copy of pip to version 23.1.1. -- gh-issue-103548: Improve performance of :meth:`pathlib.Path.absolute` and +- gh-103548: Improve performance of :meth:`pathlib.Path.absolute` and :meth:`~pathlib.Path.cwd` by joining paths only when necessary. Also improve performance of :meth:`pathlib.PurePath.is_absolute` on Posix by skipping path parsing and normalization. -- gh-issue-103538: Remove ``_tkinter`` module code guarded by definition of - the ``TK_AQUA`` macro which was only needed for Tk 8.4.7 or earlier and - was never actually defined by any build system or documented for manual - use. +- gh-103538: Remove ``_tkinter`` module code guarded by definition of the + ``TK_AQUA`` macro which was only needed for Tk 8.4.7 or earlier and was + never actually defined by any build system or documented for manual use. -- gh-issue-103533: Update :mod:`cProfile` to use PEP 669 API +- gh-103533: Update :mod:`cProfile` to use PEP 669 API -- gh-issue-103525: Fix misleading exception message when mixed ``str`` and +- gh-103525: Fix misleading exception message when mixed ``str`` and ``bytes`` arguments are supplied to :class:`pathlib.PurePath` and :class:`~pathlib.Path`. -- gh-issue-103489: Add :meth:`~sqlite3.Connection.getconfig` and +- gh-103489: Add :meth:`~sqlite3.Connection.getconfig` and :meth:`~sqlite3.Connection.setconfig` to :class:`~sqlite3.Connection` to make configuration changes to a database connection. Patch by Erlend E. Aasland. -- gh-issue-103365: Set default Flag boundary to ``STRICT`` and fix bitwise +- gh-103365: Set default Flag boundary to ``STRICT`` and fix bitwise operations. -- gh-issue-103472: Avoid a potential :exc:`ResourceWarning` in +- gh-103472: Avoid a potential :exc:`ResourceWarning` in :class:`http.client.HTTPConnection` by closing the proxy / tunnel's CONNECT response explicitly. -- gh-issue-103462: Fixed an issue with using +- gh-103462: Fixed an issue with using :meth:`~asyncio.WriteTransport.writelines` in :mod:`asyncio` to send very large payloads that exceed the amount of data that can be written in one call to :meth:`socket.socket.send` or :meth:`socket.socket.sendmsg`, resulting in the remaining buffer being left unwritten. -- gh-issue-103449: Fix a bug in doc string generation in +- gh-103449: Fix a bug in doc string generation in :func:`dataclasses.dataclass`. -- gh-issue-103092: Isolate :mod:`!_collections` (apply :pep:`687`). Patch by +- gh-103092: Isolate :mod:`!_collections` (apply :pep:`687`). Patch by Erlend E. Aasland. -- gh-issue-103357: Added support for :class:`logging.Formatter` ``defaults`` +- gh-103357: Added support for :class:`logging.Formatter` ``defaults`` parameter to :func:`logging.config.dictConfig` and :func:`logging.config.fileConfig`. Patch by Bar Harel. -- gh-issue-103092: Adapt the :mod:`winreg` extension module to :pep:`687`. +- gh-103092: Adapt the :mod:`winreg` extension module to :pep:`687`. -- gh-issue-74690: The performance of :func:`isinstance` checks against +- gh-74690: The performance of :func:`isinstance` checks against :func:`runtime-checkable protocols ` has been considerably improved for protocols that only have a few members. To achieve this improvement, several internal implementation details of the @@ -3491,165 +4446,164 @@ Library ``typing._is_callable_members_only``, and ``typing._get_protocol_attrs``. Patches by Alex Waygood. -- gh-issue-74690: The members of a runtime-checkable protocol are now - considered "frozen" at runtime as soon as the class has been created. See +- gh-74690: The members of a runtime-checkable protocol are now considered + "frozen" at runtime as soon as the class has been created. See :ref:`"What's new in Python 3.12" ` for more details. -- gh-issue-103256: Fixed a bug that caused :mod:`hmac` to raise an exception - when the requested hash algorithm was not available in OpenSSL despite - being available separately as part of ``hashlib`` itself. It now falls - back properly to the built-in. This could happen when, for example, your +- gh-103256: Fixed a bug that caused :mod:`hmac` to raise an exception when + the requested hash algorithm was not available in OpenSSL despite being + available separately as part of ``hashlib`` itself. It now falls back + properly to the built-in. This could happen when, for example, your OpenSSL does not include SHA3 support and you want to compute ``hmac.digest(b'K', b'M', 'sha3_256')``. -- gh-issue-102778: Support ``sys.last_exc`` in :mod:`idlelib`. +- gh-102778: Support ``sys.last_exc`` in :mod:`idlelib`. -- gh-issue-103285: Improve performance of :func:`ast.get_source_segment`. +- gh-103285: Improve performance of :func:`ast.get_source_segment`. -- gh-issue-103225: Fix a bug in :mod:`pdb` when displaying line numbers of +- gh-103225: Fix a bug in :mod:`pdb` when displaying line numbers of module-level source code. -- gh-issue-103092: Adapt the :mod:`msvcrt` extension module to :pep:`687`. +- gh-103092: Adapt the :mod:`msvcrt` extension module to :pep:`687`. -- gh-issue-103092: Adapt the :mod:`winsound` extension module to :pep:`687`. +- gh-103092: Adapt the :mod:`winsound` extension module to :pep:`687`. -- gh-issue-93910: Remove deprecation of enum ``member.member`` access. +- gh-93910: Remove deprecation of enum ``member.member`` access. -- gh-issue-102978: Fixes :func:`unittest.mock.patch` not enforcing function +- gh-102978: Fixes :func:`unittest.mock.patch` not enforcing function signatures for methods decorated with ``@classmethod`` or ``@staticmethod`` when patch is called with ``autospec=True``. -- gh-issue-103092: Isolate :mod:`!_socket` (apply :pep:`687`). Patch by - Erlend E. Aasland. +- gh-103092: Isolate :mod:`!_socket` (apply :pep:`687`). Patch by Erlend E. + Aasland. -- gh-issue-100479: Add :meth:`pathlib.PurePath.with_segments`, which creates - a path object from arguments. This method is called whenever a derivative +- gh-100479: Add :meth:`pathlib.PurePath.with_segments`, which creates a + path object from arguments. This method is called whenever a derivative path is created, such as from :attr:`pathlib.PurePath.parent`. Subclasses may override this method to share information between path objects. -- gh-issue-103220: Fix issue where :func:`os.path.join` added a slash when - joining onto an incomplete UNC drive with a trailing slash on Windows. +- gh-103220: Fix issue where :func:`os.path.join` added a slash when joining + onto an incomplete UNC drive with a trailing slash on Windows. -- gh-issue-103204: Fixes :mod:`http.server` accepting HTTP requests with - HTTP version numbers preceded by '+', or '-', or with digit-separating '_' +- gh-103204: Fixes :mod:`http.server` accepting HTTP requests with HTTP + version numbers preceded by '+', or '-', or with digit-separating '_' characters. The length of the version numbers is also constrained. -- gh-issue-75586: Fix various Windows-specific issues with ``shutil.which``. +- gh-75586: Fix various Windows-specific issues with ``shutil.which``. -- gh-issue-103193: Improve performance of :func:`inspect.getattr_static`. - Patch by Alex Waygood. +- gh-103193: Improve performance of :func:`inspect.getattr_static`. Patch by + Alex Waygood. -- gh-issue-103176: :func:`sys._current_exceptions` now returns a mapping - from thread-id to an exception instance, rather than to a ``(typ, exc, - tb)`` tuple. +- gh-103176: :func:`sys._current_exceptions` now returns a mapping from + thread-id to an exception instance, rather than to a ``(typ, exc, tb)`` + tuple. -- gh-issue-103143: Polish the help messages and docstrings of :mod:`pdb`. +- gh-103143: Polish the help messages and docstrings of :mod:`pdb`. -- gh-issue-103015: Add *entrypoint* keyword-only parameter to +- gh-103015: Add *entrypoint* keyword-only parameter to :meth:`sqlite3.Connection.load_extension`, for overriding the SQLite extension entry point. Patch by Erlend E. Aasland. -- gh-issue-103000: Improve performance of :func:`dataclasses.astuple` and +- gh-103000: Improve performance of :func:`dataclasses.astuple` and :func:`dataclasses.asdict` in cases where the contents are common Python types. -- gh-issue-102953: The extraction methods in :mod:`tarfile`, and +- gh-102953: The extraction methods in :mod:`tarfile`, and :func:`shutil.unpack_archive`, have a new a *filter* argument that allows limiting tar features than may be surprising or dangerous, such as creating files outside the destination directory. See :ref:`tarfile-extraction-filter` for details. -- gh-issue-97696: Implemented an eager task factory in asyncio. When used as - a task factory on an event loop, it performs eager execution of - coroutines. Coroutines that are able to complete synchronously (e.g. - return or raise without blocking) are returned immediately as a finished - task, and the task is never scheduled to the event loop. If the coroutine - blocks, the (pending) task is scheduled and returned. +- gh-97696: Implemented an eager task factory in asyncio. When used as a + task factory on an event loop, it performs eager execution of coroutines. + Coroutines that are able to complete synchronously (e.g. return or raise + without blocking) are returned immediately as a finished task, and the + task is never scheduled to the event loop. If the coroutine blocks, the + (pending) task is scheduled and returned. -- gh-issue-81079: Add *case_sensitive* keyword-only argument to +- gh-81079: Add *case_sensitive* keyword-only argument to :meth:`pathlib.Path.glob` and :meth:`~pathlib.Path.rglob`. -- gh-issue-101819: Isolate the :mod:`io` extension module by applying - :pep:`687`. Patch by Kumar Aditya, Victor Stinner, and Erlend E. Aasland. +- gh-101819: Isolate the :mod:`io` extension module by applying :pep:`687`. + Patch by Kumar Aditya, Victor Stinner, and Erlend E. Aasland. -- gh-issue-91896: Deprecate :class:`collections.abc.ByteString` +- gh-91896: Deprecate :class:`collections.abc.ByteString` -- gh-issue-101362: Speed up :class:`pathlib.Path` construction by omitting - the path anchor from the internal list of path parts. +- gh-101362: Speed up :class:`pathlib.Path` construction by omitting the + path anchor from the internal list of path parts. -- gh-issue-102114: Functions in the :mod:`dis` module that accept a source - code string as argument now print a more concise traceback when the string +- gh-102114: Functions in the :mod:`dis` module that accept a source code + string as argument now print a more concise traceback when the string contains a syntax or indentation error. -- gh-issue-62432: The :mod:`unittest` runner will now exit with status code - 5 if no tests were run. It is common for test runner misconfiguration to - fail to find any tests, this should be an error. +- gh-62432: The :mod:`unittest` runner will now exit with status code 5 if + no tests were run. It is common for test runner misconfiguration to fail + to find any tests, this should be an error. -- gh-issue-78079: Fix incorrect normalization of UNC device path roots, and +- gh-78079: Fix incorrect normalization of UNC device path roots, and partial UNC share path roots, in :class:`pathlib.PurePath`. Pathlib no longer appends a trailing slash to such paths. -- gh-issue-85984: Add :func:`tty.cfmakeraw` and :func:`tty.cfmakecbreak` to +- gh-85984: Add :func:`tty.cfmakeraw` and :func:`tty.cfmakecbreak` to :mod:`tty` and modernize, the behavior of :func:`tty.setraw` and :func:`tty.setcbreak` to use POSIX.1-2017 Chapter 11 "General Terminal Interface" flag masks by default. -- gh-issue-101688: Implement :func:`types.get_original_bases` to provide - further introspection for types. +- gh-101688: Implement :func:`types.get_original_bases` to provide further + introspection for types. -- gh-issue-101640: :class:`argparse.ArgumentParser` now catches errors when +- gh-101640: :class:`argparse.ArgumentParser` now catches errors when writing messages, such as when :data:`sys.stderr` is ``None``. Patch by Oleg Iarygin. -- gh-issue-83861: Fix datetime.astimezone method return value when invoked - on a naive datetime instance that represents local time falling in a - timezone transition gap. PEP 495 requires that instances with fold=1 - produce earlier times than those with fold=0 in this case. +- gh-83861: Fix datetime.astimezone method return value when invoked on a + naive datetime instance that represents local time falling in a timezone + transition gap. PEP 495 requires that instances with fold=1 produce + earlier times than those with fold=0 in this case. -- gh-issue-89550: Decrease execution time of some :mod:`gzip` file writes by - 15% by adding more appropriate buffering. +- gh-89550: Decrease execution time of some :mod:`gzip` file writes by 15% + by adding more appropriate buffering. -- gh-issue-95299: Remove the bundled setuptools wheel from ``ensurepip``, - and stop installing setuptools in environments created by ``venv``. +- gh-95299: Remove the bundled setuptools wheel from ``ensurepip``, and stop + installing setuptools in environments created by ``venv``. -- gh-issue-99353: Respect the :class:`http.client.HTTPConnection` - ``.debuglevel`` flag in :class:`urllib.request.AbstractHTTPHandler` when - its constructor parameter ``debuglevel`` is not set. And do the same for - ``*HTTPS*``. +- gh-99353: Respect the :class:`http.client.HTTPConnection` ``.debuglevel`` + flag in :class:`urllib.request.AbstractHTTPHandler` when its constructor + parameter ``debuglevel`` is not set. And do the same for ``*HTTPS*``. -- gh-issue-98040: Remove the long-deprecated ``imp`` module. +- gh-98040: Remove the long-deprecated ``imp`` module. -- gh-issue-97850: Deprecate :func:`pkgutil.find_loader` and +- gh-97850: Deprecate :func:`pkgutil.find_loader` and :func:`pkgutil.get_loader` in favor of :func:`importlib.util.find_spec`. -- gh-issue-94473: Flatten arguments in :meth:`tkinter.Canvas.coords`. It now +- gh-94473: Flatten arguments in :meth:`tkinter.Canvas.coords`. It now accepts not only ``x1, y1, x2, y2, ...`` and ``[x1, y1, x2, y2, ...]``, but also ``(x1, y1), (x2, y2), ...`` and ``[(x1, y1), (x2, y2), ...]``. -- gh-issue-98040: Remove more deprecated importlib APIs: ``find_loader()``, +- gh-98040: Remove more deprecated importlib APIs: ``find_loader()``, ``find_module()``, ``importlib.abc.Finder``, ``pkgutil.ImpImporter``, ``pkgutil.ImpLoader``. -- gh-issue-96522: Fix potential deadlock in pty.spawn() +- gh-96522: Fix potential deadlock in pty.spawn() -- gh-issue-96534: Support divert(4) added in FreeBSD 14. +- gh-96534: Support divert(4) added in FreeBSD 14. -- gh-issue-87474: Fix potential file descriptor leaks in +- gh-87474: Fix potential file descriptor leaks in :class:`subprocess.Popen`. -- gh-issue-94906: Support multiple steps in :func:`math.nextafter`. Patch by +- gh-94906: Support multiple steps in :func:`math.nextafter`. Patch by Shantanu Jain and Matthias Gorgens. -- gh-issue-51574: Make :func:`tempfile.mkdtemp` return absolute paths when - its *dir* parameter is relative. +- gh-51574: Make :func:`tempfile.mkdtemp` return absolute paths when its + *dir* parameter is relative. -- gh-issue-94518: Convert private :meth:`_posixsubprocess.fork_exec` to use +- gh-94518: Convert private :meth:`!_posixsubprocess.fork_exec` to use Argument Clinic. -- gh-issue-92184: When creating zip files using :mod:`zipfile`, - ``os.altsep``, if not ``None``, will always be treated as a path separator - even when it is not ``/``. Patch by Carey Metcalfe. +- gh-92184: When creating zip files using :mod:`zipfile`, ``os.altsep``, if + not ``None``, will always be treated as a path separator even when it is + not ``/``. Patch by Carey Metcalfe. - bpo-46797: Deprecation warnings are now emitted for :class:`!ast.Num`, :class:`!ast.Bytes`, :class:`!ast.Str`, :class:`!ast.NameConstant` and @@ -3686,76 +4640,76 @@ Library Documentation ------------- -- gh-issue-67056: Document that the effect of registering or unregistering - an :mod:`atexit` cleanup function from within a registered cleanup - function is undefined. +- gh-67056: Document that the effect of registering or unregistering an + :mod:`atexit` cleanup function from within a registered cleanup function + is undefined. -- gh-issue-103629: Mention the new way of typing ``**kwargs`` with - ``Unpack`` and ``TypedDict`` introduced in :pep:`692`. +- gh-103629: Mention the new way of typing ``**kwargs`` with ``Unpack`` and + ``TypedDict`` introduced in :pep:`692`. -- gh-issue-48241: Clarifying documentation about the url parameter to +- gh-48241: Clarifying documentation about the url parameter to urllib.request.urlopen and urllib.request.Request needing to be encoded properly. -- gh-issue-86094: Add support for Unicode Path Extra Field in ZipFile. Patch - by Yeojin Kim and Andrea Giudiceandrea +- gh-86094: Add support for Unicode Path Extra Field in ZipFile. Patch by + Yeojin Kim and Andrea Giudiceandrea -- gh-issue-99202: Fix extension type from documentation for compiling in - C++20 mode +- gh-99202: Fix extension type from documentation for compiling in C++20 + mode Tests ----- -- gh-issue-104494: Update ``test_pack_configure_in`` and +- gh-104494: Update ``test_pack_configure_in`` and ``test_place_configure_in`` for changes to error message formatting in Tk 8.7. -- gh-issue-104461: Run test_configure_screen on X11 only, since the - ``DISPLAY`` environment variable and ``-screen`` option for toplevels are - not useful on Tk for Win32 or Aqua. +- gh-104461: Run test_configure_screen on X11 only, since the ``DISPLAY`` + environment variable and ``-screen`` option for toplevels are not useful + on Tk for Win32 or Aqua. -- gh-issue-86275: Added property-based tests to the :mod:`zoneinfo` tests, - along with stubs for the ``hypothesis`` interface. (Patch by Paul Ganssle) +- gh-86275: Added property-based tests to the :mod:`zoneinfo` tests, along + with stubs for the ``hypothesis`` interface. (Patch by Paul Ganssle) -- gh-issue-103329: Regression tests for the behaviour of +- gh-103329: Regression tests for the behaviour of ``unittest.mock.PropertyMock`` were added. -- gh-issue-102795: fix use of poll in test_epoll's test_control_and_wait +- gh-102795: fix use of poll in test_epoll's test_control_and_wait -- gh-issue-75729: Fix the :func:`os.spawn* ` tests failing on - Windows when the working directory or interpreter path contains spaces. +- gh-75729: Fix the :func:`os.spawn* ` tests failing on Windows + when the working directory or interpreter path contains spaces. Build ----- -- gh-issue-101282: BOLT optimization is now applied to the libpython shared +- gh-101282: BOLT optimization is now applied to the libpython shared library if building a shared library. BOLT instrumentation and application settings can now be influenced via the ``BOLT_INSTRUMENT_FLAGS`` and ``BOLT_APPLY_FLAGS`` configure variables. -- gh-issue-99017: ``PYTHON_FOR_REGEN`` now require Python 3.10 or newer. +- gh-99017: ``PYTHON_FOR_REGEN`` now require Python 3.10 or newer. -- gh-issue-104490: Define ``.PHONY`` / virtual make targets consistently and +- gh-104490: Define ``.PHONY`` / virtual make targets consistently and properly. -- gh-issue-104106: Add gcc fallback of mkfifoat/mknodat for macOS. Patch by +- gh-104106: Add gcc fallback of mkfifoat/mknodat for macOS. Patch by Donghee Na. -- gh-issue-103532: The ``TKINTER_PROTECT_LOADTK`` macro is no longer defined - or used in the ``_tkinter`` module. It was previously only defined when +- gh-103532: The ``TKINTER_PROTECT_LOADTK`` macro is no longer defined or + used in the ``_tkinter`` module. It was previously only defined when building against Tk 8.4.13 and older, but Tk older than 8.5.12 has been unsupported since gh-issue-91152. -- gh-issue-99069: Extended workaround defining ``static_assert`` when - missing from the libc headers to all clang and gcc builds. In particular, - this fixes building on macOS <= 10.10. +- gh-99069: Extended workaround defining ``static_assert`` when missing from + the libc headers to all clang and gcc builds. In particular, this fixes + building on macOS <= 10.10. -- gh-issue-100220: Changed the default value of the ``SHELL`` Makefile - variable from ``/bin/sh`` to ``/bin/sh -e`` to ensure that complex recipes +- gh-100220: Changed the default value of the ``SHELL`` Makefile variable + from ``/bin/sh`` to ``/bin/sh -e`` to ensure that complex recipes correctly fail after an error. Previously, ``make install`` could fail to install some files and yet return a successful result. -- gh-issue-90656: Add platform triplets for 64-bit LoongArch: +- gh-90656: Add platform triplets for 64-bit LoongArch: * loongarch64-linux-gnusf * loongarch64-linux-gnuf32 @@ -3766,112 +4720,110 @@ Build Windows ------- -- gh-issue-104623: Update Windows installer to use SQLite 3.42.0. +- gh-104623: Update Windows installer to use SQLite 3.42.0. -- gh-issue-82814: Fix a potential ``[Errno 13] Permission denied`` when - using :func:`shutil.copystat` within Windows Subsystem for Linux (WSL) on - a mounted filesystem by adding ``errno.EACCES`` to the list of ignored +- gh-82814: Fix a potential ``[Errno 13] Permission denied`` when using + :func:`shutil.copystat` within Windows Subsystem for Linux (WSL) on a + mounted filesystem by adding ``errno.EACCES`` to the list of ignored errors within the internal implementation. -- gh-issue-103088: Fix virtual environment :file:`activate` script having +- gh-103088: Fix virtual environment :file:`activate` script having incorrect line endings for Cygwin. -- gh-issue-103088: Fixes venvs not working in bash on Windows across - different disks +- gh-103088: Fixes venvs not working in bash on Windows across different + disks -- gh-issue-102997: Update Windows installer to use SQLite 3.41.2. +- gh-102997: Update Windows installer to use SQLite 3.41.2. -- gh-issue-88013: Fixed a bug where :exc:`TypeError` was raised when calling +- gh-88013: Fixed a bug where :exc:`TypeError` was raised when calling :func:`ntpath.realpath` with a bytes parameter in some cases. macOS ----- -- gh-issue-99834: Update macOS installer to Tcl/Tk 8.6.13. +- gh-99834: Update macOS installer to Tcl/Tk 8.6.13. -- gh-issue-104623: Update macOS installer to SQLite 3.42.0. +- gh-104623: Update macOS installer to SQLite 3.42.0. -- gh-issue-103545: Add ``os.PRIO_DARWIN_THREAD``, - ``os.PRIO_DARWIN_PROCESS``, ``os.PRIO_DARWIN_BG`` and - ``os.PRIO_DARWIN_NONUI``. These can be used with ``os.setpriority`` to run - the process at a lower priority and make use of the efficiency cores on - Apple Silicon systems. +- gh-103545: Add ``os.PRIO_DARWIN_THREAD``, ``os.PRIO_DARWIN_PROCESS``, + ``os.PRIO_DARWIN_BG`` and ``os.PRIO_DARWIN_NONUI``. These can be used with + ``os.setpriority`` to run the process at a lower priority and make use of + the efficiency cores on Apple Silicon systems. -- gh-issue-104180: Support reading SOCKS proxy configuration from macOS - System Configuration. Patch by Sam Schott. +- gh-104180: Support reading SOCKS proxy configuration from macOS System + Configuration. Patch by Sam Schott. -- gh-issue-60436: update curses textbox to additionally handle backspace - using the ``curses.ascii.DEL`` key press. +- gh-60436: update curses textbox to additionally handle backspace using the + ``curses.ascii.DEL`` key press. -- gh-issue-102997: Update macOS installer to SQLite 3.41.2. +- gh-102997: Update macOS installer to SQLite 3.41.2. IDLE ---- -- gh-issue-104499: Fix completions for Tk Aqua 8.7 (currently blank). +- gh-104499: Fix completions for Tk Aqua 8.7 (currently blank). -- gh-issue-104496: About prints both tcl and tk versions if different - (expected someday). +- gh-104496: About prints both tcl and tk versions if different (expected + someday). -- gh-issue-88496: Fix IDLE test hang on macOS. +- gh-88496: Fix IDLE test hang on macOS. Tools/Demos ----------- -- gh-issue-104389: Argument Clinic C converters now accept the ``unused`` - keyword, for wrapping a parameter with :c:macro:`Py_UNUSED`. Patch by - Erlend E. Aasland. +- gh-104389: Argument Clinic C converters now accept the ``unused`` keyword, + for wrapping a parameter with :c:macro:`Py_UNUSED`. Patch by Erlend E. + Aasland. C API ----- -- gh-issue-101291: Added unstable C API for extracting the value of - "compact" integers: :c:func:`PyUnstable_Long_IsCompact` and +- gh-101291: Added unstable C API for extracting the value of "compact" + integers: :c:func:`PyUnstable_Long_IsCompact` and :c:func:`PyUnstable_Long_CompactValue`. -- gh-issue-104109: We've added ``Py_NewInterpreterFromConfig()`` and +- gh-104109: We've added ``Py_NewInterpreterFromConfig()`` and ``PyInterpreterConfig`` to the public C-API (but not the stable ABI; not yet at least). The new function may be used to create a new interpreter with various features configured. The function was added to support PEP 684 (per-interpreter GIL). -- gh-issue-103968: :c:func:`PyType_FromSpec` and its variants now allow - creating classes whose metaclass overrides - :c:member:`~PyTypeObject.tp_new`. The ``tp_new`` is ignored. This behavior - is deprecated and will be disallowed in 3.14+. The new - :c:func:`PyType_FromMetaclass` already disallows it. +- gh-103968: :c:func:`PyType_FromSpec` and its variants now allow creating + classes whose metaclass overrides :c:member:`~PyTypeObject.tp_new`. The + ``tp_new`` is ignored. This behavior is deprecated and will be disallowed + in 3.14+. The new :c:func:`PyType_FromMetaclass` already disallows it. -- gh-issue-103743: Add :c:func:`PyUnstable_Object_GC_NewWithExtraData` - function that can be used to allocate additional memory after an object - for data not managed by Python. +- gh-103743: Add :c:func:`PyUnstable_Object_GC_NewWithExtraData` function + that can be used to allocate additional memory after an object for data + not managed by Python. -- gh-issue-103295: Introduced :c:func:`PyUnstable_WritePerfMapEntry`, +- gh-103295: Introduced :c:func:`PyUnstable_WritePerfMapEntry`, :c:func:`PyUnstable_PerfMapState_Init` and :c:func:`PyUnstable_PerfMapState_Fini`. These allow extension modules (JIT compilers in particular) to write to perf-map files in a thread safe manner. The :doc:`../howto/perf_profiling` also uses these APIs to write entries in the perf-map file. -- gh-issue-103509: Added C API for extending types whose instance memory - layout is opaque: :c:member:`PyType_Spec.basicsize` can now be zero or - negative, :c:func:`PyObject_GetTypeData` can be used to get - subclass-specific data, and :c:macro:`Py_TPFLAGS_ITEMS_AT_END` can be used - to safely extend variable-size objects. See :pep:`697` for details. +- gh-103509: Added C API for extending types whose instance memory layout is + opaque: :c:member:`PyType_Spec.basicsize` can now be zero or negative, + :c:func:`PyObject_GetTypeData` can be used to get subclass-specific data, + and :c:macro:`Py_TPFLAGS_ITEMS_AT_END` can be used to safely extend + variable-size objects. See :pep:`697` for details. -- gh-issue-103091: Add a new C-API function to eagerly assign a version tag - to a PyTypeObject: ``PyUnstable_Type_AssignVersionTag()``. +- gh-103091: Add a new C-API function to eagerly assign a version tag to a + PyTypeObject: ``PyUnstable_Type_AssignVersionTag()``. -- gh-issue-101408: :c:macro:`PyObject_GC_Resize` should calculate preheader - size if needed. Patch by Donghee Na. +- gh-101408: :c:macro:`PyObject_GC_Resize` should calculate preheader size + if needed. Patch by Donghee Na. -- gh-issue-98836: Add support of more formatting options (left aligning, - octals, uppercase hexadecimals, :c:type:`intmax_t`, :c:type:`ptrdiff_t`, +- gh-98836: Add support of more formatting options (left aligning, octals, + uppercase hexadecimals, :c:type:`intmax_t`, :c:type:`ptrdiff_t`, :c:type:`wchar_t` C strings, variable width and precision) in :c:func:`PyUnicode_FromFormat` and :c:func:`PyUnicode_FromFormatV`. -- gh-issue-96803: Add unstable C-API functions to get the code object, lasti - and line number from the internal ``_PyInterpreterFrame`` in the limited - API. The functions are: +- gh-96803: Add unstable C-API functions to get the code object, lasti and + line number from the internal ``_PyInterpreterFrame`` in the limited API. + The functions are: * ``PyCodeObject * PyUnstable_InterpreterFrame_GetCode(struct _PyInterpreterFrame *frame)`` * ``int PyUnstable_InterpreterFrame_GetLasti(struct _PyInterpreterFrame *frame)`` @@ -3886,75 +4838,72 @@ What's New in Python 3.12.0 alpha 7? Core and Builtins ----------------- -- gh-issue-102192: Deprecated ``_PyErr_ChainExceptions`` in favour of +- gh-102192: Deprecated ``_PyErr_ChainExceptions`` in favour of ``_PyErr_ChainExceptions1``. -- gh-issue-89987: Reduce the number of inline :opcode:`CACHE` entries for +- gh-89987: Reduce the number of inline :opcode:`CACHE` entries for :opcode:`BINARY_SUBSCR`. -- gh-issue-102859: Removed :opcode:`!JUMP_IF_FALSE_OR_POP` and +- gh-102859: Removed :opcode:`!JUMP_IF_FALSE_OR_POP` and :opcode:`!JUMP_IF_TRUE_OR_POP` instructions. -- gh-issue-101975: Fixed ``stacktop`` value on tracing entries to avoid - corruption on garbage collection. +- gh-101975: Fixed ``stacktop`` value on tracing entries to avoid corruption + on garbage collection. -- gh-issue-102778: Add :data:`sys.last_exc` and deprecate - :data:`sys.last_type`, :data:`sys.last_value` and - :data:`sys.last_traceback`, which hold the same information in its legacy - form. +- gh-102778: Add :data:`sys.last_exc` and deprecate :data:`sys.last_type`, + :data:`sys.last_value` and :data:`sys.last_traceback`, which hold the same + information in its legacy form. -- gh-issue-100982: Replace all occurrences of ``COMPARE_AND_BRANCH`` with +- gh-100982: Replace all occurrences of ``COMPARE_AND_BRANCH`` with :opcode:`COMPARE_OP`. -- gh-issue-102701: Fix overflow when creating very large dict. +- gh-102701: Fix overflow when creating very large dict. -- gh-issue-102755: Add :c:func:`PyErr_DisplayException` which takes just an +- gh-102755: Add :c:func:`PyErr_DisplayException` which takes just an exception instance, to replace the legacy :c:func:`PyErr_Display` which takes the ``(typ, exc, tb)`` triplet. -- gh-issue-102594: Add note to exception raised in ``PyErr_SetObject`` when +- gh-102594: Add note to exception raised in ``PyErr_SetObject`` when normalization fails. -- gh-issue-90997: Shrink the number of inline :opcode:`CACHE` entries used - by :opcode:`LOAD_GLOBAL`. +- gh-90997: Shrink the number of inline :opcode:`CACHE` entries used by + :opcode:`LOAD_GLOBAL`. -- gh-issue-102491: Improve import time of ``platform`` by removing - IronPython version parsing. The IronPython version parsing was not - functional (see https://github.com/IronLanguages/ironpython3/issues/1667). +- gh-102491: Improve import time of ``platform`` by removing IronPython + version parsing. The IronPython version parsing was not functional (see + https://github.com/IronLanguages/ironpython3/issues/1667). -- gh-issue-101291: Rearrage bits in first field (after header) of - PyLongObject. * Bits 0 and 1: 1 - sign. I.e. 0 for positive numbers, 1 for - zero and 2 for negative numbers. * Bit 2 reserved (probably for the - immortal bit) * Bits 3+ the unsigned size. +- gh-101291: Rearrage bits in first field (after header) of PyLongObject. * + Bits 0 and 1: 1 - sign. I.e. 0 for positive numbers, 1 for zero and 2 for + negative numbers. * Bit 2 reserved (probably for the immortal bit) * Bits + 3+ the unsigned size. This makes a few operations slightly more efficient, and will enable a more compact and faster 2s-complement representation of most ints in future. -- gh-issue-102397: Fix segfault from race condition in signal handling - during garbage collection. Patch by Kumar Aditya. +- gh-102397: Fix segfault from race condition in signal handling during + garbage collection. Patch by Kumar Aditya. -- gh-issue-102406: :mod:`codecs` encoding/decoding errors now get the - context information (which operation and which codecs) attached as - :pep:`678` notes instead of through chaining a new instance of the - exception. +- gh-102406: :mod:`codecs` encoding/decoding errors now get the context + information (which operation and which codecs) attached as :pep:`678` + notes instead of through chaining a new instance of the exception. -- gh-issue-102281: Fix potential nullptr dereference and use of - uninitialized memory in fileutils. Patch by Max Bachmann. +- gh-102281: Fix potential nullptr dereference and use of uninitialized + memory in fileutils. Patch by Max Bachmann. -- gh-issue-102300: Reuse operands with refcount of 1 in float - specializations of BINARY_OP. +- gh-102300: Reuse operands with refcount of 1 in float specializations of + BINARY_OP. -- gh-issue-102213: Fix performance loss when accessing an object's - attributes with ``__getattr__`` defined. +- gh-102213: Fix performance loss when accessing an object's attributes with + ``__getattr__`` defined. -- gh-issue-102255: Improve build support for the Xbox. Patch by Max - Bachmann. +- gh-102255: Improve build support for the Xbox. Patch by Max Bachmann. -- gh-issue-102027: Fix SSE2 and SSE3 detection in ``_blake2`` internal - module. Patch by Max Bachmann. +- gh-102027: Fix SSE2 and SSE3 detection in ``_blake2`` internal module. + Patch by Max Bachmann. -- gh-issue-101865: Deprecate ``co_lnotab`` in code objects, schedule it for +- gh-101865: Deprecate ``co_lnotab`` in code objects, schedule it for removal in Python 3.14 - bpo-1635741: Adapt :mod:`!_pickle` to :pep:`687`. Patch by Mohamed Koubaa @@ -3963,23 +4912,21 @@ Core and Builtins Library ------- -- gh-issue-103085: Pure python :func:`locale.getencoding()` will not warn +- gh-103085: Pure python :func:`locale.getencoding` will not warn deprecation. -- gh-issue-103068: It's no longer possible to register conditional - breakpoints in :class:`~pdb.Pdb` that raise :exc:`SyntaxError`. Patch by - Tian Gao. +- gh-103068: It's no longer possible to register conditional breakpoints in + :class:`~pdb.Pdb` that raise :exc:`SyntaxError`. Patch by Tian Gao. -- gh-issue-102549: Don't ignore exceptions in member type creation. +- gh-102549: Don't ignore exceptions in member type creation. -- gh-issue-103056: Ensure final ``_generate_next_value_`` is a - ``staticmethod``. +- gh-103056: Ensure final ``_generate_next_value_`` is a ``staticmethod``. -- gh-issue-103046: Display current line label correctly in :mod:`dis` when +- gh-103046: Display current line label correctly in :mod:`dis` when ``show_caches`` is False and ``lasti`` points to a CACHE entry. -- gh-issue-102433: :func:`isinstance` checks against - :func:`runtime-checkable protocols ` now use +- gh-102433: :func:`isinstance` checks against :func:`runtime-checkable + protocols ` now use :func:`inspect.getattr_static` rather than :func:`hasattr` to lookup whether attributes exist. This means that descriptors and :meth:`~object.__getattr__` methods are no longer unexpectedly evaluated @@ -3989,109 +4936,107 @@ Library instances of that protocol on Python 3.12+, and vice versa. Most users are unlikely to be affected by this change. Patch by Alex Waygood. -- gh-issue-103023: It's no longer possible to register expressions to - display in :class:`~pdb.Pdb` that raise :exc:`SyntaxError`. Patch by Tian - Gao. +- gh-103023: It's no longer possible to register expressions to display in + :class:`~pdb.Pdb` that raise :exc:`SyntaxError`. Patch by Tian Gao. -- gh-issue-102947: Improve traceback when :func:`dataclasses.fields` is - called on a non-dataclass. Patch by Alex Waygood +- gh-102947: Improve traceback when :func:`dataclasses.fields` is called on + a non-dataclass. Patch by Alex Waygood -- gh-issue-102780: The :class:`asyncio.Timeout` context manager now works - reliably even when performing cleanup due to task cancellation. - Previously it could raise a :exc:`~asyncio.CancelledError` instead of an +- gh-102780: The :class:`asyncio.Timeout` context manager now works reliably + even when performing cleanup due to task cancellation. Previously it + could raise a :exc:`~asyncio.CancelledError` instead of an :exc:`~asyncio.TimeoutError` in such cases. -- gh-issue-102871: Remove support for obsolete browsers from - :mod:`webbrowser`. Removed browsers include Grail, Mosaic, Netscape, - Galeon, Skipstone, Iceape, Firebird, and Firefox versions 35 and below. +- gh-102871: Remove support for obsolete browsers from :mod:`webbrowser`. + Removed browsers include Grail, Mosaic, Netscape, Galeon, Skipstone, + Iceape, Firebird, and Firefox versions 35 and below. -- gh-issue-102839: Improve performance of :func:`math.log` arguments - handling by removing the argument clinic. +- gh-102839: Improve performance of :func:`math.log` arguments handling by + removing the argument clinic. -- gh-issue-102828: Add the ``onexc`` arg to :func:`shutil.rmtree`, which is - like ``onerror`` but expects an exception instance rather than an exc_info +- gh-102828: Add the ``onexc`` arg to :func:`shutil.rmtree`, which is like + ``onerror`` but expects an exception instance rather than an exc_info tuple. Deprecate ``onerror``. -- gh-issue-88965: typing: Fix a bug relating to substitution in custom - classes generic over a :class:`~typing.ParamSpec`. Previously, if the +- gh-88965: typing: Fix a bug relating to substitution in custom classes + generic over a :class:`~typing.ParamSpec`. Previously, if the ``ParamSpec`` was substituted with a parameters list that itself contained a :class:`~typing.TypeVar`, the ``TypeVar`` in the parameters list could not be subsequently substituted. This is now fixed. Patch by Nikita Sobolev. -- gh-issue-76846: Fix issue where ``__new__()`` and ``__init__()`` methods - of :class:`pathlib.PurePath` and :class:`~pathlib.Path` subclasses were - not called in some circumstances. +- gh-76846: Fix issue where ``__new__()`` and ``__init__()`` methods of + :class:`pathlib.PurePath` and :class:`~pathlib.Path` subclasses were not + called in some circumstances. -- gh-issue-78530: :func:`asyncio.wait` now accepts generators yielding - tasks. Patch by Kumar Aditya. +- gh-78530: :func:`asyncio.wait` now accepts generators yielding tasks. + Patch by Kumar Aditya. -- gh-issue-102748: :func:`asyncio.iscoroutine` now returns ``False`` for +- gh-102748: :func:`asyncio.iscoroutine` now returns ``False`` for generators as :mod:`asyncio` does not support legacy generator-based coroutines. Patch by Kumar Aditya. -- gh-issue-102670: Optimized fmean(), correlation(), covariance(), and +- gh-102670: Optimized fmean(), correlation(), covariance(), and linear_regression() using the new math.sumprod() function. -- gh-issue-102615: Typing: Improve the ``repr`` of generic aliases for - classes generic over a :class:`~typing.ParamSpec`. (Use square brackets to +- gh-102615: Typing: Improve the ``repr`` of generic aliases for classes + generic over a :class:`~typing.ParamSpec`. (Use square brackets to represent a parameter list.) -- gh-issue-100112: :meth:`asyncio.Task.get_coro` now always returns a - coroutine when wrapping an awaitable object. Patch by Kumar Aditya. +- gh-100112: :meth:`asyncio.Task.get_coro` now always returns a coroutine + when wrapping an awaitable object. Patch by Kumar Aditya. -- gh-issue-102578: Speed up setting or deleting mutable attributes on +- gh-102578: Speed up setting or deleting mutable attributes on non-dataclass subclasses of frozen dataclasses. Due to the implementation of ``__setattr__`` and ``__delattr__`` for frozen dataclasses, this previously had a time complexity of *O*\ (*n*). It now has a time complexity of *O*\ (1). -- gh-issue-102519: Add :func:`os.listdrives`, :func:`os.listvolumes` and +- gh-102519: Add :func:`os.listdrives`, :func:`os.listvolumes` and :func:`os.listmounts` functions on Windows for enumerating drives, volumes and mount points -- gh-issue-74468: Attribute name of the extracted :mod:`tarfile` file object - now holds filename of itself rather than of the archive it is contained - in. Patch by Oleg Iarygin. +- gh-74468: Attribute name of the extracted :mod:`tarfile` file object now + holds filename of itself rather than of the archive it is contained in. + Patch by Oleg Iarygin. -- gh-issue-102378: Private helper method +- gh-102378: Private helper method ``inspect._signature_strip_non_python_syntax`` will no longer strip ``/`` from the input string. -- gh-issue-79940: Add :func:`inspect.getasyncgenstate` and +- gh-79940: Add :func:`inspect.getasyncgenstate` and :func:`inspect.getasyncgenlocals`. Patch by Thomas Krennwallner. -- gh-issue-102103: Add ``module`` argument to - :func:`dataclasses.make_dataclass` and make classes produced by it - pickleable. +- gh-102103: Add ``module`` argument to :func:`dataclasses.make_dataclass` + and make classes produced by it pickleable. -- gh-issue-102069: Fix ``__weakref__`` descriptor generation for custom +- gh-102069: Fix ``__weakref__`` descriptor generation for custom dataclasses. -- gh-issue-102038: Skip a ``stat`` in :mod:`site` if we have already found a +- gh-102038: Skip a ``stat`` in :mod:`site` if we have already found a ``pyvenv.cfg`` -- gh-issue-98886: Fix issues when defining dataclasses that have fields with +- gh-98886: Fix issues when defining dataclasses that have fields with specific underscore names that aren't clearly reserved by :mod:`dataclasses`. -- gh-issue-101673: Fix a :mod:`pdb` bug where ``ll`` clears the changes to - local variables. +- gh-101673: Fix a :mod:`pdb` bug where ``ll`` clears the changes to local + variables. -- gh-issue-101313: Added -h and --help arguments to the webbrowser CLI +- gh-101313: Added -h and --help arguments to the webbrowser CLI -- gh-issue-100372: :meth:`ssl.SSLContext.load_verify_locations` no longer +- gh-100372: :meth:`ssl.SSLContext.load_verify_locations` no longer incorrectly accepts some cases of trailing data when parsing DER. -- gh-issue-89727: Fix pathlib.Path.walk RecursionError on deep directory - trees by rewriting it using iteration instead of recursion. +- gh-89727: Fix pathlib.Path.walk RecursionError on deep directory trees by + rewriting it using iteration instead of recursion. -- gh-issue-100131: Added an optional ``delete`` keyword argument to +- gh-100131: Added an optional ``delete`` keyword argument to :class:`tempfile.TemporaryDirectory`. -- gh-issue-48330: Added ``--durations`` command line option, showing the N - slowest test cases. :class:`unittest.TextTestRunner` and +- gh-48330: Added ``--durations`` command line option, showing the N slowest + test cases. :class:`unittest.TextTestRunner` and :class:`unittest.TextTestResult` constructors accept a new *durations* keyword argument. Subclasses should take this into account or accept ``**kwargs``. Added :meth:`unittest.TestResult.addDuration` method and @@ -4099,28 +5044,27 @@ Library (Contributed by Giampaolo Rodola) -- gh-issue-98169: Fix :func:`dataclasses.astuple` crash when +- gh-98169: Fix :func:`dataclasses.astuple` crash when :class:`collections.defaultdict` is present in the attributes. -- gh-issue-96931: Fix incorrect results from - :meth:`ssl.SSLSocket.shared_ciphers` +- gh-96931: Fix incorrect results from :meth:`ssl.SSLSocket.shared_ciphers` -- gh-issue-95495: When built against OpenSSL 3.0, the :mod:`ssl` module had - a bug where it reported unauthenticated EOFs (i.e. without close_notify) - as a clean TLS-level EOF. It now raises :exc:`~ssl.SSLEOFError`, matching - the behavior in previous versions of OpenSSL. The +- gh-95495: When built against OpenSSL 3.0, the :mod:`ssl` module had a bug + where it reported unauthenticated EOFs (i.e. without close_notify) as a + clean TLS-level EOF. It now raises :exc:`~ssl.SSLEOFError`, matching the + behavior in previous versions of OpenSSL. The :attr:`~ssl.SSLContext.options` attribute on :class:`~ssl.SSLContext` also no longer includes :const:`~ssl.OP_IGNORE_UNEXPECTED_EOF` by default. This option may be set to specify the previous OpenSSL 3.0 behavior. -- gh-issue-94684: Now :func:`uuid.uuid3` and :func:`uuid.uuid5` functions - support :class:`bytes` objects as their *name* argument. +- gh-94684: Now :func:`uuid.uuid3` and :func:`uuid.uuid5` functions support + :class:`bytes` objects as their *name* argument. -- gh-issue-94440: Fix a :mod:`concurrent.futures.process` bug where +- gh-94440: Fix a :mod:`concurrent.futures.process` bug where ``ProcessPoolExecutor`` shutdown could hang after a future has been quickly submitted and canceled. -- gh-issue-72346: Added deprecation warning to *isdst* parameter of +- gh-72346: Added deprecation warning to *isdst* parameter of :func:`email.utils.localtime`. - bpo-36305: Fix handling of Windows filenames that resemble drives, such as @@ -4129,46 +5073,46 @@ Library Documentation ------------- -- gh-issue-103112: Add docstring to :meth:`http.client.HTTPResponse.read` to - fix ``pydoc`` output. +- gh-103112: Add docstring to :meth:`http.client.HTTPResponse.read` to fix + ``pydoc`` output. Tests ----- -- gh-issue-102980: Improve test coverage on :mod:`pdb`. +- gh-102980: Improve test coverage on :mod:`pdb`. -- gh-issue-102537: Adjust the error handling strategy in +- gh-102537: Adjust the error handling strategy in ``test_zoneinfo.TzPathTest.python_tzpath_context``. Patch by Paul Ganssle. -- gh-issue-101377: Improved test_locale_calendar_formatweekday of calendar. +- gh-101377: Improved test_locale_calendar_formatweekday of calendar. Build ----- -- gh-issue-102973: Add a dev container (along with accompanying Dockerfile) - for development purposes. +- gh-102973: Add a dev container (along with accompanying Dockerfile) for + development purposes. -- gh-issue-102711: Fix ``-Wstrict-prototypes`` compiler warnings. +- gh-102711: Fix ``-Wstrict-prototypes`` compiler warnings. Windows ------- -- gh-issue-102690: Update :mod:`webbrowser` to fall back to Microsoft Edge - instead of Internet Explorer. +- gh-102690: Update :mod:`webbrowser` to fall back to Microsoft Edge instead + of Internet Explorer. -- gh-issue-99726: Improves correctness of stat results for Windows, and uses +- gh-99726: Improves correctness of stat results for Windows, and uses faster API when available Tools/Demos ----------- -- gh-issue-102809: ``Misc/gdbinit`` was removed. +- gh-102809: ``Misc/gdbinit`` was removed. C API ----- -- gh-issue-102013: Add a new (unstable) C-API function for iterating over - GC'able objects using a callback: ``PyUnstable_VisitObjects``. +- gh-102013: Add a new (unstable) C-API function for iterating over GC'able + objects using a callback: ``PyUnstable_VisitObjects``. What's New in Python 3.12.0 alpha 6? @@ -4179,221 +5123,216 @@ What's New in Python 3.12.0 alpha 6? Security -------- -- gh-issue-99108: Replace builtin hashlib implementations of MD5 and SHA1 - with verified ones from the HACL* project. +- gh-99108: Replace builtin hashlib implementations of MD5 and SHA1 with + verified ones from the HACL* project. -- gh-issue-101727: Updated the OpenSSL version used in Windows and macOS - binary release builds to 1.1.1t to address :cve:`2023-0286`, - :cve:`2022-4303`, and :cve:`2022-4303` per `the OpenSSL 2023-02-07 - security advisory `_. +- gh-101727: Updated the OpenSSL version used in Windows and macOS binary + release builds to 1.1.1t to address :cve:`2023-0286`, :cve:`2022-4303`, + and :cve:`2022-4303` per `the OpenSSL 2023-02-07 security advisory + `_. -- gh-issue-99108: Replace the builtin :mod:`hashlib` implementations of - SHA2-384 and SHA2-512 originally from LibTomCrypt with formally verified, +- gh-99108: Replace the builtin :mod:`hashlib` implementations of SHA2-384 + and SHA2-512 originally from LibTomCrypt with formally verified, side-channel resistant code from the `HACL* `_ project. The builtins remain a fallback only used when OpenSSL does not provide them. -- gh-issue-101283: :class:`subprocess.Popen` now uses a safer approach to - find ``cmd.exe`` when launching with ``shell=True``. Patch by Eryk Sun, - based on a patch by Oleg Iarygin. +- gh-101283: :class:`subprocess.Popen` now uses a safer approach to find + ``cmd.exe`` when launching with ``shell=True``. Patch by Eryk Sun, based + on a patch by Oleg Iarygin. Core and Builtins ----------------- -- gh-issue-102493: Fix regression in semantics of normalisation in +- gh-102493: Fix regression in semantics of normalisation in ``PyErr_SetObject``. -- gh-issue-102416: Do not memoize incorrectly automatically generated loop - rules in the parser. Patch by Pablo Galindo. +- gh-102416: Do not memoize incorrectly automatically generated loop rules + in the parser. Patch by Pablo Galindo. -- gh-issue-102356: Fix a bug that caused a crash when deallocating deeply - nested filter objects. Patch by Marta Gómez Macías. +- gh-102356: Fix a bug that caused a crash when deallocating deeply nested + filter objects. Patch by Marta Gómez Macías. -- gh-issue-102336: Cleanup Windows 7 specific special handling. Patch by Max +- gh-102336: Cleanup Windows 7 specific special handling. Patch by Max Bachmann. -- gh-issue-102250: Fixed a segfault occurring when the interpreter calls a +- gh-102250: Fixed a segfault occurring when the interpreter calls a ``__bool__`` method that raises. -- gh-issue-102126: Fix deadlock at shutdown when clearing thread states if - any finalizer tries to acquire the runtime head lock. Patch by Kumar - Aditya. +- gh-102126: Fix deadlock at shutdown when clearing thread states if any + finalizer tries to acquire the runtime head lock. Patch by Kumar Aditya. -- gh-issue-102027: Use ``GetCurrentProcessId`` on Windows when ``getpid`` is +- gh-102027: Use ``GetCurrentProcessId`` on Windows when ``getpid`` is unavailable. Patch by Max Bachmann. -- gh-issue-102056: Fix error handling bugs in interpreter's exception - printing code, which could cause a crash on infinite recursion. +- gh-102056: Fix error handling bugs in interpreter's exception printing + code, which could cause a crash on infinite recursion. -- gh-issue-100982: Restrict the scope of the :opcode:`FOR_ITER_RANGE` - instruction to the scope of the original :opcode:`FOR_ITER` instruction, - to allow instrumentation. +- gh-100982: Restrict the scope of the :opcode:`FOR_ITER_RANGE` instruction + to the scope of the original :opcode:`FOR_ITER` instruction, to allow + instrumentation. -- gh-issue-101967: Fix possible segfault in - ``positional_only_passed_as_keyword`` function, when new list created. +- gh-101967: Fix possible segfault in ``positional_only_passed_as_keyword`` + function, when new list created. -- gh-issue-101952: Fix possible segfault in ``BUILD_SET`` opcode, when new - set created. +- gh-101952: Fix possible segfault in ``BUILD_SET`` opcode, when new set + created. -- gh-issue-74895: :mod:`socket.getaddrinfo` no longer raises +- gh-74895: :mod:`socket.getaddrinfo` no longer raises :class:`OverflowError` for :class:`int` **port** values outside of the C long range. Out of range values are left up to the underlying string based C library API to report. A :class:`socket.gaierror` ``SAI_SERVICE`` may occur instead, or no error at all as not all platform C libraries generate an error. -- gh-issue-101799: Add :opcode:`CALL_INTRINSIC_2` and use it instead of +- gh-101799: Add :opcode:`CALL_INTRINSIC_2` and use it instead of :opcode:`!PREP_RERAISE_STAR`. -- gh-issue-101857: Fix xattr support detection on Linux systems by widening - the check to linux, not just glibc. This fixes support for musl. +- gh-101857: Fix xattr support detection on Linux systems by widening the + check to linux, not just glibc. This fixes support for musl. -- gh-issue-84783: Make the slice object hashable. Patch by Will Bradshaw and +- gh-84783: Make the slice object hashable. Patch by Will Bradshaw and Furkan Onder. -- gh-issue-87849: Change the ``SEND`` instruction to leave the receiver on - the stack. This allows the specialized form of ``SEND`` to skip the chain - of C calls and jump directly to the ``RESUME`` in the generator or - coroutine. +- gh-87849: Change the ``SEND`` instruction to leave the receiver on the + stack. This allows the specialized form of ``SEND`` to skip the chain of C + calls and jump directly to the ``RESUME`` in the generator or coroutine. -- gh-issue-101765: Fix SystemError / segmentation fault in iter - ``__reduce__`` when internal access of ``builtins.__dict__`` keys mutates - the iter object. +- gh-101765: Fix SystemError / segmentation fault in iter ``__reduce__`` + when internal access of ``builtins.__dict__`` keys mutates the iter + object. -- gh-issue-101430: Update :mod:`tracemalloc` to handle presize of object - properly. Patch by Donghee Na. +- gh-101430: Update :mod:`tracemalloc` to handle presize of object properly. + Patch by Donghee Na. -- gh-issue-101696: Invalidate type version tag in ``_PyStaticType_Dealloc`` - for static types, avoiding bug where a false cache hit could crash the +- gh-101696: Invalidate type version tag in ``_PyStaticType_Dealloc`` for + static types, avoiding bug where a false cache hit could crash the interpreter. Patch by Kumar Aditya. -- gh-issue-101632: Adds a new :opcode:`RETURN_CONST` instruction. +- gh-101632: Adds a new :opcode:`RETURN_CONST` instruction. -- gh-issue-100719: Remove gi_code field from generator (and coroutine and - async generator) objects as it is redundant. The frame already includes a +- gh-100719: Remove gi_code field from generator (and coroutine and async + generator) objects as it is redundant. The frame already includes a reference to the code object. -- gh-issue-98627: When an interpreter is configured to check (and only - then), importing an extension module will now fail when the extension does - not support multiple interpreters (i.e. doesn't implement PEP 489 - multi-phase init). This does not apply to the main interpreter, nor to - subinterpreters created with ``Py_NewInterpreter()``. +- gh-98627: When an interpreter is configured to check (and only then), + importing an extension module will now fail when the extension does not + support multiple interpreters (i.e. doesn't implement PEP 489 multi-phase + init). This does not apply to the main interpreter, nor to subinterpreters + created with ``Py_NewInterpreter()``. Library ------- -- gh-issue-102302: Micro-optimise hashing of :class:`inspect.Parameter`, - reducing the time it takes to hash an instance by around 40%. +- gh-102302: Micro-optimise hashing of :class:`inspect.Parameter`, reducing + the time it takes to hash an instance by around 40%. -- gh-issue-101979: Fix a bug where parentheses in the ``metavar`` argument - to :meth:`argparse.ArgumentParser.add_argument` were dropped. Patch by - Yeojin Kim. +- gh-101979: Fix a bug where parentheses in the ``metavar`` argument to + :meth:`argparse.ArgumentParser.add_argument` were dropped. Patch by Yeojin + Kim. -- gh-issue-91038: :meth:`platform.platform` now has boolean default - arguments. +- gh-91038: :meth:`platform.platform` now has boolean default arguments. -- gh-issue-81652: Add :const:`mmap.MAP_ALIGNED_SUPER` FreeBSD and +- gh-81652: Add :const:`mmap.MAP_ALIGNED_SUPER` FreeBSD and :const:`mmap.MAP_CONCEAL` OpenBSD constants to :mod:`mmap`. Patch by Yeojin Kim. -- gh-issue-102179: Fix :func:`os.dup2` error message for negative fds. +- gh-102179: Fix :func:`os.dup2` error message for negative fds. -- gh-issue-101961: For the binary mode, :func:`fileinput.hookcompressed` - doesn't set the ``encoding`` value even if the value is ``None``. Patch by - Gihwan Kim. +- gh-101961: For the binary mode, :func:`fileinput.hookcompressed` doesn't + set the ``encoding`` value even if the value is ``None``. Patch by Gihwan + Kim. -- gh-issue-101936: The default value of ``fp`` becomes :class:`io.BytesIO` - if :exc:`~urllib.error.HTTPError` is initialized without a designated - ``fp`` parameter. Patch by Long Vo. +- gh-101936: The default value of ``fp`` becomes :class:`io.BytesIO` if + :exc:`~urllib.error.HTTPError` is initialized without a designated ``fp`` + parameter. Patch by Long Vo. -- gh-issue-101566: In zipfile, sync Path with `zipp 3.14 +- gh-101566: In zipfile, sync Path with `zipp 3.14 `_, including fix for extractall on the underlying zipfile after being wrapped in ``Path``. -- gh-issue-97930: Apply changes from `importlib_resources 5.12 +- gh-97930: Apply changes from `importlib_resources 5.12 `_, including fix for ``MultiplexedPath`` to support directories in multiple namespaces (python/importlib_resources#265). -- gh-issue-101997: Upgrade pip wheel bundled with ensurepip (pip 23.0.1) +- gh-101997: Upgrade pip wheel bundled with ensurepip (pip 23.0.1) -- gh-issue-99108: The built-in extension modules for :mod:`hashlib` SHA2 +- gh-99108: The built-in extension modules for :mod:`hashlib` SHA2 algorithms, used when OpenSSL does not provide them, now live in a single internal ``_sha2`` module instead of separate ``_sha256`` and ``_sha512`` modules. -- gh-issue-101892: Callable iterators no longer raise :class:`SystemError` - when the callable object exhausts the iterator but forgets to either - return a sentinel value or raise :class:`StopIteration`. +- gh-101892: Callable iterators no longer raise :class:`SystemError` when + the callable object exhausts the iterator but forgets to either return a + sentinel value or raise :class:`StopIteration`. -- gh-issue-87634: Remove locking behavior from - :func:`functools.cached_property`. +- gh-87634: Remove locking behavior from :func:`functools.cached_property`. -- gh-issue-97786: Fix potential undefined behaviour in corner cases of +- gh-97786: Fix potential undefined behaviour in corner cases of floating-point-to-time conversions. -- gh-issue-101517: Fixed bug where :mod:`bdb` looks up the source line with +- gh-101517: Fixed bug where :mod:`bdb` looks up the source line with :mod:`linecache` with a ``lineno=None``, which causes it to fail with an unhandled exception. -- gh-issue-101773: Optimize :class:`fractions.Fraction` for small - components. The private argument ``_normalize`` of the - :class:`fractions.Fraction` constructor has been removed. +- gh-101773: Optimize :class:`fractions.Fraction` for small components. The + private argument ``_normalize`` of the :class:`fractions.Fraction` + constructor has been removed. -- gh-issue-101693: In :meth:`sqlite3.Cursor.execute`, - :exc:`DeprecationWarning` is now emitted when :ref:`named placeholders - ` are used together with parameters supplied as a - :term:`sequence` instead of as a :class:`dict`. Starting from Python 3.14, - using named placeholders with parameters supplied as a sequence will raise - a :exc:`~sqlite3.ProgrammingError`. Patch by Erlend E. Aasland. +- gh-101693: In :meth:`sqlite3.Cursor.execute`, :exc:`DeprecationWarning` is + now emitted when :ref:`named placeholders ` are used + together with parameters supplied as a :term:`sequence` instead of as a + :class:`dict`. Starting from Python 3.14, using named placeholders with + parameters supplied as a sequence will raise a + :exc:`~sqlite3.ProgrammingError`. Patch by Erlend E. Aasland. -- gh-issue-101446: Change repr of :class:`collections.OrderedDict` to use - regular dictionary formatting instead of pairs of keys and values. +- gh-101446: Change repr of :class:`collections.OrderedDict` to use regular + dictionary formatting instead of pairs of keys and values. -- gh-issue-101362: Speed up :class:`pathlib.PurePath` construction by - handling arguments more uniformly. When a :class:`pathlib.Path` argument - is supplied, we use its string representation rather than joining its - parts with :func:`os.path.join`. +- gh-101362: Speed up :class:`pathlib.PurePath` construction by handling + arguments more uniformly. When a :class:`pathlib.Path` argument is + supplied, we use its string representation rather than joining its parts + with :func:`os.path.join`. -- gh-issue-101362: Speed up :class:`pathlib.PurePath` construction by - calling :func:`os.path.join` only when two or more arguments are given. +- gh-101362: Speed up :class:`pathlib.PurePath` construction by calling + :func:`os.path.join` only when two or more arguments are given. -- gh-issue-101362: Speed up :class:`pathlib.Path` construction by running - the path flavour compatibility check only when pathlib is imported. +- gh-101362: Speed up :class:`pathlib.Path` construction by running the path + flavour compatibility check only when pathlib is imported. -- gh-issue-85984: Refactored the implementation of :func:`pty.fork` to use +- gh-85984: Refactored the implementation of :func:`pty.fork` to use :func:`os.login_tty`. A :exc:`DeprecationWarning` is now raised by ``pty.master_open()`` and ``pty.slave_open()``. They were undocumented and deprecated long long ago in the docstring in favor of :func:`pty.openpty`. -- gh-issue-101561: Add a new decorator :func:`typing.override`. See - :pep:`698` for details. Patch by Steven Troxler. +- gh-101561: Add a new decorator :func:`typing.override`. See :pep:`698` for + details. Patch by Steven Troxler. -- gh-issue-63301: Set exit code when :mod:`tabnanny` CLI exits on error. +- gh-63301: Set exit code when :mod:`tabnanny` CLI exits on error. -- gh-issue-101360: Fix anchor matching in - :meth:`pathlib.PureWindowsPath.match`. Path and pattern anchors are now - matched with :mod:`fnmatch`, just like other path parts. This allows - patterns such as ``"*:/Users/*"`` to be matched. +- gh-101360: Fix anchor matching in :meth:`pathlib.PureWindowsPath.match`. + Path and pattern anchors are now matched with :mod:`fnmatch`, just like + other path parts. This allows patterns such as ``"*:/Users/*"`` to be + matched. -- gh-issue-101277: Remove global state from :mod:`itertools` module - (:pep:`687`). Patches by Erlend E. Aasland. +- gh-101277: Remove global state from :mod:`itertools` module (:pep:`687`). + Patches by Erlend E. Aasland. -- gh-issue-100809: Fix handling of drive-relative paths (like 'C:' and - 'C:foo') in :meth:`pathlib.Path.absolute`. This method now uses the OS API - to retrieve the correct current working directory for the drive. +- gh-100809: Fix handling of drive-relative paths (like 'C:' and 'C:foo') in + :meth:`pathlib.Path.absolute`. This method now uses the OS API to retrieve + the correct current working directory for the drive. -- gh-issue-99138: Apply :pep:`687` to :mod:`zoneinfo`. Patch by Erlend E. - Aasland. +- gh-99138: Apply :pep:`687` to :mod:`zoneinfo`. Patch by Erlend E. Aasland. -- gh-issue-96764: :func:`asyncio.wait_for` now uses :func:`asyncio.timeout` - as its underlying implementation. Patch by Kumar Aditya. +- gh-96764: :func:`asyncio.wait_for` now uses :func:`asyncio.timeout` as its + underlying implementation. Patch by Kumar Aditya. -- gh-issue-88233: Correctly preserve "extra" fields in ``zipfile`` - regardless of their ordering relative to a zip64 "extra." +- gh-88233: Correctly preserve "extra" fields in ``zipfile`` regardless of + their ordering relative to a zip64 "extra." - bpo-23224: Fix segfaults when creating :class:`lzma.LZMADecompressor` and :class:`bz2.BZ2Decompressor` objects without calling ``__init__()``, and @@ -4405,21 +5344,21 @@ Library Documentation ------------- -- gh-issue-85417: Update :mod:`cmath` documentation to clarify behaviour on - branch cuts. +- gh-85417: Update :mod:`cmath` documentation to clarify behaviour on branch + cuts. -- gh-issue-97725: Fix :meth:`asyncio.Task.print_stack` description for +- gh-97725: Fix :meth:`asyncio.Task.print_stack` description for ``file=None``. Patch by Oleg Iarygin. Tests ----- -- gh-issue-102019: Fix deadlock on shutdown if - ``test_current_{exception,frames}`` fails. Patch by Jacob Bower. +- gh-102019: Fix deadlock on shutdown if ``test_current_{exception,frames}`` + fails. Patch by Jacob Bower. -- gh-issue-85984: Utilize new "winsize" functions from termios in pty tests. +- gh-85984: Utilize new "winsize" functions from termios in pty tests. -- gh-issue-89792: ``test_tools`` now copies up to 10x less source data to a +- gh-89792: ``test_tools`` now copies up to 10x less source data to a temporary directory during the ``freeze`` test by ignoring git metadata and other artifacts. It also limits its python build parallelism based on os.cpu_count instead of hard coding it as 8 cores. @@ -4427,62 +5366,61 @@ Tests Build ----- -- gh-issue-99942: On Android, in a static build, python-config in embed mode - no longer incorrectly reports a library to link to. +- gh-99942: On Android, in a static build, python-config in embed mode no + longer incorrectly reports a library to link to. -- gh-issue-99942: On Android, python.pc now correctly reports the library to - link to, the same as python-config.sh. +- gh-99942: On Android, python.pc now correctly reports the library to link + to, the same as python-config.sh. -- gh-issue-100221: Fix creating install directories in ``make - sharedinstall`` if they exist outside ``DESTDIR`` already. +- gh-100221: Fix creating install directories in ``make sharedinstall`` if + they exist outside ``DESTDIR`` already. -- gh-issue-96821: Explicitly mark C extension modules that need defined - signed integer overflow, and add a configure option +- gh-96821: Explicitly mark C extension modules that need defined signed + integer overflow, and add a configure option :option:`--with-strict-overflow`. Patch by Matthias Görgens and Shantanu Jain. Windows ------- -- gh-issue-102344: Implement ``winreg.QueryValue`` using ``QueryValueEx`` - and ``winreg.SetValue`` using ``SetValueEx``. Patch by Max Bachmann. +- gh-102344: Implement ``winreg.QueryValue`` using ``QueryValueEx`` and + ``winreg.SetValue`` using ``SetValueEx``. Patch by Max Bachmann. -- gh-issue-101881: Handle read and write operations on non-blocking pipes - properly on Windows. +- gh-101881: Handle read and write operations on non-blocking pipes properly + on Windows. -- gh-issue-101881: Add support for the os.get_blocking() and - os.set_blocking() functions on Windows. +- gh-101881: Add support for the os.get_blocking() and os.set_blocking() + functions on Windows. -- gh-issue-101849: Ensures installer will correctly upgrade existing - ``py.exe`` launcher installs. +- gh-101849: Ensures installer will correctly upgrade existing ``py.exe`` + launcher installs. -- gh-issue-101763: Updates copy of libffi bundled with Windows installs to - 3.4.4. +- gh-101763: Updates copy of libffi bundled with Windows installs to 3.4.4. -- gh-issue-101759: Update Windows installer to SQLite 3.40.1. +- gh-101759: Update Windows installer to SQLite 3.40.1. -- gh-issue-101614: Correctly handle extensions built against debug binaries - that reference ``python3_d.dll``. +- gh-101614: Correctly handle extensions built against debug binaries that + reference ``python3_d.dll``. -- gh-issue-101196: The functions ``os.path.isdir``, ``os.path.isfile``, +- gh-101196: The functions ``os.path.isdir``, ``os.path.isfile``, ``os.path.islink`` and ``os.path.exists`` are now 13% to 28% faster on Windows, by making fewer Win32 API calls. macOS ----- -- gh-issue-101759: Update macOS installer to SQLite 3.40.1. +- gh-101759: Update macOS installer to SQLite 3.40.1. C API ----- -- gh-issue-101907: Removes use of non-standard C++ extension in public - header files. +- gh-101907: Removes use of non-standard C++ extension in public header + files. -- gh-issue-99293: Document that the Py_TPFLAGS_VALID_VERSION_TAG is an - internal feature, should not be used, and will be removed. +- gh-99293: Document that the Py_TPFLAGS_VALID_VERSION_TAG is an internal + feature, should not be used, and will be removed. -- gh-issue-101578: Add :c:func:`PyErr_GetRaisedException` and +- gh-101578: Add :c:func:`PyErr_GetRaisedException` and :c:func:`PyErr_SetRaisedException` for saving and restoring the current exception. These functions return and accept a single exception object, rather than the triple arguments of the now-deprecated @@ -4493,7 +5431,7 @@ C API convenience functions for retrieving and modifying the :attr:`~BaseException.args` passed to the exception's constructor. -- gh-issue-91744: Introduced the *Unstable C API tier*, marking APi that is +- gh-91744: Introduced the *Unstable C API tier*, marking APi that is allowed to change in minor releases without a deprecation period. See :pep:`689` for details. @@ -4506,8 +5444,8 @@ What's New in Python 3.12.0 alpha 5? Security -------- -- gh-issue-99108: Replace the builtin :mod:`hashlib` implementations of - SHA2-224 and SHA2-256 originally from LibTomCrypt with formally verified, +- gh-99108: Replace the builtin :mod:`hashlib` implementations of SHA2-224 + and SHA2-256 originally from LibTomCrypt with formally verified, side-channel resistant code from the `HACL* `_ project. The builtins remain a fallback only used when OpenSSL does not provide them. @@ -4515,64 +5453,63 @@ Security Core and Builtins ----------------- -- gh-issue-92173: Fix the ``defs`` and ``kwdefs`` arguments to +- gh-92173: Fix the ``defs`` and ``kwdefs`` arguments to :c:func:`PyEval_EvalCodeEx` and a reference leak in that function. -- gh-issue-59956: The GILState API is now partially compatible with +- gh-59956: The GILState API is now partially compatible with subinterpreters. Previously, ``PyThreadState_GET()`` and ``PyGILState_GetThisThreadState()`` would get out of sync, causing inconsistent behavior and crashes. -- gh-issue-101400: Fix wrong lineno in exception message on - :keyword:`continue` or :keyword:`break` which are not in a loop. Patch by - Donghee Na. +- gh-101400: Fix wrong lineno in exception message on :keyword:`continue` or + :keyword:`break` which are not in a loop. Patch by Donghee Na. -- gh-issue-101372: Fix :func:`~unicodedata.is_normalized` to properly handle - the UCD 3.2.0 cases. Patch by Donghee Na. +- gh-101372: Fix :func:`~unicodedata.is_normalized` to properly handle the + UCD 3.2.0 cases. Patch by Donghee Na. -- gh-issue-101266: Fix :func:`sys.getsizeof` reporting for :class:`int` +- gh-101266: Fix :func:`sys.getsizeof` reporting for :class:`int` subclasses. -- gh-issue-101291: Refactor the ``PyLongObject`` struct into a normal Python +- gh-101291: Refactor the ``PyLongObject`` struct into a normal Python object header and a ``PyLongValue`` struct. -- gh-issue-101046: Fix a possible memory leak in the parser when raising +- gh-101046: Fix a possible memory leak in the parser when raising :exc:`MemoryError`. Patch by Pablo Galindo -- gh-issue-101037: Fix potential memory underallocation issue for instances - of :class:`int` subclasses with value zero. +- gh-101037: Fix potential memory underallocation issue for instances of + :class:`int` subclasses with value zero. -- gh-issue-100762: Record the (virtual) exception block depth in the oparg - of :opcode:`YIELD_VALUE`. Use this to avoid the expensive ``throw()`` when +- gh-100762: Record the (virtual) exception block depth in the oparg of + :opcode:`YIELD_VALUE`. Use this to avoid the expensive ``throw()`` when closing generators (and coroutines) that can be closed trivially. -- gh-issue-100982: Adds a new :opcode:`COMPARE_AND_BRANCH` instruction. This - is a bit more efficient when performing a comparison immediately followed - by a branch, and restores the design intent of PEP 659 that - specializations are local to a single instruction. +- gh-100982: Adds a new :opcode:`COMPARE_AND_BRANCH` instruction. This is a + bit more efficient when performing a comparison immediately followed by a + branch, and restores the design intent of PEP 659 that specializations are + local to a single instruction. -- gh-issue-100942: Fixed segfault in property.getter/setter/deleter that - occurred when a property subclass overrode the ``__new__`` method to - return a non-property instance. +- gh-100942: Fixed segfault in property.getter/setter/deleter that occurred + when a property subclass overrode the ``__new__`` method to return a + non-property instance. -- gh-issue-100923: Remove the ``mask`` cache entry for the - :opcode:`COMPARE_OP` instruction and embed the mask into the oparg. +- gh-100923: Remove the ``mask`` cache entry for the :opcode:`COMPARE_OP` + instruction and embed the mask into the oparg. -- gh-issue-100892: Fix race while iterating over thread states in clearing +- gh-100892: Fix race while iterating over thread states in clearing :class:`threading.local`. Patch by Kumar Aditya. -- gh-issue-91351: Fix a case where re-entrant imports could corrupt the - import deadlock detection code and cause a :exc:`KeyError` to be raised - out of :mod:`importlib/_bootstrap`. In addition to the straightforward - cases, this could also happen when garbage collection leads to a warning - being emitted -- as happens when it collects an open socket or file) +- gh-91351: Fix a case where re-entrant imports could corrupt the import + deadlock detection code and cause a :exc:`KeyError` to be raised out of + :mod:`importlib/_bootstrap`. In addition to the straightforward cases, + this could also happen when garbage collection leads to a warning being + emitted -- as happens when it collects an open socket or file) -- gh-issue-100726: Optimize construction of ``range`` object for medium size +- gh-100726: Optimize construction of ``range`` object for medium size integers. -- gh-issue-100712: Added option to build cpython with specialization - disabled, by setting ``ENABLE_SPECIALIZATION=False`` in :mod:`opcode`, - followed by ``make regen-all``. +- gh-100712: Added option to build cpython with specialization disabled, by + setting ``ENABLE_SPECIALIZATION=False`` in :mod:`opcode`, followed by + ``make regen-all``. - bpo-32780: Inter-field padding is now inserted into the PEP3118 format strings obtained from :class:`ctypes.Structure` objects, reflecting their @@ -4581,63 +5518,63 @@ Core and Builtins Library ------- -- gh-issue-101541: [Enum] - fix psuedo-flag creation +- gh-101541: [Enum] - fix psuedo-flag creation -- gh-issue-101570: Upgrade pip wheel bundled with ensurepip (pip 23.0) +- gh-101570: Upgrade pip wheel bundled with ensurepip (pip 23.0) -- gh-issue-101323: Fix a bug where errors where not thrown by +- gh-101323: Fix a bug where errors where not thrown by zlib._ZlibDecompressor if encountered during decompressing. -- gh-issue-101317: Add *ssl_shutdown_timeout* parameter for +- gh-101317: Add *ssl_shutdown_timeout* parameter for :meth:`asyncio.StreamWriter.start_tls`. -- gh-issue-101326: Fix regression when passing ``None`` as second or third +- gh-101326: Fix regression when passing ``None`` as second or third argument to ``FutureIter.throw``. -- gh-issue-92123: Adapt the ``_elementtree`` extension module to multi-phase - init (:pep:`489`). Patches by Erlend E. Aasland. +- gh-92123: Adapt the ``_elementtree`` extension module to multi-phase init + (:pep:`489`). Patches by Erlend E. Aasland. -- gh-issue-100795: Avoid potential unexpected ``freeaddrinfo`` call (double - free) in :mod:`socket` when when a libc ``getaddrinfo()`` implementation - leaves garbage in an output pointer when returning an error. Original - patch by Sergey G. Brester. +- gh-100795: Avoid potential unexpected ``freeaddrinfo`` call (double free) + in :mod:`socket` when when a libc ``getaddrinfo()`` implementation leaves + garbage in an output pointer when returning an error. Original patch by + Sergey G. Brester. -- gh-issue-101143: Remove unused references to :class:`~asyncio.TimerHandle` - in ``asyncio.base_events.BaseEventLoop._add_callback``. +- gh-101143: Remove unused references to :class:`~asyncio.TimerHandle` in + ``asyncio.base_events.BaseEventLoop._add_callback``. -- gh-issue-101144: Make :func:`zipfile.Path.open` and +- gh-101144: Make :func:`zipfile.Path.open` and :func:`zipfile.Path.read_text` also accept ``encoding`` as a positional argument. This was the behavior in Python 3.9 and earlier. 3.10 introduced a regression where supplying it as a positional argument would lead to a :exc:`TypeError`. -- gh-issue-94518: Group-related variables of ``_posixsubprocess`` module are +- gh-94518: Group-related variables of ``_posixsubprocess`` module are renamed to stress that supplimentary group affinity is added to a fork, not replace the inherited ones. Patch by Oleg Iarygin. -- gh-issue-101015: Fix :func:`typing.get_type_hints` on ``'*tuple[...]'`` - and ``*tuple[...]``. It must not drop the ``Unpack`` part. +- gh-101015: Fix :func:`typing.get_type_hints` on ``'*tuple[...]'`` and + ``*tuple[...]``. It must not drop the ``Unpack`` part. -- gh-issue-101000: Add :func:`os.path.splitroot()`, which splits a path into - a 3-item tuple ``(drive, root, tail)``. This new function is used by +- gh-101000: Add :func:`os.path.splitroot`, which splits a path into a + 3-item tuple ``(drive, root, tail)``. This new function is used by :mod:`pathlib` to improve the performance of path construction by up to a third. -- gh-issue-100573: Fix a Windows :mod:`asyncio` bug with named pipes where a +- gh-100573: Fix a Windows :mod:`asyncio` bug with named pipes where a client doing ``os.stat()`` on the pipe would cause an error in the server that disabled serving future requests. -- gh-issue-39615: :func:`warnings.warn` now has the ability to skip stack - frames based on code filename prefix rather than only a numeric - ``stacklevel`` via the new ``skip_file_prefixes`` keyword argument. +- gh-39615: :func:`warnings.warn` now has the ability to skip stack frames + based on code filename prefix rather than only a numeric ``stacklevel`` + via the new ``skip_file_prefixes`` keyword argument. -- gh-issue-100750: pass encoding kwarg to subprocess in platform +- gh-100750: pass encoding kwarg to subprocess in platform -- gh-issue-100160: Emit a deprecation warning in +- gh-100160: Emit a deprecation warning in :meth:`asyncio.DefaultEventLoopPolicy.get_event_loop` if there is no current event loop set and it decides to create one. -- gh-issue-96290: Fix handling of partial and invalid UNC drives in +- gh-96290: Fix handling of partial and invalid UNC drives in ``ntpath.splitdrive()``, and in ``ntpath.normpath()`` on non-Windows systems. Paths such as '\\server' and '\\' are now considered by ``splitdrive()`` to contain only a drive, and consequently are not @@ -4645,28 +5582,27 @@ Library ``normpath()`` on Windows systems is unaffected, as native OS APIs are used. Patch by Eryk Sun, with contributions by Barney Gale. -- gh-issue-99952: Fix a reference undercounting issue in - :class:`ctypes.Structure` with ``from_param()`` results larger than a C - pointer. +- gh-99952: Fix a reference undercounting issue in :class:`ctypes.Structure` + with ``from_param()`` results larger than a C pointer. -- gh-issue-67790: Add float-style formatting support for +- gh-67790: Add float-style formatting support for :class:`fractions.Fraction` instances. -- gh-issue-99266: Preserve more detailed error messages in :mod:`ctypes`. +- gh-99266: Preserve more detailed error messages in :mod:`ctypes`. -- gh-issue-86682: Ensure runtime-created collections have the correct module - name using the newly added (internal) :func:`sys._getframemodulename`. +- gh-86682: Ensure runtime-created collections have the correct module name + using the newly added (internal) :func:`sys._getframemodulename`. -- gh-issue-88597: :mod:`uuid` now has a command line interface. Try ``python - -m uuid -h``. +- gh-88597: :mod:`uuid` now has a command line interface. Try ``python -m + uuid -h``. -- gh-issue-60580: :data:`ctypes.wintypes.BYTE` definition changed from +- gh-60580: :data:`ctypes.wintypes.BYTE` definition changed from :data:`~ctypes.c_byte` to :data:`~ctypes.c_ubyte` to match Windows SDK. Patch by Anatoly Techtonik and Oleg Iarygin. -- gh-issue-94518: ``_posixsubprocess`` now initializes all UID and GID - variables using a reserved ``-1`` value instead of a separate flag. Patch - by Oleg Iarygin. +- gh-94518: ``_posixsubprocess`` now initializes all UID and GID variables + using a reserved ``-1`` value instead of a separate flag. Patch by Oleg + Iarygin. - bpo-38941: The :mod:`xml.etree.ElementTree` module now emits :exc:`DeprecationWarning` when testing the truth value of an @@ -4679,7 +5615,7 @@ Library - bpo-29847: Fix a bug where :class:`pathlib.Path` accepted and ignored keyword arguments. Patch provided by Yurii Karabas. -- gh-issue-77772: :class:`ctypes.CDLL`, :class:`ctypes.OleDLL`, +- gh-77772: :class:`ctypes.CDLL`, :class:`ctypes.OleDLL`, :class:`ctypes.WinDLL`, and :class:`ctypes.PyDLL` now accept :term:`path-like objects ` as their ``name`` argument. Patch by Robert Hoelzl. @@ -4687,75 +5623,74 @@ Library Documentation ------------- -- gh-issue-88324: Reword :mod:`subprocess` to emphasize default behavior of +- gh-88324: Reword :mod:`subprocess` to emphasize default behavior of *stdin*, *stdout*, and *stderr* arguments. Remove inaccurate statement about child file handle inheritance. Tests ----- -- gh-issue-101334: ``test_tarfile`` has been updated to pass when run as a - high UID. +- gh-101334: ``test_tarfile`` has been updated to pass when run as a high + UID. Build ----- -- gh-issue-101282: Update BOLT configuration not to use deprecated usage of +- gh-101282: Update BOLT configuration not to use deprecated usage of ``--split functions``. Patch by Donghee Na. -- gh-issue-101522: Allow overriding Windows dependencies versions and paths - using MSBuild properties. +- gh-101522: Allow overriding Windows dependencies versions and paths using + MSBuild properties. -- gh-issue-77532: Minor fixes to allow building with - ``PlatformToolset=ClangCL`` on Windows. +- gh-77532: Minor fixes to allow building with ``PlatformToolset=ClangCL`` + on Windows. -- gh-issue-101152: In accordance with :PEP:`699`, the ``ma_version_tag`` - field in :c:type:`PyDictObject` is deprecated for extension modules. - Accessing this field will generate a compiler warning at compile time. - This field will be removed in Python 3.14. +- gh-101152: In accordance with :PEP:`699`, the ``ma_version_tag`` field in + :c:type:`PyDictObject` is deprecated for extension modules. Accessing this + field will generate a compiler warning at compile time. This field will be + removed in Python 3.14. -- gh-issue-100340: Allows -Wno-int-conversion for wasm-sdk 17 and onwards, - thus enables building WASI builds once against the latest sdk. +- gh-100340: Allows -Wno-int-conversion for wasm-sdk 17 and onwards, thus + enables building WASI builds once against the latest sdk. -- gh-issue-101060: Conditionally add ``-fno-reorder-blocks-and-partition`` - in configure. Effectively fixes ``--enable-bolt`` when using Clang, as - this appears to be a GCC-only flag. +- gh-101060: Conditionally add ``-fno-reorder-blocks-and-partition`` in + configure. Effectively fixes ``--enable-bolt`` when using Clang, as this + appears to be a GCC-only flag. -- gh-issue-98705: ``__bool__`` is defined in AIX system header files which - breaks the build in AIX, so undefine it. +- gh-98705: ``__bool__`` is defined in AIX system header files which breaks + the build in AIX, so undefine it. -- gh-issue-98636: Fix a regression in detecting ``gdbm_compat`` library for - the ``_gdbm`` module build. +- gh-98636: Fix a regression in detecting ``gdbm_compat`` library for the + ``_gdbm`` module build. -- gh-issue-96305: ``_aix_support`` now uses a simple code to get platform - details rather than the now non-existent ``_bootsubprocess`` during - bootstrap. +- gh-96305: ``_aix_support`` now uses a simple code to get platform details + rather than the now non-existent ``_bootsubprocess`` during bootstrap. Windows ------- -- gh-issue-101543: Ensure the install path in the registry is only used when - the standard library hasn't been located in any other way. +- gh-101543: Ensure the install path in the registry is only used when the + standard library hasn't been located in any other way. -- gh-issue-101467: The ``py.exe`` launcher now correctly filters when only a +- gh-101467: The ``py.exe`` launcher now correctly filters when only a single runtime is installed. It also correctly handles prefix matches on tags so that ``-3.1`` does not match ``3.11``, but would still match ``3.1-32``. -- gh-issue-99834: Updates bundled copy of Tcl/Tk to 8.6.13.0 +- gh-99834: Updates bundled copy of Tcl/Tk to 8.6.13.0 -- gh-issue-101135: Restore ability to launch older 32-bit versions from the +- gh-101135: Restore ability to launch older 32-bit versions from the :file:`py.exe` launcher when both 32-bit and 64-bit installs of the same version are available. -- gh-issue-82052: Fixed an issue where writing more than 32K of Unicode - output to the console screen in one go can result in mojibake. +- gh-82052: Fixed an issue where writing more than 32K of Unicode output to + the console screen in one go can result in mojibake. -- gh-issue-100320: Ensures the ``PythonPath`` registry key from an install - is used when launching from a different copy of Python that relies on an - existing install to provide a copy of its modules and standard library. +- gh-100320: Ensures the ``PythonPath`` registry key from an install is used + when launching from a different copy of Python that relies on an existing + install to provide a copy of its modules and standard library. -- gh-issue-100247: Restores support for the :file:`py.exe` launcher finding +- gh-100247: Restores support for the :file:`py.exe` launcher finding shebang commands in its configuration file using the full command name. @@ -4767,114 +5702,107 @@ What's New in Python 3.12.0 alpha 4? Core and Builtins ----------------- -- gh-issue-100776: Fix misleading default value in :func:`input`'s +- gh-100776: Fix misleading default value in :func:`input`'s ``__text_signature__``. -- gh-issue-99005: Remove :opcode:`!UNARY_POSITIVE`, - :opcode:`!ASYNC_GEN_WRAP` and :opcode:`!LIST_TO_TUPLE`, replacing them - with intrinsics. +- gh-99005: Remove :opcode:`!UNARY_POSITIVE`, :opcode:`!ASYNC_GEN_WRAP` and + :opcode:`!LIST_TO_TUPLE`, replacing them with intrinsics. -- gh-issue-99005: Add new :opcode:`CALL_INTRINSIC_1` instruction. Remove +- gh-99005: Add new :opcode:`CALL_INTRINSIC_1` instruction. Remove :opcode:`IMPORT_STAR`, :opcode:`PRINT_EXPR` and :opcode:`STOPITERATION_ERROR`, replacing them with the :opcode:`CALL_INTRINSIC_1` instruction. -- gh-issue-100288: Remove the LOAD_ATTR_METHOD_WITH_DICT specialized - instruction. Stats show it is not useful. +- gh-100288: Remove the LOAD_ATTR_METHOD_WITH_DICT specialized instruction. + Stats show it is not useful. -- gh-issue-100720: Added ``_PyFrame_NumSlotsForCodeObject``, which returns - the number of slots needed in a frame for a given code object. +- gh-100720: Added ``_PyFrame_NumSlotsForCodeObject``, which returns the + number of slots needed in a frame for a given code object. -- gh-issue-100719: Removed the co_nplaincellvars field from the code object, - as it is redundant. +- gh-100719: Removed the co_nplaincellvars field from the code object, as it + is redundant. -- gh-issue-100637: Fix :func:`int.__sizeof__` calculation to include the - 1-element ``ob_digit`` array for ``0`` and ``False``. +- gh-100637: Fix :func:`int.__sizeof__` calculation to include the 1-element + ``ob_digit`` array for ``0`` and ``False``. -- gh-issue-100649: Update the native_thread_id field of PyThreadState after - fork. +- gh-100649: Update the native_thread_id field of PyThreadState after fork. -- gh-issue-100126: Fix an issue where "incomplete" frames could be briefly - visible to C code while other frames are being torn down, possibly - resulting in corruption or hard crashes of the interpreter while running - finalizers. +- gh-100126: Fix an issue where "incomplete" frames could be briefly visible + to C code while other frames are being torn down, possibly resulting in + corruption or hard crashes of the interpreter while running finalizers. -- gh-issue-87447: Fix :exc:`SyntaxError` on comprehension rebind checking - with names that are not actually redefined. +- gh-87447: Fix :exc:`SyntaxError` on comprehension rebind checking with + names that are not actually redefined. Now reassigning ``b`` in ``[(b := 1) for a, b.prop in some_iter]`` is allowed. Reassigning ``a`` is still disallowed as per :pep:`572`. -- gh-issue-100268: Add :meth:`int.is_integer` to improve duck type - compatibility between :class:`int` and :class:`float`. +- gh-100268: Add :meth:`int.is_integer` to improve duck type compatibility + between :class:`int` and :class:`float`. -- gh-issue-100425: Improve the accuracy of ``sum()`` with compensated - summation. +- gh-100425: Improve the accuracy of ``sum()`` with compensated summation. -- gh-issue-100374: Fix incorrect result and delay in :func:`socket.getfqdn`. - Patch by Dominic Socular. +- gh-100374: Fix incorrect result and delay in :func:`socket.getfqdn`. Patch + by Dominic Socular. -- gh-issue-100357: Convert ``vars``, ``dir``, ``next``, ``getattr``, and - ``iter`` to argument clinic. +- gh-100357: Convert ``vars``, ``dir``, ``next``, ``getattr``, and ``iter`` + to argument clinic. -- gh-issue-100117: Improve the output of :meth:`codeobject.co_lines` by - emitting only one entry for each line range. +- gh-100117: Improve the output of :meth:`codeobject.co_lines` by emitting + only one entry for each line range. -- gh-issue-90043: Handle NaNs when specializing :opcode:`COMPARE_OP` for +- gh-90043: Handle NaNs when specializing :opcode:`COMPARE_OP` for :class:`float` values. -- gh-issue-100222: Redefine the ``_Py_CODEUNIT`` typedef as a union to - describe its layout to the C compiler, avoiding type punning and improving - clarity. +- gh-100222: Redefine the ``_Py_CODEUNIT`` typedef as a union to describe + its layout to the C compiler, avoiding type punning and improving clarity. -- gh-issue-99955: Internal compiler functions (in compile.c) now - consistently return -1 on error and 0 on success. +- gh-99955: Internal compiler functions (in compile.c) now consistently + return -1 on error and 0 on success. -- gh-issue-100188: The ``BINARY_SUBSCR_LIST_INT`` and - ``BINARY_SUBSCR_TUPLE_INT`` instructions are no longer used for negative - integers because those instructions always miss when encountering negative - integers. +- gh-100188: The ``BINARY_SUBSCR_LIST_INT`` and ``BINARY_SUBSCR_TUPLE_INT`` + instructions are no longer used for negative integers because those + instructions always miss when encountering negative integers. -- gh-issue-99110: Initialize frame->previous in frameobject.c to fix a +- gh-99110: Initialize frame->previous in frameobject.c to fix a segmentation fault when accessing frames created by :c:func:`PyFrame_New`. -- gh-issue-94155: Improved the hashing algorithm for code objects, - mitigating some hash collisions. +- gh-94155: Improved the hashing algorithm for code objects, mitigating some + hash collisions. -- gh-issue-99540: ``None`` now hashes to a constant value. This is not a +- gh-99540: ``None`` now hashes to a constant value. This is not a requirements change. -- gh-issue-100143: When built with ``--enable-pystats``, stats collection is - now off by default. To enable it early at startup, pass the ``-Xpystats`` +- gh-100143: When built with ``--enable-pystats``, stats collection is now + off by default. To enable it early at startup, pass the ``-Xpystats`` flag. Stats are now always dumped, even if switched off. -- gh-issue-100146: Improve ``BUILD_LIST`` opcode so that it works similarly - to the ``BUILD_TUPLE`` opcode, by stealing references from the stack - rather than repeatedly using stack operations to set list elements. - Implementation details are in a new private API - :c:func:`_PyList_FromArraySteal`. +- gh-100146: Improve ``BUILD_LIST`` opcode so that it works similarly to the + ``BUILD_TUPLE`` opcode, by stealing references from the stack rather than + repeatedly using stack operations to set list elements. Implementation + details are in a new private API :c:func:`!_PyList_FromArraySteal`. -- gh-issue-100110: Specialize ``FOR_ITER`` for tuples. +- gh-100110: Specialize ``FOR_ITER`` for tuples. -- gh-issue-100050: Honor existing errors obtained when searching for - mismatching parentheses in the tokenizer. Patch by Pablo Galindo +- gh-100050: Honor existing errors obtained when searching for mismatching + parentheses in the tokenizer. Patch by Pablo Galindo -- gh-issue-92216: Improve the performance of :func:`hasattr` for type - objects with a missing attribute. +- gh-92216: Improve the performance of :func:`hasattr` for type objects with + a missing attribute. -- gh-issue-99582: Freeze :mod:`zipimport` module into ``_bootstrap_python``. +- gh-99582: Freeze :mod:`zipimport` module into ``_bootstrap_python``. -- gh-issue-99554: Pack debugging location tables more efficiently during - bytecode compilation. +- gh-99554: Pack debugging location tables more efficiently during bytecode + compilation. -- gh-issue-98522: Add an internal version number to code objects, to give - better versioning of inner functions and comprehensions, and thus better +- gh-98522: Add an internal version number to code objects, to give better + versioning of inner functions and comprehensions, and thus better specialization of those functions. This change is invisible to both Python and C extensions. -- gh-issue-94603: Improve performance of ``list.pop`` for small lists. +- gh-94603: Improve performance of ``list.pop`` for small lists. -- gh-issue-89051: Add :const:`ssl.OP_LEGACY_SERVER_CONNECT` +- gh-89051: Add :const:`ssl.OP_LEGACY_SERVER_CONNECT` - bpo-32782: ``ctypes`` arrays of length 0 now report a correct itemsize when a ``memoryview`` is constructed from them, rather than always giving @@ -4883,178 +5811,171 @@ Core and Builtins Library ------- -- gh-issue-100833: Speed up :func:`math.fsum` by removing defensive - ``volatile`` qualifiers. +- gh-100833: Speed up :func:`math.fsum` by removing defensive ``volatile`` + qualifiers. -- gh-issue-100805: Modify :func:`random.choice` implementation to once again - work with NumPy arrays. +- gh-100805: Modify :func:`random.choice` implementation to once again work + with NumPy arrays. -- gh-issue-100813: Add :const:`socket.IP_PKTINFO` constant. +- gh-100813: Add :const:`socket.IP_PKTINFO` constant. -- gh-issue-100792: Make :meth:`email.message.Message.__contains__` twice as - fast. +- gh-100792: Make :meth:`email.message.Message.__contains__` twice as fast. -- gh-issue-91851: Microoptimizations for - :meth:`fractions.Fraction.__round__`, :meth:`fractions.Fraction.__ceil__` - and :meth:`fractions.Fraction.__floor__`. +- gh-91851: Microoptimizations for :meth:`fractions.Fraction.__round__`, + :meth:`fractions.Fraction.__ceil__` and + :meth:`fractions.Fraction.__floor__`. -- gh-issue-90104: Avoid RecursionError on ``repr`` if a dataclass field - definition has a cyclic reference. +- gh-90104: Avoid RecursionError on ``repr`` if a dataclass field definition + has a cyclic reference. -- gh-issue-100689: Fix crash in :mod:`pyexpat` by statically allocating +- gh-100689: Fix crash in :mod:`pyexpat` by statically allocating ``PyExpat_CAPI`` capsule. -- gh-issue-100740: Fix ``unittest.mock.Mock`` not respecting the spec for +- gh-100740: Fix ``unittest.mock.Mock`` not respecting the spec for attribute names prefixed with ``assert``. -- gh-issue-91219: Change ``SimpleHTTPRequestHandler`` to support subclassing - to provide a different set of index file names instead of using - ``__init__`` parameters. +- gh-91219: Change ``SimpleHTTPRequestHandler`` to support subclassing to + provide a different set of index file names instead of using ``__init__`` + parameters. -- gh-issue-100690: ``Mock`` objects which are not unsafe will now raise an +- gh-100690: ``Mock`` objects which are not unsafe will now raise an ``AttributeError`` when accessing an attribute that matches the name of an assertion but without the prefix ``assert_``, e.g. accessing ``called_once`` instead of ``assert_called_once``. This is in addition to this already happening for accessing attributes with prefixes ``assert``, ``assret``, ``asert``, ``aseert``, and ``assrt``. -- gh-issue-89727: Simplify and optimize :func:`os.walk` by using +- gh-89727: Simplify and optimize :func:`os.walk` by using :func:`isinstance` checks to check the top of the stack. -- gh-issue-100485: Add math.sumprod() to compute the sum of products. +- gh-100485: Add math.sumprod() to compute the sum of products. -- gh-issue-86508: Fix :func:`asyncio.open_connection` to skip binding to - local addresses of different family. Patch by Kumar Aditya. +- gh-86508: Fix :func:`asyncio.open_connection` to skip binding to local + addresses of different family. Patch by Kumar Aditya. -- gh-issue-97930: ``importlib.resources.files`` now accepts a module as an - anchor instead of only accepting packages. If a module is passed, - resources are resolved adjacent to that module (in the same package or at - the package root). The parameter was renamed from ``package`` to - ``anchor`` with a compatibility shim for those passing by keyword. - Additionally, the new ``anchor`` parameter is now optional and will - default to the caller's module. +- gh-97930: ``importlib.resources.files`` now accepts a module as an anchor + instead of only accepting packages. If a module is passed, resources are + resolved adjacent to that module (in the same package or at the package + root). The parameter was renamed from ``package`` to ``anchor`` with a + compatibility shim for those passing by keyword. Additionally, the new + ``anchor`` parameter is now optional and will default to the caller's + module. -- gh-issue-100585: Fixed a bug where importlib.resources.as_file was leaving - file pointers open +- gh-100585: Fixed a bug where importlib.resources.as_file was leaving file + pointers open -- gh-issue-100562: Improve performance of :meth:`pathlib.Path.absolute` by - nearly 2x. This comes at the cost of a performance regression in +- gh-100562: Improve performance of :meth:`pathlib.Path.absolute` by nearly + 2x. This comes at the cost of a performance regression in :meth:`pathlib.Path.cwd`, which is generally used less frequently in user code. -- gh-issue-100519: Small simplification of - :func:`http.cookiejar.eff_request_host` that improves readability and - better matches the RFC wording. +- gh-100519: Small simplification of :func:`http.cookiejar.eff_request_host` + that improves readability and better matches the RFC wording. -- gh-issue-100287: Fix the interaction of :func:`unittest.mock.seal` with +- gh-100287: Fix the interaction of :func:`unittest.mock.seal` with :class:`unittest.mock.AsyncMock`. -- gh-issue-100488: Add :meth:`Fraction.is_integer` to check whether a +- gh-100488: Add :meth:`Fraction.is_integer` to check whether a :class:`fractions.Fraction` is an integer. This improves duck type compatibility with :class:`float` and :class:`int`. -- gh-issue-100474: :mod:`http.server` now checks that an index page is - actually a regular file before trying to serve it. This avoids issues - with directories named ``index.html``. +- gh-100474: :mod:`http.server` now checks that an index page is actually a + regular file before trying to serve it. This avoids issues with + directories named ``index.html``. -- gh-issue-100363: Speed up :func:`asyncio.get_running_loop` by removing - redundant ``getpid`` checks. Patch by Kumar Aditya. +- gh-100363: Speed up :func:`asyncio.get_running_loop` by removing redundant + ``getpid`` checks. Patch by Kumar Aditya. -- gh-issue-78878: Fix crash when creating an instance of - :class:`!_ctypes.CField`. +- gh-78878: Fix crash when creating an instance of :class:`!_ctypes.CField`. -- gh-issue-100348: Fix ref cycle in - :class:`!asyncio._SelectorSocketTransport` by removing ``_read_ready_cb`` - in ``close``. +- gh-100348: Fix ref cycle in :class:`!asyncio._SelectorSocketTransport` by + removing ``_read_ready_cb`` in ``close``. -- gh-issue-100344: Provide C implementation for :func:`asyncio.current_task` - for a 4x-6x speedup. +- gh-100344: Provide C implementation for :func:`asyncio.current_task` for a + 4x-6x speedup. -- gh-issue-100272: Fix JSON serialization of OrderedDict. It now preserves - the order of keys. +- gh-100272: Fix JSON serialization of OrderedDict. It now preserves the + order of keys. -- gh-issue-83076: Instantiation of ``Mock()`` and ``AsyncMock()`` is now - 3.8x faster. +- gh-83076: Instantiation of ``Mock()`` and ``AsyncMock()`` is now 3.8x + faster. -- gh-issue-100234: Set a default value of 1.0 for the ``lambd`` parameter in +- gh-100234: Set a default value of 1.0 for the ``lambd`` parameter in random.expovariate(). -- gh-issue-100228: A :exc:`DeprecationWarning` may be raised when - :func:`os.fork()` or :func:`os.forkpty()` is called from multi-threaded - processes. Forking with threads is unsafe and can cause deadlocks, - crashes and subtle problems. Lack of a warning does not indicate that the - fork call was actually safe, as Python may not be aware of all threads. +- gh-100228: A :exc:`DeprecationWarning` may be raised when :func:`os.fork` + or :func:`os.forkpty` is called from multi-threaded processes. Forking + with threads is unsafe and can cause deadlocks, crashes and subtle + problems. Lack of a warning does not indicate that the fork call was + actually safe, as Python may not be aware of all threads. -- gh-issue-100039: Improve signatures for enums and flags. +- gh-100039: Improve signatures for enums and flags. -- gh-issue-100133: Fix regression in :mod:`asyncio` where a subprocess would +- gh-100133: Fix regression in :mod:`asyncio` where a subprocess would sometimes lose data received from pipe. - bpo-44592: Fixes inconsistent handling of case sensitivity of *extrasaction* arg in :class:`csv.DictWriter`. -- gh-issue-100098: Fix ``tuple`` subclasses being cast to ``tuple`` when - used as enum values. +- gh-100098: Fix ``tuple`` subclasses being cast to ``tuple`` when used as + enum values. -- gh-issue-85432: Rename the *fmt* parameter of the pure-Python - implementation of :meth:`datetime.time.strftime` to *format*. Rename the - *t* parameter of :meth:`datetime.datetime.fromtimestamp` to *timestamp*. - These changes mean the parameter names in the pure-Python implementation - now match the parameter names in the C implementation. Patch by Alex - Waygood. +- gh-85432: Rename the *fmt* parameter of the pure-Python implementation of + :meth:`datetime.time.strftime` to *format*. Rename the *t* parameter of + :meth:`datetime.datetime.fromtimestamp` to *timestamp*. These changes mean + the parameter names in the pure-Python implementation now match the + parameter names in the C implementation. Patch by Alex Waygood. -- gh-issue-98778: Update :exc:`~urllib.error.HTTPError` to be initialized +- gh-98778: Update :exc:`~urllib.error.HTTPError` to be initialized properly, even if the ``fp`` is ``None``. Patch by Donghee Na. -- gh-issue-99925: Unify error messages in JSON serialization between +- gh-99925: Unify error messages in JSON serialization between ``json.dumps(float('nan'), allow_nan=False)`` and ``json.dumps(float('nan'), allow_nan=False, indent=)``. Now both include the representation of the value that could not be serialized. -- gh-issue-89727: Fix issue with :func:`os.walk` where a - :exc:`RecursionError` would occur on deep directory structures by - adjusting the implementation of :func:`os.walk` to be iterative instead of - recursive. +- gh-89727: Fix issue with :func:`os.walk` where a :exc:`RecursionError` + would occur on deep directory structures by adjusting the implementation + of :func:`os.walk` to be iterative instead of recursive. -- gh-issue-94943: Add :ref:`enum-dataclass-support` to the - :class:`~enum.Enum` :meth:`~enum.Enum.__repr__`. When inheriting from a +- gh-94943: Add :ref:`enum-dataclass-support` to the :class:`~enum.Enum` + :meth:`~enum.Enum.__repr__`. When inheriting from a :class:`~dataclasses.dataclass`, only show the field names in the value section of the member :func:`repr`, and not the dataclass' class name. -- gh-issue-83035: Fix :func:`inspect.getsource` handling of decorator calls - with nested parentheses. +- gh-83035: Fix :func:`inspect.getsource` handling of decorator calls with + nested parentheses. -- gh-issue-99576: Fix ``.save()`` method for ``LWPCookieJar`` and +- gh-99576: Fix ``.save()`` method for ``LWPCookieJar`` and ``MozillaCookieJar``: saved file was not truncated on repeated save. -- gh-issue-94912: Add :func:`inspect.markcoroutinefunction` decorator which +- gh-94912: Add :func:`inspect.markcoroutinefunction` decorator which manually marks a function as a coroutine for the benefit of :func:`iscoroutinefunction`. -- gh-issue-99509: Add :pep:`585` support for +- gh-99509: Add :pep:`585` support for :class:`multiprocessing.queues.Queue`. -- gh-issue-99482: Remove ``Jython`` partial compatibility code from several - stdlib modules. +- gh-99482: Remove ``Jython`` partial compatibility code from several stdlib + modules. -- gh-issue-99433: Fix :mod:`doctest` failure on - :class:`types.MethodWrapperType` in modules. +- gh-99433: Fix :mod:`doctest` failure on :class:`types.MethodWrapperType` + in modules. -- gh-issue-85267: Several improvements to :func:`inspect.signature`'s - handling of ``__text_signature``. - Fixes a case where - :func:`inspect.signature` dropped parameters - Fixes a case where - :func:`inspect.signature` raised :exc:`tokenize.TokenError` - Allows - :func:`inspect.signature` to understand defaults involving binary - operations of constants - :func:`inspect.signature` is documented as only - raising :exc:`TypeError` or :exc:`ValueError`, but sometimes raised - :exc:`RuntimeError`. These cases now raise :exc:`ValueError` - Removed a - dead code path +- gh-85267: Several improvements to :func:`inspect.signature`'s handling of + ``__text_signature``. - Fixes a case where :func:`inspect.signature` + dropped parameters - Fixes a case where :func:`inspect.signature` raised + :exc:`tokenize.TokenError` - Allows :func:`inspect.signature` to + understand defaults involving binary operations of constants - + :func:`inspect.signature` is documented as only raising :exc:`TypeError` + or :exc:`ValueError`, but sometimes raised :exc:`RuntimeError`. These + cases now raise :exc:`ValueError` - Removed a dead code path -- gh-issue-91166: :mod:`asyncio` is optimized to avoid excessive copying - when writing to socket and use :meth:`~socket.socket.sendmsg` if the - platform supports it. Patch by Kumar Aditya. +- gh-91166: :mod:`asyncio` is optimized to avoid excessive copying when + writing to socket and use :meth:`~socket.socket.sendmsg` if the platform + supports it. Patch by Kumar Aditya. -- gh-issue-98030: Add missing TCP socket options from Linux: ``TCP_MD5SIG``, +- gh-98030: Add missing TCP socket options from Linux: ``TCP_MD5SIG``, ``TCP_THIN_LINEAR_TIMEOUTS``, ``TCP_THIN_DUPACK``, ``TCP_REPAIR``, ``TCP_REPAIR_QUEUE``, ``TCP_QUEUE_SEQ``, ``TCP_REPAIR_OPTIONS``, ``TCP_TIMESTAMP``, ``TCP_CC_INFO``, ``TCP_SAVE_SYN``, ``TCP_SAVED_SYN``, @@ -5062,28 +5983,28 @@ Library ``TCP_MD5SIG_EXT``, ``TCP_FASTOPEN_KEY``, ``TCP_FASTOPEN_NO_COOKIE``, ``TCP_ZEROCOPY_RECEIVE``, ``TCP_INQ``, ``TCP_TX_DELAY``. -- gh-issue-88500: Reduced the memory usage of :func:`urllib.parse.unquote` - and :func:`urllib.parse.unquote_to_bytes` on large values. +- gh-88500: Reduced the memory usage of :func:`urllib.parse.unquote` and + :func:`urllib.parse.unquote_to_bytes` on large values. -- gh-issue-96127: ``inspect.signature`` was raising ``TypeError`` on call - with mock objects. Now it correctly returns ``(*args, **kwargs)`` as - inferred signature. +- gh-96127: ``inspect.signature`` was raising ``TypeError`` on call with + mock objects. Now it correctly returns ``(*args, **kwargs)`` as inferred + signature. -- gh-issue-95882: Fix a 3.11 regression in +- gh-95882: Fix a 3.11 regression in :func:`~contextlib.asynccontextmanager`, which caused it to propagate exceptions with incorrect tracebacks and fix a 3.11 regression in :func:`~contextlib.contextmanager`, which caused it to propagate exceptions with incorrect tracebacks for :exc:`StopIteration`. -- gh-issue-78707: Deprecate passing more than one positional argument to +- gh-78707: Deprecate passing more than one positional argument to :meth:`pathlib.PurePath.relative_to` and :meth:`~pathlib.PurePath.is_relative_to`. -- gh-issue-92122: Fix reStructuredText syntax errors in docstrings in the +- gh-92122: Fix reStructuredText syntax errors in docstrings in the :mod:`enum` module. -- gh-issue-91851: Optimize the :class:`~fractions.Fraction` arithmetics for - small components. +- gh-91851: Optimize the :class:`~fractions.Fraction` arithmetics for small + components. - bpo-24132: Make :class:`pathlib.PurePath` and :class:`~pathlib.Path` subclassable (private to start). Previously, attempting to instantiate a @@ -5101,10 +6022,10 @@ Library Documentation ------------- -- gh-issue-100616: Document existing ``attr`` parameter to +- gh-100616: Document existing ``attr`` parameter to :func:`curses.window.vline` function in :mod:`curses`. -- gh-issue-100472: Remove claim in documentation that the ``stripdir``, +- gh-100472: Remove claim in documentation that the ``stripdir``, ``prependdir`` and ``limit_sl_dest`` parameters of :func:`compileall.compile_dir` and :func:`compileall.compile_file` could be :class:`bytes`. @@ -5115,19 +6036,19 @@ Documentation Tests ----- -- gh-issue-100454: Start running SSL tests with OpenSSL 3.1.0-beta1. +- gh-100454: Start running SSL tests with OpenSSL 3.1.0-beta1. -- gh-issue-100086: The Python test runner (libregrtest) now logs Python - build information like "debug" vs "release" build, or LTO and PGO - optimizations. Patch by Victor Stinner. +- gh-100086: The Python test runner (libregrtest) now logs Python build + information like "debug" vs "release" build, or LTO and PGO optimizations. + Patch by Victor Stinner. -- gh-issue-93018: Make two tests forgiving towards host system libexpat with +- gh-93018: Make two tests forgiving towards host system libexpat with backported security fixes applied. Build ----- -- gh-issue-100540: Removed the ``--with-system-ffi`` ``configure`` option; +- gh-100540: Removed the ``--with-system-ffi`` ``configure`` option; ``libffi`` must now always be supplied by the system on all non-Windows platforms. The option has had no effect on non-Darwin platforms for several releases, and in 3.11 only had the non-obvious effect of invoking @@ -5136,8 +6057,8 @@ Build first check for the OS ``libffi`` and then fall back to the same processing as other platforms if it is not found. -- gh-issue-88267: Avoid exporting Python symbols in linked Windows - applications when the core is built as static. +- gh-88267: Avoid exporting Python symbols in linked Windows applications + when the core is built as static. - bpo-41916: Allow override of ac_cv_cxx_thread so that cross compiled python can set -pthread for CXX. @@ -5145,17 +6066,17 @@ Build Windows ------- -- gh-issue-100180: Update Windows installer to OpenSSL 1.1.1s +- gh-100180: Update Windows installer to OpenSSL 1.1.1s -- gh-issue-99191: Use ``_MSVC_LANG >= 202002L`` instead of less-precise - ``_MSC_VER >=1929`` to more accurately test for C++20 support in +- gh-99191: Use ``_MSVC_LANG >= 202002L`` instead of less-precise ``_MSC_VER + >=1929`` to more accurately test for C++20 support in :file:`PC/_wmimodule.cpp`. -- gh-issue-79218: Define ``MS_WIN64`` for Mingw-w64 64bit, fix cython - compilation failure. +- gh-79218: Define ``MS_WIN64`` for Mingw-w64 64bit, fix cython compilation + failure. -- gh-issue-99941: Ensure that :func:`asyncio.Protocol.data_received` - receives an immutable :class:`bytes` object (as documented), instead of +- gh-99941: Ensure that :func:`asyncio.Protocol.data_received` receives an + immutable :class:`bytes` object (as documented), instead of :class:`bytearray`. - bpo-43984: :meth:`winreg.SetValueEx` now leaves the target value untouched @@ -5168,9 +6089,9 @@ Windows macOS ----- -- gh-issue-100180: Update macOS installer to OpenSSL 1.1.1s +- gh-100180: Update macOS installer to OpenSSL 1.1.1s -- gh-issue-100540: Removed obsolete ``dlfcn.h`` shim from the ``_ctypes`` +- gh-100540: Removed obsolete ``dlfcn.h`` shim from the ``_ctypes`` extension module, which has not been necessary since Mac OS X 10.2. Tools/Demos @@ -5179,19 +6100,19 @@ Tools/Demos - bpo-45256: Fix a bug that caused an :exc:`AttributeError` to be raised in ``python-gdb.py`` when ``py-locals`` is used without a frame. -- gh-issue-100342: Add missing ``NULL`` check for possible allocation - failure in ``*args`` parsing in Argument Clinic. +- gh-100342: Add missing ``NULL`` check for possible allocation failure in + ``*args`` parsing in Argument Clinic. C API ----- -- gh-issue-99947: Raising SystemError on import will now have its cause be - set to the original unexpected exception. +- gh-99947: Raising SystemError on import will now have its cause be set to + the original unexpected exception. -- gh-issue-99240: In argument parsing, after deallocating newly allocated - memory, reset its pointer to NULL. +- gh-99240: In argument parsing, after deallocating newly allocated memory, + reset its pointer to NULL. -- gh-issue-98724: The :c:macro:`Py_CLEAR`, :c:macro:`Py_SETREF` and +- gh-98724: The :c:macro:`Py_CLEAR`, :c:macro:`Py_SETREF` and :c:macro:`Py_XSETREF` macros now only evaluate their arguments once. If an argument has side effects, these side effects are no longer duplicated. Patch by Victor Stinner. @@ -5205,75 +6126,74 @@ What's New in Python 3.12.0 alpha 3? Security -------- -- gh-issue-100001: ``python -m http.server`` no longer allows terminal - control characters sent within a garbage request to be printed to the - stderr server log. +- gh-100001: ``python -m http.server`` no longer allows terminal control + characters sent within a garbage request to be printed to the stderr + server log. This is done by changing the :mod:`http.server` :class:`BaseHTTPRequestHandler` ``.log_message`` method to replace control characters with a :samp:`\\x{HH}` hex escape before printing. -- gh-issue-87604: Avoid publishing list of active per-interpreter audit - hooks via the :mod:`gc` module +- gh-87604: Avoid publishing list of active per-interpreter audit hooks via + the :mod:`gc` module Core and Builtins ----------------- -- gh-issue-99891: Fix a bug in the tokenizer that could cause infinite - recursion when showing syntax warnings that happen in the first line of - the source. Patch by Pablo Galindo +- gh-99891: Fix a bug in the tokenizer that could cause infinite recursion + when showing syntax warnings that happen in the first line of the source. + Patch by Pablo Galindo -- gh-issue-91054: Add :c:func:`PyCode_AddWatcher` and +- gh-91054: Add :c:func:`PyCode_AddWatcher` and :c:func:`PyCode_ClearWatcher` APIs to register callbacks to receive notification on creation and destruction of code objects. -- gh-issue-99729: Fix an issue that could cause frames to be visible to - Python code as they are being torn down, possibly leading to memory - corruption or hard crashes of the interpreter. +- gh-99729: Fix an issue that could cause frames to be visible to Python + code as they are being torn down, possibly leading to memory corruption or + hard crashes of the interpreter. -- gh-issue-99708: Fix bug where compiler crashes on an if expression with an - empty body block. +- gh-99708: Fix bug where compiler crashes on an if expression with an empty + body block. -- gh-issue-99578: Fix a reference bug in :func:`_imp.create_builtin()` after - the creation of the first sub-interpreter for modules ``builtins`` and +- gh-99578: Fix a reference bug in :func:`!_imp.create_builtin` after the + creation of the first sub-interpreter for modules ``builtins`` and ``sys``. Patch by Victor Stinner. -- gh-issue-99581: Fixed a bug that was causing a buffer overflow if the - tokenizer copies a line missing the newline character from a file that is - as long as the available tokenizer buffer. Patch by Pablo galindo +- gh-99581: Fixed a bug that was causing a buffer overflow if the tokenizer + copies a line missing the newline character from a file that is as long as + the available tokenizer buffer. Patch by Pablo galindo -- gh-issue-99553: Fix bug where an :exc:`ExceptionGroup` subclass can wrap a +- gh-99553: Fix bug where an :exc:`ExceptionGroup` subclass can wrap a :exc:`BaseException`. -- gh-issue-99547: Add a function to os.path to check if a path is a - junction: isjunction. Add similar functionality to pathlib.Path as - is_junction. +- gh-99547: Add a function to os.path to check if a path is a junction: + isjunction. Add similar functionality to pathlib.Path as is_junction. -- gh-issue-99370: Fix zip path for venv created from a non-installed python - on POSIX platforms. +- gh-99370: Fix zip path for venv created from a non-installed python on + POSIX platforms. -- gh-issue-99377: Add audit events for thread creation and clear operations. +- gh-99377: Add audit events for thread creation and clear operations. -- gh-issue-98686: Remove the ``BINARY_OP_GENERIC`` and - ``COMPARE_OP_GENERIC`` "specializations". +- gh-98686: Remove the ``BINARY_OP_GENERIC`` and ``COMPARE_OP_GENERIC`` + "specializations". -- gh-issue-99298: Remove the remaining error paths for attribute - specializations, and refuse to specialize attribute accesses on types that - haven't had :c:func:`PyType_Ready` called on them yet. +- gh-99298: Remove the remaining error paths for attribute specializations, + and refuse to specialize attribute accesses on types that haven't had + :c:func:`PyType_Ready` called on them yet. -- gh-issue-99127: Allow some features of :mod:`syslog` to the main - interpreter only. Patch by Donghee Na. +- gh-99127: Allow some features of :mod:`syslog` to the main interpreter + only. Patch by Donghee Na. -- gh-issue-91053: Optimizing interpreters and JIT compilers may need to - invalidate internal metadata when functions are modified. This change adds - the ability to provide a callback that will be invoked each time a - function is created, modified, or destroyed. +- gh-91053: Optimizing interpreters and JIT compilers may need to invalidate + internal metadata when functions are modified. This change adds the + ability to provide a callback that will be invoked each time a function is + created, modified, or destroyed. -- gh-issue-90994: Improve error messages when there's a syntax error with - call arguments. The following three cases are covered: - No value is - assigned to a named argument, eg ``foo(a=)``. - A value is assigned to a - star argument, eg ``foo(*args=[0])``. - A value is assigned to a - double-star keyword argument, eg ``foo(**kwarg={'a': 0})``. +- gh-90994: Improve error messages when there's a syntax error with call + arguments. The following three cases are covered: - No value is assigned + to a named argument, eg ``foo(a=)``. - A value is assigned to a star + argument, eg ``foo(*args=[0])``. - A value is assigned to a double-star + keyword argument, eg ``foo(**kwarg={'a': 0})``. - bpo-45026: Optimize the :class:`range` object iterator. It is now smaller, faster iteration of ranges containing large numbers. Smaller pickles, @@ -5289,74 +6209,72 @@ Core and Builtins Library ------- -- gh-issue-100001: Also \ escape \s in the http.server +- gh-100001: Also \ escape \s in the http.server BaseHTTPRequestHandler.log_message so that it is technically possible to parse the line and reconstruct what the original data was. Without this a \xHH is ambiguious as to if it is a hex replacement we put in or the characters r"\x" came through in the original request line. -- gh-issue-99957: Add ``frozen_default`` parameter to +- gh-99957: Add ``frozen_default`` parameter to :func:`typing.dataclass_transform`. -- gh-issue-79033: Fix :func:`asyncio.Server.wait_closed` to actually do what - the docs promise -- wait for all existing connections to complete, after +- gh-79033: Fix :func:`asyncio.Server.wait_closed` to actually do what the + docs promise -- wait for all existing connections to complete, after closing the server. -- gh-issue-51524: Fix bug when calling trace.CoverageResults with valid - infile. +- gh-51524: Fix bug when calling trace.CoverageResults with valid infile. -- gh-issue-99645: Fix a bug in handling class cleanups in +- gh-99645: Fix a bug in handling class cleanups in :class:`unittest.TestCase`. Now ``addClassCleanup()`` uses separate lists for different ``TestCase`` subclasses, and ``doClassCleanups()`` only cleans up the particular class. -- gh-issue-99508: Fix ``TypeError`` in - ``Lib/importlib/_bootstrap_external.py`` while calling - ``_imp.source_hash()``. +- gh-99508: Fix ``TypeError`` in ``Lib/importlib/_bootstrap_external.py`` + while calling ``_imp.source_hash()``. -- gh-issue-66285: Fix :mod:`asyncio` to not share event loop and signal - wakeupfd in forked processes. Patch by Kumar Aditya. +- gh-66285: Fix :mod:`asyncio` to not share event loop and signal wakeupfd + in forked processes. Patch by Kumar Aditya. -- gh-issue-97001: Release the GIL when calling termios APIs to avoid - blocking threads. +- gh-97001: Release the GIL when calling termios APIs to avoid blocking + threads. -- gh-issue-92647: Use final status of an enum to determine lookup or - creation branch of functional API. +- gh-92647: Use final status of an enum to determine lookup or creation + branch of functional API. -- gh-issue-99388: Add *loop_factory* parameter to :func:`asyncio.run` to - allow specifying a custom event loop factory. Patch by Kumar Aditya. +- gh-99388: Add *loop_factory* parameter to :func:`asyncio.run` to allow + specifying a custom event loop factory. Patch by Kumar Aditya. -- gh-issue-99341: Fix :func:`ast.increment_lineno` to also cover +- gh-99341: Fix :func:`ast.increment_lineno` to also cover :class:`ast.TypeIgnore` when changing line numbers. -- gh-issue-99382: Check the number of arguments in substitution in user - generics containing a :class:`~typing.TypeVarTuple` and one or more +- gh-99382: Check the number of arguments in substitution in user generics + containing a :class:`~typing.TypeVarTuple` and one or more :class:`~typing.TypeVar`. -- gh-issue-99379: Fix substitution of :class:`~typing.ParamSpec` followed by +- gh-99379: Fix substitution of :class:`~typing.ParamSpec` followed by :class:`~typing.TypeVarTuple` in generic aliases. -- gh-issue-99344: Fix substitution of :class:`~typing.TypeVarTuple` and +- gh-99344: Fix substitution of :class:`~typing.TypeVarTuple` and :class:`~typing.ParamSpec` together in user generics. -- gh-issue-99284: Remove ``_use_broken_old_ctypes_structure_semantics_`` old +- gh-99284: Remove ``_use_broken_old_ctypes_structure_semantics_`` old untested and undocumented hack from :mod:`ctypes`. -- gh-issue-99201: Fix :exc:`IndexError` when initializing the config - variables on Windows if ``HAVE_DYNAMIC_LOADING`` is not set. +- gh-99201: Fix :exc:`IndexError` when initializing the config variables on + Windows if ``HAVE_DYNAMIC_LOADING`` is not set. -- gh-issue-99240: Fix double-free bug in Argument Clinic ``str_converter`` - by extracting memory clean up to a new ``post_parsing`` section. +- gh-99240: Fix double-free bug in Argument Clinic ``str_converter`` by + extracting memory clean up to a new ``post_parsing`` section. -- gh-issue-64490: Fix refcount error when arguments are packed to tuple in +- gh-64490: Fix refcount error when arguments are packed to tuple in Argument Clinic. -- gh-issue-99029: :meth:`pathlib.PurePath.relative_to()` now treats naked - Windows drive paths as relative. This brings its behaviour in line with - other parts of pathlib. +- gh-99029: :meth:`pathlib.PurePath.relative_to` now treats naked Windows + drive paths as relative. This brings its behaviour in line with other + parts of pathlib. -- gh-issue-98253: The implementation of the typing module is now more - resilient to reference leaks in binary extension modules. +- gh-98253: The implementation of the typing module is now more resilient to + reference leaks in binary extension modules. Previously, a reference leak in a typed C API-based extension module could leak internals of the typing module, which could in turn introduce leaks @@ -5366,12 +6284,12 @@ Library the implementation was therefore changed to reduce harm by providing better isolation. -- gh-issue-98458: Fix infinite loop in unittest when a self-referencing - chained exception is raised +- gh-98458: Fix infinite loop in unittest when a self-referencing chained + exception is raised -- gh-issue-93453: :func:`asyncio.get_event_loop` and many other - :mod:`asyncio` functions like :func:`asyncio.ensure_future`, - :func:`asyncio.shield` or :func:`asyncio.gather`, and also the +- gh-93453: :func:`asyncio.get_event_loop` and many other :mod:`asyncio` + functions like :func:`asyncio.ensure_future`, :func:`asyncio.shield` or + :func:`asyncio.gather`, and also the :meth:`~asyncio.BaseDefaultEventLoopPolicy.get_event_loop` method of :class:`asyncio.BaseDefaultEventLoopPolicy` now raise a :exc:`RuntimeError` if called when there is no running event loop and the @@ -5379,33 +6297,32 @@ Library a new current event loop. :exc:`DeprecationWarning` is no longer emitted if there is no running event loop but the current event loop was set. -- gh-issue-97966: On ``uname_result``, restored expectation that ``_fields`` - and ``_asdict`` would include all six properties including ``processor``. +- gh-97966: On ``uname_result``, restored expectation that ``_fields`` and + ``_asdict`` would include all six properties including ``processor``. -- gh-issue-98248: Provide informative error messages in :func:`struct.pack` - when its integral arguments are not in range. +- gh-98248: Provide informative error messages in :func:`struct.pack` when + its integral arguments are not in range. -- gh-issue-98108: ``zipfile.Path`` is now pickleable if its initialization +- gh-98108: ``zipfile.Path`` is now pickleable if its initialization parameters were pickleable (e.g. for file system paths). -- gh-issue-98098: Created packages from zipfile and test_zipfile modules, +- gh-98098: Created packages from zipfile and test_zipfile modules, separating ``zipfile.Path`` functionality. -- gh-issue-82836: Fix :attr:`~ipaddress.IPv4Address.is_private` properties - in the :mod:`ipaddress` module. Previously non-private networks - (0.0.0.0/0) would return ``True`` from this method; now they correctly - return ``False``. +- gh-82836: Fix :attr:`~ipaddress.IPv4Address.is_private` properties in the + :mod:`ipaddress` module. Previously non-private networks (0.0.0.0/0) would + return ``True`` from this method; now they correctly return ``False``. -- gh-issue-96828: Add an :const:`~ssl.OP_ENABLE_KTLS` option for enabling - the use of the kernel TLS (kTLS). Patch by Illia Volochii. +- gh-96828: Add an :const:`~ssl.OP_ENABLE_KTLS` option for enabling the use + of the kernel TLS (kTLS). Patch by Illia Volochii. -- gh-issue-88863: To avoid apparent memory leaks when +- gh-88863: To avoid apparent memory leaks when :func:`asyncio.open_connection` raises, break reference cycles generated by local exception and future instances (which has exception instance as its member var). Patch by Dong Uk, Kang. -- gh-issue-91078: :meth:`TarFile.next` now returns ``None`` when called on - an empty tarfile. +- gh-91078: :meth:`TarFile.next` now returns ``None`` when called on an + empty tarfile. - bpo-47220: Document the optional *callback* parameter of :class:`WeakMethod`. Patch by Géry Ogam. @@ -5423,18 +6340,18 @@ Library Documentation ------------- -- gh-issue-99931: Use `sphinxext-opengraph +- gh-99931: Use `sphinxext-opengraph `__ to generate `OpenGraph metadata `__. -- gh-issue-89682: Reworded docstring of the default ``__contains__`` to - clarify that it returns a :class:`bool`. +- gh-89682: Reworded docstring of the default ``__contains__`` to clarify + that it returns a :class:`bool`. -- gh-issue-88330: Improved the description of what a resource is in +- gh-88330: Improved the description of what a resource is in importlib.resources docs. -- gh-issue-92892: Document that calling variadic functions with ctypes - requires special care on macOS/arm64 (and possibly other platforms). +- gh-92892: Document that calling variadic functions with ctypes requires + special care on macOS/arm64 (and possibly other platforms). - bpo-41825: Restructured the documentation for the :func:`os.wait* ` family of functions, and improved the docs for @@ -5444,56 +6361,56 @@ Documentation Tests ----- -- gh-issue-99892: Skip test_normalization() of test_unicodedata if it fails - to download NormalizationTest.txt file from pythontest.net. Patch by - Victor Stinner. +- gh-99892: Skip test_normalization() of test_unicodedata if it fails to + download NormalizationTest.txt file from pythontest.net. Patch by Victor + Stinner. -- gh-issue-99934: Correct test_marsh on (32 bit) x86: test_deterministic - sets was failing. +- gh-99934: Correct test_marsh on (32 bit) x86: test_deterministic sets was + failing. -- gh-issue-99741: We've implemented multi-phase init (PEP 489/630/687) for - the internal (for testing) _xxsubinterpreters module. +- gh-99741: We've implemented multi-phase init (PEP 489/630/687) for the + internal (for testing) _xxsubinterpreters module. -- gh-issue-99659: Optional big memory tests in ``test_sqlite3`` now catch - the correct :exc:`sqlite.DataError` exception type in case of too large +- gh-99659: Optional big memory tests in ``test_sqlite3`` now catch the + correct :exc:`sqlite.DataError` exception type in case of too large strings and/or blobs passed. -- gh-issue-99593: Cover the Unicode C API with tests. +- gh-99593: Cover the Unicode C API with tests. -- gh-issue-96002: Add functional test for Argument Clinic. +- gh-96002: Add functional test for Argument Clinic. Build ----- -- gh-issue-99086: Fix ``-Wimplicit-int``, ``-Wstrict-prototypes``, and +- gh-99086: Fix ``-Wimplicit-int``, ``-Wstrict-prototypes``, and ``-Wimplicit-function-declaration`` compiler warnings in :program:`configure` checks. -- gh-issue-99337: Fix a compilation issue with GCC 12 on macOS. +- gh-99337: Fix a compilation issue with GCC 12 on macOS. -- gh-issue-99289: Add a ``COMPILEALL_OPTS`` variable in Makefile to override +- gh-99289: Add a ``COMPILEALL_OPTS`` variable in Makefile to override :mod:`compileall` options (default: ``-j0``) in ``make install``. Also merged the ``compileall`` commands into a single command building .pyc files for the all optimization levels (0, 1, 2) at once. Patch by Victor Stinner. -- gh-issue-98872: Fix a possible fd leak in ``Programs/_freeze_module.c`` +- gh-98872: Fix a possible fd leak in ``Programs/_freeze_module.c`` introduced in Python 3.11. -- gh-issue-88226: Always define ``TARGET_*`` labels in ``Python/ceval.c``, - even if ``USE_COMPUTED_GOTOS`` is disabled. This allows breakpoints to be - set at those labels in (for instance) ``gdb``. +- gh-88226: Always define ``TARGET_*`` labels in ``Python/ceval.c``, even if + ``USE_COMPUTED_GOTOS`` is disabled. This allows breakpoints to be set at + those labels in (for instance) ``gdb``. Windows ------- -- gh-issue-99345: Use faster initialization functions to detect install - location for Windows Store package +- gh-99345: Use faster initialization functions to detect install location + for Windows Store package -- gh-issue-98629: Fix initialization of :data:`sys.version` and ``sys._git`` - on Windows +- gh-98629: Fix initialization of :data:`sys.version` and ``sys._git`` on + Windows -- gh-issue-99442: Fix handling in :ref:`launcher` when ``argv[0]`` does not +- gh-99442: Fix handling in :ref:`launcher` when ``argv[0]`` does not include a file extension. - bpo-40882: Fix a memory leak in @@ -5502,15 +6419,15 @@ Windows macOS ----- -- gh-issue-87235: On macOS ``python3 /dev/fd/9 9` with - unhashable exceptions. +- gh-99181: Fix failure in :keyword:`except* ` with unhashable + exceptions. -- gh-issue-99204: Fix calculation of :data:`sys._base_executable` when - inside a POSIX virtual environment using copies of the python binary when - the base installation does not provide the executable name used by the - venv. Calculation will fall back to alternative names ("python", +- gh-99204: Fix calculation of :data:`sys._base_executable` when inside a + POSIX virtual environment using copies of the python binary when the base + installation does not provide the executable name used by the venv. + Calculation will fall back to alternative names ("python", "python."). -- gh-issue-96055: Update :mod:`faulthandler` to emit an error message with - the proper unexpected signal number. Patch by Donghee Na. +- gh-96055: Update :mod:`faulthandler` to emit an error message with the + proper unexpected signal number. Patch by Donghee Na. -- gh-issue-99153: Fix location of :exc:`SyntaxError` for a :keyword:`try` - block with both :keyword:`except` and :keyword:`except* `. +- gh-99153: Fix location of :exc:`SyntaxError` for a :keyword:`try` block + with both :keyword:`except` and :keyword:`except* `. -- gh-issue-98686: Merge the adaptive opcode logic into each instruction's +- gh-98686: Merge the adaptive opcode logic into each instruction's unquickened variant, and merge the logic in ``EXTENDED_ARG_QUICK`` into :opcode:`EXTENDED_ARG`. With these changes, the quickening that happens at code object creation is now only responsible for initializing warmup counters and inserting superinstructions. -- gh-issue-99103: Fix the error reporting positions of specialized traceback +- gh-99103: Fix the error reporting positions of specialized traceback anchors when the source line contains Unicode characters. -- gh-issue-99139: Improve the error suggestion for :exc:`NameError` - exceptions for instances. Now if a :exc:`NameError` is raised in a method - and the instance has an attribute that's exactly equal to the name in the +- gh-99139: Improve the error suggestion for :exc:`NameError` exceptions for + instances. Now if a :exc:`NameError` is raised in a method and the + instance has an attribute that's exactly equal to the name in the exception, the suggestion will include ``self.`` instead of the closest match in the method scope. Patch by Pablo Galindo -- gh-issue-98401: Octal escapes with value larger than ``0o377`` (ex: - ``"\477"``), deprecated in Python 3.11, now produce a - :exc:`SyntaxWarning`, instead of :exc:`DeprecationWarning`. In a future - Python version they will be eventually a :exc:`SyntaxError`. Patch by - Victor Stinner. +- gh-98401: Octal escapes with value larger than ``0o377`` (ex: ``"\477"``), + deprecated in Python 3.11, now produce a :exc:`SyntaxWarning`, instead of + :exc:`DeprecationWarning`. In a future Python version they will be + eventually a :exc:`SyntaxError`. Patch by Victor Stinner. -- gh-issue-98401: A backslash-character pair that is not a valid escape - sequence now generates a :exc:`SyntaxWarning`, instead of +- gh-98401: A backslash-character pair that is not a valid escape sequence + now generates a :exc:`SyntaxWarning`, instead of :exc:`DeprecationWarning`. For example, ``re.compile("\d+\.\d+")`` now emits a :exc:`SyntaxWarning` (``"\d"`` is an invalid escape sequence), use raw strings for regular expression: ``re.compile(r"\d+\.\d+")``. In a future Python version, :exc:`SyntaxError` will eventually be raised, instead of :exc:`SyntaxWarning`. Patch by Victor Stinner. -- gh-issue-96793: Handle StopIteration and StopAsyncIteration raised in - generator or coroutines in the bytecode, rather than in wrapping C code. +- gh-96793: Handle StopIteration and StopAsyncIteration raised in generator + or coroutines in the bytecode, rather than in wrapping C code. -- gh-issue-98931: Improve the :exc:`SyntaxError` error message when the user - types ``import x from y`` instead of ``from y import x``. Patch by Pablo - Galindo +- gh-98931: Improve the :exc:`SyntaxError` error message when the user types + ``import x from y`` instead of ``from y import x``. Patch by Pablo Galindo -- gh-issue-98852: Fix subscription of type aliases containing bare generic - types or types like :class:`~typing.TypeVar`: for example ``tuple[A, - T][int]`` and ``tuple[TypeVar, T][int]``, where ``A`` is a generic type, - and ``T`` is a type variable. +- gh-98852: Fix subscription of type aliases containing bare generic types + or types like :class:`~typing.TypeVar`: for example ``tuple[A, T][int]`` + and ``tuple[TypeVar, T][int]``, where ``A`` is a generic type, and ``T`` + is a type variable. -- gh-issue-98925: Lower the recursion depth for marshal on WASI to support +- gh-98925: Lower the recursion depth for marshal on WASI to support (in-development) wasmtime 2.0. -- gh-issue-98783: Fix multiple crashes in debug mode when ``str`` subclasses - are used instead of ``str`` itself. +- gh-98783: Fix multiple crashes in debug mode when ``str`` subclasses are + used instead of ``str`` itself. -- gh-issue-98811: Use complete source locations to simplify detection of +- gh-98811: Use complete source locations to simplify detection of ``__future__`` imports which are not at the beginning of the file. Also corrects the offset in the exception raised in one case, which was off by one and impeded highlighting. -- gh-issue-96793: Add specialization of :opcode:`FOR_ITER` for generators. - Saves multiple layers of dispatch and checking to get from the +- gh-96793: Add specialization of :opcode:`FOR_ITER` for generators. Saves + multiple layers of dispatch and checking to get from the :opcode:`FOR_ITER` instruction in the caller to the :opcode:`RESUME` in the generator. -- gh-issue-98762: Fix source locations of :keyword:`match` sub-patterns. +- gh-98762: Fix source locations of :keyword:`match` sub-patterns. -- gh-issue-98586: Added the methods :c:func:`PyObject_Vectorcall` and +- gh-98586: Added the methods :c:func:`PyObject_Vectorcall` and :c:func:`PyObject_VectorcallMethod` to the :ref:`Limited API ` along with the auxiliary macro constant :c:macro:`PY_VECTORCALL_ARGUMENTS_OFFSET`. @@ -5667,17 +6581,17 @@ Core and Builtins vector calls from binary extension modules that avoid argument boxing/unboxing overheads. -- gh-issue-99257: Fix an issue where member descriptors (such as those for +- gh-99257: Fix an issue where member descriptors (such as those for :attr:`~object.__slots__`) could behave incorrectly or crash instead of raising a :exc:`TypeError` when accessed via an instance of an invalid type. -- gh-issue-93143: Rather than changing :attr:`~types.CodeType.co_code`, the +- gh-93143: Rather than changing :attr:`~types.CodeType.co_code`, the interpreter will now display a :exc:`RuntimeWarning` and assign :const:`None` to any fast locals that are left unbound after jumps or :keyword:`del` statements executed while tracing. -- gh-issue-96421: When calling into Python code from C code, through +- gh-96421: When calling into Python code from C code, through :c:func:`PyEval_EvalFrameEx` or a related C-API function, a shim frame in inserted into the call stack. This occurs in the ``_PyEval_EvalFrameDefault()`` function. The extra frame should be @@ -5690,156 +6604,153 @@ Core and Builtins :opcode:`RETURN_VALUE`, :opcode:`YIELD_VALUE`, and :opcode:`RETURN_GENERATOR`, which now clear the frame. -- gh-issue-98415: Fix detection of MAC addresses for :mod:`uuid` on certain - OSs. Patch by Chaim Sanders +- gh-98415: Fix detection of MAC addresses for :mod:`uuid` on certain OSs. + Patch by Chaim Sanders -- gh-issue-98686: Quicken all code objects, and specialize adaptive bytecode +- gh-98686: Quicken all code objects, and specialize adaptive bytecode instructions more aggressively. -- gh-issue-92119: Print exception class name instead of its string - representation when raising errors from :mod:`ctypes` calls. +- gh-92119: Print exception class name instead of its string representation + when raising errors from :mod:`ctypes` calls. -- gh-issue-91058: :exc:`ImportError` raised from failed ``from - import `` now include suggestions for the value of ```` based - on the available names in ````. Patch by Pablo Galindo +- gh-91058: :exc:`ImportError` raised from failed ``from import + `` now include suggestions for the value of ```` based on the + available names in ````. Patch by Pablo Galindo -- gh-issue-96793: The :opcode:`FOR_ITER` now leaves the iterator on the - stack on termination of the loop. This is to assist specialization of - loops for generators. +- gh-96793: The :opcode:`FOR_ITER` now leaves the iterator on the stack on + termination of the loop. This is to assist specialization of loops for + generators. -- gh-issue-90716: Add _pylong.py module. It includes asymptotically faster +- gh-90716: Add _pylong.py module. It includes asymptotically faster algorithms that can be used for operations on integers with many digits. It is used by longobject.c to speed up some operations. -- gh-issue-95389: Expose :const:`~socket.ETH_P_ALL` and some of the +- gh-95389: Expose :const:`~socket.ETH_P_ALL` and some of the :ref:`ETHERTYPE_* constants ` in :mod:`socket`. Patch by Noam Cohen. -- gh-issue-93696: Allow :mod:`pdb` to locate source for frozen modules in - the standard library. +- gh-93696: Allow :mod:`pdb` to locate source for frozen modules in the + standard library. Library ------- -- gh-issue-99418: Fix bug in :func:`urllib.parse.urlparse` that causes URL - schemes that begin with a digit, a plus sign, or a minus sign to be parsed +- gh-99418: Fix bug in :func:`urllib.parse.urlparse` that causes URL schemes + that begin with a digit, a plus sign, or a minus sign to be parsed incorrectly. -- gh-issue-94597: Deprecate :class:`asyncio.AbstractChildWatcher` to be - removed in Python 3.14. Patch by Kumar Aditya. +- gh-94597: Deprecate :class:`asyncio.AbstractChildWatcher` to be removed in + Python 3.14. Patch by Kumar Aditya. -- gh-issue-99305: Improve performance of :func:`secrets.token_hex`. +- gh-99305: Improve performance of :func:`secrets.token_hex`. -- gh-issue-74044: Fixed bug where :func:`inspect.signature` reported - incorrect arguments for decorated methods. +- gh-74044: Fixed bug where :func:`inspect.signature` reported incorrect + arguments for decorated methods. -- gh-issue-99275: Fix ``SystemError`` in :mod:`ctypes` when exception was - not set during ``__initsubclass__``. +- gh-99275: Fix ``SystemError`` in :mod:`ctypes` when exception was not set + during ``__initsubclass__``. -- gh-issue-99277: Remove older version of +- gh-99277: Remove older version of ``_SSLProtocolTransport.get_write_buffer_limits`` in :mod:`!asyncio.sslproto` -- gh-issue-99248: fix negative numbers failing in verify() +- gh-99248: fix negative numbers failing in verify() -- gh-issue-99155: Fix :class:`statistics.NormalDist` pickle with ``0`` and - ``1`` protocols. +- gh-99155: Fix :class:`statistics.NormalDist` pickle with ``0`` and ``1`` + protocols. -- gh-issue-93464: ``enum.auto()`` is now correctly activated when combined - with other assignment values. E.g. ``ONE = auto(), 'some text'`` will now +- gh-93464: ``enum.auto()`` is now correctly activated when combined with + other assignment values. E.g. ``ONE = auto(), 'some text'`` will now evaluate as ``(1, 'some text')``. -- gh-issue-99134: Update the bundled copy of pip to version 22.3.1. +- gh-99134: Update the bundled copy of pip to version 22.3.1. -- gh-issue-92584: Remove the ``distutils`` package. It was deprecated in - Python 3.10 by :pep:`632` "Deprecate distutils module". For projects still - using ``distutils`` and cannot be updated to something else, the - ``setuptools`` project can be installed: it still provides ``distutils``. - Patch by Victor Stinner. +- gh-92584: Remove the ``distutils`` package. It was deprecated in Python + 3.10 by :pep:`632` "Deprecate distutils module". For projects still using + ``distutils`` and cannot be updated to something else, the ``setuptools`` + project can be installed: it still provides ``distutils``. Patch by Victor + Stinner. -- gh-issue-98999: Now :mod:`_pyio` is consistent with :mod:`_io` in raising +- gh-98999: Now :mod:`!_pyio` is consistent with :mod:`!_io` in raising ``ValueError`` when executing methods over closed buffers. -- gh-issue-83004: Clean up refleak on failed module initialisation in - :mod:`_zoneinfo` +- gh-83004: Clean up refleak on failed module initialisation in + :mod:`!_zoneinfo` -- gh-issue-83004: Clean up refleaks on failed module initialisation in - :mod:`_pickle` +- gh-83004: Clean up refleaks on failed module initialisation in + :mod:`!_pickle` -- gh-issue-83004: Clean up refleak on failed module initialisation in - :mod:`_io`. +- gh-83004: Clean up refleak on failed module initialisation in :mod:`!_io`. -- gh-issue-98897: Fix memory leak in :func:`math.dist` when both points - don't have the same dimension. Patch by Kumar Aditya. +- gh-98897: Fix memory leak in :func:`math.dist` when both points don't have + the same dimension. Patch by Kumar Aditya. -- gh-issue-98878: Use the frame bound builtins when offering a name - suggestion in :mod:`traceback` to prevent crashing when ``__builtins__`` - is not a dict. +- gh-98878: Use the frame bound builtins when offering a name suggestion in + :mod:`traceback` to prevent crashing when ``__builtins__`` is not a dict. -- gh-issue-98139: In :mod:`importlib._bootstrap`, enhance namespace package - repr to ````. +- gh-98139: In :mod:`importlib._bootstrap`, enhance namespace package repr + to ````. -- gh-issue-90352: Fix ``_SelectorDatagramTransport`` to inherit from +- gh-90352: Fix ``_SelectorDatagramTransport`` to inherit from :class:`~asyncio.DatagramTransport` in :mod:`asyncio`. Patch by Kumar Aditya. -- gh-issue-98793: Fix argument typechecks in :func:`!_overlapped.WSAConnect` - and :func:`!_overlapped.Overlapped.WSASendTo` functions. +- gh-98793: Fix argument typechecks in :func:`!_overlapped.WSAConnect` and + :func:`!_overlapped.Overlapped.WSASendTo` functions. -- gh-issue-98744: Prevent crashing in :mod:`traceback` when retrieving the +- gh-98744: Prevent crashing in :mod:`traceback` when retrieving the byte-offset for some source files that contain certain unicode characters. -- gh-issue-98740: Fix internal error in the :mod:`re` module which in very - rare circumstances prevented compilation of a regular expression - containing a :ref:`conditional expression ` - without the "else" branch. +- gh-98740: Fix internal error in the :mod:`re` module which in very rare + circumstances prevented compilation of a regular expression containing a + :ref:`conditional expression ` without the + "else" branch. -- gh-issue-98703: Fix :meth:`asyncio.StreamWriter.drain` to call +- gh-98703: Fix :meth:`asyncio.StreamWriter.drain` to call ``protocol.connection_lost`` callback only once on Windows. -- gh-issue-98624: Add a mutex to unittest.mock.NonCallableMock to protect +- gh-98624: Add a mutex to unittest.mock.NonCallableMock to protect concurrent access to mock attributes. -- gh-issue-98658: The :class:`array.array` class now supports subscripting, - making it a :term:`generic type`. +- gh-98658: The :class:`array.array` class now supports subscripting, making + it a :term:`generic type`. -- gh-issue-98284: Improved :class:`TypeError` message for undefined abstract +- gh-98284: Improved :class:`TypeError` message for undefined abstract methods of a :class:`abc.ABC` instance. The names of the missing methods are surrounded by single-quotes to highlight them. -- gh-issue-96151: Allow ``BUILTINS`` to be a valid field name for frozen +- gh-96151: Allow ``BUILTINS`` to be a valid field name for frozen dataclasses. -- gh-issue-98086: Make sure ``patch.dict()`` can be applied on async - functions. +- gh-98086: Make sure ``patch.dict()`` can be applied on async functions. -- gh-issue-72719: Remove modules :mod:`!asyncore` and :mod:`!asynchat`, - which were deprecated by :pep:`594`. +- gh-72719: Remove modules :mod:`!asyncore` and :mod:`!asynchat`, which were + deprecated by :pep:`594`. -- gh-issue-96192: Fix handling of ``bytes`` :term:`path-like objects - ` in :func:`os.ismount()`. +- gh-96192: Fix handling of ``bytes`` :term:`path-like objects ` in :func:`os.ismount`. -- gh-issue-94172: :mod:`ftplib`: Remove the ``FTP_TLS.ssl_version`` class +- gh-94172: :mod:`ftplib`: Remove the ``FTP_TLS.ssl_version`` class attribute: use the *context* parameter instead. Patch by Victor Stinner -- gh-issue-94172: Remove the *keyfile* and *certfile* parameters from the +- gh-94172: Remove the *keyfile* and *certfile* parameters from the :mod:`ftplib`, :mod:`imaplib`, :mod:`poplib` and :mod:`smtplib` modules, and the *key_file*, *cert_file* and *check_hostname* parameters from the :mod:`http.client` module, all deprecated since Python 3.6. Use the *context* parameter (*ssl_context* in :mod:`imaplib`) instead. Patch by Victor Stinner. -- gh-issue-83638: Add the :attr:`~sqlite3.Connection.autocommit` attribute - to :class:`sqlite3.Connection` and the *autocommit* parameter to +- gh-83638: Add the :attr:`~sqlite3.Connection.autocommit` attribute to + :class:`sqlite3.Connection` and the *autocommit* parameter to :func:`sqlite3.connect` to control :pep:`249`-compliant :ref:`transaction handling `. Patch by Erlend E. Aasland. -- gh-issue-92452: Fixed a race condition that could cause +- gh-92452: Fixed a race condition that could cause :func:`sysconfig.get_config_var` to incorrectly return :const:`None` in multi-threaded programs. -- gh-issue-91803: Fix an error when using a method of objects mocked with +- gh-91803: Fix an error when using a method of objects mocked with :func:`unittest.mock.create_autospec` after it was sealed with :func:`unittest.mock.seal` function. @@ -5854,26 +6765,25 @@ Library Documentation ------------- -- gh-issue-98832: Changes wording of docstring for - :func:`pathlib.Path.iterdir`. +- gh-98832: Changes wording of docstring for :func:`pathlib.Path.iterdir`. -- gh-issue-97966: Update uname docs to clarify the special nature of the - platform attribute and to indicate when it became late-bound. +- gh-97966: Update uname docs to clarify the special nature of the platform + attribute and to indicate when it became late-bound. Tests ----- -- gh-issue-98903: The Python test suite now fails with exit code 4 if no - tests ran. It should help detecting typos in test names and test methods. +- gh-98903: The Python test suite now fails with exit code 4 if no tests + ran. It should help detecting typos in test names and test methods. -- gh-issue-98713: Fix a bug in the :mod:`typing` tests where a test relying - on CPython-specific implementation details was not decorated with +- gh-98713: Fix a bug in the :mod:`typing` tests where a test relying on + CPython-specific implementation details was not decorated with ``@cpython_only`` and was not skipped on other implementations. -- gh-issue-87390: Add tests for star-unpacking with PEP 646, and some other +- gh-87390: Add tests for star-unpacking with PEP 646, and some other miscellaneous PEP 646 tests. -- gh-issue-96853: Added explicit coverage of ``Py_Initialize`` (and hence +- gh-96853: Added explicit coverage of ``Py_Initialize`` (and hence ``Py_InitializeEx``) back to the embedding tests (all other embedding tests migrated to ``Py_InitializeFromConfig`` in Python 3.11) @@ -5883,22 +6793,21 @@ Tests Build ----- -- gh-issue-99086: Fix ``-Wimplicit-int`` compiler warning in - :program:`configure` check for ``PTHREAD_SCOPE_SYSTEM``. +- gh-99086: Fix ``-Wimplicit-int`` compiler warning in :program:`configure` + check for ``PTHREAD_SCOPE_SYSTEM``. -- gh-issue-99016: Fix build with ``PYTHON_FOR_REGEN=python3.8``. +- gh-99016: Fix build with ``PYTHON_FOR_REGEN=python3.8``. -- gh-issue-97731: Specify the full path to the source location for ``make +- gh-97731: Specify the full path to the source location for ``make docclean`` (needed for cross-builds). -- gh-issue-98949: Drop unused build dependency on ``readelf``. +- gh-98949: Drop unused build dependency on ``readelf``. -- gh-issue-98989: Use ``python3.11``, if available, for regeneration and - freezing. +- gh-98989: Use ``python3.11``, if available, for regeneration and freezing. -- gh-issue-98831: Add new tooling, in ``Tools/cases_generator``, to generate - the interpreter switch statement from a list of opcode definitions. This - only affects adding, modifying or removing instruction definitions. The +- gh-98831: Add new tooling, in ``Tools/cases_generator``, to generate the + interpreter switch statement from a list of opcode definitions. This only + affects adding, modifying or removing instruction definitions. The instruction definitions now live in ``Python/bytecodes.c``, in the form of a `custom DSL (under development) `__. @@ -5906,15 +6815,13 @@ Build which is then included by ``Python/ceval.c`` to provide most of the cases of the main interpreter switch. -- gh-issue-98817: Remove PCbuild/lib.pyproj: it's not used for anything, is - only a minor convenience for Visual Studio users (who probably mostly - don't even know about it), and it takes a lot of maintenance effort to - keep updated. +- gh-98817: Remove PCbuild/lib.pyproj: it's not used for anything, is only a + minor convenience for Visual Studio users (who probably mostly don't even + know about it), and it takes a lot of maintenance effort to keep updated. -- gh-issue-98776: Fix ``make regen-test-levenshtein`` for out-of-tree - builds. +- gh-98776: Fix ``make regen-test-levenshtein`` for out-of-tree builds. -- gh-issue-98707: Don't use vendored ``libmpdec`` headers if +- gh-98707: Don't use vendored ``libmpdec`` headers if :option:`--with-system-libmpdec` is passed to :program:`configure`. Don't use vendored ``libexpat`` headers if :option:`--with-system-expat` is passed to :program:`configure`. @@ -5922,64 +6829,63 @@ Build Windows ------- -- gh-issue-98689: Update Windows builds to zlib v1.2.13. v1.2.12 has +- gh-98689: Update Windows builds to zlib v1.2.13. v1.2.12 has :cve:`2022-37434`, but the vulnerable ``inflateGetHeader`` API is not used by Python. -- gh-issue-98790: Assumes that a missing ``DLLs`` directory means that - standard extension modules are in the executable's directory. +- gh-98790: Assumes that a missing ``DLLs`` directory means that standard + extension modules are in the executable's directory. -- gh-issue-98745: Update :file:`py.exe` launcher to install 3.11 by default - and 3.12 on request. +- gh-98745: Update :file:`py.exe` launcher to install 3.11 by default and + 3.12 on request. -- gh-issue-98692: Fix the :ref:`launcher` ignoring unrecognized shebang - lines instead of treating them as local paths +- gh-98692: Fix the :ref:`launcher` ignoring unrecognized shebang lines + instead of treating them as local paths -- gh-issue-94328: Update Windows installer to use SQLite 3.39.4. +- gh-94328: Update Windows installer to use SQLite 3.39.4. macOS ----- -- gh-issue-94328: Update macOS installer to SQLite 3.39.4. +- gh-94328: Update macOS installer to SQLite 3.39.4. C API ----- -- gh-issue-98724: The :c:macro:`Py_CLEAR`, :c:macro:`Py_SETREF` and +- gh-98724: The :c:macro:`Py_CLEAR`, :c:macro:`Py_SETREF` and :c:macro:`Py_XSETREF` macros now only evaluate their argument once. If the argument has side effects, these side effects are no longer duplicated. Patch by Victor Stinner. -- gh-issue-98978: Fix use-after-free in ``Py_SetPythonHome(NULL)``, +- gh-98978: Fix use-after-free in ``Py_SetPythonHome(NULL)``, ``Py_SetProgramName(NULL)`` and ``_Py_SetProgramFullPath(NULL)`` function calls. Issue reported by Benedikt Reinartz. Patch by Victor Stinner. -- gh-issue-98410: Add ``getbufferproc`` and ``releasebufferproc`` to the - stable API. +- gh-98410: Add ``getbufferproc`` and ``releasebufferproc`` to the stable + API. -- gh-issue-98610: Some configurable capabilities of sub-interpreters have - changed. They always allow subprocesses (:mod:`subprocess`) now, whereas - before subprocesses could be optionally disallowed for a sub-interpreter. - Instead :func:`os.exec` can now be disallowed. Disallowing daemon threads - is now supported. Disallowing all threads is still allowed, but is never - done by default. Note that the optional restrictions are only available - through ``_Py_NewInterpreterFromConfig()``, which isn't a public API. They - do not affect the main interpreter, nor :c:func:`Py_NewInterpreter`. +- gh-98610: Some configurable capabilities of sub-interpreters have changed. + They always allow subprocesses (:mod:`subprocess`) now, whereas before + subprocesses could be optionally disallowed for a sub-interpreter. Instead + :func:`os.exec` can now be disallowed. Disallowing daemon threads is now + supported. Disallowing all threads is still allowed, but is never done by + default. Note that the optional restrictions are only available through + ``_Py_NewInterpreterFromConfig()``, which isn't a public API. They do not + affect the main interpreter, nor :c:func:`Py_NewInterpreter`. -- gh-issue-98608: A ``_PyInterpreterConfig`` has been added and +- gh-98608: A ``_PyInterpreterConfig`` has been added and ``_Py_NewInterpreter()`` has been renamed to ``_Py_NewInterpreterFromConfig()``. The "isolated_subinterpreters" argument is now a granular config that captures the previous behavior. Note that this is all "private" API. -- gh-issue-96853: ``Py_InitializeEx`` now correctly calls ``PyConfig_Clear`` - after initializing the interpreter (the omission didn't cause a memory - leak only because none of the dynamically allocated config fields are - populated by the wrapper function) +- gh-96853: ``Py_InitializeEx`` now correctly calls ``PyConfig_Clear`` after + initializing the interpreter (the omission didn't cause a memory leak only + because none of the dynamically allocated config fields are populated by + the wrapper function) -- gh-issue-91248: Add :c:func:`PyFrame_GetVar` and - :c:func:`PyFrame_GetVarString` functions to get a frame variable by its - name. Patch by Victor Stinner. +- gh-91248: Add :c:func:`PyFrame_GetVar` and :c:func:`PyFrame_GetVarString` + functions to get a frame variable by its name. Patch by Victor Stinner. What's New in Python 3.12.0 alpha 1? @@ -5990,12 +6896,12 @@ What's New in Python 3.12.0 alpha 1? Security -------- -- gh-issue-97616: Fix multiplying a list by an integer (``list *= int``): - detect the integer overflow when the new allocated length is close to the - maximum size. Issue reported by Jordan Limor. Patch by Victor Stinner. +- gh-97616: Fix multiplying a list by an integer (``list *= int``): detect + the integer overflow when the new allocated length is close to the maximum + size. Issue reported by Jordan Limor. Patch by Victor Stinner. -- gh-issue-97514: On Linux the :mod:`multiprocessing` module returns to - using filesystem backed unix domain sockets for communication with the +- gh-97514: On Linux the :mod:`multiprocessing` module returns to using + filesystem backed unix domain sockets for communication with the *forkserver* process instead of the Linux abstract socket namespace. Only code that chooses to use the :ref:`"forkserver" start method ` is affected. @@ -6010,213 +6916,209 @@ Security This prevents Linux :cve:`2022-42919`. -- gh-issue-87389: :mod:`http.server`: Fix an open redirection vulnerability - in the HTTP server when an URI path starts with ``//``. Vulnerability +- gh-87389: :mod:`http.server`: Fix an open redirection vulnerability in the + HTTP server when an URI path starts with ``//``. Vulnerability discovered, and initial fix proposed, by Hamza Avvan. -- gh-issue-79096: LWPCookieJar and MozillaCookieJar create files with file - mode 600 instead of 644 (Microsoft Windows is not affected) +- gh-79096: LWPCookieJar and MozillaCookieJar create files with file mode + 600 instead of 644 (Microsoft Windows is not affected) -- gh-issue-92888: Fix ``memoryview`` use after free when accessing the - backing buffer in certain cases. +- gh-92888: Fix ``memoryview`` use after free when accessing the backing + buffer in certain cases. -- gh-issue-68966: The deprecated mailcap module now refuses to inject unsafe - text (filenames, MIME types, parameters) into shell commands. Instead of - using such text, it will warn and act as if a match was not found (or for - test commands, as if the test failed). +- gh-68966: The deprecated mailcap module now refuses to inject unsafe text + (filenames, MIME types, parameters) into shell commands. Instead of using + such text, it will warn and act as if a match was not found (or for test + commands, as if the test failed). Core and Builtins ----------------- -- gh-issue-98374: Suppress ImportError for invalid query for help() command. - Patch by Donghee Na. +- gh-98374: Suppress ImportError for invalid query for help() command. Patch + by Donghee Na. -- gh-issue-98461: Fix source location in bytecode for list, set and dict +- gh-98461: Fix source location in bytecode for list, set and dict comprehensions as well as generator expressions. -- gh-issue-98354: Added unicode check for ``name`` attribute of ``spec`` - argument passed in :func:`_imp.create_builtin` function. +- gh-98354: Added unicode check for ``name`` attribute of ``spec`` argument + passed in :func:`!_imp.create_builtin` function. -- gh-issue-98398: Fix source location of 'assert' bytecodes. +- gh-98398: Fix source location of 'assert' bytecodes. -- gh-issue-98390: Fix location of sub-expressions of boolean expressions, by +- gh-98390: Fix location of sub-expressions of boolean expressions, by reducing their scope to that of the sub-expression. -- gh-issue-98254: Modules from the standard library are now potentially - suggested as part of the error messages displayed by the interpreter when - an :exc:`NameError` is raised to the top level. Patch by Pablo Galindo +- gh-98254: Modules from the standard library are now potentially suggested + as part of the error messages displayed by the interpreter when an + :exc:`NameError` is raised to the top level. Patch by Pablo Galindo -- gh-issue-97997: Add running column offset to the tokenizer state to avoid +- gh-97997: Add running column offset to the tokenizer state to avoid calculating AST column information with pointer arithmetic. -- gh-issue-97973: Modify the tokenizer to return all necessary information - the parser needs to set location information in the AST nodes, so that the +- gh-97973: Modify the tokenizer to return all necessary information the + parser needs to set location information in the AST nodes, so that the parser does not have to calculate those doing pointer arithmetic. -- gh-issue-96078: :func:`os.sched_yield` now release the GIL while calling +- gh-96078: :func:`os.sched_yield` now release the GIL while calling sched_yield(2). Patch by Donghee Na. -- gh-issue-97955: Migrate :mod:`zoneinfo` to Argument Clinic. +- gh-97955: Migrate :mod:`zoneinfo` to Argument Clinic. -- gh-issue-97912: The compiler now avoids quadratic behavior when finding - which instructions should use the :opcode:`LOAD_FAST_CHECK` opcode. +- gh-97912: The compiler now avoids quadratic behavior when finding which + instructions should use the :opcode:`LOAD_FAST_CHECK` opcode. -- gh-issue-97002: Fix an issue where several frame objects could be backed - by the same interpreter frame, possibly leading to corrupted memory and - hard crashes of the interpreter. +- gh-97002: Fix an issue where several frame objects could be backed by the + same interpreter frame, possibly leading to corrupted memory and hard + crashes of the interpreter. -- gh-issue-97943: Bugfix: :c:func:`PyFunction_GetAnnotations` should return - a borrowed reference. It was returning a new reference. +- gh-97943: Bugfix: :c:func:`PyFunction_GetAnnotations` should return a + borrowed reference. It was returning a new reference. -- gh-issue-97922: The Garbage Collector now runs only on the eval breaker +- gh-97922: The Garbage Collector now runs only on the eval breaker mechanism of the Python bytecode evaluation loop instead on object allocations. The GC can also run when :c:func:`PyErr_CheckSignals` is called so C extensions that need to run for a long time without executing any Python code also have a chance to execute the GC periodically. -- gh-issue-65961: When ``__package__`` is different than - ``__spec__.parent``, raise a ``DeprecationWarning`` instead of - ``ImportWarning``. +- gh-65961: When ``__package__`` is different than ``__spec__.parent``, + raise a ``DeprecationWarning`` instead of ``ImportWarning``. Also remove ``importlib.util.set_package()`` which was scheduled for removal. -- gh-issue-97850: Long deprecated, ``module_repr()`` should now be - completely eradicated. +- gh-97850: Long deprecated, ``module_repr()`` should now be completely + eradicated. -- gh-issue-86298: In cases where ``warnings.warn_explicit()`` consults the +- gh-86298: In cases where ``warnings.warn_explicit()`` consults the module's loader, an ``DeprecationWarning`` is issued when ``m.__loader__`` differs from ``m.__spec__.loader``. -- gh-issue-97779: Ensure that all Python frame objects are backed by - "complete" frames. +- gh-97779: Ensure that all Python frame objects are backed by "complete" + frames. -- gh-issue-91052: Add API for subscribing to modification events on selected +- gh-91052: Add API for subscribing to modification events on selected dictionaries. -- gh-issue-97752: Fix possible data corruption or crashes when accessing the +- gh-97752: Fix possible data corruption or crashes when accessing the ``f_back`` member of newly-created generator or coroutine frames. -- gh-issue-97591: Fixed a missing incref/decref pair in +- gh-97591: Fixed a missing incref/decref pair in ``Exception.__setstate__()``. Patch by Ofey Chan. -- gh-issue-97670: Remove the :func:`sys.getdxp` function and the +- gh-97670: Remove the :func:`sys.getdxp` function and the ``Tools/scripts/analyze_dxp.py`` script. DXP stands for "dynamic execution pairs". They were related to ``DYNAMIC_EXECUTION_PROFILE`` and ``DXPAIRS`` macros which have been removed in Python 3.11. Python can now be built with :option:`./configure --enable-pystats <--enable-pystats>` to gather statistics on Python opcodes. Patch by Victor Stinner. -- gh-issue-94526: Fix the Python path configuration used to initialized +- gh-94526: Fix the Python path configuration used to initialized :data:`sys.path` at Python startup. Paths are no longer encoded to UTF-8/strict to avoid encoding errors if it contains surrogate characters (bytes paths are decoded with the surrogateescape error handler). Patch by Victor Stinner. -- gh-issue-96670: The parser now raises :exc:`SyntaxError` when parsing - source code containing null bytes. Patch by Pablo Galindo +- gh-96670: The parser now raises :exc:`SyntaxError` when parsing source + code containing null bytes. Patch by Pablo Galindo -- gh-issue-96975: Fix a crash occurring when :c:func:`PyEval_GetFrame` is - called while the topmost Python frame is in a partially-initialized state. +- gh-96975: Fix a crash occurring when :c:func:`PyEval_GetFrame` is called + while the topmost Python frame is in a partially-initialized state. -- gh-issue-96848: Fix command line parsing: reject :option:`-X - int_max_str_digits <-X>` option with no value (invalid) when the +- gh-96848: Fix command line parsing: reject :option:`-X int_max_str_digits + <-X>` option with no value (invalid) when the :envvar:`PYTHONINTMAXSTRDIGITS` environment variable is set to a valid limit. Patch by Victor Stinner. -- gh-issue-95921: Fix overly-broad source position information for chained +- gh-95921: Fix overly-broad source position information for chained comparisons used as branching conditions. -- gh-issue-96821: Fix undefined behaviour in ``audioop.c``. +- gh-96821: Fix undefined behaviour in ``audioop.c``. -- gh-issue-96821: Fix undefined behaviour in ``_testcapimodule.c``. +- gh-96821: Fix undefined behaviour in ``_testcapimodule.c``. -- gh-issue-95778: When :exc:`ValueError` is raised if an integer is larger - than the limit, mention the :func:`sys.set_int_max_str_digits` function in - the error message. Patch by Victor Stinner. +- gh-95778: When :exc:`ValueError` is raised if an integer is larger than + the limit, mention the :func:`sys.set_int_max_str_digits` function in the + error message. Patch by Victor Stinner. -- gh-issue-96387: At Python exit, sometimes a thread holding the GIL can - wait forever for a thread (usually a daemon thread) which requested to - drop the GIL, whereas the thread already exited. To fix the race - condition, the thread which requested the GIL drop now resets its request - before exiting. Issue discovered and analyzed by Mingliang ZHAO. Patch by - Victor Stinner. +- gh-96387: At Python exit, sometimes a thread holding the GIL can wait + forever for a thread (usually a daemon thread) which requested to drop the + GIL, whereas the thread already exited. To fix the race condition, the + thread which requested the GIL drop now resets its request before exiting. + Issue discovered and analyzed by Mingliang ZHAO. Patch by Victor Stinner. -- gh-issue-96864: Fix a possible assertion failure, fatal error, or +- gh-96864: Fix a possible assertion failure, fatal error, or :exc:`SystemError` if a line tracing event raises an exception while opcode tracing is enabled. -- gh-issue-95778: The ``PyLong_FromString`` function was refactored to make - it more maintainable and extensible. +- gh-95778: The ``PyLong_FromString`` function was refactored to make it + more maintainable and extensible. -- gh-issue-96678: Fix undefined behaviour in C code of null pointer - arithmetic. +- gh-96678: Fix undefined behaviour in C code of null pointer arithmetic. -- gh-issue-96754: Make sure that all frame objects created are created from - valid interpreter frames. Prevents the possibility of invalid frames in +- gh-96754: Make sure that all frame objects created are created from valid + interpreter frames. Prevents the possibility of invalid frames in backtraces and signal handlers. -- gh-issue-90997: Improve the performance of reading and writing inline - bytecode caches on some platforms. +- gh-90997: Improve the performance of reading and writing inline bytecode + caches on some platforms. -- gh-issue-96751: Remove dead code from ``CALL_FUNCTION_EX`` opcode. +- gh-96751: Remove dead code from ``CALL_FUNCTION_EX`` opcode. -- gh-issue-90751: :class:`memoryview` now supports half-floats. Patch by - Donghee Na and Antoine Pitrou. +- gh-90751: :class:`memoryview` now supports half-floats. Patch by Donghee + Na and Antoine Pitrou. -- gh-issue-96678: Fix case of undefined behavior in ceval.c +- gh-96678: Fix case of undefined behavior in ceval.c -- gh-issue-64373: Convert :mod:`_functools` to argument clinic. +- gh-64373: Convert :mod:`!_functools` to argument clinic. -- gh-issue-96641: Do not expose ``KeyWrapper`` in :mod:`_functools`. +- gh-96641: Do not expose ``KeyWrapper`` in :mod:`!_functools`. -- gh-issue-96636: Ensure that tracing, ``sys.setrace()``, is turned on +- gh-96636: Ensure that tracing, ``sys.setrace()``, is turned on immediately. In pre-release versions of 3.11, some tracing events might have been lost when turning on tracing in a ``__del__`` method or interrupt. -- gh-issue-96572: Fix use after free in trace refs build mode. Patch by - Kumar Aditya. +- gh-96572: Fix use after free in trace refs build mode. Patch by Kumar + Aditya. -- gh-issue-96611: When loading a file with invalid UTF-8 inside a multi-line +- gh-96611: When loading a file with invalid UTF-8 inside a multi-line string, a correct SyntaxError is emitted. -- gh-issue-96612: Make sure that incomplete frames do not show up in - tracemalloc traces. +- gh-96612: Make sure that incomplete frames do not show up in tracemalloc + traces. -- gh-issue-90230: Fix compiler warnings and test failures when building with +- gh-90230: Fix compiler warnings and test failures when building with ``--enable-pystats``. -- gh-issue-96587: Correctly raise ``SyntaxError`` on exception groups - (:pep:`654`) on python versions prior to 3.11 +- gh-96587: Correctly raise ``SyntaxError`` on exception groups (:pep:`654`) + on python versions prior to 3.11 -- gh-issue-96569: Remove two cases of undefined behavior, by adding NULL - checks. +- gh-96569: Remove two cases of undefined behavior, by adding NULL checks. -- gh-issue-96582: Fix possible ``NULL`` pointer dereference in +- gh-96582: Fix possible ``NULL`` pointer dereference in ``_PyThread_CurrentFrames``. Patch by Kumar Aditya. -- gh-issue-91079: Separate Python recursion checking from C recursion - checking which reduces the chance of C stack overflow and allows the - recursion limit to be increased safely. +- gh-91079: Separate Python recursion checking from C recursion checking + which reduces the chance of C stack overflow and allows the recursion + limit to be increased safely. -- gh-issue-93911: Fix an issue that could prevent :opcode:`LOAD_ATTR` from +- gh-93911: Fix an issue that could prevent :opcode:`LOAD_ATTR` from specializing properly when accessing properties. -- gh-issue-96348: Emit a DeprecationWarning when :meth:`~generator.throw`, +- gh-96348: Emit a DeprecationWarning when :meth:`~generator.throw`, :meth:`~coroutine.throw` or :meth:`~agen.athrow` are called with more than one argument. -- gh-issue-95196: Disable incorrect pickling of the C implemented - classmethod descriptors. +- gh-95196: Disable incorrect pickling of the C implemented classmethod + descriptors. -- gh-issue-96364: Fix text signatures of ``list.__getitem__`` and +- gh-96364: Fix text signatures of ``list.__getitem__`` and ``dict.__getitem__``. -- gh-issue-96352: Fix :exc:`AttributeError` missing ``name`` and ``obj`` +- gh-96352: Fix :exc:`AttributeError` missing ``name`` and ``obj`` attributes in :meth:`object.__getattribute__`. Patch by Philip Georgi. -- gh-issue-93554: Change the jump opcodes so that all conditional jumps are +- gh-93554: Change the jump opcodes so that all conditional jumps are forward jumps. Backward jumps are converted by the assembler into a conditional forward jump whose target is the fallthrough block (and with a reversed condition), followed by an unconditional backward jump. For @@ -6234,20 +7136,20 @@ Core and Builtins The corresponding opcodes without direction are no longer pseudo-instructions, and they implement the forward conditional jumps. -- gh-issue-96268: Loading a file with invalid UTF-8 will now report the - broken character at the correct location. +- gh-96268: Loading a file with invalid UTF-8 will now report the broken + character at the correct location. -- gh-issue-96237: The internal field ``_PyInterpreterFrame.f_func`` is - renamed to ``_PyInterpreterFrame.f_funcobj`` and may be any object. The - ``f_globals`` and ``f_builtin`` fields may hold junk values. +- gh-96237: The internal field ``_PyInterpreterFrame.f_func`` is renamed to + ``_PyInterpreterFrame.f_funcobj`` and may be any object. The ``f_globals`` + and ``f_builtin`` fields may hold junk values. It is safest to treat the ``_PyInterpreterFrame`` struct as opaque. -- gh-issue-96187: Fixed a bug that caused ``_PyCode_GetExtra`` to return - garbage for negative indexes. Patch by Pablo Galindo +- gh-96187: Fixed a bug that caused ``_PyCode_GetExtra`` to return garbage + for negative indexes. Patch by Pablo Galindo -- gh-issue-96143: Add a new ``-X perf`` Python command line option as well - as :func:`sys.activate_stack_trampoline` and +- gh-96143: Add a new ``-X perf`` Python command line option as well as + :func:`sys.activate_stack_trampoline` and :func:`sys.deactivate_stack_trampoline` function in the :mod:`sys` module that allows to set/unset the interpreter in a way that the Linux ``perf`` profiler can detect Python calls. The new @@ -6256,329 +7158,319 @@ Core and Builtins and Christian Heimes with contributions from Gregory P. Smith [Google] and Mark Shannon. -- gh-issue-96071: Fix a deadlock in :c:func:`PyGILState_Ensure` when - allocating new thread state. Patch by Kumar Aditya. +- gh-96071: Fix a deadlock in :c:func:`PyGILState_Ensure` when allocating + new thread state. Patch by Kumar Aditya. -- gh-issue-96046: :c:func:`PyType_Ready` now initializes ``ht_cached_keys`` - and performs additional checks to ensure that type objects are properly +- gh-96046: :c:func:`PyType_Ready` now initializes ``ht_cached_keys`` and + performs additional checks to ensure that type objects are properly configured. This avoids crashes in 3rd party packages that don't use regular API to create new types. -- gh-issue-96005: On WASI :const:`~errno.ENOTCAPABLE` is now mapped to +- gh-96005: On WASI :const:`~errno.ENOTCAPABLE` is now mapped to :exc:`PermissionError`. The :mod:`errno` modules exposes the new error number. ``getpath.py`` now ignores :exc:`PermissionError` when it cannot open landmark files ``pybuilddir.txt`` and ``pyenv.cfg``. -- gh-issue-93678: Added test a harness for direct unit tests of the - compiler's optimization stage. The ``_testinternalcapi.optimize_cfg()`` - function runs the optimiser on a sequence of instructions. The +- gh-93678: Added test a harness for direct unit tests of the compiler's + optimization stage. The ``_testinternalcapi.optimize_cfg()`` function runs + the optimiser on a sequence of instructions. The ``CfgOptimizationTestCase`` class in ``test.support`` has utilities for invoking the optimizer and checking the output. -- gh-issue-95245: Reduces the size of a "simple" Python object from 8 to 6 - words by moving the weakreflist pointer into the pre-header directly - before the object's dict/values pointer. +- gh-95245: Reduces the size of a "simple" Python object from 8 to 6 words + by moving the weakreflist pointer into the pre-header directly before the + object's dict/values pointer. -- gh-issue-90997: Compile virtual :keyword:`try`/:keyword:`except` blocks to +- gh-90997: Compile virtual :keyword:`try`/:keyword:`except` blocks to handle exceptions raised during :meth:`~generator.close` or :meth:`~generator.throw` calls through a suspended frame. -- gh-issue-95977: Optimized calling :meth:`~object.__get__` with vectorcall. - Patch by Kumar Aditya. +- gh-95977: Optimized calling :meth:`~object.__get__` with vectorcall. Patch + by Kumar Aditya. -- gh-issue-91210: Improve error message when a parameter without a default - value follows one with a default value, and show the same message, even - when the non-default/default sequence is preceded by positional-only - parameters. +- gh-91210: Improve error message when a parameter without a default value + follows one with a default value, and show the same message, even when the + non-default/default sequence is preceded by positional-only parameters. -- gh-issue-95922: Fixed bug where the compiler's - ``eliminate_empty_basic_blocks`` function ignores the last block of the - code unit. +- gh-95922: Fixed bug where the compiler's ``eliminate_empty_basic_blocks`` + function ignores the last block of the code unit. -- gh-issue-95818: Skip over incomplete frames in - :c:func:`PyThreadState_GetFrame`. +- gh-95818: Skip over incomplete frames in :c:func:`PyThreadState_GetFrame`. -- gh-issue-95876: Fix format string in - ``_PyPegen_raise_error_known_location`` that can lead to memory corruption - on some 64bit systems. The function was building a tuple with ``i`` (int) - instead of ``n`` (Py_ssize_t) for Py_ssize_t arguments. +- gh-95876: Fix format string in ``_PyPegen_raise_error_known_location`` + that can lead to memory corruption on some 64bit systems. The function was + building a tuple with ``i`` (int) instead of ``n`` (Py_ssize_t) for + Py_ssize_t arguments. -- gh-issue-95605: Fix misleading contents of error message when converting - an all-whitespace string to :class:`float`. +- gh-95605: Fix misleading contents of error message when converting an + all-whitespace string to :class:`float`. -- gh-issue-95150: Update code object hashing and equality to consider all +- gh-95150: Update code object hashing and equality to consider all debugging and exception handling tables. This fixes an issue where certain non-identical code objects could be "deduplicated" during compilation. -- gh-issue-91146: Reduce allocation size of :class:`list` from - :meth:`str.split` and :meth:`str.rsplit`. Patch by Donghee Na and Inada - Naoki. +- gh-91146: Reduce allocation size of :class:`list` from :meth:`str.split` + and :meth:`str.rsplit`. Patch by Donghee Na and Inada Naoki. -- gh-issue-87092: Create a 'jump target label' abstraction in the compiler - so that the compiler's codegen stage does not work directly with basic - blocks. This prepares the code for changes to the underlying CFG - generation mechanism. +- gh-87092: Create a 'jump target label' abstraction in the compiler so that + the compiler's codegen stage does not work directly with basic blocks. + This prepares the code for changes to the underlying CFG generation + mechanism. -- gh-issue-95355: ``_PyPegen_Parser_New`` now properly detects token memory +- gh-95355: ``_PyPegen_Parser_New`` now properly detects token memory allocation errors. Patch by Honglin Zhu. -- gh-issue-90081: Run Python code in tracer/profiler function at full speed. - Fixes slowdown in earlier versions of 3.11. +- gh-90081: Run Python code in tracer/profiler function at full speed. Fixes + slowdown in earlier versions of 3.11. -- gh-issue-95324: Emit a warning in debug mode if an object does not call +- gh-95324: Emit a warning in debug mode if an object does not call :c:func:`PyObject_GC_UnTrack` before deallocation. Patch by Pablo Galindo. -- gh-issue-95245: Merge managed dict and values pointer into a single tagged +- gh-95245: Merge managed dict and values pointer into a single tagged pointer to save one word in the pre-header. -- gh-issue-93678: Add cfg_builder struct and refactor the relevant code so - that a cfg can be constructed without an instance of the compiler struct. +- gh-93678: Add cfg_builder struct and refactor the relevant code so that a + cfg can be constructed without an instance of the compiler struct. -- gh-issue-95185: Prevented crashes in the AST constructor when compiling - some absurdly long expressions like ``"+0"*1000000``. - :exc:`RecursionError` is now raised instead. Patch by Pablo Galindo +- gh-95185: Prevented crashes in the AST constructor when compiling some + absurdly long expressions like ``"+0"*1000000``. :exc:`RecursionError` is + now raised instead. Patch by Pablo Galindo -- gh-issue-93351: :class:`ast.AST` node positions are now validated when - provided to :func:`compile` and other related functions. If invalid - positions are detected, a :exc:`ValueError` will be raised. +- gh-93351: :class:`ast.AST` node positions are now validated when provided + to :func:`compile` and other related functions. If invalid positions are + detected, a :exc:`ValueError` will be raised. -- gh-issue-94438: Fix an issue that caused extended opcode arguments and - some conditional pops to be ignored when calculating valid jump targets - for assignments to the ``f_lineno`` attribute of frame objects. In some - cases, this could cause inconsistent internal state, resulting in a hard - crash of the interpreter. +- gh-94438: Fix an issue that caused extended opcode arguments and some + conditional pops to be ignored when calculating valid jump targets for + assignments to the ``f_lineno`` attribute of frame objects. In some cases, + this could cause inconsistent internal state, resulting in a hard crash of + the interpreter. -- gh-issue-95060: Undocumented ``PyCode_Addr2Location`` function now - properly returns when ``addrq`` argument is less than zero. +- gh-95060: Undocumented ``PyCode_Addr2Location`` function now properly + returns when ``addrq`` argument is less than zero. -- gh-issue-95113: Replace all ``EXTENDED_ARG_QUICK`` instructions with basic +- gh-95113: Replace all ``EXTENDED_ARG_QUICK`` instructions with basic :opcode:`EXTENDED_ARG` instructions in unquickened code. Consumers of non-adaptive bytecode should be able to handle extended arguments the same way they were handled in CPython 3.10 and older. -- gh-issue-91409: Fix incorrect source location info caused by certain +- gh-91409: Fix incorrect source location info caused by certain optimizations in the bytecode compiler. -- gh-issue-95023: Implement :func:`os.setns` and :func:`os.unshare` for - Linux. Patch by Noam Cohen. +- gh-95023: Implement :func:`os.setns` and :func:`os.unshare` for Linux. + Patch by Noam Cohen. -- gh-issue-94036: Fix incorrect source location info for some multi-line - attribute accesses and method calls. +- gh-94036: Fix incorrect source location info for some multi-line attribute + accesses and method calls. -- gh-issue-94938: Fix error detection in some builtin functions when keyword +- gh-94938: Fix error detection in some builtin functions when keyword argument name is an instance of a str subclass with overloaded ``__eq__`` and ``__hash__``. Previously it could cause SystemError or other undesired behavior. -- gh-issue-94996: :func:`ast.parse` will no longer parse function - definitions with positional-only params when passed ``feature_version`` - less than ``(3, 8)``. Patch by Shantanu Jain. - -- gh-issue-94739: Allow jumping within, out of, and across exception - handlers in the debugger. +- gh-94996: :func:`ast.parse` will no longer parse function definitions with + positional-only params when passed ``feature_version`` less than ``(3, + 8)``. Patch by Shantanu Jain. -- gh-issue-94949: :func:`ast.parse` will no longer parse parenthesized - context managers when passed ``feature_version`` less than ``(3, 9)``. - Patch by Shantanu Jain. +- gh-94739: Allow jumping within, out of, and across exception handlers in + the debugger. -- gh-issue-94947: :func:`ast.parse` will no longer parse assignment - expressions when passed ``feature_version`` less than ``(3, 8)``. Patch by +- gh-94949: :func:`ast.parse` will no longer parse parenthesized context + managers when passed ``feature_version`` less than ``(3, 9)``. Patch by Shantanu Jain. -- gh-issue-91256: Ensures the program name is known for help text during +- gh-94947: :func:`ast.parse` will no longer parse assignment expressions + when passed ``feature_version`` less than ``(3, 8)``. Patch by Shantanu + Jain. + +- gh-91256: Ensures the program name is known for help text during interpreter startup. -- gh-issue-94869: Fix the column offsets for some expressions in multi-line +- gh-94869: Fix the column offsets for some expressions in multi-line f-strings :mod:`ast` nodes. Patch by Pablo Galindo. -- gh-issue-94893: Fix an issue where frame object manipulations could - corrupt inline bytecode caches. +- gh-94893: Fix an issue where frame object manipulations could corrupt + inline bytecode caches. -- gh-issue-94822: Fix an issue where lookups of metaclass descriptors may be +- gh-94822: Fix an issue where lookups of metaclass descriptors may be ignored when an identically-named attribute also exists on the class itself. -- gh-issue-91153: Fix an issue where a :class:`bytearray` item assignment - could crash if it's resized by the new value's :meth:`__index__` method. +- gh-91153: Fix an issue where a :class:`bytearray` item assignment could + crash if it's resized by the new value's :meth:`__index__` method. -- gh-issue-90699: Fix reference counting bug in :meth:`bool.__repr__`. Patch - by Kumar Aditya. +- gh-90699: Fix reference counting bug in :meth:`bool.__repr__`. Patch by + Kumar Aditya. -- gh-issue-94694: Fix an issue that could cause code with multi-line method +- gh-94694: Fix an issue that could cause code with multi-line method lookups to have misleading or incorrect column offset information. In some cases (when compiling a hand-built AST) this could have resulted in a hard crash of the interpreter. -- gh-issue-93252: Fix an issue that caused internal frames to outlive failed +- gh-93252: Fix an issue that caused internal frames to outlive failed Python function calls, possibly resulting in memory leaks or hard interpreter crashes. -- gh-issue-94215: Fix an issue where exceptions raised by line-tracing - events would cause frames to be left in an invalid state, possibly - resulting in a hard crash of the interpreter. +- gh-94215: Fix an issue where exceptions raised by line-tracing events + would cause frames to be left in an invalid state, possibly resulting in a + hard crash of the interpreter. -- gh-issue-92228: Disable the compiler's inline-small-exit-blocks - optimization for exit blocks that are associated with source code lines. - This fixes a bug where the debugger cannot tell where an exception handler - ends and the following code block begins. +- gh-92228: Disable the compiler's inline-small-exit-blocks optimization for + exit blocks that are associated with source code lines. This fixes a bug + where the debugger cannot tell where an exception handler ends and the + following code block begins. -- gh-issue-94485: Line number of a module's ``RESUME`` instruction is set to - 0 as specified in :pep:`626`. +- gh-94485: Line number of a module's ``RESUME`` instruction is set to 0 as + specified in :pep:`626`. -- gh-issue-94438: Account for instructions that can push NULL to the stack - when setting line number in a frame. Prevents some (unlikely) crashes. +- gh-94438: Account for instructions that can push NULL to the stack when + setting line number in a frame. Prevents some (unlikely) crashes. -- gh-issue-91719: Reload ``opcode`` when raising ``unknown opcode error`` in - the interpreter main loop, for C compilers to generate dispatching code +- gh-91719: Reload ``opcode`` when raising ``unknown opcode error`` in the + interpreter main loop, for C compilers to generate dispatching code independently. -- gh-issue-94329: Compile and run code with unpacking of extremely large - sequences (1000s of elements). Such code failed to compile. It now - compiles and runs correctly. +- gh-94329: Compile and run code with unpacking of extremely large sequences + (1000s of elements). Such code failed to compile. It now compiles and runs + correctly. -- gh-issue-94360: Fixed a tokenizer crash when reading encoded files with - syntax errors from ``stdin`` with non utf-8 encoded text. Patch by Pablo - Galindo +- gh-94360: Fixed a tokenizer crash when reading encoded files with syntax + errors from ``stdin`` with non utf-8 encoded text. Patch by Pablo Galindo -- gh-issue-88116: Fix an issue when reading line numbers from code objects - if the encoded line numbers are close to ``INT_MIN``. Patch by Pablo - Galindo +- gh-88116: Fix an issue when reading line numbers from code objects if the + encoded line numbers are close to ``INT_MIN``. Patch by Pablo Galindo -- gh-issue-94262: Don't create frame objects for incomplete frames. Prevents - the creation of generators and closures from being observable to Python - and C extensions, restoring the behavior of 3.10 and earlier. +- gh-94262: Don't create frame objects for incomplete frames. Prevents the + creation of generators and closures from being observable to Python and C + extensions, restoring the behavior of 3.10 and earlier. -- gh-issue-94192: Fix error for dictionary literals with invalid expression - as value. +- gh-94192: Fix error for dictionary literals with invalid expression as + value. -- gh-issue-87995: :class:`types.MappingProxyType` instances are now hashable - if the underlying mapping is hashable. +- gh-87995: :class:`types.MappingProxyType` instances are now hashable if + the underlying mapping is hashable. -- gh-issue-93883: Revise the display strategy of traceback enhanced error +- gh-93883: Revise the display strategy of traceback enhanced error locations. The indicators are only shown when the location doesn't span the whole line. -- gh-issue-94163: Add :opcode:`BINARY_SLICE` and :opcode:`STORE_SLICE` +- gh-94163: Add :opcode:`BINARY_SLICE` and :opcode:`STORE_SLICE` instructions for more efficient handling and better specialization of slicing operations, where the slice is explicit in the source code. -- gh-issue-94021: Fix unreachable code warning in ``Python/specialize.c``. +- gh-94021: Fix unreachable code warning in ``Python/specialize.c``. -- gh-issue-93911: Specialize ``LOAD_ATTR`` for objects with custom +- gh-93911: Specialize ``LOAD_ATTR`` for objects with custom ``__getattribute__``. -- gh-issue-93955: Improve performance of attribute lookups on objects with - custom ``__getattribute__`` and ``__getattr__``. Patch by Ken Jin. +- gh-93955: Improve performance of attribute lookups on objects with custom + ``__getattribute__`` and ``__getattr__``. Patch by Ken Jin. -- gh-issue-93911: Specialize ``LOAD_ATTR`` for ``property()`` attributes. +- gh-93911: Specialize ``LOAD_ATTR`` for ``property()`` attributes. -- gh-issue-93678: Refactor compiler optimisation code so that it no longer - needs the ``struct assembler`` and ``struct compiler`` passed around. - Instead, each function takes the CFG and other data that it actually - needs. This will make it possible to test this code directly. +- gh-93678: Refactor compiler optimisation code so that it no longer needs + the ``struct assembler`` and ``struct compiler`` passed around. Instead, + each function takes the CFG and other data that it actually needs. This + will make it possible to test this code directly. -- gh-issue-93841: When built with ``-enable-pystats``, ``sys._stats_on()``, +- gh-93841: When built with ``-enable-pystats``, ``sys._stats_on()``, ``sys._stats_off()``, ``sys._stats_clear()`` and ``sys._stats_dump()`` functions have been added to enable gathering stats for parts of programs. -- gh-issue-93516: Store offset of first traceable instruction in code object - to avoid having to recompute it for each instruction when tracing. +- gh-93516: Store offset of first traceable instruction in code object to + avoid having to recompute it for each instruction when tracing. -- gh-issue-93516: Lazily create a table mapping bytecode offsets to line - numbers to speed up calculation of line numbers when tracing. +- gh-93516: Lazily create a table mapping bytecode offsets to line numbers + to speed up calculation of line numbers when tracing. -- gh-issue-89828: :class:`types.GenericAlias` no longer relays the - ``__class__`` attribute. For example, ``isinstance(list[int], type)`` no - longer returns ``True``. +- gh-89828: :class:`types.GenericAlias` no longer relays the ``__class__`` + attribute. For example, ``isinstance(list[int], type)`` no longer returns + ``True``. -- gh-issue-93678: Refactor the compiler to reduce boilerplate and - repetition. +- gh-93678: Refactor the compiler to reduce boilerplate and repetition. -- gh-issue-93671: Fix some exponential backtrace case happening with deeply - nested sequence patterns in match statements. Patch by Pablo Galindo +- gh-93671: Fix some exponential backtrace case happening with deeply nested + sequence patterns in match statements. Patch by Pablo Galindo -- gh-issue-93662: Make sure that the end column offsets are correct in - multi-line method calls. Previously, the end column could precede the - column offset. +- gh-93662: Make sure that the end column offsets are correct in multi-line + method calls. Previously, the end column could precede the column offset. -- gh-issue-93461: :func:`importlib.invalidate_caches` now drops entries from +- gh-93461: :func:`importlib.invalidate_caches` now drops entries from :data:`sys.path_importer_cache` with a relative path as name. This solves a caching issue when a process changes its current working directory. ``FileFinder`` no longer inserts a dot in the path, e.g. ``/egg/./spam`` is now ``/egg/spam``. -- gh-issue-93621: Change order of bytecode instructions emitted for +- gh-93621: Change order of bytecode instructions emitted for :keyword:`with` and :keyword:`async with` to reduce the number of entries in the exception table. -- gh-issue-93533: Reduce the size of the inline cache for ``LOAD_METHOD`` by - 2 bytes. +- gh-93533: Reduce the size of the inline cache for ``LOAD_METHOD`` by 2 + bytes. -- gh-issue-93444: Removed redundant fields from the compiler's basicblock - struct: ``b_nofallthrough``, ``b_exit``, ``b_return``. They can be easily +- gh-93444: Removed redundant fields from the compiler's basicblock struct: + ``b_nofallthrough``, ``b_exit``, ``b_return``. They can be easily calculated from the opcode of the last instruction of the block. -- gh-issue-93429: ``LOAD_METHOD`` instruction has been removed. It was - merged back into ``LOAD_ATTR``. +- gh-93429: ``LOAD_METHOD`` instruction has been removed. It was merged back + into ``LOAD_ATTR``. -- gh-issue-93418: Fixed an assert where an f-string has an equal sign '=' +- gh-93418: Fixed an assert where an f-string has an equal sign '=' following an expression, but there's no trailing brace. For example, f"{i=". -- gh-issue-93382: Cache the result of :c:func:`PyCode_GetCode` function to - restore the *O*\ (1) lookup of the :attr:`~types.CodeType.co_code` - attribute. +- gh-93382: Cache the result of :c:func:`PyCode_GetCode` function to restore + the *O*\ (1) lookup of the :attr:`~types.CodeType.co_code` attribute. -- gh-issue-93359: Ensure that custom :mod:`ast` nodes without explicit end +- gh-93359: Ensure that custom :mod:`ast` nodes without explicit end positions can be compiled. Patch by Pablo Galindo. -- gh-issue-93356: Code for exception handlers is emitted at the end of the - code unit's bytecode. This avoids one jump when no exception is raised. +- gh-93356: Code for exception handlers is emitted at the end of the code + unit's bytecode. This avoids one jump when no exception is raised. -- gh-issue-93354: Use exponential backoff for specialization counters in the +- gh-93354: Use exponential backoff for specialization counters in the interpreter. Can reduce the number of failed specializations significantly and avoid slowdown for those parts of a program that are not suitable for specialization. -- gh-issue-93283: Improve error message for invalid syntax of conversion - character in f-string expressions. +- gh-93283: Improve error message for invalid syntax of conversion character + in f-string expressions. -- gh-issue-93345: Fix a crash in substitution of a ``TypeVar`` in nested - generic alias after ``TypeVarTuple``. +- gh-93345: Fix a crash in substitution of a ``TypeVar`` in nested generic + alias after ``TypeVarTuple``. -- gh-issue-93223: When a bytecode instruction jumps to an unconditional jump +- gh-93223: When a bytecode instruction jumps to an unconditional jump instruction, the first instruction can often be optimized to target the unconditional jump's target directly. For tracing reasons, this would previously only occur if both instructions have the same line number. This also now occurs if the unconditional jump is artificial, i.e., if it has no associated line number. -- gh-issue-84694: The ``--experimental-isolated-subinterpreters`` configure - option and ``EXPERIMENTAL_ISOLATED_SUBINTERPRETERS`` macro have been - removed. +- gh-84694: The ``--experimental-isolated-subinterpreters`` configure option + and ``EXPERIMENTAL_ISOLATED_SUBINTERPRETERS`` macro have been removed. -- gh-issue-91924: Fix ``__lltrace__`` debug feature if the stdout encoding - is not UTF-8. Patch by Victor Stinner. +- gh-91924: Fix ``__lltrace__`` debug feature if the stdout encoding is not + UTF-8. Patch by Victor Stinner. -- gh-issue-93040: Wraps unused parameters in ``Objects/obmalloc.c`` with +- gh-93040: Wraps unused parameters in ``Objects/obmalloc.c`` with ``Py_UNUSED``. -- gh-issue-93143: Avoid ``NULL`` checks for uninitialized local variables by +- gh-93143: Avoid ``NULL`` checks for uninitialized local variables by determining at compile time which variables must be initialized. -- gh-issue-93061: Backward jumps after ``async for`` loops are no longer - given dubious line numbers. +- gh-93061: Backward jumps after ``async for`` loops are no longer given + dubious line numbers. -- gh-issue-93065: Fix contextvars HAMT implementation to handle iteration - over deep trees. +- gh-93065: Fix contextvars HAMT implementation to handle iteration over + deep trees. The bug was discovered and fixed by Eli Libman. See `MagicStack/immutables#84 `_ for more details. -- gh-issue-93012: Added the new function :c:func:`PyType_FromMetaclass`, - which generalizes the existing :c:func:`PyType_FromModuleAndSpec` using an +- gh-93012: Added the new function :c:func:`PyType_FromMetaclass`, which + generalizes the existing :c:func:`PyType_FromModuleAndSpec` using an additional metaclass argument. This is useful for language binding tools, where it can be used to intercept type-related operations like subclassing or static attribute access by specifying a metaclass with custom slots. @@ -6587,63 +7479,62 @@ Core and Builtins API, which provides a path towards migrating more binding tools onto the Stable ABI. -- gh-issue-93021: Fix the :attr:`__text_signature__` for :meth:`__get__` - methods implemented in C. Patch by Jelle Zijlstra. +- gh-93021: Fix the :attr:`__text_signature__` for :meth:`__get__` methods + implemented in C. Patch by Jelle Zijlstra. -- gh-issue-89914: The operand of the ``YIELD_VALUE`` instruction is set to - the stack depth. This is done to help frame handling on ``yield`` and may +- gh-89914: The operand of the ``YIELD_VALUE`` instruction is set to the + stack depth. This is done to help frame handling on ``yield`` and may assist debuggers. -- gh-issue-92955: Fix memory leak in code object's lines and positions - iterators as they were not finalized at exit. Patch by Kumar Aditya. +- gh-92955: Fix memory leak in code object's lines and positions iterators + as they were not finalized at exit. Patch by Kumar Aditya. -- gh-issue-92930: Fixed a crash in ``_pickle.c`` from mutating collections - during ``__reduce__`` or ``persistent_id``. +- gh-92930: Fixed a crash in ``_pickle.c`` from mutating collections during + ``__reduce__`` or ``persistent_id``. -- gh-issue-90690: The PRECALL instruction has been removed. It offered only - a small advantage for specialization and is not needed in the vast - majority of cases. +- gh-90690: The PRECALL instruction has been removed. It offered only a + small advantage for specialization and is not needed in the vast majority + of cases. -- gh-issue-92914: Always round the allocated size for lists up to the - nearest even number. +- gh-92914: Always round the allocated size for lists up to the nearest even + number. -- gh-issue-92858: Improve error message for some suites with syntax error - before ':' +- gh-92858: Improve error message for some suites with syntax error before + ':' -- gh-issue-90473: Decrease default recursion limit on WASI to address - limited call stack size. +- gh-90473: Decrease default recursion limit on WASI to address limited call + stack size. -- gh-issue-92804: Fix memory leak in ``memoryview`` iterator as it was not +- gh-92804: Fix memory leak in ``memoryview`` iterator as it was not finalized at exit. Patch by Kumar Aditya. -- gh-issue-92777: Specialize ``LOAD_METHOD`` for objects with lazy - dictionaries. Patch by Ken Jin. +- gh-92777: Specialize ``LOAD_METHOD`` for objects with lazy dictionaries. + Patch by Ken Jin. -- gh-issue-92658: Add support for connecting and binding to Hyper-V sockets - on Windows Hyper-V hosts and guests. +- gh-92658: Add support for connecting and binding to Hyper-V sockets on + Windows Hyper-V hosts and guests. -- gh-issue-92236: Remove spurious "LINE" event when starting a generator or +- gh-92236: Remove spurious "LINE" event when starting a generator or coroutine, visible tracing functions implemented in C. -- gh-issue-91102: :meth:`_warnings.warn_explicit` is ported to Argument - Clinic. +- gh-91102: :meth:`!_warnings.warn_explicit` is ported to Argument Clinic. -- gh-issue-92619: Make the compiler duplicate an exit block only if none of - its instructions have a lineno (previously only the first instruction in - the block was checked, leading to unnecessarily duplicated blocks). +- gh-92619: Make the compiler duplicate an exit block only if none of its + instructions have a lineno (previously only the first instruction in the + block was checked, leading to unnecessarily duplicated blocks). -- gh-issue-88750: The deprecated debug build only ``PYTHONTHREADDEBUG`` +- gh-88750: The deprecated debug build only ``PYTHONTHREADDEBUG`` environment variable no longer does anything. -- gh-issue-92261: Fix hang when trying to iterate over a ``typing.Union``. +- gh-92261: Fix hang when trying to iterate over a ``typing.Union``. -- gh-issue-91432: Specialized the :opcode:`FOR_ITER` opcode using the PEP - 659 machinery +- gh-91432: Specialized the :opcode:`FOR_ITER` opcode using the PEP 659 + machinery -- gh-issue-91399: Removed duplicate '{0, 0, 0, 0, 0, 0}' entry in +- gh-91399: Removed duplicate '{0, 0, 0, 0, 0, 0}' entry in 'Objects/unicodetype_db.h'. -- gh-issue-91578: Updates the error message for abstract class. +- gh-91578: Updates the error message for abstract class. - bpo-47091: Improve performance of repetition of :class:`list` and :class:`tuple` by using ``memcpy`` to copy data and performing the @@ -6659,85 +7550,84 @@ Core and Builtins Library ------- -- gh-issue-89237: Fix hang on Windows in ``subprocess.wait_closed()`` in +- gh-89237: Fix hang on Windows in ``subprocess.wait_closed()`` in :mod:`asyncio` with :class:`~asyncio.ProactorEventLoop`. Patch by Kumar Aditya. -- gh-issue-97928: :meth:`tkinter.Text.count` raises now an exception for - options starting with "-" instead of silently ignoring them. +- gh-97928: :meth:`tkinter.Text.count` raises now an exception for options + starting with "-" instead of silently ignoring them. -- gh-issue-98393: The :mod:`os` module no longer accepts bytes-like paths, - like :class:`bytearray` and :class:`memoryview` types: only the exact +- gh-98393: The :mod:`os` module no longer accepts bytes-like paths, like + :class:`bytearray` and :class:`memoryview` types: only the exact :class:`bytes` type is accepted for bytes strings. Patch by Victor Stinner. -- gh-issue-98363: Added itertools.batched() to batch data into lists of a - given length with the last list possibly being shorter than the others. +- gh-98363: Added itertools.batched() to batch data into lists of a given + length with the last list possibly being shorter than the others. -- gh-issue-98331: Update the bundled copies of pip and setuptools to - versions 22.3 and 65.5.0 respectively. +- gh-98331: Update the bundled copies of pip and setuptools to versions 22.3 + and 65.5.0 respectively. -- gh-issue-98307: A :meth:`~logging.handlers.SysLogHandler.createSocket` - method was added to :class:`~logging.handlers.SysLogHandler`. +- gh-98307: A :meth:`~logging.handlers.SysLogHandler.createSocket` method + was added to :class:`~logging.handlers.SysLogHandler`. -- gh-issue-96035: Fix bug in :func:`urllib.parse.urlparse` that causes - certain port numbers containing whitespace, underscores, plus and minus - signs, or non-ASCII digits to be incorrectly accepted. +- gh-96035: Fix bug in :func:`urllib.parse.urlparse` that causes certain + port numbers containing whitespace, underscores, plus and minus signs, or + non-ASCII digits to be incorrectly accepted. -- gh-issue-98257: Make :func:`sys.setprofile` and :func:`sys.settrace` - functions reentrant. They can no long fail with: ``RuntimeError("Cannot - install a trace function while another trace function is being - installed")``. Patch by Victor Stinner. +- gh-98257: Make :func:`sys.setprofile` and :func:`sys.settrace` functions + reentrant. They can no long fail with: ``RuntimeError("Cannot install a + trace function while another trace function is being installed")``. Patch + by Victor Stinner. -- gh-issue-98251: Allow :mod:`venv` to pass along :envvar:`!PYTHON*` - variables to ``ensurepip`` and ``pip`` when they do not impact path - resolution +- gh-98251: Allow :mod:`venv` to pass along :envvar:`!PYTHON*` variables to + ``ensurepip`` and ``pip`` when they do not impact path resolution -- gh-issue-94597: Deprecated +- gh-94597: Deprecated :meth:`asyncio.AbstractEventLoopPolicy.get_child_watcher` and :meth:`asyncio.AbstractEventLoopPolicy.set_child_watcher` methods to be removed in Python 3.14. Patch by Kumar Aditya. -- gh-issue-98178: On macOS, fix a crash in :func:`syslog.syslog` in - multi-threaded applications. On macOS, the libc ``syslog()`` function is - not thread-safe, so :func:`syslog.syslog` no longer releases the GIL to - call it. Patch by Victor Stinner. +- gh-98178: On macOS, fix a crash in :func:`syslog.syslog` in multi-threaded + applications. On macOS, the libc ``syslog()`` function is not thread-safe, + so :func:`syslog.syslog` no longer releases the GIL to call it. Patch by + Victor Stinner. -- gh-issue-44098: Release the GIL when creating :class:`mmap.mmap` objects - on Unix. +- gh-44098: Release the GIL when creating :class:`mmap.mmap` objects on + Unix. -- gh-issue-87730: Wrap network errors consistently in urllib FTP support, so - the test suite doesn't fail when a network is available but the public +- gh-87730: Wrap network errors consistently in urllib FTP support, so the + test suite doesn't fail when a network is available but the public internet is not reachable. -- gh-issue-94597: The child watcher classes +- gh-94597: The child watcher classes :class:`~asyncio.MultiLoopChildWatcher`, :class:`~asyncio.FastChildWatcher` and :class:`~asyncio.SafeChildWatcher` are deprecated and will be removed in Python 3.14. Patch by Kumar Aditya. -- gh-issue-98023: Change default child watcher to +- gh-98023: Change default child watcher to :class:`~asyncio.PidfdChildWatcher` on Linux systems which supports it. Patch by Kumar Aditya. -- gh-issue-90985: Earlier in 3.11 we deprecated +- gh-90985: Earlier in 3.11 we deprecated ``asyncio.Task.cancel("message")``. We realized we were too harsh, and have undeprecated it. -- gh-issue-65961: Do not rely solely on ``__cached__`` on modules; code will - also support ``__spec__.cached``. +- gh-65961: Do not rely solely on ``__cached__`` on modules; code will also + support ``__spec__.cached``. -- gh-issue-97646: Replace deprecated ``application/javascript`` with +- gh-97646: Replace deprecated ``application/javascript`` with ``text/javascript`` in :mod:`mimetypes`. See :rfc:`9239`. Patch by Noam Cohen. -- gh-issue-97930: Apply changes from importlib_resources 5.8 and 5.9: +- gh-97930: Apply changes from importlib_resources 5.8 and 5.9: ``Traversable.joinpath`` provides a concrete implementation. ``as_file`` now supports directories of resources. -- gh-issue-97850: Remove deprecated :func:`!importlib.util.set_loader` and +- gh-97850: Remove deprecated :func:`!importlib.util.set_loader` and :func:`!importlib.util.module_for_loader` from :mod:`importlib.util`. -- gh-issue-97837: Change deprecate warning message in :mod:`unittest` from +- gh-97837: Change deprecate warning message in :mod:`unittest` from ``It is deprecated to return a value!=None`` @@ -6745,46 +7635,46 @@ Library ``It is deprecated to return a value that is not None from a test case`` -- gh-issue-97825: Fixes :exc:`AttributeError` when - :meth:`subprocess.check_output` is used with argument ``input=None`` and - either of the arguments *encoding* or *errors* are used. +- gh-97825: Fixes :exc:`AttributeError` when :meth:`subprocess.check_output` + is used with argument ``input=None`` and either of the arguments + *encoding* or *errors* are used. -- gh-issue-97008: :exc:`NameError` and :exc:`AttributeError` spelling - suggestions provided since :gh:`82711` are now also emitted by the pure - Python :mod:`traceback` module. Tests for those suggestions now exercise - both implementations to ensure they are equivalent. Patch by Carl - Friedrich Bolz-Tereick and Łukasz Langa. +- gh-97008: :exc:`NameError` and :exc:`AttributeError` spelling suggestions + provided since :gh:`82711` are now also emitted by the pure Python + :mod:`traceback` module. Tests for those suggestions now exercise both + implementations to ensure they are equivalent. Patch by Carl Friedrich + Bolz-Tereick and Łukasz Langa. -- gh-issue-97799: :mod:`dataclass` now uses :func:`inspect.get_annotations` - to examine the annotations on class objects. +- gh-97799: :mod:`dataclass` now uses :func:`inspect.get_annotations` to + examine the annotations on class objects. -- gh-issue-97781: Removed deprecated interfaces in ``importlib.metadata`` - (entry points accessed as dictionary, implicit dictionary construction of +- gh-97781: Removed deprecated interfaces in ``importlib.metadata`` (entry + points accessed as dictionary, implicit dictionary construction of sequence of ``EntryPoint`` objects, mutablility of ``EntryPoints`` result, access of entry point by index). ``entry_points`` now has a simpler, more straightforward API (returning ``EntryPoints``). -- gh-issue-96827: Avoid spurious tracebacks from :mod:`asyncio` when default +- gh-96827: Avoid spurious tracebacks from :mod:`asyncio` when default executor cleanup is delayed until after the event loop is closed (e.g. as the result of a keyboard interrupt). -- gh-issue-95534: :meth:`gzip.GzipFile.read` reads 10% faster. +- gh-95534: :meth:`gzip.GzipFile.read` reads 10% faster. -- gh-issue-97592: Avoid a crash in the C version of +- gh-97592: Avoid a crash in the C version of :meth:`asyncio.Future.remove_done_callback` when an evil argument is passed. -- gh-issue-97639: Remove ``tokenize.NL`` check from :mod:`tabnanny`. +- gh-97639: Remove ``tokenize.NL`` check from :mod:`tabnanny`. -- gh-issue-97545: Make Semaphore run faster. +- gh-97545: Make Semaphore run faster. -- gh-issue-73588: Fix generation of the default name of +- gh-73588: Fix generation of the default name of :class:`tkinter.Checkbutton`. Previously, checkbuttons in different parent widgets could have the same short name and share the same state if arguments "name" and "variable" are not specified. Now they are globally unique. -- gh-issue-96865: fix Flag to use boundary CONFORM +- gh-96865: fix Flag to use boundary CONFORM This restores previous Flag behavior of allowing flags with non-sequential values to be combined; e.g. @@ -6793,396 +7683,391 @@ Library Skip.TWO | Skip.EIGHT -> -- gh-issue-97005: Update bundled libexpat to 2.4.9 +- gh-97005: Update bundled libexpat to 2.4.9 -- gh-issue-85760: Fix race condition in :mod:`asyncio` where +- gh-85760: Fix race condition in :mod:`asyncio` where :meth:`~asyncio.SubprocessProtocol.process_exited` called before the :meth:`~asyncio.SubprocessProtocol.pipe_data_received` leading to inconsistent output. Patch by Kumar Aditya. -- gh-issue-96704: Pass the correct ``contextvars.Context`` when a - ``asyncio`` exception handler is called on behalf of a task or callback - handle. This adds a new ``Task`` method, ``get_context``, and also a new - ``Handle`` method with the same name. If this method is not found on a - task object (perhaps because it is a third-party library that does not yet - provide this method), the context prevailing at the time the exception - handler is called is used. +- gh-96704: Pass the correct ``contextvars.Context`` when a ``asyncio`` + exception handler is called on behalf of a task or callback handle. This + adds a new ``Task`` method, ``get_context``, and also a new ``Handle`` + method with the same name. If this method is not found on a task object + (perhaps because it is a third-party library that does not yet provide + this method), the context prevailing at the time the exception handler is + called is used. -- gh-issue-96819: Fixed check in :mod:`multiprocessing.resource_tracker` - that guarantees that the length of a write to a pipe is not greater than +- gh-96819: Fixed check in :mod:`multiprocessing.resource_tracker` that + guarantees that the length of a write to a pipe is not greater than ``PIPE_BUF``. -- gh-issue-95865: Reduce :func:`urllib.parse.quote_from_bytes` memory use on - large values. +- gh-95865: Reduce :func:`urllib.parse.quote_from_bytes` memory use on large + values. Contributed by Dennis Sweeney. -- gh-issue-96741: Corrected type annotation for dataclass attribute +- gh-96741: Corrected type annotation for dataclass attribute ``pstats.FunctionProfile.ncalls`` to be ``str``. -- gh-issue-96734: Update :mod:`unicodedata` database to Unicode 15.0.0. +- gh-96734: Update :mod:`unicodedata` database to Unicode 15.0.0. -- gh-issue-96735: Fix undefined behaviour in :func:`struct.unpack`. +- gh-96735: Fix undefined behaviour in :func:`struct.unpack`. -- gh-issue-46412: Improve performance of ``bool(db)`` for large ndb/gdb - databases. Previously this would call ``len(db)`` which would iterate over - all keys -- the answer (empty or not) is known after the first key. +- gh-46412: Improve performance of ``bool(db)`` for large ndb/gdb databases. + Previously this would call ``len(db)`` which would iterate over all keys + -- the answer (empty or not) is known after the first key. -- gh-issue-96652: Fix the faulthandler implementation of +- gh-96652: Fix the faulthandler implementation of ``faulthandler.register(signal, chain=True)`` if the ``sigaction()`` function is not available: don't call the previous signal handler if it's NULL. Patch by Victor Stinner. -- gh-issue-68163: Correct conversion of :class:`numbers.Rational`'s to +- gh-68163: Correct conversion of :class:`numbers.Rational`'s to :class:`float`. -- gh-issue-96538: Speed up ``bisect.bisect()`` functions by taking advantage - of type-stability. +- gh-96538: Speed up ``bisect.bisect()`` functions by taking advantage of + type-stability. -- gh-issue-96465: Fraction hashes are now cached. +- gh-96465: Fraction hashes are now cached. -- gh-issue-96079: In :mod:`typing`, fix missing field ``name`` and incorrect +- gh-96079: In :mod:`typing`, fix missing field ``name`` and incorrect ``__module__`` in _AnnotatedAlias. -- gh-issue-96415: Remove ``types._cell_factory`` from module namespace. +- gh-96415: Remove ``types._cell_factory`` from module namespace. -- gh-issue-95987: Fix ``repr`` of ``Any`` subclasses. +- gh-95987: Fix ``repr`` of ``Any`` subclasses. -- gh-issue-96388: Work around missing socket functions in +- gh-96388: Work around missing socket functions in :class:`~socket.socket`'s ``__repr__``. -- gh-issue-96385: Fix ``TypeVarTuple.__typing_prepare_subst__``. - ``TypeError`` was not raised when using more than one ``TypeVarTuple``, - like ``[*T, *V]`` in type alias substitutions. +- gh-96385: Fix ``TypeVarTuple.__typing_prepare_subst__``. ``TypeError`` was + not raised when using more than one ``TypeVarTuple``, like ``[*T, *V]`` in + type alias substitutions. -- gh-issue-96142: Add ``match_args``, ``kw_only``, ``slots``, and - ``weakref_slot`` to ``_DataclassParams``. +- gh-96142: Add ``match_args``, ``kw_only``, ``slots``, and ``weakref_slot`` + to ``_DataclassParams``. -- gh-issue-96073: In :mod:`inspect`, fix overeager replacement of - "``typing.``" in formatting annotations. +- gh-96073: In :mod:`inspect`, fix overeager replacement of "``typing.``" in + formatting annotations. -- gh-issue-89258: Added a :meth:`~logging.Logger.getChildren` method to +- gh-89258: Added a :meth:`~logging.Logger.getChildren` method to :class:`logging.Logger`, to get the immediate child loggers of a logger. -- gh-issue-96346: Use double caching for compiled RE patterns. +- gh-96346: Use double caching for compiled RE patterns. -- gh-issue-96349: Fixed a minor performance regression in +- gh-96349: Fixed a minor performance regression in :func:`threading.Event.__init__` -- gh-issue-90467: Fix :class:`asyncio.streams.StreamReaderProtocol` to keep - a strong reference to the created task, so that it's not garbage collected +- gh-90467: Fix :class:`asyncio.streams.StreamReaderProtocol` to keep a + strong reference to the created task, so that it's not garbage collected -- gh-issue-96172: Fix a bug in ``unicodedata``: ``east_asian_width`` used to +- gh-96172: Fix a bug in ``unicodedata``: ``east_asian_width`` used to return the wrong value for unassigned characters; and for yet unassigned, but reserved characters. -- gh-issue-96159: Fix a performance regression in logging +- gh-96159: Fix a performance regression in logging TimedRotatingFileHandler. Only check for special files when the rollover time has passed. -- gh-issue-96175: Fix unused ``localName`` parameter in the ``Attr`` class - in :mod:`xml.dom.minidom`. +- gh-96175: Fix unused ``localName`` parameter in the ``Attr`` class in + :mod:`xml.dom.minidom`. -- gh-issue-96145: Add AttrDict to JSON module for use with object_hook. +- gh-96145: Add AttrDict to JSON module for use with object_hook. -- gh-issue-96052: Fix handling compiler warnings (SyntaxWarning and +- gh-96052: Fix handling compiler warnings (SyntaxWarning and DeprecationWarning) in :func:`codeop.compile_command` when checking for incomplete input. Previously it emitted warnings and raised a SyntaxError. Now it always returns ``None`` for incomplete input without emitting any warnings. -- gh-issue-96125: Fix incorrect condition that causes - ``sys.thread_info.name`` to be wrong on pthread platforms. +- gh-96125: Fix incorrect condition that causes ``sys.thread_info.name`` to + be wrong on pthread platforms. -- gh-issue-96019: Fix a bug in the ``makeunicodedata.py`` script leading to - about 13 KiB of space saving in the ``unicodedata`` module, specifically - the character decomposition data. +- gh-96019: Fix a bug in the ``makeunicodedata.py`` script leading to about + 13 KiB of space saving in the ``unicodedata`` module, specifically the + character decomposition data. -- gh-issue-95463: Remove an incompatible change from :issue:`28080` that - caused a regression that ignored the utf8 in ``ZipInfo.flag_bits``. Patch - by Pablo Galindo. +- gh-95463: Remove an incompatible change from :issue:`28080` that caused a + regression that ignored the utf8 in ``ZipInfo.flag_bits``. Patch by Pablo + Galindo. -- gh-issue-69142: Add ``%:z`` strftime format code (generates tzoffset with - colons as separator), see :ref:`strftime-strptime-behavior`. +- gh-69142: Add ``%:z`` strftime format code (generates tzoffset with colons + as separator), see :ref:`strftime-strptime-behavior`. -- gh-issue-95899: Fix :class:`asyncio.Runner` to call +- gh-95899: Fix :class:`asyncio.Runner` to call :func:`asyncio.set_event_loop` only once to avoid calling :meth:`~asyncio.AbstractChildWatcher.attach_loop` multiple times on child watchers. Patch by Kumar Aditya. -- gh-issue-95736: Fix :class:`unittest.IsolatedAsyncioTestCase` to set event - loop before calling setup functions. Patch by Kumar Aditya. +- gh-95736: Fix :class:`unittest.IsolatedAsyncioTestCase` to set event loop + before calling setup functions. Patch by Kumar Aditya. -- gh-issue-95865: Speed up :func:`urllib.parse.quote_from_bytes` by - replacing a list comprehension with ``map()``. +- gh-95865: Speed up :func:`urllib.parse.quote_from_bytes` by replacing a + list comprehension with ``map()``. -- gh-issue-95861: Add support for computing Spearman's correlation - coefficient to the existing statistics.correlation() function. +- gh-95861: Add support for computing Spearman's correlation coefficient to + the existing statistics.correlation() function. -- gh-issue-95804: Fix ``logging`` shutdown handler so it respects +- gh-95804: Fix ``logging`` shutdown handler so it respects ``MemoryHandler.flushOnClose``. -- gh-issue-95704: When a task catches :exc:`asyncio.CancelledError` and - raises some other error, the other error should generally not silently be +- gh-95704: When a task catches :exc:`asyncio.CancelledError` and raises + some other error, the other error should generally not silently be suppressed. -- gh-issue-95149: The :class:`HTTPStatus ` enum offers a - couple of properties to indicate the HTTP status category e.g. +- gh-95149: The :class:`HTTPStatus ` enum offers a couple + of properties to indicate the HTTP status category e.g. ``HTTPStatus.OK.is_success``. -- gh-issue-95609: Update bundled pip to 22.2.2. +- gh-95609: Update bundled pip to 22.2.2. -- gh-issue-95289: Fix :class:`asyncio.TaskGroup` to propagate exception when +- gh-95289: Fix :class:`asyncio.TaskGroup` to propagate exception when :exc:`asyncio.CancelledError` was replaced with another exception by a context manager. Patch by Kumar Aditya and Guido van Rossum. -- gh-issue-94909: Fix incorrect joining of relative Windows paths with - drives in :class:`pathlib.PurePath` initializer. +- gh-94909: Fix incorrect joining of relative Windows paths with drives in + :class:`pathlib.PurePath` initializer. -- gh-issue-95385: Faster ``json.dumps()`` when sorting of keys is not - requested (default). +- gh-95385: Faster ``json.dumps()`` when sorting of keys is not requested + (default). -- gh-issue-83901: Improve :meth:`Signature.bind ` - error message for missing keyword-only arguments. +- gh-83901: Improve :meth:`Signature.bind ` error + message for missing keyword-only arguments. -- gh-issue-95339: Update bundled pip to 22.2.1. +- gh-95339: Update bundled pip to 22.2.1. -- gh-issue-95045: Fix GC crash when deallocating ``_lsprof.Profiler`` by +- gh-95045: Fix GC crash when deallocating ``_lsprof.Profiler`` by untracking it before calling any callbacks. Patch by Kumar Aditya. -- gh-issue-95231: Fail gracefully if :const:`~errno.EPERM` or +- gh-95231: Fail gracefully if :const:`~errno.EPERM` or :const:`~errno.ENOSYS` is raised when loading :mod:`crypt` methods. This may happen when trying to load ``MD5`` on a Linux kernel with :abbr:`FIPS (Federal Information Processing Standard)` enabled. -- gh-issue-95097: Fix :func:`asyncio.run` for :class:`asyncio.Task` +- gh-95097: Fix :func:`asyncio.run` for :class:`asyncio.Task` implementations without :meth:`~asyncio.Task.uncancel` method. Patch by Kumar Aditya. -- gh-issue-95087: Fix IndexError in parsing invalid date in the :mod:`email` +- gh-95087: Fix IndexError in parsing invalid date in the :mod:`email` module. -- gh-issue-95199: Upgrade bundled setuptools to 63.2.0. +- gh-95199: Upgrade bundled setuptools to 63.2.0. -- gh-issue-95194: Upgrade bundled pip to 22.2. +- gh-95194: Upgrade bundled pip to 22.2. -- gh-issue-93899: Fix check for existence of :const:`os.EFD_CLOEXEC`, +- gh-93899: Fix check for existence of :const:`os.EFD_CLOEXEC`, :const:`os.EFD_NONBLOCK` and :const:`os.EFD_SEMAPHORE` flags on older kernel versions where these flags are not present. Patch by Kumar Aditya. -- gh-issue-95166: Fix :meth:`concurrent.futures.Executor.map` to cancel the +- gh-95166: Fix :meth:`concurrent.futures.Executor.map` to cancel the currently waiting on future on an error - e.g. TimeoutError or KeyboardInterrupt. -- gh-issue-95132: Fix a :mod:`sqlite3` regression where ``*args`` and - ``**kwds`` were incorrectly relayed from :py:func:`~sqlite3.connect` to - the :class:`~sqlite3.Connection` factory. The regression was introduced in +- gh-95132: Fix a :mod:`sqlite3` regression where ``*args`` and ``**kwds`` + were incorrectly relayed from :py:func:`~sqlite3.connect` to the + :class:`~sqlite3.Connection` factory. The regression was introduced in 3.11a1 with PR 24421 (:gh:`85128`). Patch by Erlend E. Aasland. -- gh-issue-93157: Fix :mod:`fileinput` module didn't support ``errors`` - option when ``inplace`` is true. +- gh-93157: Fix :mod:`fileinput` module didn't support ``errors`` option + when ``inplace`` is true. -- gh-issue-91212: Fixed flickering of the turtle window when the tracer is - turned off. Patch by Shin-myoung-serp. +- gh-91212: Fixed flickering of the turtle window when the tracer is turned + off. Patch by Shin-myoung-serp. -- gh-issue-95077: Add deprecation warning for enum ``member.member`` access - (e.g. ``Color.RED.BLUE``). Remove ``EnumMeta.__getattr__``. +- gh-95077: Add deprecation warning for enum ``member.member`` access (e.g. + ``Color.RED.BLUE``). Remove ``EnumMeta.__getattr__``. -- gh-issue-95109: Ensure that timeouts scheduled with - :class:`asyncio.Timeout` that have already expired are delivered promptly. +- gh-95109: Ensure that timeouts scheduled with :class:`asyncio.Timeout` + that have already expired are delivered promptly. -- gh-issue-95105: :meth:`wsgiref.types.InputStream.__iter__` should return +- gh-95105: :meth:`wsgiref.types.InputStream.__iter__` should return ``Iterator[bytes]``, not ``Iterable[bytes]``. Patch by Shantanu Jain. -- gh-issue-95066: Replaced assert with exception in :func:`ast.parse`, when +- gh-95066: Replaced assert with exception in :func:`ast.parse`, when ``feature_version`` has an invalid major version. Patch by Shantanu Jain. -- gh-issue-77617: Add :mod:`sqlite3` :ref:`command-line interface - `. Patch by Erlend Aasland. +- gh-77617: Add :mod:`sqlite3` :ref:`command-line interface `. + Patch by Erlend Aasland. -- gh-issue-95005: Replace :c:expr:`_PyAccu` with :c:expr:`_PyUnicodeWriter` - in JSON encoder and StringIO and remove the :c:expr:`_PyAccu` - implementation. +- gh-95005: Replace :c:expr:`_PyAccu` with :c:expr:`_PyUnicodeWriter` in + JSON encoder and StringIO and remove the :c:expr:`_PyAccu` implementation. -- gh-issue-90085: Remove ``-c/--clock`` and ``-t/--time`` CLI options of +- gh-90085: Remove ``-c/--clock`` and ``-t/--time`` CLI options of :mod:`timeit`. The options had been deprecated since Python 3.3 and the functionality was removed in Python 3.7. Patch by Shantanu Jain. -- gh-issue-94857: Fix refleak in ``_io.TextIOWrapper.reconfigure``. Patch by - Kumar Aditya. +- gh-94857: Fix refleak in ``_io.TextIOWrapper.reconfigure``. Patch by Kumar + Aditya. -- gh-issue-94821: Fix binding of unix socket to empty address on Linux to - use an available address from the abstract namespace, instead of "\0". +- gh-94821: Fix binding of unix socket to empty address on Linux to use an + available address from the abstract namespace, instead of "\0". -- gh-issue-94736: Fix crash when deallocating an instance of a subclass of +- gh-94736: Fix crash when deallocating an instance of a subclass of ``_multiprocessing.SemLock``. Patch by Kumar Aditya. -- gh-issue-81620: Add random.binomialvariate(). +- gh-81620: Add random.binomialvariate(). -- gh-issue-74116: Allow :meth:`asyncio.StreamWriter.drain` to be awaited +- gh-74116: Allow :meth:`asyncio.StreamWriter.drain` to be awaited concurrently by multiple tasks. Patch by Kumar Aditya. -- gh-issue-87822: When called with ``capture_locals=True``, the - :mod:`traceback` module functions swallow exceptions raised from calls to - ``repr()`` on local variables of frames. This is in order to prioritize - the original exception over rendering errors. An indication of the - failure is printed in place of the missing value. (Patch by Simon-Martin - Schroeder). +- gh-87822: When called with ``capture_locals=True``, the :mod:`traceback` + module functions swallow exceptions raised from calls to ``repr()`` on + local variables of frames. This is in order to prioritize the original + exception over rendering errors. An indication of the failure is printed + in place of the missing value. (Patch by Simon-Martin Schroeder). -- gh-issue-88050: Fix :mod:`asyncio` subprocess transport to kill process - cleanly when process is blocked and avoid ``RuntimeError`` when loop is - closed. Patch by Kumar Aditya. +- gh-88050: Fix :mod:`asyncio` subprocess transport to kill process cleanly + when process is blocked and avoid ``RuntimeError`` when loop is closed. + Patch by Kumar Aditya. -- gh-issue-94637: :meth:`SSLContext.set_default_verify_paths` now releases - the GIL around ``SSL_CTX_set_default_verify_paths`` call. The function - call performs I/O and CPU intensive work. +- gh-94637: :meth:`SSLContext.set_default_verify_paths` now releases the GIL + around ``SSL_CTX_set_default_verify_paths`` call. The function call + performs I/O and CPU intensive work. -- gh-issue-94309: Deprecate aliases :class:`typing.Hashable` and +- gh-94309: Deprecate aliases :class:`typing.Hashable` and :class:`typing.Sized` -- gh-issue-92546: An undocumented ``python -m pprint`` benchmark is moved - into ``pprint`` suite of pyperformance. Patch by Oleg Iarygin. +- gh-92546: An undocumented ``python -m pprint`` benchmark is moved into + ``pprint`` suite of pyperformance. Patch by Oleg Iarygin. -- gh-issue-94607: Fix subclassing complex generics with type variables in +- gh-94607: Fix subclassing complex generics with type variables in :mod:`typing`. Previously an error message saying ``Some type variables ... are not listed in Generic[...]`` was shown. :mod:`typing` no longer populates ``__parameters__`` with the ``__parameters__`` of a Python class. -- gh-issue-94619: Remove the long-deprecated ``module_repr()`` from +- gh-94619: Remove the long-deprecated ``module_repr()`` from :mod:`importlib`. -- gh-issue-93910: The ability to access the other values of an enum on an - enum (e.g. ``Color.RED.BLUE``) has been restored in order to fix a - performance regression. +- gh-93910: The ability to access the other values of an enum on an enum + (e.g. ``Color.RED.BLUE``) has been restored in order to fix a performance + regression. -- gh-issue-93896: Fix :func:`asyncio.run` and +- gh-93896: Fix :func:`asyncio.run` and :class:`unittest.IsolatedAsyncioTestCase` to always the set event loop as it was done in Python 3.10 and earlier. Patch by Kumar Aditya. -- gh-issue-94343: Allow setting the attributes of ``reprlib.Repr`` during - object initialization - -- gh-issue-94382: Port static types of ``_multiprocessing`` module to heap - types. Patch by Kumar Aditya. +- gh-94343: Allow setting the attributes of ``reprlib.Repr`` during object + initialization -- gh-issue-78724: Fix crash in :class:`struct.Struct` when it was not - completely initialized by initializing it in :meth:`~object.__new__`. +- gh-94382: Port static types of ``_multiprocessing`` module to heap types. Patch by Kumar Aditya. -- gh-issue-94510: Re-entrant calls to :func:`sys.setprofile` and +- gh-78724: Fix crash in :class:`struct.Struct` when it was not completely + initialized by initializing it in :meth:`~object.__new__`. Patch by Kumar + Aditya. + +- gh-94510: Re-entrant calls to :func:`sys.setprofile` and :func:`sys.settrace` now raise :exc:`RuntimeError`. Patch by Pablo Galindo. -- gh-issue-92336: Fix bug where :meth:`linecache.getline` fails on bad files - with :exc:`UnicodeDecodeError` or :exc:`SyntaxError`. It now returns an - empty string as per the documentation. +- gh-92336: Fix bug where :meth:`linecache.getline` fails on bad files with + :exc:`UnicodeDecodeError` or :exc:`SyntaxError`. It now returns an empty + string as per the documentation. -- gh-issue-94398: Once a :class:`asyncio.TaskGroup` has started shutting - down (i.e., at least one task has failed and the task group has started +- gh-94398: Once a :class:`asyncio.TaskGroup` has started shutting down + (i.e., at least one task has failed and the task group has started cancelling the remaining tasks), it should not be possible to add new tasks to the task group. -- gh-issue-94383: :mod:`xml.etree`: Remove the - ``ElementTree.Element.copy()`` method of the pure Python implementation, - deprecated in Python 3.10, use the :func:`copy.copy` function instead. The - C implementation of :mod:`xml.etree` has no ``copy()`` method, only a - ``__copy__()`` method. Patch by Victor Stinner. +- gh-94383: :mod:`xml.etree`: Remove the ``ElementTree.Element.copy()`` + method of the pure Python implementation, deprecated in Python 3.10, use + the :func:`copy.copy` function instead. The C implementation of + :mod:`xml.etree` has no ``copy()`` method, only a ``__copy__()`` method. + Patch by Victor Stinner. -- gh-issue-94379: :mod:`zipimport`: Remove ``find_loader()`` and - ``find_module()`` methods, deprecated in Python 3.10: use the - ``find_spec()`` method instead. See :pep:`451` for the rationale. Patch by - Victor Stinner. +- gh-94379: :mod:`zipimport`: Remove ``find_loader()`` and ``find_module()`` + methods, deprecated in Python 3.10: use the ``find_spec()`` method + instead. See :pep:`451` for the rationale. Patch by Victor Stinner. -- gh-issue-94352: :func:`shlex.split`: Passing ``None`` for *s* argument now +- gh-94352: :func:`shlex.split`: Passing ``None`` for *s* argument now raises an exception, rather than reading :data:`sys.stdin`. The feature was deprecated in Python 3.9. Patch by Victor Stinner. -- gh-issue-94318: Strip trailing spaces in :mod:`pydoc` text output. +- gh-94318: Strip trailing spaces in :mod:`pydoc` text output. -- gh-issue-89988: Fix memory leak in :class:`pickle.Pickler` when looking up +- gh-89988: Fix memory leak in :class:`pickle.Pickler` when looking up :attr:`dispatch_table`. Patch by Kumar Aditya. -- gh-issue-90016: Deprecate :mod:`sqlite3` :ref:`default adapters and - converters `. Patch by Erlend E. Aasland. +- gh-90016: Deprecate :mod:`sqlite3` :ref:`default adapters and converters + `. Patch by Erlend E. Aasland. -- gh-issue-94254: Fixed types of :mod:`struct` module to be immutable. Patch - by Kumar Aditya. +- gh-94254: Fixed types of :mod:`struct` module to be immutable. Patch by + Kumar Aditya. -- gh-issue-93259: Now raise ``ValueError`` when ``None`` or an empty string - are passed to ``Distribution.from_name`` (and other callers). +- gh-93259: Now raise ``ValueError`` when ``None`` or an empty string are + passed to ``Distribution.from_name`` (and other callers). -- gh-issue-74696: :func:`shutil.make_archive` now passes the *root_dir* - argument to custom archivers which support it. +- gh-74696: :func:`shutil.make_archive` now passes the *root_dir* argument + to custom archivers which support it. -- gh-issue-94216: The :mod:`dis` module now has the opcodes for pseudo +- gh-94216: The :mod:`dis` module now has the opcodes for pseudo instructions (those which are used by the compiler during code generation but then removed or replaced by real opcodes before the final bytecode is emitted). -- gh-issue-93096: Removed undocumented ``python -m codecs``. Use ``python -m +- gh-93096: Removed undocumented ``python -m codecs``. Use ``python -m unittest test.test_codecs.EncodedFileTest`` instead. -- gh-issue-94207: Made :class:`_struct.Struct` GC-tracked in order to fix a - reference leak in the :mod:`_struct` module. +- gh-94207: Made :class:`!_struct.Struct` GC-tracked in order to fix a + reference leak in the :mod:`!_struct` module. -- gh-issue-93096: Removed undocumented ``-t`` argument of ``python -m - base64``. Use ``python -m unittest +- gh-93096: Removed undocumented ``-t`` argument of ``python -m base64``. + Use ``python -m unittest test.test_base64.LegacyBase64TestCase.test_encodebytes`` instead. -- gh-issue-94226: Remove the :func:`locale.format` function, deprecated in - Python 3.7: use :func:`locale.format_string` instead. Patch by Victor - Stinner. +- gh-94226: Remove the :func:`locale.format` function, deprecated in Python + 3.7: use :func:`locale.format_string` instead. Patch by Victor Stinner. -- gh-issue-94199: Remove the :func:`ssl.match_hostname` function. The +- gh-94199: Remove the :func:`ssl.match_hostname` function. The :func:`ssl.match_hostname` was deprecated in Python 3.7. OpenSSL performs hostname matching since Python 3.7, Python no longer uses the :func:`ssl.match_hostname` function. Patch by Victor Stinner. -- gh-issue-94214: Document the ``context`` object used in the - ``venv.EnvBuilder`` class, and add the new environment's library path to - it. +- gh-94214: Document the ``context`` object used in the ``venv.EnvBuilder`` + class, and add the new environment's library path to it. -- gh-issue-94199: Remove the :func:`ssl.wrap_socket` function, deprecated in +- gh-94199: Remove the :func:`ssl.wrap_socket` function, deprecated in Python 3.7: instead, create a :class:`ssl.SSLContext` object and call its :class:`ssl.SSLContext.wrap_socket` method. Any package that still uses :func:`ssl.wrap_socket` is broken and insecure. The function neither sends a SNI TLS extension nor validates server hostname. Code is subject to :cwe:`295` Improper Certificate Validation. Patch by Victor Stinner. -- gh-issue-94199: Remove the :func:`ssl.RAND_pseudo_bytes` function, - deprecated in Python 3.6: use :func:`os.urandom` or :func:`ssl.RAND_bytes` - instead. Patch by Victor Stinner. +- gh-94199: Remove the :func:`ssl.RAND_pseudo_bytes` function, deprecated in + Python 3.6: use :func:`os.urandom` or :func:`ssl.RAND_bytes` instead. + Patch by Victor Stinner. -- gh-issue-94199: :mod:`hashlib`: Remove the pure Python implementation of - :func:`hashlib.pbkdf2_hmac()`, deprecated in Python 3.10. Python 3.10 and +- gh-94199: :mod:`hashlib`: Remove the pure Python implementation of + :func:`hashlib.pbkdf2_hmac`, deprecated in Python 3.10. Python 3.10 and newer requires OpenSSL 1.1.1 (:pep:`644`): this OpenSSL version provides a - C implementation of :func:`~hashlib.pbkdf2_hmac()` which is faster. Patch - by Victor Stinner. + C implementation of :func:`~hashlib.pbkdf2_hmac` which is faster. Patch by + Victor Stinner. -- gh-issue-94196: :mod:`gzip`: Remove the ``filename`` attribute of +- gh-94196: :mod:`gzip`: Remove the ``filename`` attribute of :class:`gzip.GzipFile`, deprecated since Python 2.6, use the :attr:`~gzip.GzipFile.name` attribute instead. In write mode, the ``filename`` attribute added ``'.gz'`` file extension if it was not present. Patch by Victor Stinner. -- gh-issue-94182: run the :class:`asyncio.PidfdChildWatcher` on the running - loop, this allows event loops to run subprocesses when there is no default - event loop running on the main thread +- gh-94182: run the :class:`asyncio.PidfdChildWatcher` on the running loop, + this allows event loops to run subprocesses when there is no default event + loop running on the main thread -- gh-issue-94169: Remove ``io.OpenWrapper`` and ``_pyio.OpenWrapper``, - deprecated in Python 3.10: just use :func:`open` instead. The :func:`open` +- gh-94169: Remove ``io.OpenWrapper`` and ``_pyio.OpenWrapper``, deprecated + in Python 3.10: just use :func:`open` instead. The :func:`open` (:func:`io.open`) function is a built-in function. Since Python 3.10, - :func:`_pyio.open` is also a static method. Patch by Victor Stinner. + :func:`!_pyio.open` is also a static method. Patch by Victor Stinner. -- gh-issue-91742: Fix :mod:`pdb` crash after jump caused by a null pointer +- gh-91742: Fix :mod:`pdb` crash after jump caused by a null pointer dereference. Patch by Kumar Aditya. -- gh-issue-94101: Manual instantiation of :class:`ssl.SSLSession` objects is - no longer allowed as it lead to misconfigured instances that crashed the +- gh-94101: Manual instantiation of :class:`ssl.SSLSession` objects is no + longer allowed as it lead to misconfigured instances that crashed the interpreter when attributes where accessed on them. -- gh-issue-84753: :func:`inspect.iscoroutinefunction`, +- gh-84753: :func:`inspect.iscoroutinefunction`, :func:`inspect.isgeneratorfunction`, and :func:`inspect.isasyncgenfunction` now properly return ``True`` for duck-typed function-like objects like instances of @@ -7191,303 +8076,296 @@ Library This makes :func:`inspect.iscoroutinefunction` consistent with the behavior of :func:`asyncio.iscoroutinefunction`. Patch by Mehdi ABAAKOUK. -- gh-issue-94028: Fix a regression in the :mod:`sqlite3` where statement - objects were not properly cleared and reset after use in cursor iters. The +- gh-94028: Fix a regression in the :mod:`sqlite3` where statement objects + were not properly cleared and reset after use in cursor iters. The regression was introduced by PR 27884 in Python 3.11a1. Patch by Erlend E. Aasland. -- gh-issue-93973: Add keyword argument ``all_errors`` to +- gh-93973: Add keyword argument ``all_errors`` to ``asyncio.create_connection`` so that multiple connection errors can be raised as an ``ExceptionGroup``. -- gh-issue-93963: Officially deprecate from ``importlib.abc`` classes moved - to ``importlib.resources.abc``. +- gh-93963: Officially deprecate from ``importlib.abc`` classes moved to + ``importlib.resources.abc``. -- gh-issue-93858: Prevent error when activating venv in nested fish - instances. +- gh-93858: Prevent error when activating venv in nested fish instances. -- gh-issue-93820: Pickle :class:`enum.Flag` by name. +- gh-93820: Pickle :class:`enum.Flag` by name. -- gh-issue-93847: Fix repr of enum of generic aliases. +- gh-93847: Fix repr of enum of generic aliases. -- gh-issue-91404: Revert the :mod:`re` memory leak when a match is - terminated by a signal or memory allocation failure as the implemented fix - caused a major performance regression. +- gh-91404: Revert the :mod:`re` memory leak when a match is terminated by a + signal or memory allocation failure as the implemented fix caused a major + performance regression. -- gh-issue-83499: Fix double closing of file description in :mod:`tempfile`. +- gh-83499: Fix double closing of file description in :mod:`tempfile`. -- gh-issue-93820: Fixed a regression when :func:`copy.copy`-ing - :class:`enum.Flag` with multiple flag members. +- gh-93820: Fixed a regression when :func:`copy.copy`-ing :class:`enum.Flag` + with multiple flag members. -- gh-issue-79512: Fixed names and ``__module__`` value of :mod:`weakref` - classes :class:`~weakref.ReferenceType`, :class:`~weakref.ProxyType`, +- gh-79512: Fixed names and ``__module__`` value of :mod:`weakref` classes + :class:`~weakref.ReferenceType`, :class:`~weakref.ProxyType`, :class:`~weakref.CallableProxyType`. It makes them pickleable. -- gh-issue-91389: Fix an issue where :mod:`dis` utilities could report - missing or incorrect position information in the presence of ``CACHE`` - entries. +- gh-91389: Fix an issue where :mod:`dis` utilities could report missing or + incorrect position information in the presence of ``CACHE`` entries. -- gh-issue-93626: Set ``__future__.annotations`` to have a ``None`` +- gh-93626: Set ``__future__.annotations`` to have a ``None`` mandatoryRelease to indicate that it is currently 'TBD'. -- gh-issue-90473: Emscripten and WASI have no home directory and cannot - provide :pep:`370` user site directory. +- gh-90473: Emscripten and WASI have no home directory and cannot provide + :pep:`370` user site directory. -- gh-issue-90494: :func:`copy.copy` and :func:`copy.deepcopy` now always - raise a TypeError if ``__reduce__()`` returns a tuple with length 6 - instead of silently ignore the 6th item or produce incorrect result. +- gh-90494: :func:`copy.copy` and :func:`copy.deepcopy` now always raise a + TypeError if ``__reduce__()`` returns a tuple with length 6 instead of + silently ignore the 6th item or produce incorrect result. -- gh-issue-90549: Fix a multiprocessing bug where a global named resource - (such as a semaphore) could leak when a child process is spawned (as - opposed to forked). +- gh-90549: Fix a multiprocessing bug where a global named resource (such as + a semaphore) could leak when a child process is spawned (as opposed to + forked). -- gh-issue-93521: Fixed a case where dataclasses would try to add - ``__weakref__`` into the ``__slots__`` for a dataclass that specified +- gh-93521: Fixed a case where dataclasses would try to add ``__weakref__`` + into the ``__slots__`` for a dataclass that specified ``weakref_slot=True`` when it was already defined in one of its bases. This resulted in a ``TypeError`` upon the new class being created. -- gh-issue-79579: :mod:`sqlite3` now correctly detects DML queries with - leading comments. Patch by Erlend E. Aasland. +- gh-79579: :mod:`sqlite3` now correctly detects DML queries with leading + comments. Patch by Erlend E. Aasland. -- gh-issue-93421: Update :data:`sqlite3.Cursor.rowcount` when a DML - statement has run to completion. This fixes the row count for SQL queries - like ``UPDATE ... RETURNING``. Patch by Erlend E. Aasland. +- gh-93421: Update :data:`sqlite3.Cursor.rowcount` when a DML statement has + run to completion. This fixes the row count for SQL queries like ``UPDATE + ... RETURNING``. Patch by Erlend E. Aasland. -- gh-issue-93475: Expose ``FICLONE`` and ``FICLONERANGE`` constants in +- gh-93475: Expose ``FICLONE`` and ``FICLONERANGE`` constants in :mod:`fcntl`. Patch by Illia Volochii. -- gh-issue-93370: Deprecate :data:`sqlite3.version` and +- gh-93370: Deprecate :data:`sqlite3.version` and :data:`sqlite3.version_info`. -- gh-issue-91810: Suppress writing an XML declaration in open files in +- gh-91810: Suppress writing an XML declaration in open files in ``ElementTree.write()`` with ``encoding='unicode'`` and ``xml_declaration=None``. -- gh-issue-91162: Support splitting of unpacked arbitrary-length tuple over +- gh-91162: Support splitting of unpacked arbitrary-length tuple over ``TypeVar`` and ``TypeVarTuple`` parameters. For example: * ``A[T, *Ts][*tuple[int, ...]]`` -> ``A[int, *tuple[int, ...]]`` * ``A[*Ts, T][*tuple[int, ...]]`` -> ``A[*tuple[int, ...], int]`` -- gh-issue-93353: Fix the :func:`importlib.resources.as_file` context - manager to remove the temporary file if destroyed late during Python - finalization: keep a local reference to the :func:`os.remove` function. - Patch by Victor Stinner. +- gh-93353: Fix the :func:`importlib.resources.as_file` context manager to + remove the temporary file if destroyed late during Python finalization: + keep a local reference to the :func:`os.remove` function. Patch by Victor + Stinner. -- gh-issue-83658: Make :class:`multiprocessing.Pool` raise an exception if +- gh-83658: Make :class:`multiprocessing.Pool` raise an exception if ``maxtasksperchild`` is not ``None`` or a positive int. -- gh-issue-93312: Add :const:`os.PIDFD_NONBLOCK` flag to open a file - descriptor for a process with :func:`os.pidfd_open` in non-blocking mode. - Patch by Kumar Aditya. +- gh-93312: Add :const:`os.PIDFD_NONBLOCK` flag to open a file descriptor + for a process with :func:`os.pidfd_open` in non-blocking mode. Patch by + Kumar Aditya. -- gh-issue-88123: Implement ``Enum.__contains__`` that returns ``True`` or +- gh-88123: Implement ``Enum.__contains__`` that returns ``True`` or ``False`` to replace the deprecated behaviour that would sometimes raise a :exc:`TypeError`. -- gh-issue-93297: Make asyncio task groups prevent child tasks from being - GCed +- gh-93297: Make asyncio task groups prevent child tasks from being GCed -- gh-issue-85308: Changed :class:`argparse.ArgumentParser` to use +- gh-85308: Changed :class:`argparse.ArgumentParser` to use :term:`filesystem encoding and error handler` instead of default text encoding to read arguments from file (e.g. ``fromfile_prefix_chars`` option). This change affects Windows; argument file should be encoded with UTF-8 instead of ANSI Codepage. -- gh-issue-93156: Accessing the :attr:`pathlib.PurePath.parents` sequence of - an absolute path using negative index values produced incorrect results. +- gh-93156: Accessing the :attr:`pathlib.PurePath.parents` sequence of an + absolute path using negative index values produced incorrect results. -- gh-issue-93162: Add the ability for :func:`logging.config.dictConfig` to +- gh-93162: Add the ability for :func:`logging.config.dictConfig` to usefully configure :class:`~logging.handlers.QueueHandler` and :class:`~logging.handlers.QueueListener` as a pair, and add :func:`logging.getHandlerByName` and :func:`logging.getHandlerNames` APIs to allow access to handlers by name. -- gh-issue-93243: The :mod:`!smtpd` module was removed per the schedule in +- gh-93243: The :mod:`!smtpd` module was removed per the schedule in :pep:`594`. -- gh-issue-92886: Replace ``assert`` statements with ``raise - AssertionError()`` in :class:`~wsgiref.BaseHandler` so that the tested - behaviour is maintained running with optimizations ``(-O)``. +- gh-92886: Replace ``assert`` statements with ``raise AssertionError()`` in + :class:`~wsgiref.BaseHandler` so that the tested behaviour is maintained + running with optimizations ``(-O)``. -- gh-issue-90155: Fix broken :class:`asyncio.Semaphore` when acquire is - cancelled. +- gh-90155: Fix broken :class:`asyncio.Semaphore` when acquire is cancelled. -- gh-issue-90817: The :func:`locale.resetlocale` function is deprecated and - will be removed in Python 3.13. Use ``locale.setlocale(locale.LC_ALL, - "")`` instead. Patch by Victor Stinner. +- gh-90817: The :func:`locale.resetlocale` function is deprecated and will + be removed in Python 3.13. Use ``locale.setlocale(locale.LC_ALL, "")`` + instead. Patch by Victor Stinner. -- gh-issue-91513: Added ``taskName`` attribute to :mod:`logging` module for - use with :mod:`asyncio` tasks. +- gh-91513: Added ``taskName`` attribute to :mod:`logging` module for use + with :mod:`asyncio` tasks. -- gh-issue-74696: :func:`shutil.make_archive` no longer temporarily changes - the current working directory during creation of standard ``.zip`` or tar +- gh-74696: :func:`shutil.make_archive` no longer temporarily changes the + current working directory during creation of standard ``.zip`` or tar archives. -- gh-issue-92728: The :func:`re.template` function and the corresponding +- gh-92728: The :func:`re.template` function and the corresponding :const:`re.TEMPLATE` and :const:`re.T` flags are restored after they were removed in 3.11.0b1, but they are now deprecated, so they might be removed from Python 3.13. -- gh-issue-93033: Search in some strings (platform dependent i.e [U+0xFFFF, +- gh-93033: Search in some strings (platform dependent i.e [U+0xFFFF, U+0x0100] on Windows or [U+0xFFFFFFFF, U+0x00010000] on Linux 64-bit) are now up to 10 times faster. -- gh-issue-89973: Fix :exc:`re.error` raised in :mod:`fnmatch` if the - pattern contains a character range with upper bound lower than lower bound - (e.g. ``[c-a]``). Now such ranges are interpreted as empty ranges. +- gh-89973: Fix :exc:`re.error` raised in :mod:`fnmatch` if the pattern + contains a character range with upper bound lower than lower bound (e.g. + ``[c-a]``). Now such ranges are interpreted as empty ranges. -- gh-issue-93044: No longer convert the database argument of +- gh-93044: No longer convert the database argument of :func:`sqlite3.connect` to bytes before passing it to the factory. -- gh-issue-93010: In a very special case, the email package tried to append - the nonexistent ``InvalidHeaderError`` to the defect list. It should have - been ``InvalidHeaderDefect``. +- gh-93010: In a very special case, the email package tried to append the + nonexistent ``InvalidHeaderError`` to the defect list. It should have been + ``InvalidHeaderDefect``. -- gh-issue-92986: Fix :func:`ast.unparse` when ``ImportFrom.level`` is - ``None`` +- gh-92986: Fix :func:`ast.unparse` when ``ImportFrom.level`` is ``None`` -- gh-issue-92932: Now :func:`~dis.dis` and :func:`~dis.get_instructions` - handle operand values for instructions prefixed by ``EXTENDED_ARG_QUICK``. - Patch by Sam Gross and Donghee Na. +- gh-92932: Now :func:`~dis.dis` and :func:`~dis.get_instructions` handle + operand values for instructions prefixed by ``EXTENDED_ARG_QUICK``. Patch + by Sam Gross and Donghee Na. -- gh-issue-92675: Fix :func:`venv.ensure_directories` to accept +- gh-92675: Fix :func:`venv.ensure_directories` to accept :class:`pathlib.Path` arguments in addition to :class:`str` paths. Patch by David Foster. -- gh-issue-87901: Removed the ``encoding`` argument from :func:`os.popen` - that was added in 3.11b1. +- gh-87901: Removed the ``encoding`` argument from :func:`os.popen` that was + added in 3.11b1. -- gh-issue-91922: Fix function :func:`sqlite.connect` and the +- gh-91922: Fix function :func:`sqlite.connect` and the :class:`sqlite.Connection` constructor on non-UTF-8 locales. Also, they now support bytes paths non-decodable with the current FS encoding. -- gh-issue-92869: Added :class:`~ctypes.c_time_t` to :mod:`ctypes`, which - has the same size as the :c:type:`time_t` type in C. +- gh-92869: Added :class:`~ctypes.c_time_t` to :mod:`ctypes`, which has the + same size as the :c:type:`time_t` type in C. -- gh-issue-92839: Fixed crash resulting from calling bisect.insort() or +- gh-92839: Fixed crash resulting from calling bisect.insort() or bisect.insort_left() with the key argument not equal to ``None``. -- gh-issue-90473: :mod:`subprocess` now fails early on Emscripten and WASI +- gh-90473: :mod:`subprocess` now fails early on Emscripten and WASI platforms to work around missing :func:`os.pipe` on WASI. -- gh-issue-89325: Removed many old deprecated :mod:`unittest` features: +- gh-89325: Removed many old deprecated :mod:`unittest` features: :class:`~unittest.TestCase` method aliases, undocumented and broken :class:`~unittest.TestCase` method ``assertDictContainsSubset``, undocumented :meth:`TestLoader.loadTestsFromModule ` parameter *use_load_tests*, and an underscored alias of the :class:`~unittest.TextTestResult` class. -- gh-issue-92734: Allow multi-element reprs emitted by :mod:`reprlib` to be +- gh-92734: Allow multi-element reprs emitted by :mod:`reprlib` to be pretty-printed using configurable indentation. -- gh-issue-92671: Fixed :func:`ast.unparse` for empty tuples in the - assignment target context. +- gh-92671: Fixed :func:`ast.unparse` for empty tuples in the assignment + target context. -- gh-issue-91581: :meth:`~datetime.datetime.utcfromtimestamp` no longer - attempts to resolve ``fold`` in the pure Python implementation, since the - fold is never 1 in UTC. In addition to being slightly faster in the common - case, this also prevents some errors when the timestamp is close to +- gh-91581: :meth:`~datetime.datetime.utcfromtimestamp` no longer attempts + to resolve ``fold`` in the pure Python implementation, since the fold is + never 1 in UTC. In addition to being slightly faster in the common case, + this also prevents some errors when the timestamp is close to :attr:`datetime.min `. Patch by Paul Ganssle. -- gh-issue-86388: Removed randrange() functionality deprecated since Python - 3.10. Formerly, randrange(10.0) losslessly converted to randrange(10). - Now, it raises a TypeError. Also, the exception raised for non-integral - values such as randrange(10.5) or randrange('10') has been changed from +- gh-86388: Removed randrange() functionality deprecated since Python 3.10. + Formerly, randrange(10.0) losslessly converted to randrange(10). Now, it + raises a TypeError. Also, the exception raised for non-integral values + such as randrange(10.5) or randrange('10') has been changed from ValueError to TypeError. -- gh-issue-90385: Add :meth:`pathlib.Path.walk` as an alternative to +- gh-90385: Add :meth:`pathlib.Path.walk` as an alternative to :func:`os.walk`. -- gh-issue-92550: Fix :meth:`pathlib.Path.rglob` for empty pattern. +- gh-92550: Fix :meth:`pathlib.Path.rglob` for empty pattern. -- gh-issue-92591: Allow :mod:`logging` filters to return a +- gh-92591: Allow :mod:`logging` filters to return a :class:`logging.LogRecord` instance so that filters attached to :class:`logging.Handler`\ s can enrich records without side effects on other handlers. -- gh-issue-92445: Fix a bug in :mod:`argparse` where ``nargs="*"`` would - raise an error instead of returning an empty list when 0 arguments were - supplied if choice was also defined in ``parser.add_argument``. +- gh-92445: Fix a bug in :mod:`argparse` where ``nargs="*"`` would raise an + error instead of returning an empty list when 0 arguments were supplied if + choice was also defined in ``parser.add_argument``. -- gh-issue-92547: Remove undocumented :mod:`sqlite3` features deprecated in - Python 3.10: +- gh-92547: Remove undocumented :mod:`sqlite3` features deprecated in Python + 3.10: * ``sqlite3.enable_shared_cache()`` * ``sqlite3.OptimizedUnicode`` Patch by Erlend E. Aasland. -- gh-issue-92530: Fix an issue that occurred after interrupting +- gh-92530: Fix an issue that occurred after interrupting :func:`threading.Condition.notify`. -- gh-issue-92531: The statistics.median_grouped() function now always return - a float. Formerly, it did not convert the input type when for sequences of +- gh-92531: The statistics.median_grouped() function now always return a + float. Formerly, it did not convert the input type when for sequences of length one. -- gh-issue-84131: The :class:`pathlib.Path` deprecated method ``link_to`` - has been removed. Use 3.10's :meth:`~pathlib.Path.hardlink_to` method - instead as its semantics are consistent with that of +- gh-84131: The :class:`pathlib.Path` deprecated method ``link_to`` has been + removed. Use 3.10's :meth:`~pathlib.Path.hardlink_to` method instead as + its semantics are consistent with that of :meth:`~pathlib.Path.symlink_to`. -- gh-issue-89336: Removed :mod:`configparser` module APIs: the +- gh-89336: Removed :mod:`configparser` module APIs: the ``SafeConfigParser`` class alias, the ``ParsingError.filename`` property and parameter, and the ``ConfigParser.readfp`` method, all of which were deprecated since Python 3.2. -- gh-issue-92391: Add :meth:`~object.__class_getitem__` to +- gh-92391: Add :meth:`~object.__class_getitem__` to :class:`csv.DictReader` and :class:`csv.DictWriter`, allowing them to be parameterized at runtime. Patch by Marc Mueller. -- gh-issue-91968: Add ``SO_RTABLE`` and ``SO_USER_COOKIE`` constants to +- gh-91968: Add ``SO_RTABLE`` and ``SO_USER_COOKIE`` constants to :mod:`socket`. -- gh-issue-91810: :class:`~xml.etree.ElementTree.ElementTree` method +- gh-91810: :class:`~xml.etree.ElementTree.ElementTree` method :meth:`~xml.etree.ElementTree.ElementTree.write` and function :func:`~xml.etree.ElementTree.tostring` now use the text file's encoding ("UTF-8" if not available) instead of locale encoding in XML declaration when ``encoding="unicode"`` is specified. -- gh-issue-81790: :func:`os.path.splitdrive` now understands DOS device - paths with UNC links (beginning ``\\?\UNC\``). Contributed by Barney Gale. +- gh-81790: :func:`os.path.splitdrive` now understands DOS device paths with + UNC links (beginning ``\\?\UNC\``). Contributed by Barney Gale. -- gh-issue-91760: Apply more strict rules for numerical group references and - group names in regular expressions. Only sequence of ASCII digits is now +- gh-91760: Apply more strict rules for numerical group references and group + names in regular expressions. Only sequence of ASCII digits is now accepted as a numerical reference. The group name in bytes patterns and replacement strings can now only contain ASCII letters and digits and underscore. -- gh-issue-90622: Worker processes for +- gh-90622: Worker processes for :class:`concurrent.futures.ProcessPoolExecutor` are no longer spawned on demand (a feature added in 3.9) when the multiprocessing context start method is ``"fork"`` as that can lead to deadlocks in the child processes due to a fork happening while threads are running. -- gh-issue-91577: Move imports in :class:`~multiprocessing.SharedMemory` - methods to module level so that they can be executed late in python - finalization. +- gh-91577: Move imports in :class:`~multiprocessing.SharedMemory` methods + to module level so that they can be executed late in python finalization. -- gh-issue-91581: Remove an unhandled error case in the C implementation of - calls to :meth:`datetime.fromtimestamp ` - with no time zone (i.e. getting a local time from an epoch timestamp). - This should have no user-facing effect other than giving a possibly more +- gh-91581: Remove an unhandled error case in the C implementation of calls + to :meth:`datetime.fromtimestamp ` with + no time zone (i.e. getting a local time from an epoch timestamp). This + should have no user-facing effect other than giving a possibly more accurate error message when called with timestamps that fall on 10000-01-01 in the local time. Patch by Paul Ganssle. -- gh-issue-91539: Improve performance of - ``urllib.request.getproxies_environment`` when there are many environment - variables +- gh-91539: Improve performance of ``urllib.request.getproxies_environment`` + when there are many environment variables -- gh-issue-91524: Speed up the regular expression substitution (functions +- gh-91524: Speed up the regular expression substitution (functions :func:`re.sub` and :func:`re.subn` and corresponding :class:`re.Pattern` methods) for replacement strings containing group references by 2--3 times. -- gh-issue-91447: Fix findtext in the xml module to only give an empty - string when the text attribute is set to ``None``. +- gh-91447: Fix findtext in the xml module to only give an empty string when + the text attribute is set to ``None``. -- gh-issue-91456: Deprecate current default auto() behavior: In 3.13 the - default will be for for auto() to always return the largest member value +- gh-91456: Deprecate current default auto() behavior: In 3.13 the default + will be for for auto() to always return the largest member value incremented by 1, and to raise if incompatible value types are used. - bpo-47231: Fixed an issue with inconsistent trailing slashes in tarfile @@ -7500,7 +8378,7 @@ Library - bpo-41287: Fix handling of the ``doc`` argument in subclasses of :func:`property`. -- gh-issue-90005: :mod:`ctypes` dependency ``libffi`` is now detected with +- gh-90005: :mod:`ctypes` dependency ``libffi`` is now detected with ``pkg-config``. - bpo-32547: The constructors for :class:`~csv.DictWriter` and @@ -7533,8 +8411,8 @@ Library - bpo-46364: Restrict use of sockets instead of pipes for stdin of subprocesses created by :mod:`asyncio` to AIX platform only. -- bpo-28249: Set :attr:`doctest.DocTest.lineno` to ``None`` when object does - not have :attr:`__doc__`. +- bpo-28249: Set :attr:`doctest.DocTest.lineno` to ``None`` when an object + does not have :attr:`~definition.__doc__`. - bpo-46197: Fix :mod:`ensurepip` environment isolation for subprocess running ``pip``. @@ -7590,73 +8468,73 @@ Library Documentation ------------- -- gh-issue-85525: Remove extra row +- gh-85525: Remove extra row -- gh-issue-86404: Deprecated tools ``make suspicious`` and ``rstlint.py`` - are now removed. They have been replaced by :pypi:`sphinx-lint`. +- gh-86404: Deprecated tools ``make suspicious`` and ``rstlint.py`` are now + removed. They have been replaced by :pypi:`sphinx-lint`. -- gh-issue-97741: Fix ``!`` in c domain ref target syntax via a ``conf.py`` - patch, so it works as intended to disable ref target resolution. +- gh-97741: Fix ``!`` in c domain ref target syntax via a ``conf.py`` patch, + so it works as intended to disable ref target resolution. -- gh-issue-96432: Fraction literals now support whitespace around the - forward slash, ``Fraction('2 / 3')``. +- gh-96432: Fraction literals now support whitespace around the forward + slash, ``Fraction('2 / 3')``. -- gh-issue-96098: Improve discoverability of the higher level - concurrent.futures module by providing clearer links from the lower level - threading and multiprocessing modules. +- gh-96098: Improve discoverability of the higher level concurrent.futures + module by providing clearer links from the lower level threading and + multiprocessing modules. -- gh-issue-95957: What's New 3.11 now has instructions for how to provide - compiler and linker flags for Tcl/Tk and OpenSSL on RHEL 7 and CentOS 7. +- gh-95957: What's New 3.11 now has instructions for how to provide compiler + and linker flags for Tcl/Tk and OpenSSL on RHEL 7 and CentOS 7. -- gh-issue-95588: Clarified the conflicting advice given in the :mod:`ast` +- gh-95588: Clarified the conflicting advice given in the :mod:`ast` documentation about :func:`ast.literal_eval` being "safe" for use on untrusted input while at the same time warning that it can crash the process. The latter statement is true and is deemed unfixable without a large amount of work unsuitable for a bugfix. So we keep the warning and no longer claim that ``literal_eval`` is safe. -- gh-issue-91207: Fix stylesheet not working in Windows CHM htmlhelp docs - and add warning that they are deprecated. Contributed by C.A.M. Gerlach. +- gh-91207: Fix stylesheet not working in Windows CHM htmlhelp docs and add + warning that they are deprecated. Contributed by C.A.M. Gerlach. -- gh-issue-95454: Replaced incorrectly written true/false values in - documentation. Patch by Robert O'Shea +- gh-95454: Replaced incorrectly written true/false values in documentation. + Patch by Robert O'Shea -- gh-issue-95451: Update library documentation with :ref:`availability - information ` on WebAssembly platforms - ``wasm32-emscripten`` and ``wasm32-wasi``. +- gh-95451: Update library documentation with :ref:`availability information + ` on WebAssembly platforms ``wasm32-emscripten`` and + ``wasm32-wasi``. -- gh-issue-95415: Use consistent syntax for platform availability. The - directive now supports a content body and emits a warning when it - encounters an unknown platform. +- gh-95415: Use consistent syntax for platform availability. The directive + now supports a content body and emits a warning when it encounters an + unknown platform. -- gh-issue-94321: Document the :pep:`246` style protocol type +- gh-94321: Document the :pep:`246` style protocol type :class:`sqlite3.PrepareProtocol`. -- gh-issue-86128: Document a limitation in ThreadPoolExecutor where its exit +- gh-86128: Document a limitation in ThreadPoolExecutor where its exit handler is executed before any handlers in atexit. -- gh-issue-61162: Clarify :mod:`sqlite3` behavior when +- gh-61162: Clarify :mod:`sqlite3` behavior when :ref:`sqlite3-connection-context-manager`. -- gh-issue-87260: Align :mod:`sqlite3` argument specs with the actual +- gh-87260: Align :mod:`sqlite3` argument specs with the actual implementation. -- gh-issue-86986: The minimum Sphinx version required to build the - documentation is now 3.2. +- gh-86986: The minimum Sphinx version required to build the documentation + is now 3.2. -- gh-issue-88831: Augmented documentation of asyncio.create_task(). - Clarified the need to keep strong references to tasks and added a code - snippet detailing how to do this. +- gh-88831: Augmented documentation of asyncio.create_task(). Clarified the + need to keep strong references to tasks and added a code snippet detailing + how to do this. -- gh-issue-86438: Clarify that :option:`-W` and :envvar:`PYTHONWARNINGS` are +- gh-86438: Clarify that :option:`-W` and :envvar:`PYTHONWARNINGS` are matched literally and case-insensitively, rather than as regular expressions, in :mod:`warnings`. -- gh-issue-93031: Update tutorial introduction output to use 3.10+ - SyntaxError invalid range. +- gh-93031: Update tutorial introduction output to use 3.10+ SyntaxError + invalid range. -- gh-issue-92240: Added release dates for "What's New in Python 3.X" for - 3.0, 3.1, 3.2, 3.8 and 3.10 +- gh-92240: Added release dates for "What's New in Python 3.X" for 3.0, 3.1, + 3.2, 3.8 and 3.10 - bpo-47161: Document that :class:`pathlib.PurePath` does not collapse initial double slashes because they denote UNC paths. @@ -7676,125 +8554,121 @@ Documentation Tests ----- -- gh-issue-95027: On Windows, when the Python test suite is run with the - ``-jN`` option, the ANSI code page is now used as the encoding for the - stdout temporary file, rather than using UTF-8 which can lead to decoding - errors. Patch by Victor Stinner. +- gh-95027: On Windows, when the Python test suite is run with the ``-jN`` + option, the ANSI code page is now used as the encoding for the stdout + temporary file, rather than using UTF-8 which can lead to decoding errors. + Patch by Victor Stinner. -- gh-issue-96624: Fixed the failure of repeated runs of - ``test.test_unittest`` caused by side effects in - ``test_dotted_but_module_not_loaded``. +- gh-96624: Fixed the failure of repeated runs of ``test.test_unittest`` + caused by side effects in ``test_dotted_but_module_not_loaded``. -- gh-issue-95243: Mitigate the inherent race condition from using +- gh-95243: Mitigate the inherent race condition from using find_unused_port() in testSockName() by trying to find an unused port a few times before failing. Patch by Ross Burton. -- gh-issue-95573: :source:`Lib/test/test_asyncio/test_ssl.py` exposed a bug - in the macOS kernel where intense concurrent load on non-blocking sockets +- gh-95573: :source:`Lib/test/test_asyncio/test_ssl.py` exposed a bug in the + macOS kernel where intense concurrent load on non-blocking sockets occasionally causes :const:`errno.ENOBUFS` ("No buffer space available") to be emitted. FB11063974 filed with Apple, in the mean time as a workaround buffer size used in tests on macOS is decreased to avoid intermittent failures. Patch by Fantix King. -- gh-issue-95280: Fix problem with ``test_ssl`` ``test_get_ciphers`` on - systems that require perfect forward secrecy (PFS) ciphers. +- gh-95280: Fix problem with ``test_ssl`` ``test_get_ciphers`` on systems + that require perfect forward secrecy (PFS) ciphers. -- gh-issue-95212: Make multiprocessing test case - ``test_shared_memory_recreate`` parallel-safe. +- gh-95212: Make multiprocessing test case ``test_shared_memory_recreate`` + parallel-safe. -- gh-issue-95218: Move tests for importlib.resources into +- gh-95218: Move tests for importlib.resources into test_importlib.resources. -- gh-issue-93963: Updated tests to use preferred location for +- gh-93963: Updated tests to use preferred location for ``importlib.resources`` ABCs. -- gh-issue-94675: Add a regression test for :mod:`re` exponentional slowdown - when using rjsmin. +- gh-94675: Add a regression test for :mod:`re` exponentional slowdown when + using rjsmin. -- gh-issue-91330: Added more tests for :mod:`dataclasses` to cover behavior - with data descriptor-based fields. +- gh-91330: Added more tests for :mod:`dataclasses` to cover behavior with + data descriptor-based fields. -- gh-issue-94208: ``test_ssl`` is now checking for supported TLS version and +- gh-94208: ``test_ssl`` is now checking for supported TLS version and protocols in more tests. -- gh-issue-94315: Tests now check for DAC override capability instead of - relying on :func:`os.geteuid`. +- gh-94315: Tests now check for DAC override capability instead of relying + on :func:`os.geteuid`. -- gh-issue-54781: Rename test_tk to test_tkinter, and rename - test_ttk_guionly to test_ttk. Patch by Victor Stinner. +- gh-54781: Rename test_tk to test_tkinter, and rename test_ttk_guionly to + test_ttk. Patch by Victor Stinner. -- gh-issue-93839: Move ``Lib/ctypes/test/`` to ``Lib/test/test_ctypes/``. - Patch by Victor Stinner. +- gh-93839: Move ``Lib/ctypes/test/`` to ``Lib/test/test_ctypes/``. Patch by + Victor Stinner. -- gh-issue-93951: In test_bdb.StateTestCase.test_skip, avoid including - auxiliary importers. +- gh-93951: In test_bdb.StateTestCase.test_skip, avoid including auxiliary + importers. -- gh-issue-93957: Provide nicer error reporting from subprocesses in +- gh-93957: Provide nicer error reporting from subprocesses in test_venv.EnsurePipTest.test_with_pip. -- gh-issue-93884: Add test cases for :c:func:`PyNumber_ToBase` that take a - large number or a non-int object as parameter. +- gh-93884: Add test cases for :c:func:`PyNumber_ToBase` that take a large + number or a non-int object as parameter. -- gh-issue-93852: test_asyncio, test_logging, test_socket and - test_socketserver now create AF_UNIX domains in the current directory to - no longer fail with ``OSError("AF_UNIX path too long")`` if the temporary - directory (the :envvar:`TMPDIR` environment variable) is too long. Patch - by Victor Stinner. +- gh-93852: test_asyncio, test_logging, test_socket and test_socketserver + now create AF_UNIX domains in the current directory to no longer fail with + ``OSError("AF_UNIX path too long")`` if the temporary directory (the + :envvar:`TMPDIR` environment variable) is too long. Patch by Victor + Stinner. -- gh-issue-93353: regrtest now checks if a test leaks temporary files or +- gh-93353: regrtest now checks if a test leaks temporary files or directories if run with -jN option. Patch by Victor Stinner. -- gh-issue-84461: ``run_tests.py`` now handles cross compiling env vars - correctly and pass ``HOSTRUNNER`` to regression tests. +- gh-84461: ``run_tests.py`` now handles cross compiling env vars correctly + and pass ``HOSTRUNNER`` to regression tests. -- gh-issue-93616: ``test_modulefinder`` now creates a temporary directory in +- gh-93616: ``test_modulefinder`` now creates a temporary directory in ``ModuleFinderTest.setUp()`` instead of module scope. -- gh-issue-93575: Fix issue with test_unicode test_raiseMemError. The test - case now use ``test.support.calcobjsize`` to calculate size of PyUnicode +- gh-93575: Fix issue with test_unicode test_raiseMemError. The test case + now use ``test.support.calcobjsize`` to calculate size of PyUnicode structs. :func:`sys.getsizeof` may return different size when string has UTF-8 memory. -- gh-issue-90473: WASI does not have a ``chmod(2)`` syscall. - :func:`os.chmod` is now a dummy function on WASI. Skip all tests that - depend on working :func:`os.chmod`. +- gh-90473: WASI does not have a ``chmod(2)`` syscall. :func:`os.chmod` is + now a dummy function on WASI. Skip all tests that depend on working + :func:`os.chmod`. -- gh-issue-90473: Skip tests on WASI that require symlinks with absolute - paths. +- gh-90473: Skip tests on WASI that require symlinks with absolute paths. -- gh-issue-57539: Increase calendar test coverage for +- gh-57539: Increase calendar test coverage for :meth:`calendar.LocaleTextCalendar.formatweekday`. -- gh-issue-90473: Skip symlink tests on WASI. wasmtime uses ``openat2(2)`` - with ``RESOLVE_BENEATH`` flag, which prevents symlinks with absolute - paths. +- gh-90473: Skip symlink tests on WASI. wasmtime uses ``openat2(2)`` with + ``RESOLVE_BENEATH`` flag, which prevents symlinks with absolute paths. -- gh-issue-89858: Fix ``test_embed`` for out-of-tree builds. Patch by Kumar +- gh-89858: Fix ``test_embed`` for out-of-tree builds. Patch by Kumar Aditya. -- gh-issue-92886: Fixing tests that fail when running with optimizations - (``-O``) in ``test_imaplib.py``. +- gh-92886: Fixing tests that fail when running with optimizations (``-O``) + in ``test_imaplib.py``. -- gh-issue-92886: Fixing tests that fail when running with optimizations - (``-O``) in ``test_zipimport.py`` +- gh-92886: Fixing tests that fail when running with optimizations (``-O``) + in ``test_zipimport.py`` -- gh-issue-92886: Fixing tests that fail when running with optimizations - (``-O``) in ``test_py_compile.py`` +- gh-92886: Fixing tests that fail when running with optimizations (``-O``) + in ``test_py_compile.py`` -- gh-issue-92886: Fixing tests that fail when running with optimizations - (``-O``) in ``test_sys_settrace.py``. +- gh-92886: Fixing tests that fail when running with optimizations (``-O``) + in ``test_sys_settrace.py``. -- gh-issue-92886: Fixing tests that fail when running with optimizations - (``-O``) in ``_test_multiprocessing.py`` +- gh-92886: Fixing tests that fail when running with optimizations (``-O``) + in ``_test_multiprocessing.py`` -- gh-issue-92670: Skip - ``test_shutil.TestCopy.test_copyfile_nonexistent_dir`` test on AIX as the - test uses a trailing slash to force the OS consider the path as a - directory, but on AIX the trailing slash has no effect and is considered - as a file. +- gh-92670: Skip ``test_shutil.TestCopy.test_copyfile_nonexistent_dir`` test + on AIX as the test uses a trailing slash to force the OS consider the path + as a directory, but on AIX the trailing slash has no effect and is + considered as a file. -- gh-issue-92514: Remove unused ``test.support.BasicTestRunner``. Patch by - Jelle Zijlstra. +- gh-92514: Remove unused ``test.support.BasicTestRunner``. Patch by Jelle + Zijlstra. - bpo-47016: Create a GitHub Actions workflow for verifying bundled pip and setuptools. Patch by Illia Volochii and Adam Turner. @@ -7802,120 +8676,113 @@ Tests Build ----- -- gh-issue-96761: Fix the build process of clang compiler for +- gh-96761: Fix the build process of clang compiler for :program:`_bootstrap_python` if LTO optimization is applied. Patch by Matthias Görgens and Donghee Na. -- gh-issue-96883: ``wasm32-emscripten`` builds for browsers now include +- gh-96883: ``wasm32-emscripten`` builds for browsers now include :mod:`concurrent.futures` for :mod:`asyncio` and :mod:`unittest.mock`. -- gh-issue-85936: CPython now uses the ThinLTO option as the default policy - if the Clang compiler accepts the flag. Patch by Donghee Na. +- gh-85936: CPython now uses the ThinLTO option as the default policy if the + Clang compiler accepts the flag. Patch by Donghee Na. -- gh-issue-96729: Ensure that Windows releases built with +- gh-96729: Ensure that Windows releases built with ``Tools\msi\buildrelease.bat`` are upgradable to and from official Python releases. -- gh-issue-96269: Shared module targets now depend on new ``MODULE_DEPS`` +- gh-96269: Shared module targets now depend on new ``MODULE_DEPS`` variable, which includes ``EXPORTSYMS``. This fixes a build order issue on unsupported AIX platform. -- gh-issue-84461: ``wasm32-emscripten`` platform no longer builds - :mod:`resource` module, :func:`~os.getresuid`, :func:`~os.getresgid`, and - their setters. The APIs are stubs and not functional. +- gh-84461: ``wasm32-emscripten`` platform no longer builds :mod:`resource` + module, :func:`~os.getresuid`, :func:`~os.getresgid`, and their setters. + The APIs are stubs and not functional. -- gh-issue-95973: Add a new ``--with-dsymutil`` configure option to link - debug information in macOS. Patch by Pablo Galindo. +- gh-95973: Add a new ``--with-dsymutil`` configure option to link debug + information in macOS. Patch by Pablo Galindo. -- gh-issue-90536: Use the BOLT post-link optimizer to improve performance, +- gh-90536: Use the BOLT post-link optimizer to improve performance, particularly on medium-to-large applications. -- gh-issue-93744: Remove the ``configure --with-cxx-main`` build option: it - didn't work for many years. Remove the ``MAINCC`` variable from - ``configure`` and ``Makefile``. Patch by Victor Stinner. +- gh-93744: Remove the ``configure --with-cxx-main`` build option: it didn't + work for many years. Remove the ``MAINCC`` variable from ``configure`` and + ``Makefile``. Patch by Victor Stinner. -- gh-issue-94801: Fix a regression in ``configure`` script that caused some - header checks to ignore custom ``CPPFLAGS``. The regression was introduced - in :gh:`94802`. +- gh-94801: Fix a regression in ``configure`` script that caused some header + checks to ignore custom ``CPPFLAGS``. The regression was introduced in + :gh:`94802`. -- gh-issue-95145: wasm32-wasi builds no longer depend on WASIX's pthread - stubs. Python now has its own stubbed pthread API. +- gh-95145: wasm32-wasi builds no longer depend on WASIX's pthread stubs. + Python now has its own stubbed pthread API. -- gh-issue-95174: Python now detects missing ``dup`` function in WASI and - works around some missing :mod:`errno`, :mod:`select`, and :mod:`socket` +- gh-95174: Python now detects missing ``dup`` function in WASI and works + around some missing :mod:`errno`, :mod:`select`, and :mod:`socket` constants. -- gh-issue-95174: Python now skips missing :mod:`socket` functions and - methods on WASI. WASI can only create sockets from existing fd / accept - and has no netdb. +- gh-95174: Python now skips missing :mod:`socket` functions and methods on + WASI. WASI can only create sockets from existing fd / accept and has no + netdb. -- gh-issue-95085: Platforms ``wasm32-unknown-emscripten`` and +- gh-95085: Platforms ``wasm32-unknown-emscripten`` and ``wasm32-unknown-wasi`` have been promoted to :pep:`11` tier 3 platform support. -- gh-issue-94847: Fixed ``_decimal`` module build issue on GCC when - compiling with LTO and pydebug. Debug builds no longer force inlining of - functions. +- gh-94847: Fixed ``_decimal`` module build issue on GCC when compiling with + LTO and pydebug. Debug builds no longer force inlining of functions. -- gh-issue-94841: Fix the possible performance regression of +- gh-94841: Fix the possible performance regression of :c:func:`PyObject_Free` compiled with MSVC version 1932. -- gh-issue-94801: ``configure`` now uses custom flags like ``ZLIB_CFLAGS`` - and ``ZLIB_LIBS`` when searching for headers and libraries. +- gh-94801: ``configure`` now uses custom flags like ``ZLIB_CFLAGS`` and + ``ZLIB_LIBS`` when searching for headers and libraries. -- gh-issue-94773: ``deepfreeze.py`` now supports code object with frozensets - that contain incompatible, unsortable types. +- gh-94773: ``deepfreeze.py`` now supports code object with frozensets that + contain incompatible, unsortable types. -- gh-issue-94682: Build and test with OpenSSL 1.1.1q +- gh-94682: Build and test with OpenSSL 1.1.1q -- gh-issue-90005: Dependencies of :mod:`readline` and :mod:`curses` module - are now detected in ``configure`` script with ``pkg-config``. Only - ``ncurses`` / ``ncursesw`` are detected automatically. The old ``curses`` - library is not configured automatically. Workaround for missing - ``termcap`` or ``tinfo`` library has been removed. +- gh-90005: Dependencies of :mod:`readline` and :mod:`curses` module are now + detected in ``configure`` script with ``pkg-config``. Only ``ncurses`` / + ``ncursesw`` are detected automatically. The old ``curses`` library is not + configured automatically. Workaround for missing ``termcap`` or ``tinfo`` + library has been removed. -- gh-issue-90005: Fix building ``_ctypes`` extension without ``pkg-config``. +- gh-90005: Fix building ``_ctypes`` extension without ``pkg-config``. -- gh-issue-90005: ``_dbm`` module dependencies are now detected by - configure. +- gh-90005: ``_dbm`` module dependencies are now detected by configure. -- gh-issue-94404: ``makesetup`` now works around an issue with sed on macOS - and uses correct CFLAGS for object files that end up in a shared - extension. Module CFLAGS are used before PY_STDMODULE_CFLAGS to avoid - clashes with system headers. +- gh-94404: ``makesetup`` now works around an issue with sed on macOS and + uses correct CFLAGS for object files that end up in a shared extension. + Module CFLAGS are used before PY_STDMODULE_CFLAGS to avoid clashes with + system headers. -- gh-issue-93939: C extension modules are now built by ``configure`` and - ``make`` instead of ``distutils`` and ``setup.py``. +- gh-93939: C extension modules are now built by ``configure`` and ``make`` + instead of ``distutils`` and ``setup.py``. -- gh-issue-93939: The ``2to3``, ``idle``, and ``pydoc`` scripts are now - generated and installed by ``Makefile`` instead of ``setup.py``. +- gh-93939: The ``2to3``, ``idle``, and ``pydoc`` scripts are now generated + and installed by ``Makefile`` instead of ``setup.py``. -- gh-issue-94280: Updated pegen regeneration script on Windows to find and - use Python 3.9 or higher. Prior to this, pegen regeneration already - required 3.9 or higher, but the script may have used lower versions of - Python. +- gh-94280: Updated pegen regeneration script on Windows to find and use + Python 3.9 or higher. Prior to this, pegen regeneration already required + 3.9 or higher, but the script may have used lower versions of Python. -- gh-issue-93584: Address race condition in ``Makefile`` when installing a - PGO build. All ``test`` and ``install`` targets now depend on ``all`` - target. +- gh-93584: Address race condition in ``Makefile`` when installing a PGO + build. All ``test`` and ``install`` targets now depend on ``all`` target. -- gh-issue-93491: ``configure`` now detects and reports :pep:`11` support - tiers. +- gh-93491: ``configure`` now detects and reports :pep:`11` support tiers. -- gh-issue-69093: Fix ``Modules/Setup.stdlib.in`` rule for ``_sqlite3`` - extension. +- gh-69093: Fix ``Modules/Setup.stdlib.in`` rule for ``_sqlite3`` extension. -- gh-issue-93207: ``va_start()`` with two parameters, like ``va_start(args, +- gh-93207: ``va_start()`` with two parameters, like ``va_start(args, format),`` is now required to build Python. ``va_start()`` is no longer called with a single parameter. Patch by Kumar Aditya. -- gh-issue-93202: Python now always use the ``%zu`` and ``%zd`` printf - formats to format a :c:type:`size_t` or ``Py_ssize_t`` number. Building - Python 3.12 requires a C11 compiler, so these printf formats are now - always supported. Patch by Victor Stinner. +- gh-93202: Python now always use the ``%zu`` and ``%zd`` printf formats to + format a :c:type:`size_t` or ``Py_ssize_t`` number. Building Python 3.12 + requires a C11 compiler, so these printf formats are now always supported. + Patch by Victor Stinner. -- gh-issue-90473: Disable pymalloc and increase stack size on - ``wasm32-wasi``. +- gh-90473: Disable pymalloc and increase stack size on ``wasm32-wasi``. - bpo-34449: Drop invalid compiler switch ``-fPIC`` for HP aCC on HP-UX. Patch by Michael Osipov. @@ -7923,98 +8790,96 @@ Build Windows ------- -- gh-issue-98360: Fixes :mod:`multiprocessing` spawning child processes on - Windows from a virtual environment to ensure that child processes that - also use :mod:`multiprocessing` to spawn more children will recognize that - they are in a virtual environment. +- gh-98360: Fixes :mod:`multiprocessing` spawning child processes on Windows + from a virtual environment to ensure that child processes that also use + :mod:`multiprocessing` to spawn more children will recognize that they are + in a virtual environment. -- gh-issue-98414: Fix :file:`py.exe` launcher handling of - :samp:`-V:{}/` option when default preferences have been set in - environment variables or configuration files. +- gh-98414: Fix :file:`py.exe` launcher handling of :samp:`-V:{}/` + option when default preferences have been set in environment variables or + configuration files. -- gh-issue-97728: Fix possible crashes caused by the use of uninitialized +- gh-97728: Fix possible crashes caused by the use of uninitialized variables when pass invalid arguments in :func:`os.system` on Windows and in Windows-specific modules (like ``winreg``). -- gh-issue-90989: Made :ref:`launcher` install per-user by default (unless - an all users install already exists), and clarify some text in the - installer. +- gh-90989: Made :ref:`launcher` install per-user by default (unless an all + users install already exists), and clarify some text in the installer. -- gh-issue-97649: The ``Tools`` directory is no longer installed on Windows +- gh-97649: The ``Tools`` directory is no longer installed on Windows -- gh-issue-96965: Update libffi to 3.4.3 +- gh-96965: Update libffi to 3.4.3 -- gh-issue-96577: Fixes a potential buffer overrun in :mod:`msilib`. +- gh-96577: Fixes a potential buffer overrun in :mod:`msilib`. -- gh-issue-96559: Fixes the Windows launcher not using the compatible +- gh-96559: Fixes the Windows launcher not using the compatible interpretation of default tags found in configuration files when no tag was passed to the command. -- gh-issue-94781: Fix :file:`pcbuild.proj` to clean previous instances of - output files in ``Python\deepfreeze`` and ``Python\frozen_modules`` - directories on Windows. Patch by Charlie Zhao. +- gh-94781: Fix :file:`pcbuild.proj` to clean previous instances of output + files in ``Python\deepfreeze`` and ``Python\frozen_modules`` directories + on Windows. Patch by Charlie Zhao. -- gh-issue-89545: Updates :mod:`platform` code getting the Windows version - to use native Windows Management Instrumentation (WMI) queries to - determine OS version, type, and architecture. +- gh-89545: Updates :mod:`platform` code getting the Windows version to use + native Windows Management Instrumentation (WMI) queries to determine OS + version, type, and architecture. -- gh-issue-95733: Make certain requirements of the Windows Store package - optional to allow installing on earlier updates of Windows. +- gh-95733: Make certain requirements of the Windows Store package optional + to allow installing on earlier updates of Windows. -- gh-issue-95656: Enable the - :meth:`~sqlite3.Connection.enable_load_extension` :mod:`sqlite3` API. +- gh-95656: Enable the :meth:`~sqlite3.Connection.enable_load_extension` + :mod:`sqlite3` API. -- gh-issue-95587: Fixes some issues where the Windows installer would - incorrectly detect certain features of an existing install when upgrading. +- gh-95587: Fixes some issues where the Windows installer would incorrectly + detect certain features of an existing install when upgrading. -- gh-issue-94399: Restores the behaviour of :ref:`launcher` for - ``/usr/bin/env`` shebang lines, which will now search :envvar:`PATH` for - an executable matching the given command. If none is found, the usual - search process is used. +- gh-94399: Restores the behaviour of :ref:`launcher` for ``/usr/bin/env`` + shebang lines, which will now search :envvar:`PATH` for an executable + matching the given command. If none is found, the usual search process is + used. -- gh-issue-95445: Fixes the unsuccessful removal of the HTML document - directory when uninstalling with Windows msi. +- gh-95445: Fixes the unsuccessful removal of the HTML document directory + when uninstalling with Windows msi. -- gh-issue-95359: Fix :ref:`launcher` handling of :file:`py.ini` commands - (it was incorrectly expecting a ``py_`` prefix on keys) and crashes when - reading per-user configuration file. +- gh-95359: Fix :ref:`launcher` handling of :file:`py.ini` commands (it was + incorrectly expecting a ``py_`` prefix on keys) and crashes when reading + per-user configuration file. -- gh-issue-95285: Fix :ref:`launcher` handling of command lines where it is - only passed a short executable name. +- gh-95285: Fix :ref:`launcher` handling of command lines where it is only + passed a short executable name. -- gh-issue-90844: Allow virtual environments to correctly launch when they - have spaces in the path. +- gh-90844: Allow virtual environments to correctly launch when they have + spaces in the path. -- gh-issue-94772: Fix incorrect handling of shebang lines in py.exe launcher +- gh-94772: Fix incorrect handling of shebang lines in py.exe launcher -- gh-issue-94018: :mod:`zipfile` will now remove trailing spaces from path +- gh-94018: :mod:`zipfile` will now remove trailing spaces from path components when extracting files on Windows. -- gh-issue-93824: Drag and drop of files onto Python files in Windows - Explorer has been enabled for Windows ARM64. +- gh-93824: Drag and drop of files onto Python files in Windows Explorer has + been enabled for Windows ARM64. -- gh-issue-43414: :func:`os.get_terminal_size` now attempts to read the size - from any provided handle, rather than only supporting file descriptors 0, - 1 and 2. +- gh-43414: :func:`os.get_terminal_size` now attempts to read the size from + any provided handle, rather than only supporting file descriptors 0, 1 and + 2. -- gh-issue-92817: Ensures that :file:`py.exe` will prefer an active virtual +- gh-92817: Ensures that :file:`py.exe` will prefer an active virtual environment over default tags specified with environment variables or through a :file:`py.ini` file. -- gh-issue-92984: Explicitly disable incremental linking for non-Debug - builds +- gh-92984: Explicitly disable incremental linking for non-Debug builds -- gh-issue-92841: :mod:`asyncio` no longer throws ``RuntimeError: Event loop - is closed`` on interpreter exit after asynchronous socket activity. Patch - by Oleg Iarygin. +- gh-92841: :mod:`asyncio` no longer throws ``RuntimeError: Event loop is + closed`` on interpreter exit after asynchronous socket activity. Patch by + Oleg Iarygin. - bpo-46907: Update Windows installer to use SQLite 3.38.4. -- gh-issue-91061: Accept os.PathLike for the argument to winsound.PlaySound +- gh-91061: Accept os.PathLike for the argument to winsound.PlaySound - bpo-42658: Support native Windows case-insensitive path comparisons by using ``LCMapStringEx`` instead of :func:`str.lower` in - :func:`ntpath.normcase`. Add ``LCMapStringEx`` to the :mod:`_winapi` + :func:`ntpath.normcase`. Add ``LCMapStringEx`` to the :mod:`!_winapi` module. - bpo-38704: Prevent installation on unsupported Windows versions. @@ -8022,7 +8887,7 @@ Windows macOS ----- -- gh-issue-97897: The macOS 13 SDK includes support for the ``mkfifoat`` and +- gh-97897: The macOS 13 SDK includes support for the ``mkfifoat`` and ``mknodat`` system calls. Using the ``dir_fd`` option with either :func:`os.mkfifo` or :func:`os.mknod` could result in a segfault if cpython is built with the macOS 13 SDK but run on an earlier version of @@ -8032,138 +8897,132 @@ macOS IDLE ---- -- gh-issue-97527: Fix a bug in the previous bugfix that caused IDLE to not - start when run with 3.10.8, 3.12.0a1, and at least Microsoft Python - 3.10.2288.0 installed without the Lib/test package. 3.11.0 was never - affected. +- gh-97527: Fix a bug in the previous bugfix that caused IDLE to not start + when run with 3.10.8, 3.12.0a1, and at least Microsoft Python 3.10.2288.0 + installed without the Lib/test package. 3.11.0 was never affected. -- gh-issue-65802: Document handling of extensions in Save As dialogs. +- gh-65802: Document handling of extensions in Save As dialogs. -- gh-issue-95191: Include prompts when saving Shell (interactive input and +- gh-95191: Include prompts when saving Shell (interactive input and output). -- gh-issue-95511: Fix the Shell context menu copy-with-prompts bug of - copying an extra line when one selects whole lines. +- gh-95511: Fix the Shell context menu copy-with-prompts bug of copying an + extra line when one selects whole lines. -- gh-issue-95471: In the Edit menu, move ``Select All`` and add a new - separator. +- gh-95471: In the Edit menu, move ``Select All`` and add a new separator. -- gh-issue-95411: Enable using IDLE's module browser with .pyw files. +- gh-95411: Enable using IDLE's module browser with .pyw files. -- gh-issue-89610: Add .pyi as a recognized extension for IDLE on macOS. - This allows opening stub files by double clicking on them in the Finder. +- gh-89610: Add .pyi as a recognized extension for IDLE on macOS. This + allows opening stub files by double clicking on them in the Finder. Tools/Demos ----------- -- gh-issue-68686: Remove ptags and eptags scripts. +- gh-68686: Remove ptags and eptags scripts. -- gh-issue-97681: Remove the ``Tools/demo/`` directory which contained old - demo scripts. A copy can be found in the `old-demos project +- gh-97681: Remove the ``Tools/demo/`` directory which contained old demo + scripts. A copy can be found in the `old-demos project `_. Patch by Victor Stinner. -- gh-issue-97669: Remove outdated example scripts of the ``Tools/scripts/`` +- gh-97669: Remove outdated example scripts of the ``Tools/scripts/`` directory. A copy can be found in the `old-demos project `_. Patch by Victor Stinner. -- gh-issue-95853: The ``wasm_build.py`` script now pre-builds Emscripten - ports, checks for broken EMSDK versions, and warns about pkg-config env - vars. +- gh-95853: The ``wasm_build.py`` script now pre-builds Emscripten ports, + checks for broken EMSDK versions, and warns about pkg-config env vars. -- gh-issue-95853: The new tool ``Tools/wasm/wasm_builder.py`` automates - configure, compile, and test steps for building CPython on WebAssembly - platforms. +- gh-95853: The new tool ``Tools/wasm/wasm_builder.py`` automates configure, + compile, and test steps for building CPython on WebAssembly platforms. -- gh-issue-95731: Fix handling of module docstrings in +- gh-95731: Fix handling of module docstrings in :file:`Tools/i18n/pygettext.py`. -- gh-issue-93939: Add script ``Tools/scripts/check_modules.py`` to check and +- gh-93939: Add script ``Tools/scripts/check_modules.py`` to check and validate builtin and shared extension modules. The script also handles ``Modules/Setup`` and will eventually replace ``setup.py``. -- gh-issue-94538: Fix Argument Clinic output to custom file destinations. - Patch by Erlend E. Aasland. +- gh-94538: Fix Argument Clinic output to custom file destinations. Patch by + Erlend E. Aasland. -- gh-issue-94430: Allow parameters named ``module`` and ``self`` with custom - C names in Argument Clinic. Patch by Erlend E. Aasland +- gh-94430: Allow parameters named ``module`` and ``self`` with custom C + names in Argument Clinic. Patch by Erlend E. Aasland -- gh-issue-86087: The ``Tools/scripts/parseentities.py`` script used to - parse HTML4 entities has been removed. +- gh-86087: The ``Tools/scripts/parseentities.py`` script used to parse + HTML4 entities has been removed. C API ----- -- gh-issue-98393: The :c:func:`PyUnicode_FSDecoder` function no longer - accepts bytes-like paths, like :class:`bytearray` and :class:`memoryview` - types: only the exact :class:`bytes` type is accepted for bytes strings. - Patch by Victor Stinner. +- gh-98393: The :c:func:`PyUnicode_FSDecoder` function no longer accepts + bytes-like paths, like :class:`bytearray` and :class:`memoryview` types: + only the exact :class:`bytes` type is accepted for bytes strings. Patch by + Victor Stinner. -- gh-issue-91051: Add :c:func:`PyType_Watch` and related APIs to allow - callbacks on :c:func:`PyType_Modified`. +- gh-91051: Add :c:func:`PyType_Watch` and related APIs to allow callbacks + on :c:func:`PyType_Modified`. -- gh-issue-95756: Lazily create and cache ``co_`` attributes for better +- gh-95756: Lazily create and cache ``co_`` attributes for better performance for code getters. -- gh-issue-96512: Configuration for the :ref:`integer string conversion - length limitation ` now lives in the PyConfig C API - struct. +- gh-96512: Configuration for the :ref:`integer string conversion length + limitation ` now lives in the PyConfig C API struct. -- gh-issue-95589: Extensions classes that set ``tp_dictoffset`` and +- gh-95589: Extensions classes that set ``tp_dictoffset`` and ``tp_weaklistoffset`` lose the support for multiple inheritance, but are now safe. Extension classes should use :c:macro:`Py_TPFLAGS_MANAGED_DICT` and :c:macro:`Py_TPFLAGS_MANAGED_WEAKREF` instead. -- gh-issue-95781: An unrecognized format character in +- gh-95781: An unrecognized format character in :c:func:`PyUnicode_FromFormat` and :c:func:`PyUnicode_FromFormatV` now sets a :exc:`SystemError`. In previous versions it caused all the rest of the format string to be copied as-is to the result string, and any extra arguments discarded. -- gh-issue-92678: Restore the 3.10 behavior for multiple inheritance of C +- gh-92678: Restore the 3.10 behavior for multiple inheritance of C extension classes that store their dictionary at the end of the struct. -- gh-issue-92678: Support C extensions using managed dictionaries by setting - the ``Py_TPFLAGS_MANAGED_DICT`` flag. +- gh-92678: Support C extensions using managed dictionaries by setting the + ``Py_TPFLAGS_MANAGED_DICT`` flag. -- gh-issue-93274: API for implementing vectorcall +- gh-93274: API for implementing vectorcall (:c:macro:`Py_TPFLAGS_HAVE_VECTORCALL`, :c:func:`PyVectorcall_NARGS` and :c:func:`PyVectorcall_Call`) was added to the limited API and stable ABI. -- gh-issue-95504: Fix sign placement when specifying width or precision in +- gh-95504: Fix sign placement when specifying width or precision in :c:func:`PyUnicode_FromFormat` and :c:func:`PyUnicode_FromFormatV`. Patch by Philip Georgi. -- gh-issue-93012: The :c:macro:`Py_TPFLAGS_HAVE_VECTORCALL` flag is now - removed from a class when the class's :py:meth:`~object.__call__` method - is reassigned. This makes vectorcall safe to use with mutable types (i.e. +- gh-93012: The :c:macro:`Py_TPFLAGS_HAVE_VECTORCALL` flag is now removed + from a class when the class's :py:meth:`~object.__call__` method is + reassigned. This makes vectorcall safe to use with mutable types (i.e. heap types without the :const:`immutable ` flag). Mutable types that do not override :c:member:`~PyTypeObject.tp_call` now inherit the :c:macro:`Py_TPFLAGS_HAVE_VECTORCALL` flag. -- gh-issue-95388: Creating :c:macro:`immutable types - ` with mutable bases is deprecated and is - planned to be disabled in Python 3.14. +- gh-95388: Creating :c:macro:`immutable types ` + with mutable bases is deprecated and is planned to be disabled in Python + 3.14. -- gh-issue-92678: Adds unstable C-API functions - ``_PyObject_VisitManagedDict`` and ``_PyObject_ClearManagedDict`` to allow - C extensions to allow the VM to manage their object's dictionaries. +- gh-92678: Adds unstable C-API functions ``_PyObject_VisitManagedDict`` and + ``_PyObject_ClearManagedDict`` to allow C extensions to allow the VM to + manage their object's dictionaries. -- gh-issue-94936: Added :c:func:`PyCode_GetVarnames`, - :c:func:`PyCode_GetCellvars` and :c:func:`PyCode_GetFreevars` for - accessing ``co_varnames``, ``co_cellvars`` and ``co_freevars`` - respectively via the C API. +- gh-94936: Added :c:func:`PyCode_GetVarnames`, :c:func:`PyCode_GetCellvars` + and :c:func:`PyCode_GetFreevars` for accessing ``co_varnames``, + ``co_cellvars`` and ``co_freevars`` respectively via the C API. -- gh-issue-94930: Fix ``SystemError`` raised when +- gh-94930: Fix ``SystemError`` raised when :c:func:`PyArg_ParseTupleAndKeywords` is used with ``#`` in ``(...)`` but without ``PY_SSIZE_T_CLEAN`` defined. -- gh-issue-94731: Python again uses C-style casts for most casting - operations when compiled with C++. This may trigger compiler warnings, if - they are enabled with e.g. ``-Wold-style-cast`` or - ``-Wzero-as-null-pointer-constant`` options for ``g++``. +- gh-94731: Python again uses C-style casts for most casting operations when + compiled with C++. This may trigger compiler warnings, if they are enabled + with e.g. ``-Wold-style-cast`` or ``-Wzero-as-null-pointer-constant`` + options for ``g++``. -- gh-issue-93937: The following frame functions and type are now directly +- gh-93937: The following frame functions and type are now directly available with ``#include ``, it's no longer needed to add ``#include ``: @@ -8178,19 +9037,19 @@ C API Patch by Victor Stinner. -- gh-issue-91321: Fix the compatibility of the Python C API with C++ older - than C++11. Patch by Victor Stinner. +- gh-91321: Fix the compatibility of the Python C API with C++ older than + C++11. Patch by Victor Stinner. -- gh-issue-91731: Avoid defining the ``static_assert`` when compiling with - C++ 11, where this is a keyword and redefining it can lead to undefined - behavior. Patch by Pablo Galindo +- gh-91731: Avoid defining the ``static_assert`` when compiling with C++ 11, + where this is a keyword and redefining it can lead to undefined behavior. + Patch by Pablo Galindo -- gh-issue-89546: :c:func:`PyType_FromMetaclass` (and other ``PyType_From*`` +- gh-89546: :c:func:`PyType_FromMetaclass` (and other ``PyType_From*`` functions) now check that offsets and the base class's :c:member:`~PyTypeObject.tp_basicsize` fit in the new class's ``tp_basicsize``. -- gh-issue-93503: Add two new public functions to the public C-API, +- gh-93503: Add two new public functions to the public C-API, :c:func:`PyEval_SetProfileAllThreads` and :c:func:`PyEval_SetTraceAllThreads`, that allow to set tracing and profiling functions in all running threads in addition to the calling one. @@ -8199,52 +9058,50 @@ C API :func:`threading.settrace_all_threads`) that allow to do the same from Python. Patch by Pablo Galindo -- gh-issue-93442: Add C++ overloads for _Py_CAST_impl() to handle 0/NULL. - This will allow C++ extensions that pass 0 or NULL to macros using - _Py_CAST() to continue to compile. +- gh-93442: Add C++ overloads for _Py_CAST_impl() to handle 0/NULL. This + will allow C++ extensions that pass 0 or NULL to macros using _Py_CAST() + to continue to compile. -- gh-issue-93466: Slot IDs in PyType_Spec may not be repeated. The - documentation was updated to mention this. For some cases of repeated - slots, PyType_FromSpec and related functions will now raise an exception. +- gh-93466: Slot IDs in PyType_Spec may not be repeated. The documentation + was updated to mention this. For some cases of repeated slots, + PyType_FromSpec and related functions will now raise an exception. -- gh-issue-92898: Fix C++ compiler warnings when casting function arguments - to ``PyObject*``. Patch by Serge Guelton. +- gh-92898: Fix C++ compiler warnings when casting function arguments to + ``PyObject*``. Patch by Serge Guelton. -- gh-issue-93103: Deprecate global configuration variables, like +- gh-93103: Deprecate global configuration variables, like :c:var:`Py_IgnoreEnvironmentFlag`, in the documentation: the :c:func:`Py_InitializeFromConfig` API should be instead. Patch by Victor Stinner. -- gh-issue-77782: Deprecate global configuration variable like +- gh-77782: Deprecate global configuration variable like :c:var:`Py_IgnoreEnvironmentFlag`: the :c:func:`Py_InitializeFromConfig` API should be instead. Patch by Victor Stinner. -- gh-issue-92913: Ensures changes to - :c:member:`PyConfig.module_search_paths` are ignored unless - :c:member:`PyConfig.module_search_paths_set` is set +- gh-92913: Ensures changes to :c:member:`PyConfig.module_search_paths` are + ignored unless :c:member:`PyConfig.module_search_paths_set` is set -- gh-issue-92781: Avoid mixing declarations and code in the C API to fix the +- gh-92781: Avoid mixing declarations and code in the C API to fix the compiler warning: "ISO C90 forbids mixed declarations and code" [-Werror=declaration-after-statement]. Patch by Victor Stinner. -- gh-issue-92651: Remove the ``token.h`` header file. There was never any - public tokenizer C API. The ``token.h`` header file was only designed to - be used by Python internals. Patch by Victor Stinner. +- gh-92651: Remove the ``token.h`` header file. There was never any public + tokenizer C API. The ``token.h`` header file was only designed to be used + by Python internals. Patch by Victor Stinner. -- gh-issue-92536: Remove legacy Unicode APIs based on ``Py_UNICODE*``. +- gh-92536: Remove legacy Unicode APIs based on ``Py_UNICODE*``. -- gh-issue-85858: Remove the ``PyUnicode_InternImmortal()`` function and the +- gh-85858: Remove the ``PyUnicode_InternImmortal()`` function and the ``SSTATE_INTERNED_IMMORTAL`` macro. Patch by Victor Stinner. -- gh-issue-92193: Add new function :c:func:`PyFunction_SetVectorcall` to the - C API which sets the vectorcall field of a given - :c:type:`PyFunctionObject`. +- gh-92193: Add new function :c:func:`PyFunction_SetVectorcall` to the C API + which sets the vectorcall field of a given :c:type:`PyFunctionObject`. Warning: extensions using this API must preserve the behavior of the unaltered function! -- gh-issue-59121: Fixed an assert that prevented ``PyRun_InteractiveOne`` - from providing tracebacks when parsing from the provided FD. +- gh-59121: Fixed an assert that prevented ``PyRun_InteractiveOne`` from + providing tracebacks when parsing from the provided FD. - bpo-45383: The :c:func:`PyType_FromSpec` API will now find and use a metaclass based on the provided bases. An error will be raised if there is @@ -8259,19 +9116,19 @@ What's New in Python 3.11.0 beta 1? Security -------- -- gh-issue-57684: Add the :option:`-P` command line option and the +- gh-57684: Add the :option:`-P` command line option and the :envvar:`PYTHONSAFEPATH` environment variable to not prepend a potentially unsafe path to :data:`sys.path`. Patch by Victor Stinner. Core and Builtins ----------------- -- gh-issue-89519: Chaining classmethod descriptors (introduced in bpo-19072) - is deprecated. It can no longer be used to wrap other descriptors such as +- gh-89519: Chaining classmethod descriptors (introduced in bpo-19072) is + deprecated. It can no longer be used to wrap other descriptors such as property(). The core design of this feature was flawed, and it caused a number of downstream problems. -- gh-issue-92345: ``pymain_run_python()`` now imports ``readline`` and +- gh-92345: ``pymain_run_python()`` now imports ``readline`` and ``rlcompleter`` before sys.path is extended to include the current working directory of an interactive interpreter. Non-interactive interpreters are not affected. @@ -8279,123 +9136,118 @@ Core and Builtins - bpo-43857: Improve the :exc:`AttributeError` message when deleting a missing attribute. Patch by Géry Ogam. -- gh-issue-92245: Make sure that PEP 523 is respected in all cases. In - 3.11a7, specialization may have prevented Python-to-Python calls - respecting PEP 523. +- gh-92245: Make sure that PEP 523 is respected in all cases. In 3.11a7, + specialization may have prevented Python-to-Python calls respecting PEP + 523. -- gh-issue-92203: Add a closure keyword-only parameter to :func:`exec()`. It - can only be specified when exec-ing a code object that uses free - variables. When specified, it must be a tuple, with exactly the number of - cell variables referenced by the code object. closure has a default value - of ``None``, and it must be ``None`` if the code object doesn't refer to - any free variables. +- gh-92203: Add a closure keyword-only parameter to :func:`exec`. It can + only be specified when exec-ing a code object that uses free variables. + When specified, it must be a tuple, with exactly the number of cell + variables referenced by the code object. closure has a default value of + ``None``, and it must be ``None`` if the code object doesn't refer to any + free variables. -- gh-issue-91173: Disable frozen modules in debug builds. Patch by Kumar - Aditya. +- gh-91173: Disable frozen modules in debug builds. Patch by Kumar Aditya. -- gh-issue-92114: Improve error message when subscript a type with +- gh-92114: Improve error message when subscript a type with ``__class_getitem__`` set to ``None``. -- gh-issue-92112: Fix crash triggered by an evil custom ``mro()`` on a - metaclass. +- gh-92112: Fix crash triggered by an evil custom ``mro()`` on a metaclass. -- gh-issue-92063: The ``PRECALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS`` - instruction now ensures methods are called only on objects of the correct - type. +- gh-92063: The ``PRECALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS`` instruction + now ensures methods are called only on objects of the correct type. -- gh-issue-92031: Deoptimize statically allocated code objects during +- gh-92031: Deoptimize statically allocated code objects during ``Py_FINALIZE()`` so that future ``_PyCode_Quicken`` calls always start with unquickened code. -- gh-issue-92036: Fix a crash in subinterpreters related to the garbage - collector. When a subinterpreter is deleted, untrack all objects tracked - by its GC. To prevent a crash in deallocator functions expecting objects - to be tracked by the GC, leak a strong reference to these objects on - purpose, so they are never deleted and their deallocator functions are not - called. Patch by Victor Stinner. +- gh-92036: Fix a crash in subinterpreters related to the garbage collector. + When a subinterpreter is deleted, untrack all objects tracked by its GC. + To prevent a crash in deallocator functions expecting objects to be + tracked by the GC, leak a strong reference to these objects on purpose, so + they are never deleted and their deallocator functions are not called. + Patch by Victor Stinner. -- gh-issue-92032: The interpreter can now autocomplete soft keywords, as of - now ``match``, ``case``, and ``_`` (wildcard pattern) from :pep:`634`. +- gh-92032: The interpreter can now autocomplete soft keywords, as of now + ``match``, ``case``, and ``_`` (wildcard pattern) from :pep:`634`. -- gh-issue-87999: The warning emitted by the Python parser for a numeric - literal immediately followed by keyword has been changed from deprecation - warning to syntax warning. +- gh-87999: The warning emitted by the Python parser for a numeric literal + immediately followed by keyword has been changed from deprecation warning + to syntax warning. -- gh-issue-91869: Fix an issue where specialized opcodes with extended - arguments could produce incorrect tracing output or lead to assertion - failures. +- gh-91869: Fix an issue where specialized opcodes with extended arguments + could produce incorrect tracing output or lead to assertion failures. -- gh-issue-91603: Speed up :class:`types.UnionType` instantiation. Based on - patch provided by Yurii Karabas. +- gh-91603: Speed up :class:`types.UnionType` instantiation. Based on patch + provided by Yurii Karabas. -- gh-issue-89373: If Python is built in debug mode, Python now ensures that +- gh-89373: If Python is built in debug mode, Python now ensures that deallocator functions leave the current exception unchanged. Patch by Victor Stinner. -- gh-issue-91632: Fix a minor memory leak at exit: release the memory of the +- gh-91632: Fix a minor memory leak at exit: release the memory of the :class:`generic_alias_iterator` type. Patch by Donghee Na. -- gh-issue-81548: Octal escapes with value larger than ``0o377`` now produce - a :exc:`DeprecationWarning`. In a future Python version they will be a +- gh-81548: Octal escapes with value larger than ``0o377`` now produce a + :exc:`DeprecationWarning`. In a future Python version they will be a :exc:`SyntaxWarning` and eventually a :exc:`SyntaxError`. - bpo-43950: Use a single compact table for line starts, ends and column offsets. Reduces memory consumption for location info by half -- gh-issue-91102: Use Argument Clinic for :class:`EncodingMap`. Patch by - Oleg Iarygin. +- gh-91102: Use Argument Clinic for :class:`EncodingMap`. Patch by Oleg + Iarygin. -- gh-issue-91636: Fixed a crash in a garbage-collection edge-case, in which - a ``PyFunction_Type.tp_clear`` function could leave a python function - object in an inconsistent state. +- gh-91636: Fixed a crash in a garbage-collection edge-case, in which a + ``PyFunction_Type.tp_clear`` function could leave a python function object + in an inconsistent state. -- gh-issue-91603: Speed up :func:`isinstance` and :func:`issubclass` checks - for :class:`types.UnionType`. Patch by Yurii Karabas. +- gh-91603: Speed up :func:`isinstance` and :func:`issubclass` checks for + :class:`types.UnionType`. Patch by Yurii Karabas. -- gh-issue-91625: Fixed a bug in which adaptive opcodes ignored any - preceding ``EXTENDED_ARG``\ s on specialization failure. +- gh-91625: Fixed a bug in which adaptive opcodes ignored any preceding + ``EXTENDED_ARG``\ s on specialization failure. -- gh-issue-78607: The LLTRACE special build now looks for the name - ``__lltrace__`` defined in module globals, rather than the name - ``__ltrace__``, which had been introduced as a typo. +- gh-78607: The LLTRACE special build now looks for the name ``__lltrace__`` + defined in module globals, rather than the name ``__ltrace__``, which had + been introduced as a typo. -- gh-issue-91576: Speed up iteration of ascii strings by 50%. Patch by Kumar +- gh-91576: Speed up iteration of ascii strings by 50%. Patch by Kumar Aditya. -- gh-issue-89279: Improve interpreter performance on Windows by inlining a - few specific macros. +- gh-89279: Improve interpreter performance on Windows by inlining a few + specific macros. -- gh-issue-91502: Add a new :c:func:`_PyFrame_IsEntryFrame` API function, to +- gh-91502: Add a new :c:func:`!_PyFrame_IsEntryFrame` API function, to check if a :c:type:`PyFrameObject` is an entry frame. Patch by Pablo Galindo. -- gh-issue-91266: Refactor the ``bytearray`` strip methods ``strip``, - ``lstrip`` and ``rstrip`` to use a common implementation. +- gh-91266: Refactor the ``bytearray`` strip methods ``strip``, ``lstrip`` + and ``rstrip`` to use a common implementation. -- gh-issue-91479: Replaced the ``__note__`` field of :exc:`BaseException` - (added in an earlier version of 3.11) with the final design of :pep:`678`. +- gh-91479: Replaced the ``__note__`` field of :exc:`BaseException` (added + in an earlier version of 3.11) with the final design of :pep:`678`. Namely, :exc:`BaseException` gets an :meth:`add_note` method, and its ``__notes__`` field is created when necessary. -- gh-issue-46055: Speed up right shift of negative integers, by removing +- gh-46055: Speed up right shift of negative integers, by removing unnecessary creation of temporaries. Original patch by Xinhang Xu, reworked by Mark Dickinson. -- gh-issue-91462: Make the interpreter's low-level tracing (lltrace) feature +- gh-91462: Make the interpreter's low-level tracing (lltrace) feature output more readable by displaying opcode names (rather than just numbers), and by displaying stack contents before each opcode. -- gh-issue-89455: Fixed an uninitialized bool value in the traceback - printing code path that was introduced by the initial bpo-45292 exception - groups work. +- gh-89455: Fixed an uninitialized bool value in the traceback printing code + path that was introduced by the initial bpo-45292 exception groups work. -- gh-issue-91421: Fix a potential integer overflow in _Py_DecodeUTF8Ex. +- gh-91421: Fix a potential integer overflow in _Py_DecodeUTF8Ex. -- gh-issue-91428: Add ``static const char *const _PyOpcode_OpName[256] = - {...};`` to ``opcode.h`` for debug builds to assist in debugging the - Python interpreter. It is now more convenient to make various forms of - debugging output more human-readable by including opcode names rather than - just the corresponding decimal digits. +- gh-91428: Add ``static const char *const _PyOpcode_OpName[256] = {...};`` + to ``opcode.h`` for debug builds to assist in debugging the Python + interpreter. It is now more convenient to make various forms of debugging + output more human-readable by including opcode names rather than just the + corresponding decimal digits. - bpo-47120: Make :opcode:`POP_JUMP_IF_TRUE`, :opcode:`POP_JUMP_IF_FALSE`, :opcode:`POP_JUMP_IF_NONE` and :opcode:`POP_JUMP_IF_NOT_NONE` virtual, @@ -8467,76 +9319,74 @@ Core and Builtins Library ------- -- gh-issue-87901: Add the *encoding* parameter to :func:`os.popen`. +- gh-87901: Add the *encoding* parameter to :func:`os.popen`. -- gh-issue-90997: Fix an issue where :mod:`dis` utilities may interpret - populated inline cache entries as valid instructions. +- gh-90997: Fix an issue where :mod:`dis` utilities may interpret populated + inline cache entries as valid instructions. -- gh-issue-92332: Deprecate :class:`typing.Text` (removal of the class is +- gh-92332: Deprecate :class:`typing.Text` (removal of the class is currently not planned). Patch by Alex Waygood. - Deprecate nested classes in enum definitions becoming members -- in 3.13 they will be normal classes; add ``member`` and ``nonmember`` functions to allow control over results now. -- gh-issue-92356: Fixed a performance regression in ctypes function calls. +- gh-92356: Fixed a performance regression in ctypes function calls. -- gh-issue-90997: Show the actual named values stored in inline caches when +- gh-90997: Show the actual named values stored in inline caches when ``show_caches=True`` is passed to :mod:`dis` utilities. -- gh-issue-92301: Prefer ``close_range()`` to iterating over procfs for file +- gh-92301: Prefer ``close_range()`` to iterating over procfs for file descriptor closing in :mod:`subprocess` for better performance. -- gh-issue-67248: Sort the miscellaneous topics in Cmd.do_help() +- gh-67248: Sort the miscellaneous topics in Cmd.do_help() -- gh-issue-92210: Port ``socket.__init__`` to Argument Clinic. Patch by - Cinder. +- gh-92210: Port ``socket.__init__`` to Argument Clinic. Patch by Cinder. -- gh-issue-80010: Add support for generalized ISO 8601 parsing to +- gh-80010: Add support for generalized ISO 8601 parsing to :meth:`datetime.datetime.fromisoformat`, :meth:`datetime.date.fromisoformat` and :meth:`datetime.time.fromisoformat`. Patch by Paul Ganssle. -- gh-issue-92118: Fix a 3.11 regression in - :func:`~contextlib.contextmanager`, which caused it to propagate - exceptions with incorrect tracebacks. +- gh-92118: Fix a 3.11 regression in :func:`~contextlib.contextmanager`, + which caused it to propagate exceptions with incorrect tracebacks. -- gh-issue-90887: Adding ``COPYFILE_STAT``, ``COPYFILE_ACL`` and +- gh-90887: Adding ``COPYFILE_STAT``, ``COPYFILE_ACL`` and ``COPYFILE_XATTR`` constants for :func:`os.fcopyfile` available in macOs. -- gh-issue-91215: For :func:`@dataclass `, add +- gh-91215: For :func:`@dataclass `, add *weakref_slot*. The new parameter defaults to ``False``. If true, and if ``slots=True``, add a slot named ``"__weakref__"``, which will allow instances to be weakref'd. Contributed by Eric V. Smith -- gh-issue-85984: New function os.login_tty() for Unix. +- gh-85984: New function os.login_tty() for Unix. -- gh-issue-92128: Add :meth:`~object.__class_getitem__` to +- gh-92128: Add :meth:`~object.__class_getitem__` to :class:`logging.LoggerAdapter` and :class:`logging.StreamHandler`, allowing them to be parameterized at runtime. Patch by Alex Waygood. -- gh-issue-92049: Forbid pickling constants ``re._constants.SUCCESS`` etc. +- gh-92049: Forbid pickling constants ``re._constants.SUCCESS`` etc. Previously, pickling did not fail, but the result could not be unpickled. -- gh-issue-92062: :class:`inspect.Parameter` now raises :exc:`ValueError` if +- gh-92062: :class:`inspect.Parameter` now raises :exc:`ValueError` if ``name`` is a keyword, in addition to the existing check that it is an identifier. -- gh-issue-87390: Add an ``__unpacked__`` attribute to +- gh-87390: Add an ``__unpacked__`` attribute to :class:`types.GenericAlias`. Patch by Jelle Zijlstra. -- gh-issue-88089: Add support for generic :class:`typing.NamedTuple`. +- gh-88089: Add support for generic :class:`typing.NamedTuple`. -- gh-issue-91996: New http.HTTPMethod enum to represent all the available - HTTP request methods in a convenient way +- gh-91996: New http.HTTPMethod enum to represent all the available HTTP + request methods in a convenient way -- gh-issue-91984: Modified test strings in test_argparse.py to not contain +- gh-91984: Modified test strings in test_argparse.py to not contain trailing spaces before end of line. -- gh-issue-91952: Add ``encoding="locale"`` support to +- gh-91952: Add ``encoding="locale"`` support to :meth:`TextIOWrapper.reconfigure`. -- gh-issue-91954: Add *encoding* and *errors* arguments to +- gh-91954: Add *encoding* and *errors* arguments to :func:`subprocess.getoutput` and :func:`subprocess.getstatusoutput`. - bpo-47029: Always close the read end of the pipe used by @@ -8545,167 +9395,165 @@ Library collection and at :meth:`multiprocessing.Queue.close` calls. Patch by Géry Ogam. -- gh-issue-91928: Add ``datetime.UTC`` alias for ``datetime.timezone.utc``. +- gh-91928: Add ``datetime.UTC`` alias for ``datetime.timezone.utc``. Patch by Kabir Kwatra. -- gh-issue-68966: The :mod:`mailcap` module is now deprecated and will be - removed in Python 3.13. See :pep:`594` for the rationale and the - :mod:`mimetypes` module for an alternative. Patch by Victor Stinner. +- gh-68966: The :mod:`mailcap` module is now deprecated and will be removed + in Python 3.13. See :pep:`594` for the rationale and the :mod:`mimetypes` + module for an alternative. Patch by Victor Stinner. -- gh-issue-91401: Provide a way to disable :mod:`subprocess` use of - ``vfork()`` just in case it is ever needed and document the existing - mechanism for ``posix_spawn()``. +- gh-91401: Provide a way to disable :mod:`subprocess` use of ``vfork()`` + just in case it is ever needed and document the existing mechanism for + ``posix_spawn()``. -- gh-issue-64783: Fix :const:`signal.NSIG` value on FreeBSD to accept signal +- gh-64783: Fix :const:`signal.NSIG` value on FreeBSD to accept signal numbers greater than 32, like :const:`signal.SIGRTMIN` and :const:`signal.SIGRTMAX`. Patch by Victor Stinner. -- gh-issue-91910: Add missing f prefix to f-strings in error messages from - the :mod:`multiprocessing` and :mod:`asyncio` modules. +- gh-91910: Add missing f prefix to f-strings in error messages from the + :mod:`multiprocessing` and :mod:`asyncio` modules. -- gh-issue-91860: Add :func:`typing.dataclass_transform`, implementing - :pep:`681`. Patch by Jelle Zijlstra. +- gh-91860: Add :func:`typing.dataclass_transform`, implementing :pep:`681`. + Patch by Jelle Zijlstra. -- gh-issue-91832: Add ``required`` attribute to :class:`argparse.Action` - repr output. +- gh-91832: Add ``required`` attribute to :class:`argparse.Action` repr + output. -- gh-issue-91827: In the :mod:`tkinter` module add method - ``info_patchlevel()`` which returns the exact version of the Tcl library - as a named tuple similar to :data:`sys.version_info`. +- gh-91827: In the :mod:`tkinter` module add method ``info_patchlevel()`` + which returns the exact version of the Tcl library as a named tuple + similar to :data:`sys.version_info`. -- gh-issue-84461: Add :option:`--enable-wasm-pthreads` to enable pthreads - support for WASM builds. ``Emscripten/node`` no longer has threading - enabled by default. Include additional file systems. +- gh-84461: Add :option:`--enable-wasm-pthreads` to enable pthreads support + for WASM builds. ``Emscripten/node`` no longer has threading enabled by + default. Include additional file systems. -- gh-issue-91821: Fix unstable ``test_from_tuple`` test in - ``test_decimal.py``. +- gh-91821: Fix unstable ``test_from_tuple`` test in ``test_decimal.py``. -- gh-issue-91217: Deprecate the xdrlib module. +- gh-91217: Deprecate the xdrlib module. -- gh-issue-91217: Deprecate the uu module. +- gh-91217: Deprecate the uu module. -- gh-issue-91760: More strict rules will be applied for numerical group - references and group names in regular expressions. For now, a deprecation - warning is emitted for group references and group names which will be - errors in future Python versions. +- gh-91760: More strict rules will be applied for numerical group references + and group names in regular expressions. For now, a deprecation warning is + emitted for group references and group names which will be errors in + future Python versions. -- gh-issue-84461: Add provisional :data:`sys._emscripten_info` named tuple - with build-time and run-time information about Emscripten platform. +- gh-84461: Add provisional :data:`sys._emscripten_info` named tuple with + build-time and run-time information about Emscripten platform. -- gh-issue-90623: :func:`signal.raise_signal` and :func:`os.kill` now check +- gh-90623: :func:`signal.raise_signal` and :func:`os.kill` now check immediately for pending signals. Patch by Victor Stinner. -- gh-issue-91734: Fix OSS audio support on Solaris. +- gh-91734: Fix OSS audio support on Solaris. -- gh-issue-90633: Include the passed value in the exception thrown by +- gh-90633: Include the passed value in the exception thrown by :func:`typing.assert_never`. Patch by Jelle Zijlstra. -- gh-issue-91700: Compilation of regular expression containing a conditional +- gh-91700: Compilation of regular expression containing a conditional expression ``(?(group)...)`` now raises an appropriate :exc:`re.error` if the group number refers to not defined group. Previously an internal RuntimeError was raised. -- gh-issue-91231: Add an optional keyword *shutdown_timeout* parameter to - the :class:`multiprocessing.BaseManager` constructor. Kill the process if +- gh-91231: Add an optional keyword *shutdown_timeout* parameter to the + :class:`multiprocessing.BaseManager` constructor. Kill the process if terminate() takes longer than the timeout. Patch by Victor Stinner. -- gh-issue-91621: Fix :func:`typing.get_type_hints` for +- gh-91621: Fix :func:`typing.get_type_hints` for :class:`collections.abc.Callable`. Patch by Shantanu Jain. -- gh-issue-90568: Parsing ``\N`` escapes of Unicode Named Character - Sequences in a :mod:`regular expression ` raises now :exc:`re.error` - instead of ``TypeError``. +- gh-90568: Parsing ``\N`` escapes of Unicode Named Character Sequences in a + :mod:`regular expression ` raises now :exc:`re.error` instead of + ``TypeError``. -- gh-issue-91670: Remove deprecated ``SO`` config variable in - :mod:`sysconfig`. +- gh-91670: Remove deprecated ``SO`` config variable in :mod:`sysconfig`. -- gh-issue-91217: Deprecate the telnetlib module. +- gh-91217: Deprecate the telnetlib module. -- gh-issue-91217: Deprecate the sunau module. +- gh-91217: Deprecate the sunau module. -- gh-issue-91217: Deprecate the spwd module. +- gh-91217: Deprecate the spwd module. -- gh-issue-91217: Deprecate the sndhdr module, as well as inline needed +- gh-91217: Deprecate the sndhdr module, as well as inline needed functionality for ``email.mime.MIMEAudio``. -- gh-issue-91616: :mod:`re` module, fix :meth:`~re.Pattern.fullmatch` - mismatch when using Atomic Grouping or Possessive Quantifiers. +- gh-91616: :mod:`re` module, fix :meth:`~re.Pattern.fullmatch` mismatch + when using Atomic Grouping or Possessive Quantifiers. -- gh-issue-91217: Deprecate the 'pipes' module. +- gh-91217: Deprecate the 'pipes' module. -- gh-issue-91217: Deprecate the ossaudiodev module. +- gh-91217: Deprecate the ossaudiodev module. - bpo-47256: :mod:`re` module, limit the maximum capturing group to 1,073,741,823 in 64-bit build, this increases the depth of backtracking. -- gh-issue-91217: Deprecate the nis module. +- gh-91217: Deprecate the nis module. -- gh-issue-91595: Fix the comparison of character and integer inside +- gh-91595: Fix the comparison of character and integer inside :func:`Tools.gdb.libpython.write_repr`. Patch by Yu Liu. -- gh-issue-74166: Add option to raise all errors from +- gh-74166: Add option to raise all errors from :meth:`~socket.create_connection` in an :exc:`ExceptionGroup` when it fails to create a connection. The default remains to raise only the last error that had occurred when multiple addresses were tried. -- gh-issue-91487: Optimize asyncio UDP speed, over 100 times faster when +- gh-91487: Optimize asyncio UDP speed, over 100 times faster when transferring a large file. -- gh-issue-91575: Update case-insensitive matching in the :mod:`re` module - to the latest Unicode version. +- gh-91575: Update case-insensitive matching in the :mod:`re` module to the + latest Unicode version. -- gh-issue-90622: In ``concurrent.futures.process.ProcessPoolExecutor`` - disallow the "fork" multiprocessing start method when the new +- gh-90622: In ``concurrent.futures.process.ProcessPoolExecutor`` disallow + the "fork" multiprocessing start method when the new ``max_tasks_per_child`` feature is used as the mix of threads+fork can hang the child processes. Default to using the safe "spawn" start method in that circumstance if no ``mp_context`` was supplied. -- gh-issue-89022: In :mod:`sqlite3`, ``SQLITE_MISUSE`` result codes are now - mapped to :exc:`~sqlite3.InterfaceError` instead of +- gh-89022: In :mod:`sqlite3`, ``SQLITE_MISUSE`` result codes are now mapped + to :exc:`~sqlite3.InterfaceError` instead of :exc:`~sqlite3.ProgrammingError`. Also, more accurate exceptions are raised when binding parameters fail. Patch by Erlend E. Aasland. -- gh-issue-91526: Stop calling ``os.device_encoding(file.fileno())`` in +- gh-91526: Stop calling ``os.device_encoding(file.fileno())`` in :class:`TextIOWrapper`. It was complex, never documented, and didn't work for most cases. (Patch by Inada Naoki.) -- gh-issue-88116: Change the frame-related functions in the :mod:`inspect` - module to return a regular object (that is backwards compatible with the - old tuple-like interface) that include the extended :pep:`657` position +- gh-88116: Change the frame-related functions in the :mod:`inspect` module + to return a regular object (that is backwards compatible with the old + tuple-like interface) that include the extended :pep:`657` position information (end line number, column and end column). The affected functions are: :func:`inspect.getframeinfo`, :func:`inspect.getouterframes`, :func:`inspect.getinnerframes`, :func:`inspect.stack` and :func:`inspect.trace`. Patch by Pablo Galindo. -- gh-issue-69093: Add indexing and slicing support to :class:`sqlite3.Blob`. - Patch by Aviv Palivoda and Erlend E. Aasland. +- gh-69093: Add indexing and slicing support to :class:`sqlite3.Blob`. Patch + by Aviv Palivoda and Erlend E. Aasland. -- gh-issue-69093: Add :term:`context manager` support to - :class:`sqlite3.Blob`. Patch by Aviv Palivoda and Erlend E. Aasland. +- gh-69093: Add :term:`context manager` support to :class:`sqlite3.Blob`. + Patch by Aviv Palivoda and Erlend E. Aasland. -- gh-issue-91217: Deprecate nntplib. +- gh-91217: Deprecate nntplib. -- gh-issue-91217: Deprecate msilib. +- gh-91217: Deprecate msilib. -- gh-issue-91404: Improve the performance of :mod:`re` matching by using - computed gotos (or "threaded code") on supported platforms and removing - expensive pointer indirections. +- gh-91404: Improve the performance of :mod:`re` matching by using computed + gotos (or "threaded code") on supported platforms and removing expensive + pointer indirections. -- gh-issue-91217: Deprecate the imghdr module. +- gh-91217: Deprecate the imghdr module. -- gh-issue-91217: Deprecate the crypt module. +- gh-91217: Deprecate the crypt module. -- gh-issue-91276: Make space for longer opcodes in :mod:`dis` output. +- gh-91276: Make space for longer opcodes in :mod:`dis` output. - bpo-47000: Make :class:`TextIOWrapper` uses locale encoding when ``encoding="locale"`` is specified even in UTF-8 mode. -- gh-issue-91230: :func:`warnings.catch_warnings` now accepts arguments for +- gh-91230: :func:`warnings.catch_warnings` now accepts arguments for :func:`warnings.simplefilter`, providing a more concise way to locally ignore warnings or convert them to errors. -- gh-issue-91217: Deprecate the chunk module. +- gh-91217: Deprecate the chunk module. - Add the ``TCP_CONNECTION_INFO`` option (available on macOS) to :mod:`socket`. @@ -8853,17 +9701,16 @@ Library Documentation ------------- -- gh-issue-91888: Add a new ``gh`` role to the documentation to link to - GitHub issues. +- gh-91888: Add a new ``gh`` role to the documentation to link to GitHub + issues. -- gh-issue-91783: Document security issues concerning the use of the - function :meth:`shutil.unpack_archive` +- gh-91783: Document security issues concerning the use of the function + :meth:`shutil.unpack_archive` -- gh-issue-91547: Remove "Undocumented modules" page. +- gh-91547: Remove "Undocumented modules" page. -- gh-issue-91298: In ``importlib.resources.abc``, refined the documentation - of the Traversable Protocol, applying changes from importlib_resources - 5.7.1. +- gh-91298: In ``importlib.resources.abc``, refined the documentation of the + Traversable Protocol, applying changes from importlib_resources 5.7.1. - bpo-44347: Clarify the meaning of *dirs_exist_ok*, a kwarg of :func:`shutil.copytree`. @@ -8881,10 +9728,9 @@ Documentation of the :ref:`Limited API/Stable ABI `. - bpo-46962: All docstrings in code snippets are now wrapped into - :c:macro:`PyDoc_STR` to follow the guideline of `PEP 7's Documentation - Strings paragraph - `_. Patch - by Oleg Iarygin. + :c:macro:`PyDoc_STR` to follow the guideline of :pep:`PEP 7's + Documentation Strings paragraph <0007#documentation-strings>`. Patch by + Oleg Iarygin. - bpo-26792: Improve the docstrings of :func:`runpy.run_module` and :func:`runpy.run_path`. Original patch by Andrew Brezovsky. @@ -8892,21 +9738,19 @@ Documentation Tests ----- -- gh-issue-92169: Use ``warnings_helper.import_deprecated()`` to import - deprecated modules uniformly in tests. Patch by Hugo van Kemenade. +- gh-92169: Use ``warnings_helper.import_deprecated()`` to import deprecated + modules uniformly in tests. Patch by Hugo van Kemenade. -- gh-issue-84461: When multiprocessing is enabled, libregrtest can now use a +- gh-84461: When multiprocessing is enabled, libregrtest can now use a Python executable other than :code:`sys.executable` via the ``--python`` flag. -- gh-issue-91904: Fix initialization of - :envvar:`PYTHONREGRTEST_UNICODE_GUARD` which prevented running regression - tests on non-UTF-8 locale. +- gh-91904: Fix initialization of :envvar:`PYTHONREGRTEST_UNICODE_GUARD` + which prevented running regression tests on non-UTF-8 locale. -- gh-issue-91752: Added @requires_zlib to - test.test_tools.test_freeze.TestFreeze. +- gh-91752: Added @requires_zlib to test.test_tools.test_freeze.TestFreeze. -- gh-issue-91607: Fix ``test_concurrent_futures`` to test the correct +- gh-91607: Fix ``test_concurrent_futures`` to test the correct multiprocessing start method context in several cases where the test logic mixed this up. @@ -8925,12 +9769,11 @@ Tests Build ----- -- gh-issue-89452: gdbm-compat is now preferred over ndbm if both are - available on the system. This allows avoiding the problematic ndbm.h on - macOS. +- gh-89452: gdbm-compat is now preferred over ndbm if both are available on + the system. This allows avoiding the problematic ndbm.h on macOS. -- gh-issue-91731: Python is now built with ``-std=c11`` compiler option, - rather than ``-std=c99``. Patch by Victor Stinner. +- gh-91731: Python is now built with ``-std=c11`` compiler option, rather + than ``-std=c99``. Patch by Victor Stinner. - bpo-47152: Add script and make target for generating ``sre_constants.h``. @@ -8962,45 +9805,43 @@ macOS Tools/Demos ----------- -- gh-issue-91583: Fix regression in the code generated by Argument Clinic - for functions with the ``defining_class`` parameter. +- gh-91583: Fix regression in the code generated by Argument Clinic for + functions with the ``defining_class`` parameter. -- gh-issue-91575: Add script ``Tools/scripts/generate_re_casefix.py`` and - the make target ``regen-re`` for generating additional data for - case-insensitive matching according to the current Unicode version. +- gh-91575: Add script ``Tools/scripts/generate_re_casefix.py`` and the make + target ``regen-re`` for generating additional data for case-insensitive + matching according to the current Unicode version. -- gh-issue-91551: Remove the ancient Pynche color editor. It has moved to +- gh-91551: Remove the ancient Pynche color editor. It has moved to https://gitlab.com/warsaw/pynche C API ----- -- gh-issue-88279: Deprecate the C functions: :c:func:`PySys_SetArgv`, +- gh-88279: Deprecate the C functions: :c:func:`PySys_SetArgv`, :c:func:`PySys_SetArgvEx`, :c:func:`PySys_SetPath`. Patch by Victor Stinner. -- gh-issue-92154: Added the :c:func:`PyCode_GetCode` function. This function - does the equivalent of the Python code ``getattr(code_object, - 'co_code')``. +- gh-92154: Added the :c:func:`PyCode_GetCode` function. This function does + the equivalent of the Python code ``getattr(code_object, 'co_code')``. -- gh-issue-92173: Fix the ``closure`` argument to - :c:func:`PyEval_EvalCodeEx`. +- gh-92173: Fix the ``closure`` argument to :c:func:`PyEval_EvalCodeEx`. -- gh-issue-91320: Fix C++ compiler warnings about "old-style cast" (``g++ +- gh-91320: Fix C++ compiler warnings about "old-style cast" (``g++ -Wold-style-cast``) in the Python C API. Use C++ ``reinterpret_cast<>`` and ``static_cast<>`` casts when the Python C API is used in C++. Patch by Victor Stinner. -- gh-issue-80527: Mark functions as deprecated by :pep:`623`: +- gh-80527: Mark functions as deprecated by :pep:`623`: :c:func:`!PyUnicode_AS_DATA`, :c:func:`!PyUnicode_AS_UNICODE`, :c:func:`!PyUnicode_GET_DATA_SIZE`, :c:func:`!PyUnicode_GET_SIZE`. Patch by Victor Stinner. -- gh-issue-91768: :c:func:`Py_REFCNT`, :c:func:`Py_TYPE`, :c:func:`Py_SIZE` - and :c:func:`Py_IS_TYPE` functions argument type is now ``PyObject*``, - rather than ``const PyObject*``. Patch by Victor Stinner. +- gh-91768: :c:func:`Py_REFCNT`, :c:func:`Py_TYPE`, :c:func:`Py_SIZE` and + :c:func:`Py_IS_TYPE` functions argument type is now ``PyObject*``, rather + than ``const PyObject*``. Patch by Victor Stinner. -- gh-issue-91020: Add ``PyBytes_Type.tp_alloc`` to initialize +- gh-91020: Add ``PyBytes_Type.tp_alloc`` to initialize ``PyBytesObject.ob_shash`` for bytes subclasses. - bpo-40421: Add ``PyFrame_GetLasti`` C-API function to access frame @@ -9109,7 +9950,7 @@ Core and Builtins - bpo-47012: Speed up iteration of :class:`bytes` and :class:`bytearray` by 30%. Patch by Kumar Aditya. -- bpo-47009: Improved the performance of :meth:`list.append()` and list +- bpo-47009: Improved the performance of :meth:`list.append` and list comprehensions by optimizing for the common case, where no resize is needed. Patch by Dennis Sweeney. @@ -9427,7 +10268,7 @@ Library * Don't overwrite :exc:`BufferError` with :exc:`ValueError` when conversion to BLOB fails. * Raise :exc:`~sqlite3.ProgrammingError` instead of :exc:`~sqlite3.Warning` if - user tries to :meth:`~sqlite3.Cursor.execute()` more than one SQL statement. + user tries to :meth:`~sqlite3.Cursor.execute` more than one SQL statement. * Raise :exc:`~sqlite3.ProgrammingError` instead of :exc:`ValueError` if an SQL query contains null characters. @@ -9527,7 +10368,7 @@ Build script with Christian's container image ``quay.io/tiran/cpython_autoconf:269``. -- bpo-46917: Building Python now requires support of IEEE 754 floating point +- bpo-46917: Building Python now requires support of IEEE 754 floating-point numbers. Patch by Victor Stinner. - bpo-45774: ``configure`` now verifies that all SQLite C APIs needed for @@ -9997,7 +10838,7 @@ Build - bpo-46656: Building Python now requires a C11 compiler. Optional C11 features are not required. Patch by Victor Stinner. -- bpo-46656: Building Python now requires support for floating point +- bpo-46656: Building Python now requires support for floating-point Not-a-Number (NaN): remove the ``Py_NO_NAN`` macro. Patch by Victor Stinner. @@ -10247,9 +11088,9 @@ Library - bpo-46422: Use ``dis.Positions`` in ``dis.Instruction`` instead of a regular ``tuple``. -- bpo-46434: :mod:`pdb` now gracefully handles ``help`` when :attr:`__doc__` - is missing, for example when run with pregenerated optimized ``.pyc`` - files. +- bpo-46434: :mod:`pdb` now gracefully handles ``help`` when + :attr:`~module.__doc__` is missing, for example when run with pregenerated + optimized ``.pyc`` files. - bpo-43869: Python uses the same time Epoch on all platforms. Add an explicit unit test to ensure that it's the case. Patch by Victor Stinner. @@ -10544,8 +11385,8 @@ Core and Builtins ``SEND`` instruction which performs the same operation, but without the loop. -- bpo-45635: The code called from :c:func:`_PyErr_Display` was refactored to - improve error handling. It now exits immediately upon an unrecoverable +- bpo-45635: The code called from :c:func:`!_PyErr_Display` was refactored + to improve error handling. It now exits immediately upon an unrecoverable error. - bpo-46054: Fix parser error when parsing non-utf8 characters in source @@ -10897,7 +11738,7 @@ Core and Builtins - bpo-46004: Fix the :exc:`SyntaxError` location for errors involving for loops with invalid targets. Patch by Pablo Galindo -- bpo-45711: :c:func:`_PyErr_ChainStackItem` no longer normalizes +- bpo-45711: :c:func:`!_PyErr_ChainStackItem` no longer normalizes ``exc_info`` (including setting the traceback on the exception instance) because ``exc_info`` is always normalized. @@ -11375,7 +12216,7 @@ Core and Builtins Galindo. - bpo-45688: :data:`sys.stdlib_module_names` now contains the macOS-specific - module :mod:`_scproxy`. + module :mod:`!_scproxy`. - bpo-45379: Clarify :exc:`ImportError` message when we try to explicitly import a frozen module but frozen modules are disabled. @@ -11752,7 +12593,7 @@ Build - bpo-45571: ``Modules/Setup`` now use ``PY_CFLAGS_NODIST`` instead of ``PY_CFLAGS`` to compile shared modules. -- bpo-45570: :mod:`pyexpat` and :mod:`_elementtree` no longer define +- bpo-45570: :mod:`pyexpat` and :mod:`!_elementtree` no longer define obsolete macros ``HAVE_EXPAT_CONFIG_H`` and ``USE_PYEXPAT_CAPI``. ``XML_POOR_ENTROPY`` is now defined in ``expat_config.h``. @@ -12134,7 +12975,7 @@ Core and Builtins - bpo-44732: Rename ``types.Union`` to ``types.UnionType``. - bpo-44725: Expose specialization stats in python via - :func:`_opcode.get_specialization_stats`. + :func:`!_opcode.get_specialization_stats`. - bpo-44717: Improve AttributeError on circular imports of submodules. @@ -12545,7 +13386,7 @@ Library * Old alias ``_TextTestResult`` of :class:`~unittest.TextTestResult`. - bpo-38371: Remove the deprecated ``split()`` method of - :class:`_tkinter.TkappType`. Patch by Erlend E. Aasland. + :class:`!_tkinter.TkappType`. Patch by Erlend E. Aasland. - bpo-20499: Improve the speed and accuracy of statistics.pvariance(). @@ -12667,7 +13508,7 @@ Library occurs during file extraction. - bpo-44935: :mod:`subprocess` on Solaris now also uses - :func:`os.posix_spawn()` for better performance. + :func:`os.posix_spawn` for better performance. - bpo-44911: :class:`~unittest.IsolatedAsyncioTestCase` will no longer throw an exception while cancelling leaked tasks. Patch by Bar Harel. @@ -12774,10 +13615,10 @@ Library - bpo-44690: Adopt *binacii.a2b_base64*'s strict mode in *base64.b64decode*. -- bpo-42854: Fixed a bug in the :mod:`_ssl` module that was throwing - :exc:`OverflowError` when using :meth:`_ssl._SSLSocket.write` and - :meth:`_ssl._SSLSocket.read` for a big value of the ``len`` parameter. - Patch by Pablo Galindo +- bpo-42854: Fixed a bug in the :mod:`!_ssl` module that was throwing + :exc:`OverflowError` when using :meth:`!_ssl._SSLSocket.write` and + :meth:`!_ssl._SSLSocket.read` for a big value of the ``len`` parameter. + Patch by Pablo Galindo. - bpo-44686: Replace ``unittest.mock._importer`` with ``pkgutil.resolve_name``. @@ -12808,7 +13649,7 @@ Library :exc:`TypeError`, it should be :exc:`OSError` with appropriate error message. -- bpo-44608: Fix memory leak in :func:`_tkinter._flatten` if it is called +- bpo-44608: Fix memory leak in :func:`!_tkinter._flatten` if it is called with a sequence or set, but not list or tuple. - bpo-44594: Fix an edge case of :class:`ExitStack` and @@ -13439,7 +14280,7 @@ Tests - bpo-25130: Add calls of :func:`gc.collect` in tests to support PyPy. -- bpo-45011: Made tests relying on the :mod:`_asyncio` C extension module +- bpo-45011: Made tests relying on the :mod:`!_asyncio` C extension module optional to allow running on alternative Python implementations. Patch by Serhiy Storchaka. @@ -13457,7 +14298,7 @@ Tests potential harmless "malloc can't allocate region" messages spewed by test_decimal. -- bpo-44734: Fixed floating point precision issue in turtle tests. +- bpo-44734: Fixed floating-point precision issue in turtle tests. - bpo-44708: Regression tests, when run with -w, are now re-running only the affected test methods instead of re-running the entire test file. @@ -13874,7 +14715,7 @@ Core and Builtins should not normally be possible, but might occur in some unusual circumstances. -- bpo-43963: Importing the :mod:`_signal` module in a subinterpreter has no +- bpo-43963: Importing the :mod:`!_signal` module in a subinterpreter has no longer side effects. - bpo-42739: The internal representation of line number tables is changed to @@ -14100,11 +14941,11 @@ Library _pyio.open is a Python function. In Python 3.10, _pyio.open() is now a static method, and builtins.open() is now io.open(). -- bpo-43680: The Python :func:`_pyio.open` function becomes a static method +- bpo-43680: The Python :func:`!_pyio.open` function becomes a static method to behave as :func:`io.open` built-in function: don't become a bound method when stored as a class variable. It becomes possible since static methods are now callable in Python 3.10. Moreover, - :func:`_pyio.OpenWrapper` becomes a simple alias to :func:`_pyio.open`. + :func:`!_pyio.OpenWrapper` becomes a simple alias to :func:`!_pyio.open`. Patch by Victor Stinner. - bpo-41515: Fix :exc:`KeyError` raised in :func:`typing.get_type_hints` due @@ -14168,7 +15009,7 @@ Library :class:`typing.ParamSpecKwargs`, which enables a more useful ``repr()``. Patch by Jelle Zijlstra. -- bpo-43731: Add an ``encoding`` parameter :func:`logging.fileConfig()`. +- bpo-43731: Add an ``encoding`` parameter :func:`logging.fileConfig`. - bpo-43712: Add ``encoding`` and ``errors`` parameters to :func:`fileinput.input` and :class:`fileinput.FileInput`. @@ -14289,7 +15130,7 @@ Library Patch by Ma Lin. - bpo-36470: Fix dataclasses with ``InitVar``\s and - :func:`~dataclasses.replace()`. Patch by Claudiu Popa. + :func:`~dataclasses.replace`. Patch by Claudiu Popa. - bpo-40849: Expose X509_V_FLAG_PARTIAL_CHAIN ssl flag @@ -14300,11 +15141,11 @@ Library accept a *follow_symlinks* keyword-only argument for consistency with corresponding functions in the :mod:`os` module. -- bpo-39899: :func:`os.path.expanduser()` now refuses to guess Windows home +- bpo-39899: :func:`os.path.expanduser` now refuses to guess Windows home directories if the basename of current user's home directory does not match their username. - :meth:`pathlib.Path.expanduser()` and :meth:`~pathlib.Path.home()` now + :meth:`pathlib.Path.expanduser` and :meth:`~pathlib.Path.home` now consistently raise :exc:`RuntimeError` exception when a home directory cannot be resolved. Previously a :exc:`KeyError` exception could be raised on Windows when the ``"USERNAME"`` environment variable was unset. @@ -14381,7 +15222,7 @@ Windows - bpo-35306: Adds additional arguments to :func:`os.startfile` function. -- bpo-43538: Avoid raising errors from :meth:`pathlib.Path.exists()` when +- bpo-43538: Avoid raising errors from :meth:`pathlib.Path.exists` when passed an invalid filename. - bpo-38822: Fixed :func:`os.stat` failing on inaccessible directories with @@ -14539,7 +15380,7 @@ Core and Builtins internally. This reduces the number of EXTENDED_ARG instructions needed and streamlines instruction dispatch a bit. -- bpo-40645: Fix reference leak in the :mod:`_hashopenssl` extension. Patch +- bpo-40645: Fix reference leak in the :mod:`!_hashopenssl` extension. Patch by Pablo Galindo. - bpo-42134: Calls to find_module() by the import system now raise @@ -14752,8 +15593,8 @@ Library - bpo-14678: Add an invalidate_caches() method to the zipimport.zipimporter class to support importlib.invalidate_caches(). Patch by Desmond Cheong. -- bpo-42782: Fail fast in :func:`shutil.move()` to avoid creating - destination directories on failure. +- bpo-42782: Fail fast in :func:`shutil.move` to avoid creating destination + directories on failure. - bpo-40066: Enum's ``repr()`` and ``str()`` have changed: ``repr()`` is now *EnumClass.MemberName* and ``str()`` is *MemberName*. Additionally, @@ -14772,13 +15613,13 @@ Library value of type bytes, it is now handled consistently. Previously exceptions could be raised from some tempfile APIs when the directory did not already exist in this situation. Also ensures that the - :func:`tempfile.gettempdir()` and :func:`tempfile.gettempdirb()` functions + :func:`tempfile.gettempdir` and :func:`tempfile.gettempdirb` functions *always* return ``str`` and ``bytes`` respectively. - bpo-39342: Expose ``X509_V_FLAG_ALLOW_PROXY_CERTS`` as :const:`~ssl.VERIFY_ALLOW_PROXY_CERTS` to allow proxy certificate validation as explained in - https://www.openssl.org/docs/man1.1.1/man7/proxy-certificates.html. + https://docs.openssl.org/1.1.1/man7/proxy-certificates/. - bpo-31861: Add builtins.aiter and builtins.anext. Patch by Joshua Bronson (@jab), Daniel Pope (@lordmauve), and Justin Wang (@justin39). @@ -15057,7 +15898,7 @@ Library - bpo-42151: Make the pure Python implementation of :mod:`xml.etree.ElementTree` behave the same as the C implementation - (:mod:`_elementree`) regarding default attribute values (by not setting + (:mod:`!_elementree`) regarding default attribute values (by not setting ``specified_attributes=1``). - bpo-29753: In ctypes, now packed bitfields are calculated properly and the @@ -15203,7 +16044,7 @@ Core and Builtins after reassigning a slice at the start of the ``bytearray`` to a shorter byte string). -- bpo-42882: Fix the :c:func:`_PyUnicode_FromId` function +- bpo-42882: Fix the :c:func:`!_PyUnicode_FromId` function (_Py_IDENTIFIER(var) API) when :c:func:`Py_Initialize` / :c:func:`Py_Finalize` is called multiple times: preserve ``_PyRuntime.unicode_ids.next_index`` value. @@ -15493,7 +16334,7 @@ Core and Builtins - bpo-40521: Make the Unicode dictionary of interned strings compatible with subinterpreters. Patch by Victor Stinner. -- bpo-39465: Make :c:func:`_PyUnicode_FromId` function compatible with +- bpo-39465: Make :c:func:`!_PyUnicode_FromId` function compatible with subinterpreters. Each interpreter now has an array of identifier objects (interned strings decoded from UTF-8). Patch by Victor Stinner. @@ -15553,7 +16394,7 @@ Library - bpo-9694: Argparse help no longer uses the confusing phrase, "optional arguments". It uses "options" instead. -- bpo-1635741: Port the :mod:`_thread` extension module to the multiphase +- bpo-1635741: Port the :mod:`!_thread` extension module to the multiphase initialization API (:pep:`489`) and convert its static types to heap types. @@ -15675,7 +16516,7 @@ Library - bpo-31904: Fix site and sysconfig modules for VxWorks RTOS which has no home directories. -- bpo-41462: Add :func:`os.set_blocking()` support for VxWorks RTOS. +- bpo-41462: Add :func:`os.set_blocking` support for VxWorks RTOS. - bpo-40219: Lowered :class:`tkinter.ttk.LabeledScale` dummy widget to prevent hiding part of the content label. @@ -15766,8 +16607,8 @@ C API regression. Python 3.9 uses ``-fvisibility=hidden`` and the function was not exported explicitly and so not exported. -- bpo-32381: Remove the private :c:func:`_Py_fopen` function which is no - longer needed. Use :c:func:`_Py_wfopen` or :c:func:`_Py_fopen_obj` +- bpo-32381: Remove the private :c:func:`!_Py_fopen` function which is no + longer needed. Use :c:func:`!_Py_wfopen` or :c:func:`!_Py_fopen_obj` instead. Patch by Victor Stinner. - bpo-1635741: Port :mod:`resource` extension module to module state @@ -15977,7 +16818,7 @@ Library - bpo-42403: Simplify the :mod:`importlib` external bootstrap code: ``importlib._bootstrap_external`` now uses regular imports to import - builtin modules. When it is imported, the builtin :func:`__import__()` + builtin modules. When it is imported, the builtin :func:`__import__` function is already fully working and so can be used to import builtin modules like :mod:`sys`. Patch by Victor Stinner. @@ -15990,8 +16831,8 @@ Library initialization API (:pep:`489`). Patch by Victor Stinner and Mohamed Koubaa. -- bpo-37205: :func:`time.time()`, :func:`time.perf_counter()` and - :func:`time.monotonic()` functions can no longer fail with a Python fatal +- bpo-37205: :func:`time.time`, :func:`time.perf_counter` and + :func:`time.monotonic` functions can no longer fail with a Python fatal error, instead raise a regular Python exception on failure. - bpo-42328: Fixed :meth:`tkinter.ttk.Style.map`. The function accepts now @@ -16003,12 +16844,11 @@ Library (flatten, deduplicate, use type to cache key). Patch provided by Yurii Karabas. -- bpo-37205: :func:`time.perf_counter()` on Windows and - :func:`time.monotonic()` on macOS are now system-wide. Previously, they - used an offset computed at startup to reduce the precision loss caused by - the float type. Use :func:`time.perf_counter_ns()` and - :func:`time.monotonic_ns()` added in Python 3.7 to avoid this precision - loss. +- bpo-37205: :func:`time.perf_counter` on Windows and :func:`time.monotonic` + on macOS are now system-wide. Previously, they used an offset computed at + startup to reduce the precision loss caused by the float type. Use + :func:`time.perf_counter_ns` and :func:`time.monotonic_ns` added in Python + 3.7 to avoid this precision loss. - bpo-42318: Fixed support of non-BMP characters in :mod:`tkinter` on macOS. @@ -16306,7 +17146,7 @@ C API - bpo-40170: The ``Py_TRASHCAN_BEGIN`` macro no longer accesses PyTypeObject attributes, but now can get the condition by calling the new private - :c:func:`_PyTrash_cond()` function which hides implementation details. + :c:func:`!_PyTrash_cond()` function which hides implementation details. - bpo-42260: :c:func:`Py_GetPath`, :c:func:`Py_GetPrefix`, :c:func:`Py_GetExecPrefix`, :c:func:`Py_GetProgramFullPath`, @@ -16447,8 +17287,8 @@ Core and Builtins currently active in that thread at the time the function is called. - bpo-38605: Enable ``from __future__ import annotations`` (:pep:`563`) by - default. The values found in :attr:`__annotations__` dicts are now - strings, e.g. ``{"x": "int"}`` instead of ``{"x": int}``. + default. The values found in :attr:`~object.__annotations__` dicts are now + strings, for example ``{"x": "int"}`` instead of ``{"x": int}``. Library ------- @@ -16501,13 +17341,13 @@ Library values - bpo-42065: Fix an incorrectly formatted error from - :meth:`_codecs.charmap_decode` when called with a mapped value outside the - range of valid Unicode code points. PR by Max Bernstein. + :meth:`!_codecs.charmap_decode` when called with a mapped value outside + the range of valid Unicode code points. PR by Max Bernstein. - bpo-41966: Fix pickling pure Python :class:`datetime.time` subclasses. Patch by Dean Inwood. -- bpo-19270: :meth:`sched.scheduler.cancel()` will now cancel the correct +- bpo-19270: :meth:`sched.scheduler.cancel` will now cancel the correct event, if two events with same priority are scheduled for the same time. Patch by Bar Harel. @@ -16746,7 +17586,7 @@ Core and Builtins - bpo-41870: Speed up calls to ``bool()`` by using the :pep:`590` ``vectorcall`` calling convention. Patch by Donghee Na. -- bpo-1635741: Port the :mod:`_bisect` module to the multi-phase +- bpo-1635741: Port the :mod:`!_bisect` module to the multi-phase initialization API (:pep:`489`). - bpo-39934: Correctly count control blocks in 'except' in compiler. Ensures @@ -16756,32 +17596,32 @@ Core and Builtins - bpo-41780: Fix :meth:`__dir__` of :class:`types.GenericAlias`. Patch by Batuhan Taskaya. -- bpo-1635741: Port the :mod:`_lsprof` extension module to multi-phase +- bpo-1635741: Port the :mod:`!_lsprof` extension module to multi-phase initialization (:pep:`489`). - bpo-1635741: Port the :mod:`cmath` extension module to multi-phase initialization (:pep:`489`). -- bpo-1635741: Port the :mod:`_scproxy` extension module to multi-phase +- bpo-1635741: Port the :mod:`!_scproxy` extension module to multi-phase initialization (:pep:`489`). - bpo-1635741: Port the :mod:`termios` extension module to multi-phase initialization (:pep:`489`). -- bpo-1635741: Convert the :mod:`_sha256` extension module types to heap +- bpo-1635741: Convert the :mod:`!_sha256` extension module types to heap types. - bpo-41690: Fix a possible stack overflow in the parser when parsing functions and classes with a huge amount of arguments. Patch by Pablo Galindo. -- bpo-1635741: Port the :mod:`_overlapped` extension module to multi-phase +- bpo-1635741: Port the :mod:`!_overlapped` extension module to multi-phase initialization (:pep:`489`). -- bpo-1635741: Port the :mod:`_curses_panel` extension module to multi-phase - initialization (:pep:`489`). +- bpo-1635741: Port the :mod:`!_curses_panel` extension module to + multi-phase initialization (:pep:`489`). -- bpo-1635741: Port the :mod:`_opcode` extension module to multi-phase +- bpo-1635741: Port the :mod:`!_opcode` extension module to multi-phase initialization (:pep:`489`). - bpo-41681: Fixes the wrong error description in the error raised by using @@ -16807,12 +17647,12 @@ Core and Builtins implement lazy import, whereas Python expected that ``import _ast`` always return a fully initialized ``_ast`` module. -- bpo-40077: Convert :mod:`_operator` to use :c:func:`PyType_FromSpec`. +- bpo-40077: Convert :mod:`!_operator` to use :c:func:`PyType_FromSpec`. -- bpo-1653741: Port :mod:`_sha3` to multi-phase init. Convert static types +- bpo-1653741: Port :mod:`!_sha3` to multi-phase init. Convert static types to heap types. -- bpo-1635741: Port the :mod:`_blake2` extension module to the multi-phase +- bpo-1635741: Port the :mod:`!_blake2` extension module to the multi-phase initialization API (:pep:`489`). - bpo-41533: Free the stack allocated in ``va_build_stack`` if @@ -16824,7 +17664,7 @@ Core and Builtins - bpo-41525: The output of ``python --help`` contains now only ASCII characters. -- bpo-1635741: Port the :mod:`_sha1`, :mod:`_sha512`, and :mod:`_md5` +- bpo-1635741: Port the :mod:`!_sha1`, :mod:`!_sha512`, and :mod:`!_md5` extension modules to multi-phase initialization API (:pep:`489`). - bpo-41431: Optimize ``dict_merge()`` for copying dict (e.g. ``dict(d)`` @@ -16916,7 +17756,7 @@ Core and Builtins - bpo-40939: Remove the remaining files from the old parser and the :mod:`symbol` module. -- bpo-40077: Convert :mod:`_bz2` to use :c:func:`PyType_FromSpec`. +- bpo-40077: Convert :mod:`!_bz2` to use :c:func:`PyType_FromSpec`. - bpo-41006: The ``encodings.latin_1`` module is no longer imported at startup. Now it is only imported when it is the filesystem encoding or the @@ -16926,7 +17766,7 @@ Core and Builtins which raises a :exc:`ValueError` if the arguments are exhausted at different lengths. Patch by Brandt Bucher. -- bpo-1635741: Port :mod:`_gdbm` to multiphase initialization. +- bpo-1635741: Port :mod:`!_gdbm` to multiphase initialization. - bpo-40985: Fix a bug that caused the :exc:`SyntaxError` text to be empty when a file ends with a line ending in a line continuation character (i.e. @@ -16935,7 +17775,7 @@ Core and Builtins - bpo-40958: Fix a possible buffer overflow in the PEG parser when gathering information for emitting syntax errors. Patch by Pablo Galindo. -- bpo-1635741: Port :mod:`_dbm` to multiphase initialization. +- bpo-1635741: Port :mod:`!_dbm` to multiphase initialization. - bpo-40957: Fix refleak in _Py_fopen_obj() when PySys_Audit() fails @@ -17048,7 +17888,7 @@ Core and Builtins - bpo-1635741: Port :mod:`mmap` to multiphase initialization. -- bpo-1635741: Port :mod:`_lzma` to multiphase initialization. +- bpo-1635741: Port :mod:`!_lzma` to multiphase initialization. - bpo-37999: Builtin and extension functions that take integer arguments no longer accept :class:`~decimal.Decimal`\ s, :class:`~fractions.Fraction`\ @@ -17056,7 +17896,7 @@ Core and Builtins (e.g. that have the :meth:`~object.__int__` method but do not have the :meth:`~object.__index__` method). -- bpo-29882: Add :meth:`int.bit_count()`, counting the number of ones in the +- bpo-29882: Add :meth:`int.bit_count`, counting the number of ones in the binary representation of an integer. Patch by Niklas Fiekas. - bpo-36982: Use ncurses extended color functions when available to support @@ -17213,7 +18053,7 @@ Library Inputs that used to cause ZeroDivisionError now cause an OverflowError instead. -- bpo-41440: Add :func:`os.cpu_count()` support for VxWorks RTOS. +- bpo-41440: Add :func:`os.cpu_count` support for VxWorks RTOS. - bpo-41316: Fix the :mod:`tarfile` module to write only basename of TAR file to GZIP compression header. @@ -17514,7 +18354,7 @@ Library - bpo-38144: Added the *root_dir* and *dir_fd* parameters in :func:`glob.glob`. -- bpo-26543: Fix :meth:`IMAP4.noop()` when debug mode is enabled (ex: +- bpo-26543: Fix :meth:`IMAP4.noop` when debug mode is enabled (ex: ``imaplib.Debug = 3``). - bpo-12178: :func:`csv.writer` now correctly escapes *escapechar* when @@ -18055,7 +18895,7 @@ Library ``randbytes()`` now directly reuses ``getrandbits()``. - bpo-40394: Added default arguments to - :meth:`difflib.SequenceMatcher.find_longest_match()`. + :meth:`difflib.SequenceMatcher.find_longest_match`. - bpo-39995: Fix a race condition in concurrent.futures._ThreadWakeup: access to _ThreadWakeup is now protected with the shutdown lock. @@ -18276,7 +19116,7 @@ Core and Builtins The codecs machinery can no longer work on very late calls to str.encode() and str.decode(). -- bpo-40077: Fix possible refleaks in :mod:`_json`, memo of PyScannerObject +- bpo-40077: Fix possible refleaks in :mod:`!_json`, memo of PyScannerObject should be traversed. - bpo-37207: Speed up calls to ``dict()`` by using the :pep:`590` @@ -18381,8 +19221,8 @@ Library - bpo-40330: In :meth:`ShareableList.__setitem__`, check the size of a new string item after encoding it to utf-8, not before. -- bpo-40148: Added :meth:`pathlib.Path.with_stem()` to create a new Path - with the stem replaced. +- bpo-40148: Added :meth:`pathlib.Path.with_stem` to create a new Path with + the stem replaced. - bpo-40325: Deprecated support for set objects in random.sample(). @@ -18466,7 +19306,7 @@ Library _MainThread instance for _main_thread, instead of a _DummyThread instance. - bpo-40089: Add a private ``_at_fork_reinit()`` method to - :class:`_thread.Lock`, :class:`_thread.RLock`, :class:`threading.RLock` + :class:`!_thread.Lock`, :class:`!_thread.RLock`, :class:`threading.RLock` and :class:`threading.Condition` classes: reinitialize the lock at fork in the child process, reset the lock to the unlocked state. Rename also the private ``_reset_internal_locks()`` method of :class:`threading.Event` to @@ -18541,8 +19381,8 @@ Library returned as part of source of the class. Patch by Karthikeyan Singaravelan. -- bpo-33262: Deprecate passing None as an argument for - :func:`shlex.split()`'s ``s`` parameter. Patch by Zackery Spytz. +- bpo-33262: Deprecate passing None as an argument for :func:`shlex.split`'s + ``s`` parameter. Patch by Zackery Spytz. - bpo-31758: Prevent crashes when using an uninitialized ``_elementtree.XMLParser`` object. Patch by Oren Milman. @@ -18891,7 +19731,7 @@ Library preferred to avoid the case when the temporary-file-generated address is too large for an AF_UNIX socket address. Patch by Pablo Galindo. -- bpo-36287: :func:`ast.dump()` no longer outputs optional fields and +- bpo-36287: :func:`ast.dump` no longer outputs optional fields and attributes with default values. The default values for optional fields and attributes of AST nodes are now set as class attributes (e.g. ``Constant.kind`` is set to ``None``). @@ -19458,12 +20298,11 @@ Windows - bpo-39393: Improve the error message when attempting to load a DLL with unresolved dependencies. -- bpo-38883: :meth:`~pathlib.Path.home()` and - :meth:`~pathlib.Path.expanduser()` on Windows now prefer - :envvar:`USERPROFILE` and no longer use :envvar:`HOME`, which is not - normally set for regular user accounts. This makes them again behave like - :func:`os.path.expanduser`, which was changed to ignore :envvar:`HOME` in - 3.8, see :issue:`36264`. +- bpo-38883: :meth:`~pathlib.Path.home` and :meth:`~pathlib.Path.expanduser` + on Windows now prefer :envvar:`USERPROFILE` and no longer use + :envvar:`HOME`, which is not normally set for regular user accounts. This + makes them again behave like :func:`os.path.expanduser`, which was changed + to ignore :envvar:`HOME` in 3.8, see :issue:`36264`. - bpo-39185: The build.bat script has additional options for very-quiet output (-q) and very-verbose output (-vv) @@ -20331,8 +21170,8 @@ Core and Builtins - bpo-38631: Replace ``Py_FatalError()`` call with a regular :exc:`RuntimeError` exception in :meth:`float.__getformat__`. -- bpo-38639: Optimized :func:`math.floor()`, :func:`math.ceil()` and - :func:`math.trunc()` for floats. +- bpo-38639: Optimized :func:`math.floor`, :func:`math.ceil` and + :func:`math.trunc` for floats. - bpo-38640: Fixed a bug in the compiler that was causing to raise in the presence of break statements and continue statements inside always false @@ -20387,7 +21226,7 @@ Core and Builtins ``crypt_r``. - bpo-37474: On FreeBSD, Python no longer calls ``fedisableexcept()`` at - startup to control the floating point control mode. The call became + startup to control the floating-point control mode. The call became useless since FreeBSD 6: it became the default mode. - bpo-38006: Fix a bug due to the interaction of weakrefs and the cyclic @@ -20743,12 +21582,13 @@ Library - bpo-38405: Nested subclasses of :class:`typing.NamedTuple` are now pickleable. -- bpo-38332: Prevent :exc:`KeyError` thrown by :func:`_encoded_words.decode` - when given an encoded-word with invalid content-type encoding from - propagating all the way to :func:`email.message.get`. +- bpo-38332: Prevent :exc:`KeyError` thrown by + :func:`!_encoded_words.decode` when given an encoded-word with invalid + content-type encoding from propagating all the way to + :func:`email.message.get`. - bpo-38371: Deprecated the ``split()`` method in - :class:`_tkinter.TkappType` in favour of the ``splitlist()`` method which + :class:`!_tkinter.TkappType` in favour of the ``splitlist()`` method which has more consistent and predictable behavior. - bpo-38341: Add :exc:`smtplib.SMTPNotSupportedError` to the :mod:`smtplib` @@ -21289,9 +22129,9 @@ Library - bpo-37279: Fix asyncio sendfile support when sendfile sends extra data in fallback mode. -- bpo-19865: :func:`ctypes.create_unicode_buffer()` now also supports - non-BMP characters on platforms with 16-bit :c:type:`wchar_t` (for - example, Windows and AIX). +- bpo-19865: :func:`ctypes.create_unicode_buffer` now also supports non-BMP + characters on platforms with 16-bit :c:type:`wchar_t` (for example, + Windows and AIX). - bpo-37266: In a subinterpreter, spawning a daemon thread now raises an exception. Daemon threads were never supported in subinterpreters. @@ -21299,7 +22139,7 @@ Library error if a daemon thread was still running. - bpo-37210: Allow pure Python implementation of :mod:`pickle` to work even - when the C :mod:`_pickle` module is unavailable. + when the C :mod:`!_pickle` module is unavailable. - bpo-21872: Fix :mod:`lzma`: module decompresses data incompletely. When decompressing a FORMAT_ALONE format file, and it doesn't have the end @@ -21315,11 +22155,11 @@ Library tuple. - bpo-36607: Eliminate :exc:`RuntimeError` raised by - :func:`asyncio.all_tasks()` if internal tasks weak set is changed by - another thread during iteration. + :func:`asyncio.all_tasks` if internal tasks weak set is changed by another + thread during iteration. -- bpo-18748: :class:`_pyio.IOBase` destructor now does nothing if getting - the ``closed`` attribute fails to better mimic :class:`_io.IOBase` +- bpo-18748: :class:`!_pyio.IOBase` destructor now does nothing if getting + the ``closed`` attribute fails to better mimic :class:`!_io.IOBase` finalizer. - bpo-36402: Fix a race condition at Python shutdown when waiting for @@ -21470,7 +22310,7 @@ Library - bpo-30618: Add :meth:`~pathlib.Path.readlink`. Patch by Girts Folkmanis. -- bpo-32498: Made :func:`urllib.parse.unquote()` accept bytes in addition to +- bpo-32498: Made :func:`urllib.parse.unquote` accept bytes in addition to strings. Patch by Stein Karlsen. - bpo-33348: lib2to3 now recognizes expressions after ``*`` and ``**`` like @@ -21567,7 +22407,7 @@ Documentation - bpo-37478: Added possible exceptions to the description of os.chdir(). -- bpo-34903: Documented that in :meth:`datetime.datetime.strptime()`, the +- bpo-34903: Documented that in :meth:`datetime.datetime.strptime`, the leading zero in some two-digit formats is optional. Patch by Mike Gleen. - bpo-36260: Add decompression pitfalls to zipfile module documentation. @@ -21953,7 +22793,7 @@ Windows - bpo-32587: Make :const:`winreg.REG_MULTI_SZ` support zero-length strings. - bpo-28269: Replace use of :c:func:`strcasecmp` for the system function - :c:func:`_stricmp`. Patch by Minmin Gong. + :c:func:`!_stricmp`. Patch by Minmin Gong. - bpo-36590: Add native Bluetooth RFCOMM support to socket module. @@ -22192,8 +23032,9 @@ C API - bpo-36763: Add :c:func:`PyConfig_SetWideStringList` function. - bpo-37337: Add fast functions for calling methods: - :c:func:`_PyObject_VectorcallMethod`, :c:func:`_PyObject_CallMethodNoArgs` - and :c:func:`_PyObject_CallMethodOneArg`. + :c:func:`!_PyObject_VectorcallMethod`, + :c:func:`!_PyObject_CallMethodNoArgs` and + :c:func:`!_PyObject_CallMethodOneArg`. - bpo-28805: The :c:macro:`METH_FASTCALL` calling convention has been documented. @@ -22299,8 +23140,8 @@ Core and Builtins - bpo-37032: Added new ``replace()`` method to the code type (:class:`types.CodeType`). -- bpo-37007: Implement :func:`socket.if_nameindex()`, - :func:`socket.if_nametoindex()`, and :func:`socket.if_indextoname()` on +- bpo-37007: Implement :func:`socket.if_nameindex`, + :func:`socket.if_nametoindex`, and :func:`socket.if_indextoname` on Windows. - bpo-36829: :c:func:`PyErr_WriteUnraisable` now creates a traceback object @@ -22423,7 +23264,7 @@ Library - bpo-29262: Add ``get_origin()`` and ``get_args()`` introspection helpers to ``typing`` module. -- bpo-12639: :meth:`msilib.Directory.start_component()` no longer fails if +- bpo-12639: :meth:`msilib.Directory.start_component` no longer fails if *keyfile* is not ``None``. - bpo-36999: Add the ``asyncio.Task.get_coro()`` method to publicly expose @@ -22444,8 +23285,8 @@ Library - bpo-33725: On macOS, the :mod:`multiprocessing` module now uses *spawn* start method by default. -- bpo-37054: Fix destructor :class:`_pyio.BytesIO` and - :class:`_pyio.TextIOWrapper`: initialize their ``_buffer`` attribute as +- bpo-37054: Fix destructor :class:`!_pyio.BytesIO` and + :class:`!_pyio.TextIOWrapper`: initialize their ``_buffer`` attribute as soon as possible (in the class body), because it's used by ``__del__()`` which calls ``close()``. @@ -22714,7 +23555,7 @@ Library - bpo-35125: Asyncio: Remove inner callback on outer cancellation in shield -- bpo-35721: Fix :meth:`asyncio.SelectorEventLoop.subprocess_exec()` leaks +- bpo-35721: Fix :meth:`asyncio.SelectorEventLoop.subprocess_exec` leaks file descriptors if ``Popen`` fails and called with ``stdin=subprocess.PIPE``. Patch by Niklas Fiekas. @@ -23224,8 +24065,8 @@ Library - bpo-17396: :mod:`modulefinder` no longer crashes when encountering syntax errors in followed imports. Patch by Brandt Bucher. -- bpo-35934: Added :meth:`~socket.create_server()` and - :meth:`~socket.has_dualstack_ipv6()` convenience functions to automate the +- bpo-35934: Added :meth:`~socket.create_server` and + :meth:`~socket.has_dualstack_ipv6` convenience functions to automate the necessary tasks usually involved when creating a server socket, including accepting both IPv4 and IPv6 connections on the same socket. (Contributed by Giampaolo Rodola in :issue:`17561`.) @@ -23322,7 +24163,7 @@ Tests - bpo-32424: Fix typo in test_cyclic_gc() test for xml.etree.ElementTree. Patch by Gordon P. Hemsley. -- bpo-36635: Add a new :mod:`_testinternalcapi` module to test the internal +- bpo-36635: Add a new :mod:`!_testinternalcapi` module to test the internal C API. - bpo-36629: Fix ``test_imap4_host_default_value()`` of ``test_imaplib``: @@ -23509,7 +24350,7 @@ C API 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``. + :c:func:`!_Py_PreInitialize` API with ``_PyPreConfig``. - bpo-36025: Fixed an accidental change to the datetime C API where the arguments to the :c:func:`PyDate_FromTimestamp` function were incorrectly @@ -23923,7 +24764,7 @@ Library treats the mean and standard deviation of measurement data as single entity. -- bpo-35904: Added statistics.fmean() as a faster, floating point variant of +- bpo-35904: Added statistics.fmean() as a faster, floating-point variant of the existing mean() function. - bpo-35918: Removed broken ``has_key`` method from @@ -24145,7 +24986,7 @@ Core and Builtins test_faulthandler. - bpo-35560: Fix an assertion error in :func:`format` in debug build for - floating point formatting with "n" format, zero padding and small width. + floating-point formatting with "n" format, zero padding and small width. Release build is not impacted. Patch by Karthikeyan Singaravelan. - bpo-35552: Format characters ``%s`` and ``%V`` in @@ -24284,7 +25125,7 @@ Core and Builtins - bpo-30156: The C function ``property_descr_get()`` uses a "cached" tuple to optimize function calls. But this tuple can be discovered in debug mode - with :func:`sys.getobjects()`. Remove the optimization, it's not really + with :func:`sys.getobjects`. Remove the optimization, it's not really worth it and it causes 3 different crashes last years. - bpo-34762: Fix contextvars C API to use PyObject* pointer types. @@ -24924,7 +25765,7 @@ Library connection on non-Windows systems. - bpo-35062: Fix incorrect parsing of - :class:`_io.IncrementalNewlineDecoder`'s *translate* argument. + :class:`io.IncrementalNewlineDecoder`'s *translate* argument. - bpo-35065: Remove ``StreamReaderProtocol._untrack_reader``. The call to ``_untrack_reader`` is currently performed too soon, causing the protocol @@ -25038,9 +25879,9 @@ Library and also to add support by default for *wss*, the secure websocket protocol. -- bpo-34922: Fixed integer overflow in the :meth:`~hashlib.shake.digest()` - and :meth:`~hashlib.shake.hexdigest()` methods for the SHAKE algorithm in - the :mod:`hashlib` module. +- bpo-34922: Fixed integer overflow in the :meth:`~hashlib.shake.digest` and + :meth:`~hashlib.shake.hexdigest` methods for the SHAKE algorithm in the + :mod:`hashlib` module. - bpo-34925: 25% speedup in argument parsing for the functions in the bisect module. @@ -25162,10 +26003,10 @@ Library - bpo-34636: Speed up re scanning of many non-matching characters for \s \w and \d within bytes objects. (microoptimization) -- bpo-24412: Add :func:`~unittest.addModuleCleanup()` and - :meth:`~unittest.TestCase.addClassCleanup()` to unittest to support - cleanups for :func:`~unittest.setUpModule()` and - :meth:`~unittest.TestCase.setUpClass()`. Patch by Lisa Roach. +- bpo-24412: Add :func:`~unittest.addModuleCleanup` and + :meth:`~unittest.TestCase.addClassCleanup` to unittest to support cleanups + for :func:`~unittest.setUpModule` and + :meth:`~unittest.TestCase.setUpClass`. Patch by Lisa Roach. - bpo-34630: Don't log SSL certificate errors in asyncio code (connection error logging is skipped already). @@ -25246,8 +26087,8 @@ Library ``trace.cover`` file. - bpo-34441: Fix crash when an ``ABC``-derived class with invalid - ``__subclasses__`` is passed as the second argument to - :func:`issubclass()`. Patch by Alexey Izbyshev. + ``__subclasses__`` is passed as the second argument to :func:`issubclass`. + Patch by Alexey Izbyshev. - bpo-34427: Fix infinite loop in ``a.extend(a)`` for ``MutableSequence`` subclasses. @@ -25317,7 +26158,7 @@ Library Wright. - bpo-34270: The default asyncio task class now always has a name which can - be get or set using two new methods (:meth:`~asyncio.Task.get_name()` and + be get or set using two new methods (:meth:`~asyncio.Task.get_name` and :meth:`~asyncio.Task.set_name`) and is visible in the :func:`repr` output. An initial name can also be set using the new ``name`` keyword argument to :func:`asyncio.create_task` or the @@ -25488,12 +26329,12 @@ Library :func:`~os.path.exists`, :func:`~os.path.lexists`, :func:`~os.path.isdir`, :func:`~os.path.isfile`, :func:`~os.path.islink`, and :func:`~os.path.ismount`, and :mod:`pathlib.Path` methods that return a - boolean result like :meth:`~pathlib.Path.exists()`, - :meth:`~pathlib.Path.is_dir()`, :meth:`~pathlib.Path.is_file()`, - :meth:`~pathlib.Path.is_mount()`, :meth:`~pathlib.Path.is_symlink()`, - :meth:`~pathlib.Path.is_block_device()`, - :meth:`~pathlib.Path.is_char_device()`, :meth:`~pathlib.Path.is_fifo()`, - :meth:`~pathlib.Path.is_socket()` now return ``False`` instead of raising + boolean result like :meth:`~pathlib.Path.exists`, + :meth:`~pathlib.Path.is_dir`, :meth:`~pathlib.Path.is_file`, + :meth:`~pathlib.Path.is_mount`, :meth:`~pathlib.Path.is_symlink`, + :meth:`~pathlib.Path.is_block_device`, + :meth:`~pathlib.Path.is_char_device`, :meth:`~pathlib.Path.is_fifo`, + :meth:`~pathlib.Path.is_socket` now return ``False`` instead of raising :exc:`ValueError` or its subclasses :exc:`UnicodeEncodeError` and :exc:`UnicodeDecodeError` for paths that contain characters or bytes unrepresentable at the OS level. @@ -25860,7 +26701,7 @@ Library Python 3.0. - bpo-20104: Improved error handling and fixed a reference leak in - :func:`os.posix_spawn()`. + :func:`os.posix_spawn`. - bpo-33106: Deleting a key from a read-only dbm database raises module specific error instead of KeyError. @@ -26057,7 +26898,7 @@ Library - bpo-32792: collections.ChainMap() preserves the order of the underlying mappings. -- bpo-32775: :func:`fnmatch.translate()` no longer produces patterns which +- bpo-32775: :func:`fnmatch.translate` no longer produces patterns which contain set operations. Sets starting with '[' or containing '--', '&&', '~~' or '||' will be interpreted differently in regular expressions in future versions. Currently they emit warnings. fnmatch.translate() now @@ -26761,7 +27602,7 @@ macOS - bpo-32901: Update macOS 10.9+ installer to Tcl/Tk 8.6.8. -- bpo-31903: In :mod:`_scproxy`, drop the GIL when calling into +- bpo-31903: In :mod:`!_scproxy`, drop the GIL when calling into ``SystemConfiguration`` to avoid deadlocks. IDLE @@ -27491,7 +28332,7 @@ Library :func:`pickle.Pickler.dump`. - bpo-20104: Improved error handling and fixed a reference leak in - :func:`os.posix_spawn()`. + :func:`os.posix_spawn`. - bpo-33175: In dataclasses, Field.__set_name__ now looks up the __set_name__ special method on the class, not the instance, of the default @@ -27911,7 +28752,7 @@ Library - bpo-32792: collections.ChainMap() preserves the order of the underlying mappings. -- bpo-32775: :func:`fnmatch.translate()` no longer produces patterns which +- bpo-32775: :func:`fnmatch.translate` no longer produces patterns which contain set operations. Sets starting with '[' or containing '--', '&&', '~~' or '||' will be interpreted differently in regular expressions in future versions. Currently they emit warnings. fnmatch.translate() now @@ -28257,8 +29098,8 @@ Library - bpo-32248: Add :mod:`importlib.resources` and :class:`importlib.abc.ResourceReader` as the unified API for reading resources contained within packages. Loaders wishing to support resource - reading must implement the :meth:`get_resource_reader()` method. - File-based and zipimport-based loaders both implement these APIs. + reading must implement the :meth:`get_resource_reader` method. File-based + and zipimport-based loaders both implement these APIs. :class:`importlib.abc.ResourceLoader` is deprecated in favor of these new APIs. @@ -28525,8 +29366,8 @@ Library coroutines. Affected functions: loop.sock_sendall, loop.sock_recv, loop.sock_accept, loop.getaddrinfo, loop.getnameinfo. -- bpo-32323: :func:`urllib.parse.urlsplit()` does not convert zone-id - (scope) to lower case for scoped IPv6 addresses in hostnames now. +- bpo-32323: :func:`urllib.parse.urlsplit` does not convert zone-id (scope) + to lower case for scoped IPv6 addresses in hostnames now. - bpo-32302: Fix bdist_wininst of distutils for CRT v142: it binary compatible with CRT v140. @@ -28534,7 +29375,7 @@ Library - bpo-29711: Fix ``stop_serving`` in asyncio proactor loop kill all listening servers -- bpo-32308: :func:`re.sub()` now replaces empty matches adjacent to a +- bpo-32308: :func:`re.sub` now replaces empty matches adjacent to a previous non-empty match. - bpo-29970: Abort asyncio SSLProtocol connection if handshake not complete @@ -32147,8 +32988,8 @@ Library - bpo-32185: The SSL module no longer sends IP addresses in SNI TLS extension on platforms with OpenSSL 1.0.2+ or inet_pton. -- bpo-32323: :func:`urllib.parse.urlsplit()` does not convert zone-id - (scope) to lower case for scoped IPv6 addresses in hostnames now. +- bpo-32323: :func:`urllib.parse.urlsplit` does not convert zone-id (scope) + to lower case for scoped IPv6 addresses in hostnames now. - bpo-32302: Fix bdist_wininst of distutils for CRT v142: it binary compatible with CRT v140. @@ -36283,9 +37124,9 @@ Library exception handler to dump the traceback of all Python threads on any Windows exception, not only on UNIX signals (SIGSEGV, SIGFPE, SIGABRT). -- bpo-26530: Add C functions :c:func:`_PyTraceMalloc_Track` and - :c:func:`_PyTraceMalloc_Untrack` to track memory blocks using the - :mod:`tracemalloc` module. Add :c:func:`_PyTraceMalloc_GetTraceback` to +- bpo-26530: Add C functions :c:func:`!_PyTraceMalloc_Track` and + :c:func:`!_PyTraceMalloc_Untrack` to track memory blocks using the + :mod:`tracemalloc` module. Add :c:func:`!_PyTraceMalloc_GetTraceback` to get the traceback of an object. - bpo-26588: The _tracemalloc now supports tracing memory allocations of @@ -41823,8 +42664,8 @@ Library - bpo-21402: tkinter.ttk now works when default root window is not set. -- bpo-3015: _tkinter.create() now creates tkapp object with wantobject=1 by - default. +- bpo-3015: ``_tkinter.create()`` now creates ``tkapp`` object with + ``wantobjects=1`` by default. - bpo-10203: sqlite3.Row now truly supports sequence protocol. In particular it supports reverse() and negative indices. Original patch by @@ -42471,7 +43312,7 @@ Tests regrtest.py. - bpo-21634: Fix pystone micro-benchmark: use floor division instead of true - division to benchmark integers instead of floating point numbers. Set + division to benchmark integers instead of floating-point numbers. Set pystone version to 1.2. Patch written by Lennart Regebro. - bpo-21605: Added tests for Tkinter images. diff --git a/Misc/coverity_model.c b/Misc/coverity_model.c index 8960362a..90c72c7b 100644 --- a/Misc/coverity_model.c +++ b/Misc/coverity_model.c @@ -74,7 +74,7 @@ PyObject *PyLong_FromSsize_t(Py_ssize_t ival) /* tainted sinks * - * Coverity considers argv, environ, read() data etc as tained. + * Coverity considers argv, environ, read() data etc as tainted. */ PyObject *PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename) diff --git a/Misc/externals.spdx.json b/Misc/externals.spdx.json index e905c2b9..4219cd4f 100644 --- a/Misc/externals.spdx.json +++ b/Misc/externals.spdx.json @@ -48,21 +48,21 @@ "checksums": [ { "algorithm": "SHA256", - "checksumValue": "e6a77c273ebb284fedd8ea19b081fce74a9455936ffd47215f7c24713e2614b2" + "checksumValue": "1550c87996a0858474a9dd179deab2c55eb73726b9a140b32865b02fd3d8a86b" } ], - "downloadLocation": "https://github.com/python/cpython-source-deps/archive/refs/tags/openssl-3.0.13.tar.gz", + "downloadLocation": "https://github.com/python/cpython-source-deps/archive/refs/tags/openssl-3.0.15.tar.gz", "externalRefs": [ { "referenceCategory": "SECURITY", - "referenceLocator": "cpe:2.3:a:openssl:openssl:3.0.13:*:*:*:*:*:*:*", + "referenceLocator": "cpe:2.3:a:openssl:openssl:3.0.15:*:*:*:*:*:*:*", "referenceType": "cpe23Type" } ], "licenseConcluded": "NOASSERTION", "name": "openssl", "primaryPackagePurpose": "SOURCE", - "versionInfo": "3.0.13" + "versionInfo": "3.0.15" }, { "SPDXID": "SPDXRef-PACKAGE-sqlite", @@ -90,42 +90,42 @@ "checksums": [ { "algorithm": "SHA256", - "checksumValue": "6e33a88f116822167734cd72b693b5d30ced130a3cae6dc2ff696042f993bb42" + "checksumValue": "4c23f0dd3efcbe6f3a22c503a68d147617bb30c4f5290f1eb3eaacf0b460440b" } ], - "downloadLocation": "https://github.com/python/cpython-source-deps/archive/refs/tags/tcl-core-8.6.13.0.tar.gz", + "downloadLocation": "https://github.com/python/cpython-source-deps/archive/refs/tags/tcl-core-8.6.15.0.tar.gz", "externalRefs": [ { "referenceCategory": "SECURITY", - "referenceLocator": "cpe:2.3:a:tcl_tk:tcl_tk:8.6.13.0:*:*:*:*:*:*:*", + "referenceLocator": "cpe:2.3:a:tcl_tk:tcl_tk:8.6.15.0:*:*:*:*:*:*:*", "referenceType": "cpe23Type" } ], "licenseConcluded": "NOASSERTION", "name": "tcl-core", "primaryPackagePurpose": "SOURCE", - "versionInfo": "8.6.13.0" + "versionInfo": "8.6.15.0" }, { "SPDXID": "SPDXRef-PACKAGE-tk", "checksums": [ { "algorithm": "SHA256", - "checksumValue": "896c1f488bdd0159091bd5cce124b756dfdffa4a5350b7fd4d7d8e48421089a4" + "checksumValue": "0ae56d39bca92865f338529557a1e56d110594184b6dc5a91339c5675751e264" } ], - "downloadLocation": "https://github.com/python/cpython-source-deps/archive/refs/tags/tk-8.6.13.0.tar.gz", + "downloadLocation": "https://github.com/python/cpython-source-deps/archive/refs/tags/tk-8.6.15.0.tar.gz", "externalRefs": [ { "referenceCategory": "SECURITY", - "referenceLocator": "cpe:2.3:a:tcl_tk:tcl_tk:8.6.13.0:*:*:*:*:*:*:*", + "referenceLocator": "cpe:2.3:a:tcl_tk:tcl_tk:8.6.15.0:*:*:*:*:*:*:*", "referenceType": "cpe23Type" } ], "licenseConcluded": "NOASSERTION", "name": "tk", "primaryPackagePurpose": "SOURCE", - "versionInfo": "8.6.13.0" + "versionInfo": "8.6.15.0" }, { "SPDXID": "SPDXRef-PACKAGE-tix", diff --git a/Misc/python.man b/Misc/python.man index 9f89c94a..abb065cd 100644 --- a/Misc/python.man +++ b/Misc/python.man @@ -251,6 +251,7 @@ emitted by a process (even those that are otherwise ignored by default): -Wdefault # Warn once per call location -Werror # Convert to exceptions -Walways # Warn every time + -Wall # Same as -Walways -Wmodule # Warn once per calling module -Wonce # Warn once per Python process -Wignore # Never warn diff --git a/Misc/sbom.spdx.json b/Misc/sbom.spdx.json index 49b25ff7..eb13ecff 100644 --- a/Misc/sbom.spdx.json +++ b/Misc/sbom.spdx.json @@ -48,11 +48,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "4076a884f0ca96873589b5c8159e2e5bfb8b829a" + "checksumValue": "373cc00d87782a736970644d863ff2ebbd0e4886" }, { "algorithm": "SHA256", - "checksumValue": "1a434bf3d2f9fb8a0b5adb79201a942788d11824c3e5b46a0b9962c0c482016c" + "checksumValue": "0f750bc336e510d14ac9a3e63fc2399f60f3f04f0061c426e86751ed5fba90e4" } ], "fileName": "Modules/expat/expat.h" @@ -62,11 +62,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "b70ce53fdc25ae482681ae2f6623c3c8edc9c1b7" + "checksumValue": "9e615c6e5c3ba00670f674a6b071bb855b0b563d" }, { "algorithm": "SHA256", - "checksumValue": "86afb425ec9999eb4f1ec9ab2fb41c58c4aa5cb9bf934b8c94264670fc5a961d" + "checksumValue": "3d90a4b65c40a3f848c36100f4d73b933a015c7b7cd85c28e4331a6b845c1ad0" } ], "fileName": "Modules/expat/expat_external.h" @@ -128,29 +128,29 @@ "fileName": "Modules/expat/nametab.h" }, { - "SPDXID": "SPDXRef-FILE-Modules-expat-pyexpatns.h", + "SPDXID": "SPDXRef-FILE-Modules-expat-refresh.sh", "checksums": [ { "algorithm": "SHA1", - "checksumValue": "f50c899172acd93fc539007bfb43315b83d407e4" + "checksumValue": "a9b0a33b8359cfe94b23972a1605daf8dcc605d9" }, { "algorithm": "SHA256", - "checksumValue": "d571b8258cfaa067a20adef553e5fcedd6671ca4a8841483496de031bd904567" + "checksumValue": "19eb541460bc2ca8b87118acd3c048f6af77affbf8719ac29aa7b6c8d70f83fd" } ], - "fileName": "Modules/expat/pyexpatns.h" + "fileName": "Modules/expat/refresh.sh" }, { "SPDXID": "SPDXRef-FILE-Modules-expat-siphash.h", "checksums": [ { "algorithm": "SHA1", - "checksumValue": "4c49b5df2bc702f663ba3b5a52d1940ec363226b" + "checksumValue": "aca27f46d9fd387b63ce7ff2e4f172cad130b39b" }, { "algorithm": "SHA256", - "checksumValue": "b5ec29f6560acc183f1ee8ab92bb3aea17b87b4c2120cd2e3f78deba7a12491e" + "checksumValue": "f537add526ecda8389503b7ef45fb52b6217e4dc171dcc3a8dc6903ff6134726" } ], "fileName": "Modules/expat/siphash.h" @@ -188,11 +188,11 @@ "checksums": [ { "algorithm": "SHA1", - "checksumValue": "fed1311be8577491b7f63085a27014eabf2caec8" + "checksumValue": "3199fbd38b6fb158f73d5c8de6b6e6e3812ef803" }, { "algorithm": "SHA256", - "checksumValue": "3dc233eca5fa1bb7387c503f8a12d840707e4374b229e05d5657db9645725040" + "checksumValue": "c1518244dd5ea397e345d00e12cc45d42f43453ed208218559c981c97a0583e2" } ], "fileName": "Modules/expat/xmlparse.c" @@ -1562,14 +1562,14 @@ "checksums": [ { "algorithm": "SHA256", - "checksumValue": "d4cf38d26e21a56654ffe4acd9cd5481164619626802328506a2869afab29ab3" + "checksumValue": "17aa6cfc5c4c219c09287abfc10bc13f0c06f30bb654b28bfe6f567ca646eb79" } ], - "downloadLocation": "https://github.com/libexpat/libexpat/releases/download/R_2_6_2/expat-2.6.2.tar.gz", + "downloadLocation": "https://github.com/libexpat/libexpat/releases/download/R_2_6_3/expat-2.6.3.tar.gz", "externalRefs": [ { "referenceCategory": "SECURITY", - "referenceLocator": "cpe:2.3:a:libexpat_project:libexpat:2.6.2:*:*:*:*:*:*:*", + "referenceLocator": "cpe:2.3:a:libexpat_project:libexpat:2.6.3:*:*:*:*:*:*:*", "referenceType": "cpe23Type" } ], @@ -1577,7 +1577,7 @@ "name": "expat", "originator": "Organization: Expat development team", "primaryPackagePurpose": "SOURCE", - "versionInfo": "2.6.2" + "versionInfo": "2.6.3" }, { "SPDXID": "SPDXRef-PACKAGE-hacl-star", @@ -1715,7 +1715,7 @@ "spdxElementId": "SPDXRef-PACKAGE-expat" }, { - "relatedSpdxElement": "SPDXRef-FILE-Modules-expat-pyexpatns.h", + "relatedSpdxElement": "SPDXRef-FILE-Modules-expat-refresh.sh", "relationshipType": "CONTAINS", "spdxElementId": "SPDXRef-PACKAGE-expat" }, diff --git a/Misc/valgrind-python.supp b/Misc/valgrind-python.supp index c9c45ba7..f5e39d6f 100644 --- a/Misc/valgrind-python.supp +++ b/Misc/valgrind-python.supp @@ -103,6 +103,49 @@ fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING } +# +# Leaks: dlopen() called without dlclose() +# + +{ + dlopen() called without dlclose() + Memcheck:Leak + fun:malloc + fun:malloc + fun:strdup + fun:_dl_load_cache_lookup +} +{ + dlopen() called without dlclose() + Memcheck:Leak + fun:malloc + fun:malloc + fun:strdup + fun:_dl_map_object +} +{ + dlopen() called without dlclose() + Memcheck:Leak + fun:malloc + fun:* + fun:_dl_new_object +} +{ + dlopen() called without dlclose() + Memcheck:Leak + fun:calloc + fun:* + fun:_dl_new_object +} +{ + dlopen() called without dlclose() + Memcheck:Leak + fun:calloc + fun:* + fun:_dl_check_map_versions +} + + # # Non-python specific leaks # diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index 05e79915..2356b708 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -430,18 +430,22 @@ future_ensure_alive(FutureObj *fut) static int future_schedule_callbacks(asyncio_state *state, FutureObj *fut) { - Py_ssize_t len; - Py_ssize_t i; - if (fut->fut_callback0 != NULL) { /* There's a 1st callback */ - int ret = call_soon(state, - fut->fut_loop, fut->fut_callback0, - (PyObject *)fut, fut->fut_context0); - - Py_CLEAR(fut->fut_callback0); - Py_CLEAR(fut->fut_context0); + // Beware: An evil call_soon could alter fut_callback0 or fut_context0. + // Since we are anyway clearing them after the call, whether call_soon + // succeeds or not, the idea is to transfer ownership so that external + // code is not able to alter them during the call. + PyObject *fut_callback0 = fut->fut_callback0; + fut->fut_callback0 = NULL; + PyObject *fut_context0 = fut->fut_context0; + fut->fut_context0 = NULL; + + int ret = call_soon(state, fut->fut_loop, fut_callback0, + (PyObject *)fut, fut_context0); + Py_CLEAR(fut_callback0); + Py_CLEAR(fut_context0); if (ret) { /* If an error occurs in pure-Python implementation, all callbacks are cleared. */ @@ -458,27 +462,25 @@ future_schedule_callbacks(asyncio_state *state, FutureObj *fut) return 0; } - len = PyList_GET_SIZE(fut->fut_callbacks); - if (len == 0) { - /* The list of callbacks was empty; clear it and return. */ - Py_CLEAR(fut->fut_callbacks); - return 0; - } - - for (i = 0; i < len; i++) { - PyObject *cb_tup = PyList_GET_ITEM(fut->fut_callbacks, i); + // Beware: An evil call_soon could change fut->fut_callbacks. + // The idea is to transfer the ownership of the callbacks list + // so that external code is not able to mutate the list during + // the iteration. + PyObject *callbacks = fut->fut_callbacks; + fut->fut_callbacks = NULL; + Py_ssize_t n = PyList_GET_SIZE(callbacks); + for (Py_ssize_t i = 0; i < n; i++) { + assert(PyList_GET_SIZE(callbacks) == n); + PyObject *cb_tup = PyList_GET_ITEM(callbacks, i); PyObject *cb = PyTuple_GET_ITEM(cb_tup, 0); PyObject *ctx = PyTuple_GET_ITEM(cb_tup, 1); if (call_soon(state, fut->fut_loop, cb, (PyObject *)fut, ctx)) { - /* If an error occurs in pure-Python implementation, - all callbacks are cleared. */ - Py_CLEAR(fut->fut_callbacks); + Py_DECREF(callbacks); return -1; } } - - Py_CLEAR(fut->fut_callbacks); + Py_DECREF(callbacks); return 0; } @@ -594,12 +596,27 @@ future_set_exception(asyncio_state *state, FutureObj *fut, PyObject *exc) PyErr_SetString(PyExc_TypeError, "invalid exception object"); return NULL; } - if (Py_IS_TYPE(exc_val, (PyTypeObject *)PyExc_StopIteration)) { + if (PyErr_GivenExceptionMatches(exc_val, PyExc_StopIteration)) { + const char *msg = "StopIteration interacts badly with " + "generators and cannot be raised into a " + "Future"; + PyObject *message = PyUnicode_FromString(msg); + if (message == NULL) { + Py_DECREF(exc_val); + return NULL; + } + PyObject *err = PyObject_CallOneArg(PyExc_RuntimeError, message); + Py_DECREF(message); + if (err == NULL) { + Py_DECREF(exc_val); + return NULL; + } + assert(PyExceptionInstance_Check(err)); + + PyException_SetCause(err, Py_NewRef(exc_val)); + PyException_SetContext(err, Py_NewRef(exc_val)); Py_DECREF(exc_val); - PyErr_SetString(PyExc_TypeError, - "StopIteration interacts badly with generators " - "and cannot be raised into a Future"); - return NULL; + exc_val = err; } assert(!fut->fut_exception); @@ -1027,7 +1044,12 @@ _asyncio_Future_remove_done_callback_impl(FutureObj *self, PyTypeObject *cls, ENSURE_FUTURE_ALIVE(state, self) if (self->fut_callback0 != NULL) { - int cmp = PyObject_RichCompareBool(self->fut_callback0, fn, Py_EQ); + // Beware: An evil PyObject_RichCompareBool could free fut_callback0 + // before a recursive call is made with that same arg. For details, see + // https://github.com/python/cpython/pull/125967#discussion_r1816593340. + PyObject *fut_callback0 = Py_NewRef(self->fut_callback0); + int cmp = PyObject_RichCompareBool(fut_callback0, fn, Py_EQ); + Py_DECREF(fut_callback0); if (cmp == -1) { return NULL; } @@ -1051,8 +1073,10 @@ _asyncio_Future_remove_done_callback_impl(FutureObj *self, PyTypeObject *cls, if (len == 1) { PyObject *cb_tup = PyList_GET_ITEM(self->fut_callbacks, 0); + Py_INCREF(cb_tup); int cmp = PyObject_RichCompareBool( PyTuple_GET_ITEM(cb_tup, 0), fn, Py_EQ); + Py_DECREF(cb_tup); if (cmp == -1) { return NULL; } @@ -1275,52 +1299,49 @@ static PyObject * FutureObj_get_callbacks(FutureObj *fut, void *Py_UNUSED(ignored)) { asyncio_state *state = get_asyncio_state_by_def((PyObject *)fut); - Py_ssize_t i; - ENSURE_FUTURE_ALIVE(state, fut) - if (fut->fut_callback0 == NULL) { - if (fut->fut_callbacks == NULL) { - Py_RETURN_NONE; - } - - return Py_NewRef(fut->fut_callbacks); + Py_ssize_t len = 0; + if (fut->fut_callback0 != NULL) { + len++; } - - Py_ssize_t len = 1; if (fut->fut_callbacks != NULL) { len += PyList_GET_SIZE(fut->fut_callbacks); } - - PyObject *new_list = PyList_New(len); - if (new_list == NULL) { - return NULL; + if (len == 0) { + Py_RETURN_NONE; } - PyObject *tup0 = PyTuple_New(2); - if (tup0 == NULL) { - Py_DECREF(new_list); + PyObject *callbacks = PyList_New(len); + if (callbacks == NULL) { return NULL; } - Py_INCREF(fut->fut_callback0); - PyTuple_SET_ITEM(tup0, 0, fut->fut_callback0); - assert(fut->fut_context0 != NULL); - Py_INCREF(fut->fut_context0); - PyTuple_SET_ITEM(tup0, 1, (PyObject *)fut->fut_context0); - - PyList_SET_ITEM(new_list, 0, tup0); + Py_ssize_t i = 0; + if (fut->fut_callback0 != NULL) { + PyObject *tup0 = PyTuple_New(2); + if (tup0 == NULL) { + Py_DECREF(callbacks); + return NULL; + } + PyTuple_SET_ITEM(tup0, 0, Py_NewRef(fut->fut_callback0)); + assert(fut->fut_context0 != NULL); + PyTuple_SET_ITEM(tup0, 1, Py_NewRef(fut->fut_context0)); + PyList_SET_ITEM(callbacks, i, tup0); + i++; + } if (fut->fut_callbacks != NULL) { - for (i = 0; i < PyList_GET_SIZE(fut->fut_callbacks); i++) { - PyObject *cb = PyList_GET_ITEM(fut->fut_callbacks, i); + for (Py_ssize_t j = 0; j < PyList_GET_SIZE(fut->fut_callbacks); j++) { + PyObject *cb = PyList_GET_ITEM(fut->fut_callbacks, j); Py_INCREF(cb); - PyList_SET_ITEM(new_list, i + 1, cb); + PyList_SET_ITEM(callbacks, i, cb); + i++; } } - return new_list; + return callbacks; } static PyObject * @@ -2124,7 +2145,7 @@ _asyncio_Task___init___impl(TaskObj *self, PyObject *coro, PyObject *loop, return -1; } } else { - self->task_context = Py_NewRef(context); + Py_XSETREF(self->task_context, Py_NewRef(context)); } Py_CLEAR(self->task_fut_waiter); @@ -2509,7 +2530,11 @@ static PyObject * _asyncio_Task_get_coro_impl(TaskObj *self) /*[clinic end generated code: output=bcac27c8cc6c8073 input=d2e8606c42a7b403]*/ { - return Py_NewRef(self->task_coro); + if (self->task_coro) { + return Py_NewRef(self->task_coro); + } + + Py_RETURN_NONE; } /*[clinic input] @@ -2728,7 +2753,11 @@ task_call_step_soon(asyncio_state *state, TaskObj *task, PyObject *arg) return -1; } - int ret = call_soon(state, task->task_loop, cb, NULL, task->task_context); + // Beware: An evil call_soon could alter task_context. + // See: https://github.com/python/cpython/issues/126080. + PyObject *task_context = Py_NewRef(task->task_context); + int ret = call_soon(state, task->task_loop, cb, NULL, task_context); + Py_DECREF(task_context); Py_DECREF(cb); return ret; } @@ -2967,8 +2996,17 @@ task_step_handle_result_impl(asyncio_state *state, TaskObj *task, PyObject *resu if (task->task_must_cancel) { PyObject *r; int is_true; + + // Beware: An evil `__getattribute__` could + // prematurely delete task->task_cancel_msg before the + // task is cancelled, thereby causing a UAF crash. + // + // See https://github.com/python/cpython/issues/126138 + PyObject *task_cancel_msg = Py_NewRef(task->task_cancel_msg); r = PyObject_CallMethodOneArg(result, &_Py_ID(cancel), - task->task_cancel_msg); + task_cancel_msg); + Py_DECREF(task_cancel_msg); + if (r == NULL) { return NULL; } @@ -3060,8 +3098,17 @@ task_step_handle_result_impl(asyncio_state *state, TaskObj *task, PyObject *resu if (task->task_must_cancel) { PyObject *r; int is_true; + + // Beware: An evil `__getattribute__` could + // prematurely delete task->task_cancel_msg before the + // task is cancelled, thereby causing a UAF crash. + // + // See https://github.com/python/cpython/issues/126138 + PyObject *task_cancel_msg = Py_NewRef(task->task_cancel_msg); r = PyObject_CallMethodOneArg(result, &_Py_ID(cancel), - task->task_cancel_msg); + task_cancel_msg); + Py_DECREF(task_cancel_msg); + if (r == NULL) { return NULL; } @@ -3602,14 +3649,6 @@ module_traverse(PyObject *mod, visitproc visit, void *arg) Py_VISIT(state->iscoroutine_typecache); Py_VISIT(state->context_kwname); - - // Visit freelist. - PyObject *next = (PyObject*) state->fi_freelist; - while (next != NULL) { - PyObject *current = next; - Py_VISIT(current); - next = (PyObject*) ((futureiterobject*) current)->future; - } return 0; } diff --git a/Modules/_bisectmodule.c b/Modules/_bisectmodule.c index 0773bbd1..d79946c8 100644 --- a/Modules/_bisectmodule.c +++ b/Modules/_bisectmodule.c @@ -66,7 +66,7 @@ internal_bisect_right(PyObject *list, PyObject *item, Py_ssize_t lo, Py_ssize_t if (sq_item == NULL) { return -1; } - if (Py_EnterRecursiveCall("in _bisect.bisect_right")) { + if (Py_EnterRecursiveCall(" in _bisect.bisect_right")) { return -1; } PyTypeObject *tp = Py_TYPE(item); @@ -250,7 +250,7 @@ internal_bisect_left(PyObject *list, PyObject *item, Py_ssize_t lo, Py_ssize_t h if (sq_item == NULL) { return -1; } - if (Py_EnterRecursiveCall("in _bisect.bisect_left")) { + if (Py_EnterRecursiveCall(" in _bisect.bisect_left")) { return -1; } PyTypeObject *tp = Py_TYPE(item); diff --git a/Modules/_csv.c b/Modules/_csv.c index d63eac1b..9a7b7d27 100644 --- a/Modules/_csv.c +++ b/Modules/_csv.c @@ -701,6 +701,8 @@ parse_process_char(ReaderObj *self, _csvstate *module_state, Py_UCS4 c) } else if (c == dialect->escapechar) { /* possible escaped character */ + if (dialect->quoting == QUOTE_NONNUMERIC) + self->numeric_field = 1; self->state = ESCAPED_CHAR; } else if (c == ' ' && dialect->skipinitialspace) diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index c5157560..b6d45e92 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -2164,9 +2164,15 @@ PyCSimpleType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) Py_DECREF(result); return NULL; } - x = PyDict_SetItemString(result->tp_dict, - ml->ml_name, - meth); + PyObject *name = PyUnicode_FromString(ml->ml_name); + if (name == NULL) { + Py_DECREF(meth); + Py_DECREF(result); + return NULL; + } + PyUnicode_InternInPlace(&name); + x = PyDict_SetItem(result->tp_dict, name, meth); + Py_DECREF(name); Py_DECREF(meth); if (x == -1) { Py_DECREF(result); @@ -2263,7 +2269,7 @@ PyCSimpleType_from_param(PyObject *type, PyObject *value) return NULL; } if (as_parameter) { - if (_Py_EnterRecursiveCall("while processing _as_parameter_")) { + if (_Py_EnterRecursiveCall(" while processing _as_parameter_")) { Py_DECREF(as_parameter); Py_XDECREF(exc); return NULL; diff --git a/Modules/_ctypes/_ctypes_test.c b/Modules/_ctypes/_ctypes_test.c index 39157865..5788b53b 100644 --- a/Modules/_ctypes/_ctypes_test.c +++ b/Modules/_ctypes/_ctypes_test.c @@ -164,7 +164,7 @@ _testfunc_array_in_struct3B_set_defaults(void) /* * Test3C struct tests the MAX_STRUCT_SIZE 32. Structs containing arrays of up - * to four floating point types are passed in registers on Arm platforms. + * to four floating-point types are passed in registers on Arm platforms. * This struct is used for within bounds test on Arm platfroms and for an * out-of-bounds tests for platfroms where MAX_STRUCT_SIZE is less than 32. * See gh-110190. @@ -188,7 +188,7 @@ _testfunc_array_in_struct3C_set_defaults(void) /* * Test3D struct tests the MAX_STRUCT_SIZE 64. Structs containing arrays of up - * to eight floating point types are passed in registers on PPC64LE platforms. + * to eight floating-point types are passed in registers on PPC64LE platforms. * This struct is used for within bounds test on PPC64LE platfroms and for an * out-of-bounds tests for platfroms where MAX_STRUCT_SIZE is less than 64. * See gh-110190. diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index 743b9e37..b099959e 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -4071,9 +4071,9 @@ NoArgNoReturnFunctionBody(resetty) /*[clinic input] _curses.resizeterm - nlines: int + nlines: short Height. - ncols: int + ncols: short Width. / @@ -4084,8 +4084,8 @@ window dimensions (in particular the SIGWINCH handler). [clinic start generated code]*/ static PyObject * -_curses_resizeterm_impl(PyObject *module, int nlines, int ncols) -/*[clinic end generated code: output=56d6bcc5194ad055 input=0fca02ebad5ffa82]*/ +_curses_resizeterm_impl(PyObject *module, short nlines, short ncols) +/*[clinic end generated code: output=4de3abab50c67f02 input=414e92a63e3e9899]*/ { PyObject *result; @@ -4107,9 +4107,9 @@ _curses_resizeterm_impl(PyObject *module, int nlines, int ncols) /*[clinic input] _curses.resize_term - nlines: int + nlines: short Height. - ncols: int + ncols: short Width. / @@ -4123,8 +4123,8 @@ without additional interaction with the application. [clinic start generated code]*/ static PyObject * -_curses_resize_term_impl(PyObject *module, int nlines, int ncols) -/*[clinic end generated code: output=9e26d8b9ea311ed2 input=2197edd05b049ed4]*/ +_curses_resize_term_impl(PyObject *module, short nlines, short ncols) +/*[clinic end generated code: output=46c6d749fa291dbd input=276afa43d8ea7091]*/ { PyObject *result; diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 8552e42d..8535811a 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -1501,7 +1501,7 @@ make_somezreplacement(PyObject *object, char *sep, PyObject *tzinfoarg) PyObject *tzinfo = get_tzinfo_member(object); if (tzinfo == Py_None || tzinfo == NULL) { - return PyBytes_FromStringAndSize(NULL, 0); + return PyUnicode_FromStringAndSize(NULL, 0); } assert(tzinfoarg != NULL); @@ -1512,7 +1512,7 @@ make_somezreplacement(PyObject *object, char *sep, PyObject *tzinfoarg) tzinfoarg) < 0) return NULL; - return PyBytes_FromStringAndSize(buf, strlen(buf)); + return PyUnicode_FromString(buf); } static PyObject * @@ -1569,7 +1569,7 @@ make_freplacement(PyObject *object) else sprintf(freplacement, "%06d", 0); - return PyBytes_FromStringAndSize(freplacement, strlen(freplacement)); + return PyUnicode_FromString(freplacement); } /* I sure don't want to reproduce the strftime code from the time module, @@ -1590,79 +1590,60 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple, PyObject *Zreplacement = NULL; /* py string, replacement for %Z */ PyObject *freplacement = NULL; /* py string, replacement for %f */ - const char *pin; /* pointer to next char in input format */ - Py_ssize_t flen; /* length of input format */ - char ch; /* next char in input format */ - - PyObject *newfmt = NULL; /* py string, the output format */ - char *pnew; /* pointer to available byte in output format */ - size_t totalnew; /* number bytes total in output format buffer, - exclusive of trailing \0 */ - size_t usednew; /* number bytes used so far in output format buffer */ - - const char *ptoappend; /* ptr to string to append to output buffer */ - Py_ssize_t ntoappend; /* # of bytes to append to output buffer */ - assert(object && format && timetuple); assert(PyUnicode_Check(format)); - /* Convert the input format to a C string and size */ - pin = PyUnicode_AsUTF8AndSize(format, &flen); - if (!pin) + + PyObject *strftime = _PyImport_GetModuleAttrString("time", "strftime"); + if (strftime == NULL) { return NULL; + } /* Scan the input format, looking for %z/%Z/%f escapes, building * a new format. Since computing the replacements for those codes * is expensive, don't unless they're actually used. */ - if (flen > INT_MAX - 1) { - PyErr_NoMemory(); - goto Done; - } - totalnew = flen + 1; /* realistic if no %z/%Z */ - newfmt = PyBytes_FromStringAndSize(NULL, totalnew); - if (newfmt == NULL) goto Done; - pnew = PyBytes_AsString(newfmt); - usednew = 0; - - while ((ch = *pin++) != '\0') { - if (ch != '%') { - ptoappend = pin - 1; - ntoappend = 1; + _PyUnicodeWriter writer; + _PyUnicodeWriter_Init(&writer); + writer.overallocate = 1; + + Py_ssize_t flen = PyUnicode_GET_LENGTH(format); + Py_ssize_t i = 0; + Py_ssize_t start = 0; + Py_ssize_t end = 0; + while (i != flen) { + i = PyUnicode_FindChar(format, '%', i, flen, 1); + if (i < 0) { + assert(!PyErr_Occurred()); + break; } - else if ((ch = *pin++) == '\0') { - /* Null byte follows %, copy only '%'. - * - * Back the pin up one char so that we catch the null check - * the next time through the loop.*/ - pin--; - ptoappend = pin - 1; - ntoappend = 1; + end = i; + i++; + if (i == flen) { + break; } + Py_UCS4 ch = PyUnicode_READ_CHAR(format, i); + i++; /* A % has been seen and ch is the character after it. */ - else if (ch == 'z') { + PyObject *replacement = NULL; + if (ch == 'z') { /* %z -> +HHMM */ if (zreplacement == NULL) { zreplacement = make_somezreplacement(object, "", tzinfoarg); if (zreplacement == NULL) - goto Done; + goto Error; } - assert(zreplacement != NULL); - assert(PyBytes_Check(zreplacement)); - ptoappend = PyBytes_AS_STRING(zreplacement); - ntoappend = PyBytes_GET_SIZE(zreplacement); + replacement = zreplacement; } - else if (ch == ':' && *pin == 'z' && pin++) { + else if (ch == ':' && i < flen && PyUnicode_READ_CHAR(format, i) == 'z') { /* %:z -> +HH:MM */ + i++; if (colonzreplacement == NULL) { colonzreplacement = make_somezreplacement(object, ":", tzinfoarg); if (colonzreplacement == NULL) - goto Done; + goto Error; } - assert(colonzreplacement != NULL); - assert(PyBytes_Check(colonzreplacement)); - ptoappend = PyBytes_AS_STRING(colonzreplacement); - ntoappend = PyBytes_GET_SIZE(colonzreplacement); + replacement = colonzreplacement; } else if (ch == 'Z') { /* format tzname */ @@ -1670,79 +1651,63 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple, Zreplacement = make_Zreplacement(object, tzinfoarg); if (Zreplacement == NULL) - goto Done; + goto Error; } - assert(Zreplacement != NULL); - assert(PyUnicode_Check(Zreplacement)); - ptoappend = PyUnicode_AsUTF8AndSize(Zreplacement, - &ntoappend); - if (ptoappend == NULL) - goto Done; + replacement = Zreplacement; } else if (ch == 'f') { /* format microseconds */ if (freplacement == NULL) { freplacement = make_freplacement(object); if (freplacement == NULL) - goto Done; + goto Error; } - assert(freplacement != NULL); - assert(PyBytes_Check(freplacement)); - ptoappend = PyBytes_AS_STRING(freplacement); - ntoappend = PyBytes_GET_SIZE(freplacement); + replacement = freplacement; } else { /* percent followed by something else */ - ptoappend = pin - 2; - ntoappend = 2; - } - - /* Append the ntoappend chars starting at ptoappend to - * the new format. - */ - if (ntoappend == 0) continue; - assert(ptoappend != NULL); - assert(ntoappend > 0); - while (usednew + ntoappend > totalnew) { - if (totalnew > (PY_SSIZE_T_MAX >> 1)) { /* overflow */ - PyErr_NoMemory(); - goto Done; - } - totalnew <<= 1; - if (_PyBytes_Resize(&newfmt, totalnew) < 0) - goto Done; - pnew = PyBytes_AsString(newfmt) + usednew; } - memcpy(pnew, ptoappend, ntoappend); - pnew += ntoappend; - usednew += ntoappend; - assert(usednew <= totalnew); + assert(replacement != NULL); + assert(PyUnicode_Check(replacement)); + if (_PyUnicodeWriter_WriteSubstring(&writer, format, start, end) < 0) { + goto Error; + } + start = i; + if (_PyUnicodeWriter_WriteStr(&writer, replacement) < 0) { + goto Error; + } } /* end while() */ - if (_PyBytes_Resize(&newfmt, usednew) < 0) - goto Done; - { - PyObject *format; - PyObject *strftime = _PyImport_GetModuleAttrString("time", "strftime"); - - if (strftime == NULL) + PyObject *newformat; + if (start == 0) { + _PyUnicodeWriter_Dealloc(&writer); + newformat = Py_NewRef(format); + } + else { + if (_PyUnicodeWriter_WriteSubstring(&writer, format, start, flen) < 0) { + goto Error; + } + newformat = _PyUnicodeWriter_Finish(&writer); + if (newformat == NULL) { goto Done; - format = PyUnicode_FromString(PyBytes_AS_STRING(newfmt)); - if (format != NULL) { - result = PyObject_CallFunctionObjArgs(strftime, - format, timetuple, NULL); - Py_DECREF(format); } - Py_DECREF(strftime); } + result = PyObject_CallFunctionObjArgs(strftime, + newformat, timetuple, NULL); + Py_DECREF(newformat); + Done: Py_XDECREF(freplacement); Py_XDECREF(zreplacement); Py_XDECREF(colonzreplacement); Py_XDECREF(Zreplacement); - Py_XDECREF(newfmt); + Py_XDECREF(strftime); return result; + + Error: + _PyUnicodeWriter_Dealloc(&writer); + goto Done; } /* --------------------------------------------------------------------------- @@ -5209,19 +5174,19 @@ datetime_utcfromtimestamp(PyObject *cls, PyObject *args) static PyObject * datetime_strptime(PyObject *cls, PyObject *args) { - static PyObject *module = NULL; - PyObject *string, *format; + PyObject *string, *format, *result; if (!PyArg_ParseTuple(args, "UU:strptime", &string, &format)) return NULL; + PyObject *module = PyImport_ImportModule("_strptime"); if (module == NULL) { - module = PyImport_ImportModule("_strptime"); - if (module == NULL) - return NULL; + return NULL; } - return PyObject_CallMethodObjArgs(module, &_Py_ID(_strptime_datetime), - cls, string, format, NULL); + result = PyObject_CallMethodObjArgs(module, &_Py_ID(_strptime_datetime), + cls, string, format, NULL); + Py_DECREF(module); + return result; } /* Return new datetime from date/datetime and time arguments. */ diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index fcd4be93..386f38ad 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -1213,12 +1213,8 @@ _elementtree_Element_extend_impl(ElementObject *self, PyTypeObject *cls, PyObject* seq; Py_ssize_t i; - seq = PySequence_Fast(elements, ""); + seq = PySequence_Fast(elements, "'elements' must be an iterable"); if (!seq) { - PyErr_Format( - PyExc_TypeError, - "expected sequence, not \"%.200s\"", Py_TYPE(elements)->tp_name - ); return NULL; } @@ -1504,7 +1500,7 @@ element_bool(PyObject* self_) { ElementObject* self = (ElementObject*) self_; if (PyErr_WarnEx(PyExc_DeprecationWarning, - "Testing an element's truth value will raise an exception " + "Testing an element's truth value will always return True " "in future versions. Use specific 'len(elem)' or " "'elem is not None' test instead.", 1) < 0) { @@ -1920,12 +1916,8 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value) } /* A new slice is actually being assigned */ - seq = PySequence_Fast(value, ""); + seq = PySequence_Fast(value, "assignment expects an iterable"); if (!seq) { - PyErr_Format( - PyExc_TypeError, - "expected sequence, not \"%.200s\"", Py_TYPE(value)->tp_name - ); return -1; } newlen = PySequence_Fast_GET_SIZE(seq); diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c index a8001d71..a6d1b839 100644 --- a/Modules/_functoolsmodule.c +++ b/Modules/_functoolsmodule.c @@ -734,12 +734,14 @@ functools_reduce(PyObject *self, PyObject *args) PyDoc_STRVAR(functools_reduce_doc, "reduce(function, iterable[, initial]) -> value\n\ \n\ -Apply a function of two arguments cumulatively to the items of a sequence\n\ -or iterable, from left to right, so as to reduce the iterable to a single\n\ -value. For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n\ -((((1+2)+3)+4)+5). If initial is present, it is placed before the items\n\ -of the iterable in the calculation, and serves as a default when the\n\ -iterable is empty."); +Apply a function of two arguments cumulatively to the items of an iterable, from left to right.\n\ +\n\ +This effectively reduces the iterable to a single value. If initial is present,\n\ +it is placed before the items of the iterable in the calculation, and serves as\n\ +a default when the iterable is empty.\n\ +\n\ +For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])\n\ +calculates ((((1 + 2) + 3) + 4) + 5)."); /* lru_cache object **********************************************************/ diff --git a/Modules/_io/stringio.c b/Modules/_io/stringio.c index 3eb25704..ed9cf0da 100644 --- a/Modules/_io/stringio.c +++ b/Modules/_io/stringio.c @@ -193,7 +193,7 @@ write_str(stringio *self, PyObject *obj) } if (self->writenl) { PyObject *translated = PyUnicode_Replace( - decoded, &_Py_STR(newline), self->writenl, -1); + decoded, _Py_LATIN1_CHR('\n'), self->writenl, -1); Py_SETREF(decoded, translated); } if (decoded == NULL) @@ -884,23 +884,25 @@ stringio_setstate(stringio *self, PyObject *state) once by __init__. So we do not take any chance and replace object's buffer completely. */ { - PyObject *item; - Py_UCS4 *buf; - Py_ssize_t bufsize; - - item = PyTuple_GET_ITEM(state, 0); - buf = PyUnicode_AsUCS4Copy(item); - if (buf == NULL) - return NULL; - bufsize = PyUnicode_GET_LENGTH(item); + PyObject *item = PyTuple_GET_ITEM(state, 0); + if (PyUnicode_Check(item)) { + Py_UCS4 *buf = PyUnicode_AsUCS4Copy(item); + if (buf == NULL) + return NULL; + Py_ssize_t bufsize = PyUnicode_GET_LENGTH(item); - if (resize_buffer(self, bufsize) < 0) { + if (resize_buffer(self, bufsize) < 0) { + PyMem_Free(buf); + return NULL; + } + memcpy(self->buf, buf, bufsize * sizeof(Py_UCS4)); PyMem_Free(buf); - return NULL; + self->string_size = bufsize; + } + else { + assert(item == Py_None); + self->string_size = 0; } - memcpy(self->buf, buf, bufsize * sizeof(Py_UCS4)); - PyMem_Free(buf); - self->string_size = bufsize; } /* Set carefully the position value. Alternatively, we could use the seek diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index 14dd19d9..4a1ba22d 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -1723,16 +1723,26 @@ _io_TextIOWrapper_write_impl(textio *self, PyObject *text) bytes_len = PyBytes_GET_SIZE(b); } - if (self->pending_bytes == NULL) { - self->pending_bytes_count = 0; - self->pending_bytes = b; - } - else if (self->pending_bytes_count + bytes_len > self->chunk_size) { - // Prevent to concatenate more than chunk_size data. - if (_textiowrapper_writeflush(self) < 0) { - Py_DECREF(b); - return NULL; + // We should avoid concatinating huge data. + // Flush the buffer before adding b to the buffer if b is not small. + // https://github.com/python/cpython/issues/87426 + if (bytes_len >= self->chunk_size) { + // _textiowrapper_writeflush() calls buffer.write(). + // self->pending_bytes can be appended during buffer->write() + // or other thread. + // We need to loop until buffer becomes empty. + // https://github.com/python/cpython/issues/118138 + // https://github.com/python/cpython/issues/119506 + while (self->pending_bytes != NULL) { + if (_textiowrapper_writeflush(self) < 0) { + Py_DECREF(b); + return NULL; + } } + } + + if (self->pending_bytes == NULL) { + assert(self->pending_bytes_count == 0); self->pending_bytes = b; } else if (!PyList_CheckExact(self->pending_bytes)) { @@ -1741,6 +1751,9 @@ _io_TextIOWrapper_write_impl(textio *self, PyObject *text) Py_DECREF(b); return NULL; } + // Since Python 3.12, allocating GC object won't trigger GC and release + // GIL. See https://github.com/python/cpython/issues/97922 + assert(!PyList_CheckExact(self->pending_bytes)); PyList_SET_ITEM(list, 0, self->pending_bytes); PyList_SET_ITEM(list, 1, b); self->pending_bytes = list; diff --git a/Modules/_io/winconsoleio.c b/Modules/_io/winconsoleio.c index c2c365e0..da4907ec 100644 --- a/Modules/_io/winconsoleio.c +++ b/Modules/_io/winconsoleio.c @@ -135,19 +135,67 @@ char _PyIO_get_console_type(PyObject *path_or_fd) { } static DWORD -_find_last_utf8_boundary(const char *buf, DWORD len) +_find_last_utf8_boundary(const unsigned char *buf, DWORD len) { - /* This function never returns 0, returns the original len instead */ - DWORD count = 1; - if (len == 0 || (buf[len - 1] & 0x80) == 0) { - return len; - } - for (;; count++) { - if (count > 3 || count >= len) { + for (DWORD count = 1; count < 4 && count <= len; count++) { + unsigned char c = buf[len - count]; + if (c < 0x80) { + /* No starting byte found. */ return len; } - if ((buf[len - count] & 0xc0) != 0x80) { - return len - count; + if (c >= 0xc0) { + if (c < 0xe0 /* 2-bytes sequence */ ? count < 2 : + c < 0xf0 /* 3-bytes sequence */ ? count < 3 : + c < 0xf8 /* 4-bytes sequence */) + { + /* Incomplete multibyte sequence. */ + return len - count; + } + /* Either complete or invalid sequence. */ + return len; + } + } + /* Either complete 4-bytes sequence or invalid sequence. */ + return len; +} + +/* Find the number of UTF-8 bytes that corresponds to the specified number of + * wchars. + * I.e. find x <= len so that MultiByteToWideChar(CP_UTF8, 0, s, x, NULL, 0) == n. + * + * WideCharToMultiByte() cannot be used for this, because the UTF-8 -> wchar + * conversion is not reversible (invalid UTF-8 byte produces \ufffd which + * will be converted back to 3-bytes UTF-8 sequence \xef\xbf\xbd). + * So we need to use binary search. + */ +static DWORD +_wchar_to_utf8_count(const unsigned char *s, DWORD len, DWORD n) +{ + DWORD start = 0; + while (1) { + DWORD mid = 0; + for (DWORD i = len / 2; i <= len; i++) { + mid = _find_last_utf8_boundary(s, i); + if (mid != 0) { + break; + } + /* The middle could split the first multibytes sequence. */ + } + if (mid == len) { + return start + len; + } + if (mid == 0) { + mid = len > 1 ? len - 1 : 1; + } + DWORD wlen = MultiByteToWideChar(CP_UTF8, 0, s, mid, NULL, 0); + if (wlen <= n) { + s += mid; + start += mid; + len -= mid; + n -= wlen; + } + else { + len = mid; } } } @@ -556,8 +604,10 @@ read_console_w(HANDLE handle, DWORD maxlen, DWORD *readlen) { int err = 0, sig = 0; wchar_t *buf = (wchar_t*)PyMem_Malloc(maxlen * sizeof(wchar_t)); - if (!buf) + if (!buf) { + PyErr_NoMemory(); goto error; + } *readlen = 0; @@ -615,6 +665,7 @@ read_console_w(HANDLE handle, DWORD maxlen, DWORD *readlen) { Py_UNBLOCK_THREADS if (!newbuf) { sig = -1; + PyErr_NoMemory(); break; } buf = newbuf; @@ -638,8 +689,10 @@ read_console_w(HANDLE handle, DWORD maxlen, DWORD *readlen) { if (*readlen > 0 && buf[0] == L'\x1a') { PyMem_Free(buf); buf = (wchar_t *)PyMem_Malloc(sizeof(wchar_t)); - if (!buf) + if (!buf) { + PyErr_NoMemory(); goto error; + } buf[0] = L'\0'; *readlen = 0; } @@ -817,8 +870,10 @@ _io__WindowsConsoleIO_readall_impl(winconsoleio *self) bufsize = BUFSIZ; buf = (wchar_t*)PyMem_Malloc((bufsize + 1) * sizeof(wchar_t)); - if (buf == NULL) + if (buf == NULL) { + PyErr_NoMemory(); return NULL; + } while (1) { wchar_t *subbuf; @@ -840,6 +895,7 @@ _io__WindowsConsoleIO_readall_impl(winconsoleio *self) (bufsize + 1) * sizeof(wchar_t)); if (tmp == NULL) { PyMem_Free(buf); + PyErr_NoMemory(); return NULL; } buf = tmp; @@ -1015,43 +1071,49 @@ _io__WindowsConsoleIO_write_impl(winconsoleio *self, PyTypeObject *cls, len = (DWORD)b->len; Py_BEGIN_ALLOW_THREADS - wlen = MultiByteToWideChar(CP_UTF8, 0, b->buf, len, NULL, 0); - /* issue11395 there is an unspecified upper bound on how many bytes can be written at once. We cap at 32k - the caller will have to handle partial writes. Since we don't know how many input bytes are being ignored, we have to reduce and recalculate. */ - while (wlen > 32766 / sizeof(wchar_t)) { - len /= 2; + const DWORD max_wlen = 32766 / sizeof(wchar_t); + /* UTF-8 to wchar ratio is at most 3:1. */ + len = Py_MIN(len, max_wlen * 3); + while (1) { /* Fix for github issues gh-110913 and gh-82052. */ len = _find_last_utf8_boundary(b->buf, len); wlen = MultiByteToWideChar(CP_UTF8, 0, b->buf, len, NULL, 0); + if (wlen <= max_wlen) { + break; + } + len /= 2; } Py_END_ALLOW_THREADS - if (!wlen) - return PyErr_SetFromWindowsErr(0); + if (!wlen) { + return PyLong_FromLong(0); + } wbuf = (wchar_t*)PyMem_Malloc(wlen * sizeof(wchar_t)); + if (!wbuf) { + PyErr_NoMemory(); + return NULL; + } Py_BEGIN_ALLOW_THREADS wlen = MultiByteToWideChar(CP_UTF8, 0, b->buf, len, wbuf, wlen); if (wlen) { res = WriteConsoleW(handle, wbuf, wlen, &n, NULL); +#ifdef Py_DEBUG + if (res) { +#else if (res && n < wlen) { +#endif /* Wrote fewer characters than expected, which means our * len value may be wrong. So recalculate it from the - * characters that were written. As this could potentially - * result in a different value, we also validate that value. + * characters that were written. */ - len = WideCharToMultiByte(CP_UTF8, 0, wbuf, n, - NULL, 0, NULL, NULL); - if (len) { - wlen = MultiByteToWideChar(CP_UTF8, 0, b->buf, len, - NULL, 0); - assert(wlen == len); - } + len = _wchar_to_utf8_count(b->buf, len, n); } } else res = 0; diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c index cbd036fd..db819437 100644 --- a/Modules/_localemodule.c +++ b/Modules/_localemodule.c @@ -62,7 +62,7 @@ module _locale [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=ed98569b726feada]*/ -/* support functions for formatting floating point numbers */ +/* support functions for formatting floating-point numbers */ /* the grouping is terminated by either 0 or CHAR_MAX */ static PyObject* @@ -595,6 +595,37 @@ static struct langinfo_constant{ {0, 0} }; +#ifdef __GLIBC__ +#if defined(ALT_DIGITS) || defined(ERA) +static PyObject * +decode_strings(const char *result, size_t max_count) +{ + /* Convert a sequence of NUL-separated C strings to a Python string + * containing semicolon separated items. */ + size_t i = 0; + size_t count = 0; + for (; count < max_count && result[i]; count++) { + i += strlen(result + i) + 1; + } + char *buf = PyMem_Malloc(i); + if (buf == NULL) { + PyErr_NoMemory(); + return NULL; + } + memcpy(buf, result, i); + /* Replace all NULs with semicolons. */ + i = 0; + while (--count) { + i += strlen(buf + i); + buf[i++] = ';'; + } + PyObject *pyresult = PyUnicode_DecodeLocale(buf, NULL); + PyMem_Free(buf); + return pyresult; +} +#endif +#endif + /*[clinic input] _locale.nl_langinfo @@ -618,7 +649,28 @@ _locale_nl_langinfo_impl(PyObject *module, int item) instead of an empty string for nl_langinfo(ERA). */ const char *result = nl_langinfo(item); result = result != NULL ? result : ""; - return PyUnicode_DecodeLocale(result, NULL); + PyObject *pyresult; +#ifdef __GLIBC__ + /* According to the POSIX specification the result must be + * a sequence of semicolon-separated strings. + * But in Glibc they are NUL-separated. */ +#ifdef ALT_DIGITS + if (item == ALT_DIGITS && *result) { + pyresult = decode_strings(result, 100); + } + else +#endif +#ifdef ERA + if (item == ERA && *result) { + pyresult = decode_strings(result, SIZE_MAX); + } + else +#endif +#endif + { + pyresult = PyUnicode_DecodeLocale(result, NULL); + } + return pyresult; } PyErr_SetString(PyExc_ValueError, "unsupported langinfo constant"); return NULL; diff --git a/Modules/_lsprof.c b/Modules/_lsprof.c index 257de438..0464e7e8 100644 --- a/Modules/_lsprof.c +++ b/Modules/_lsprof.c @@ -56,6 +56,7 @@ typedef struct { #define POF_ENABLED 0x001 #define POF_SUBCALLS 0x002 #define POF_BUILTINS 0x004 +#define POF_EXT_TIMER 0x008 #define POF_NOMEMORY 0x100 /*[clinic input] @@ -84,7 +85,14 @@ _lsprof_get_state(PyObject *module) static _PyTime_t CallExternalTimer(ProfilerObject *pObj) { - PyObject *o = _PyObject_CallNoArgs(pObj->externalTimer); + PyObject *o = NULL; + + // External timer can do arbitrary things so we need a flag to prevent + // horrible things to happen + pObj->flags |= POF_EXT_TIMER; + o = _PyObject_CallNoArgs(pObj->externalTimer); + pObj->flags &= ~POF_EXT_TIMER; + if (o == NULL) { PyErr_WriteUnraisable(pObj->externalTimer); return 0; @@ -596,6 +604,12 @@ setBuiltins(ProfilerObject *pObj, int nvalue) PyObject* pystart_callback(ProfilerObject* self, PyObject *const *args, Py_ssize_t size) { + if (size < 2) { + PyErr_Format(PyExc_TypeError, + "_pystart_callback expected 2 arguments, got %zd", + size); + return NULL; + } PyObject* code = args[0]; ptrace_enter_call((PyObject*)self, (void *)code, (PyObject *)code); @@ -604,6 +618,12 @@ PyObject* pystart_callback(ProfilerObject* self, PyObject *const *args, Py_ssize PyObject* pyreturn_callback(ProfilerObject* self, PyObject *const *args, Py_ssize_t size) { + if (size < 3) { + PyErr_Format(PyExc_TypeError, + "_pyreturn_callback expected 3 arguments, got %zd", + size); + return NULL; + } PyObject* code = args[0]; ptrace_leave_call((PyObject*)self, (void *)code); @@ -639,6 +659,12 @@ PyObject* get_cfunc_from_callable(PyObject* callable, PyObject* self_arg, PyObje PyObject* ccall_callback(ProfilerObject* self, PyObject *const *args, Py_ssize_t size) { + if (size < 4) { + PyErr_Format(PyExc_TypeError, + "_ccall_callback expected 4 arguments, got %zd", + size); + return NULL; + } if (self->flags & POF_BUILTINS) { PyObject* callable = args[2]; PyObject* self_arg = args[3]; @@ -657,6 +683,12 @@ PyObject* ccall_callback(ProfilerObject* self, PyObject *const *args, Py_ssize_t PyObject* creturn_callback(ProfilerObject* self, PyObject *const *args, Py_ssize_t size) { + if (size < 4) { + PyErr_Format(PyExc_TypeError, + "_creturn_callback expected 4 arguments, got %zd", + size); + return NULL; + } if (self->flags & POF_BUILTINS) { PyObject* callable = args[2]; PyObject* self_arg = args[3]; @@ -718,34 +750,47 @@ profiler_enable(ProfilerObject *self, PyObject *args, PyObject *kwds) return NULL; } - if (PyObject_CallMethod(monitoring, "use_tool_id", "is", self->tool_id, "cProfile") == NULL) { + PyObject *check = PyObject_CallMethod(monitoring, + "use_tool_id", "is", + self->tool_id, "cProfile"); + if (check == NULL) { PyErr_Format(PyExc_ValueError, "Another profiling tool is already active"); - Py_DECREF(monitoring); - return NULL; + goto error; } + Py_DECREF(check); for (int i = 0; callback_table[i].callback_method; i++) { + int event = (1 << callback_table[i].event); PyObject* callback = PyObject_GetAttrString((PyObject*)self, callback_table[i].callback_method); if (!callback) { - Py_DECREF(monitoring); - return NULL; + goto error; } - Py_XDECREF(PyObject_CallMethod(monitoring, "register_callback", "iiO", self->tool_id, - (1 << callback_table[i].event), - callback)); + PyObject *register_result = PyObject_CallMethod(monitoring, "register_callback", + "iiO", self->tool_id, + event, callback); Py_DECREF(callback); - all_events |= (1 << callback_table[i].event); + if (register_result == NULL) { + goto error; + } + Py_DECREF(register_result); + all_events |= event; } - if (!PyObject_CallMethod(monitoring, "set_events", "ii", self->tool_id, all_events)) { - Py_DECREF(monitoring); - return NULL; + PyObject *event_result = PyObject_CallMethod(monitoring, "set_events", "ii", + self->tool_id, all_events); + if (event_result == NULL) { + goto error; } + Py_DECREF(event_result); Py_DECREF(monitoring); self->flags |= POF_ENABLED; Py_RETURN_NONE; + +error: + Py_DECREF(monitoring); + return NULL; } static void @@ -773,6 +818,11 @@ Stop collecting profiling information.\n\ static PyObject* profiler_disable(ProfilerObject *self, PyObject* noarg) { + if (self->flags & POF_EXT_TIMER) { + PyErr_SetString(PyExc_RuntimeError, + "cannot disable profiler in external timer"); + return NULL; + } if (self->flags & POF_ENABLED) { PyObject* result = NULL; PyObject* monitoring = _PyImport_GetModuleAttrString("sys", "monitoring"); @@ -826,6 +876,11 @@ Clear all profiling information collected so far.\n\ static PyObject* profiler_clear(ProfilerObject *pObj, PyObject* noarg) { + if (pObj->flags & POF_EXT_TIMER) { + PyErr_SetString(PyExc_RuntimeError, + "cannot clear profiler in external timer"); + return NULL; + } clearEntries(pObj); Py_RETURN_NONE; } @@ -834,6 +889,7 @@ static int profiler_traverse(ProfilerObject *op, visitproc visit, void *arg) { Py_VISIT(Py_TYPE(op)); + Py_VISIT(op->externalTimer); return 0; } diff --git a/Modules/_operator.c b/Modules/_operator.c index 68ccc905..720687d4 100644 --- a/Modules/_operator.c +++ b/Modules/_operator.c @@ -2,6 +2,9 @@ #include "pycore_moduleobject.h" // _PyModule_GetState() #include "structmember.h" // PyMemberDef #include "pycore_runtime.h" // _Py_ID() +#include "pycore_pystate.h" // _PyInterpreterState_GET() + + #include "clinic/_operator.c.h" typedef struct { @@ -1224,6 +1227,7 @@ attrgetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return NULL; /* prepare attr while checking args */ + PyInterpreterState *interp = _PyInterpreterState_GET(); for (idx = 0; idx < nattrs; ++idx) { PyObject *item = PyTuple_GET_ITEM(args, idx); int dot_count; @@ -1251,7 +1255,7 @@ attrgetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) if (dot_count == 0) { Py_INCREF(item); - PyUnicode_InternInPlace(&item); + _PyUnicode_InternMortal(interp, &item); PyTuple_SET_ITEM(attr, idx, item); } else { /* make it a tuple of non-dotted attrnames */ PyObject *attr_chain = PyTuple_New(dot_count + 1); @@ -1277,7 +1281,7 @@ attrgetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) Py_DECREF(attr); return NULL; } - PyUnicode_InternInPlace(&attr_chain_item); + _PyUnicode_InternMortal(interp, &attr_chain_item); PyTuple_SET_ITEM(attr_chain, attr_chain_idx, attr_chain_item); ++attr_chain_idx; unibuff_till = unibuff_from = unibuff_till + 1; @@ -1291,7 +1295,7 @@ attrgetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) Py_DECREF(attr); return NULL; } - PyUnicode_InternInPlace(&attr_chain_item); + _PyUnicode_InternMortal(interp, &attr_chain_item); PyTuple_SET_ITEM(attr_chain, attr_chain_idx, attr_chain_item); PyTuple_SET_ITEM(attr, idx, attr_chain); @@ -1587,7 +1591,8 @@ methodcaller_new(PyTypeObject *type, PyObject *args, PyObject *kwds) name = PyTuple_GET_ITEM(args, 0); Py_INCREF(name); - PyUnicode_InternInPlace(&name); + PyInterpreterState *interp = _PyInterpreterState_GET(); + _PyUnicode_InternMortal(interp, &name); mc->name = name; mc->kwds = Py_XNewRef(kwds); diff --git a/Modules/_pickle.c b/Modules/_pickle.c index 2bf9977f..b8f701c2 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -1344,6 +1344,10 @@ _Unpickler_ReadFromFile(UnpicklerObject *self, Py_ssize_t n) else { read_size = _Unpickler_SetStringInput(self, data); Py_DECREF(data); + if (read_size < 0) { + return -1; + } + self->prefetched_idx = 0; if (n <= read_size) return n; @@ -1865,8 +1869,7 @@ get_dotted_path(PyObject *obj, PyObject *name) { PyObject *dotted_path; Py_ssize_t i, n; - _Py_DECLARE_STR(dot, "."); - dotted_path = PyUnicode_Split(name, &_Py_STR(dot), -1); + dotted_path = PyUnicode_Split(name, _Py_LATIN1_CHR('.'), -1); if (dotted_path == NULL) return NULL; n = PyList_GET_SIZE(dotted_path); @@ -1876,10 +1879,10 @@ get_dotted_path(PyObject *obj, PyObject *name) if (_PyUnicode_EqualToASCIIString(subpath, "")) { if (obj == NULL) PyErr_Format(PyExc_AttributeError, - "Can't pickle local object %R", name); + "Can't get local object %R", name); else PyErr_Format(PyExc_AttributeError, - "Can't pickle local attribute %R on %R", name, obj); + "Can't get local attribute %R on %R", name, obj); Py_DECREF(dotted_path); return NULL; } @@ -2566,7 +2569,7 @@ save_picklebuffer(PickleState *st, PicklerObject *self, PyObject *obj) { if (self->proto < 5) { PyErr_SetString(st->PicklingError, - "PickleBuffer can only pickled with protocol >= 5"); + "PickleBuffer can only be pickled with protocol >= 5"); return -1; } const Py_buffer* view = PyPickleBuffer_GetBuffer(obj); @@ -3188,6 +3191,7 @@ batch_dict(PickleState *state, PicklerObject *self, PyObject *iter) if (!PyTuple_Check(obj) || PyTuple_Size(obj) != 2) { PyErr_SetString(PyExc_TypeError, "dict items " "iterator must return 2-tuples"); + Py_DECREF(obj); return -1; } i = save(state, self, PyTuple_GET_ITEM(obj, 0), 0); @@ -3651,7 +3655,6 @@ save_global(PickleState *st, PicklerObject *self, PyObject *obj, PyObject *module = NULL; PyObject *parent = NULL; PyObject *dotted_path = NULL; - PyObject *lastname = NULL; PyObject *cls; int status = 0; @@ -3692,10 +3695,7 @@ save_global(PickleState *st, PicklerObject *self, PyObject *obj, obj, module_name); goto error; } - lastname = Py_NewRef(PyList_GET_ITEM(dotted_path, - PyList_GET_SIZE(dotted_path) - 1)); cls = get_deep_attribute(module, dotted_path, &parent); - Py_CLEAR(dotted_path); if (cls == NULL) { PyErr_Format(st->PicklingError, "Can't pickle %R: attribute lookup %S on %S failed", @@ -3728,31 +3728,23 @@ save_global(PickleState *st, PicklerObject *self, PyObject *obj, code_obj = PyDict_GetItemWithError(st->extension_registry, extension_key); Py_DECREF(extension_key); - /* The object is not registered in the extension registry. - This is the most likely code path. */ if (code_obj == NULL) { if (PyErr_Occurred()) { goto error; } + /* The object is not registered in the extension registry. + This is the most likely code path. */ goto gen_global; } - /* XXX: pickle.py doesn't check neither the type, nor the range - of the value returned by the extension_registry. It should for - consistency. */ - - /* Verify code_obj has the right type and value. */ - if (!PyLong_Check(code_obj)) { - PyErr_Format(st->PicklingError, - "Can't pickle %R: extension code %R isn't an integer", - obj, code_obj); - goto error; - } - code = PyLong_AS_LONG(code_obj); + Py_INCREF(code_obj); + code = PyLong_AsLong(code_obj); + Py_DECREF(code_obj); if (code <= 0 || code > 0x7fffffffL) { + /* Should never happen in normal circumstances, since the type and + the value of the code are checked in copyreg.add_extension(). */ if (!PyErr_Occurred()) - PyErr_Format(st->PicklingError, "Can't pickle %R: extension " - "code %ld is out of range", obj, code); + PyErr_Format(PyExc_RuntimeError, "extension code %ld is out of range", code); goto error; } @@ -3783,7 +3775,10 @@ save_global(PickleState *st, PicklerObject *self, PyObject *obj, else { gen_global: if (parent == module) { - Py_SETREF(global_name, Py_NewRef(lastname)); + Py_SETREF(global_name, + Py_NewRef(PyList_GET_ITEM(dotted_path, + PyList_GET_SIZE(dotted_path) - 1))); + Py_CLEAR(dotted_path); } if (self->proto >= 4) { const char stack_global_op = STACK_GLOBAL; @@ -3796,20 +3791,30 @@ save_global(PickleState *st, PicklerObject *self, PyObject *obj, if (_Pickler_Write(self, &stack_global_op, 1) < 0) goto error; } - else if (parent != module) { - PyObject *reduce_value = Py_BuildValue("(O(OO))", - st->getattr, parent, lastname); - if (reduce_value == NULL) - goto error; - status = save_reduce(st, self, reduce_value, NULL); - Py_DECREF(reduce_value); - if (status < 0) - goto error; - } else { /* Generate a normal global opcode if we are using a pickle protocol < 4, or if the object is not registered in the - extension registry. */ + extension registry. + + Objects with multi-part __qualname__ are represented as + getattr(getattr(..., attrname1), attrname2). */ + const char mark_op = MARK; + const char tupletwo_op = (self->proto < 2) ? TUPLE : TUPLE2; + const char reduce_op = REDUCE; + Py_ssize_t i; + if (dotted_path) { + if (PyList_GET_SIZE(dotted_path) > 1) { + Py_SETREF(global_name, Py_NewRef(PyList_GET_ITEM(dotted_path, 0))); + } + for (i = 1; i < PyList_GET_SIZE(dotted_path); i++) { + if (save(st, self, st->getattr, 0) < 0 || + (self->proto < 2 && _Pickler_Write(self, &mark_op, 1) < 0)) + { + goto error; + } + } + } + PyObject *encoded; PyObject *(*unicode_encoder)(PyObject *); @@ -3871,6 +3876,17 @@ save_global(PickleState *st, PicklerObject *self, PyObject *obj, Py_DECREF(encoded); if (_Pickler_Write(self, "\n", 1) < 0) goto error; + + if (dotted_path) { + for (i = 1; i < PyList_GET_SIZE(dotted_path); i++) { + if (save(st, self, PyList_GET_ITEM(dotted_path, i), 0) < 0 || + _Pickler_Write(self, &tupletwo_op, 1) < 0 || + _Pickler_Write(self, &reduce_op, 1) < 0) + { + goto error; + } + } + } } /* Memoize the object. */ if (memo_put(st, self, obj) < 0) @@ -3886,7 +3902,6 @@ save_global(PickleState *st, PicklerObject *self, PyObject *obj, Py_XDECREF(module); Py_XDECREF(parent); Py_XDECREF(dotted_path); - Py_XDECREF(lastname); return status; } @@ -6623,11 +6638,13 @@ load_additems(PickleState *state, UnpicklerObject *self) if (result == NULL) { Pdata_clear(self->stack, i + 1); Py_SET_SIZE(self->stack, mark); + Py_DECREF(add_func); return -1; } Py_DECREF(result); } Py_SET_SIZE(self->stack, mark); + Py_DECREF(add_func); } return 0; @@ -6703,10 +6720,13 @@ load_build(PickleState *st, UnpicklerObject *self) /* normally the keys for instance attributes are interned. we should try to do that here. */ Py_INCREF(d_key); - if (PyUnicode_CheckExact(d_key)) - PyUnicode_InternInPlace(&d_key); + if (PyUnicode_CheckExact(d_key)) { + PyInterpreterState *interp = _PyInterpreterState_GET(); + _PyUnicode_InternMortal(interp, &d_key); + } if (PyObject_SetItem(dict, d_key, d_value) < 0) { Py_DECREF(d_key); + Py_DECREF(dict); goto error; } Py_DECREF(d_key); diff --git a/Modules/_sqlite/clinic/connection.c.h b/Modules/_sqlite/clinic/connection.c.h index 417abcc4..93e4a0f3 100644 --- a/Modules/_sqlite/clinic/connection.c.h +++ b/Modules/_sqlite/clinic/connection.c.h @@ -717,7 +717,7 @@ pysqlite_connection_set_progress_handler(pysqlite_Connection *self, PyTypeObject PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(progress_handler), &_Py_ID(n), }, + .ob_item = { &_Py_ID(progress_handler), _Py_LATIN1_CHR('n'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -1665,4 +1665,4 @@ getconfig(pysqlite_Connection *self, PyObject *arg) #ifndef DESERIALIZE_METHODDEF #define DESERIALIZE_METHODDEF #endif /* !defined(DESERIALIZE_METHODDEF) */ -/*[clinic end generated code: output=834a99827555bf1a input=a9049054013a1b77]*/ +/*[clinic end generated code: output=305d580e3eaa622d input=a9049054013a1b77]*/ diff --git a/Modules/_sre/clinic/sre.c.h b/Modules/_sre/clinic/sre.c.h index 529c634e..56a4e604 100644 --- a/Modules/_sre/clinic/sre.c.h +++ b/Modules/_sre/clinic/sre.c.h @@ -975,6 +975,44 @@ PyDoc_STRVAR(_sre_SRE_Pattern___deepcopy____doc__, #define _SRE_SRE_PATTERN___DEEPCOPY___METHODDEF \ {"__deepcopy__", (PyCFunction)_sre_SRE_Pattern___deepcopy__, METH_O, _sre_SRE_Pattern___deepcopy____doc__}, +#if defined(Py_DEBUG) + +PyDoc_STRVAR(_sre_SRE_Pattern__fail_after__doc__, +"_fail_after($self, count, exception, /)\n" +"--\n" +"\n" +"For debugging."); + +#define _SRE_SRE_PATTERN__FAIL_AFTER_METHODDEF \ + {"_fail_after", _PyCFunction_CAST(_sre_SRE_Pattern__fail_after), METH_FASTCALL, _sre_SRE_Pattern__fail_after__doc__}, + +static PyObject * +_sre_SRE_Pattern__fail_after_impl(PatternObject *self, int count, + PyObject *exception); + +static PyObject * +_sre_SRE_Pattern__fail_after(PatternObject *self, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + int count; + PyObject *exception; + + if (!_PyArg_CheckPositional("_fail_after", nargs, 2, 2)) { + goto exit; + } + count = _PyLong_AsInt(args[0]); + if (count == -1 && PyErr_Occurred()) { + goto exit; + } + exception = args[1]; + return_value = _sre_SRE_Pattern__fail_after_impl(self, count, exception); + +exit: + return return_value; +} + +#endif /* defined(Py_DEBUG) */ + PyDoc_STRVAR(_sre_compile__doc__, "compile($module, /, pattern, flags, code, groups, groupindex,\n" " indexgroup)\n" @@ -1460,4 +1498,8 @@ _sre_SRE_Scanner_search(ScannerObject *self, PyTypeObject *cls, PyObject *const } return _sre_SRE_Scanner_search_impl(self, cls); } -/*[clinic end generated code: output=045de53cfe02dee0 input=a9049054013a1b77]*/ + +#ifndef _SRE_SRE_PATTERN__FAIL_AFTER_METHODDEF + #define _SRE_SRE_PATTERN__FAIL_AFTER_METHODDEF +#endif /* !defined(_SRE_SRE_PATTERN__FAIL_AFTER_METHODDEF) */ +/*[clinic end generated code: output=2165ecf43a7c20e8 input=a9049054013a1b77]*/ diff --git a/Modules/_sre/sre.c b/Modules/_sre/sre.c index 05473904..35c6058d 100644 --- a/Modules/_sre/sre.c +++ b/Modules/_sre/sre.c @@ -218,6 +218,85 @@ data_stack_grow(SRE_STATE* state, Py_ssize_t size) return 0; } +/* memory pool functions for SRE_REPEAT, this can avoid memory + leak when SRE(match) function terminates abruptly. + state->repeat_pool_used is a doubly-linked list, so that we + can remove a SRE_REPEAT node from it. + state->repeat_pool_unused is a singly-linked list, we put/get + node at the head. */ +static SRE_REPEAT * +repeat_pool_malloc(SRE_STATE *state) +{ + SRE_REPEAT *repeat; + + if (state->repeat_pool_unused) { + /* remove from unused pool (singly-linked list) */ + repeat = state->repeat_pool_unused; + state->repeat_pool_unused = repeat->pool_next; + } + else { + repeat = PyObject_Malloc(sizeof(SRE_REPEAT)); + if (!repeat) { + return NULL; + } + } + + /* add to used pool (doubly-linked list) */ + SRE_REPEAT *temp = state->repeat_pool_used; + if (temp) { + temp->pool_prev = repeat; + } + repeat->pool_prev = NULL; + repeat->pool_next = temp; + state->repeat_pool_used = repeat; + + return repeat; +} + +static void +repeat_pool_free(SRE_STATE *state, SRE_REPEAT *repeat) +{ + SRE_REPEAT *prev = repeat->pool_prev; + SRE_REPEAT *next = repeat->pool_next; + + /* remove from used pool (doubly-linked list) */ + if (prev) { + prev->pool_next = next; + } + else { + state->repeat_pool_used = next; + } + if (next) { + next->pool_prev = prev; + } + + /* add to unused pool (singly-linked list) */ + repeat->pool_next = state->repeat_pool_unused; + state->repeat_pool_unused = repeat; +} + +static void +repeat_pool_clear(SRE_STATE *state) +{ + /* clear used pool */ + SRE_REPEAT *next = state->repeat_pool_used; + state->repeat_pool_used = NULL; + while (next) { + SRE_REPEAT *temp = next; + next = temp->pool_next; + PyObject_Free(temp); + } + + /* clear unused pool */ + next = state->repeat_pool_unused; + state->repeat_pool_unused = NULL; + while (next) { + SRE_REPEAT *temp = next; + next = temp->pool_next; + PyObject_Free(temp); + } +} + /* generate 8-bit version */ #define SRE_CHAR Py_UCS1 @@ -463,6 +542,11 @@ state_init(SRE_STATE* state, PatternObject* pattern, PyObject* string, state->pos = start; state->endpos = end; +#ifdef Py_DEBUG + state->fail_after_count = pattern->fail_after_count; + state->fail_after_exc = pattern->fail_after_exc; // borrowed ref +#endif + return string; err: /* We add an explicit cast here because MSVC has a bug when @@ -485,6 +569,8 @@ state_fini(SRE_STATE* state) /* See above PyMem_Del for why we explicitly cast here. */ PyMem_Free((void*) state->mark); state->mark = NULL; + /* SRE_REPEAT pool */ + repeat_pool_clear(state); } /* calculate offset from start of string */ @@ -571,6 +657,9 @@ pattern_traverse(PatternObject *self, visitproc visit, void *arg) Py_VISIT(self->groupindex); Py_VISIT(self->indexgroup); Py_VISIT(self->pattern); +#ifdef Py_DEBUG + Py_VISIT(self->fail_after_exc); +#endif return 0; } @@ -580,6 +669,9 @@ pattern_clear(PatternObject *self) Py_CLEAR(self->groupindex); Py_CLEAR(self->indexgroup); Py_CLEAR(self->pattern); +#ifdef Py_DEBUG + Py_CLEAR(self->fail_after_exc); +#endif return 0; } @@ -642,7 +734,7 @@ _sre_SRE_Pattern_match_impl(PatternObject *self, PyTypeObject *cls, Py_ssize_t status; PyObject *match; - if (!state_init(&state, (PatternObject *)self, string, pos, endpos)) + if (!state_init(&state, self, string, pos, endpos)) return NULL; state.ptr = state.start; @@ -1330,6 +1422,29 @@ _sre_SRE_Pattern___deepcopy__(PatternObject *self, PyObject *memo) return Py_NewRef(self); } +#ifdef Py_DEBUG +/*[clinic input] +_sre.SRE_Pattern._fail_after + + count: int + exception: object + / + +For debugging. +[clinic start generated code]*/ + +static PyObject * +_sre_SRE_Pattern__fail_after_impl(PatternObject *self, int count, + PyObject *exception) +/*[clinic end generated code: output=9a6bf12135ac50c2 input=ef80a45c66c5499d]*/ +{ + self->fail_after_count = count; + Py_INCREF(exception); + Py_XSETREF(self->fail_after_exc, exception); + Py_RETURN_NONE; +} +#endif /* Py_DEBUG */ + static PyObject * pattern_repr(PatternObject *obj) { @@ -1456,6 +1571,10 @@ _sre_compile_impl(PyObject *module, PyObject *pattern, int flags, self->pattern = NULL; self->groupindex = NULL; self->indexgroup = NULL; +#ifdef Py_DEBUG + self->fail_after_count = -1; + self->fail_after_exc = NULL; +#endif self->codesize = n; @@ -1572,6 +1691,7 @@ _sre_template_impl(PyObject *module, PyObject *pattern, PyObject *template) } self->items[i].literal = Py_XNewRef(literal); } + PyObject_GC_Track(self); return (PyObject*) self; bad_template: @@ -2166,6 +2286,8 @@ match_getindex(MatchObject* self, PyObject* index) return -1; } + // Check that i*2 cannot overflow to make static analyzers happy + assert(i <= SRE_MAXGROUPS); return i; } @@ -2549,7 +2671,8 @@ pattern_new_match(_sremodulestate* module_state, if (!match) return NULL; - match->pattern = (PatternObject*)Py_NewRef(pattern); + Py_INCREF(pattern); + match->pattern = pattern; match->string = Py_NewRef(state->string); @@ -2685,7 +2808,7 @@ _sre_SRE_Scanner_match_impl(ScannerObject *self, PyTypeObject *cls) return NULL; } - match = pattern_new_match(module_state, (PatternObject*) self->pattern, + match = pattern_new_match(module_state, self->pattern, state, status); if (status == 0) @@ -2735,7 +2858,7 @@ _sre_SRE_Scanner_search_impl(ScannerObject *self, PyTypeObject *cls) return NULL; } - match = pattern_new_match(module_state, (PatternObject*) self->pattern, + match = pattern_new_match(module_state, self->pattern, state, status); if (status == 0) @@ -2771,7 +2894,8 @@ pattern_scanner(_sremodulestate *module_state, return NULL; } - scanner->pattern = Py_NewRef(self); + Py_INCREF(self); + scanner->pattern = self; PyObject_GC_Track(scanner); return (PyObject*) scanner; @@ -2965,6 +3089,7 @@ static PyMethodDef pattern_methods[] = { _SRE_SRE_PATTERN_SCANNER_METHODDEF _SRE_SRE_PATTERN___COPY___METHODDEF _SRE_SRE_PATTERN___DEEPCOPY___METHODDEF + _SRE_SRE_PATTERN__FAIL_AFTER_METHODDEF {"__class_getitem__", Py_GenericAlias, METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL, NULL} diff --git a/Modules/_sre/sre.h b/Modules/_sre/sre.h index a0f23560..b8c6f8e3 100644 --- a/Modules/_sre/sre.h +++ b/Modules/_sre/sre.h @@ -34,6 +34,11 @@ typedef struct { int flags; /* flags used when compiling pattern source */ PyObject *weakreflist; /* List of weak references */ int isbytes; /* pattern type (1 - bytes, 0 - string, -1 - None) */ +#ifdef Py_DEBUG + /* for simulation of user interruption */ + int fail_after_count; + PyObject *fail_after_exc; +#endif /* pattern code */ Py_ssize_t codesize; SRE_CODE code[1]; @@ -68,6 +73,9 @@ typedef struct SRE_REPEAT_T { const SRE_CODE* pattern; /* points to REPEAT operator arguments */ const void* last_ptr; /* helper to check for infinite loops */ struct SRE_REPEAT_T *prev; /* points to previous repeat context */ + /* for SRE_REPEAT pool */ + struct SRE_REPEAT_T *pool_prev; + struct SRE_REPEAT_T *pool_next; } SRE_REPEAT; typedef struct { @@ -94,12 +102,19 @@ typedef struct { size_t data_stack_base; /* current repeat context */ SRE_REPEAT *repeat; + /* SRE_REPEAT pool */ + SRE_REPEAT *repeat_pool_used; + SRE_REPEAT *repeat_pool_unused; unsigned int sigcount; +#ifdef Py_DEBUG + int fail_after_count; + PyObject *fail_after_exc; +#endif } SRE_STATE; typedef struct { PyObject_HEAD - PyObject* pattern; + PatternObject* pattern; SRE_STATE state; int executing; } ScannerObject; diff --git a/Modules/_sre/sre_lib.h b/Modules/_sre/sre_lib.h index 95c1ada9..9e9a0ec9 100644 --- a/Modules/_sre/sre_lib.h +++ b/Modules/_sre/sre_lib.h @@ -524,13 +524,28 @@ typedef struct { Py_ssize_t last_ctx_pos; } SRE(match_context); -#define MAYBE_CHECK_SIGNALS \ +#define _MAYBE_CHECK_SIGNALS \ do { \ if ((0 == (++sigcount & 0xfff)) && PyErr_CheckSignals()) { \ RETURN_ERROR(SRE_ERROR_INTERRUPTED); \ } \ } while (0) +#ifdef Py_DEBUG +# define MAYBE_CHECK_SIGNALS \ + do { \ + _MAYBE_CHECK_SIGNALS; \ + if (state->fail_after_count >= 0) { \ + if (state->fail_after_count-- == 0) { \ + PyErr_SetNone(state->fail_after_exc); \ + RETURN_ERROR(SRE_ERROR_INTERRUPTED); \ + } \ + } \ + } while (0) +#else +# define MAYBE_CHECK_SIGNALS _MAYBE_CHECK_SIGNALS +#endif /* Py_DEBUG */ + #ifdef HAVE_COMPUTED_GOTOS #ifndef USE_COMPUTED_GOTOS #define USE_COMPUTED_GOTOS 1 @@ -1083,12 +1098,9 @@ SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel) pattern[1], pattern[2])); /* install new repeat context */ - /* TODO(https://github.com/python/cpython/issues/67877): Fix this - * potential memory leak. */ - ctx->u.rep = (SRE_REPEAT*) PyObject_Malloc(sizeof(*ctx->u.rep)); + ctx->u.rep = repeat_pool_malloc(state); if (!ctx->u.rep) { - PyErr_NoMemory(); - RETURN_FAILURE; + RETURN_ERROR(SRE_ERROR_MEMORY); } ctx->u.rep->count = -1; ctx->u.rep->pattern = pattern; @@ -1099,7 +1111,7 @@ SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel) state->ptr = ptr; DO_JUMP(JUMP_REPEAT, jump_repeat, pattern+pattern[0]); state->repeat = ctx->u.rep->prev; - PyObject_Free(ctx->u.rep); + repeat_pool_free(state, ctx->u.rep); if (ret) { RETURN_ON_ERROR(ret); @@ -1257,6 +1269,17 @@ SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel) pointer */ state->ptr = ptr; + /* Set state->repeat to non-NULL */ + ctx->u.rep = repeat_pool_malloc(state); + if (!ctx->u.rep) { + RETURN_ERROR(SRE_ERROR_MEMORY); + } + ctx->u.rep->count = -1; + ctx->u.rep->pattern = NULL; + ctx->u.rep->prev = state->repeat; + ctx->u.rep->last_ptr = NULL; + state->repeat = ctx->u.rep; + /* Initialize Count to 0 */ ctx->count = 0; @@ -1271,6 +1294,9 @@ SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel) } else { state->ptr = ptr; + /* Restore state->repeat */ + state->repeat = ctx->u.rep->prev; + repeat_pool_free(state, ctx->u.rep); RETURN_FAILURE; } } @@ -1343,6 +1369,10 @@ SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel) } } + /* Restore state->repeat */ + state->repeat = ctx->u.rep->prev; + repeat_pool_free(state, ctx->u.rep); + /* Evaluate Tail */ /* Jump to end of pattern indicated by skip, and then skip the SUCCESS op code that follows it. */ diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 85fbc162..7a9f2c87 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -2224,6 +2224,17 @@ PySSL_dealloc(PySSLSocket *self) PyTypeObject *tp = Py_TYPE(self); PyObject_GC_UnTrack(self); if (self->ssl) { + // If we free the SSL socket object without having called SSL_shutdown, + // OpenSSL will invalidate the linked SSL session object. While this + // behavior is strictly RFC-compliant, it makes session reuse less + // likely and it would also break compatibility with older stdlib + // versions (which used an ugly workaround of duplicating the + // SSL_SESSION object). + // Therefore, we ensure the socket is marked as shutdown in any case. + // + // See elaborate explanation at + // https://github.com/python/cpython/pull/123249#discussion_r1766164530 + SSL_set_shutdown(self->ssl, SSL_SENT_SHUTDOWN | SSL_get_shutdown(self->ssl)); SSL_free(self->ssl); } Py_XDECREF(self->Socket); @@ -2768,48 +2779,6 @@ _ssl__SSLSocket_verify_client_post_handshake_impl(PySSLSocket *self) #endif } -static SSL_SESSION* -_ssl_session_dup(SSL_SESSION *session) { - SSL_SESSION *newsession = NULL; - int slen; - unsigned char *senc = NULL, *p; - const unsigned char *const_p; - - if (session == NULL) { - PyErr_SetString(PyExc_ValueError, "Invalid session"); - goto error; - } - - /* get length */ - slen = i2d_SSL_SESSION(session, NULL); - if (slen == 0 || slen > 0xFF00) { - PyErr_SetString(PyExc_ValueError, "i2d() failed"); - goto error; - } - if ((senc = PyMem_Malloc(slen)) == NULL) { - PyErr_NoMemory(); - goto error; - } - p = senc; - if (!i2d_SSL_SESSION(session, &p)) { - PyErr_SetString(PyExc_ValueError, "i2d() failed"); - goto error; - } - const_p = senc; - newsession = d2i_SSL_SESSION(NULL, &const_p, slen); - if (newsession == NULL) { - PyErr_SetString(PyExc_ValueError, "d2i() failed"); - goto error; - } - PyMem_Free(senc); - return newsession; - error: - if (senc != NULL) { - PyMem_Free(senc); - } - return NULL; -} - static PyObject * PySSL_get_session(PySSLSocket *self, void *closure) { /* get_session can return sessions from a server-side connection, @@ -2817,15 +2786,6 @@ PySSL_get_session(PySSLSocket *self, void *closure) { PySSLSession *pysess; SSL_SESSION *session; - /* duplicate session as workaround for session bug in OpenSSL 1.1.0, - * https://github.com/openssl/openssl/issues/1550 */ - session = SSL_get0_session(self->ssl); /* borrowed reference */ - if (session == NULL) { - Py_RETURN_NONE; - } - if ((session = _ssl_session_dup(session)) == NULL) { - return NULL; - } session = SSL_get1_session(self->ssl); if (session == NULL) { Py_RETURN_NONE; @@ -2844,11 +2804,8 @@ PySSL_get_session(PySSLSocket *self, void *closure) { } static int PySSL_set_session(PySSLSocket *self, PyObject *value, - void *closure) - { + void *closure) { PySSLSession *pysess; - SSL_SESSION *session; - int result; if (!Py_IS_TYPE(value, get_state_sock(self)->PySSLSession_Type)) { PyErr_SetString(PyExc_TypeError, "Value is not a SSLSession."); @@ -2871,14 +2828,7 @@ static int PySSL_set_session(PySSLSocket *self, PyObject *value, "Cannot set session after handshake."); return -1; } - /* duplicate session */ - if ((session = _ssl_session_dup(pysess->session)) == NULL) { - return -1; - } - result = SSL_set_session(self->ssl, session); - /* free duplicate, SSL_set_session() bumps ref count */ - SSL_SESSION_free(session); - if (result == 0) { + if (SSL_set_session(self->ssl, pysess->session) == 0) { _setSSLError(get_state_sock(self), NULL, 0, __FILE__, __LINE__); return -1; } @@ -2950,7 +2900,7 @@ static PyType_Spec PySSLSocket_spec = { .name = "_ssl._SSLSocket", .basicsize = sizeof(PySSLSocket), .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE | - Py_TPFLAGS_HAVE_GC), + Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_DISALLOW_INSTANTIATION), .slots = PySSLSocket_slots, }; @@ -5001,14 +4951,14 @@ PySSLSession_dealloc(PySSLSession *self) static PyObject * PySSLSession_richcompare(PyObject *left, PyObject *right, int op) { - int result; - PyTypeObject *sesstype = ((PySSLSession*)left)->ctx->state->PySSLSession_Type; - if (left == NULL || right == NULL) { PyErr_BadInternalCall(); return NULL; } + int result; + PyTypeObject *sesstype = ((PySSLSession*)left)->ctx->state->PySSLSession_Type; + if (!Py_IS_TYPE(left, sesstype) || !Py_IS_TYPE(right, sesstype)) { Py_RETURN_NOTIMPLEMENTED; } diff --git a/Modules/_struct.c b/Modules/_struct.c index 55efc0c6..6532174a 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -278,7 +278,7 @@ get_size_t(_structmodulestate *state, PyObject *v, size_t *p) #define RANGE_ERROR(state, f, flag) return _range_error(state, f, flag) -/* Floating point helpers */ +/* Floating-point helpers */ static PyObject * unpack_halffloat(const char *p, /* start of 2-byte string */ @@ -483,9 +483,8 @@ nu_ulonglong(_structmodulestate *state, const char *p, const formatdef *f) static PyObject * nu_bool(_structmodulestate *state, const char *p, const formatdef *f) { - _Bool x; - memcpy((char *)&x, p, sizeof x); - return PyBool_FromLong(x != 0); + const _Bool bool_false = 0; + return PyBool_FromLong(memcmp(p, &bool_false, sizeof(_Bool))); } @@ -1662,9 +1661,16 @@ s_unpack_internal(PyStructObject *soself, const char *startfrom, if (e->format == 's') { v = PyBytes_FromStringAndSize(res, code->size); } else if (e->format == 'p') { - Py_ssize_t n = *(unsigned char*)res; - if (n >= code->size) - n = code->size - 1; + Py_ssize_t n; + if (code->size == 0) { + n = 0; + } + else { + n = *(unsigned char*)res; + if (n >= code->size) { + n = code->size - 1; + } + } v = PyBytes_FromStringAndSize(res + 1, n); } else { v = e->unpack(state, res, e); @@ -1975,8 +1981,12 @@ s_pack_internal(PyStructObject *soself, PyObject *const *args, int offset, n = PyByteArray_GET_SIZE(v); p = PyByteArray_AS_STRING(v); } - if (n > (code->size - 1)) + if (code->size == 0) { + n = 0; + } + else if (n > (code->size - 1)) { n = code->size - 1; + } if (n > 0) memcpy(res + 1, p, n); if (n > 255) diff --git a/Modules/_testcapi/numbers.c b/Modules/_testcapi/numbers.c index 6f7fa3fa..e16ff737 100644 --- a/Modules/_testcapi/numbers.c +++ b/Modules/_testcapi/numbers.c @@ -1,7 +1,168 @@ #include "parts.h" #include "util.h" + +static PyObject * +number_check(PyObject *Py_UNUSED(module), PyObject *obj) +{ + NULLABLE(obj); + return PyLong_FromLong(PyNumber_Check(obj)); +} + +#define BINARYFUNC(funcsuffix, methsuffix) \ + static PyObject * \ + number_##methsuffix(PyObject *Py_UNUSED(module), PyObject *args) \ + { \ + PyObject *o1, *o2; \ + \ + if (!PyArg_ParseTuple(args, "OO", &o1, &o2)) { \ + return NULL; \ + } \ + \ + NULLABLE(o1); \ + NULLABLE(o2); \ + return PyNumber_##funcsuffix(o1, o2); \ + }; + +BINARYFUNC(Add, add) +BINARYFUNC(Subtract, subtract) +BINARYFUNC(Multiply, multiply) +BINARYFUNC(MatrixMultiply, matrixmultiply) +BINARYFUNC(FloorDivide, floordivide) +BINARYFUNC(TrueDivide, truedivide) +BINARYFUNC(Remainder, remainder) +BINARYFUNC(Divmod, divmod) + +#define TERNARYFUNC(funcsuffix, methsuffix) \ + static PyObject * \ + number_##methsuffix(PyObject *Py_UNUSED(module), PyObject *args) \ + { \ + PyObject *o1, *o2, *o3 = Py_None; \ + \ + if (!PyArg_ParseTuple(args, "OO|O", &o1, &o2, &o3)) { \ + return NULL; \ + } \ + \ + NULLABLE(o1); \ + NULLABLE(o2); \ + return PyNumber_##funcsuffix(o1, o2, o3); \ + }; + +TERNARYFUNC(Power, power) + +#define UNARYFUNC(funcsuffix, methsuffix) \ + static PyObject * \ + number_##methsuffix(PyObject *Py_UNUSED(module), PyObject *obj) \ + { \ + NULLABLE(obj); \ + return PyNumber_##funcsuffix(obj); \ + }; + +UNARYFUNC(Negative, negative) +UNARYFUNC(Positive, positive) +UNARYFUNC(Absolute, absolute) +UNARYFUNC(Invert, invert) + +BINARYFUNC(Lshift, lshift) +BINARYFUNC(Rshift, rshift) +BINARYFUNC(And, and) +BINARYFUNC(Xor, xor) +BINARYFUNC(Or, or) + +BINARYFUNC(InPlaceAdd, inplaceadd) +BINARYFUNC(InPlaceSubtract, inplacesubtract) +BINARYFUNC(InPlaceMultiply, inplacemultiply) +BINARYFUNC(InPlaceMatrixMultiply, inplacematrixmultiply) +BINARYFUNC(InPlaceFloorDivide, inplacefloordivide) +BINARYFUNC(InPlaceTrueDivide, inplacetruedivide) +BINARYFUNC(InPlaceRemainder, inplaceremainder) + +TERNARYFUNC(InPlacePower, inplacepower) + +BINARYFUNC(InPlaceLshift, inplacelshift) +BINARYFUNC(InPlaceRshift, inplacershift) +BINARYFUNC(InPlaceAnd, inplaceand) +BINARYFUNC(InPlaceXor, inplacexor) +BINARYFUNC(InPlaceOr, inplaceor) + +UNARYFUNC(Long, long) +UNARYFUNC(Float, float) +UNARYFUNC(Index, index) + +static PyObject * +number_tobase(PyObject *Py_UNUSED(module), PyObject *args) +{ + PyObject *n; + int base; + + if (!PyArg_ParseTuple(args, "Oi", &n, &base)) { + return NULL; + } + + NULLABLE(n); + return PyNumber_ToBase(n, base); +} + +static PyObject * +number_asssizet(PyObject *Py_UNUSED(module), PyObject *args) +{ + PyObject *o, *exc; + Py_ssize_t ret; + + if (!PyArg_ParseTuple(args, "OO", &o, &exc)) { + return NULL; + } + + NULLABLE(o); + NULLABLE(exc); + ret = PyNumber_AsSsize_t(o, exc); + + if (ret == (Py_ssize_t)(-1) && PyErr_Occurred()) { + return NULL; + } + + return PyLong_FromSsize_t(ret); +} + + static PyMethodDef test_methods[] = { + {"number_check", number_check, METH_O}, + {"number_add", number_add, METH_VARARGS}, + {"number_subtract", number_subtract, METH_VARARGS}, + {"number_multiply", number_multiply, METH_VARARGS}, + {"number_matrixmultiply", number_matrixmultiply, METH_VARARGS}, + {"number_floordivide", number_floordivide, METH_VARARGS}, + {"number_truedivide", number_truedivide, METH_VARARGS}, + {"number_remainder", number_remainder, METH_VARARGS}, + {"number_divmod", number_divmod, METH_VARARGS}, + {"number_power", number_power, METH_VARARGS}, + {"number_negative", number_negative, METH_O}, + {"number_positive", number_positive, METH_O}, + {"number_absolute", number_absolute, METH_O}, + {"number_invert", number_invert, METH_O}, + {"number_lshift", number_lshift, METH_VARARGS}, + {"number_rshift", number_rshift, METH_VARARGS}, + {"number_and", number_and, METH_VARARGS}, + {"number_xor", number_xor, METH_VARARGS}, + {"number_or", number_or, METH_VARARGS}, + {"number_inplaceadd", number_inplaceadd, METH_VARARGS}, + {"number_inplacesubtract", number_inplacesubtract, METH_VARARGS}, + {"number_inplacemultiply", number_inplacemultiply, METH_VARARGS}, + {"number_inplacematrixmultiply", number_inplacematrixmultiply, METH_VARARGS}, + {"number_inplacefloordivide", number_inplacefloordivide, METH_VARARGS}, + {"number_inplacetruedivide", number_inplacetruedivide, METH_VARARGS}, + {"number_inplaceremainder", number_inplaceremainder, METH_VARARGS}, + {"number_inplacepower", number_inplacepower, METH_VARARGS}, + {"number_inplacelshift", number_inplacelshift, METH_VARARGS}, + {"number_inplacershift", number_inplacershift, METH_VARARGS}, + {"number_inplaceand", number_inplaceand, METH_VARARGS}, + {"number_inplacexor", number_inplacexor, METH_VARARGS}, + {"number_inplaceor", number_inplaceor, METH_VARARGS}, + {"number_long", number_long, METH_O}, + {"number_float", number_float, METH_O}, + {"number_index", number_index, METH_O}, + {"number_tobase", number_tobase, METH_VARARGS}, + {"number_asssizet", number_asssizet, METH_VARARGS}, {NULL}, }; diff --git a/Modules/_testcapi/tuple.c b/Modules/_testcapi/tuple.c index 95dde8c0..23ea4e1d 100644 --- a/Modules/_testcapi/tuple.c +++ b/Modules/_testcapi/tuple.c @@ -2,14 +2,240 @@ #include "util.h" +static PyObject * +tuple_get_size(PyObject *Py_UNUSED(module), PyObject *obj) +{ + NULLABLE(obj); + RETURN_SIZE(PyTuple_GET_SIZE(obj)); +} + +static PyObject * +tuple_get_item(PyObject *Py_UNUSED(module), PyObject *args) +{ + PyObject *obj; + Py_ssize_t i; + if (!PyArg_ParseTuple(args, "On", &obj, &i)) { + return NULL; + } + NULLABLE(obj); + return Py_XNewRef(PyTuple_GET_ITEM(obj, i)); +} + +static PyObject * +tuple_copy(PyObject *tuple) +{ + Py_ssize_t size = PyTuple_GET_SIZE(tuple); + PyObject *newtuple = PyTuple_New(size); + if (!newtuple) { + return NULL; + } + for (Py_ssize_t n = 0; n < size; n++) { + PyTuple_SET_ITEM(newtuple, n, Py_XNewRef(PyTuple_GET_ITEM(tuple, n))); + } + return newtuple; +} + +static PyObject * +tuple_set_item(PyObject *Py_UNUSED(module), PyObject *args) +{ + PyObject *obj, *value, *newtuple; + Py_ssize_t i; + if (!PyArg_ParseTuple(args, "OnO", &obj, &i, &value)) { + return NULL; + } + NULLABLE(value); + if (PyTuple_CheckExact(obj)) { + newtuple = tuple_copy(obj); + if (!newtuple) { + return NULL; + } + + PyObject *val = PyTuple_GET_ITEM(newtuple, i); + PyTuple_SET_ITEM(newtuple, i, Py_XNewRef(value)); + Py_DECREF(val); + return newtuple; + } + else { + NULLABLE(obj); + + PyObject *val = PyTuple_GET_ITEM(obj, i); + PyTuple_SET_ITEM(obj, i, Py_XNewRef(value)); + Py_DECREF(val); + return Py_XNewRef(obj); + } +} + +static PyObject * +_tuple_resize(PyObject *Py_UNUSED(module), PyObject *args) +{ + PyObject *tup; + Py_ssize_t newsize; + int new = 1; + if (!PyArg_ParseTuple(args, "On|p", &tup, &newsize, &new)) { + return NULL; + } + if (new) { + tup = tuple_copy(tup); + if (!tup) { + return NULL; + } + } + else { + NULLABLE(tup); + Py_XINCREF(tup); + } + int r = _PyTuple_Resize(&tup, newsize); + if (r == -1) { + assert(tup == NULL); + return NULL; + } + return tup; +} + +static PyObject * +_check_tuple_item_is_NULL(PyObject *Py_UNUSED(module), PyObject *args) +{ + PyObject *obj; + Py_ssize_t i; + if (!PyArg_ParseTuple(args, "On", &obj, &i)) { + return NULL; + } + return PyLong_FromLong(PyTuple_GET_ITEM(obj, i) == NULL); +} + +static PyObject * +tuple_check(PyObject* Py_UNUSED(module), PyObject *obj) +{ + NULLABLE(obj); + return PyLong_FromLong(PyTuple_Check(obj)); +} + +static PyObject * +tuple_checkexact(PyObject* Py_UNUSED(module), PyObject *obj) +{ + NULLABLE(obj); + return PyLong_FromLong(PyTuple_CheckExact(obj)); +} + +static PyObject * +tuple_new(PyObject* Py_UNUSED(module), PyObject *len) +{ + return PyTuple_New(PyLong_AsSsize_t(len)); +} + +static PyObject * +tuple_pack(PyObject *Py_UNUSED(module), PyObject *args) +{ + PyObject *arg1 = NULL, *arg2 = NULL; + Py_ssize_t size; + + if (!PyArg_ParseTuple(args, "n|OO", &size, &arg1, &arg2)) { + return NULL; + } + if (arg1) { + NULLABLE(arg1); + if (arg2) { + NULLABLE(arg2); + return PyTuple_Pack(size, arg1, arg2); + } + return PyTuple_Pack(size, arg1); + } + return PyTuple_Pack(size); +} + +static PyObject * +tuple_size(PyObject *Py_UNUSED(module), PyObject *obj) +{ + NULLABLE(obj); + RETURN_SIZE(PyTuple_Size(obj)); +} + +static PyObject * +tuple_getitem(PyObject *Py_UNUSED(module), PyObject *args) +{ + PyObject *obj; + Py_ssize_t i; + if (!PyArg_ParseTuple(args, "On", &obj, &i)) { + return NULL; + } + NULLABLE(obj); + return Py_XNewRef(PyTuple_GetItem(obj, i)); +} + +static PyObject * +tuple_getslice(PyObject *Py_UNUSED(module), PyObject *args) +{ + PyObject *obj; + Py_ssize_t ilow, ihigh; + if (!PyArg_ParseTuple(args, "Onn", &obj, &ilow, &ihigh)) { + return NULL; + } + NULLABLE(obj); + return PyTuple_GetSlice(obj, ilow, ihigh); +} + +static PyObject * +tuple_setitem(PyObject *Py_UNUSED(module), PyObject *args) +{ + PyObject *obj, *value, *newtuple = NULL; + Py_ssize_t i; + if (!PyArg_ParseTuple(args, "OnO", &obj, &i, &value)) { + return NULL; + } + NULLABLE(value); + if (PyTuple_CheckExact(obj)) { + Py_ssize_t size = PyTuple_Size(obj); + newtuple = PyTuple_New(size); + if (!newtuple) { + return NULL; + } + for (Py_ssize_t n = 0; n < size; n++) { + if (PyTuple_SetItem(newtuple, n, + Py_XNewRef(PyTuple_GetItem(obj, n))) == -1) { + Py_DECREF(newtuple); + return NULL; + } + } + + if (PyTuple_SetItem(newtuple, i, Py_XNewRef(value)) == -1) { + Py_DECREF(newtuple); + return NULL; + } + return newtuple; + } + else { + NULLABLE(obj); + + if (PyTuple_SetItem(obj, i, Py_XNewRef(value)) == -1) { + return NULL; + } + return Py_XNewRef(obj); + } +} + + static PyMethodDef test_methods[] = { + {"tuple_get_size", tuple_get_size, METH_O}, + {"tuple_get_item", tuple_get_item, METH_VARARGS}, + {"tuple_set_item", tuple_set_item, METH_VARARGS}, + {"_tuple_resize", _tuple_resize, METH_VARARGS}, + {"_check_tuple_item_is_NULL", _check_tuple_item_is_NULL, METH_VARARGS}, + /* Limited C API */ + {"tuple_check", tuple_check, METH_O}, + {"tuple_checkexact", tuple_checkexact, METH_O}, + {"tuple_new", tuple_new, METH_O}, + {"tuple_pack", tuple_pack, METH_VARARGS}, + {"tuple_size", tuple_size, METH_O}, + {"tuple_getitem", tuple_getitem, METH_VARARGS}, + {"tuple_getslice", tuple_getslice, METH_VARARGS}, + {"tuple_setitem", tuple_setitem, METH_VARARGS}, {NULL}, }; int _PyTestCapi_Init_Tuple(PyObject *m) { - if (PyModule_AddFunctions(m, test_methods) < 0){ + if (PyModule_AddFunctions(m, test_methods) < 0) { return -1; } diff --git a/Modules/_testcapi/vectorcall.c b/Modules/_testcapi/vectorcall.c index dcbc973c..bf91d0b4 100644 --- a/Modules/_testcapi/vectorcall.c +++ b/Modules/_testcapi/vectorcall.c @@ -349,6 +349,9 @@ static PyObject * MethodDescriptor2_new(PyTypeObject* type, PyObject* args, PyObject *kw) { MethodDescriptor2Object *op = PyObject_New(MethodDescriptor2Object, type); + if (op == NULL) { + return NULL; + } op->base.vectorcall = NULL; op->vectorcall = MethodDescriptor_vectorcall; return (PyObject *)op; diff --git a/Modules/_testclinic.c b/Modules/_testclinic.c index 676535f5..29cc106a 100644 --- a/Modules/_testclinic.c +++ b/Modules/_testclinic.c @@ -1034,6 +1034,25 @@ vararg_with_default_impl(PyObject *module, PyObject *a, PyObject *args, } +/*[clinic input] +vararg_with_default2 + + a: object + *args: object + b: object = None + c: object = None + +[clinic start generated code]*/ + +static PyObject * +vararg_with_default2_impl(PyObject *module, PyObject *a, PyObject *args, + PyObject *b, PyObject *c) +/*[clinic end generated code: output=a0fb7c37796e2129 input=59fb22f5f0a8925f]*/ +{ + return pack_arguments_newref(4, a, args, b, c); +} + + /*[clinic input] vararg_with_only_defaults @@ -1274,6 +1293,7 @@ static PyMethodDef tester_methods[] = { VARARG_AND_POSONLY_METHODDEF VARARG_METHODDEF VARARG_WITH_DEFAULT_METHODDEF + VARARG_WITH_DEFAULT2_METHODDEF VARARG_WITH_ONLY_DEFAULTS_METHODDEF GH_32092_OOB_METHODDEF GH_32092_KW_PASS_METHODDEF diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index 365f4460..366ee618 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -961,7 +961,7 @@ local_setattro(localobject *self, PyObject *name, PyObject *v) } if (r == 1) { PyErr_Format(PyExc_AttributeError, - "'%.100s' object attribute '%U' is read-only", + "'%.100s' object attribute %R is read-only", Py_TYPE(self)->tp_name, name); return -1; } @@ -1219,6 +1219,7 @@ thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs) if (ident == PYTHREAD_INVALID_THREAD_ID) { PyErr_SetString(ThreadError, "can't start new thread"); PyThreadState_Clear(boot->tstate); + PyThreadState_Delete(boot->tstate); thread_bootstate_free(boot, 1); return NULL; } diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index 8dca940b..6b5fcb8a 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -71,6 +71,12 @@ Copyright (C) 1994 Steen Lumholt. #define USE_DEPRECATED_TOMMATH_API 1 #endif +// As suggested by https://core.tcl-lang.org/tcl/wiki?name=Migrating+C+extensions+to+Tcl+9 +#ifndef TCL_SIZE_MAX +typedef int Tcl_Size; +#define TCL_SIZE_MAX INT_MAX +#endif + #if !(defined(MS_WINDOWS) || defined(__CYGWIN__)) #define HAVE_CREATEFILEHANDLER #endif @@ -491,24 +497,28 @@ unicodeFromTclString(const char *s) } static PyObject * -unicodeFromTclObj(Tcl_Obj *value) +unicodeFromTclObj(TkappObject *tkapp, Tcl_Obj *value) { - int len; + Tcl_Size len; #if USE_TCL_UNICODE - int byteorder = NATIVE_BYTEORDER; - const Tcl_UniChar *u = Tcl_GetUnicodeFromObj(value, &len); - if (sizeof(Tcl_UniChar) == 2) - return PyUnicode_DecodeUTF16((const char *)u, len * 2, - "surrogatepass", &byteorder); - else if (sizeof(Tcl_UniChar) == 4) - return PyUnicode_DecodeUTF32((const char *)u, len * 4, - "surrogatepass", &byteorder); - else - Py_UNREACHABLE(); -#else + if (value->typePtr != NULL && tkapp != NULL && + (value->typePtr == tkapp->StringType || + value->typePtr == tkapp->UTF32StringType)) + { + int byteorder = NATIVE_BYTEORDER; + const Tcl_UniChar *u = Tcl_GetUnicodeFromObj(value, &len); + if (sizeof(Tcl_UniChar) == 2) + return PyUnicode_DecodeUTF16((const char *)u, len * 2, + "surrogatepass", &byteorder); + else if (sizeof(Tcl_UniChar) == 4) + return PyUnicode_DecodeUTF32((const char *)u, len * 4, + "surrogatepass", &byteorder); + else + Py_UNREACHABLE(); + } +#endif /* USE_TCL_UNICODE */ const char *s = Tcl_GetStringFromObj(value, &len); return unicodeFromTclStringAndSize(s, len); -#endif } /*[clinic input] @@ -521,6 +531,10 @@ class _tkinter.tktimertoken "TkttObject *" "&Tktt_Type_spec" /**** Tkapp Object ****/ +#if TK_MAJOR_VERSION >= 9 +int Tcl_AppInit(Tcl_Interp *); +#endif + #ifndef WITH_APPINIT int Tcl_AppInit(Tcl_Interp *interp) @@ -786,7 +800,7 @@ static PyObject * PyTclObject_string(PyTclObject *self, void *ignored) { if (!self->string) { - self->string = unicodeFromTclObj(self->value); + self->string = unicodeFromTclObj(NULL, self->value); if (!self->string) return NULL; } @@ -800,7 +814,7 @@ PyTclObject_str(PyTclObject *self) return Py_NewRef(self->string); } /* XXX Could cache result if it is non-ASCII. */ - return unicodeFromTclObj(self->value); + return unicodeFromTclObj(NULL, self->value); } static PyObject * @@ -1010,7 +1024,9 @@ AsObj(PyObject *value) PyErr_SetString(PyExc_OverflowError, "string is too long"); return NULL; } - if (PyUnicode_IS_ASCII(value)) { + if (PyUnicode_IS_ASCII(value) && + strlen(PyUnicode_DATA(value)) == (size_t)PyUnicode_GET_LENGTH(value)) + { return Tcl_NewStringObj((const char *)PyUnicode_DATA(value), (int)size); } @@ -1025,9 +1041,6 @@ AsObj(PyObject *value) "surrogatepass", NATIVE_BYTEORDER); else Py_UNREACHABLE(); -#else - encoded = _PyUnicode_AsUTF8String(value, "surrogateescape"); -#endif if (!encoded) { return NULL; } @@ -1037,12 +1050,39 @@ AsObj(PyObject *value) PyErr_SetString(PyExc_OverflowError, "string is too long"); return NULL; } -#if USE_TCL_UNICODE result = Tcl_NewUnicodeObj((const Tcl_UniChar *)PyBytes_AS_STRING(encoded), (int)(size / sizeof(Tcl_UniChar))); #else + encoded = _PyUnicode_AsUTF8String(value, "surrogateescape"); + if (!encoded) { + return NULL; + } + size = PyBytes_GET_SIZE(encoded); + if (strlen(PyBytes_AS_STRING(encoded)) != (size_t)size) { + /* The string contains embedded null characters. + * Tcl needs a null character to be represented as \xc0\x80 in + * the Modified UTF-8 encoding. Otherwise the string can be + * truncated in some internal operations. + * + * NOTE: stringlib_replace() could be used here, but optimizing + * this obscure case isn't worth it unless stringlib_replace() + * was already exposed in the C API for other reasons. */ + Py_SETREF(encoded, + PyObject_CallMethod(encoded, "replace", "y#y#", + "\0", (Py_ssize_t)1, + "\xc0\x80", (Py_ssize_t)2)); + if (!encoded) { + return NULL; + } + size = PyBytes_GET_SIZE(encoded); + } + if (size > INT_MAX) { + Py_DECREF(encoded); + PyErr_SetString(PyExc_OverflowError, "string is too long"); + return NULL; + } result = Tcl_NewStringObj(PyBytes_AS_STRING(encoded), (int)size); -#endif +#endif /* USE_TCL_UNICODE */ Py_DECREF(encoded); return result; } @@ -1139,7 +1179,7 @@ FromObj(TkappObject *tkapp, Tcl_Obj *value) Tcl_Interp *interp = Tkapp_Interp(tkapp); if (value->typePtr == NULL) { - return unicodeFromTclObj(value); + return unicodeFromTclObj(tkapp, value); } if (value->typePtr == tkapp->BooleanType || @@ -1148,7 +1188,7 @@ FromObj(TkappObject *tkapp, Tcl_Obj *value) } if (value->typePtr == tkapp->ByteArrayType) { - int size; + Tcl_Size size; char *data = (char*)Tcl_GetByteArrayFromObj(value, &size); return PyBytes_FromStringAndSize(data, size); } @@ -1174,8 +1214,8 @@ FromObj(TkappObject *tkapp, Tcl_Obj *value) } if (value->typePtr == tkapp->ListType) { - int size; - int i, status; + Tcl_Size i, size; + int status; PyObject *elem; Tcl_Obj *tcl_elem; @@ -1204,7 +1244,7 @@ FromObj(TkappObject *tkapp, Tcl_Obj *value) if (value->typePtr == tkapp->StringType || value->typePtr == tkapp->UTF32StringType) { - return unicodeFromTclObj(value); + return unicodeFromTclObj(tkapp, value); } if (tkapp->BignumType == NULL && @@ -1231,9 +1271,9 @@ typedef struct Tkapp_CallEvent { } Tkapp_CallEvent; static void -Tkapp_CallDeallocArgs(Tcl_Obj** objv, Tcl_Obj** objStore, int objc) +Tkapp_CallDeallocArgs(Tcl_Obj** objv, Tcl_Obj** objStore, Tcl_Size objc) { - int i; + Tcl_Size i; for (i = 0; i < objc; i++) Tcl_DecrRefCount(objv[i]); if (objv != objStore) @@ -1244,7 +1284,7 @@ Tkapp_CallDeallocArgs(Tcl_Obj** objv, Tcl_Obj** objStore, int objc) interpreter thread, which may or may not be the calling thread. */ static Tcl_Obj** -Tkapp_CallArgs(PyObject *args, Tcl_Obj** objStore, int *pobjc) +Tkapp_CallArgs(PyObject *args, Tcl_Obj** objStore, Tcl_Size *pobjc) { Tcl_Obj **objv = objStore; Py_ssize_t objc = 0, i; @@ -1292,10 +1332,10 @@ Tkapp_CallArgs(PyObject *args, Tcl_Obj** objStore, int *pobjc) Tcl_IncrRefCount(objv[i]); } } - *pobjc = (int)objc; + *pobjc = (Tcl_Size)objc; return objv; finally: - Tkapp_CallDeallocArgs(objv, objStore, (int)objc); + Tkapp_CallDeallocArgs(objv, objStore, (Tcl_Size)objc); return NULL; } @@ -1304,7 +1344,7 @@ Tkapp_CallArgs(PyObject *args, Tcl_Obj** objStore, int *pobjc) static PyObject * Tkapp_UnicodeResult(TkappObject *self) { - return unicodeFromTclObj(Tcl_GetObjResult(self->interp)); + return unicodeFromTclObj(self, Tcl_GetObjResult(self->interp)); } @@ -1323,7 +1363,7 @@ Tkapp_ObjectResult(TkappObject *self) res = FromObj(self, value); Tcl_DecrRefCount(value); } else { - res = unicodeFromTclObj(value); + res = unicodeFromTclObj(self, value); } return res; } @@ -1361,7 +1401,7 @@ Tkapp_CallProc(Tkapp_CallEvent *e, int flags) { Tcl_Obj *objStore[ARGSZ]; Tcl_Obj **objv; - int objc; + Tcl_Size objc; int i; ENTER_PYTHON if (e->self->trace && !Tkapp_Trace(e->self, PyTuple_Pack(1, e->args))) { @@ -1417,7 +1457,7 @@ Tkapp_Call(PyObject *selfptr, PyObject *args) { Tcl_Obj *objStore[ARGSZ]; Tcl_Obj **objv = NULL; - int objc, i; + Tcl_Size objc; PyObject *res = NULL; TkappObject *self = (TkappObject*)selfptr; int flags = TCL_EVAL_DIRECT | TCL_EVAL_GLOBAL; @@ -1464,6 +1504,7 @@ Tkapp_Call(PyObject *selfptr, PyObject *args) { TRACE(self, ("(O)", args)); + int i; objv = Tkapp_CallArgs(args, objStore, &objc); if (!objv) return NULL; @@ -1852,7 +1893,7 @@ GetVar(TkappObject *self, PyObject *args, int flags) res = FromObj(self, tres); } else { - res = unicodeFromTclObj(tres); + res = unicodeFromTclObj(self, tres); } } LEAVE_OVERLAP_TCL @@ -2197,13 +2238,12 @@ _tkinter_tkapp_splitlist(TkappObject *self, PyObject *arg) /*[clinic end generated code: output=13b51d34386d36fb input=2b2e13351e3c0b53]*/ { char *list; - int argc; + Tcl_Size argc, i; const char **argv; PyObject *v; - int i; if (PyTclObject_Check(arg)) { - int objc; + Tcl_Size objc; Tcl_Obj **objv; if (Tcl_ListObjGetElements(Tkapp_Interp(self), ((PyTclObject*)arg)->value, @@ -2298,7 +2338,7 @@ PythonCmd(ClientData clientData, Tcl_Interp *interp, return PythonCmd_Error(interp); for (i = 0; i < (objc - 1); i++) { - PyObject *s = unicodeFromTclObj(objv[i + 1]); + PyObject *s = unicodeFromTclObj((TkappObject *)data->self, objv[i + 1]); if (!s) { Py_DECREF(args); return PythonCmd_Error(interp); diff --git a/Modules/_winapi.c b/Modules/_winapi.c index edb11818..76f18c71 100644 --- a/Modules/_winapi.c +++ b/Modules/_winapi.c @@ -2268,7 +2268,7 @@ _winapi__mimetypes_read_windows_registry_impl(PyObject *module, } err = RegOpenKeyExW(hkcr, ext, 0, KEY_READ, &subkey); - if (err == ERROR_FILE_NOT_FOUND) { + if (err == ERROR_FILE_NOT_FOUND || err == ERROR_ACCESS_DENIED) { err = ERROR_SUCCESS; continue; } else if (err != ERROR_SUCCESS) { diff --git a/Modules/_xxtestfuzz/README.rst b/Modules/_xxtestfuzz/README.rst index 42bd02a0..27c44f7b 100644 --- a/Modules/_xxtestfuzz/README.rst +++ b/Modules/_xxtestfuzz/README.rst @@ -20,7 +20,7 @@ Add the test name on a new line in ``fuzz_tests.txt``. In ``fuzzer.c``, add a function to be run:: - int $test_name (const char* data, size_t size) { + static int $fuzz_test_name(const char* data, size_t size) { ... return 0; } @@ -28,10 +28,12 @@ In ``fuzzer.c``, add a function to be run:: And invoke it from ``LLVMFuzzerTestOneInput``:: - #if _Py_FUZZ_YES(fuzz_builtin_float) - rv |= _run_fuzz(data, size, fuzz_builtin_float); + #if !defined(_Py_FUZZ_ONE) || defined(_Py_FUZZ_$fuzz_test_name) + rv |= _run_fuzz(data, size, $fuzz_test_name); #endif +Don't forget to replace ``$fuzz_test_name`` with your actual test name. + ``LLVMFuzzerTestOneInput`` will run in oss-fuzz, with each test in ``fuzz_tests.txt`` run separately. diff --git a/Modules/_zoneinfo.c b/Modules/_zoneinfo.c index 8fc86162..47e40125 100644 --- a/Modules/_zoneinfo.c +++ b/Modules/_zoneinfo.c @@ -954,6 +954,7 @@ ttinfo_eq(const _ttinfo *const tti0, const _ttinfo *const tti1) static int load_data(zoneinfo_state *state, PyZoneInfo_ZoneInfo *self, PyObject *file_obj) { + int rv = 0; PyObject *data_tuple = NULL; long *utcoff = NULL; @@ -1230,7 +1231,6 @@ load_data(zoneinfo_state *state, PyZoneInfo_ZoneInfo *self, PyObject *file_obj) } } - int rv = 0; goto cleanup; error: // These resources only need to be freed if we have failed, if we succeed diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index 19ee83d2..d24c5989 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -2739,7 +2739,7 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds) PyDoc_STRVAR(module_doc, "This module defines an object type which can efficiently represent\n\ -an array of basic values: characters, integers, floating point\n\ +an array of basic values: characters, integers, floating-point\n\ numbers. Arrays are sequence types and behave very much like lists,\n\ except that the type of objects stored in them is constrained.\n"); @@ -2767,8 +2767,8 @@ The following type codes are defined:\n\ 'L' unsigned integer 4\n\ 'q' signed integer 8 (see note)\n\ 'Q' unsigned integer 8 (see note)\n\ - 'f' floating point 4\n\ - 'd' floating point 8\n\ + 'f' floating-point 4\n\ + 'd' floating-point 8\n\ \n\ NOTE: The 'u' typecode corresponds to Python's unicode character. On\n\ narrow builds this is 2-bytes on wide builds this is 4-bytes.\n\ diff --git a/Modules/clinic/_bisectmodule.c.h b/Modules/clinic/_bisectmodule.c.h index 7944f521..cfd1c984 100644 --- a/Modules/clinic/_bisectmodule.c.h +++ b/Modules/clinic/_bisectmodule.c.h @@ -43,7 +43,7 @@ _bisect_bisect_right(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(a), &_Py_ID(x), &_Py_ID(lo), &_Py_ID(hi), &_Py_ID(key), }, + .ob_item = { _Py_LATIN1_CHR('a'), _Py_LATIN1_CHR('x'), &_Py_ID(lo), &_Py_ID(hi), &_Py_ID(key), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -151,7 +151,7 @@ _bisect_insort_right(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(a), &_Py_ID(x), &_Py_ID(lo), &_Py_ID(hi), &_Py_ID(key), }, + .ob_item = { _Py_LATIN1_CHR('a'), _Py_LATIN1_CHR('x'), &_Py_ID(lo), &_Py_ID(hi), &_Py_ID(key), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -256,7 +256,7 @@ _bisect_bisect_left(PyObject *module, PyObject *const *args, Py_ssize_t nargs, P PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(a), &_Py_ID(x), &_Py_ID(lo), &_Py_ID(hi), &_Py_ID(key), }, + .ob_item = { _Py_LATIN1_CHR('a'), _Py_LATIN1_CHR('x'), &_Py_ID(lo), &_Py_ID(hi), &_Py_ID(key), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -364,7 +364,7 @@ _bisect_insort_left(PyObject *module, PyObject *const *args, Py_ssize_t nargs, P PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(a), &_Py_ID(x), &_Py_ID(lo), &_Py_ID(hi), &_Py_ID(key), }, + .ob_item = { _Py_LATIN1_CHR('a'), _Py_LATIN1_CHR('x'), &_Py_ID(lo), &_Py_ID(hi), &_Py_ID(key), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -433,4 +433,4 @@ _bisect_insort_left(PyObject *module, PyObject *const *args, Py_ssize_t nargs, P exit: return return_value; } -/*[clinic end generated code: output=5a7fa64bf9b262f3 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=57335e39ce2bf80e input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_cursesmodule.c.h b/Modules/clinic/_cursesmodule.c.h index 9d99d41a..1d716bec 100644 --- a/Modules/clinic/_cursesmodule.c.h +++ b/Modules/clinic/_cursesmodule.c.h @@ -3688,25 +3688,55 @@ PyDoc_STRVAR(_curses_resizeterm__doc__, {"resizeterm", _PyCFunction_CAST(_curses_resizeterm), METH_FASTCALL, _curses_resizeterm__doc__}, static PyObject * -_curses_resizeterm_impl(PyObject *module, int nlines, int ncols); +_curses_resizeterm_impl(PyObject *module, short nlines, short ncols); static PyObject * _curses_resizeterm(PyObject *module, PyObject *const *args, Py_ssize_t nargs) { PyObject *return_value = NULL; - int nlines; - int ncols; + short nlines; + short ncols; if (!_PyArg_CheckPositional("resizeterm", nargs, 2, 2)) { goto exit; } - nlines = _PyLong_AsInt(args[0]); - if (nlines == -1 && PyErr_Occurred()) { - goto exit; + { + long ival = PyLong_AsLong(args[0]); + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + else if (ival < SHRT_MIN) { + PyErr_SetString(PyExc_OverflowError, + "signed short integer is less than minimum"); + goto exit; + } + else if (ival > SHRT_MAX) { + PyErr_SetString(PyExc_OverflowError, + "signed short integer is greater than maximum"); + goto exit; + } + else { + nlines = (short) ival; + } } - ncols = _PyLong_AsInt(args[1]); - if (ncols == -1 && PyErr_Occurred()) { - goto exit; + { + long ival = PyLong_AsLong(args[1]); + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + else if (ival < SHRT_MIN) { + PyErr_SetString(PyExc_OverflowError, + "signed short integer is less than minimum"); + goto exit; + } + else if (ival > SHRT_MAX) { + PyErr_SetString(PyExc_OverflowError, + "signed short integer is greater than maximum"); + goto exit; + } + else { + ncols = (short) ival; + } } return_value = _curses_resizeterm_impl(module, nlines, ncols); @@ -3739,25 +3769,55 @@ PyDoc_STRVAR(_curses_resize_term__doc__, {"resize_term", _PyCFunction_CAST(_curses_resize_term), METH_FASTCALL, _curses_resize_term__doc__}, static PyObject * -_curses_resize_term_impl(PyObject *module, int nlines, int ncols); +_curses_resize_term_impl(PyObject *module, short nlines, short ncols); static PyObject * _curses_resize_term(PyObject *module, PyObject *const *args, Py_ssize_t nargs) { PyObject *return_value = NULL; - int nlines; - int ncols; + short nlines; + short ncols; if (!_PyArg_CheckPositional("resize_term", nargs, 2, 2)) { goto exit; } - nlines = _PyLong_AsInt(args[0]); - if (nlines == -1 && PyErr_Occurred()) { - goto exit; + { + long ival = PyLong_AsLong(args[0]); + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + else if (ival < SHRT_MIN) { + PyErr_SetString(PyExc_OverflowError, + "signed short integer is less than minimum"); + goto exit; + } + else if (ival > SHRT_MAX) { + PyErr_SetString(PyExc_OverflowError, + "signed short integer is greater than maximum"); + goto exit; + } + else { + nlines = (short) ival; + } } - ncols = _PyLong_AsInt(args[1]); - if (ncols == -1 && PyErr_Occurred()) { - goto exit; + { + long ival = PyLong_AsLong(args[1]); + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + else if (ival < SHRT_MIN) { + PyErr_SetString(PyExc_OverflowError, + "signed short integer is less than minimum"); + goto exit; + } + else if (ival > SHRT_MAX) { + PyErr_SetString(PyExc_OverflowError, + "signed short integer is greater than maximum"); + goto exit; + } + else { + ncols = (short) ival; + } } return_value = _curses_resize_term_impl(module, nlines, ncols); @@ -4313,4 +4373,4 @@ _curses_has_extended_color_support(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=27a2364193b503c1 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=764ee4c154c6d4a8 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_hashopenssl.c.h b/Modules/clinic/_hashopenssl.c.h index fb61a444..84e23462 100644 --- a/Modules/clinic/_hashopenssl.c.h +++ b/Modules/clinic/_hashopenssl.c.h @@ -1354,7 +1354,7 @@ _hashlib_scrypt(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(password), &_Py_ID(salt), &_Py_ID(n), &_Py_ID(r), &_Py_ID(p), &_Py_ID(maxmem), &_Py_ID(dklen), }, + .ob_item = { &_Py_ID(password), &_Py_ID(salt), _Py_LATIN1_CHR('n'), _Py_LATIN1_CHR('r'), _Py_LATIN1_CHR('p'), &_Py_ID(maxmem), &_Py_ID(dklen), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -1851,4 +1851,4 @@ _hashlib_compare_digest(PyObject *module, PyObject *const *args, Py_ssize_t narg #ifndef _HASHLIB_SCRYPT_METHODDEF #define _HASHLIB_SCRYPT_METHODDEF #endif /* !defined(_HASHLIB_SCRYPT_METHODDEF) */ -/*[clinic end generated code: output=b339e255db698147 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=4734184f6555dc95 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_testclinic.c.h b/Modules/clinic/_testclinic.c.h index 3fce2624..31a366df 100644 --- a/Modules/clinic/_testclinic.c.h +++ b/Modules/clinic/_testclinic.c.h @@ -1263,7 +1263,7 @@ keywords(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kw PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(a), &_Py_ID(b), }, + .ob_item = { _Py_LATIN1_CHR('a'), _Py_LATIN1_CHR('b'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -1319,7 +1319,7 @@ keywords_kwonly(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(a), &_Py_ID(b), }, + .ob_item = { _Py_LATIN1_CHR('a'), _Py_LATIN1_CHR('b'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -1375,7 +1375,7 @@ keywords_opt(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(a), &_Py_ID(b), &_Py_ID(c), }, + .ob_item = { _Py_LATIN1_CHR('a'), _Py_LATIN1_CHR('b'), _Py_LATIN1_CHR('c'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -1444,7 +1444,7 @@ keywords_opt_kwonly(PyObject *module, PyObject *const *args, Py_ssize_t nargs, P PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(a), &_Py_ID(b), &_Py_ID(c), &_Py_ID(d), }, + .ob_item = { _Py_LATIN1_CHR('a'), _Py_LATIN1_CHR('b'), _Py_LATIN1_CHR('c'), _Py_LATIN1_CHR('d'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -1524,7 +1524,7 @@ keywords_kwonly_opt(PyObject *module, PyObject *const *args, Py_ssize_t nargs, P PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(a), &_Py_ID(b), &_Py_ID(c), }, + .ob_item = { _Py_LATIN1_CHR('a'), _Py_LATIN1_CHR('b'), _Py_LATIN1_CHR('c'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -1592,7 +1592,7 @@ posonly_keywords(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyOb PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(b), }, + .ob_item = { _Py_LATIN1_CHR('b'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -1648,7 +1648,7 @@ posonly_kwonly(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(b), }, + .ob_item = { _Py_LATIN1_CHR('b'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -1705,7 +1705,7 @@ posonly_keywords_kwonly(PyObject *module, PyObject *const *args, Py_ssize_t narg PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(b), &_Py_ID(c), }, + .ob_item = { _Py_LATIN1_CHR('b'), _Py_LATIN1_CHR('c'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -1764,7 +1764,7 @@ posonly_keywords_opt(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(b), &_Py_ID(c), &_Py_ID(d), }, + .ob_item = { _Py_LATIN1_CHR('b'), _Py_LATIN1_CHR('c'), _Py_LATIN1_CHR('d'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -1835,7 +1835,7 @@ posonly_opt_keywords_opt(PyObject *module, PyObject *const *args, Py_ssize_t nar PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(c), &_Py_ID(d), }, + .ob_item = { _Py_LATIN1_CHR('c'), _Py_LATIN1_CHR('d'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -1911,7 +1911,7 @@ posonly_kwonly_opt(PyObject *module, PyObject *const *args, Py_ssize_t nargs, Py PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(b), &_Py_ID(c), &_Py_ID(d), }, + .ob_item = { _Py_LATIN1_CHR('b'), _Py_LATIN1_CHR('c'), _Py_LATIN1_CHR('d'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -1982,7 +1982,7 @@ posonly_opt_kwonly_opt(PyObject *module, PyObject *const *args, Py_ssize_t nargs PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(c), &_Py_ID(d), }, + .ob_item = { _Py_LATIN1_CHR('c'), _Py_LATIN1_CHR('d'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -2058,7 +2058,7 @@ posonly_keywords_kwonly_opt(PyObject *module, PyObject *const *args, Py_ssize_t PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(b), &_Py_ID(c), &_Py_ID(d), &_Py_ID(e), }, + .ob_item = { _Py_LATIN1_CHR('b'), _Py_LATIN1_CHR('c'), _Py_LATIN1_CHR('d'), _Py_LATIN1_CHR('e'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -2133,7 +2133,7 @@ posonly_keywords_opt_kwonly_opt(PyObject *module, PyObject *const *args, Py_ssiz PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(b), &_Py_ID(c), &_Py_ID(d), &_Py_ID(e), }, + .ob_item = { _Py_LATIN1_CHR('b'), _Py_LATIN1_CHR('c'), _Py_LATIN1_CHR('d'), _Py_LATIN1_CHR('e'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -2217,7 +2217,7 @@ posonly_opt_keywords_opt_kwonly_opt(PyObject *module, PyObject *const *args, Py_ PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(c), &_Py_ID(d), }, + .ob_item = { _Py_LATIN1_CHR('c'), _Py_LATIN1_CHR('d'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -2296,7 +2296,7 @@ keyword_only_parameter(PyObject *module, PyObject *const *args, Py_ssize_t nargs PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(a), }, + .ob_item = { _Py_LATIN1_CHR('a'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -2351,7 +2351,7 @@ posonly_vararg(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(b), }, + .ob_item = { _Py_LATIN1_CHR('b'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -2446,7 +2446,7 @@ vararg(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwna PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(a), }, + .ob_item = { _Py_LATIN1_CHR('a'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -2504,7 +2504,7 @@ vararg_with_default(PyObject *module, PyObject *const *args, Py_ssize_t nargs, P PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(a), &_Py_ID(b), }, + .ob_item = { _Py_LATIN1_CHR('a'), _Py_LATIN1_CHR('b'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -2547,6 +2547,78 @@ vararg_with_default(PyObject *module, PyObject *const *args, Py_ssize_t nargs, P return return_value; } +PyDoc_STRVAR(vararg_with_default2__doc__, +"vararg_with_default2($module, /, a, *args, b=None, c=None)\n" +"--\n" +"\n"); + +#define VARARG_WITH_DEFAULT2_METHODDEF \ + {"vararg_with_default2", _PyCFunction_CAST(vararg_with_default2), METH_FASTCALL|METH_KEYWORDS, vararg_with_default2__doc__}, + +static PyObject * +vararg_with_default2_impl(PyObject *module, PyObject *a, PyObject *args, + PyObject *b, PyObject *c); + +static PyObject * +vararg_with_default2(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) + + #define NUM_KEYWORDS 3 + static struct { + PyGC_Head _this_is_not_used; + PyObject_VAR_HEAD + PyObject *ob_item[NUM_KEYWORDS]; + } _kwtuple = { + .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) + .ob_item = { _Py_LATIN1_CHR('a'), _Py_LATIN1_CHR('b'), _Py_LATIN1_CHR('c'), }, + }; + #undef NUM_KEYWORDS + #define KWTUPLE (&_kwtuple.ob_base.ob_base) + + #else // !Py_BUILD_CORE + # define KWTUPLE NULL + #endif // !Py_BUILD_CORE + + static const char * const _keywords[] = {"a", "b", "c", NULL}; + static _PyArg_Parser _parser = { + .keywords = _keywords, + .fname = "vararg_with_default2", + .kwtuple = KWTUPLE, + }; + #undef KWTUPLE + PyObject *argsbuf[4]; + Py_ssize_t noptargs = Py_MIN(nargs, 1) + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; + PyObject *a; + PyObject *__clinic_args = NULL; + PyObject *b = Py_None; + PyObject *c = Py_None; + + args = _PyArg_UnpackKeywordsWithVararg(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, 1, argsbuf); + if (!args) { + goto exit; + } + a = args[0]; + __clinic_args = args[1]; + if (!noptargs) { + goto skip_optional_kwonly; + } + if (args[2]) { + b = args[2]; + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + c = args[3]; +skip_optional_kwonly: + return_value = vararg_with_default2_impl(module, a, __clinic_args, b, c); + +exit: + Py_XDECREF(__clinic_args); + return return_value; +} + PyDoc_STRVAR(vararg_with_only_defaults__doc__, "vararg_with_only_defaults($module, /, *args, b=None)\n" "--\n" @@ -2571,7 +2643,7 @@ vararg_with_only_defaults(PyObject *module, PyObject *const *args, Py_ssize_t na PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(b), }, + .ob_item = { _Py_LATIN1_CHR('b'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -3097,4 +3169,4 @@ _testclinic_TestClass_meth_method_no_params(PyObject *self, PyTypeObject *cls, P } return _testclinic_TestClass_meth_method_no_params_impl(self, cls); } -/*[clinic end generated code: output=999de26ba394ab5d input=a9049054013a1b77]*/ +/*[clinic end generated code: output=74fdd265fd402226 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_testmultiphase.c.h b/Modules/clinic/_testmultiphase.c.h index 4f2b1bcf..c63f9e32 100644 --- a/Modules/clinic/_testmultiphase.c.h +++ b/Modules/clinic/_testmultiphase.c.h @@ -88,7 +88,7 @@ _testmultiphase_StateAccessType_increment_count_clinic(StateAccessTypeObject *se PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(n), &_Py_ID(twice), }, + .ob_item = { _Py_LATIN1_CHR('n'), &_Py_ID(twice), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -162,4 +162,4 @@ _testmultiphase_StateAccessType_get_count(StateAccessTypeObject *self, PyTypeObj } return _testmultiphase_StateAccessType_get_count_impl(self, cls); } -/*[clinic end generated code: output=2193fe33d5e2b739 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=0543b54ec62be171 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/cmathmodule.c.h b/Modules/clinic/cmathmodule.c.h index 941448e7..f018d901 100644 --- a/Modules/clinic/cmathmodule.c.h +++ b/Modules/clinic/cmathmodule.c.h @@ -908,7 +908,7 @@ cmath_isclose(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObjec PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(a), &_Py_ID(b), &_Py_ID(rel_tol), &_Py_ID(abs_tol), }, + .ob_item = { _Py_LATIN1_CHR('a'), _Py_LATIN1_CHR('b'), &_Py_ID(rel_tol), &_Py_ID(abs_tol), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -982,4 +982,4 @@ cmath_isclose(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObjec exit: return return_value; } -/*[clinic end generated code: output=87f609786ef270cd input=a9049054013a1b77]*/ +/*[clinic end generated code: output=a6c9ca48ffe871b6 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/itertoolsmodule.c.h b/Modules/clinic/itertoolsmodule.c.h index 32278bf7..51c766f0 100644 --- a/Modules/clinic/itertoolsmodule.c.h +++ b/Modules/clinic/itertoolsmodule.c.h @@ -42,7 +42,7 @@ batched_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(iterable), &_Py_ID(n), }, + .ob_item = { &_Py_ID(iterable), _Py_LATIN1_CHR('n'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -494,7 +494,7 @@ itertools_combinations(PyTypeObject *type, PyObject *args, PyObject *kwargs) PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(iterable), &_Py_ID(r), }, + .ob_item = { &_Py_ID(iterable), _Py_LATIN1_CHR('r'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -565,7 +565,7 @@ itertools_combinations_with_replacement(PyTypeObject *type, PyObject *args, PyOb PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(iterable), &_Py_ID(r), }, + .ob_item = { &_Py_ID(iterable), _Py_LATIN1_CHR('r'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -635,7 +635,7 @@ itertools_permutations(PyTypeObject *type, PyObject *args, PyObject *kwargs) PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(iterable), &_Py_ID(r), }, + .ob_item = { &_Py_ID(iterable), _Py_LATIN1_CHR('r'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -913,4 +913,4 @@ itertools_count(PyTypeObject *type, PyObject *args, PyObject *kwargs) exit: return return_value; } -/*[clinic end generated code: output=111cbd102c2a23c9 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=55a83cfda62afb57 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/mathmodule.c.h b/Modules/clinic/mathmodule.c.h index c16c1b08..97c16a43 100644 --- a/Modules/clinic/mathmodule.c.h +++ b/Modules/clinic/mathmodule.c.h @@ -34,9 +34,9 @@ PyDoc_STRVAR(math_fsum__doc__, "fsum($module, seq, /)\n" "--\n" "\n" -"Return an accurate floating point sum of values in the iterable seq.\n" +"Return an accurate floating-point sum of values in the iterable seq.\n" "\n" -"Assumes IEEE-754 floating point arithmetic."); +"Assumes IEEE-754 floating-point arithmetic."); #define MATH_FSUM_METHODDEF \ {"fsum", (PyCFunction)math_fsum, METH_O, math_fsum__doc__}, @@ -549,7 +549,7 @@ PyDoc_STRVAR(math_isclose__doc__, "isclose($module, /, a, b, *, rel_tol=1e-09, abs_tol=0.0)\n" "--\n" "\n" -"Determine whether two floating point numbers are close in value.\n" +"Determine whether two floating-point numbers are close in value.\n" "\n" " rel_tol\n" " maximum difference for being considered \"close\", relative to the\n" @@ -587,7 +587,7 @@ math_isclose(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(a), &_Py_ID(b), &_Py_ID(rel_tol), &_Py_ID(abs_tol), }, + .ob_item = { _Py_LATIN1_CHR('a'), _Py_LATIN1_CHR('b'), &_Py_ID(rel_tol), &_Py_ID(abs_tol), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -950,4 +950,4 @@ math_ulp(PyObject *module, PyObject *arg) exit: return return_value; } -/*[clinic end generated code: output=91a0357265a2a553 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=c1335a499389a04e input=a9049054013a1b77]*/ diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index 02cb95a6..a33461dc 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -1975,25 +1975,55 @@ os__path_splitroot(PyObject *module, PyObject *const *args, Py_ssize_t nargs, Py #if defined(MS_WINDOWS) PyDoc_STRVAR(os__path_exists__doc__, -"_path_exists($module, path, /)\n" +"_path_exists($module, /, path)\n" "--\n" "\n" "Test whether a path exists. Returns False for broken symbolic links."); #define OS__PATH_EXISTS_METHODDEF \ - {"_path_exists", (PyCFunction)os__path_exists, METH_O, os__path_exists__doc__}, + {"_path_exists", _PyCFunction_CAST(os__path_exists), METH_FASTCALL|METH_KEYWORDS, os__path_exists__doc__}, static int os__path_exists_impl(PyObject *module, path_t *path); static PyObject * -os__path_exists(PyObject *module, PyObject *arg) +os__path_exists(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; + #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) + + #define NUM_KEYWORDS 1 + static struct { + PyGC_Head _this_is_not_used; + PyObject_VAR_HEAD + PyObject *ob_item[NUM_KEYWORDS]; + } _kwtuple = { + .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) + .ob_item = { &_Py_ID(path), }, + }; + #undef NUM_KEYWORDS + #define KWTUPLE (&_kwtuple.ob_base.ob_base) + + #else // !Py_BUILD_CORE + # define KWTUPLE NULL + #endif // !Py_BUILD_CORE + + static const char * const _keywords[] = {"path", NULL}; + static _PyArg_Parser _parser = { + .keywords = _keywords, + .fname = "_path_exists", + .kwtuple = KWTUPLE, + }; + #undef KWTUPLE + PyObject *argsbuf[1]; path_t path = PATH_T_INITIALIZE_P("_path_exists", "path", 0, 0, 1, 1); int _return_value; - if (!path_converter(arg, &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__path_exists_impl(module, &path); @@ -2038,7 +2068,7 @@ os__path_isdir(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(s), }, + .ob_item = { _Py_LATIN1_CHR('s'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -5985,7 +6015,7 @@ PyDoc_STRVAR(os_times__doc__, "\n" "The object returned behaves like a named tuple with these fields:\n" " (utime, stime, cutime, cstime, elapsed_time)\n" -"All fields are floating point numbers."); +"All fields are floating-point numbers."); #define OS_TIMES_METHODDEF \ {"times", (PyCFunction)os_times, METH_NOARGS, os_times__doc__}, @@ -12002,4 +12032,4 @@ os_waitstatus_to_exitcode(PyObject *module, PyObject *const *args, Py_ssize_t na #ifndef OS_WAITSTATUS_TO_EXITCODE_METHODDEF #define OS_WAITSTATUS_TO_EXITCODE_METHODDEF #endif /* !defined(OS_WAITSTATUS_TO_EXITCODE_METHODDEF) */ -/*[clinic end generated code: output=e2cf3ab750346780 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=6d34c4564aca7725 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/selectmodule.c.h b/Modules/clinic/selectmodule.c.h index f44ca1d7..086fab5b 100644 --- a/Modules/clinic/selectmodule.c.h +++ b/Modules/clinic/selectmodule.c.h @@ -24,7 +24,7 @@ PyDoc_STRVAR(select_select__doc__, "gotten from a fileno() method call on one of those.\n" "\n" "The optional 4th argument specifies a timeout in seconds; it may be\n" -"a floating point number to specify fractions of seconds. If it is absent\n" +"a floating-point number to specify fractions of seconds. If it is absent\n" "or None, the call will never time out.\n" "\n" "The return value is a tuple of three lists corresponding to the first three\n" @@ -1309,4 +1309,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=64516114287e894d input=a9049054013a1b77]*/ +/*[clinic end generated code: output=4d031b2402ee40e7 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/signalmodule.c.h b/Modules/clinic/signalmodule.c.h index 3b3c6ba1..7206298c 100644 --- a/Modules/clinic/signalmodule.c.h +++ b/Modules/clinic/signalmodule.c.h @@ -526,7 +526,7 @@ PyDoc_STRVAR(signal_sigtimedwait__doc__, "\n" "Like sigwaitinfo(), but with a timeout.\n" "\n" -"The timeout is specified in seconds, with floating point numbers allowed."); +"The timeout is specified in seconds, with floating-point numbers allowed."); #define SIGNAL_SIGTIMEDWAIT_METHODDEF \ {"sigtimedwait", _PyCFunction_CAST(signal_sigtimedwait), METH_FASTCALL, signal_sigtimedwait__doc__}, @@ -705,4 +705,4 @@ signal_pidfd_send_signal(PyObject *module, PyObject *const *args, Py_ssize_t nar #ifndef SIGNAL_PIDFD_SEND_SIGNAL_METHODDEF #define SIGNAL_PIDFD_SEND_SIGNAL_METHODDEF #endif /* !defined(SIGNAL_PIDFD_SEND_SIGNAL_METHODDEF) */ -/*[clinic end generated code: output=2b54dc607f6e3146 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=29cc8fb029d04c97 input=a9049054013a1b77]*/ diff --git a/Modules/expat/expat.h b/Modules/expat/expat.h index c2770be3..523b37d8 100644 --- a/Modules/expat/expat.h +++ b/Modules/expat/expat.h @@ -130,7 +130,9 @@ enum XML_Error { /* Added in 2.3.0. */ XML_ERROR_NO_BUFFER, /* Added in 2.4.0. */ - XML_ERROR_AMPLIFICATION_LIMIT_BREACH + XML_ERROR_AMPLIFICATION_LIMIT_BREACH, + /* Added in 2.6.4. */ + XML_ERROR_NOT_STARTED, }; enum XML_Content_Type { @@ -1066,7 +1068,7 @@ XML_SetReparseDeferralEnabled(XML_Parser parser, XML_Bool enabled); */ #define XML_MAJOR_VERSION 2 #define XML_MINOR_VERSION 6 -#define XML_MICRO_VERSION 2 +#define XML_MICRO_VERSION 4 #ifdef __cplusplus } diff --git a/Modules/expat/expat_external.h b/Modules/expat/expat_external.h index 12c560e1..567872b0 100644 --- a/Modules/expat/expat_external.h +++ b/Modules/expat/expat_external.h @@ -40,6 +40,10 @@ #ifndef Expat_External_INCLUDED #define Expat_External_INCLUDED 1 +/* Namespace external symbols to allow multiple libexpat version to + co-exist. */ +#include "pyexpatns.h" + /* External API definitions */ /* Expat tries very hard to make the API boundary very specifically @@ -64,11 +68,6 @@ compiled with the cdecl calling convention as the default since system headers may assume the cdecl convention. */ - -/* Namespace external symbols to allow multiple libexpat version to - co-exist. */ -#include "pyexpatns.h" - #ifndef XMLCALL # if defined(_MSC_VER) # define XMLCALL __cdecl diff --git a/Modules/expat/refresh.sh b/Modules/expat/refresh.sh new file mode 100755 index 00000000..82a9dbc2 --- /dev/null +++ b/Modules/expat/refresh.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env bash +# +# Use this script to update libexpat + +set -e +set -o pipefail + +if [[ "${BASH_VERSINFO[0]}" -lt 4 ]]; then + echo "A bash version >= 4 required. Got: $BASH_VERSION" >&2 + exit 1 +fi + +# Update this when updating to a new version after verifying that the changes +# the update brings in are good. These values are used for verifying the SBOM, too. +expected_libexpat_tag="R_2_6_4" +expected_libexpat_version="2.6.4" +expected_libexpat_sha256="fd03b7172b3bd7427a3e7a812063f74754f24542429b634e0db6511b53fb2278" + +expat_dir="$(realpath "$(dirname -- "${BASH_SOURCE[0]}")")" +cd ${expat_dir} + +# Step 1: download and copy files +curl --location "https://github.com/libexpat/libexpat/releases/download/${expected_libexpat_tag}/expat-${expected_libexpat_version}.tar.gz" > libexpat.tar.gz +echo "${expected_libexpat_sha256} libexpat.tar.gz" | sha256sum --check + +# Step 2: Pull files from the libexpat distribution +declare -a lib_files +lib_files=( + ascii.h + asciitab.h + expat.h + expat_external.h + iasciitab.h + internal.h + latin1tab.h + nametab.h + siphash.h + utf8tab.h + winconfig.h + xmlparse.c + xmlrole.c + xmlrole.h + xmltok.c + xmltok.h + xmltok_impl.c + xmltok_impl.h + xmltok_ns.c +) +for f in "${lib_files[@]}"; do + tar xzvf libexpat.tar.gz "expat-${expected_libexpat_version}/lib/${f}" --strip-components 2 +done +rm libexpat.tar.gz + +# Step 3: Add the namespacing include to expat_external.h +sed -i 's/#define Expat_External_INCLUDED 1/&\n\n\/* Namespace external symbols to allow multiple libexpat version to\n co-exist. \*\/\n#include "pyexpatns.h"/' expat_external.h + +echo "Updated; verify all is okay using git diff and git status." diff --git a/Modules/expat/siphash.h b/Modules/expat/siphash.h index a1ed99e6..04f6f745 100644 --- a/Modules/expat/siphash.h +++ b/Modules/expat/siphash.h @@ -126,8 +126,7 @@ | ((uint64_t)((p)[4]) << 32) | ((uint64_t)((p)[5]) << 40) \ | ((uint64_t)((p)[6]) << 48) | ((uint64_t)((p)[7]) << 56)) -#define SIPHASH_INITIALIZER \ - { 0, 0, 0, 0, {0}, 0, 0 } +#define SIPHASH_INITIALIZER {0, 0, 0, 0, {0}, 0, 0} struct siphash { uint64_t v0, v1, v2, v3; diff --git a/Modules/expat/xmlparse.c b/Modules/expat/xmlparse.c index 2951fec7..a4e091e7 100644 --- a/Modules/expat/xmlparse.c +++ b/Modules/expat/xmlparse.c @@ -1,4 +1,4 @@ -/* 2a14271ad4d35e82bde8ba210b4edb7998794bcbae54deab114046a300f9639a (2.6.2+) +/* c5625880f4bf417c1463deee4eb92d86ff413f802048621c57e25fe483eb59e4 (2.6.4+) __ __ _ ___\ \/ /_ __ __ _| |_ / _ \\ /| '_ \ / _` | __| @@ -39,6 +39,8 @@ Copyright (c) 2022 Sean McBride Copyright (c) 2023 Owain Davies Copyright (c) 2023-2024 Sony Corporation / Snild Dolkow + Copyright (c) 2024 Berkay Eren Ürün + Copyright (c) 2024 Hanno Böck Licensed under the MIT license: Permission is hereby granted, free of charge, to any person obtaining @@ -294,7 +296,7 @@ typedef struct { The name of the element is stored in both the document and API encodings. The memory buffer 'buf' is a separately-allocated memory area which stores the name. During the XML_Parse()/ - XMLParseBuffer() when the element is open, the memory for the 'raw' + XML_ParseBuffer() when the element is open, the memory for the 'raw' version of the name (in the document encoding) is shared with the document buffer. If the element is open across calls to XML_Parse()/XML_ParseBuffer(), the buffer is re-allocated to @@ -2038,6 +2040,12 @@ XML_ParseBuffer(XML_Parser parser, int len, int isFinal) { if (parser == NULL) return XML_STATUS_ERROR; + + if (len < 0) { + parser->m_errorCode = XML_ERROR_INVALID_ARGUMENT; + return XML_STATUS_ERROR; + } + switch (parser->m_parsingStatus.parsing) { case XML_SUSPENDED: parser->m_errorCode = XML_ERROR_SUSPENDED; @@ -2227,6 +2235,9 @@ XML_StopParser(XML_Parser parser, XML_Bool resumable) { if (parser == NULL) return XML_STATUS_ERROR; switch (parser->m_parsingStatus.parsing) { + case XML_INITIALIZED: + parser->m_errorCode = XML_ERROR_NOT_STARTED; + return XML_STATUS_ERROR; case XML_SUSPENDED: if (resumable) { parser->m_errorCode = XML_ERROR_SUSPENDED; @@ -2237,7 +2248,7 @@ XML_StopParser(XML_Parser parser, XML_Bool resumable) { case XML_FINISHED: parser->m_errorCode = XML_ERROR_FINISHED; return XML_STATUS_ERROR; - default: + case XML_PARSING: if (resumable) { #ifdef XML_DTD if (parser->m_isParamEntity) { @@ -2248,6 +2259,9 @@ XML_StopParser(XML_Parser parser, XML_Bool resumable) { parser->m_parsingStatus.parsing = XML_SUSPENDED; } else parser->m_parsingStatus.parsing = XML_FINISHED; + break; + default: + assert(0); } return XML_STATUS_OK; } @@ -2512,6 +2526,9 @@ XML_ErrorString(enum XML_Error code) { case XML_ERROR_AMPLIFICATION_LIMIT_BREACH: return XML_L( "limit on input amplification factor (from DTD and entities) breached"); + /* Added in 2.6.4. */ + case XML_ERROR_NOT_STARTED: + return XML_L("parser not started"); } return NULL; } @@ -5846,18 +5863,17 @@ processInternalEntity(XML_Parser parser, ENTITY *entity, XML_Bool betweenDecl) { /* Set a safe default value in case 'next' does not get set */ next = textStart; -#ifdef XML_DTD if (entity->is_param) { int tok = XmlPrologTok(parser->m_internalEncoding, textStart, textEnd, &next); result = doProlog(parser, parser->m_internalEncoding, textStart, textEnd, tok, next, &next, XML_FALSE, XML_FALSE, XML_ACCOUNT_ENTITY_EXPANSION); - } else -#endif /* XML_DTD */ + } else { result = doContent(parser, parser->m_tagLevel, parser->m_internalEncoding, textStart, textEnd, &next, XML_FALSE, XML_ACCOUNT_ENTITY_EXPANSION); + } if (result == XML_ERROR_NONE) { if (textEnd != next && parser->m_parsingStatus.parsing == XML_SUSPENDED) { @@ -5894,18 +5910,17 @@ internalEntityProcessor(XML_Parser parser, const char *s, const char *end, /* Set a safe default value in case 'next' does not get set */ next = textStart; -#ifdef XML_DTD if (entity->is_param) { int tok = XmlPrologTok(parser->m_internalEncoding, textStart, textEnd, &next); result = doProlog(parser, parser->m_internalEncoding, textStart, textEnd, tok, next, &next, XML_FALSE, XML_TRUE, XML_ACCOUNT_ENTITY_EXPANSION); - } else -#endif /* XML_DTD */ + } else { result = doContent(parser, openEntity->startTagLevel, parser->m_internalEncoding, textStart, textEnd, &next, XML_FALSE, XML_ACCOUNT_ENTITY_EXPANSION); + } if (result != XML_ERROR_NONE) return result; @@ -5932,7 +5947,6 @@ internalEntityProcessor(XML_Parser parser, const char *s, const char *end, return XML_ERROR_NONE; } -#ifdef XML_DTD if (entity->is_param) { int tok; parser->m_processor = prologProcessor; @@ -5940,9 +5954,7 @@ internalEntityProcessor(XML_Parser parser, const char *s, const char *end, return doProlog(parser, parser->m_encoding, s, end, tok, next, nextPtr, (XML_Bool)! parser->m_parsingStatus.finalBuffer, XML_TRUE, XML_ACCOUNT_DIRECT); - } else -#endif /* XML_DTD */ - { + } else { parser->m_processor = contentProcessor; /* see externalEntityContentProcessor vs contentProcessor */ result = doContent(parser, parser->m_parentParser ? 1 : 0, @@ -7016,6 +7028,16 @@ dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd, if (! newE) return 0; if (oldE->nDefaultAtts) { + /* Detect and prevent integer overflow. + * The preprocessor guard addresses the "always false" warning + * from -Wtype-limits on platforms where + * sizeof(int) < sizeof(size_t), e.g. on x86_64. */ +#if UINT_MAX >= SIZE_MAX + if ((size_t)oldE->nDefaultAtts + > ((size_t)(-1) / sizeof(DEFAULT_ATTRIBUTE))) { + return 0; + } +#endif newE->defaultAtts = ms->malloc_fcn(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE)); if (! newE->defaultAtts) { @@ -7558,6 +7580,15 @@ nextScaffoldPart(XML_Parser parser) { int next; if (! dtd->scaffIndex) { + /* Detect and prevent integer overflow. + * The preprocessor guard addresses the "always false" warning + * from -Wtype-limits on platforms where + * sizeof(unsigned int) < sizeof(size_t), e.g. on x86_64. */ +#if UINT_MAX >= SIZE_MAX + if (parser->m_groupSize > ((size_t)(-1) / sizeof(int))) { + return -1; + } +#endif dtd->scaffIndex = (int *)MALLOC(parser, parser->m_groupSize * sizeof(int)); if (! dtd->scaffIndex) return -1; @@ -7835,7 +7866,7 @@ accountingReportDiff(XML_Parser rootParser, assert(! rootParser->m_parentParser); fprintf(stderr, - " (+" EXPAT_FMT_PTRDIFF_T("6") " bytes %s|%d, xmlparse.c:%d) %*s\"", + " (+" EXPAT_FMT_PTRDIFF_T("6") " bytes %s|%u, xmlparse.c:%d) %*s\"", bytesMore, (account == XML_ACCOUNT_DIRECT) ? "DIR" : "EXP", levelsAwayFromRootParser, source_line, 10, ""); @@ -7948,7 +7979,7 @@ entityTrackingReportStats(XML_Parser rootParser, ENTITY *entity, fprintf( stderr, - "expat: Entities(%p): Count %9d, depth %2d/%2d %*s%s%s; %s length %d (xmlparse.c:%d)\n", + "expat: Entities(%p): Count %9u, depth %2u/%2u %*s%s%s; %s length %d (xmlparse.c:%d)\n", (void *)rootParser, rootParser->m_entity_stats.countEverOpened, rootParser->m_entity_stats.currentDepth, rootParser->m_entity_stats.maximumDepthSeen, diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index da26b7bc..96cc6d8c 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -70,7 +70,7 @@ static fault_handler_t faulthandler_handlers[] = { #ifdef SIGILL {SIGILL, 0, "Illegal instruction", }, #endif - {SIGFPE, 0, "Floating point exception", }, + {SIGFPE, 0, "Floating-point exception", }, {SIGABRT, 0, "Aborted", }, /* define SIGSEGV at the end to make it the default choice if searching the handler fails in faulthandler_fatal_error() */ diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index f8c774cb..e14d9d58 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -2174,6 +2174,13 @@ _PyGC_DumpShutdownStats(PyInterpreterState *interp) } } +static void +finalize_unlink_gc_head(PyGC_Head *gc) { + PyGC_Head *prev = GC_PREV(gc); + PyGC_Head *next = GC_NEXT(gc); + _PyGCHead_SET_NEXT(prev, next); + _PyGCHead_SET_PREV(next, prev); +} void _PyGC_Fini(PyInterpreterState *interp) @@ -2182,9 +2189,25 @@ _PyGC_Fini(PyInterpreterState *interp) Py_CLEAR(gcstate->garbage); Py_CLEAR(gcstate->callbacks); - /* We expect that none of this interpreters objects are shared - with other interpreters. - See https://github.com/python/cpython/issues/90228. */ + /* Prevent a subtle bug that affects sub-interpreters that use basic + * single-phase init extensions (m_size == -1). Those extensions cause objects + * to be shared between interpreters, via the PyDict_Update(mdict, m_copy) call + * in import_find_extension(). + * + * If they are GC objects, their GC head next or prev links could refer to + * the interpreter _gc_runtime_state PyGC_Head nodes. Those nodes go away + * when the interpreter structure is freed and so pointers to them become + * invalid. If those objects are still used by another interpreter and + * UNTRACK is called on them, a crash will happen. We untrack the nodes + * here to avoid that. + * + * This bug was originally fixed when reported as gh-90228. The bug was + * re-introduced in gh-94673. + */ + for (int i = 0; i < NUM_GENERATIONS; i++) { + finalize_unlink_gc_head(&gcstate->generations[i].head); + } + finalize_unlink_gc_head(&gcstate->permanent_generation.head); } /* for debugging */ diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c index d42f9dd0..12708f49 100644 --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -1137,7 +1137,7 @@ itertools_tee_impl(PyObject *module, PyObject *iterable, Py_ssize_t n) /*[clinic end generated code: output=1c64519cd859c2f0 input=c99a1472c425d66d]*/ { Py_ssize_t i; - PyObject *it, *copyable, *copyfunc, *result; + PyObject *it, *to, *result; if (n < 0) { PyErr_SetString(PyExc_ValueError, "n must be >= 0"); @@ -1154,41 +1154,24 @@ itertools_tee_impl(PyObject *module, PyObject *iterable, Py_ssize_t n) return NULL; } - if (_PyObject_LookupAttr(it, &_Py_ID(__copy__), ©func) < 0) { - Py_DECREF(it); + (void)&_Py_ID(__copy__); // Retain a reference to __copy__ + itertools_state *state = get_module_state(module); + to = tee_fromiterable(state, it); + Py_DECREF(it); + if (to == NULL) { Py_DECREF(result); return NULL; } - if (copyfunc != NULL) { - copyable = it; - } - else { - itertools_state *state = get_module_state(module); - copyable = tee_fromiterable(state, it); - Py_DECREF(it); - if (copyable == NULL) { - Py_DECREF(result); - return NULL; - } - copyfunc = PyObject_GetAttr(copyable, &_Py_ID(__copy__)); - if (copyfunc == NULL) { - Py_DECREF(copyable); - Py_DECREF(result); - return NULL; - } - } - PyTuple_SET_ITEM(result, 0, copyable); + PyTuple_SET_ITEM(result, 0, to); for (i = 1; i < n; i++) { - copyable = _PyObject_CallNoArgs(copyfunc); - if (copyable == NULL) { - Py_DECREF(copyfunc); + to = tee_copy((teeobject *)to, NULL); + if (to == NULL) { Py_DECREF(result); return NULL; } - PyTuple_SET_ITEM(result, i, copyable); + PyTuple_SET_ITEM(result, i, to); } - Py_DECREF(copyfunc); return result; } @@ -3998,7 +3981,7 @@ typedef struct { fast_mode: when cnt an integer < PY_SSIZE_T_MAX and no step is specified. - assert(cnt != PY_SSIZE_T_MAX && long_cnt == NULL && long_step==PyLong(1)); + assert(long_cnt == NULL && long_step==PyLong(1)); Advances with: cnt += 1 When count hits Y_SSIZE_T_MAX, switch to slow_mode. @@ -4085,7 +4068,7 @@ itertools_count_impl(PyTypeObject *type, PyObject *long_cnt, else cnt = PY_SSIZE_T_MAX; - assert((cnt != PY_SSIZE_T_MAX && long_cnt == NULL && fast_mode) || + assert((long_cnt == NULL && fast_mode) || (cnt == PY_SSIZE_T_MAX && long_cnt != NULL && !fast_mode)); assert(!fast_mode || (PyLong_Check(long_step) && PyLong_AS_LONG(long_step) == 1)); @@ -4157,7 +4140,7 @@ count_next(countobject *lz) static PyObject * count_repr(countobject *lz) { - if (lz->cnt != PY_SSIZE_T_MAX) + if (lz->long_cnt == NULL) return PyUnicode_FromFormat("%s(%zd)", _PyType_Name(Py_TYPE(lz)), lz->cnt); diff --git a/Modules/main.c b/Modules/main.c index 1b189b45..b602272b 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -540,6 +540,10 @@ pymain_repl(PyConfig *config, int *exitcode) return; } + if (PySys_Audit("cpython.run_stdin", NULL) < 0) { + return; + } + PyCompilerFlags cf = _PyCompilerFlags_INIT; int res = PyRun_AnyFileFlags(stdin, "", &cf); *exitcode = (res != 0); diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index bbd6bd01..d856ff6c 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -106,7 +106,7 @@ typedef struct{ double hi; double lo; } DoubleLength; static DoubleLength dl_fast_sum(double a, double b) { - /* Algorithm 1.1. Compensated summation of two floating point numbers. */ + /* Algorithm 1.1. Compensated summation of two floating-point numbers. */ assert(fabs(a) >= fabs(b)); double x = a + b; double y = (a - x) + b; @@ -1347,14 +1347,14 @@ math.fsum seq: object / -Return an accurate floating point sum of values in the iterable seq. +Return an accurate floating-point sum of values in the iterable seq. -Assumes IEEE-754 floating point arithmetic. +Assumes IEEE-754 floating-point arithmetic. [clinic start generated code]*/ static PyObject * math_fsum(PyObject *module, PyObject *seq) -/*[clinic end generated code: output=ba5c672b87fe34fc input=c51b7d8caf6f6e82]*/ +/*[clinic end generated code: output=ba5c672b87fe34fc input=4506244ded6057dc]*/ { PyObject *item, *iter, *sum = NULL; Py_ssize_t i, j, n = 0, m = NUM_PARTIALS; @@ -2343,6 +2343,15 @@ math_fmod_impl(PyObject *module, double x, double y) return PyFloat_FromDouble(x); errno = 0; r = fmod(x, y); +#ifdef _MSC_VER + /* Windows (e.g. Windows 10 with MSC v.1916) loose sign + for zero result. But C99+ says: "if y is nonzero, the result + has the same sign as x". + */ + if (r == 0.0 && y != 0.0) { + r = copysign(r, x); + } +#endif if (Py_IS_NAN(r)) { if (!Py_IS_NAN(x) && !Py_IS_NAN(y)) errno = EDOM; @@ -2411,7 +2420,7 @@ Since lo**2 is less than 1/2 ulp(csum), we have csum+lo*lo == csum. To minimize loss of information during the accumulation of fractional values, each term has a separate accumulator. This also breaks up sequential dependencies in the inner loop so the CPU can maximize -floating point throughput. [4] On an Apple M1 Max, hypot(*vec) +floating-point throughput. [4] On an Apple M1 Max, hypot(*vec) takes only 3.33 µsec when len(vec) == 1000. The square root differential correction is needed because a @@ -3093,7 +3102,7 @@ math.isclose -> bool maximum difference for being considered "close", regardless of the magnitude of the input values -Determine whether two floating point numbers are close in value. +Determine whether two floating-point numbers are close in value. Return True if a is close in value to b, and False otherwise. @@ -3108,7 +3117,7 @@ only close to themselves. static int math_isclose_impl(PyObject *module, double a, double b, double rel_tol, double abs_tol) -/*[clinic end generated code: output=b73070207511952d input=f28671871ea5bfba]*/ +/*[clinic end generated code: output=b73070207511952d input=12d41764468bfdb8]*/ { double diff = 0.0; diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 9cc53c86..d5298519 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -24,6 +24,7 @@ #include "pycore_object.h" // _PyObject_LookupSpecial() #include "pycore_pystate.h" // _PyInterpreterState_GET() #include "pycore_signal.h" // Py_NSIG +#include "pycore_typeobject.h" // _PyType_AddMethod() #ifdef MS_WINDOWS # include @@ -5209,7 +5210,6 @@ _testFileType(path_t *path, int testedType) os._path_exists -> bool path: path_t(allow_fd=True, suppress_value_error=True) - / Test whether a path exists. Returns False for broken symbolic links. @@ -5217,7 +5217,7 @@ Test whether a path exists. Returns False for broken symbolic links. static int os__path_exists_impl(PyObject *module, path_t *path) -/*[clinic end generated code: output=8da13acf666e16ba input=29198507a6082a57]*/ +/*[clinic end generated code: output=8da13acf666e16ba input=142beabfc66783eb]*/ { return _testFileExists(path, TRUE); } @@ -7579,6 +7579,7 @@ os_register_at_fork_impl(PyObject *module, PyObject *before, } #endif /* HAVE_FORK */ +#if defined(HAVE_FORK1) || defined(HAVE_FORKPTY) || defined(HAVE_FORK) // Common code to raise a warning if we detect there is more than one thread // running in the process. Best effort, silent if unable to count threads. // Constraint: Quick. Never overcounts. Never leaves an error set. @@ -7677,6 +7678,7 @@ static void warn_about_fork_with_threads(const char* name) { PyErr_Clear(); } } +#endif // HAVE_FORK1 || HAVE_FORKPTY || HAVE_FORK #ifdef HAVE_FORK1 /*[clinic input] @@ -7865,6 +7867,16 @@ os_sched_param_impl(PyTypeObject *type, PyObject *sched_priority) return res; } +static PyObject * +os_sched_param_reduce(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + return Py_BuildValue("(O(N))", Py_TYPE(self), PyStructSequence_GetItem(self, 0)); +} + +static PyMethodDef os_sched_param_reduce_method = { + "__reduce__", (PyCFunction)os_sched_param_reduce, METH_NOARGS|METH_COEXIST, NULL, +}; + PyDoc_VAR(os_sched_param__doc__); static PyStructSequence_Field sched_param_fields[] = { @@ -10054,12 +10066,12 @@ Return a collection containing process timing information. The object returned behaves like a named tuple with these fields: (utime, stime, cutime, cstime, elapsed_time) -All fields are floating point numbers. +All fields are floating-point numbers. [clinic start generated code]*/ static PyObject * os_times_impl(PyObject *module) -/*[clinic end generated code: output=35f640503557d32a input=2bf9df3d6ab2e48b]*/ +/*[clinic end generated code: output=35f640503557d32a input=8dbfe33a2dcc3df3]*/ #ifdef MS_WINDOWS { FILETIME create, exit, kernel, user; @@ -11783,6 +11795,7 @@ os_mknod_impl(PyObject *module, path_t *path, int mode, dev_t device, #endif /* defined(HAVE_MKNOD) && defined(HAVE_MAKEDEV) */ +#ifdef HAVE_DEVICE_MACROS static PyObject * major_minor_conv(unsigned int value) { @@ -11805,7 +11818,6 @@ major_minor_check(dev_t value) return (dev_t)(unsigned int)value == value; } -#ifdef HAVE_DEVICE_MACROS /*[clinic input] os.major @@ -17000,6 +17012,12 @@ posixmodule_exec(PyObject *m) return -1; } ((PyTypeObject *)state->SchedParamType)->tp_new = os_sched_param; + if (_PyType_AddMethod((PyTypeObject *)state->SchedParamType, + &os_sched_param_reduce_method) < 0) + { + return -1; + } + PyType_Modified((PyTypeObject *)state->SchedParamType); #endif /* initialize TerminalSize_info */ diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index 97f1db20..50788e53 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -263,7 +263,7 @@ A file descriptor is either a socket or file object, or a small integer gotten from a fileno() method call on one of those. The optional 4th argument specifies a timeout in seconds; it may be -a floating point number to specify fractions of seconds. If it is absent +a floating-point number to specify fractions of seconds. If it is absent or None, the call will never time out. The return value is a tuple of three lists corresponding to the first three @@ -278,7 +278,7 @@ descriptors can be used. static PyObject * select_select_impl(PyObject *module, PyObject *rlist, PyObject *wlist, PyObject *xlist, PyObject *timeout_obj) -/*[clinic end generated code: output=2b3cfa824f7ae4cf input=e467f5d68033de00]*/ +/*[clinic end generated code: output=2b3cfa824f7ae4cf input=1199d5e101abca4a]*/ { #ifdef SELECT_USES_HEAP pylist *rfd2obj, *wfd2obj, *efd2obj; diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index 00ea4343..4f4e6a39 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -637,7 +637,7 @@ signal_strsignal_impl(PyObject *module, int signalnum) res = "Aborted"; break; case SIGFPE: - res = "Floating point exception"; + res = "Floating-point exception"; break; case SIGSEGV: res = "Segmentation fault"; @@ -1199,13 +1199,13 @@ signal.sigtimedwait Like sigwaitinfo(), but with a timeout. -The timeout is specified in seconds, with floating point numbers allowed. +The timeout is specified in seconds, with floating-point numbers allowed. [clinic start generated code]*/ static PyObject * signal_sigtimedwait_impl(PyObject *module, sigset_t sigset, PyObject *timeout_obj) -/*[clinic end generated code: output=59c8971e8ae18a64 input=87fd39237cf0b7ba]*/ +/*[clinic end generated code: output=59c8971e8ae18a64 input=955773219c1596cd]*/ { _PyTime_t timeout; if (_PyTime_FromSecondsObject(&timeout, diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 97248792..7f2ebba9 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -816,7 +816,9 @@ internal_select(PySocketSockObject *s, int writing, _PyTime_t interval, /* s->sock_timeout is in seconds, timeout in ms */ ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING); - assert(ms <= INT_MAX); + if (ms > INT_MAX) { + ms = INT_MAX; + } /* On some OSes, typically BSD-based ones, the timeout parameter of the poll() syscall, when negative, must be exactly INFTIM, where defined, @@ -828,6 +830,7 @@ internal_select(PySocketSockObject *s, int writing, _PyTime_t interval, ms = -1; #endif } + assert(INT_MIN <= ms && ms <= INT_MAX); Py_BEGIN_ALLOW_THREADS; n = poll(&pollfd, 1, (int)ms); diff --git a/Modules/timemodule.c b/Modules/timemodule.c index 9038c372..59078263 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -159,7 +159,7 @@ time_time(PyObject *self, PyObject *unused) PyDoc_STRVAR(time_doc, -"time() -> floating point number\n\ +"time() -> floating-point number\n\ \n\ Return the current time in seconds since the Epoch.\n\ Fractions of a second may be present if the system clock provides them."); @@ -373,7 +373,7 @@ time_clock_getres(PyObject *self, PyObject *args) } PyDoc_STRVAR(clock_getres_doc, -"clock_getres(clk_id) -> floating point number\n\ +"clock_getres(clk_id) -> floating-point number\n\ \n\ Return the resolution (precision) of the specified clock clk_id."); @@ -432,7 +432,7 @@ PyDoc_STRVAR(sleep_doc, "sleep(seconds)\n\ \n\ Delay execution for a given number of seconds. The argument may be\n\ -a floating point number for subsecond precision."); +a floating-point number for subsecond precision."); static PyStructSequence_Field struct_time_type_fields[] = { {"tm_year", "year, for example, 1993"}, @@ -795,27 +795,100 @@ the C library strftime function.\n" #endif static PyObject * -time_strftime(PyObject *module, PyObject *args) +time_strftime1(time_char **outbuf, size_t *bufsize, + time_char *format, size_t fmtlen, + struct tm *tm) { - PyObject *tup = NULL; - struct tm buf; - const time_char *fmt; + size_t buflen; +#if defined(MS_WINDOWS) && !defined(HAVE_WCSFTIME) + /* check that the format string contains only valid directives */ + for (const time_char *f = strchr(format, '%'); + f != NULL; + f = strchr(f + 2, '%')) + { + if (f[1] == '#') + ++f; /* not documented by python, */ + if (f[1] == '\0') + break; + if ((f[1] == 'y') && tm->tm_year < 0) { + PyErr_SetString(PyExc_ValueError, + "format %y requires year >= 1900 on Windows"); + return NULL; + } + } +#elif (defined(_AIX) || (defined(__sun) && defined(__SVR4))) && defined(HAVE_WCSFTIME) + for (const time_char *f = wcschr(format, '%'); + f != NULL; + f = wcschr(f + 2, '%')) + { + if (f[1] == L'\0') + break; + /* Issue #19634: On AIX, wcsftime("y", (1899, 1, 1, 0, 0, 0, 0, 0, 0)) + returns "0/" instead of "99" */ + if (f[1] == L'y' && tm->tm_year < 0) { + PyErr_SetString(PyExc_ValueError, + "format %y requires year >= 1900 on AIX"); + return NULL; + } + } +#endif + + /* I hate these functions that presume you know how big the output + * will be ahead of time... + */ + while (1) { + if (*bufsize > PY_SSIZE_T_MAX/sizeof(time_char)) { + PyErr_NoMemory(); + return NULL; + } + *outbuf = (time_char *)PyMem_Realloc(*outbuf, + *bufsize*sizeof(time_char)); + if (*outbuf == NULL) { + PyErr_NoMemory(); + return NULL; + } +#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__) + errno = 0; +#endif + _Py_BEGIN_SUPPRESS_IPH + buflen = format_time(*outbuf, *bufsize, format, tm); + _Py_END_SUPPRESS_IPH +#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__) + /* VisualStudio .NET 2005 does this properly */ + if (buflen == 0 && errno == EINVAL) { + PyErr_SetString(PyExc_ValueError, "Invalid format string"); + return NULL; + } +#endif + if (buflen == 0 && *bufsize < 256 * fmtlen) { + *bufsize += *bufsize; + continue; + } + /* If the buffer is 256 times as long as the format, + it's probably not failing for lack of room! + More likely, the format yields an empty result, + e.g. an empty format, or %Z when the timezone + is unknown. */ #ifdef HAVE_WCSFTIME - wchar_t *format; + return PyUnicode_FromWideChar(*outbuf, buflen); #else - PyObject *format; + return PyUnicode_DecodeLocaleAndSize(*outbuf, buflen, "surrogateescape"); #endif + } +} + +static PyObject * +time_strftime(PyObject *module, PyObject *args) +{ + PyObject *tup = NULL; + struct tm buf; PyObject *format_arg; - size_t fmtlen, buflen; - time_char *outbuf = NULL; - size_t i; - PyObject *ret = NULL; + Py_ssize_t format_size; + time_char *format, *outbuf = NULL; + size_t fmtlen, bufsize = 1024; memset((void *) &buf, '\0', sizeof(buf)); - /* Will always expect a unicode string to be passed as format. - Given that there's no str type anymore in py3k this seems safe. - */ if (!PyArg_ParseTuple(args, "U|O:strftime", &format_arg, &tup)) return NULL; @@ -848,101 +921,65 @@ time_strftime(PyObject *module, PyObject *args) else if (buf.tm_isdst > 1) buf.tm_isdst = 1; -#ifdef HAVE_WCSFTIME - format = PyUnicode_AsWideCharString(format_arg, NULL); - if (format == NULL) + format_size = PyUnicode_GET_LENGTH(format_arg); + if ((size_t)format_size > PY_SSIZE_T_MAX/sizeof(time_char) - 1) { + PyErr_NoMemory(); return NULL; - fmt = format; -#else - /* Convert the unicode string to an ascii one */ - format = PyUnicode_EncodeLocale(format_arg, "surrogateescape"); - if (format == NULL) + } + format = PyMem_Malloc((format_size + 1)*sizeof(time_char)); + if (format == NULL) { + PyErr_NoMemory(); return NULL; - fmt = PyBytes_AS_STRING(format); -#endif - -#if defined(MS_WINDOWS) && !defined(HAVE_WCSFTIME) - /* check that the format string contains only valid directives */ - for (outbuf = strchr(fmt, '%'); - outbuf != NULL; - outbuf = strchr(outbuf+2, '%')) - { - if (outbuf[1] == '#') - ++outbuf; /* not documented by python, */ - if (outbuf[1] == '\0') - break; - if ((outbuf[1] == 'y') && buf.tm_year < 0) { - PyErr_SetString(PyExc_ValueError, - "format %y requires year >= 1900 on Windows"); - Py_DECREF(format); - return NULL; - } } -#elif (defined(_AIX) || (defined(__sun) && defined(__SVR4))) && defined(HAVE_WCSFTIME) - for (outbuf = wcschr(fmt, '%'); - outbuf != NULL; - outbuf = wcschr(outbuf+2, '%')) - { - if (outbuf[1] == L'\0') - break; - /* Issue #19634: On AIX, wcsftime("y", (1899, 1, 1, 0, 0, 0, 0, 0, 0)) - returns "0/" instead of "99" */ - if (outbuf[1] == L'y' && buf.tm_year < 0) { - PyErr_SetString(PyExc_ValueError, - "format %y requires year >= 1900 on AIX"); - PyMem_Free(format); - return NULL; + _PyUnicodeWriter writer; + _PyUnicodeWriter_Init(&writer); + writer.overallocate = 1; + Py_ssize_t i = 0; + while (i < format_size) { + fmtlen = 0; + for (; i < format_size; i++) { + Py_UCS4 c = PyUnicode_READ_CHAR(format_arg, i); + if (!c || c > 127) { + break; + } + format[fmtlen++] = (char)c; } - } -#endif - - fmtlen = time_strlen(fmt); - - /* I hate these functions that presume you know how big the output - * will be ahead of time... - */ - for (i = 1024; ; i += i) { - outbuf = (time_char *)PyMem_Malloc(i*sizeof(time_char)); - if (outbuf == NULL) { - PyErr_NoMemory(); - break; + if (fmtlen) { + format[fmtlen] = 0; + PyObject *unicode = time_strftime1(&outbuf, &bufsize, + format, fmtlen, &buf); + if (unicode == NULL) { + goto error; + } + if (_PyUnicodeWriter_WriteStr(&writer, unicode) < 0) { + Py_DECREF(unicode); + goto error; + } + Py_DECREF(unicode); } -#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__) - errno = 0; -#endif - _Py_BEGIN_SUPPRESS_IPH - buflen = format_time(outbuf, i, fmt, &buf); - _Py_END_SUPPRESS_IPH -#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__) - /* VisualStudio .NET 2005 does this properly */ - if (buflen == 0 && errno == EINVAL) { - PyErr_SetString(PyExc_ValueError, "Invalid format string"); - PyMem_Free(outbuf); - break; + + Py_ssize_t start = i; + for (; i < format_size; i++) { + Py_UCS4 c = PyUnicode_READ_CHAR(format_arg, i); + if (c == '%') { + break; + } } -#endif - if (buflen > 0 || i >= 256 * fmtlen) { - /* If the buffer is 256 times as long as the format, - it's probably not failing for lack of room! - More likely, the format yields an empty result, - e.g. an empty format, or %Z when the timezone - is unknown. */ -#ifdef HAVE_WCSFTIME - ret = PyUnicode_FromWideChar(outbuf, buflen); -#else - ret = PyUnicode_DecodeLocaleAndSize(outbuf, buflen, "surrogateescape"); -#endif - PyMem_Free(outbuf); - break; + if (start < i) { + if (_PyUnicodeWriter_WriteSubstring(&writer, format_arg, start, i) < 0) { + goto error; + } } - PyMem_Free(outbuf); } -#ifdef HAVE_WCSFTIME + + PyMem_Free(outbuf); PyMem_Free(format); -#else - Py_DECREF(format); -#endif - return ret; + return _PyUnicodeWriter_Finish(&writer); +error: + PyMem_Free(outbuf); + PyMem_Free(format); + _PyUnicodeWriter_Dealloc(&writer); + return NULL; } #undef time_char @@ -1123,7 +1160,7 @@ time_mktime(PyObject *module, PyObject *tm_tuple) } PyDoc_STRVAR(mktime_doc, -"mktime(tuple) -> floating point number\n\ +"mktime(tuple) -> floating-point number\n\ \n\ Convert a time tuple in local time to seconds since the Epoch.\n\ Note that mktime(gmtime(0)) will not generally return zero for most\n\ @@ -1292,8 +1329,14 @@ _PyTime_GetProcessTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info) #else /* clock_gettime */ +// gh-115714: Don't use CLOCK_PROCESS_CPUTIME_ID on WASI. +/* CLOCK_PROF is defined on NetBSD, but not supported. + * CLOCK_PROCESS_CPUTIME_ID is broken on NetBSD for the same reason as + * CLOCK_THREAD_CPUTIME_ID (see comment below). + */ #if defined(HAVE_CLOCK_GETTIME) \ - && (defined(CLOCK_PROCESS_CPUTIME_ID) || defined(CLOCK_PROF)) + && (defined(CLOCK_PROCESS_CPUTIME_ID) || defined(CLOCK_PROF)) \ + && !defined(__NetBSD__) struct timespec ts; if (HAVE_CLOCK_GETTIME_RUNTIME) { @@ -1499,9 +1542,16 @@ _PyTime_GetThreadTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info) return 0; } +/* CLOCK_THREAD_CPUTIME_ID is broken on NetBSD: the result of clock_gettime() + * includes the sleeping time, that defeats the purpose of the clock. + * Also, clock_getres() does not support it. + * https://github.com/python/cpython/issues/123978 + * https://gnats.netbsd.org/57512 + */ #elif defined(HAVE_CLOCK_GETTIME) && \ - defined(CLOCK_PROCESS_CPUTIME_ID) && \ - !defined(__EMSCRIPTEN__) && !defined(__wasi__) + defined(CLOCK_THREAD_CPUTIME_ID) && \ + !defined(__EMSCRIPTEN__) && !defined(__wasi__) && \ + !defined(__NetBSD__) #define HAVE_THREAD_TIME #if defined(__APPLE__) && defined(__has_attribute) && __has_attribute(availability) @@ -1913,7 +1963,7 @@ PyDoc_STRVAR(module_doc, \n\ There are two standard representations of time. One is the number\n\ of seconds since the Epoch, in UTC (a.k.a. GMT). It may be an integer\n\ -or a floating point number (to represent fractions of seconds).\n\ +or a floating-point number (to represent fractions of seconds).\n\ The epoch is the point where the time starts, the return value of time.gmtime(0).\n\ It is January 1, 1970, 00:00:00 (UTC) on all platforms.\n\ \n\ diff --git a/Objects/boolobject.c b/Objects/boolobject.c index f43e26f3..74e16dd2 100644 --- a/Objects/boolobject.c +++ b/Objects/boolobject.c @@ -71,8 +71,8 @@ static PyObject * bool_invert(PyObject *v) { if (PyErr_WarnEx(PyExc_DeprecationWarning, - "Bitwise inversion '~' on bool is deprecated. This " - "returns the bitwise inversion of the underlying int " + "Bitwise inversion '~' on bool is deprecated and will be removed in " + "Python 3.16. This returns the bitwise inversion of the underlying int " "object and is usually not what you expect from negating " "a bool. Use the 'not' operator for boolean negation or " "~int(x) if you really want the bitwise inversion of the " diff --git a/Objects/clinic/floatobject.c.h b/Objects/clinic/floatobject.c.h index a99fd74e..ed166538 100644 --- a/Objects/clinic/floatobject.c.h +++ b/Objects/clinic/floatobject.c.h @@ -201,7 +201,7 @@ PyDoc_STRVAR(float_new__doc__, "float(x=0, /)\n" "--\n" "\n" -"Convert a string or number to a floating point number, if possible."); +"Convert a string or number to a floating-point number, if possible."); static PyObject * float_new_impl(PyTypeObject *type, PyObject *x); @@ -260,7 +260,7 @@ PyDoc_STRVAR(float___getformat____doc__, "It exists mainly to be used in Python\'s test suite.\n" "\n" "This function returns whichever of \'unknown\', \'IEEE, big-endian\' or \'IEEE,\n" -"little-endian\' best describes the format of floating point numbers used by the\n" +"little-endian\' best describes the format of floating-point numbers used by the\n" "C type named by typestr."); #define FLOAT___GETFORMAT___METHODDEF \ @@ -325,4 +325,4 @@ float___format__(PyObject *self, PyObject *arg) exit: return return_value; } -/*[clinic end generated code: output=ea329577074911b9 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=e6e3f5f833b37eba input=a9049054013a1b77]*/ diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 1be66215..7332d4fb 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -132,6 +132,7 @@ all_name_chars(PyObject *o) static int intern_strings(PyObject *tuple) { + PyInterpreterState *interp = _PyInterpreterState_GET(); Py_ssize_t i; for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) { @@ -141,7 +142,7 @@ intern_strings(PyObject *tuple) "non-string found in code slot"); return -1; } - PyUnicode_InternInPlace(&_PyTuple_ITEMS(tuple)[i]); + _PyUnicode_InternImmortal(interp, &_PyTuple_ITEMS(tuple)[i]); } return 0; } @@ -150,6 +151,7 @@ intern_strings(PyObject *tuple) static int intern_string_constants(PyObject *tuple, int *modified) { + PyInterpreterState *interp = _PyInterpreterState_GET(); for (Py_ssize_t i = PyTuple_GET_SIZE(tuple); --i >= 0; ) { PyObject *v = PyTuple_GET_ITEM(tuple, i); if (PyUnicode_CheckExact(v)) { @@ -159,7 +161,7 @@ intern_string_constants(PyObject *tuple, int *modified) if (all_name_chars(v)) { PyObject *w = v; - PyUnicode_InternInPlace(&v); + _PyUnicode_InternMortal(interp, &v); if (w != v) { PyTuple_SET_ITEM(tuple, i, v); if (modified) { diff --git a/Objects/complexobject.c b/Objects/complexobject.c index 7f7e7e6b..eff17380 100644 --- a/Objects/complexobject.c +++ b/Objects/complexobject.c @@ -146,7 +146,7 @@ _Py_c_pow(Py_complex a, Py_complex b) at = atan2(a.imag, a.real); phase = at*b.real; if (b.imag != 0.0) { - len /= exp(at*b.imag); + len *= exp(-at*b.imag); phase += b.imag*log(vabs); } r.real = len*cos(phase); diff --git a/Objects/descrobject.c b/Objects/descrobject.c index 18876fd2..a6c90e7a 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -1788,22 +1788,9 @@ property_init_impl(propertyobject *self, PyObject *fget, PyObject *fset, /* if no docstring given and the getter has one, use that one */ else if (fget != NULL) { int rc = _PyObject_LookupAttr(fget, &_Py_ID(__doc__), &prop_doc); - if (rc <= 0) { + if (rc < 0) { return rc; } - if (!Py_IS_TYPE(self, &PyProperty_Type) && - prop_doc != NULL && prop_doc != Py_None) { - // This oddity preserves the long existing behavior of surfacing - // an AttributeError when using a dict-less (__slots__) property - // subclass as a decorator on a getter method with a docstring. - // See PropertySubclassTest.test_slots_docstring_copy_exception. - int err = PyObject_SetAttr( - (PyObject *)self, &_Py_ID(__doc__), prop_doc); - if (err < 0) { - Py_DECREF(prop_doc); // release our new reference. - return -1; - } - } if (prop_doc == Py_None) { prop_doc = NULL; Py_DECREF(Py_None); @@ -1831,7 +1818,9 @@ property_init_impl(propertyobject *self, PyObject *fget, PyObject *fset, Py_DECREF(prop_doc); if (err < 0) { assert(PyErr_Occurred()); - if (PyErr_ExceptionMatches(PyExc_AttributeError)) { + if (!self->getter_doc && + PyErr_ExceptionMatches(PyExc_AttributeError)) + { PyErr_Clear(); // https://github.com/python/cpython/issues/98963#issuecomment-1574413319 // Python silently dropped this doc assignment through 3.11. diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 254cd9ad..4e965314 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -1251,10 +1251,6 @@ insertdict(PyInterpreterState *interp, PyDictObject *mp, MAINTAIN_TRACKING(mp, key, value); if (ix == DKIX_EMPTY) { - uint64_t new_version = _PyDict_NotifyEvent( - interp, PyDict_EVENT_ADDED, mp, key, value); - /* Insert into new slot. */ - mp->ma_keys->dk_version = 0; assert(old_value == NULL); if (mp->ma_keys->dk_usable <= 0) { /* Need to resize. */ @@ -1262,6 +1258,11 @@ insertdict(PyInterpreterState *interp, PyDictObject *mp, goto Fail; } + uint64_t new_version = _PyDict_NotifyEvent( + interp, PyDict_EVENT_ADDED, mp, key, value); + /* Insert into new slot. */ + mp->ma_keys->dk_version = 0; + Py_ssize_t hashpos = find_empty_slot(mp->ma_keys, hash); dictkeys_set_index(mp->ma_keys, hashpos, mp->ma_keys->dk_nentries); @@ -1335,9 +1336,6 @@ insert_to_emptydict(PyInterpreterState *interp, PyDictObject *mp, { assert(mp->ma_keys == Py_EMPTY_KEYS); - uint64_t new_version = _PyDict_NotifyEvent( - interp, PyDict_EVENT_ADDED, mp, key, value); - int unicode = PyUnicode_CheckExact(key); PyDictKeysObject *newkeys = new_keys_object( interp, PyDict_LOG_MINSIZE, unicode); @@ -1346,6 +1344,9 @@ insert_to_emptydict(PyInterpreterState *interp, PyDictObject *mp, Py_DECREF(value); return -1; } + uint64_t new_version = _PyDict_NotifyEvent( + interp, PyDict_EVENT_ADDED, mp, key, value); + /* We don't decref Py_EMPTY_KEYS here because it is immortal. */ mp->ma_keys = newkeys; mp->ma_values = NULL; @@ -3324,15 +3325,15 @@ PyDict_SetDefault(PyObject *d, PyObject *key, PyObject *defaultobj) return NULL; if (ix == DKIX_EMPTY) { - uint64_t new_version = _PyDict_NotifyEvent( - interp, PyDict_EVENT_ADDED, mp, key, defaultobj); - mp->ma_keys->dk_version = 0; value = defaultobj; if (mp->ma_keys->dk_usable <= 0) { if (insertion_resize(interp, mp, 1) < 0) { return NULL; } } + uint64_t new_version = _PyDict_NotifyEvent( + interp, PyDict_EVENT_ADDED, mp, key, defaultobj); + mp->ma_keys->dk_version = 0; Py_ssize_t hashpos = find_empty_slot(mp->ma_keys, hash); dictkeys_set_index(mp->ma_keys, hashpos, mp->ma_keys->dk_nentries); if (DK_IS_UNICODE(mp->ma_keys)) { @@ -3633,8 +3634,8 @@ PyDoc_STRVAR(sizeof__doc__, "D.__sizeof__() -> size of D in memory, in bytes"); PyDoc_STRVAR(update__doc__, -"D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\n\ -If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]\n\ +"D.update([E, ]**F) -> None. Update D from mapping/iterable E and F.\n\ +If E is present and has a .keys() method, then does: for k in E.keys(): D[k] = E[k]\n\ If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v\n\ In either case, this is followed by: for k in F: D[k] = F[k]"); @@ -3915,7 +3916,8 @@ PyDict_SetItemString(PyObject *v, const char *key, PyObject *item) kv = PyUnicode_FromString(key); if (kv == NULL) return -1; - PyUnicode_InternInPlace(&kv); /* XXX Should we really? */ + PyInterpreterState *interp = _PyInterpreterState_GET(); + _PyUnicode_InternImmortal(interp, &kv); /* XXX Should we really? */ err = PyDict_SetItem(v, kv, item); Py_DECREF(kv); return err; diff --git a/Objects/exceptions.c b/Objects/exceptions.c index e3217c92..c579563d 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -2961,46 +2961,55 @@ UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds) static PyObject * UnicodeEncodeError_str(PyObject *self) { - PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self; + PyUnicodeErrorObject *exc = (PyUnicodeErrorObject *)self; PyObject *result = NULL; PyObject *reason_str = NULL; PyObject *encoding_str = NULL; - if (!uself->object) + if (exc->object == NULL) { /* Not properly initialized. */ return PyUnicode_FromString(""); + } /* Get reason and encoding as strings, which they might not be if they've been modified after we were constructed. */ - reason_str = PyObject_Str(uself->reason); - if (reason_str == NULL) + reason_str = PyObject_Str(exc->reason); + if (reason_str == NULL) { goto done; - encoding_str = PyObject_Str(uself->encoding); - if (encoding_str == NULL) + } + encoding_str = PyObject_Str(exc->encoding); + if (encoding_str == NULL) { goto done; + } + + Py_ssize_t len = PyUnicode_GET_LENGTH(exc->object); + Py_ssize_t start = exc->start, end = exc->end; - if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) { - Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start); + if ((start >= 0 && start < len) && (end >= 0 && end <= len) && end == start + 1) { + Py_UCS4 badchar = PyUnicode_ReadChar(exc->object, start); const char *fmt; - if (badchar <= 0xff) + if (badchar <= 0xff) { fmt = "'%U' codec can't encode character '\\x%02x' in position %zd: %U"; - else if (badchar <= 0xffff) + } + else if (badchar <= 0xffff) { fmt = "'%U' codec can't encode character '\\u%04x' in position %zd: %U"; - else + } + else { fmt = "'%U' codec can't encode character '\\U%08x' in position %zd: %U"; + } result = PyUnicode_FromFormat( fmt, encoding_str, (int)badchar, - uself->start, + start, reason_str); } else { result = PyUnicode_FromFormat( "'%U' codec can't encode characters in position %zd-%zd: %U", encoding_str, - uself->start, - uself->end-1, + start, + end - 1, reason_str); } done: @@ -3074,41 +3083,46 @@ UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds) static PyObject * UnicodeDecodeError_str(PyObject *self) { - PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self; + PyUnicodeErrorObject *exc = (PyUnicodeErrorObject *)self; PyObject *result = NULL; PyObject *reason_str = NULL; PyObject *encoding_str = NULL; - if (!uself->object) + if (exc->object == NULL) { /* Not properly initialized. */ return PyUnicode_FromString(""); + } /* Get reason and encoding as strings, which they might not be if they've been modified after we were constructed. */ - reason_str = PyObject_Str(uself->reason); - if (reason_str == NULL) + reason_str = PyObject_Str(exc->reason); + if (reason_str == NULL) { goto done; - encoding_str = PyObject_Str(uself->encoding); - if (encoding_str == NULL) + } + encoding_str = PyObject_Str(exc->encoding); + if (encoding_str == NULL) { goto done; + } + + Py_ssize_t len = PyBytes_GET_SIZE(exc->object); + Py_ssize_t start = exc->start, end = exc->end; - if (uself->start < PyBytes_GET_SIZE(uself->object) && uself->end == uself->start+1) { - int byte = (int)(PyBytes_AS_STRING(((PyUnicodeErrorObject *)self)->object)[uself->start]&0xff); + if ((start >= 0 && start < len) && (end >= 0 && end <= len) && end == start + 1) { + int badbyte = (int)(PyBytes_AS_STRING(exc->object)[start] & 0xff); result = PyUnicode_FromFormat( "'%U' codec can't decode byte 0x%02x in position %zd: %U", encoding_str, - byte, - uself->start, + badbyte, + start, reason_str); } else { result = PyUnicode_FromFormat( "'%U' codec can't decode bytes in position %zd-%zd: %U", encoding_str, - uself->start, - uself->end-1, - reason_str - ); + start, + end - 1, + reason_str); } done: Py_XDECREF(reason_str); @@ -3171,42 +3185,49 @@ UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args, static PyObject * UnicodeTranslateError_str(PyObject *self) { - PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self; + PyUnicodeErrorObject *exc = (PyUnicodeErrorObject *)self; PyObject *result = NULL; PyObject *reason_str = NULL; - if (!uself->object) + if (exc->object == NULL) { /* Not properly initialized. */ return PyUnicode_FromString(""); + } /* Get reason as a string, which it might not be if it's been modified after we were constructed. */ - reason_str = PyObject_Str(uself->reason); - if (reason_str == NULL) + reason_str = PyObject_Str(exc->reason); + if (reason_str == NULL) { goto done; + } + + Py_ssize_t len = PyUnicode_GET_LENGTH(exc->object); + Py_ssize_t start = exc->start, end = exc->end; - if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) { - Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start); + if ((start >= 0 && start < len) && (end >= 0 && end <= len) && end == start + 1) { + Py_UCS4 badchar = PyUnicode_ReadChar(exc->object, start); const char *fmt; - if (badchar <= 0xff) + if (badchar <= 0xff) { fmt = "can't translate character '\\x%02x' in position %zd: %U"; - else if (badchar <= 0xffff) + } + else if (badchar <= 0xffff) { fmt = "can't translate character '\\u%04x' in position %zd: %U"; - else + } + else { fmt = "can't translate character '\\U%08x' in position %zd: %U"; + } result = PyUnicode_FromFormat( fmt, (int)badchar, - uself->start, - reason_str - ); - } else { + start, + reason_str); + } + else { result = PyUnicode_FromFormat( "can't translate characters in position %zd-%zd: %U", - uself->start, - uself->end-1, - reason_str - ); + start, + end - 1, + reason_str); } done: Py_XDECREF(reason_str); @@ -3254,7 +3275,7 @@ SimpleExtendsException(PyExc_Exception, ArithmeticError, * FloatingPointError extends ArithmeticError */ SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError, - "Floating point operation failed."); + "Floating-point operation failed."); /* diff --git a/Objects/floatobject.c b/Objects/floatobject.c index 7a882bfd..92d40e8a 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -1644,12 +1644,12 @@ float.__new__ as float_new x: object(c_default="NULL") = 0 / -Convert a string or number to a floating point number, if possible. +Convert a string or number to a floating-point number, if possible. [clinic start generated code]*/ static PyObject * float_new_impl(PyTypeObject *type, PyObject *x) -/*[clinic end generated code: output=ccf1e8dc460ba6ba input=f43661b7de03e9d8]*/ +/*[clinic end generated code: output=ccf1e8dc460ba6ba input=55909f888aa0c8a6]*/ { if (type != &PyFloat_Type) { if (x == NULL) { @@ -1745,13 +1745,13 @@ You probably don't want to use this function. It exists mainly to be used in Python's test suite. This function returns whichever of 'unknown', 'IEEE, big-endian' or 'IEEE, -little-endian' best describes the format of floating point numbers used by the +little-endian' best describes the format of floating-point numbers used by the C type named by typestr. [clinic start generated code]*/ static PyObject * float___getformat___impl(PyTypeObject *type, const char *typestr) -/*[clinic end generated code: output=2bfb987228cc9628 input=d5a52600f835ad67]*/ +/*[clinic end generated code: output=2bfb987228cc9628 input=90d5e246409a246e]*/ { float_format_type r; @@ -1937,7 +1937,7 @@ _init_global_state(void) float_format_type detected_double_format, detected_float_format; /* We attempt to determine if this machine is using IEEE - floating point formats by peering at the bits of some + floating-point formats by peering at the bits of some carefully chosen values. If it looks like we are on an IEEE platform, the float packing/unpacking routines can just copy bits, if not they resort to arithmetic & shifts diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c index 117b4e8d..7f89e683 100644 --- a/Objects/genericaliasobject.c +++ b/Objects/genericaliasobject.c @@ -564,6 +564,10 @@ ga_getitem(PyObject *self, PyObject *item) } PyObject *res = Py_GenericAlias(alias->origin, newargs); + if (res == NULL) { + Py_DECREF(newargs); + return NULL; + } ((gaobject *)res)->starred = alias->starred; Py_DECREF(newargs); diff --git a/Objects/genobject.c b/Objects/genobject.c index dc034a4b..474abe10 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -374,6 +374,7 @@ static PyObject * gen_close(PyGenObject *gen, PyObject *args) { PyObject *retval; + PyObject *yf = _PyGen_yf(gen); int err = 0; if (gen->gi_frame_state == FRAME_CREATED) { @@ -383,7 +384,6 @@ gen_close(PyGenObject *gen, PyObject *args) if (gen->gi_frame_state >= FRAME_COMPLETED) { Py_RETURN_NONE; } - PyObject *yf = _PyGen_yf(gen); if (yf) { PyFrameState state = gen->gi_frame_state; gen->gi_frame_state = FRAME_EXECUTING; @@ -396,14 +396,12 @@ gen_close(PyGenObject *gen, PyObject *args) * YIELD_VALUE if the debugger has changed the lineno. */ if (err == 0 && is_yield(frame->prev_instr)) { assert(is_resume(frame->prev_instr + 1)); - int exception_handler_depth = frame->prev_instr[0].op.arg; + int exception_handler_depth = frame->prev_instr[0].op.code; assert(exception_handler_depth > 0); /* We can safely ignore the outermost try block * as it automatically generated to handle * StopIteration. */ if (exception_handler_depth == 1) { - gen->gi_frame_state = FRAME_COMPLETED; - _PyFrame_ClearLocals((_PyInterpreterFrame *)gen->gi_iframe); Py_RETURN_NONE; } } diff --git a/Objects/listobject.c b/Objects/listobject.c index f59abe2e..d017f34b 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -2759,7 +2759,14 @@ list_richcompare(PyObject *v, PyObject *w, int op) } /* Compare the final item again using the proper operator */ - return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op); + PyObject *vitem = vl->ob_item[i]; + PyObject *witem = wl->ob_item[i]; + Py_INCREF(vitem); + Py_INCREF(witem); + PyObject *result = PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op); + Py_DECREF(vitem); + Py_DECREF(witem); + return result; } /*[clinic input] @@ -2928,6 +2935,23 @@ list_subscript(PyListObject* self, PyObject* item) } } +static Py_ssize_t +adjust_slice_indexes(PyListObject *lst, + Py_ssize_t *start, Py_ssize_t *stop, + Py_ssize_t step) +{ + Py_ssize_t slicelength = PySlice_AdjustIndices(Py_SIZE(lst), start, stop, + step); + + /* Make sure s[5:2] = [..] inserts at the right place: + before 5, not before 2. */ + if ((step < 0 && *start < *stop) || + (step > 0 && *start > *stop)) + *stop = *start; + + return slicelength; +} + static int list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value) { @@ -2940,22 +2964,11 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value) return list_ass_item(self, i, value); } else if (PySlice_Check(item)) { - Py_ssize_t start, stop, step, slicelength; + Py_ssize_t start, stop, step; if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return -1; } - slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop, - step); - - if (step == 1) - return list_ass_slice(self, start, stop, value); - - /* Make sure s[5:2] = [..] inserts at the right place: - before 5, not before 2. */ - if ((step < 0 && start < stop) || - (step > 0 && start > stop)) - stop = start; if (value == NULL) { /* delete slice */ @@ -2964,6 +2977,12 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value) Py_ssize_t i; int res; + Py_ssize_t slicelength = adjust_slice_indexes(self, &start, &stop, + step); + + if (step == 1) + return list_ass_slice(self, start, stop, value); + if (slicelength <= 0) return 0; @@ -3039,6 +3058,15 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value) if (!seq) return -1; + Py_ssize_t slicelength = adjust_slice_indexes(self, &start, &stop, + step); + + if (step == 1) { + int res = list_ass_slice(self, start, stop, seq); + Py_DECREF(seq); + return res; + } + if (PySequence_Fast_GET_SIZE(seq) != slicelength) { PyErr_Format(PyExc_ValueError, "attempt to assign sequence of " diff --git a/Objects/longobject.c b/Objects/longobject.c index c72e1643..c366034f 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -484,11 +484,18 @@ PyLong_AsLongAndOverflow(PyObject *vv, int *overflow) do_decref = 1; } if (_PyLong_IsCompact(v)) { -#if SIZEOF_LONG < SIZEOF_VOID_P - intptr_t tmp = _PyLong_CompactValue(v); - res = (long)tmp; - if (res != tmp) { - *overflow = tmp < 0 ? -1 : 1; +#if SIZEOF_LONG < SIZEOF_SIZE_T + Py_ssize_t tmp = _PyLong_CompactValue(v); + if (tmp < LONG_MIN) { + *overflow = -1; + res = -1; + } + else if (tmp > LONG_MAX) { + *overflow = 1; + res = -1; + } + else { + res = (long)tmp; } #else res = _PyLong_CompactValue(v); @@ -633,14 +640,15 @@ PyLong_AsUnsignedLong(PyObject *vv) v = (PyLongObject *)vv; if (_PyLong_IsNonNegativeCompact(v)) { -#if SIZEOF_LONG < SIZEOF_VOID_P - intptr_t tmp = _PyLong_CompactValue(v); +#if SIZEOF_LONG < SIZEOF_SIZE_T + size_t tmp = (size_t)_PyLong_CompactValue(v); unsigned long res = (unsigned long)tmp; if (res != tmp) { goto overflow; } + return res; #else - return _PyLong_CompactValue(v); + return (unsigned long)(size_t)_PyLong_CompactValue(v); #endif } if (_PyLong_IsNegative(v)) { @@ -686,7 +694,7 @@ PyLong_AsSize_t(PyObject *vv) v = (PyLongObject *)vv; if (_PyLong_IsNonNegativeCompact(v)) { - return _PyLong_CompactValue(v); + return (size_t)_PyLong_CompactValue(v); } if (_PyLong_IsNegative(v)) { PyErr_SetString(PyExc_OverflowError, @@ -723,7 +731,11 @@ _PyLong_AsUnsignedLongMask(PyObject *vv) } v = (PyLongObject *)vv; if (_PyLong_IsCompact(v)) { - return (unsigned long)_PyLong_CompactValue(v); +#if SIZEOF_LONG < SIZEOF_SIZE_T + return (unsigned long)(size_t)_PyLong_CompactValue(v); +#else + return (unsigned long)(long)_PyLong_CompactValue(v); +#endif } i = _PyLong_DigitCount(v); int sign = _PyLong_NonCompactSign(v); @@ -1267,7 +1279,18 @@ PyLong_AsUnsignedLongLong(PyObject *vv) v = (PyLongObject*)vv; if (_PyLong_IsNonNegativeCompact(v)) { res = 0; - bytes = _PyLong_CompactValue(v); +#if SIZEOF_LONG_LONG < SIZEOF_SIZE_T + size_t tmp = (size_t)_PyLong_CompactValue(v); + bytes = (unsigned long long)tmp; + if (bytes != tmp) { + PyErr_SetString(PyExc_OverflowError, + "Python int too large to convert " + "to C unsigned long long"); + res = -1; + } +#else + bytes = (unsigned long long)(size_t)_PyLong_CompactValue(v); +#endif } else { res = _PyLong_AsByteArray((PyLongObject *)vv, (unsigned char *)&bytes, @@ -1298,7 +1321,11 @@ _PyLong_AsUnsignedLongLongMask(PyObject *vv) } v = (PyLongObject *)vv; if (_PyLong_IsCompact(v)) { - return (unsigned long long)(signed long long)_PyLong_CompactValue(v); +#if SIZEOF_LONG_LONG < SIZEOF_SIZE_T + return (unsigned long long)(size_t)_PyLong_CompactValue(v); +#else + return (unsigned long long)(long long)_PyLong_CompactValue(v); +#endif } i = _PyLong_DigitCount(v); sign = _PyLong_NonCompactSign(v); @@ -1370,7 +1397,22 @@ PyLong_AsLongLongAndOverflow(PyObject *vv, int *overflow) do_decref = 1; } if (_PyLong_IsCompact(v)) { +#if SIZEOF_LONG_LONG < SIZEOF_SIZE_T + Py_ssize_t tmp = _PyLong_CompactValue(v); + if (tmp < LLONG_MIN) { + *overflow = -1; + res = -1; + } + else if (tmp > LLONG_MAX) { + *overflow = 1; + res = -1; + } + else { + res = (long long)tmp; + } +#else res = _PyLong_CompactValue(v); +#endif } else { i = _PyLong_DigitCount(v); @@ -3308,7 +3350,7 @@ long_hash(PyLongObject *v) int sign; if (_PyLong_IsCompact(v)) { - x = _PyLong_CompactValue(v); + x = (Py_uhash_t)_PyLong_CompactValue(v); if (x == (Py_uhash_t)-1) { x = (Py_uhash_t)-2; } @@ -6209,7 +6251,7 @@ PyDoc_STRVAR(long_doc, int(x, base=10) -> integer\n\ \n\ Convert a number or string to an integer, or return 0 if no arguments\n\ -are given. If x is a number, return x.__int__(). For floating point\n\ +are given. If x is a number, return x.__int__(). For floating-point\n\ numbers, this truncates towards zero.\n\ \n\ If x is not a number or if base is given, then x must be a string,\n\ diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c index b0168044..9a5f9c66 100644 --- a/Objects/memoryobject.c +++ b/Objects/memoryobject.c @@ -108,8 +108,6 @@ mbuf_release(_PyManagedBufferObject *self) if (self->flags&_Py_MANAGED_BUFFER_RELEASED) return; - /* NOTE: at this point self->exports can still be > 0 if this function - is called from mbuf_clear() to break up a reference cycle. */ self->flags |= _Py_MANAGED_BUFFER_RELEASED; /* PyBuffer_Release() decrements master->obj and sets it to NULL. */ @@ -264,7 +262,7 @@ PyTypeObject _PyManagedBuffer_Type = { /* Assumptions: ndim >= 1. The macro tests for a corner case that should perhaps be explicitly forbidden in the PEP. */ #define HAVE_SUBOFFSETS_IN_LAST_DIM(view) \ - (view->suboffsets && view->suboffsets[dest->ndim-1] >= 0) + (view->suboffsets && view->suboffsets[view->ndim-1] >= 0) static inline int last_dim_is_contiguous(const Py_buffer *dest, const Py_buffer *src) @@ -1092,32 +1090,19 @@ PyBuffer_ToContiguous(void *buf, const Py_buffer *src, Py_ssize_t len, char orde /* Inform the managed buffer that this particular memoryview will not access the underlying buffer again. If no other memoryviews are registered with the managed buffer, the underlying buffer is released instantly and - marked as inaccessible for both the memoryview and the managed buffer. - - This function fails if the memoryview itself has exported buffers. */ -static int + marked as inaccessible for both the memoryview and the managed buffer. */ +static void _memory_release(PyMemoryViewObject *self) { + assert(self->exports == 0); if (self->flags & _Py_MEMORYVIEW_RELEASED) - return 0; + return; - if (self->exports == 0) { - self->flags |= _Py_MEMORYVIEW_RELEASED; - assert(self->mbuf->exports > 0); - if (--self->mbuf->exports == 0) - mbuf_release(self->mbuf); - return 0; + self->flags |= _Py_MEMORYVIEW_RELEASED; + assert(self->mbuf->exports > 0); + if (--self->mbuf->exports == 0) { + mbuf_release(self->mbuf); } - if (self->exports > 0) { - PyErr_Format(PyExc_BufferError, - "memoryview has %zd exported buffer%s", self->exports, - self->exports==1 ? "" : "s"); - return -1; - } - - PyErr_SetString(PyExc_SystemError, - "_memory_release(): negative export count"); - return -1; } /*[clinic input] @@ -1130,9 +1115,21 @@ static PyObject * memoryview_release_impl(PyMemoryViewObject *self) /*[clinic end generated code: output=d0b7e3ba95b7fcb9 input=bc71d1d51f4a52f0]*/ { - if (_memory_release(self) < 0) + if (self->exports == 0) { + _memory_release(self); + Py_RETURN_NONE; + } + + if (self->exports > 0) { + PyErr_Format(PyExc_BufferError, + "memoryview has %zd exported buffer%s", self->exports, + self->exports==1 ? "" : "s"); return NULL; - Py_RETURN_NONE; + } + + PyErr_SetString(PyExc_SystemError, + "memoryview: negative export count"); + return NULL; } static void @@ -1140,7 +1137,7 @@ memory_dealloc(PyMemoryViewObject *self) { assert(self->exports == 0); _PyObject_GC_UNTRACK(self); - (void)_memory_release(self); + _memory_release(self); Py_CLEAR(self->mbuf); if (self->weakreflist != NULL) PyObject_ClearWeakRefs((PyObject *) self); @@ -1157,8 +1154,10 @@ memory_traverse(PyMemoryViewObject *self, visitproc visit, void *arg) static int memory_clear(PyMemoryViewObject *self) { - (void)_memory_release(self); - Py_CLEAR(self->mbuf); + if (self->exports == 0) { + _memory_release(self); + Py_CLEAR(self->mbuf); + } return 0; } @@ -3323,6 +3322,7 @@ memory_iter(PyObject *seq) PyErr_BadInternalCall(); return NULL; } + CHECK_RELEASED(seq); PyMemoryViewObject *obj = (PyMemoryViewObject *)seq; int ndims = obj->view.ndim; if (ndims == 0) { diff --git a/Objects/object.c b/Objects/object.c index aac707d6..70671911 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -159,11 +159,27 @@ _PyDebug_PrintTotalRefs(void) { #ifdef Py_TRACE_REFS -#define REFCHAIN(interp) &interp->object_state.refchain +#define REFCHAIN(interp) interp->object_state.refchain + +static inline int +has_own_refchain(PyInterpreterState *interp) +{ + if (interp->feature_flags & Py_RTFLAGS_USE_MAIN_OBMALLOC) { + return (_Py_IsMainInterpreter(interp) + || _PyInterpreterState_Main() == NULL); + } + return 1; +} static inline void init_refchain(PyInterpreterState *interp) { + if (!has_own_refchain(interp)) { + // Legacy subinterpreters share a refchain with the main interpreter. + REFCHAIN(interp) = REFCHAIN(_PyInterpreterState_Main()); + return; + } + REFCHAIN(interp) = &interp->object_state._refchain_obj; PyObject *refchain = REFCHAIN(interp); refchain->_ob_prev = refchain; refchain->_ob_next = refchain; @@ -1170,7 +1186,8 @@ PyObject_SetAttr(PyObject *v, PyObject *name, PyObject *value) } Py_INCREF(name); - PyUnicode_InternInPlace(&name); + PyInterpreterState *interp = _PyInterpreterState_GET(); + _PyUnicode_InternMortal(interp, &name); if (tp->tp_setattro != NULL) { err = (*tp->tp_setattro)(v, name, value); Py_DECREF(name); @@ -2009,9 +2026,7 @@ void _PyObject_InitState(PyInterpreterState *interp) { #ifdef Py_TRACE_REFS - if (!_Py_IsMainInterpreter(interp)) { - init_refchain(interp); - } + init_refchain(interp); #endif } diff --git a/Objects/odictobject.c b/Objects/odictobject.c index 39b0f684..cf364c13 100644 --- a/Objects/odictobject.c +++ b/Objects/odictobject.c @@ -789,6 +789,7 @@ _odict_clear_nodes(PyODictObject *od) _odictnode_DEALLOC(node); node = next; } + od->od_state++; } /* There isn't any memory management of nodes past this point. */ @@ -799,24 +800,40 @@ _odict_keys_equal(PyODictObject *a, PyODictObject *b) { _ODictNode *node_a, *node_b; + // keep operands' state to detect undesired mutations + const size_t state_a = a->od_state; + const size_t state_b = b->od_state; + node_a = _odict_FIRST(a); node_b = _odict_FIRST(b); while (1) { - if (node_a == NULL && node_b == NULL) + if (node_a == NULL && node_b == NULL) { /* success: hit the end of each at the same time */ return 1; - else if (node_a == NULL || node_b == NULL) + } + else if (node_a == NULL || node_b == NULL) { /* unequal length */ return 0; + } else { - int res = PyObject_RichCompareBool( - (PyObject *)_odictnode_KEY(node_a), - (PyObject *)_odictnode_KEY(node_b), - Py_EQ); - if (res < 0) + PyObject *key_a = Py_NewRef(_odictnode_KEY(node_a)); + PyObject *key_b = Py_NewRef(_odictnode_KEY(node_b)); + int res = PyObject_RichCompareBool(key_a, key_b, Py_EQ); + Py_DECREF(key_a); + Py_DECREF(key_b); + if (res < 0) { return res; - else if (res == 0) + } + else if (a->od_state != state_a || b->od_state != state_b) { + PyErr_SetString(PyExc_RuntimeError, + "OrderedDict mutated during iteration"); + return -1; + } + else if (res == 0) { + // This check comes after the check on the state + // in order for the exception to be set correctly. return 0; + } /* otherwise it must match, so move on to the next one */ node_a = _odictnode_NEXT(node_a); diff --git a/Objects/structseq.c b/Objects/structseq.c index 8b189595..246d4c76 100644 --- a/Objects/structseq.c +++ b/Objects/structseq.c @@ -41,12 +41,20 @@ get_type_attr_as_size(PyTypeObject *tp, PyObject *name) get_type_attr_as_size(tp, &_Py_ID(n_sequence_fields)) #define REAL_SIZE_TP(tp) \ get_type_attr_as_size(tp, &_Py_ID(n_fields)) -#define REAL_SIZE(op) REAL_SIZE_TP(Py_TYPE(op)) +#define REAL_SIZE(op) get_real_size((PyObject *)op) #define UNNAMED_FIELDS_TP(tp) \ get_type_attr_as_size(tp, &_Py_ID(n_unnamed_fields)) #define UNNAMED_FIELDS(op) UNNAMED_FIELDS_TP(Py_TYPE(op)) +static Py_ssize_t +get_real_size(PyObject *op) +{ + // Compute the real size from the visible size (i.e., Py_SIZE()) and the + // number of non-sequence fields accounted for in tp_basicsize. + Py_ssize_t hidden = Py_TYPE(op)->tp_basicsize - offsetof(PyStructSequence, ob_item); + return Py_SIZE(op) + hidden / sizeof(PyObject *); +} PyObject * PyStructSequence_New(PyTypeObject *type) @@ -107,6 +115,9 @@ structseq_dealloc(PyStructSequence *obj) PyObject_GC_UnTrack(obj); PyTypeObject *tp = Py_TYPE(obj); + // gh-122527: We can't use REAL_SIZE_TP() or any macros that access the + // type's dictionary here, because the dictionary may have already been + // cleared by the garbage collector. size = REAL_SIZE(obj); for (i = 0; i < size; ++i) { Py_XDECREF(obj->ob_item[i]); @@ -467,10 +478,14 @@ initialize_members(PyStructSequence_Desc *desc, static void initialize_static_fields(PyTypeObject *type, PyStructSequence_Desc *desc, - PyMemberDef *tp_members, unsigned long tp_flags) + PyMemberDef *tp_members, Py_ssize_t n_members, + unsigned long tp_flags) { type->tp_name = desc->name; - type->tp_basicsize = sizeof(PyStructSequence) - sizeof(PyObject *); + // Account for hidden members in tp_basicsize because they are not + // included in the variable size. + Py_ssize_t n_hidden = n_members - desc->n_in_sequence; + type->tp_basicsize = sizeof(PyStructSequence) + (n_hidden - 1) * sizeof(PyObject *); type->tp_itemsize = sizeof(PyObject *); type->tp_dealloc = (destructor)structseq_dealloc; type->tp_repr = (reprfunc)structseq_repr; @@ -520,7 +535,7 @@ _PyStructSequence_InitBuiltinWithFlags(PyInterpreterState *interp, if (members == NULL) { goto error; } - initialize_static_fields(type, desc, members, tp_flags); + initialize_static_fields(type, desc, members, n_members, tp_flags); _Py_SetImmortal(type); } @@ -582,7 +597,7 @@ PyStructSequence_InitType2(PyTypeObject *type, PyStructSequence_Desc *desc) if (members == NULL) { return -1; } - initialize_static_fields(type, desc, members, 0); + initialize_static_fields(type, desc, members, n_members, 0); if (initialize_static_type(type, desc, n_members, n_unnamed_members) < 0) { PyMem_Free(members); return -1; @@ -658,7 +673,8 @@ _PyStructSequence_NewType(PyStructSequence_Desc *desc, unsigned long tp_flags) /* The name in this PyType_Spec is statically allocated so it is */ /* expected that it'll outlive the PyType_Spec */ spec.name = desc->name; - spec.basicsize = sizeof(PyStructSequence) - sizeof(PyObject *); + Py_ssize_t hidden = n_members - desc->n_in_sequence; + spec.basicsize = (int)(sizeof(PyStructSequence) + (hidden - 1) * sizeof(PyObject *)); spec.itemsize = sizeof(PyObject *); spec.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | tp_flags; spec.slots = slots; diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index 991edcc8..918654fa 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -1139,7 +1139,7 @@ maybe_freelist_pop(Py_ssize_t size) return NULL; } assert(size > 0); - if (size < PyTuple_MAXSAVESIZE) { + if (size <= PyTuple_MAXSAVESIZE) { Py_ssize_t index = size - 1; PyTupleObject *op = STATE.free_list[index]; if (op != NULL) { diff --git a/Objects/typeobject.c b/Objects/typeobject.c index bf2be42f..5bca4b4e 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -116,6 +116,7 @@ static_builtin_index_clear(PyTypeObject *self) self->tp_subclasses = NULL; } + static inline static_builtin_state * static_builtin_state_get(PyInterpreterState *interp, PyTypeObject *self) { @@ -1079,8 +1080,10 @@ type_module(PyTypeObject *type, void *context) if (s != NULL) { mod = PyUnicode_FromStringAndSize( type->tp_name, (Py_ssize_t)(s - type->tp_name)); - if (mod != NULL) - PyUnicode_InternInPlace(&mod); + if (mod != NULL) { + PyInterpreterState *interp = _PyInterpreterState_GET(); + _PyUnicode_InternMortal(interp, &mod); + } } else { mod = Py_NewRef(&_Py_ID(builtins)); @@ -4917,7 +4920,8 @@ type_setattro(PyTypeObject *type, PyObject *name, PyObject *value) } /* bpo-40521: Interned strings are shared by all subinterpreters */ if (!PyUnicode_CHECK_INTERNED(name)) { - PyUnicode_InternInPlace(&name); + PyInterpreterState *interp = _PyInterpreterState_GET(); + _PyUnicode_InternMortal(interp, &name); if (!PyUnicode_CHECK_INTERNED(name)) { PyErr_SetString(PyExc_MemoryError, "Out of memory interning an attribute name"); @@ -5709,7 +5713,6 @@ compatible_for_assignment(PyTypeObject* oldto, PyTypeObject* newto, const char* static int object_set_class(PyObject *self, PyObject *value, void *closure) { - PyTypeObject *oldto = Py_TYPE(self); if (value == NULL) { PyErr_SetString(PyExc_TypeError, @@ -5729,6 +5732,8 @@ object_set_class(PyObject *self, PyObject *value, void *closure) return -1; } + PyTypeObject *oldto = Py_TYPE(self); + /* In versions of CPython prior to 3.5, the code in compatible_for_assignment was not set up to correctly check for memory layout / slot / etc. compatibility for non-HEAPTYPE classes, so we just @@ -6640,6 +6645,12 @@ type_add_method(PyTypeObject *type, PyMethodDef *meth) return 0; } +int +_PyType_AddMethod(PyTypeObject *type, PyMethodDef *meth) +{ + return type_add_method(type, meth); +} + /* Add the methods from tp_methods to the __dict__ in a type object */ static int @@ -7584,6 +7595,7 @@ _PyStaticType_InitBuiltin(PyInterpreterState *interp, PyTypeObject *self) if (res < 0) { static_builtin_state_clear(interp, self); } + return res; } @@ -8195,13 +8207,13 @@ wrap_buffer(PyObject *self, PyObject *args, void *wrapped) if (flags == -1 && PyErr_Occurred()) { return NULL; } - if (flags > INT_MAX) { + if (flags > INT_MAX || flags < INT_MIN) { PyErr_SetString(PyExc_OverflowError, - "buffer flags too large"); + "buffer flags out of range"); return NULL; } - return _PyMemoryView_FromBufferProc(self, Py_SAFE_DOWNCAST(flags, Py_ssize_t, int), + return _PyMemoryView_FromBufferProc(self, (int)flags, (getbufferproc)wrapped); } @@ -10076,6 +10088,84 @@ recurse_down_subclasses(PyTypeObject *type, PyObject *attr_name, return 0; } +static int +expect_manually_inherited(PyTypeObject *type, void **slot) +{ + PyObject *typeobj = (PyObject *)type; + if (slot == (void *)&type->tp_init) { + /* This is a best-effort list of builtin exception types + that have their own tp_init function. */ + if (typeobj != PyExc_BaseException + && typeobj != PyExc_BaseExceptionGroup + && typeobj != PyExc_ImportError + && typeobj != PyExc_NameError + && typeobj != PyExc_OSError + && typeobj != PyExc_StopIteration + && typeobj != PyExc_SyntaxError + && typeobj != PyExc_UnicodeDecodeError + && typeobj != PyExc_UnicodeEncodeError + + && type != &PyBool_Type + && type != &PyBytes_Type + && type != &PyMemoryView_Type + && type != &PyComplex_Type + && type != &PyEnum_Type + && type != &PyFilter_Type + && type != &PyFloat_Type + && type != &PyFrozenSet_Type + && type != &PyLong_Type + && type != &PyMap_Type + && type != &PyRange_Type + && type != &PyReversed_Type + && type != &PySlice_Type + && type != &PyTuple_Type + && type != &PyUnicode_Type + && type != &PyZip_Type) + + { + return 1; + } + } + else if (slot == (void *)&type->tp_str) { + /* This is a best-effort list of builtin exception types + that have their own tp_str function. */ + if (typeobj == PyExc_AttributeError || typeobj == PyExc_NameError) { + return 1; + } + } + else if (slot == (void *)&type->tp_getattr + || slot == (void *)&type->tp_getattro) + { + /* This is a best-effort list of builtin types + that have their own tp_getattr function. */ + if (typeobj == PyExc_BaseException + || type == &PyByteArray_Type + || type == &PyBytes_Type + || type == &PyComplex_Type + || type == &PyDict_Type + || type == &PyEnum_Type + || type == &PyFilter_Type + || type == &PyLong_Type + || type == &PyList_Type + || type == &PyMap_Type + || type == &PyMemoryView_Type + || type == &PyProperty_Type + || type == &PyRange_Type + || type == &PyReversed_Type + || type == &PySet_Type + || type == &PySlice_Type + || type == &PySuper_Type + || type == &PyTuple_Type + || type == &PyZip_Type) + { + return 1; + } + } + + /* It must be inherited (see type_ready_inherit()).. */ + return 0; +} + /* This function is called by PyType_Ready() to populate the type's dictionary with method descriptors for function slots. For each function slot (like tp_repr) that's defined in the type, one or more @@ -10120,6 +10210,26 @@ add_operators(PyTypeObject *type) ptr = slotptr(type, p->offset); if (!ptr || !*ptr) continue; + if (type->tp_flags & _Py_TPFLAGS_STATIC_BUILTIN + && type->tp_base != NULL) + { + /* Also ignore when the type slot has been inherited. */ + void **ptr_base = slotptr(type->tp_base, p->offset); + if (ptr_base && *ptr == *ptr_base) { + /* Ideally we would always ignore any manually inherited + slots, Which would mean inheriting the slot wrapper + using normal attribute lookup rather than keeping + a distinct copy. However, that would introduce + a slight change in behavior that could break + existing code. + + In the meantime, look the other way when the definition + explicitly inherits the slot. */ + if (!expect_manually_inherited(type, ptr)) { + continue; + } + } + } int r = PyDict_Contains(dict, p->name_strobj); if (r > 0) continue; diff --git a/Objects/typevarobject.c b/Objects/typevarobject.c index db9c2191..4f0bc096 100644 --- a/Objects/typevarobject.c +++ b/Objects/typevarobject.c @@ -1364,7 +1364,16 @@ typealias_alloc(PyObject *name, PyObject *type_params, PyObject *compute_value, return NULL; } ta->name = Py_NewRef(name); - ta->type_params = Py_IsNone(type_params) ? NULL : Py_XNewRef(type_params); + if ( + type_params == NULL + || Py_IsNone(type_params) + || (PyTuple_Check(type_params) && PyTuple_GET_SIZE(type_params) == 0) + ) { + ta->type_params = NULL; + } + else { + ta->type_params = Py_NewRef(type_params); + } ta->compute_value = Py_XNewRef(compute_value); ta->value = Py_XNewRef(value); ta->module = Py_XNewRef(module); diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index fc9379be..c885be5b 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -179,10 +179,7 @@ extern "C" { *_to++ = (to_type) *_iter++; \ } while (0) -#define LATIN1(ch) \ - (ch < 128 \ - ? (PyObject*)&_Py_SINGLETON(strings).ascii[ch] \ - : (PyObject*)&_Py_SINGLETON(strings).latin1[ch - 128]) +#define LATIN1 _Py_LATIN1_CHR #ifdef MS_WINDOWS /* On Windows, overallocate by 50% is the best factor */ @@ -225,18 +222,20 @@ static inline PyObject* unicode_new_empty(void) return Py_NewRef(empty); } -/* This dictionary holds all interned unicode strings. Note that references - to strings in this dictionary are *not* counted in the string's ob_refcnt. - When the interned string reaches a refcnt of 0 the string deallocation - function will delete the reference from this dictionary. -*/ +/* This dictionary holds per-interpreter interned strings. + * See InternalDocs/string_interning.md for details. + */ static inline PyObject *get_interned_dict(PyInterpreterState *interp) { return _Py_INTERP_CACHED_OBJECT(interp, interned_strings); } +/* This hashtable holds statically allocated interned strings. + * See InternalDocs/string_interning.md for details. + */ #define INTERNED_STRINGS _PyRuntime.cached_objects.interned_strings +/* Get number of all interned strings for the current interpreter. */ Py_ssize_t _PyUnicode_InternedSize(void) { @@ -244,6 +243,28 @@ _PyUnicode_InternedSize(void) return _Py_hashtable_len(INTERNED_STRINGS) + PyDict_GET_SIZE(dict); } +/* Get number of immortal interned strings for the current interpreter. */ +Py_ssize_t +_PyUnicode_InternedSize_Immortal(void) +{ + PyObject *dict = get_interned_dict(_PyInterpreterState_GET()); + PyObject *key, *value; + Py_ssize_t pos = 0; + Py_ssize_t count = 0; + + // It's tempting to keep a count and avoid a loop here. But, this function + // is intended for refleak tests. It spends extra work to report the true + // value, to help detect bugs in optimizations. + + while (PyDict_Next(dict, &pos, &key, &value)) { + assert(PyUnicode_CHECK_INTERNED(key) != SSTATE_INTERNED_IMMORTAL_STATIC); + if (PyUnicode_CHECK_INTERNED(key) == SSTATE_INTERNED_IMMORTAL) { + count++; + } + } + return _Py_hashtable_len(INTERNED_STRINGS) + count; +} + static Py_hash_t unicode_hash(PyObject *); static int unicode_compare_eq(PyObject *, PyObject *); @@ -266,28 +287,38 @@ hashtable_unicode_compare(const void *key1, const void *key2) } } +/* Return true if this interpreter should share the main interpreter's + intern_dict. That's important for interpreters which load basic + single-phase init extension modules (m_size == -1). There could be interned + immortal strings that are shared between interpreters, due to the + PyDict_Update(mdict, m_copy) call in import_find_extension(). + + It's not safe to deallocate those strings until all interpreters that + potentially use them are freed. By storing them in the main interpreter, we + ensure they get freed after all other interpreters are freed. +*/ +static bool +has_shared_intern_dict(PyInterpreterState *interp) +{ + PyInterpreterState *main_interp = _PyInterpreterState_Main(); + return interp != main_interp && interp->feature_flags & Py_RTFLAGS_USE_MAIN_OBMALLOC; +} + static int init_interned_dict(PyInterpreterState *interp) { - if (_Py_IsMainInterpreter(interp)) { - assert(INTERNED_STRINGS == NULL); - _Py_hashtable_allocator_t hashtable_alloc = {PyMem_RawMalloc, PyMem_RawFree}; - INTERNED_STRINGS = _Py_hashtable_new_full( - hashtable_unicode_hash, - hashtable_unicode_compare, - NULL, - NULL, - &hashtable_alloc - ); - if (INTERNED_STRINGS == NULL) { + assert(get_interned_dict(interp) == NULL); + PyObject *interned; + if (has_shared_intern_dict(interp)) { + interned = get_interned_dict(_PyInterpreterState_Main()); + Py_INCREF(interned); + } + else { + interned = PyDict_New(); + if (interned == NULL) { return -1; } } - assert(get_interned_dict(interp) == NULL); - PyObject *interned = interned = PyDict_New(); - if (interned == NULL) { - return -1; - } _Py_INTERP_CACHED_OBJECT(interp, interned_strings) = interned; return 0; } @@ -297,11 +328,62 @@ clear_interned_dict(PyInterpreterState *interp) { PyObject *interned = get_interned_dict(interp); if (interned != NULL) { - PyDict_Clear(interned); + if (!has_shared_intern_dict(interp)) { + // only clear if the dict belongs to this interpreter + PyDict_Clear(interned); + } Py_DECREF(interned); _Py_INTERP_CACHED_OBJECT(interp, interned_strings) = NULL; } - if (_Py_IsMainInterpreter(interp) && INTERNED_STRINGS != NULL) { +} + +static PyStatus +init_global_interned_strings(PyInterpreterState *interp) +{ + assert(INTERNED_STRINGS == NULL); + _Py_hashtable_allocator_t hashtable_alloc = {PyMem_RawMalloc, PyMem_RawFree}; + + INTERNED_STRINGS = _Py_hashtable_new_full( + hashtable_unicode_hash, + hashtable_unicode_compare, + // Objects stored here are immortal and statically allocated, + // so we don't need key_destroy_func & value_destroy_func: + NULL, + NULL, + &hashtable_alloc + ); + if (INTERNED_STRINGS == NULL) { + PyErr_Clear(); + return _PyStatus_ERR("failed to create global interned dict"); + } + + /* Intern statically allocated string identifiers, deepfreeze strings, + * and one-byte latin-1 strings. + * This must be done before any module initialization so that statically + * allocated string identifiers are used instead of heap allocated strings. + * Deepfreeze uses the interned identifiers if present to save space + * else generates them and they are interned to speed up dict lookups. + */ + _PyUnicode_InitStaticStrings(interp); + + for (int i = 0; i < 256; i++) { + PyObject *s = LATIN1(i); + _PyUnicode_InternStatic(interp, &s); + assert(s == LATIN1(i)); + } +#ifdef Py_DEBUG + assert(_PyUnicode_CheckConsistency(&_Py_STR(empty), 1)); + + for (int i = 0; i < 256; i++) { + assert(_PyUnicode_CheckConsistency(LATIN1(i), 1)); + } +#endif + return _PyStatus_OK(); +} + +static void clear_global_interned_strings(void) +{ + if (INTERNED_STRINGS != NULL) { _Py_hashtable_destroy(INTERNED_STRINGS); INTERNED_STRINGS = NULL; } @@ -634,6 +716,41 @@ _PyUnicode_CheckConsistency(PyObject *op, int check_content) } CHECK(PyUnicode_READ(kind, data, ascii->length) == 0); } + + /* Check interning state */ +#ifdef Py_DEBUG + // Note that we do not check `_Py_IsImmortal(op)`, since stable ABI + // extensions can make immortal strings mortal (but with a high enough + // refcount). + // The other way is extremely unlikely (worth a potential failed assertion + // in a debug build), so we do check `!_Py_IsImmortal(op)`. + switch (PyUnicode_CHECK_INTERNED(op)) { + case SSTATE_NOT_INTERNED: + if (ascii->state.statically_allocated) { + // This state is for two exceptions: + // - strings are currently checked before they're interned + // - the 256 one-latin1-character strings + // are static but use SSTATE_NOT_INTERNED + } + else { + CHECK(!_Py_IsImmortal(op)); + } + break; + case SSTATE_INTERNED_MORTAL: + CHECK(!ascii->state.statically_allocated); + CHECK(!_Py_IsImmortal(op)); + break; + case SSTATE_INTERNED_IMMORTAL: + CHECK(!ascii->state.statically_allocated); + break; + case SSTATE_INTERNED_IMMORTAL_STATIC: + CHECK(ascii->state.statically_allocated); + break; + default: + Py_UNREACHABLE(); + } +#endif + return 1; #undef CHECK @@ -1592,16 +1709,65 @@ unicode_dealloc(PyObject *unicode) _Py_FatalRefcountError("deallocating an Unicode singleton"); } #endif - /* This should never get called, but we also don't want to SEGV if - * we accidentally decref an immortal string out of existence. Since - * the string is an immortal object, just re-set the reference count. - */ - if (PyUnicode_CHECK_INTERNED(unicode) - || _PyUnicode_STATE(unicode).statically_allocated) - { + if (_PyUnicode_STATE(unicode).statically_allocated) { + /* This should never get called, but we also don't want to SEGV if + * we accidentally decref an immortal string out of existence. Since + * the string is an immortal object, just re-set the reference count. + */ +#ifdef Py_DEBUG + Py_UNREACHABLE(); +#endif _Py_SetImmortal(unicode); return; } + switch (_PyUnicode_STATE(unicode).interned) { + case SSTATE_NOT_INTERNED: + break; + case SSTATE_INTERNED_MORTAL: + /* Remove the object from the intern dict. + * Before doing so, we set the refcount to 3: the key and value + * in the interned_dict, plus one to work with. + */ + assert(Py_REFCNT(unicode) == 0); + Py_SET_REFCNT(unicode, 3); +#ifdef Py_REF_DEBUG + /* let's be pedantic with the ref total */ + _Py_IncRefTotal(_PyInterpreterState_GET()); + _Py_IncRefTotal(_PyInterpreterState_GET()); + _Py_IncRefTotal(_PyInterpreterState_GET()); +#endif + PyInterpreterState *interp = _PyInterpreterState_GET(); + PyObject *interned = get_interned_dict(interp); + assert(interned != NULL); + int r = PyDict_DelItem(interned, unicode); + if (r == -1) { + PyErr_WriteUnraisable(unicode); + // We don't know what happened to the string. It's probably + // best to leak it: + // - if it was not found, something is very wrong + // - if it was deleted, there are no more references to it + // so it can't cause trouble (except wasted memory) + // - if it wasn't deleted, it'll remain interned + _Py_SetImmortal(unicode); + _PyUnicode_STATE(unicode).interned = SSTATE_INTERNED_IMMORTAL; + return; + } + // Only our work reference should be left; remove it too. + assert(Py_REFCNT(unicode) == 1); + Py_SET_REFCNT(unicode, 0); +#ifdef Py_REF_DEBUG + /* let's be pedantic with the ref total */ + _Py_DecRefTotal(_PyInterpreterState_GET()); +#endif + break; + default: + // As with `statically_allocated` above. +#ifdef Py_REF_DEBUG + Py_UNREACHABLE(); +#endif + _Py_SetImmortal(unicode); + return; + } if (_PyUnicode_HAS_UTF8_MEMORY(unicode)) { PyObject_Free(_PyUnicode_UTF8(unicode)); } @@ -1763,7 +1929,8 @@ unicode_write_cstr(PyObject *unicode, Py_ssize_t index, static PyObject* get_latin1_char(Py_UCS1 ch) { - return Py_NewRef(LATIN1(ch)); + PyObject *o = LATIN1(ch); + return o; } static PyObject* @@ -1943,7 +2110,7 @@ _PyUnicode_FromId(_Py_Identifier *id) if (!obj) { return NULL; } - PyUnicode_InternInPlace(&obj); + _PyUnicode_InternImmortal(interp, &obj); if (index >= ids->size) { // Overallocate to reduce the number of realloc @@ -3851,6 +4018,18 @@ PyUnicode_AsUTF8(PyObject *unicode) return PyUnicode_AsUTF8AndSize(unicode, NULL); } +const char * +_PyUnicode_AsUTF8NoNUL(PyObject *unicode) +{ + Py_ssize_t size; + const char *s = PyUnicode_AsUTF8AndSize(unicode, &size); + if (s && strlen(s) != (size_t)size) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + return NULL; + } + return s; +} + /* PyUnicode_GetSize() has been deprecated since Python 3.3 because it returned length of Py_UNICODE. @@ -10728,8 +10907,10 @@ _PyUnicode_EqualToASCIIId(PyObject *left, _Py_Identifier *right) if (left == right_uni) return 1; - if (PyUnicode_CHECK_INTERNED(left)) + assert(PyUnicode_CHECK_INTERNED(right_uni)); + if (PyUnicode_CHECK_INTERNED(left)) { return 0; + } assert(_PyUnicode_HASH(right_uni) != -1); Py_hash_t hash = _PyUnicode_HASH(left); @@ -14704,28 +14885,26 @@ _PyUnicode_InitState(PyInterpreterState *interp) PyStatus _PyUnicode_InitGlobalObjects(PyInterpreterState *interp) { - // Initialize the global interned dict - if (init_interned_dict(interp)) { - PyErr_Clear(); - return _PyStatus_ERR("failed to create interned dict"); + if (_Py_IsMainInterpreter(interp)) { + PyStatus status = init_global_interned_strings(interp); + if (_PyStatus_EXCEPTION(status)) { + return status; + } } + assert(INTERNED_STRINGS); - if (_Py_IsMainInterpreter(interp)) { - /* Intern statically allocated string identifiers and deepfreeze strings. - * This must be done before any module initialization so that statically - * allocated string identifiers are used instead of heap allocated strings. - * Deepfreeze uses the interned identifiers if present to save space - * else generates them and they are interned to speed up dict lookups. - */ - _PyUnicode_InitStaticStrings(interp); + return _PyStatus_OK(); +} -#ifdef Py_DEBUG - assert(_PyUnicode_CheckConsistency(&_Py_STR(empty), 1)); - for (int i = 0; i < 256; i++) { - assert(_PyUnicode_CheckConsistency(LATIN1(i), 1)); - } -#endif +PyStatus +_PyUnicode_InitInternDict(PyInterpreterState *interp) +{ + assert(INTERNED_STRINGS); + + if (init_interned_dict(interp)) { + PyErr_Clear(); + return _PyStatus_ERR("failed to create interned dict"); } return _PyStatus_OK(); @@ -14750,104 +14929,243 @@ _PyUnicode_InitTypes(PyInterpreterState *interp) return _PyStatus_ERR("Can't initialize unicode types"); } +static /* non-null */ PyObject* +intern_static(PyInterpreterState *interp, PyObject *s /* stolen */) +{ + // Note that this steals a reference to `s`, but in many cases that + // stolen ref is returned, requiring no decref/incref. + + assert(s != NULL); + assert(_PyUnicode_CHECK(s)); + assert(_PyUnicode_STATE(s).statically_allocated); + assert(!PyUnicode_CHECK_INTERNED(s)); + +#ifdef Py_DEBUG + /* We must not add process-global interned string if there's already a + * per-interpreter interned_dict, which might contain duplicates. + */ + PyObject *interned = get_interned_dict(interp); + assert(interned == NULL); +#endif + + /* Look in the global cache first. */ + PyObject *r = (PyObject *)_Py_hashtable_get(INTERNED_STRINGS, s); + /* We should only init each string once */ + assert(r == NULL); + /* but just in case (for the non-debug build), handle this */ + if (r != NULL && r != s) { + assert(_PyUnicode_STATE(r).interned == SSTATE_INTERNED_IMMORTAL_STATIC); + assert(_PyUnicode_CHECK(r)); + Py_DECREF(s); + return Py_NewRef(r); + } + + if (_Py_hashtable_set(INTERNED_STRINGS, s, s) < -1) { + Py_FatalError("failed to intern static string"); + } + + _PyUnicode_STATE(s).interned = SSTATE_INTERNED_IMMORTAL_STATIC; + return s; +} void -_PyUnicode_InternInPlace(PyInterpreterState *interp, PyObject **p) +_PyUnicode_InternStatic(PyInterpreterState *interp, PyObject **p) +{ + // This should only be called as part of runtime initialization + assert(!Py_IsInitialized()); + + *p = intern_static(interp, *p); + assert(*p); +} + +static void +immortalize_interned(PyObject *s) +{ + assert(PyUnicode_CHECK_INTERNED(s) == SSTATE_INTERNED_MORTAL); + assert(!_Py_IsImmortal(s)); +#ifdef Py_REF_DEBUG + /* The reference count value should be excluded from the RefTotal. + The decrements to these objects will not be registered so they + need to be accounted for in here. */ + for (Py_ssize_t i = 0; i < Py_REFCNT(s); i++) { + _Py_DecRefTotal(_PyInterpreterState_GET()); + } +#endif + _PyUnicode_STATE(s).interned = SSTATE_INTERNED_IMMORTAL; + _Py_SetImmortal(s); +} + +static /* non-null */ PyObject* +intern_common(PyInterpreterState *interp, PyObject *s /* stolen */, + bool immortalize) { - PyObject *s = *p; + // Note that this steals a reference to `s`, but in many cases that + // stolen ref is returned, requiring no decref/incref. + #ifdef Py_DEBUG assert(s != NULL); assert(_PyUnicode_CHECK(s)); #else if (s == NULL || !PyUnicode_Check(s)) { - return; + return s; } #endif /* If it's a subclass, we don't really know what putting it in the interned dict might do. */ if (!PyUnicode_CheckExact(s)) { - return; + return s; } - if (PyUnicode_CHECK_INTERNED(s)) { - return; + /* Is it already interned? */ + switch (PyUnicode_CHECK_INTERNED(s)) { + case SSTATE_NOT_INTERNED: + // no, go on + break; + case SSTATE_INTERNED_MORTAL: + // yes but we might need to make it immortal + if (immortalize) { + immortalize_interned(s); + } + return s; + default: + // all done + return s; } - /* Look in the global cache first. */ - PyObject *r = (PyObject *)_Py_hashtable_get(INTERNED_STRINGS, s); - if (r != NULL && r != s) { - Py_SETREF(*p, Py_NewRef(r)); - return; + if (_PyUnicode_STATE(s).statically_allocated) { + return intern_static(interp, s); } - /* Handle statically allocated strings. */ - if (_PyUnicode_STATE(s).statically_allocated) { - assert(_Py_IsImmortal(s)); - if (_Py_hashtable_set(INTERNED_STRINGS, s, s) == 0) { - _PyUnicode_STATE(*p).interned = SSTATE_INTERNED_IMMORTAL_STATIC; + /* If it's already immortal, intern it as such */ + if (_Py_IsImmortal(s)) { + immortalize = 1; + } + + /* if it's a short string, get the singleton */ + if (PyUnicode_GET_LENGTH(s) == 1 && + PyUnicode_KIND(s) == PyUnicode_1BYTE_KIND) { + PyObject *r = LATIN1(*(unsigned char*)PyUnicode_DATA(s)); + assert(PyUnicode_CHECK_INTERNED(r)); + Py_DECREF(s); + return r; + } +#ifdef Py_DEBUG + assert(!unicode_is_singleton(s)); +#endif + + /* Look in the global cache now. */ + { + PyObject *r = (PyObject *)_Py_hashtable_get(INTERNED_STRINGS, s); + if (r != NULL) { + assert(_PyUnicode_STATE(r).statically_allocated); + assert(r != s); // r must be statically_allocated; s is not + Py_DECREF(s); + return Py_NewRef(r); } - return; } - /* Look in the per-interpreter cache. */ + /* Do a setdefault on the per-interpreter cache. */ PyObject *interned = get_interned_dict(interp); assert(interned != NULL); - PyObject *t = PyDict_SetDefault(interned, s, s); + PyObject *t = PyDict_SetDefault(interned, s, s); // t is borrowed if (t == NULL) { PyErr_Clear(); - return; + return s; } if (t != s) { - Py_SETREF(*p, Py_NewRef(t)); - return; + // value was already present (not inserted) + Py_INCREF(t); + Py_DECREF(s); + if (immortalize && + PyUnicode_CHECK_INTERNED(t) == SSTATE_INTERNED_MORTAL) { + immortalize_interned(t); + } + return t; } - - if (_Py_IsImmortal(s)) { - // XXX Restrict this to the main interpreter? - _PyUnicode_STATE(*p).interned = SSTATE_INTERNED_IMMORTAL_STATIC; - return; + else { + // value was newly inserted } + /* NOT_INTERNED -> INTERNED_MORTAL */ + + assert(_PyUnicode_STATE(s).interned == SSTATE_NOT_INTERNED); + + if (!_Py_IsImmortal(s)) { + /* The two references in interned dict (key and value) are not counted. + unicode_dealloc() and _PyUnicode_ClearInterned() take care of this. */ + Py_SET_REFCNT(s, Py_REFCNT(s) - 2); #ifdef Py_REF_DEBUG - /* The reference count value excluding the 2 references from the - interned dictionary should be excluded from the RefTotal. The - decrements to these objects will not be registered so they - need to be accounted for in here. */ - for (Py_ssize_t i = 0; i < Py_REFCNT(s) - 2; i++) { + /* let's be pedantic with the ref total */ + _Py_DecRefTotal(_PyInterpreterState_GET()); _Py_DecRefTotal(_PyInterpreterState_GET()); +#endif + } + _PyUnicode_STATE(s).interned = SSTATE_INTERNED_MORTAL; + + /* INTERNED_MORTAL -> INTERNED_IMMORTAL (if needed) */ + +#ifdef Py_DEBUG + if (_Py_IsImmortal(s)) { + assert(immortalize); } #endif - _Py_SetImmortal(s); - _PyUnicode_STATE(*p).interned = SSTATE_INTERNED_IMMORTAL; + if (immortalize) { + immortalize_interned(s); + } + + return s; +} + +void +_PyUnicode_InternImmortal(PyInterpreterState *interp, PyObject **p) +{ + *p = intern_common(interp, *p, 1); + assert(*p); +} + +void +_PyUnicode_InternMortal(PyInterpreterState *interp, PyObject **p) +{ + *p = intern_common(interp, *p, 0); + assert(*p); +} + + +void +_PyUnicode_InternInPlace(PyInterpreterState *interp, PyObject **p) +{ + _PyUnicode_InternImmortal(interp, p); + return; } void PyUnicode_InternInPlace(PyObject **p) { PyInterpreterState *interp = _PyInterpreterState_GET(); - _PyUnicode_InternInPlace(interp, p); + _PyUnicode_InternMortal(interp, p); } -// Function kept for the stable ABI. +// Public-looking name kept for the stable ABI; user should not call this: PyAPI_FUNC(void) PyUnicode_InternImmortal(PyObject **); void PyUnicode_InternImmortal(PyObject **p) { - PyUnicode_InternInPlace(p); - // Leak a reference on purpose - Py_INCREF(*p); + PyInterpreterState *interp = _PyInterpreterState_GET(); + _PyUnicode_InternImmortal(interp, p); } PyObject * PyUnicode_InternFromString(const char *cp) { PyObject *s = PyUnicode_FromString(cp); - if (s == NULL) + if (s == NULL) { return NULL; - PyUnicode_InternInPlace(&s); + } + PyInterpreterState *interp = _PyInterpreterState_GET(); + _PyUnicode_InternMortal(interp, &s); return s; } @@ -14861,20 +15179,13 @@ _PyUnicode_ClearInterned(PyInterpreterState *interp) } assert(PyDict_CheckExact(interned)); - /* TODO: - * Currently, the runtime is not able to guarantee that it can exit without - * allocations that carry over to a future initialization of Python within - * the same process. i.e: - * ./python -X showrefcount -c 'import itertools' - * [237 refs, 237 blocks] - * - * Therefore, this should remain disabled for until there is a strict guarantee - * that no memory will be left after `Py_Finalize`. - */ -#ifdef Py_DEBUG - /* For all non-singleton interned strings, restore the two valid references - to that instance from within the intern string dictionary and let the - normal reference counting process clean up these instances. */ + if (has_shared_intern_dict(interp)) { + // the dict doesn't belong to this interpreter, skip the debug + // checks on it and just clear the pointer to it + clear_interned_dict(interp); + return; + } + #ifdef INTERNED_STATS fprintf(stderr, "releasing %zd interned strings\n", PyDict_GET_SIZE(interned)); @@ -14888,13 +15199,32 @@ _PyUnicode_ClearInterned(PyInterpreterState *interp) int shared = 0; switch (PyUnicode_CHECK_INTERNED(s)) { case SSTATE_INTERNED_IMMORTAL: + /* Make immortal interned strings mortal again. + * + * Currently, the runtime is not able to guarantee that it can exit + * without allocations that carry over to a future initialization + * of Python within the same process. i.e: + * ./python -X showrefcount -c 'import itertools' + * [237 refs, 237 blocks] + * + * This should remain disabled (`Py_DEBUG` only) until there is a + * strict guarantee that no memory will be left after + * `Py_Finalize`. + */ +#ifdef Py_DEBUG // Skip the Immortal Instance check and restore // the two references (key and value) ignored // by PyUnicode_InternInPlace(). s->ob_refcnt = 2; +#ifdef Py_REF_DEBUG + /* let's be pedantic with the ref total */ + _Py_IncRefTotal(_PyInterpreterState_GET()); + _Py_IncRefTotal(_PyInterpreterState_GET()); +#endif #ifdef INTERNED_STATS total_length += PyUnicode_GET_LENGTH(s); #endif +#endif // Py_DEBUG break; case SSTATE_INTERNED_IMMORTAL_STATIC: /* It is shared between interpreters, so we should unmark it @@ -14907,7 +15237,15 @@ _PyUnicode_ClearInterned(PyInterpreterState *interp) } break; case SSTATE_INTERNED_MORTAL: - /* fall through */ + // Restore 2 references held by the interned dict; these will + // be decref'd by clear_interned_dict's PyDict_Clear. + Py_SET_REFCNT(s, Py_REFCNT(s) + 2); +#ifdef Py_REF_DEBUG + /* let's be pedantic with the ref total */ + _Py_IncRefTotal(_PyInterpreterState_GET()); + _Py_IncRefTotal(_PyInterpreterState_GET()); +#endif + break; case SSTATE_NOT_INTERNED: /* fall through */ default: @@ -14928,8 +15266,10 @@ _PyUnicode_ClearInterned(PyInterpreterState *interp) for (Py_ssize_t i=0; i < ids->size; i++) { Py_XINCREF(ids->array[i]); } -#endif /* Py_DEBUG */ clear_interned_dict(interp); + if (_Py_IsMainInterpreter(interp)) { + clear_global_interned_strings(); + } } @@ -15140,7 +15480,7 @@ encode_wstr_utf8(wchar_t *wstr, char **str, const char *name) int res; res = _Py_EncodeUTF8Ex(wstr, str, NULL, NULL, 1, _Py_ERROR_STRICT); if (res == -2) { - PyErr_Format(PyExc_RuntimeWarning, "cannot decode %s", name); + PyErr_Format(PyExc_RuntimeError, "cannot encode %s", name); return -1; } if (res < 0) { @@ -15364,8 +15704,10 @@ _PyUnicode_Fini(PyInterpreterState *interp) { struct _Py_unicode_state *state = &interp->unicode; - // _PyUnicode_ClearInterned() must be called before _PyUnicode_Fini() - assert(get_interned_dict(interp) == NULL); + if (!has_shared_intern_dict(interp)) { + // _PyUnicode_ClearInterned() must be called before _PyUnicode_Fini() + assert(get_interned_dict(interp) == NULL); + } _PyUnicode_FiniEncodings(&state->fs_codec); diff --git a/PC/_wmimodule.cpp b/PC/_wmimodule.cpp index 22ed0527..2c24761b 100644 --- a/PC/_wmimodule.cpp +++ b/PC/_wmimodule.cpp @@ -55,12 +55,26 @@ _query_thread(LPVOID param) IWbemLocator *locator = NULL; IWbemServices *services = NULL; IEnumWbemClassObject* enumerator = NULL; + HRESULT hr = S_OK; BSTR bstrQuery = NULL; struct _query_data *data = (struct _query_data*)param; - HRESULT hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + // gh-125315: Copy the query string first, so that if the main thread gives + // up on waiting we aren't left with a dangling pointer (and a likely crash) + bstrQuery = SysAllocString(data->query); + if (!bstrQuery) { + hr = HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY); + } + + if (SUCCEEDED(hr)) { + hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + } + if (FAILED(hr)) { CloseHandle(data->writePipe); + if (bstrQuery) { + SysFreeString(bstrQuery); + } return (DWORD)hr; } @@ -101,12 +115,6 @@ _query_thread(LPVOID param) NULL, EOAC_NONE ); } - if (SUCCEEDED(hr)) { - bstrQuery = SysAllocString(data->query); - if (!bstrQuery) { - hr = HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY); - } - } if (SUCCEEDED(hr)) { hr = services->ExecQuery( bstr_t("WQL"), diff --git a/PC/clinic/_testconsole.c.h b/PC/clinic/_testconsole.c.h index b2f3b4ce..9b4d196b 100644 --- a/PC/clinic/_testconsole.c.h +++ b/PC/clinic/_testconsole.c.h @@ -36,7 +36,7 @@ _testconsole_write_input(PyObject *module, PyObject *const *args, Py_ssize_t nar PyObject *ob_item[NUM_KEYWORDS]; } _kwtuple = { .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) - .ob_item = { &_Py_ID(file), &_Py_ID(s), }, + .ob_item = { &_Py_ID(file), _Py_LATIN1_CHR('s'), }, }; #undef NUM_KEYWORDS #define KWTUPLE (&_kwtuple.ob_base.ob_base) @@ -140,4 +140,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=208c72e2c873555b input=a9049054013a1b77]*/ +/*[clinic end generated code: output=2dcfa57c20b6e058 input=a9049054013a1b77]*/ diff --git a/PC/launcher2.c b/PC/launcher2.c index f331aab3..7a78ed16 100644 --- a/PC/launcher2.c +++ b/PC/launcher2.c @@ -1938,6 +1938,7 @@ struct AppxSearchInfo { struct AppxSearchInfo APPX_SEARCH[] = { // Releases made through the Store + { L"PythonSoftwareFoundation.Python.3.14_qbz5n2kfra8p0", L"3.14", 10 }, { L"PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0", L"3.13", 10 }, { L"PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0", L"3.12", 10 }, { L"PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0", L"3.11", 10 }, @@ -1946,8 +1947,9 @@ struct AppxSearchInfo APPX_SEARCH[] = { { L"PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0", L"3.8", 10 }, // Side-loadable releases. Note that the publisher ID changes whenever we - // renew our code-signing certificate, so the newer ID has a higher - // priority (lower sortKey) + // change our code signing certificate subject, so the newer IDs have higher + // priorities (lower sortKey) + { L"PythonSoftwareFoundation.Python.3.14_3847v3x7pw1km", L"3.14", 11 }, { L"PythonSoftwareFoundation.Python.3.13_3847v3x7pw1km", L"3.13", 11 }, { L"PythonSoftwareFoundation.Python.3.12_3847v3x7pw1km", L"3.12", 11 }, { L"PythonSoftwareFoundation.Python.3.11_3847v3x7pw1km", L"3.11", 11 }, @@ -2030,7 +2032,8 @@ struct StoreSearchInfo { struct StoreSearchInfo STORE_SEARCH[] = { - { L"3", /* 3.12 */ L"9NCVDN91XZQP" }, + { L"3", /* 3.13 */ L"9PNRBTZXMB4Z" }, + { L"3.14", L"9NTRHQCBBPR8" }, { L"3.13", L"9PNRBTZXMB4Z" }, { L"3.12", L"9NCVDN91XZQP" }, { L"3.11", L"9NRWMJP3717K" }, diff --git a/PC/pyconfig.h b/PC/pyconfig.h index 3415efe2..7815bfcf 100644 --- a/PC/pyconfig.h +++ b/PC/pyconfig.h @@ -161,9 +161,9 @@ WIN32 is still required for the locale module. #endif /* MS_WIN64 */ /* set the version macros for the windows headers */ -/* Python 3.9+ requires Windows 8 or greater */ -#define Py_WINVER 0x0602 /* _WIN32_WINNT_WIN8 */ -#define Py_NTDDI NTDDI_WIN8 +/* Python 3.12+ requires Windows 8.1 or greater */ +#define Py_WINVER 0x0603 /* _WIN32_WINNT_WINBLUE (8.1) */ +#define Py_NTDDI NTDDI_WINBLUE /* We only set these values when building Python - we don't want to force these values on extensions, as that will affect the prototypes and diff --git a/PCbuild/find_python.bat b/PCbuild/find_python.bat index 4f54bf75..34e98494 100644 --- a/PCbuild/find_python.bat +++ b/PCbuild/find_python.bat @@ -36,13 +36,15 @@ @if "%_Py_EXTERNALS_DIR%"=="" (set _Py_EXTERNALS_DIR=%_Py_D%\..\externals) @rem If we have Python in externals, use that one -@if exist "%_Py_EXTERNALS_DIR%\pythonx86\tools\python.exe" ("%_Py_EXTERNALS_DIR%\pythonx86\tools\python.exe" -Ec "import sys; assert sys.version_info[:2] >= (3, 8)" >nul 2>nul) && (set PYTHON="%_Py_EXTERNALS_DIR%\pythonx86\tools\python.exe") && (set _Py_Python_Source=found in externals directory) && goto :found || rmdir /Q /S "%_Py_EXTERNALS_DIR%\pythonx86" +@if exist "%_Py_EXTERNALS_DIR%\pythonx86\tools\python.exe" ("%_Py_EXTERNALS_DIR%\pythonx86\tools\python.exe" -Ec "import sys; assert sys.version_info[:2] >= (3, 10)" >nul 2>nul) && (set PYTHON="%_Py_EXTERNALS_DIR%\pythonx86\tools\python.exe") && (set _Py_Python_Source=found in externals directory) && goto :found || rmdir /Q /S "%_Py_EXTERNALS_DIR%\pythonx86" @rem If HOST_PYTHON is recent enough, use that -@if NOT "%HOST_PYTHON%"=="" @%HOST_PYTHON% -Ec "import sys; assert sys.version_info[:2] >= (3, 9)" >nul 2>nul && (set PYTHON="%HOST_PYTHON%") && (set _Py_Python_Source=found as HOST_PYTHON) && goto :found +@if NOT "%HOST_PYTHON%"=="" @%HOST_PYTHON% -Ec "import sys; assert sys.version_info[:2] >= (3, 10)" >nul 2>nul && (set PYTHON="%HOST_PYTHON%") && (set _Py_Python_Source=found as HOST_PYTHON) && goto :found @rem If py.exe finds a recent enough version, use that one -@for %%p in (3.11 3.10 3.9) do @py -%%p -EV >nul 2>&1 && (set PYTHON=py -%%p) && (set _Py_Python_Source=found %%p with py.exe) && goto :found +@rem It is fine to add new versions to this list when they have released, +@rem but we do not use prerelease builds here. +@for %%p in (3.13 3.12 3.11 3.10) do @py -%%p -EV >nul 2>&1 && (set PYTHON=py -%%p) && (set _Py_Python_Source=found %%p with py.exe) && goto :found @if NOT exist "%_Py_EXTERNALS_DIR%" mkdir "%_Py_EXTERNALS_DIR%" @set _Py_NUGET=%NUGET% diff --git a/PCbuild/get_externals.bat b/PCbuild/get_externals.bat index 3ab35202..77b4fb81 100644 --- a/PCbuild/get_externals.bat +++ b/PCbuild/get_externals.bat @@ -53,10 +53,10 @@ echo.Fetching external libraries... set libraries= set libraries=%libraries% bzip2-1.0.8 if NOT "%IncludeLibffiSrc%"=="false" set libraries=%libraries% libffi-3.4.4 -if NOT "%IncludeSSLSrc%"=="false" set libraries=%libraries% openssl-3.0.13 +if NOT "%IncludeSSLSrc%"=="false" set libraries=%libraries% openssl-3.0.15 set libraries=%libraries% sqlite-3.45.3.0 -if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tcl-core-8.6.13.0 -if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tk-8.6.13.0 +if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tcl-core-8.6.15.0 +if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tk-8.6.15.0 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tix-8.4.3.6 set libraries=%libraries% xz-5.2.5 set libraries=%libraries% zlib-1.3.1 @@ -77,8 +77,8 @@ echo.Fetching external binaries... set binaries= if NOT "%IncludeLibffi%"=="false" set binaries=%binaries% libffi-3.4.4 -if NOT "%IncludeSSL%"=="false" set binaries=%binaries% openssl-bin-3.0.13 -if NOT "%IncludeTkinter%"=="false" set binaries=%binaries% tcltk-8.6.13.0 +if NOT "%IncludeSSL%"=="false" set binaries=%binaries% openssl-bin-3.0.15 +if NOT "%IncludeTkinter%"=="false" set binaries=%binaries% tcltk-8.6.15.2 if NOT "%IncludeSSLSrc%"=="false" set binaries=%binaries% nasm-2.11.06 for %%b in (%binaries%) do ( diff --git a/PCbuild/python.props b/PCbuild/python.props index 8120c75e..7bcf1726 100644 --- a/PCbuild/python.props +++ b/PCbuild/python.props @@ -74,8 +74,8 @@ $(ExternalsDir)libffi-3.4.4\ $(libffiDir)$(ArchName)\ $(libffiOutDir)include - $(ExternalsDir)openssl-3.0.13\ - $(ExternalsDir)openssl-bin-3.0.13\$(ArchName)\ + $(ExternalsDir)openssl-3.0.15\ + $(ExternalsDir)openssl-bin-3.0.15\$(ArchName)\ $(opensslOutDir)include $(ExternalsDir)\nasm-2.11.06\ $(ExternalsDir)\zlib-1.3.1\ diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt index 7340861d..f330eb12 100644 --- a/PCbuild/readme.txt +++ b/PCbuild/readme.txt @@ -193,7 +193,7 @@ _sqlite3 Homepage: https://www.sqlite.org/ _tkinter - Wraps version 8.6.6 of the Tk windowing system, which is downloaded + Wraps version 8.6.15 of the Tk windowing system, which is downloaded from our binaries repository at https://github.com/python/cpython-bin-deps. diff --git a/PCbuild/tcltk.props b/PCbuild/tcltk.props index 53392c1d..173fad74 100644 --- a/PCbuild/tcltk.props +++ b/PCbuild/tcltk.props @@ -2,7 +2,7 @@ - 8.6.13.0 + 8.6.15.2 $(TclVersion) 8.4.3.6 $([System.Version]::Parse($(TclVersion)).Major) diff --git a/Parser/action_helpers.c b/Parser/action_helpers.c index e68a9cac..be52d894 100644 --- a/Parser/action_helpers.c +++ b/Parser/action_helpers.c @@ -1,1680 +1,1611 @@ #include #include "pegen.h" -#include "tokenizer.h" +#include "pycore_runtime.h" // _PyRuntime #include "string_parser.h" -#include "pycore_runtime.h" // _PyRuntime +#include "tokenizer.h" +#include "pycore_pystate.h" // _PyInterpreterState_GET() -void * -_PyPegen_dummy_name(Parser *p, ...) -{ - return &_PyRuntime.parser.dummy_name; +void *_PyPegen_dummy_name(Parser *p, ...) { + return &_PyRuntime.parser.dummy_name; } /* Creates a single-element asdl_seq* that contains a */ -asdl_seq * -_PyPegen_singleton_seq(Parser *p, void *a) -{ - assert(a != NULL); - asdl_seq *seq = (asdl_seq*)_Py_asdl_generic_seq_new(1, p->arena); - if (!seq) { - return NULL; - } - asdl_seq_SET_UNTYPED(seq, 0, a); - return seq; +asdl_seq *_PyPegen_singleton_seq(Parser *p, void *a) { + assert(a != NULL); + asdl_seq *seq = (asdl_seq *)_Py_asdl_generic_seq_new(1, p->arena); + if (!seq) { + return NULL; + } + asdl_seq_SET_UNTYPED(seq, 0, a); + return seq; } /* Creates a copy of seq and prepends a to it */ -asdl_seq * -_PyPegen_seq_insert_in_front(Parser *p, void *a, asdl_seq *seq) -{ - assert(a != NULL); - if (!seq) { - return _PyPegen_singleton_seq(p, a); - } +asdl_seq *_PyPegen_seq_insert_in_front(Parser *p, void *a, asdl_seq *seq) { + assert(a != NULL); + if (!seq) { + return _PyPegen_singleton_seq(p, a); + } - asdl_seq *new_seq = (asdl_seq*)_Py_asdl_generic_seq_new(asdl_seq_LEN(seq) + 1, p->arena); - if (!new_seq) { - return NULL; - } + asdl_seq *new_seq = + (asdl_seq *)_Py_asdl_generic_seq_new(asdl_seq_LEN(seq) + 1, p->arena); + if (!new_seq) { + return NULL; + } - asdl_seq_SET_UNTYPED(new_seq, 0, a); - for (Py_ssize_t i = 1, l = asdl_seq_LEN(new_seq); i < l; i++) { - asdl_seq_SET_UNTYPED(new_seq, i, asdl_seq_GET_UNTYPED(seq, i - 1)); - } - return new_seq; + asdl_seq_SET_UNTYPED(new_seq, 0, a); + for (Py_ssize_t i = 1, l = asdl_seq_LEN(new_seq); i < l; i++) { + asdl_seq_SET_UNTYPED(new_seq, i, asdl_seq_GET_UNTYPED(seq, i - 1)); + } + return new_seq; } /* Creates a copy of seq and appends a to it */ -asdl_seq * -_PyPegen_seq_append_to_end(Parser *p, asdl_seq *seq, void *a) -{ - assert(a != NULL); - if (!seq) { - return _PyPegen_singleton_seq(p, a); - } - - asdl_seq *new_seq = (asdl_seq*)_Py_asdl_generic_seq_new(asdl_seq_LEN(seq) + 1, p->arena); - if (!new_seq) { - return NULL; - } - - for (Py_ssize_t i = 0, l = asdl_seq_LEN(new_seq); i + 1 < l; i++) { - asdl_seq_SET_UNTYPED(new_seq, i, asdl_seq_GET_UNTYPED(seq, i)); - } - asdl_seq_SET_UNTYPED(new_seq, asdl_seq_LEN(new_seq) - 1, a); - return new_seq; -} - -static Py_ssize_t -_get_flattened_seq_size(asdl_seq *seqs) -{ - Py_ssize_t size = 0; - for (Py_ssize_t i = 0, l = asdl_seq_LEN(seqs); i < l; i++) { - asdl_seq *inner_seq = asdl_seq_GET_UNTYPED(seqs, i); - size += asdl_seq_LEN(inner_seq); - } - return size; +asdl_seq *_PyPegen_seq_append_to_end(Parser *p, asdl_seq *seq, void *a) { + assert(a != NULL); + if (!seq) { + return _PyPegen_singleton_seq(p, a); + } + + asdl_seq *new_seq = + (asdl_seq *)_Py_asdl_generic_seq_new(asdl_seq_LEN(seq) + 1, p->arena); + if (!new_seq) { + return NULL; + } + + for (Py_ssize_t i = 0, l = asdl_seq_LEN(new_seq); i + 1 < l; i++) { + asdl_seq_SET_UNTYPED(new_seq, i, asdl_seq_GET_UNTYPED(seq, i)); + } + asdl_seq_SET_UNTYPED(new_seq, asdl_seq_LEN(new_seq) - 1, a); + return new_seq; +} + +static Py_ssize_t _get_flattened_seq_size(asdl_seq *seqs) { + Py_ssize_t size = 0; + for (Py_ssize_t i = 0, l = asdl_seq_LEN(seqs); i < l; i++) { + asdl_seq *inner_seq = asdl_seq_GET_UNTYPED(seqs, i); + size += asdl_seq_LEN(inner_seq); + } + return size; } /* Flattens an asdl_seq* of asdl_seq*s */ -asdl_seq * -_PyPegen_seq_flatten(Parser *p, asdl_seq *seqs) -{ - Py_ssize_t flattened_seq_size = _get_flattened_seq_size(seqs); - assert(flattened_seq_size > 0); - - asdl_seq *flattened_seq = (asdl_seq*)_Py_asdl_generic_seq_new(flattened_seq_size, p->arena); - if (!flattened_seq) { - return NULL; - } +asdl_seq *_PyPegen_seq_flatten(Parser *p, asdl_seq *seqs) { + Py_ssize_t flattened_seq_size = _get_flattened_seq_size(seqs); + assert(flattened_seq_size > 0); - int flattened_seq_idx = 0; - for (Py_ssize_t i = 0, l = asdl_seq_LEN(seqs); i < l; i++) { - asdl_seq *inner_seq = asdl_seq_GET_UNTYPED(seqs, i); - for (Py_ssize_t j = 0, li = asdl_seq_LEN(inner_seq); j < li; j++) { - asdl_seq_SET_UNTYPED(flattened_seq, flattened_seq_idx++, asdl_seq_GET_UNTYPED(inner_seq, j)); - } + asdl_seq *flattened_seq = + (asdl_seq *)_Py_asdl_generic_seq_new(flattened_seq_size, p->arena); + if (!flattened_seq) { + return NULL; + } + + int flattened_seq_idx = 0; + for (Py_ssize_t i = 0, l = asdl_seq_LEN(seqs); i < l; i++) { + asdl_seq *inner_seq = asdl_seq_GET_UNTYPED(seqs, i); + for (Py_ssize_t j = 0, li = asdl_seq_LEN(inner_seq); j < li; j++) { + asdl_seq_SET_UNTYPED(flattened_seq, flattened_seq_idx++, + asdl_seq_GET_UNTYPED(inner_seq, j)); } - assert(flattened_seq_idx == flattened_seq_size); + } + assert(flattened_seq_idx == flattened_seq_size); - return flattened_seq; + return flattened_seq; } -void * -_PyPegen_seq_last_item(asdl_seq *seq) -{ - Py_ssize_t len = asdl_seq_LEN(seq); - return asdl_seq_GET_UNTYPED(seq, len - 1); +void *_PyPegen_seq_last_item(asdl_seq *seq) { + Py_ssize_t len = asdl_seq_LEN(seq); + return asdl_seq_GET_UNTYPED(seq, len - 1); } -void * -_PyPegen_seq_first_item(asdl_seq *seq) -{ - return asdl_seq_GET_UNTYPED(seq, 0); +void *_PyPegen_seq_first_item(asdl_seq *seq) { + return asdl_seq_GET_UNTYPED(seq, 0); } /* Creates a new name of the form . */ -expr_ty -_PyPegen_join_names_with_dot(Parser *p, expr_ty first_name, expr_ty second_name) -{ - assert(first_name != NULL && second_name != NULL); - PyObject *first_identifier = first_name->v.Name.id; - PyObject *second_identifier = second_name->v.Name.id; - - if (PyUnicode_READY(first_identifier) == -1) { - return NULL; - } - if (PyUnicode_READY(second_identifier) == -1) { - return NULL; - } - const char *first_str = PyUnicode_AsUTF8(first_identifier); - if (!first_str) { - return NULL; - } - const char *second_str = PyUnicode_AsUTF8(second_identifier); - if (!second_str) { - return NULL; - } - Py_ssize_t len = strlen(first_str) + strlen(second_str) + 1; // +1 for the dot - - PyObject *str = PyBytes_FromStringAndSize(NULL, len); - if (!str) { - return NULL; - } - - char *s = PyBytes_AS_STRING(str); - if (!s) { - return NULL; - } - - strcpy(s, first_str); - s += strlen(first_str); - *s++ = '.'; - strcpy(s, second_str); - s += strlen(second_str); - *s = '\0'; - - PyObject *uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str), PyBytes_GET_SIZE(str), NULL); - Py_DECREF(str); - if (!uni) { - return NULL; - } - PyUnicode_InternInPlace(&uni); - if (_PyArena_AddPyObject(p->arena, uni) < 0) { - Py_DECREF(uni); - return NULL; - } - - return _PyAST_Name(uni, Load, EXTRA_EXPR(first_name, second_name)); +expr_ty _PyPegen_join_names_with_dot(Parser *p, expr_ty first_name, + expr_ty second_name) { + assert(first_name != NULL && second_name != NULL); + PyObject *first_identifier = first_name->v.Name.id; + PyObject *second_identifier = second_name->v.Name.id; + + if (PyUnicode_READY(first_identifier) == -1) { + return NULL; + } + if (PyUnicode_READY(second_identifier) == -1) { + return NULL; + } + const char *first_str = PyUnicode_AsUTF8(first_identifier); + if (!first_str) { + return NULL; + } + const char *second_str = PyUnicode_AsUTF8(second_identifier); + if (!second_str) { + return NULL; + } + Py_ssize_t len = strlen(first_str) + strlen(second_str) + 1; // +1 for the dot + + PyObject *str = PyBytes_FromStringAndSize(NULL, len); + if (!str) { + return NULL; + } + + char *s = PyBytes_AS_STRING(str); + if (!s) { + return NULL; + } + + strcpy(s, first_str); + s += strlen(first_str); + *s++ = '.'; + strcpy(s, second_str); + s += strlen(second_str); + *s = '\0'; + + PyObject *uni = + PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str), PyBytes_GET_SIZE(str), NULL); + Py_DECREF(str); + if (!uni) { + return NULL; + } + PyInterpreterState *interp = _PyInterpreterState_GET(); + _PyUnicode_InternMortal(interp, &uni); + if (_PyArena_AddPyObject(p->arena, uni) < 0) { + Py_DECREF(uni); + return NULL; + } + + return _PyAST_Name(uni, Load, EXTRA_EXPR(first_name, second_name)); } /* Counts the total number of dots in seq's tokens */ -int -_PyPegen_seq_count_dots(asdl_seq *seq) -{ - int number_of_dots = 0; - for (Py_ssize_t i = 0, l = asdl_seq_LEN(seq); i < l; i++) { - Token *current_expr = asdl_seq_GET_UNTYPED(seq, i); - switch (current_expr->type) { - case ELLIPSIS: - number_of_dots += 3; - break; - case DOT: - number_of_dots += 1; - break; - default: - Py_UNREACHABLE(); - } +int _PyPegen_seq_count_dots(asdl_seq *seq) { + int number_of_dots = 0; + for (Py_ssize_t i = 0, l = asdl_seq_LEN(seq); i < l; i++) { + Token *current_expr = asdl_seq_GET_UNTYPED(seq, i); + switch (current_expr->type) { + case ELLIPSIS: + number_of_dots += 3; + break; + case DOT: + number_of_dots += 1; + break; + default: + Py_UNREACHABLE(); } + } - return number_of_dots; + return number_of_dots; } /* Creates an alias with '*' as the identifier name */ -alias_ty -_PyPegen_alias_for_star(Parser *p, int lineno, int col_offset, int end_lineno, - int end_col_offset, PyArena *arena) { - PyObject *str = PyUnicode_InternFromString("*"); - if (!str) { - return NULL; - } - if (_PyArena_AddPyObject(p->arena, str) < 0) { - Py_DECREF(str); - return NULL; - } - return _PyAST_alias(str, NULL, lineno, col_offset, end_lineno, end_col_offset, arena); +alias_ty _PyPegen_alias_for_star(Parser *p, int lineno, int col_offset, + int end_lineno, int end_col_offset, + PyArena *arena) { + PyObject *str = PyUnicode_InternFromString("*"); + if (!str) { + return NULL; + } + if (_PyArena_AddPyObject(p->arena, str) < 0) { + Py_DECREF(str); + return NULL; + } + return _PyAST_alias(str, NULL, lineno, col_offset, end_lineno, end_col_offset, + arena); } /* Creates a new asdl_seq* with the identifiers of all the names in seq */ -asdl_identifier_seq * -_PyPegen_map_names_to_ids(Parser *p, asdl_expr_seq *seq) -{ - Py_ssize_t len = asdl_seq_LEN(seq); - assert(len > 0); - - asdl_identifier_seq *new_seq = _Py_asdl_identifier_seq_new(len, p->arena); - if (!new_seq) { - return NULL; - } - for (Py_ssize_t i = 0; i < len; i++) { - expr_ty e = asdl_seq_GET(seq, i); - asdl_seq_SET(new_seq, i, e->v.Name.id); - } - return new_seq; +asdl_identifier_seq *_PyPegen_map_names_to_ids(Parser *p, asdl_expr_seq *seq) { + Py_ssize_t len = asdl_seq_LEN(seq); + assert(len > 0); + + asdl_identifier_seq *new_seq = _Py_asdl_identifier_seq_new(len, p->arena); + if (!new_seq) { + return NULL; + } + for (Py_ssize_t i = 0; i < len; i++) { + expr_ty e = asdl_seq_GET(seq, i); + asdl_seq_SET(new_seq, i, e->v.Name.id); + } + return new_seq; } /* Constructs a CmpopExprPair */ -CmpopExprPair * -_PyPegen_cmpop_expr_pair(Parser *p, cmpop_ty cmpop, expr_ty expr) -{ - assert(expr != NULL); - CmpopExprPair *a = _PyArena_Malloc(p->arena, sizeof(CmpopExprPair)); - if (!a) { - return NULL; - } - a->cmpop = cmpop; - a->expr = expr; - return a; +CmpopExprPair *_PyPegen_cmpop_expr_pair(Parser *p, cmpop_ty cmpop, + expr_ty expr) { + assert(expr != NULL); + CmpopExprPair *a = _PyArena_Malloc(p->arena, sizeof(CmpopExprPair)); + if (!a) { + return NULL; + } + a->cmpop = cmpop; + a->expr = expr; + return a; } -asdl_int_seq * -_PyPegen_get_cmpops(Parser *p, asdl_seq *seq) -{ - Py_ssize_t len = asdl_seq_LEN(seq); - assert(len > 0); +asdl_int_seq *_PyPegen_get_cmpops(Parser *p, asdl_seq *seq) { + Py_ssize_t len = asdl_seq_LEN(seq); + assert(len > 0); - asdl_int_seq *new_seq = _Py_asdl_int_seq_new(len, p->arena); - if (!new_seq) { - return NULL; - } - for (Py_ssize_t i = 0; i < len; i++) { - CmpopExprPair *pair = asdl_seq_GET_UNTYPED(seq, i); - asdl_seq_SET(new_seq, i, pair->cmpop); - } - return new_seq; + asdl_int_seq *new_seq = _Py_asdl_int_seq_new(len, p->arena); + if (!new_seq) { + return NULL; + } + for (Py_ssize_t i = 0; i < len; i++) { + CmpopExprPair *pair = asdl_seq_GET_UNTYPED(seq, i); + asdl_seq_SET(new_seq, i, pair->cmpop); + } + return new_seq; } -asdl_expr_seq * -_PyPegen_get_exprs(Parser *p, asdl_seq *seq) -{ - Py_ssize_t len = asdl_seq_LEN(seq); - assert(len > 0); +asdl_expr_seq *_PyPegen_get_exprs(Parser *p, asdl_seq *seq) { + Py_ssize_t len = asdl_seq_LEN(seq); + assert(len > 0); - asdl_expr_seq *new_seq = _Py_asdl_expr_seq_new(len, p->arena); - if (!new_seq) { - return NULL; - } - for (Py_ssize_t i = 0; i < len; i++) { - CmpopExprPair *pair = asdl_seq_GET_UNTYPED(seq, i); - asdl_seq_SET(new_seq, i, pair->expr); - } - return new_seq; + asdl_expr_seq *new_seq = _Py_asdl_expr_seq_new(len, p->arena); + if (!new_seq) { + return NULL; + } + for (Py_ssize_t i = 0; i < len; i++) { + CmpopExprPair *pair = asdl_seq_GET_UNTYPED(seq, i); + asdl_seq_SET(new_seq, i, pair->expr); + } + return new_seq; } -/* Creates an asdl_seq* where all the elements have been changed to have ctx as context */ -static asdl_expr_seq * -_set_seq_context(Parser *p, asdl_expr_seq *seq, expr_context_ty ctx) -{ - Py_ssize_t len = asdl_seq_LEN(seq); - if (len == 0) { - return NULL; - } +/* Creates an asdl_seq* where all the elements have been changed to have ctx as + * context */ +static asdl_expr_seq *_set_seq_context(Parser *p, asdl_expr_seq *seq, + expr_context_ty ctx) { + Py_ssize_t len = asdl_seq_LEN(seq); + if (len == 0) { + return NULL; + } - asdl_expr_seq *new_seq = _Py_asdl_expr_seq_new(len, p->arena); - if (!new_seq) { - return NULL; - } - for (Py_ssize_t i = 0; i < len; i++) { - expr_ty e = asdl_seq_GET(seq, i); - asdl_seq_SET(new_seq, i, _PyPegen_set_expr_context(p, e, ctx)); - } - return new_seq; + asdl_expr_seq *new_seq = _Py_asdl_expr_seq_new(len, p->arena); + if (!new_seq) { + return NULL; + } + for (Py_ssize_t i = 0; i < len; i++) { + expr_ty e = asdl_seq_GET(seq, i); + asdl_seq_SET(new_seq, i, _PyPegen_set_expr_context(p, e, ctx)); + } + return new_seq; } -static expr_ty -_set_name_context(Parser *p, expr_ty e, expr_context_ty ctx) -{ - return _PyAST_Name(e->v.Name.id, ctx, EXTRA_EXPR(e, e)); +static expr_ty _set_name_context(Parser *p, expr_ty e, expr_context_ty ctx) { + return _PyAST_Name(e->v.Name.id, ctx, EXTRA_EXPR(e, e)); } -static expr_ty -_set_tuple_context(Parser *p, expr_ty e, expr_context_ty ctx) -{ - return _PyAST_Tuple( - _set_seq_context(p, e->v.Tuple.elts, ctx), - ctx, - EXTRA_EXPR(e, e)); +static expr_ty _set_tuple_context(Parser *p, expr_ty e, expr_context_ty ctx) { + return _PyAST_Tuple(_set_seq_context(p, e->v.Tuple.elts, ctx), ctx, + EXTRA_EXPR(e, e)); } -static expr_ty -_set_list_context(Parser *p, expr_ty e, expr_context_ty ctx) -{ - return _PyAST_List( - _set_seq_context(p, e->v.List.elts, ctx), - ctx, - EXTRA_EXPR(e, e)); +static expr_ty _set_list_context(Parser *p, expr_ty e, expr_context_ty ctx) { + return _PyAST_List(_set_seq_context(p, e->v.List.elts, ctx), ctx, + EXTRA_EXPR(e, e)); } -static expr_ty -_set_subscript_context(Parser *p, expr_ty e, expr_context_ty ctx) -{ - return _PyAST_Subscript(e->v.Subscript.value, e->v.Subscript.slice, - ctx, EXTRA_EXPR(e, e)); +static expr_ty _set_subscript_context(Parser *p, expr_ty e, + expr_context_ty ctx) { + return _PyAST_Subscript(e->v.Subscript.value, e->v.Subscript.slice, ctx, + EXTRA_EXPR(e, e)); } -static expr_ty -_set_attribute_context(Parser *p, expr_ty e, expr_context_ty ctx) -{ - return _PyAST_Attribute(e->v.Attribute.value, e->v.Attribute.attr, - ctx, EXTRA_EXPR(e, e)); +static expr_ty _set_attribute_context(Parser *p, expr_ty e, + expr_context_ty ctx) { + return _PyAST_Attribute(e->v.Attribute.value, e->v.Attribute.attr, ctx, + EXTRA_EXPR(e, e)); } -static expr_ty -_set_starred_context(Parser *p, expr_ty e, expr_context_ty ctx) -{ - return _PyAST_Starred(_PyPegen_set_expr_context(p, e->v.Starred.value, ctx), - ctx, EXTRA_EXPR(e, e)); +static expr_ty _set_starred_context(Parser *p, expr_ty e, expr_context_ty ctx) { + return _PyAST_Starred(_PyPegen_set_expr_context(p, e->v.Starred.value, ctx), + ctx, EXTRA_EXPR(e, e)); } /* Creates an `expr_ty` equivalent to `expr` but with `ctx` as context */ -expr_ty -_PyPegen_set_expr_context(Parser *p, expr_ty expr, expr_context_ty ctx) -{ - assert(expr != NULL); - - expr_ty new = NULL; - switch (expr->kind) { - case Name_kind: - new = _set_name_context(p, expr, ctx); - break; - case Tuple_kind: - new = _set_tuple_context(p, expr, ctx); - break; - case List_kind: - new = _set_list_context(p, expr, ctx); - break; - case Subscript_kind: - new = _set_subscript_context(p, expr, ctx); - break; - case Attribute_kind: - new = _set_attribute_context(p, expr, ctx); - break; - case Starred_kind: - new = _set_starred_context(p, expr, ctx); - break; - default: - new = expr; - } - return new; -} - -/* Constructs a KeyValuePair that is used when parsing a dict's key value pairs */ -KeyValuePair * -_PyPegen_key_value_pair(Parser *p, expr_ty key, expr_ty value) -{ - KeyValuePair *a = _PyArena_Malloc(p->arena, sizeof(KeyValuePair)); - if (!a) { - return NULL; - } - a->key = key; - a->value = value; - return a; +expr_ty _PyPegen_set_expr_context(Parser *p, expr_ty expr, + expr_context_ty ctx) { + assert(expr != NULL); + + expr_ty new = NULL; + switch (expr->kind) { + case Name_kind: + new = _set_name_context(p, expr, ctx); + break; + case Tuple_kind: + new = _set_tuple_context(p, expr, ctx); + break; + case List_kind: + new = _set_list_context(p, expr, ctx); + break; + case Subscript_kind: + new = _set_subscript_context(p, expr, ctx); + break; + case Attribute_kind: + new = _set_attribute_context(p, expr, ctx); + break; + case Starred_kind: + new = _set_starred_context(p, expr, ctx); + break; + default: + new = expr; + } + return new; +} + +/* Constructs a KeyValuePair that is used when parsing a dict's key value pairs + */ +KeyValuePair *_PyPegen_key_value_pair(Parser *p, expr_ty key, expr_ty value) { + KeyValuePair *a = _PyArena_Malloc(p->arena, sizeof(KeyValuePair)); + if (!a) { + return NULL; + } + a->key = key; + a->value = value; + return a; } /* Extracts all keys from an asdl_seq* of KeyValuePair*'s */ -asdl_expr_seq * -_PyPegen_get_keys(Parser *p, asdl_seq *seq) -{ - Py_ssize_t len = asdl_seq_LEN(seq); - asdl_expr_seq *new_seq = _Py_asdl_expr_seq_new(len, p->arena); - if (!new_seq) { - return NULL; - } - for (Py_ssize_t i = 0; i < len; i++) { - KeyValuePair *pair = asdl_seq_GET_UNTYPED(seq, i); - asdl_seq_SET(new_seq, i, pair->key); - } - return new_seq; +asdl_expr_seq *_PyPegen_get_keys(Parser *p, asdl_seq *seq) { + Py_ssize_t len = asdl_seq_LEN(seq); + asdl_expr_seq *new_seq = _Py_asdl_expr_seq_new(len, p->arena); + if (!new_seq) { + return NULL; + } + for (Py_ssize_t i = 0; i < len; i++) { + KeyValuePair *pair = asdl_seq_GET_UNTYPED(seq, i); + asdl_seq_SET(new_seq, i, pair->key); + } + return new_seq; } /* Extracts all values from an asdl_seq* of KeyValuePair*'s */ -asdl_expr_seq * -_PyPegen_get_values(Parser *p, asdl_seq *seq) -{ - Py_ssize_t len = asdl_seq_LEN(seq); - asdl_expr_seq *new_seq = _Py_asdl_expr_seq_new(len, p->arena); - if (!new_seq) { - return NULL; - } - for (Py_ssize_t i = 0; i < len; i++) { - KeyValuePair *pair = asdl_seq_GET_UNTYPED(seq, i); - asdl_seq_SET(new_seq, i, pair->value); - } - return new_seq; -} - -/* Constructs a KeyPatternPair that is used when parsing mapping & class patterns */ -KeyPatternPair * -_PyPegen_key_pattern_pair(Parser *p, expr_ty key, pattern_ty pattern) -{ - KeyPatternPair *a = _PyArena_Malloc(p->arena, sizeof(KeyPatternPair)); - if (!a) { - return NULL; - } - a->key = key; - a->pattern = pattern; - return a; +asdl_expr_seq *_PyPegen_get_values(Parser *p, asdl_seq *seq) { + Py_ssize_t len = asdl_seq_LEN(seq); + asdl_expr_seq *new_seq = _Py_asdl_expr_seq_new(len, p->arena); + if (!new_seq) { + return NULL; + } + for (Py_ssize_t i = 0; i < len; i++) { + KeyValuePair *pair = asdl_seq_GET_UNTYPED(seq, i); + asdl_seq_SET(new_seq, i, pair->value); + } + return new_seq; +} + +/* Constructs a KeyPatternPair that is used when parsing mapping & class + * patterns */ +KeyPatternPair *_PyPegen_key_pattern_pair(Parser *p, expr_ty key, + pattern_ty pattern) { + KeyPatternPair *a = _PyArena_Malloc(p->arena, sizeof(KeyPatternPair)); + if (!a) { + return NULL; + } + a->key = key; + a->pattern = pattern; + return a; } /* Extracts all keys from an asdl_seq* of KeyPatternPair*'s */ -asdl_expr_seq * -_PyPegen_get_pattern_keys(Parser *p, asdl_seq *seq) -{ - Py_ssize_t len = asdl_seq_LEN(seq); - asdl_expr_seq *new_seq = _Py_asdl_expr_seq_new(len, p->arena); - if (!new_seq) { - return NULL; - } - for (Py_ssize_t i = 0; i < len; i++) { - KeyPatternPair *pair = asdl_seq_GET_UNTYPED(seq, i); - asdl_seq_SET(new_seq, i, pair->key); - } - return new_seq; +asdl_expr_seq *_PyPegen_get_pattern_keys(Parser *p, asdl_seq *seq) { + Py_ssize_t len = asdl_seq_LEN(seq); + asdl_expr_seq *new_seq = _Py_asdl_expr_seq_new(len, p->arena); + if (!new_seq) { + return NULL; + } + for (Py_ssize_t i = 0; i < len; i++) { + KeyPatternPair *pair = asdl_seq_GET_UNTYPED(seq, i); + asdl_seq_SET(new_seq, i, pair->key); + } + return new_seq; } /* Extracts all patterns from an asdl_seq* of KeyPatternPair*'s */ -asdl_pattern_seq * -_PyPegen_get_patterns(Parser *p, asdl_seq *seq) -{ - Py_ssize_t len = asdl_seq_LEN(seq); - asdl_pattern_seq *new_seq = _Py_asdl_pattern_seq_new(len, p->arena); - if (!new_seq) { - return NULL; - } - for (Py_ssize_t i = 0; i < len; i++) { - KeyPatternPair *pair = asdl_seq_GET_UNTYPED(seq, i); - asdl_seq_SET(new_seq, i, pair->pattern); - } - return new_seq; +asdl_pattern_seq *_PyPegen_get_patterns(Parser *p, asdl_seq *seq) { + Py_ssize_t len = asdl_seq_LEN(seq); + asdl_pattern_seq *new_seq = _Py_asdl_pattern_seq_new(len, p->arena); + if (!new_seq) { + return NULL; + } + for (Py_ssize_t i = 0; i < len; i++) { + KeyPatternPair *pair = asdl_seq_GET_UNTYPED(seq, i); + asdl_seq_SET(new_seq, i, pair->pattern); + } + return new_seq; } /* Constructs a NameDefaultPair */ -NameDefaultPair * -_PyPegen_name_default_pair(Parser *p, arg_ty arg, expr_ty value, Token *tc) -{ - NameDefaultPair *a = _PyArena_Malloc(p->arena, sizeof(NameDefaultPair)); - if (!a) { - return NULL; - } - a->arg = _PyPegen_add_type_comment_to_arg(p, arg, tc); - a->value = value; - return a; +NameDefaultPair *_PyPegen_name_default_pair(Parser *p, arg_ty arg, + expr_ty value, Token *tc) { + NameDefaultPair *a = _PyArena_Malloc(p->arena, sizeof(NameDefaultPair)); + if (!a) { + return NULL; + } + a->arg = _PyPegen_add_type_comment_to_arg(p, arg, tc); + a->value = value; + return a; } /* Constructs a SlashWithDefault */ -SlashWithDefault * -_PyPegen_slash_with_default(Parser *p, asdl_arg_seq *plain_names, asdl_seq *names_with_defaults) -{ - SlashWithDefault *a = _PyArena_Malloc(p->arena, sizeof(SlashWithDefault)); - if (!a) { - return NULL; - } - a->plain_names = plain_names; - a->names_with_defaults = names_with_defaults; - return a; +SlashWithDefault *_PyPegen_slash_with_default(Parser *p, + asdl_arg_seq *plain_names, + asdl_seq *names_with_defaults) { + SlashWithDefault *a = _PyArena_Malloc(p->arena, sizeof(SlashWithDefault)); + if (!a) { + return NULL; + } + a->plain_names = plain_names; + a->names_with_defaults = names_with_defaults; + return a; } /* Constructs a StarEtc */ -StarEtc * -_PyPegen_star_etc(Parser *p, arg_ty vararg, asdl_seq *kwonlyargs, arg_ty kwarg) -{ - StarEtc *a = _PyArena_Malloc(p->arena, sizeof(StarEtc)); - if (!a) { - return NULL; - } - a->vararg = vararg; - a->kwonlyargs = kwonlyargs; - a->kwarg = kwarg; - return a; -} - -asdl_seq * -_PyPegen_join_sequences(Parser *p, asdl_seq *a, asdl_seq *b) -{ - Py_ssize_t first_len = asdl_seq_LEN(a); - Py_ssize_t second_len = asdl_seq_LEN(b); - asdl_seq *new_seq = (asdl_seq*)_Py_asdl_generic_seq_new(first_len + second_len, p->arena); - if (!new_seq) { - return NULL; - } - - int k = 0; - for (Py_ssize_t i = 0; i < first_len; i++) { - asdl_seq_SET_UNTYPED(new_seq, k++, asdl_seq_GET_UNTYPED(a, i)); - } - for (Py_ssize_t i = 0; i < second_len; i++) { - asdl_seq_SET_UNTYPED(new_seq, k++, asdl_seq_GET_UNTYPED(b, i)); - } - - return new_seq; -} - -static asdl_arg_seq* -_get_names(Parser *p, asdl_seq *names_with_defaults) -{ - Py_ssize_t len = asdl_seq_LEN(names_with_defaults); - asdl_arg_seq *seq = _Py_asdl_arg_seq_new(len, p->arena); - if (!seq) { - return NULL; - } - for (Py_ssize_t i = 0; i < len; i++) { - NameDefaultPair *pair = asdl_seq_GET_UNTYPED(names_with_defaults, i); - asdl_seq_SET(seq, i, pair->arg); - } - return seq; -} - -static asdl_expr_seq * -_get_defaults(Parser *p, asdl_seq *names_with_defaults) -{ - Py_ssize_t len = asdl_seq_LEN(names_with_defaults); - asdl_expr_seq *seq = _Py_asdl_expr_seq_new(len, p->arena); - if (!seq) { - return NULL; - } - for (Py_ssize_t i = 0; i < len; i++) { - NameDefaultPair *pair = asdl_seq_GET_UNTYPED(names_with_defaults, i); - asdl_seq_SET(seq, i, pair->value); - } - return seq; -} - -static int -_make_posonlyargs(Parser *p, - asdl_arg_seq *slash_without_default, - SlashWithDefault *slash_with_default, - asdl_arg_seq **posonlyargs) { - if (slash_without_default != NULL) { - *posonlyargs = slash_without_default; - } - else if (slash_with_default != NULL) { - asdl_arg_seq *slash_with_default_names = - _get_names(p, slash_with_default->names_with_defaults); - if (!slash_with_default_names) { - return -1; - } - *posonlyargs = (asdl_arg_seq*)_PyPegen_join_sequences( - p, - (asdl_seq*)slash_with_default->plain_names, - (asdl_seq*)slash_with_default_names); - } - else { - *posonlyargs = _Py_asdl_arg_seq_new(0, p->arena); - } - return *posonlyargs == NULL ? -1 : 0; -} - -static int -_make_posargs(Parser *p, - asdl_arg_seq *plain_names, - asdl_seq *names_with_default, - asdl_arg_seq **posargs) { - if (plain_names != NULL && names_with_default != NULL) { - asdl_arg_seq *names_with_default_names = _get_names(p, names_with_default); - if (!names_with_default_names) { - return -1; - } - *posargs = (asdl_arg_seq*)_PyPegen_join_sequences( - p,(asdl_seq*)plain_names, (asdl_seq*)names_with_default_names); - } - else if (plain_names == NULL && names_with_default != NULL) { - *posargs = _get_names(p, names_with_default); - } - else if (plain_names != NULL && names_with_default == NULL) { - *posargs = plain_names; - } - else { - *posargs = _Py_asdl_arg_seq_new(0, p->arena); - } - return *posargs == NULL ? -1 : 0; -} - -static int -_make_posdefaults(Parser *p, - SlashWithDefault *slash_with_default, - asdl_seq *names_with_default, - asdl_expr_seq **posdefaults) { - if (slash_with_default != NULL && names_with_default != NULL) { - asdl_expr_seq *slash_with_default_values = - _get_defaults(p, slash_with_default->names_with_defaults); - if (!slash_with_default_values) { - return -1; - } - asdl_expr_seq *names_with_default_values = _get_defaults(p, names_with_default); - if (!names_with_default_values) { - return -1; - } - *posdefaults = (asdl_expr_seq*)_PyPegen_join_sequences( - p, - (asdl_seq*)slash_with_default_values, - (asdl_seq*)names_with_default_values); - } - else if (slash_with_default == NULL && names_with_default != NULL) { - *posdefaults = _get_defaults(p, names_with_default); - } - else if (slash_with_default != NULL && names_with_default == NULL) { - *posdefaults = _get_defaults(p, slash_with_default->names_with_defaults); - } - else { - *posdefaults = _Py_asdl_expr_seq_new(0, p->arena); - } - return *posdefaults == NULL ? -1 : 0; -} - -static int -_make_kwargs(Parser *p, StarEtc *star_etc, - asdl_arg_seq **kwonlyargs, - asdl_expr_seq **kwdefaults) { - if (star_etc != NULL && star_etc->kwonlyargs != NULL) { - *kwonlyargs = _get_names(p, star_etc->kwonlyargs); - } - else { - *kwonlyargs = _Py_asdl_arg_seq_new(0, p->arena); - } - - if (*kwonlyargs == NULL) { - return -1; - } - - if (star_etc != NULL && star_etc->kwonlyargs != NULL) { - *kwdefaults = _get_defaults(p, star_etc->kwonlyargs); - } - else { - *kwdefaults = _Py_asdl_expr_seq_new(0, p->arena); - } - - if (*kwdefaults == NULL) { - return -1; - } - - return 0; -} - -/* Constructs an arguments_ty object out of all the parsed constructs in the parameters rule */ -arguments_ty -_PyPegen_make_arguments(Parser *p, asdl_arg_seq *slash_without_default, - SlashWithDefault *slash_with_default, asdl_arg_seq *plain_names, - asdl_seq *names_with_default, StarEtc *star_etc) -{ - asdl_arg_seq *posonlyargs; - if (_make_posonlyargs(p, slash_without_default, slash_with_default, &posonlyargs) == -1) { - return NULL; - } - - asdl_arg_seq *posargs; - if (_make_posargs(p, plain_names, names_with_default, &posargs) == -1) { - return NULL; - } - - asdl_expr_seq *posdefaults; - if (_make_posdefaults(p,slash_with_default, names_with_default, &posdefaults) == -1) { - return NULL; - } - - arg_ty vararg = NULL; - if (star_etc != NULL && star_etc->vararg != NULL) { - vararg = star_etc->vararg; - } - - asdl_arg_seq *kwonlyargs; - asdl_expr_seq *kwdefaults; - if (_make_kwargs(p, star_etc, &kwonlyargs, &kwdefaults) == -1) { - return NULL; - } - - arg_ty kwarg = NULL; - if (star_etc != NULL && star_etc->kwarg != NULL) { - kwarg = star_etc->kwarg; - } - - return _PyAST_arguments(posonlyargs, posargs, vararg, kwonlyargs, - kwdefaults, kwarg, posdefaults, p->arena); -} - - -/* Constructs an empty arguments_ty object, that gets used when a function accepts no - * arguments. */ -arguments_ty -_PyPegen_empty_arguments(Parser *p) -{ - asdl_arg_seq *posonlyargs = _Py_asdl_arg_seq_new(0, p->arena); - if (!posonlyargs) { - return NULL; - } - asdl_arg_seq *posargs = _Py_asdl_arg_seq_new(0, p->arena); - if (!posargs) { - return NULL; - } - asdl_expr_seq *posdefaults = _Py_asdl_expr_seq_new(0, p->arena); - if (!posdefaults) { - return NULL; - } - asdl_arg_seq *kwonlyargs = _Py_asdl_arg_seq_new(0, p->arena); - if (!kwonlyargs) { - return NULL; - } - asdl_expr_seq *kwdefaults = _Py_asdl_expr_seq_new(0, p->arena); - if (!kwdefaults) { - return NULL; - } - - return _PyAST_arguments(posonlyargs, posargs, NULL, kwonlyargs, - kwdefaults, NULL, posdefaults, p->arena); +StarEtc *_PyPegen_star_etc(Parser *p, arg_ty vararg, asdl_seq *kwonlyargs, + arg_ty kwarg) { + StarEtc *a = _PyArena_Malloc(p->arena, sizeof(StarEtc)); + if (!a) { + return NULL; + } + a->vararg = vararg; + a->kwonlyargs = kwonlyargs; + a->kwarg = kwarg; + return a; +} + +asdl_seq *_PyPegen_join_sequences(Parser *p, asdl_seq *a, asdl_seq *b) { + Py_ssize_t first_len = asdl_seq_LEN(a); + Py_ssize_t second_len = asdl_seq_LEN(b); + asdl_seq *new_seq = + (asdl_seq *)_Py_asdl_generic_seq_new(first_len + second_len, p->arena); + if (!new_seq) { + return NULL; + } + + int k = 0; + for (Py_ssize_t i = 0; i < first_len; i++) { + asdl_seq_SET_UNTYPED(new_seq, k++, asdl_seq_GET_UNTYPED(a, i)); + } + for (Py_ssize_t i = 0; i < second_len; i++) { + asdl_seq_SET_UNTYPED(new_seq, k++, asdl_seq_GET_UNTYPED(b, i)); + } + + return new_seq; +} + +static asdl_arg_seq *_get_names(Parser *p, asdl_seq *names_with_defaults) { + Py_ssize_t len = asdl_seq_LEN(names_with_defaults); + asdl_arg_seq *seq = _Py_asdl_arg_seq_new(len, p->arena); + if (!seq) { + return NULL; + } + for (Py_ssize_t i = 0; i < len; i++) { + NameDefaultPair *pair = asdl_seq_GET_UNTYPED(names_with_defaults, i); + asdl_seq_SET(seq, i, pair->arg); + } + return seq; +} + +static asdl_expr_seq *_get_defaults(Parser *p, asdl_seq *names_with_defaults) { + Py_ssize_t len = asdl_seq_LEN(names_with_defaults); + asdl_expr_seq *seq = _Py_asdl_expr_seq_new(len, p->arena); + if (!seq) { + return NULL; + } + for (Py_ssize_t i = 0; i < len; i++) { + NameDefaultPair *pair = asdl_seq_GET_UNTYPED(names_with_defaults, i); + asdl_seq_SET(seq, i, pair->value); + } + return seq; +} + +static int _make_posonlyargs(Parser *p, asdl_arg_seq *slash_without_default, + SlashWithDefault *slash_with_default, + asdl_arg_seq **posonlyargs) { + if (slash_without_default != NULL) { + *posonlyargs = slash_without_default; + } else if (slash_with_default != NULL) { + asdl_arg_seq *slash_with_default_names = + _get_names(p, slash_with_default->names_with_defaults); + if (!slash_with_default_names) { + return -1; + } + *posonlyargs = (asdl_arg_seq *)_PyPegen_join_sequences( + p, (asdl_seq *)slash_with_default->plain_names, + (asdl_seq *)slash_with_default_names); + } else { + *posonlyargs = _Py_asdl_arg_seq_new(0, p->arena); + } + return *posonlyargs == NULL ? -1 : 0; +} + +static int _make_posargs(Parser *p, asdl_arg_seq *plain_names, + asdl_seq *names_with_default, asdl_arg_seq **posargs) { + if (plain_names != NULL && names_with_default != NULL) { + asdl_arg_seq *names_with_default_names = _get_names(p, names_with_default); + if (!names_with_default_names) { + return -1; + } + *posargs = (asdl_arg_seq *)_PyPegen_join_sequences( + p, (asdl_seq *)plain_names, (asdl_seq *)names_with_default_names); + } else if (plain_names == NULL && names_with_default != NULL) { + *posargs = _get_names(p, names_with_default); + } else if (plain_names != NULL && names_with_default == NULL) { + *posargs = plain_names; + } else { + *posargs = _Py_asdl_arg_seq_new(0, p->arena); + } + return *posargs == NULL ? -1 : 0; +} + +static int _make_posdefaults(Parser *p, SlashWithDefault *slash_with_default, + asdl_seq *names_with_default, + asdl_expr_seq **posdefaults) { + if (slash_with_default != NULL && names_with_default != NULL) { + asdl_expr_seq *slash_with_default_values = + _get_defaults(p, slash_with_default->names_with_defaults); + if (!slash_with_default_values) { + return -1; + } + asdl_expr_seq *names_with_default_values = + _get_defaults(p, names_with_default); + if (!names_with_default_values) { + return -1; + } + *posdefaults = (asdl_expr_seq *)_PyPegen_join_sequences( + p, (asdl_seq *)slash_with_default_values, + (asdl_seq *)names_with_default_values); + } else if (slash_with_default == NULL && names_with_default != NULL) { + *posdefaults = _get_defaults(p, names_with_default); + } else if (slash_with_default != NULL && names_with_default == NULL) { + *posdefaults = _get_defaults(p, slash_with_default->names_with_defaults); + } else { + *posdefaults = _Py_asdl_expr_seq_new(0, p->arena); + } + return *posdefaults == NULL ? -1 : 0; +} + +static int _make_kwargs(Parser *p, StarEtc *star_etc, asdl_arg_seq **kwonlyargs, + asdl_expr_seq **kwdefaults) { + if (star_etc != NULL && star_etc->kwonlyargs != NULL) { + *kwonlyargs = _get_names(p, star_etc->kwonlyargs); + } else { + *kwonlyargs = _Py_asdl_arg_seq_new(0, p->arena); + } + + if (*kwonlyargs == NULL) { + return -1; + } + + if (star_etc != NULL && star_etc->kwonlyargs != NULL) { + *kwdefaults = _get_defaults(p, star_etc->kwonlyargs); + } else { + *kwdefaults = _Py_asdl_expr_seq_new(0, p->arena); + } + + if (*kwdefaults == NULL) { + return -1; + } + + return 0; +} + +/* Constructs an arguments_ty object out of all the parsed constructs in the + * parameters rule */ +arguments_ty _PyPegen_make_arguments(Parser *p, + asdl_arg_seq *slash_without_default, + SlashWithDefault *slash_with_default, + asdl_arg_seq *plain_names, + asdl_seq *names_with_default, + StarEtc *star_etc) { + asdl_arg_seq *posonlyargs; + if (_make_posonlyargs(p, slash_without_default, slash_with_default, + &posonlyargs) == -1) { + return NULL; + } + + asdl_arg_seq *posargs; + if (_make_posargs(p, plain_names, names_with_default, &posargs) == -1) { + return NULL; + } + + asdl_expr_seq *posdefaults; + if (_make_posdefaults(p, slash_with_default, names_with_default, + &posdefaults) == -1) { + return NULL; + } + + arg_ty vararg = NULL; + if (star_etc != NULL && star_etc->vararg != NULL) { + vararg = star_etc->vararg; + } + + asdl_arg_seq *kwonlyargs; + asdl_expr_seq *kwdefaults; + if (_make_kwargs(p, star_etc, &kwonlyargs, &kwdefaults) == -1) { + return NULL; + } + + arg_ty kwarg = NULL; + if (star_etc != NULL && star_etc->kwarg != NULL) { + kwarg = star_etc->kwarg; + } + + return _PyAST_arguments(posonlyargs, posargs, vararg, kwonlyargs, kwdefaults, + kwarg, posdefaults, p->arena); +} + +/* Constructs an empty arguments_ty object, that gets used when a function + * accepts no arguments. */ +arguments_ty _PyPegen_empty_arguments(Parser *p) { + asdl_arg_seq *posonlyargs = _Py_asdl_arg_seq_new(0, p->arena); + if (!posonlyargs) { + return NULL; + } + asdl_arg_seq *posargs = _Py_asdl_arg_seq_new(0, p->arena); + if (!posargs) { + return NULL; + } + asdl_expr_seq *posdefaults = _Py_asdl_expr_seq_new(0, p->arena); + if (!posdefaults) { + return NULL; + } + asdl_arg_seq *kwonlyargs = _Py_asdl_arg_seq_new(0, p->arena); + if (!kwonlyargs) { + return NULL; + } + asdl_expr_seq *kwdefaults = _Py_asdl_expr_seq_new(0, p->arena); + if (!kwdefaults) { + return NULL; + } + + return _PyAST_arguments(posonlyargs, posargs, NULL, kwonlyargs, kwdefaults, + NULL, posdefaults, p->arena); } /* Encapsulates the value of an operator_ty into an AugOperator struct */ -AugOperator * -_PyPegen_augoperator(Parser *p, operator_ty kind) -{ - AugOperator *a = _PyArena_Malloc(p->arena, sizeof(AugOperator)); - if (!a) { - return NULL; - } - a->kind = kind; - return a; +AugOperator *_PyPegen_augoperator(Parser *p, operator_ty kind) { + AugOperator *a = _PyArena_Malloc(p->arena, sizeof(AugOperator)); + if (!a) { + return NULL; + } + a->kind = kind; + return a; } /* Construct a FunctionDef equivalent to function_def, but with decorators */ -stmt_ty -_PyPegen_function_def_decorators(Parser *p, asdl_expr_seq *decorators, stmt_ty function_def) -{ - assert(function_def != NULL); - if (function_def->kind == AsyncFunctionDef_kind) { - return _PyAST_AsyncFunctionDef( - function_def->v.AsyncFunctionDef.name, - function_def->v.AsyncFunctionDef.args, - function_def->v.AsyncFunctionDef.body, decorators, - function_def->v.AsyncFunctionDef.returns, - function_def->v.AsyncFunctionDef.type_comment, - function_def->v.AsyncFunctionDef.type_params, - function_def->lineno, function_def->col_offset, - function_def->end_lineno, function_def->end_col_offset, p->arena); - } - - return _PyAST_FunctionDef( - function_def->v.FunctionDef.name, - function_def->v.FunctionDef.args, - function_def->v.FunctionDef.body, decorators, - function_def->v.FunctionDef.returns, - function_def->v.FunctionDef.type_comment, - function_def->v.FunctionDef.type_params, - function_def->lineno, function_def->col_offset, - function_def->end_lineno, function_def->end_col_offset, p->arena); +stmt_ty _PyPegen_function_def_decorators(Parser *p, asdl_expr_seq *decorators, + stmt_ty function_def) { + assert(function_def != NULL); + if (function_def->kind == AsyncFunctionDef_kind) { + return _PyAST_AsyncFunctionDef( + function_def->v.AsyncFunctionDef.name, + function_def->v.AsyncFunctionDef.args, + function_def->v.AsyncFunctionDef.body, decorators, + function_def->v.AsyncFunctionDef.returns, + function_def->v.AsyncFunctionDef.type_comment, + function_def->v.AsyncFunctionDef.type_params, function_def->lineno, + function_def->col_offset, function_def->end_lineno, + function_def->end_col_offset, p->arena); + } + + return _PyAST_FunctionDef( + function_def->v.FunctionDef.name, function_def->v.FunctionDef.args, + function_def->v.FunctionDef.body, decorators, + function_def->v.FunctionDef.returns, + function_def->v.FunctionDef.type_comment, + function_def->v.FunctionDef.type_params, function_def->lineno, + function_def->col_offset, function_def->end_lineno, + function_def->end_col_offset, p->arena); } /* Construct a ClassDef equivalent to class_def, but with decorators */ -stmt_ty -_PyPegen_class_def_decorators(Parser *p, asdl_expr_seq *decorators, stmt_ty class_def) -{ - assert(class_def != NULL); - return _PyAST_ClassDef( - class_def->v.ClassDef.name, - class_def->v.ClassDef.bases, class_def->v.ClassDef.keywords, - class_def->v.ClassDef.body, decorators, - class_def->v.ClassDef.type_params, - class_def->lineno, class_def->col_offset, class_def->end_lineno, - class_def->end_col_offset, p->arena); +stmt_ty _PyPegen_class_def_decorators(Parser *p, asdl_expr_seq *decorators, + stmt_ty class_def) { + assert(class_def != NULL); + return _PyAST_ClassDef( + class_def->v.ClassDef.name, class_def->v.ClassDef.bases, + class_def->v.ClassDef.keywords, class_def->v.ClassDef.body, decorators, + class_def->v.ClassDef.type_params, class_def->lineno, + class_def->col_offset, class_def->end_lineno, class_def->end_col_offset, + p->arena); } /* Construct a KeywordOrStarred */ -KeywordOrStarred * -_PyPegen_keyword_or_starred(Parser *p, void *element, int is_keyword) -{ - KeywordOrStarred *a = _PyArena_Malloc(p->arena, sizeof(KeywordOrStarred)); - if (!a) { - return NULL; - } - a->element = element; - a->is_keyword = is_keyword; - return a; -} - -/* Get the number of starred expressions in an asdl_seq* of KeywordOrStarred*s */ -static int -_seq_number_of_starred_exprs(asdl_seq *seq) -{ - int n = 0; - for (Py_ssize_t i = 0, l = asdl_seq_LEN(seq); i < l; i++) { - KeywordOrStarred *k = asdl_seq_GET_UNTYPED(seq, i); - if (!k->is_keyword) { - n++; - } - } - return n; +KeywordOrStarred *_PyPegen_keyword_or_starred(Parser *p, void *element, + int is_keyword) { + KeywordOrStarred *a = _PyArena_Malloc(p->arena, sizeof(KeywordOrStarred)); + if (!a) { + return NULL; + } + a->element = element; + a->is_keyword = is_keyword; + return a; +} + +/* Get the number of starred expressions in an asdl_seq* of KeywordOrStarred*s + */ +static int _seq_number_of_starred_exprs(asdl_seq *seq) { + int n = 0; + for (Py_ssize_t i = 0, l = asdl_seq_LEN(seq); i < l; i++) { + KeywordOrStarred *k = asdl_seq_GET_UNTYPED(seq, i); + if (!k->is_keyword) { + n++; + } + } + return n; } /* Extract the starred expressions of an asdl_seq* of KeywordOrStarred*s */ -asdl_expr_seq * -_PyPegen_seq_extract_starred_exprs(Parser *p, asdl_seq *kwargs) -{ - int new_len = _seq_number_of_starred_exprs(kwargs); - if (new_len == 0) { - return NULL; - } - asdl_expr_seq *new_seq = _Py_asdl_expr_seq_new(new_len, p->arena); - if (!new_seq) { - return NULL; - } - - int idx = 0; - for (Py_ssize_t i = 0, len = asdl_seq_LEN(kwargs); i < len; i++) { - KeywordOrStarred *k = asdl_seq_GET_UNTYPED(kwargs, i); - if (!k->is_keyword) { - asdl_seq_SET(new_seq, idx++, k->element); - } - } - return new_seq; +asdl_expr_seq *_PyPegen_seq_extract_starred_exprs(Parser *p, asdl_seq *kwargs) { + int new_len = _seq_number_of_starred_exprs(kwargs); + if (new_len == 0) { + return NULL; + } + asdl_expr_seq *new_seq = _Py_asdl_expr_seq_new(new_len, p->arena); + if (!new_seq) { + return NULL; + } + + int idx = 0; + for (Py_ssize_t i = 0, len = asdl_seq_LEN(kwargs); i < len; i++) { + KeywordOrStarred *k = asdl_seq_GET_UNTYPED(kwargs, i); + if (!k->is_keyword) { + asdl_seq_SET(new_seq, idx++, k->element); + } + } + return new_seq; } /* Return a new asdl_seq* with only the keywords in kwargs */ -asdl_keyword_seq* -_PyPegen_seq_delete_starred_exprs(Parser *p, asdl_seq *kwargs) -{ - Py_ssize_t len = asdl_seq_LEN(kwargs); - Py_ssize_t new_len = len - _seq_number_of_starred_exprs(kwargs); - if (new_len == 0) { - return NULL; - } - asdl_keyword_seq *new_seq = _Py_asdl_keyword_seq_new(new_len, p->arena); - if (!new_seq) { - return NULL; - } - - int idx = 0; - for (Py_ssize_t i = 0; i < len; i++) { - KeywordOrStarred *k = asdl_seq_GET_UNTYPED(kwargs, i); - if (k->is_keyword) { - asdl_seq_SET(new_seq, idx++, k->element); - } - } - return new_seq; -} - -expr_ty -_PyPegen_ensure_imaginary(Parser *p, expr_ty exp) -{ - if (exp->kind != Constant_kind || !PyComplex_CheckExact(exp->v.Constant.value)) { - RAISE_SYNTAX_ERROR_KNOWN_LOCATION(exp, "imaginary number required in complex literal"); - return NULL; - } - return exp; -} - -expr_ty -_PyPegen_ensure_real(Parser *p, expr_ty exp) -{ - if (exp->kind != Constant_kind || PyComplex_CheckExact(exp->v.Constant.value)) { - RAISE_SYNTAX_ERROR_KNOWN_LOCATION(exp, "real number required in complex literal"); - return NULL; - } - return exp; -} - -mod_ty -_PyPegen_make_module(Parser *p, asdl_stmt_seq *a) { - asdl_type_ignore_seq *type_ignores = NULL; - Py_ssize_t num = p->type_ignore_comments.num_items; - if (num > 0) { - // Turn the raw (comment, lineno) pairs into TypeIgnore objects in the arena - type_ignores = _Py_asdl_type_ignore_seq_new(num, p->arena); - if (type_ignores == NULL) { - return NULL; - } - for (int i = 0; i < num; i++) { - PyObject *tag = _PyPegen_new_type_comment(p, p->type_ignore_comments.items[i].comment); - if (tag == NULL) { - return NULL; - } - type_ignore_ty ti = _PyAST_TypeIgnore(p->type_ignore_comments.items[i].lineno, - tag, p->arena); - if (ti == NULL) { - return NULL; - } - asdl_seq_SET(type_ignores, i, ti); - } - } - return _PyAST_Module(a, type_ignores, p->arena); -} - -PyObject * -_PyPegen_new_type_comment(Parser *p, const char *s) -{ - PyObject *res = PyUnicode_DecodeUTF8(s, strlen(s), NULL); - if (res == NULL) { - return NULL; - } - if (_PyArena_AddPyObject(p->arena, res) < 0) { - Py_DECREF(res); - return NULL; - } - return res; -} - -arg_ty -_PyPegen_add_type_comment_to_arg(Parser *p, arg_ty a, Token *tc) -{ - if (tc == NULL) { - return a; - } - const char *bytes = PyBytes_AsString(tc->bytes); - if (bytes == NULL) { - return NULL; - } - PyObject *tco = _PyPegen_new_type_comment(p, bytes); - if (tco == NULL) { - return NULL; - } - return _PyAST_arg(a->arg, a->annotation, tco, - a->lineno, a->col_offset, a->end_lineno, a->end_col_offset, - p->arena); +asdl_keyword_seq *_PyPegen_seq_delete_starred_exprs(Parser *p, + asdl_seq *kwargs) { + Py_ssize_t len = asdl_seq_LEN(kwargs); + Py_ssize_t new_len = len - _seq_number_of_starred_exprs(kwargs); + if (new_len == 0) { + return NULL; + } + asdl_keyword_seq *new_seq = _Py_asdl_keyword_seq_new(new_len, p->arena); + if (!new_seq) { + return NULL; + } + + int idx = 0; + for (Py_ssize_t i = 0; i < len; i++) { + KeywordOrStarred *k = asdl_seq_GET_UNTYPED(kwargs, i); + if (k->is_keyword) { + asdl_seq_SET(new_seq, idx++, k->element); + } + } + return new_seq; +} + +expr_ty _PyPegen_ensure_imaginary(Parser *p, expr_ty exp) { + if (exp->kind != Constant_kind || + !PyComplex_CheckExact(exp->v.Constant.value)) { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION( + exp, "imaginary number required in complex literal"); + return NULL; + } + return exp; +} + +expr_ty _PyPegen_ensure_real(Parser *p, expr_ty exp) { + if (exp->kind != Constant_kind || + PyComplex_CheckExact(exp->v.Constant.value)) { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION( + exp, "real number required in complex literal"); + return NULL; + } + return exp; +} + +mod_ty _PyPegen_make_module(Parser *p, asdl_stmt_seq *a) { + asdl_type_ignore_seq *type_ignores = NULL; + Py_ssize_t num = p->type_ignore_comments.num_items; + if (num > 0) { + // Turn the raw (comment, lineno) pairs into TypeIgnore objects in the arena + type_ignores = _Py_asdl_type_ignore_seq_new(num, p->arena); + if (type_ignores == NULL) { + return NULL; + } + for (int i = 0; i < num; i++) { + PyObject *tag = _PyPegen_new_type_comment( + p, p->type_ignore_comments.items[i].comment); + if (tag == NULL) { + return NULL; + } + type_ignore_ty ti = _PyAST_TypeIgnore( + p->type_ignore_comments.items[i].lineno, tag, p->arena); + if (ti == NULL) { + return NULL; + } + asdl_seq_SET(type_ignores, i, ti); + } + } + return _PyAST_Module(a, type_ignores, p->arena); +} + +PyObject *_PyPegen_new_type_comment(Parser *p, const char *s) { + PyObject *res = PyUnicode_DecodeUTF8(s, strlen(s), NULL); + if (res == NULL) { + return NULL; + } + if (_PyArena_AddPyObject(p->arena, res) < 0) { + Py_DECREF(res); + return NULL; + } + return res; +} + +arg_ty _PyPegen_add_type_comment_to_arg(Parser *p, arg_ty a, Token *tc) { + if (tc == NULL) { + return a; + } + const char *bytes = PyBytes_AsString(tc->bytes); + if (bytes == NULL) { + return NULL; + } + PyObject *tco = _PyPegen_new_type_comment(p, bytes); + if (tco == NULL) { + return NULL; + } + return _PyAST_arg(a->arg, a->annotation, tco, a->lineno, a->col_offset, + a->end_lineno, a->end_col_offset, p->arena); } /* Checks if the NOTEQUAL token is valid given the current parser flags 0 indicates success and nonzero indicates failure (an exception may be set) */ -int -_PyPegen_check_barry_as_flufl(Parser *p, Token* t) { - assert(t->bytes != NULL); - assert(t->type == NOTEQUAL); - - const char* tok_str = PyBytes_AS_STRING(t->bytes); - if (p->flags & PyPARSE_BARRY_AS_BDFL && strcmp(tok_str, "<>") != 0) { - RAISE_SYNTAX_ERROR("with Barry as BDFL, use '<>' instead of '!='"); - return -1; - } - if (!(p->flags & PyPARSE_BARRY_AS_BDFL)) { - return strcmp(tok_str, "!="); - } +int _PyPegen_check_barry_as_flufl(Parser *p, Token *t) { + assert(t->bytes != NULL); + assert(t->type == NOTEQUAL); + + const char *tok_str = PyBytes_AS_STRING(t->bytes); + if (p->flags & PyPARSE_BARRY_AS_BDFL && strcmp(tok_str, "<>") != 0) { + RAISE_SYNTAX_ERROR("with Barry as BDFL, use '<>' instead of '!='"); + return -1; + } + if (!(p->flags & PyPARSE_BARRY_AS_BDFL)) { + return strcmp(tok_str, "!="); + } + return 0; +} + +int _PyPegen_check_legacy_stmt(Parser *p, expr_ty name) { + if (name->kind != Name_kind) { return 0; -} - -int -_PyPegen_check_legacy_stmt(Parser *p, expr_ty name) { - if (name->kind != Name_kind) { - return 0; - } - const char* candidates[2] = {"print", "exec"}; - for (int i=0; i<2; i++) { - if (PyUnicode_CompareWithASCIIString(name->v.Name.id, candidates[i]) == 0) { - return 1; - } + } + const char *candidates[2] = {"print", "exec"}; + for (int i = 0; i < 2; i++) { + if (PyUnicode_CompareWithASCIIString(name->v.Name.id, candidates[i]) == 0) { + return 1; } - return 0; + } + return 0; } static ResultTokenWithMetadata * -result_token_with_metadata(Parser *p, void *result, PyObject *metadata) -{ - ResultTokenWithMetadata *res = _PyArena_Malloc(p->arena, sizeof(ResultTokenWithMetadata)); - if (res == NULL) { - return NULL; - } - res->metadata = metadata; - res->result = result; - return res; +result_token_with_metadata(Parser *p, void *result, PyObject *metadata) { + ResultTokenWithMetadata *res = + _PyArena_Malloc(p->arena, sizeof(ResultTokenWithMetadata)); + if (res == NULL) { + return NULL; + } + res->metadata = metadata; + res->result = result; + return res; } ResultTokenWithMetadata * -_PyPegen_check_fstring_conversion(Parser *p, Token* conv_token, expr_ty conv) -{ - if (conv_token->lineno != conv->lineno || conv_token->end_col_offset != conv->col_offset) { - return RAISE_SYNTAX_ERROR_KNOWN_RANGE( - conv_token, conv, - "f-string: conversion type must come right after the exclamanation mark" - ); - } - return result_token_with_metadata(p, conv, conv_token->metadata); +_PyPegen_check_fstring_conversion(Parser *p, Token *conv_token, expr_ty conv) { + if (conv_token->lineno != conv->lineno || + conv_token->end_col_offset != conv->col_offset) { + return RAISE_SYNTAX_ERROR_KNOWN_RANGE(conv_token, conv, + "f-string: conversion type must come " + "right after the exclamanation mark"); + } + return result_token_with_metadata(p, conv, conv_token->metadata); } +static asdl_expr_seq * +unpack_top_level_joined_strs(Parser *p, asdl_expr_seq *raw_expressions); ResultTokenWithMetadata * -_PyPegen_setup_full_format_spec(Parser *p, Token *colon, asdl_expr_seq *spec, int lineno, int col_offset, - int end_lineno, int end_col_offset, PyArena *arena) -{ - if (!spec) { - return NULL; - } - - // This is needed to keep compatibility with 3.11, where an empty format spec is parsed - // as an *empty* JoinedStr node, instead of having an empty constant in it. - if (asdl_seq_LEN(spec) == 1) { - expr_ty e = asdl_seq_GET(spec, 0); - if (e->kind == Constant_kind - && PyUnicode_Check(e->v.Constant.value) - && PyUnicode_GetLength(e->v.Constant.value) == 0) { - spec = _Py_asdl_expr_seq_new(0, arena); - } - } - - expr_ty res = _PyAST_JoinedStr(spec, lineno, col_offset, end_lineno, end_col_offset, p->arena); - if (!res) { - return NULL; - } - return result_token_with_metadata(p, res, colon->metadata); -} - -const char * -_PyPegen_get_expr_name(expr_ty e) -{ - assert(e != NULL); - switch (e->kind) { - case Attribute_kind: - return "attribute"; - case Subscript_kind: - return "subscript"; - case Starred_kind: - return "starred"; - case Name_kind: - return "name"; - case List_kind: - return "list"; - case Tuple_kind: - return "tuple"; - case Lambda_kind: - return "lambda"; - case Call_kind: - return "function call"; - case BoolOp_kind: - case BinOp_kind: - case UnaryOp_kind: - return "expression"; - 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 literal"; - 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; - } -} - -expr_ty -_PyPegen_get_last_comprehension_item(comprehension_ty comprehension) { - if (comprehension->ifs == NULL || asdl_seq_LEN(comprehension->ifs) == 0) { - return comprehension->iter; - } - return PyPegen_last_item(comprehension->ifs, expr_ty); +_PyPegen_setup_full_format_spec(Parser *p, Token *colon, asdl_expr_seq *spec, + int lineno, int col_offset, int end_lineno, + int end_col_offset, PyArena *arena) { + if (!spec) { + return NULL; + } + + // This is needed to keep compatibility with 3.11, where an empty format spec + // is parsed as an *empty* JoinedStr node, instead of having an empty constant + // in it. + if (asdl_seq_LEN(spec) == 1) { + expr_ty e = asdl_seq_GET(spec, 0); + if (e->kind == Constant_kind && PyUnicode_Check(e->v.Constant.value) && + PyUnicode_GetLength(e->v.Constant.value) == 0) { + spec = _Py_asdl_expr_seq_new(0, arena); + } + } + expr_ty res; + Py_ssize_t n = asdl_seq_LEN(spec); + if (n == 0 || (n == 1 && asdl_seq_GET(spec, 0)->kind == Constant_kind)) { + res = _PyAST_JoinedStr(spec, lineno, col_offset, end_lineno, end_col_offset, + p->arena); + } else { + res = _PyPegen_concatenate_strings(p, spec, lineno, col_offset, end_lineno, + end_col_offset, arena); + } + if (!res) { + return NULL; + } + return result_token_with_metadata(p, res, colon->metadata); +} + +const char *_PyPegen_get_expr_name(expr_ty e) { + assert(e != NULL); + switch (e->kind) { + case Attribute_kind: + return "attribute"; + case Subscript_kind: + return "subscript"; + case Starred_kind: + return "starred"; + case Name_kind: + return "name"; + case List_kind: + return "list"; + case Tuple_kind: + return "tuple"; + case Lambda_kind: + return "lambda"; + case Call_kind: + return "function call"; + case BoolOp_kind: + case BinOp_kind: + case UnaryOp_kind: + return "expression"; + 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 literal"; + 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; + } +} + +expr_ty _PyPegen_get_last_comprehension_item(comprehension_ty comprehension) { + if (comprehension->ifs == NULL || asdl_seq_LEN(comprehension->ifs) == 0) { + return comprehension->iter; + } + return PyPegen_last_item(comprehension->ifs, expr_ty); } expr_ty _PyPegen_collect_call_seqs(Parser *p, asdl_expr_seq *a, asdl_seq *b, - int lineno, int col_offset, int end_lineno, - int end_col_offset, PyArena *arena) { - Py_ssize_t args_len = asdl_seq_LEN(a); - Py_ssize_t total_len = args_len; - - if (b == NULL) { - return _PyAST_Call(_PyPegen_dummy_name(p), a, NULL, lineno, col_offset, - end_lineno, end_col_offset, arena); + int lineno, int col_offset, int end_lineno, + int end_col_offset, PyArena *arena) { + Py_ssize_t args_len = asdl_seq_LEN(a); + Py_ssize_t total_len = args_len; - } + if (b == NULL) { + return _PyAST_Call(_PyPegen_dummy_name(p), a, NULL, lineno, col_offset, + end_lineno, end_col_offset, arena); + } - asdl_expr_seq *starreds = _PyPegen_seq_extract_starred_exprs(p, b); - asdl_keyword_seq *keywords = _PyPegen_seq_delete_starred_exprs(p, b); + asdl_expr_seq *starreds = _PyPegen_seq_extract_starred_exprs(p, b); + asdl_keyword_seq *keywords = _PyPegen_seq_delete_starred_exprs(p, b); - if (starreds) { - total_len += asdl_seq_LEN(starreds); - } + if (starreds) { + total_len += asdl_seq_LEN(starreds); + } - asdl_expr_seq *args = _Py_asdl_expr_seq_new(total_len, arena); + asdl_expr_seq *args = _Py_asdl_expr_seq_new(total_len, arena); + if (args == NULL) { + return NULL; + } - Py_ssize_t i = 0; - for (i = 0; i < args_len; i++) { - asdl_seq_SET(args, i, asdl_seq_GET(a, i)); - } - for (; i < total_len; i++) { - asdl_seq_SET(args, i, asdl_seq_GET(starreds, i - args_len)); - } + Py_ssize_t i = 0; + for (i = 0; i < args_len; i++) { + asdl_seq_SET(args, i, asdl_seq_GET(a, i)); + } + for (; i < total_len; i++) { + asdl_seq_SET(args, i, asdl_seq_GET(starreds, i - args_len)); + } - return _PyAST_Call(_PyPegen_dummy_name(p), args, keywords, lineno, - col_offset, end_lineno, end_col_offset, arena); + return _PyAST_Call(_PyPegen_dummy_name(p), args, keywords, lineno, col_offset, + end_lineno, end_col_offset, arena); } // AST Error reporting helpers -expr_ty -_PyPegen_get_invalid_target(expr_ty e, TARGETS_TYPE targets_type) -{ - if (e == NULL) { - return NULL; - } - -#define VISIT_CONTAINER(CONTAINER, TYPE) do { \ - Py_ssize_t len = asdl_seq_LEN((CONTAINER)->v.TYPE.elts);\ - for (Py_ssize_t i = 0; i < len; i++) {\ - expr_ty other = asdl_seq_GET((CONTAINER)->v.TYPE.elts, i);\ - expr_ty child = _PyPegen_get_invalid_target(other, targets_type);\ - if (child != NULL) {\ - return child;\ - }\ - }\ - } while (0) - - // We only need to visit List and Tuple nodes recursively as those - // are the only ones that can contain valid names in targets when - // they are parsed as expressions. Any other kind of expression - // that is a container (like Sets or Dicts) is directly invalid and - // we don't need to visit it recursively. - - switch (e->kind) { - case List_kind: - VISIT_CONTAINER(e, List); - return NULL; - case Tuple_kind: - VISIT_CONTAINER(e, Tuple); - return NULL; - case Starred_kind: - if (targets_type == DEL_TARGETS) { - return e; - } - return _PyPegen_get_invalid_target(e->v.Starred.value, targets_type); - case Compare_kind: - // This is needed, because the `a in b` in `for a in b` gets parsed - // as a comparison, and so we need to search the left side of the comparison - // for invalid targets. - if (targets_type == FOR_TARGETS) { - cmpop_ty cmpop = (cmpop_ty) asdl_seq_GET(e->v.Compare.ops, 0); - if (cmpop == In) { - return _PyPegen_get_invalid_target(e->v.Compare.left, targets_type); - } - return NULL; - } - return e; - case Name_kind: - case Subscript_kind: - case Attribute_kind: - return NULL; - default: - return e; - } +expr_ty _PyPegen_get_invalid_target(expr_ty e, TARGETS_TYPE targets_type) { + if (e == NULL) { + return NULL; + } + +#define VISIT_CONTAINER(CONTAINER, TYPE) \ + do { \ + Py_ssize_t len = asdl_seq_LEN((CONTAINER)->v.TYPE.elts); \ + for (Py_ssize_t i = 0; i < len; i++) { \ + expr_ty other = asdl_seq_GET((CONTAINER)->v.TYPE.elts, i); \ + expr_ty child = _PyPegen_get_invalid_target(other, targets_type); \ + if (child != NULL) { \ + return child; \ + } \ + } \ + } while (0) + + // We only need to visit List and Tuple nodes recursively as those + // are the only ones that can contain valid names in targets when + // they are parsed as expressions. Any other kind of expression + // that is a container (like Sets or Dicts) is directly invalid and + // we don't need to visit it recursively. + + switch (e->kind) { + case List_kind: + VISIT_CONTAINER(e, List); + return NULL; + case Tuple_kind: + VISIT_CONTAINER(e, Tuple); + return NULL; + case Starred_kind: + if (targets_type == DEL_TARGETS) { + return e; + } + return _PyPegen_get_invalid_target(e->v.Starred.value, targets_type); + case Compare_kind: + // This is needed, because the `a in b` in `for a in b` gets parsed + // as a comparison, and so we need to search the left side of the comparison + // for invalid targets. + if (targets_type == FOR_TARGETS) { + cmpop_ty cmpop = (cmpop_ty)asdl_seq_GET(e->v.Compare.ops, 0); + if (cmpop == In) { + return _PyPegen_get_invalid_target(e->v.Compare.left, targets_type); + } + return NULL; + } + return e; + case Name_kind: + case Subscript_kind: + case Attribute_kind: + return NULL; + default: + return e; + } } void *_PyPegen_arguments_parsing_error(Parser *p, expr_ty e) { - int kwarg_unpacking = 0; - for (Py_ssize_t i = 0, l = asdl_seq_LEN(e->v.Call.keywords); i < l; i++) { - keyword_ty keyword = asdl_seq_GET(e->v.Call.keywords, i); - if (!keyword->arg) { - kwarg_unpacking = 1; - } - } - - const char *msg = NULL; - if (kwarg_unpacking) { - msg = "positional argument follows keyword argument unpacking"; - } else { - msg = "positional argument follows keyword argument"; - } - - return RAISE_SYNTAX_ERROR(msg); -} - -void * -_PyPegen_nonparen_genexp_in_call(Parser *p, expr_ty args, asdl_comprehension_seq *comprehensions) -{ - /* The rule that calls this function is 'args for_if_clauses'. - For the input f(L, x for x in y), L and x are in args and - the for is parsed as a for_if_clause. We have to check if - len <= 1, so that input like dict((a, b) for a, b in x) - gets successfully parsed and then we pass the last - argument (x in the above example) as the location of the - error */ - Py_ssize_t len = asdl_seq_LEN(args->v.Call.args); - if (len <= 1) { - return NULL; - } - - comprehension_ty last_comprehension = PyPegen_last_item(comprehensions, comprehension_ty); - - return RAISE_SYNTAX_ERROR_KNOWN_RANGE( - (expr_ty) asdl_seq_GET(args->v.Call.args, len - 1), - _PyPegen_get_last_comprehension_item(last_comprehension), - "Generator expression must be parenthesized" - ); + int kwarg_unpacking = 0; + for (Py_ssize_t i = 0, l = asdl_seq_LEN(e->v.Call.keywords); i < l; i++) { + keyword_ty keyword = asdl_seq_GET(e->v.Call.keywords, i); + if (!keyword->arg) { + kwarg_unpacking = 1; + } + } + + const char *msg = NULL; + if (kwarg_unpacking) { + msg = "positional argument follows keyword argument unpacking"; + } else { + msg = "positional argument follows keyword argument"; + } + + return RAISE_SYNTAX_ERROR(msg); +} + +void *_PyPegen_nonparen_genexp_in_call(Parser *p, expr_ty args, + asdl_comprehension_seq *comprehensions) { + /* The rule that calls this function is 'args for_if_clauses'. + For the input f(L, x for x in y), L and x are in args and + the for is parsed as a for_if_clause. We have to check if + len <= 1, so that input like dict((a, b) for a, b in x) + gets successfully parsed and then we pass the last + argument (x in the above example) as the location of the + error */ + Py_ssize_t len = asdl_seq_LEN(args->v.Call.args); + if (len <= 1) { + return NULL; + } + + comprehension_ty last_comprehension = + PyPegen_last_item(comprehensions, comprehension_ty); + + return RAISE_SYNTAX_ERROR_KNOWN_RANGE( + (expr_ty)asdl_seq_GET(args->v.Call.args, len - 1), + _PyPegen_get_last_comprehension_item(last_comprehension), + "Generator expression must be parenthesized"); } // Fstring stuff -static expr_ty -_PyPegen_decode_fstring_part(Parser* p, int is_raw, expr_ty constant, Token* token) { - assert(PyUnicode_CheckExact(constant->v.Constant.value)); - - const char* bstr = PyUnicode_AsUTF8(constant->v.Constant.value); - if (bstr == NULL) { - return NULL; - } - - size_t len; - if (strcmp(bstr, "{{") == 0 || strcmp(bstr, "}}") == 0) { - len = 1; - } else { - len = strlen(bstr); - } - - is_raw = is_raw || strchr(bstr, '\\') == NULL; - PyObject *str = _PyPegen_decode_string(p, is_raw, bstr, len, token); - if (str == NULL) { - _Pypegen_raise_decode_error(p); - return NULL; - } - if (_PyArena_AddPyObject(p->arena, str) < 0) { - Py_DECREF(str); - return NULL; - } - return _PyAST_Constant(str, NULL, constant->lineno, constant->col_offset, - constant->end_lineno, constant->end_col_offset, - p->arena); +static expr_ty _PyPegen_decode_fstring_part(Parser *p, int is_raw, + expr_ty constant, Token *token) { + assert(PyUnicode_CheckExact(constant->v.Constant.value)); + + const char *bstr = PyUnicode_AsUTF8(constant->v.Constant.value); + if (bstr == NULL) { + return NULL; + } + + size_t len; + if (strcmp(bstr, "{{") == 0 || strcmp(bstr, "}}") == 0) { + len = 1; + } else { + len = strlen(bstr); + } + + is_raw = is_raw || strchr(bstr, '\\') == NULL; + PyObject *str = _PyPegen_decode_string(p, is_raw, bstr, len, token); + if (str == NULL) { + _Pypegen_raise_decode_error(p); + return NULL; + } + if (_PyArena_AddPyObject(p->arena, str) < 0) { + Py_DECREF(str); + return NULL; + } + return _PyAST_Constant(str, NULL, constant->lineno, constant->col_offset, + constant->end_lineno, constant->end_col_offset, + p->arena); } static asdl_expr_seq * -unpack_top_level_joined_strs(Parser *p, asdl_expr_seq *raw_expressions) -{ - /* The parser might put multiple f-string values into an individual - * JoinedStr node at the top level due to stuff like f-string debugging - * expressions. This function flattens those and promotes them to the - * upper level. Only simplifies AST, but the compiler already takes care - * of the regular output, so this is not necessary if you are not going - * to expose the output AST to Python level. */ - - Py_ssize_t i, req_size, raw_size; - - req_size = raw_size = asdl_seq_LEN(raw_expressions); - expr_ty expr; - for (i = 0; i < raw_size; i++) { - expr = asdl_seq_GET(raw_expressions, i); - if (expr->kind == JoinedStr_kind) { - req_size += asdl_seq_LEN(expr->v.JoinedStr.values) - 1; - } - } - - asdl_expr_seq *expressions = _Py_asdl_expr_seq_new(req_size, p->arena); - - Py_ssize_t raw_index, req_index = 0; - for (raw_index = 0; raw_index < raw_size; raw_index++) { - expr = asdl_seq_GET(raw_expressions, raw_index); - if (expr->kind == JoinedStr_kind) { - asdl_expr_seq *values = expr->v.JoinedStr.values; - for (Py_ssize_t n = 0; n < asdl_seq_LEN(values); n++) { - asdl_seq_SET(expressions, req_index, asdl_seq_GET(values, n)); - req_index++; - } - } else { - asdl_seq_SET(expressions, req_index, expr); - req_index++; - } - } - return expressions; -} - -expr_ty -_PyPegen_joined_str(Parser *p, Token* a, asdl_expr_seq* raw_expressions, Token*b) { - asdl_expr_seq *expr = unpack_top_level_joined_strs(p, raw_expressions); - Py_ssize_t n_items = asdl_seq_LEN(expr); - - const char* quote_str = PyBytes_AsString(a->bytes); - if (quote_str == NULL) { - return NULL; - } - int is_raw = strpbrk(quote_str, "rR") != NULL; - - asdl_expr_seq *seq = _Py_asdl_expr_seq_new(n_items, p->arena); - if (seq == NULL) { - return NULL; - } - - Py_ssize_t index = 0; - for (Py_ssize_t i = 0; i < n_items; i++) { - expr_ty item = asdl_seq_GET(expr, i); - if (item->kind == Constant_kind) { - item = _PyPegen_decode_fstring_part(p, is_raw, item, b); - if (item == NULL) { - return NULL; - } - - /* Tokenizer emits string parts even when the underlying string - might become an empty value (e.g. FSTRING_MIDDLE with the value \\n) - so we need to check for them and simplify it here. */ - if (PyUnicode_CheckExact(item->v.Constant.value) - && PyUnicode_GET_LENGTH(item->v.Constant.value) == 0) { - continue; - } - } - asdl_seq_SET(seq, index++, item); - } - - asdl_expr_seq *resized_exprs; - if (index != n_items) { - resized_exprs = _Py_asdl_expr_seq_new(index, p->arena); - if (resized_exprs == NULL) { - return NULL; - } - for (Py_ssize_t i = 0; i < index; i++) { - asdl_seq_SET(resized_exprs, i, asdl_seq_GET(seq, i)); - } - } - else { - resized_exprs = seq; - } - - return _PyAST_JoinedStr(resized_exprs, a->lineno, a->col_offset, - b->end_lineno, b->end_col_offset, - p->arena); -} - -expr_ty _PyPegen_decoded_constant_from_token(Parser* p, Token* tok) { - Py_ssize_t bsize; - char* bstr; - if (PyBytes_AsStringAndSize(tok->bytes, &bstr, &bsize) == -1) { - return NULL; - } - PyObject* str = _PyPegen_decode_string(p, 0, bstr, bsize, tok); - if (str == NULL) { - return NULL; - } - if (_PyArena_AddPyObject(p->arena, str) < 0) { - Py_DECREF(str); - return NULL; - } - return _PyAST_Constant(str, NULL, tok->lineno, tok->col_offset, - tok->end_lineno, tok->end_col_offset, - p->arena); -} - -expr_ty _PyPegen_constant_from_token(Parser* p, Token* tok) { - char* bstr = PyBytes_AsString(tok->bytes); - if (bstr == NULL) { - return NULL; - } - PyObject* str = PyUnicode_FromString(bstr); - if (str == NULL) { - return NULL; - } - if (_PyArena_AddPyObject(p->arena, str) < 0) { - Py_DECREF(str); - return NULL; - } - return _PyAST_Constant(str, NULL, tok->lineno, tok->col_offset, - tok->end_lineno, tok->end_col_offset, - p->arena); -} - -expr_ty _PyPegen_constant_from_string(Parser* p, Token* tok) { - char* the_str = PyBytes_AsString(tok->bytes); - if (the_str == NULL) { - return NULL; - } - PyObject *s = _PyPegen_parse_string(p, tok); - if (s == NULL) { - _Pypegen_raise_decode_error(p); - return NULL; - } - if (_PyArena_AddPyObject(p->arena, s) < 0) { - Py_DECREF(s); - return NULL; - } - PyObject *kind = NULL; - if (the_str && the_str[0] == 'u') { - kind = _PyPegen_new_identifier(p, "u"); - if (kind == NULL) { - return NULL; - } - } - return _PyAST_Constant(s, kind, tok->lineno, tok->col_offset, tok->end_lineno, tok->end_col_offset, p->arena); -} - -expr_ty _PyPegen_formatted_value(Parser *p, expr_ty expression, Token *debug, ResultTokenWithMetadata *conversion, - ResultTokenWithMetadata *format, Token *closing_brace, int lineno, int col_offset, - int end_lineno, int end_col_offset, PyArena *arena) { - int conversion_val = -1; - if (conversion != NULL) { - expr_ty conversion_expr = (expr_ty) conversion->result; - assert(conversion_expr->kind == Name_kind); - Py_UCS4 first = PyUnicode_READ_CHAR(conversion_expr->v.Name.id, 0); - - if (PyUnicode_GET_LENGTH(conversion_expr->v.Name.id) > 1 || - !(first == 's' || first == 'r' || first == 'a')) { - RAISE_SYNTAX_ERROR_KNOWN_LOCATION(conversion_expr, - "f-string: invalid conversion character %R: expected 's', 'r', or 'a'", - conversion_expr->v.Name.id); - return NULL; - } - - conversion_val = Py_SAFE_DOWNCAST(first, Py_UCS4, int); - } - else if (debug && !format) { - /* If no conversion is specified, use !r for debug expressions */ - conversion_val = (int)'r'; - } - - expr_ty formatted_value = _PyAST_FormattedValue( - expression, conversion_val, format ? (expr_ty) format->result : NULL, - lineno, col_offset, end_lineno, - end_col_offset, arena - ); - - if (debug) { - /* Find the non whitespace token after the "=" */ - int debug_end_line, debug_end_offset; - PyObject *debug_metadata; - - if (conversion) { - debug_end_line = ((expr_ty) conversion->result)->lineno; - debug_end_offset = ((expr_ty) conversion->result)->col_offset; - debug_metadata = conversion->metadata; - } - else if (format) { - debug_end_line = ((expr_ty) format->result)->lineno; - debug_end_offset = ((expr_ty) format->result)->col_offset + 1; - debug_metadata = format->metadata; - } - else { - debug_end_line = end_lineno; - debug_end_offset = end_col_offset; - debug_metadata = closing_brace->metadata; - } - - expr_ty debug_text = _PyAST_Constant(debug_metadata, NULL, lineno, col_offset + 1, debug_end_line, - debug_end_offset - 1, p->arena); - if (!debug_text) { - return NULL; - } - - asdl_expr_seq *values = _Py_asdl_expr_seq_new(2, arena); - asdl_seq_SET(values, 0, debug_text); - asdl_seq_SET(values, 1, formatted_value); - return _PyAST_JoinedStr(values, lineno, col_offset, debug_end_line, debug_end_offset, p->arena); +unpack_top_level_joined_strs(Parser *p, asdl_expr_seq *raw_expressions) { + /* The parser might put multiple f-string values into an individual + * JoinedStr node at the top level due to stuff like f-string debugging + * expressions. This function flattens those and promotes them to the + * upper level. Only simplifies AST, but the compiler already takes care + * of the regular output, so this is not necessary if you are not going + * to expose the output AST to Python level. */ + + Py_ssize_t i, req_size, raw_size; + + req_size = raw_size = asdl_seq_LEN(raw_expressions); + expr_ty expr; + for (i = 0; i < raw_size; i++) { + expr = asdl_seq_GET(raw_expressions, i); + if (expr->kind == JoinedStr_kind) { + req_size += asdl_seq_LEN(expr->v.JoinedStr.values) - 1; + } + } + + asdl_expr_seq *expressions = _Py_asdl_expr_seq_new(req_size, p->arena); + if (expressions == NULL) { + return NULL; + } + + Py_ssize_t raw_index, req_index = 0; + for (raw_index = 0; raw_index < raw_size; raw_index++) { + expr = asdl_seq_GET(raw_expressions, raw_index); + if (expr->kind == JoinedStr_kind) { + asdl_expr_seq *values = expr->v.JoinedStr.values; + for (Py_ssize_t n = 0; n < asdl_seq_LEN(values); n++) { + asdl_seq_SET(expressions, req_index, asdl_seq_GET(values, n)); + req_index++; + } + } else { + asdl_seq_SET(expressions, req_index, expr); + req_index++; + } + } + return expressions; +} + +expr_ty _PyPegen_joined_str(Parser *p, Token *a, asdl_expr_seq *raw_expressions, + Token *b) { + + asdl_expr_seq *expr = unpack_top_level_joined_strs(p, raw_expressions); + Py_ssize_t n_items = asdl_seq_LEN(expr); + + const char *quote_str = PyBytes_AsString(a->bytes); + if (quote_str == NULL) { + return NULL; + } + int is_raw = strpbrk(quote_str, "rR") != NULL; + + asdl_expr_seq *seq = _Py_asdl_expr_seq_new(n_items, p->arena); + if (seq == NULL) { + return NULL; + } + + Py_ssize_t index = 0; + for (Py_ssize_t i = 0; i < n_items; i++) { + expr_ty item = asdl_seq_GET(expr, i); + if (item->kind == Constant_kind) { + item = _PyPegen_decode_fstring_part(p, is_raw, item, b); + if (item == NULL) { + return NULL; + } + + /* Tokenizer emits string parts even when the underlying string + might become an empty value (e.g. FSTRING_MIDDLE with the value \\n) + so we need to check for them and simplify it here. */ + if (PyUnicode_CheckExact(item->v.Constant.value) && + PyUnicode_GET_LENGTH(item->v.Constant.value) == 0) { + continue; + } + } + asdl_seq_SET(seq, index++, item); + } + + asdl_expr_seq *resized_exprs; + if (index != n_items) { + resized_exprs = _Py_asdl_expr_seq_new(index, p->arena); + if (resized_exprs == NULL) { + return NULL; + } + for (Py_ssize_t i = 0; i < index; i++) { + asdl_seq_SET(resized_exprs, i, asdl_seq_GET(seq, i)); + } + } else { + resized_exprs = seq; + } + + return _PyAST_JoinedStr(resized_exprs, a->lineno, a->col_offset, + b->end_lineno, b->end_col_offset, p->arena); +} + +expr_ty _PyPegen_decoded_constant_from_token(Parser *p, Token *tok) { + Py_ssize_t bsize; + char *bstr; + if (PyBytes_AsStringAndSize(tok->bytes, &bstr, &bsize) == -1) { + return NULL; + } + PyObject *str = _PyPegen_decode_string(p, 0, bstr, bsize, tok); + if (str == NULL) { + return NULL; + } + if (_PyArena_AddPyObject(p->arena, str) < 0) { + Py_DECREF(str); + return NULL; + } + return _PyAST_Constant(str, NULL, tok->lineno, tok->col_offset, + tok->end_lineno, tok->end_col_offset, p->arena); +} + +expr_ty _PyPegen_constant_from_token(Parser *p, Token *tok) { + char *bstr = PyBytes_AsString(tok->bytes); + if (bstr == NULL) { + return NULL; + } + PyObject *str = PyUnicode_FromString(bstr); + if (str == NULL) { + return NULL; + } + if (_PyArena_AddPyObject(p->arena, str) < 0) { + Py_DECREF(str); + return NULL; + } + return _PyAST_Constant(str, NULL, tok->lineno, tok->col_offset, + tok->end_lineno, tok->end_col_offset, p->arena); +} + +expr_ty _PyPegen_constant_from_string(Parser *p, Token *tok) { + char *the_str = PyBytes_AsString(tok->bytes); + if (the_str == NULL) { + return NULL; + } + PyObject *s = _PyPegen_parse_string(p, tok); + if (s == NULL) { + _Pypegen_raise_decode_error(p); + return NULL; + } + if (_PyArena_AddPyObject(p->arena, s) < 0) { + Py_DECREF(s); + return NULL; + } + PyObject *kind = NULL; + if (the_str && the_str[0] == 'u') { + kind = _PyPegen_new_identifier(p, "u"); + if (kind == NULL) { + return NULL; + } + } + return _PyAST_Constant(s, kind, tok->lineno, tok->col_offset, tok->end_lineno, + tok->end_col_offset, p->arena); +} + +expr_ty _PyPegen_formatted_value(Parser *p, expr_ty expression, Token *debug, + ResultTokenWithMetadata *conversion, + ResultTokenWithMetadata *format, + Token *closing_brace, int lineno, + int col_offset, int end_lineno, + int end_col_offset, PyArena *arena) { + int conversion_val = -1; + if (conversion != NULL) { + expr_ty conversion_expr = (expr_ty)conversion->result; + assert(conversion_expr->kind == Name_kind); + Py_UCS4 first = PyUnicode_READ_CHAR(conversion_expr->v.Name.id, 0); + + if (PyUnicode_GET_LENGTH(conversion_expr->v.Name.id) > 1 || + !(first == 's' || first == 'r' || first == 'a')) { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION( + conversion_expr, + "f-string: invalid conversion character %R: expected 's', 'r', or " + "'a'", + conversion_expr->v.Name.id); + return NULL; + } + + conversion_val = Py_SAFE_DOWNCAST(first, Py_UCS4, int); + } else if (debug && !format) { + /* If no conversion is specified, use !r for debug expressions */ + conversion_val = (int)'r'; + } + + expr_ty formatted_value = _PyAST_FormattedValue( + expression, conversion_val, format ? (expr_ty)format->result : NULL, + lineno, col_offset, end_lineno, end_col_offset, arena); + + if (debug) { + /* Find the non whitespace token after the "=" */ + int debug_end_line, debug_end_offset; + PyObject *debug_metadata; + + if (conversion) { + debug_end_line = ((expr_ty)conversion->result)->lineno; + debug_end_offset = ((expr_ty)conversion->result)->col_offset; + debug_metadata = conversion->metadata; + } else if (format) { + debug_end_line = ((expr_ty)format->result)->lineno; + debug_end_offset = ((expr_ty)format->result)->col_offset + 1; + debug_metadata = format->metadata; + } else { + debug_end_line = end_lineno; + debug_end_offset = end_col_offset; + debug_metadata = closing_brace->metadata; } - else { - return formatted_value; + expr_ty debug_text = + _PyAST_Constant(debug_metadata, NULL, lineno, col_offset + 1, + debug_end_line, debug_end_offset - 1, p->arena); + if (!debug_text) { + return NULL; } -} -expr_ty -_PyPegen_concatenate_strings(Parser *p, asdl_expr_seq *strings, - int lineno, int col_offset, int end_lineno, - int end_col_offset, PyArena *arena) -{ - Py_ssize_t len = asdl_seq_LEN(strings); - assert(len > 0); - - int f_string_found = 0; - int unicode_string_found = 0; - int bytes_found = 0; - - Py_ssize_t i = 0; - Py_ssize_t n_flattened_elements = 0; + asdl_expr_seq *values = _Py_asdl_expr_seq_new(2, arena); + if (values == NULL) { + return NULL; + } + asdl_seq_SET(values, 0, debug_text); + asdl_seq_SET(values, 1, formatted_value); + return _PyAST_JoinedStr(values, lineno, col_offset, debug_end_line, + debug_end_offset, p->arena); + } else { + return formatted_value; + } +} + +expr_ty _PyPegen_concatenate_strings(Parser *p, asdl_expr_seq *strings, + int lineno, int col_offset, int end_lineno, + int end_col_offset, PyArena *arena) { + Py_ssize_t len = asdl_seq_LEN(strings); + assert(len > 0); + + int f_string_found = 0; + int unicode_string_found = 0; + int bytes_found = 0; + + Py_ssize_t i = 0; + Py_ssize_t n_flattened_elements = 0; + for (i = 0; i < len; i++) { + expr_ty elem = asdl_seq_GET(strings, i); + switch (elem->kind) { + case Constant_kind: + if (PyBytes_CheckExact(elem->v.Constant.value)) { + bytes_found = 1; + } else { + unicode_string_found = 1; + } + n_flattened_elements++; + break; + case JoinedStr_kind: + n_flattened_elements += asdl_seq_LEN(elem->v.JoinedStr.values); + f_string_found = 1; + break; + default: + n_flattened_elements++; + f_string_found = 1; + break; + } + } + + if ((unicode_string_found || f_string_found) && bytes_found) { + RAISE_SYNTAX_ERROR("cannot mix bytes and nonbytes literals"); + return NULL; + } + + if (bytes_found) { + PyObject *res = PyBytes_FromString(""); + + /* Bytes literals never get a kind, but just for consistency + since they are represented as Constant nodes, we'll mirror + the same behavior as unicode strings for determining the + kind. */ + PyObject *kind = asdl_seq_GET(strings, 0)->v.Constant.kind; for (i = 0; i < len; i++) { - expr_ty elem = asdl_seq_GET(strings, i); - if (elem->kind == Constant_kind) { - if (PyBytes_CheckExact(elem->v.Constant.value)) { - bytes_found = 1; - } else { - unicode_string_found = 1; + expr_ty elem = asdl_seq_GET(strings, i); + PyBytes_Concat(&res, elem->v.Constant.value); + } + if (!res || _PyArena_AddPyObject(arena, res) < 0) { + Py_XDECREF(res); + return NULL; + } + return _PyAST_Constant(res, kind, lineno, col_offset, end_lineno, + end_col_offset, p->arena); + } + + if (!f_string_found && len == 1) { + return asdl_seq_GET(strings, 0); + } + + asdl_expr_seq *flattened = + _Py_asdl_expr_seq_new(n_flattened_elements, p->arena); + if (flattened == NULL) { + return NULL; + } + + /* build flattened list */ + Py_ssize_t current_pos = 0; + Py_ssize_t j = 0; + for (i = 0; i < len; i++) { + expr_ty elem = asdl_seq_GET(strings, i); + switch (elem->kind) { + case JoinedStr_kind: + for (j = 0; j < asdl_seq_LEN(elem->v.JoinedStr.values); j++) { + expr_ty subvalue = asdl_seq_GET(elem->v.JoinedStr.values, j); + if (subvalue == NULL) { + return NULL; + } + asdl_seq_SET(flattened, current_pos++, subvalue); + } + break; + default: + asdl_seq_SET(flattened, current_pos++, elem); + break; + } + } + + /* calculate folded element count */ + Py_ssize_t n_elements = 0; + int prev_is_constant = 0; + for (i = 0; i < n_flattened_elements; i++) { + expr_ty elem = asdl_seq_GET(flattened, i); + + /* The concatenation of a FormattedValue and an empty Contant should + lead to the FormattedValue itself. Thus, we will not take any empty + constants into account, just as in `_PyPegen_joined_str` */ + if (f_string_found && elem->kind == Constant_kind && + PyUnicode_CheckExact(elem->v.Constant.value) && + PyUnicode_GET_LENGTH(elem->v.Constant.value) == 0) + continue; + + if (!prev_is_constant || elem->kind != Constant_kind) { + n_elements++; + } + prev_is_constant = elem->kind == Constant_kind; + } + + asdl_expr_seq *values = _Py_asdl_expr_seq_new(n_elements, p->arena); + if (values == NULL) { + return NULL; + } + + /* build folded list */ + _PyUnicodeWriter writer; + current_pos = 0; + for (i = 0; i < n_flattened_elements; i++) { + expr_ty elem = asdl_seq_GET(flattened, i); + + /* if the current elem and the following are constants, + fold them and all consequent constants */ + if (elem->kind == Constant_kind) { + if (i + 1 < n_flattened_elements && + asdl_seq_GET(flattened, i + 1)->kind == Constant_kind) { + expr_ty first_elem = elem; + + /* When a string is getting concatenated, the kind of the string + is determined by the first string in the concatenation + sequence. + + u"abc" "def" -> u"abcdef" + "abc" u"abc" -> "abcabc" */ + PyObject *kind = elem->v.Constant.kind; + + _PyUnicodeWriter_Init(&writer); + expr_ty last_elem = elem; + for (j = i; j < n_flattened_elements; j++) { + expr_ty current_elem = asdl_seq_GET(flattened, j); + if (current_elem->kind == Constant_kind) { + if (_PyUnicodeWriter_WriteStr(&writer, + current_elem->v.Constant.value)) { + _PyUnicodeWriter_Dealloc(&writer); + return NULL; } - n_flattened_elements++; - } else { - n_flattened_elements += asdl_seq_LEN(elem->v.JoinedStr.values); - f_string_found = 1; + last_elem = current_elem; + } else { + break; + } } - } + i = j - 1; - if ((unicode_string_found || f_string_found) && bytes_found) { - RAISE_SYNTAX_ERROR("cannot mix bytes and nonbytes literals"); - return NULL; - } - - if (bytes_found) { - PyObject* res = PyBytes_FromString(""); - - /* Bytes literals never get a kind, but just for consistency - since they are represented as Constant nodes, we'll mirror - the same behavior as unicode strings for determining the - kind. */ - PyObject* kind = asdl_seq_GET(strings, 0)->v.Constant.kind; - for (i = 0; i < len; i++) { - expr_ty elem = asdl_seq_GET(strings, i); - PyBytes_Concat(&res, elem->v.Constant.value); + PyObject *concat_str = _PyUnicodeWriter_Finish(&writer); + if (concat_str == NULL) { + _PyUnicodeWriter_Dealloc(&writer); + return NULL; } - if (!res || _PyArena_AddPyObject(arena, res) < 0) { - Py_XDECREF(res); - return NULL; + if (_PyArena_AddPyObject(p->arena, concat_str) < 0) { + Py_DECREF(concat_str); + return NULL; } - return _PyAST_Constant(res, kind, lineno, col_offset, end_lineno, end_col_offset, p->arena); - } - - if (!f_string_found && len == 1) { - return asdl_seq_GET(strings, 0); - } - - asdl_expr_seq* flattened = _Py_asdl_expr_seq_new(n_flattened_elements, p->arena); - if (flattened == NULL) { - return NULL; - } - - /* build flattened list */ - Py_ssize_t current_pos = 0; - Py_ssize_t j = 0; - for (i = 0; i < len; i++) { - expr_ty elem = asdl_seq_GET(strings, i); - if (elem->kind == Constant_kind) { - asdl_seq_SET(flattened, current_pos++, elem); - } else { - for (j = 0; j < asdl_seq_LEN(elem->v.JoinedStr.values); j++) { - expr_ty subvalue = asdl_seq_GET(elem->v.JoinedStr.values, j); - if (subvalue == NULL) { - return NULL; - } - asdl_seq_SET(flattened, current_pos++, subvalue); - } + elem = _PyAST_Constant(concat_str, kind, first_elem->lineno, + first_elem->col_offset, last_elem->end_lineno, + last_elem->end_col_offset, p->arena); + if (elem == NULL) { + return NULL; } - } + } - /* calculate folded element count */ - Py_ssize_t n_elements = 0; - int prev_is_constant = 0; - for (i = 0; i < n_flattened_elements; i++) { - expr_ty elem = asdl_seq_GET(flattened, i); - - /* The concatenation of a FormattedValue and an empty Contant should - lead to the FormattedValue itself. Thus, we will not take any empty - constants into account, just as in `_PyPegen_joined_str` */ - if (f_string_found && elem->kind == Constant_kind && - PyUnicode_CheckExact(elem->v.Constant.value) && - PyUnicode_GET_LENGTH(elem->v.Constant.value) == 0) - continue; - - if (!prev_is_constant || elem->kind != Constant_kind) { - n_elements++; - } - prev_is_constant = elem->kind == Constant_kind; - } - - asdl_expr_seq* values = _Py_asdl_expr_seq_new(n_elements, p->arena); - if (values == NULL) { - return NULL; + /* Drop all empty contanst strings */ + if (f_string_found && PyUnicode_CheckExact(elem->v.Constant.value) && + PyUnicode_GET_LENGTH(elem->v.Constant.value) == 0) { + continue; + } } - /* build folded list */ - _PyUnicodeWriter writer; - current_pos = 0; - for (i = 0; i < n_flattened_elements; i++) { - expr_ty elem = asdl_seq_GET(flattened, i); - - /* if the current elem and the following are constants, - fold them and all consequent constants */ - if (elem->kind == Constant_kind) { - if (i + 1 < n_flattened_elements && - asdl_seq_GET(flattened, i + 1)->kind == Constant_kind) { - expr_ty first_elem = elem; - - /* When a string is getting concatenated, the kind of the string - is determined by the first string in the concatenation - sequence. - - u"abc" "def" -> u"abcdef" - "abc" u"abc" -> "abcabc" */ - PyObject *kind = elem->v.Constant.kind; - - _PyUnicodeWriter_Init(&writer); - expr_ty last_elem = elem; - for (j = i; j < n_flattened_elements; j++) { - expr_ty current_elem = asdl_seq_GET(flattened, j); - if (current_elem->kind == Constant_kind) { - if (_PyUnicodeWriter_WriteStr( - &writer, current_elem->v.Constant.value)) { - _PyUnicodeWriter_Dealloc(&writer); - return NULL; - } - last_elem = current_elem; - } else { - break; - } - } - i = j - 1; - - PyObject *concat_str = _PyUnicodeWriter_Finish(&writer); - if (concat_str == NULL) { - _PyUnicodeWriter_Dealloc(&writer); - return NULL; - } - if (_PyArena_AddPyObject(p->arena, concat_str) < 0) { - Py_DECREF(concat_str); - return NULL; - } - elem = _PyAST_Constant(concat_str, kind, first_elem->lineno, - first_elem->col_offset, - last_elem->end_lineno, - last_elem->end_col_offset, p->arena); - if (elem == NULL) { - return NULL; - } - } - - /* Drop all empty contanst strings */ - if (f_string_found && - PyUnicode_CheckExact(elem->v.Constant.value) && - PyUnicode_GET_LENGTH(elem->v.Constant.value) == 0) { - continue; - } - } - - asdl_seq_SET(values, current_pos++, elem); - } + asdl_seq_SET(values, current_pos++, elem); + } - if (!f_string_found) { - assert(n_elements == 1); - expr_ty elem = asdl_seq_GET(values, 0); - assert(elem->kind == Constant_kind); - return elem; - } + if (!f_string_found) { + assert(n_elements == 1); + expr_ty elem = asdl_seq_GET(values, 0); + assert(elem->kind == Constant_kind); + return elem; + } - assert(current_pos == n_elements); - return _PyAST_JoinedStr(values, lineno, col_offset, end_lineno, end_col_offset, p->arena); + assert(current_pos == n_elements); + return _PyAST_JoinedStr(values, lineno, col_offset, end_lineno, + end_col_offset, p->arena); } diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index 2c34f5c1..6f5a772d 100755 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -813,14 +813,15 @@ def visitModule(self, mod): Py_ssize_t i, numfields = 0; int res = -1; PyObject *key, *value, *fields; - if (_PyObject_LookupAttr((PyObject*)Py_TYPE(self), state->_fields, &fields) < 0) { + + fields = PyObject_GetAttr((PyObject*)Py_TYPE(self), state->_fields); + if (fields == NULL) { goto cleanup; } - if (fields) { - numfields = PySequence_Size(fields); - if (numfields == -1) { - goto cleanup; - } + + numfields = PySequence_Size(fields); + if (numfields == -1) { + goto cleanup; } res = 0; /* if no error occurs, this stays 0 to the end */ diff --git a/Parser/myreadline.c b/Parser/myreadline.c index 7074aba7..2890ff83 100644 --- a/Parser/myreadline.c +++ b/Parser/myreadline.c @@ -386,9 +386,14 @@ PyOS_Readline(FILE *sys_stdin, FILE *sys_stdout, const char *prompt) } } - _PyOS_ReadlineTState = tstate; Py_BEGIN_ALLOW_THREADS + + // GH-123321: We need to acquire the lock before setting + // _PyOS_ReadlineTState and after the release of the GIL, otherwise + // the variable may be nullified by a different thread or a deadlock + // may occur if the GIL is taken in any sub-function. PyThread_acquire_lock(_PyOS_ReadlineLock, 1); + _PyOS_ReadlineTState = tstate; /* This is needed to handle the unlikely case that the * interpreter is in interactive mode *and* stdin/out are not @@ -412,11 +417,13 @@ PyOS_Readline(FILE *sys_stdin, FILE *sys_stdout, const char *prompt) else { rv = (*PyOS_ReadlineFunctionPointer)(sys_stdin, sys_stdout, prompt); } - Py_END_ALLOW_THREADS + // gh-123321: Must set the variable and then release the lock before + // taking the GIL. Otherwise a deadlock or segfault may occur. + _PyOS_ReadlineTState = NULL; PyThread_release_lock(_PyOS_ReadlineLock); - _PyOS_ReadlineTState = NULL; + Py_END_ALLOW_THREADS if (rv == NULL) return NULL; diff --git a/Parser/pegen.c b/Parser/pegen.c index 5460fbb2..6ae9bef2 100644 --- a/Parser/pegen.c +++ b/Parser/pegen.c @@ -394,7 +394,7 @@ _PyPegen_is_memoized(Parser *p, int type, void *pres) for (Memo *m = t->memo; m != NULL; m = m->next) { if (m->type == type) { -#if defined(PY_DEBUG) +#if defined(Py_DEBUG) if (0 <= type && type < NSTATISTICS) { long count = m->mark - p->mark; // A memoized negative result counts for one. @@ -581,7 +581,8 @@ _PyPegen_new_identifier(Parser *p, const char *n) } id = id2; } - PyUnicode_InternInPlace(&id); + PyInterpreterState *interp = _PyInterpreterState_GET(); + _PyUnicode_InternImmortal(interp, &id); if (_PyArena_AddPyObject(p->arena, id) < 0) { Py_DECREF(id); diff --git a/Parser/string_parser.c b/Parser/string_parser.c index 65c320c2..164f715e 100644 --- a/Parser/string_parser.c +++ b/Parser/string_parser.c @@ -226,9 +226,14 @@ _PyPegen_parse_string(Parser *p, Token *t) PyErr_BadInternalCall(); return NULL; } + /* Skip the leading quote char. */ s++; len = strlen(s); + // gh-120155: 's' contains at least the trailing quote, + // so the code '--len' below is safe. + assert(len >= 1); + if (len > INT_MAX) { PyErr_SetString(PyExc_OverflowError, "string to parse is too long"); return NULL; diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index 04ba0442..9e0dee8c 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -3,53 +3,48 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "pycore_call.h" // _PyObject_CallNoArgs() +#include "pycore_call.h" // _PyObject_CallNoArgs() -#include #include +#include -#include "tokenizer.h" #include "errcode.h" +#include "tokenizer.h" /* Alternate tab spacing */ #define ALTTABSIZE 1 -#define is_potential_identifier_start(c) (\ - (c >= 'a' && c <= 'z')\ - || (c >= 'A' && c <= 'Z')\ - || c == '_'\ - || (c >= 128)) - -#define is_potential_identifier_char(c) (\ - (c >= 'a' && c <= 'z')\ - || (c >= 'A' && c <= 'Z')\ - || (c >= '0' && c <= '9')\ - || c == '_'\ - || (c >= 128)) +#define is_potential_identifier_start(c) \ + ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_' || (c >= 128)) +#define is_potential_identifier_char(c) \ + ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || \ + (c >= '0' && c <= '9') || c == '_' || (c >= 128)) /* Don't ever change this -- it would break the portability of Python code */ #define TABSIZE 8 -#define MAKE_TOKEN(token_type) token_setup(tok, token, token_type, p_start, p_end) -#define MAKE_TYPE_COMMENT_TOKEN(token_type, col_offset, end_col_offset) (\ - type_comment_token_setup(tok, token, token_type, col_offset, end_col_offset, p_start, p_end)) -#define ADVANCE_LINENO() \ - tok->lineno++; \ - tok->col_offset = 0; +#define MAKE_TOKEN(token_type) \ + token_setup(tok, token, token_type, p_start, p_end) +#define MAKE_TYPE_COMMENT_TOKEN(token_type, col_offset, end_col_offset) \ + (type_comment_token_setup(tok, token, token_type, col_offset, \ + end_col_offset, p_start, p_end)) +#define ADVANCE_LINENO() \ + tok->lineno++; \ + tok->col_offset = 0; #define INSIDE_FSTRING(tok) (tok->tok_mode_stack_index > 0) #define INSIDE_FSTRING_EXPR(tok) (tok->curly_bracket_expr_start_depth >= 0) #ifdef Py_DEBUG -static inline tokenizer_mode* TOK_GET_MODE(struct tok_state* tok) { - assert(tok->tok_mode_stack_index >= 0); - assert(tok->tok_mode_stack_index < MAXFSTRINGLEVEL); - return &(tok->tok_mode_stack[tok->tok_mode_stack_index]); +static inline tokenizer_mode *TOK_GET_MODE(struct tok_state *tok) { + assert(tok->tok_mode_stack_index >= 0); + assert(tok->tok_mode_stack_index < MAXFSTRINGLEVEL); + return &(tok->tok_mode_stack[tok->tok_mode_stack_index]); } -static inline tokenizer_mode* TOK_NEXT_MODE(struct tok_state* tok) { - assert(tok->tok_mode_stack_index >= 0); - assert(tok->tok_mode_stack_index + 1 < MAXFSTRINGLEVEL); - return &(tok->tok_mode_stack[++tok->tok_mode_stack_index]); +static inline tokenizer_mode *TOK_NEXT_MODE(struct tok_state *tok) { + assert(tok->tok_mode_stack_index >= 0); + assert(tok->tok_mode_stack_index + 1 < MAXFSTRINGLEVEL); + return &(tok->tok_mode_stack[++tok->tok_mode_stack_index]); } #else #define TOK_GET_MODE(tok) (&(tok->tok_mode_stack[tok->tok_mode_stack_index])) @@ -64,171 +59,164 @@ static int syntaxerror(struct tok_state *tok, const char *format, ...); /* Spaces in this constant are treated as "zero or more spaces or tabs" when tokenizing. */ -static const char* type_comment_prefix = "# type: "; +static const char *type_comment_prefix = "# type: "; /* Create and initialize a new tok_state structure */ -static struct tok_state * -tok_new(void) -{ - struct tok_state *tok = (struct tok_state *)PyMem_Malloc( - sizeof(struct tok_state)); - if (tok == NULL) - return NULL; - tok->buf = tok->cur = tok->inp = NULL; - tok->fp_interactive = 0; - tok->interactive_src_start = NULL; - tok->interactive_src_end = NULL; - tok->start = NULL; - tok->end = NULL; - tok->done = E_OK; - tok->fp = NULL; - tok->input = NULL; - tok->tabsize = TABSIZE; - tok->indent = 0; - tok->indstack[0] = 0; - tok->atbol = 1; - tok->pendin = 0; - tok->prompt = tok->nextprompt = NULL; - tok->lineno = 0; - tok->starting_col_offset = -1; - tok->col_offset = -1; - tok->level = 0; - tok->altindstack[0] = 0; - tok->decoding_state = STATE_INIT; - tok->decoding_erred = 0; - tok->enc = NULL; - tok->encoding = NULL; - tok->cont_line = 0; - tok->filename = NULL; - tok->decoding_readline = NULL; - tok->decoding_buffer = NULL; - tok->readline = NULL; - tok->type_comments = 0; - tok->async_hacks = 0; - tok->async_def = 0; - tok->async_def_indent = 0; - tok->async_def_nl = 0; - tok->interactive_underflow = IUNDERFLOW_NORMAL; - tok->str = NULL; - tok->report_warnings = 1; - tok->tok_extra_tokens = 0; - tok->comment_newline = 0; - tok->implicit_newline = 0; - tok->tok_mode_stack[0] = (tokenizer_mode){.kind =TOK_REGULAR_MODE, .f_string_quote='\0', .f_string_quote_size = 0, .f_string_debug=0}; - tok->tok_mode_stack_index = 0; +static struct tok_state *tok_new(void) { + struct tok_state *tok = + (struct tok_state *)PyMem_Calloc(1, sizeof(struct tok_state)); + if (tok == NULL) + return NULL; + tok->buf = tok->cur = tok->inp = NULL; + tok->fp_interactive = 0; + tok->interactive_src_start = NULL; + tok->interactive_src_end = NULL; + tok->start = NULL; + tok->end = NULL; + tok->done = E_OK; + tok->fp = NULL; + tok->input = NULL; + tok->tabsize = TABSIZE; + tok->indent = 0; + tok->indstack[0] = 0; + tok->atbol = 1; + tok->pendin = 0; + tok->prompt = tok->nextprompt = NULL; + tok->lineno = 0; + tok->starting_col_offset = -1; + tok->col_offset = -1; + tok->level = 0; + tok->altindstack[0] = 0; + tok->decoding_state = STATE_INIT; + tok->decoding_erred = 0; + tok->enc = NULL; + tok->encoding = NULL; + tok->cont_line = 0; + tok->filename = NULL; + tok->decoding_readline = NULL; + tok->decoding_buffer = NULL; + tok->readline = NULL; + tok->type_comments = 0; + tok->async_hacks = 0; + tok->async_def = 0; + tok->async_def_indent = 0; + tok->async_def_nl = 0; + tok->interactive_underflow = IUNDERFLOW_NORMAL; + tok->str = NULL; + tok->report_warnings = 1; + tok->tok_extra_tokens = 0; + tok->comment_newline = 0; + tok->implicit_newline = 0; + tok->tok_mode_stack[0] = (tokenizer_mode){.kind = TOK_REGULAR_MODE, + .f_string_quote = '\0', + .f_string_quote_size = 0, + .f_string_debug = 0}; + tok->tok_mode_stack_index = 0; #ifdef Py_DEBUG - tok->debug = _Py_GetConfig()->parser_debug; + tok->debug = _Py_GetConfig()->parser_debug; #endif - return tok; + return tok; } -static char * -new_string(const char *s, Py_ssize_t len, struct tok_state *tok) -{ - char* result = (char *)PyMem_Malloc(len + 1); - if (!result) { - tok->done = E_NOMEM; - return NULL; - } - memcpy(result, s, len); - result[len] = '\0'; - return result; +static char *new_string(const char *s, Py_ssize_t len, struct tok_state *tok) { + char *result = (char *)PyMem_Malloc(len + 1); + if (!result) { + tok->done = E_NOMEM; + return NULL; + } + memcpy(result, s, len); + result[len] = '\0'; + return result; } -static char * -error_ret(struct tok_state *tok) /* XXX */ +static char *error_ret(struct tok_state *tok) /* XXX */ { - tok->decoding_erred = 1; - if ((tok->fp != NULL || tok->readline != NULL) && tok->buf != NULL) {/* see _PyTokenizer_Free */ - PyMem_Free(tok->buf); - } - tok->buf = tok->cur = tok->inp = NULL; - tok->start = NULL; - tok->end = NULL; - tok->done = E_DECODE; - return NULL; /* as if it were EOF */ -} - - -static const char * -get_normal_name(const char *s) /* for utf-8 and latin-1 */ + tok->decoding_erred = 1; + if ((tok->fp != NULL || tok->readline != NULL) && + tok->buf != NULL) { /* see _PyTokenizer_Free */ + PyMem_Free(tok->buf); + } + tok->buf = tok->cur = tok->inp = NULL; + tok->start = NULL; + tok->end = NULL; + tok->done = E_DECODE; + return NULL; /* as if it were EOF */ +} + +static const char *get_normal_name(const char *s) /* for utf-8 and latin-1 */ { - char buf[13]; - int i; - for (i = 0; i < 12; i++) { - int c = s[i]; - if (c == '\0') - break; - else if (c == '_') - buf[i] = '-'; - else - buf[i] = tolower(c); - } - buf[i] = '\0'; - if (strcmp(buf, "utf-8") == 0 || - strncmp(buf, "utf-8-", 6) == 0) - return "utf-8"; - else if (strcmp(buf, "latin-1") == 0 || - strcmp(buf, "iso-8859-1") == 0 || - strcmp(buf, "iso-latin-1") == 0 || - strncmp(buf, "latin-1-", 8) == 0 || - strncmp(buf, "iso-8859-1-", 11) == 0 || - strncmp(buf, "iso-latin-1-", 12) == 0) - return "iso-8859-1"; + char buf[13]; + int i; + for (i = 0; i < 12; i++) { + int c = s[i]; + if (c == '\0') + break; + else if (c == '_') + buf[i] = '-'; else - return s; + buf[i] = tolower(c); + } + buf[i] = '\0'; + if (strcmp(buf, "utf-8") == 0 || strncmp(buf, "utf-8-", 6) == 0) + return "utf-8"; + else if (strcmp(buf, "latin-1") == 0 || strcmp(buf, "iso-8859-1") == 0 || + strcmp(buf, "iso-latin-1") == 0 || + strncmp(buf, "latin-1-", 8) == 0 || + strncmp(buf, "iso-8859-1-", 11) == 0 || + strncmp(buf, "iso-latin-1-", 12) == 0) + return "iso-8859-1"; + else + return s; } /* Return the coding spec in S, or NULL if none is found. */ -static int -get_coding_spec(const char *s, char **spec, Py_ssize_t size, struct tok_state *tok) -{ - Py_ssize_t i; - *spec = NULL; - /* Coding spec must be in a comment, and that comment must be - * the only statement on the source code line. */ - for (i = 0; i < size - 6; i++) { - if (s[i] == '#') - break; - if (s[i] != ' ' && s[i] != '\t' && s[i] != '\014') - return 1; - } - for (; i < size - 6; i++) { /* XXX inefficient search */ - const char* t = s + i; - if (memcmp(t, "coding", 6) == 0) { - const char* begin = NULL; - t += 6; - if (t[0] != ':' && t[0] != '=') - continue; - do { - t++; - } while (t[0] == ' ' || t[0] == '\t'); - - begin = t; - while (Py_ISALNUM(t[0]) || - t[0] == '-' || t[0] == '_' || t[0] == '.') - t++; - - if (begin < t) { - char* r = new_string(begin, t - begin, tok); - const char* q; - if (!r) - return 0; - q = get_normal_name(r); - if (r != q) { - PyMem_Free(r); - r = new_string(q, strlen(q), tok); - if (!r) - return 0; - } - *spec = r; - break; - } +static int get_coding_spec(const char *s, char **spec, Py_ssize_t size, + struct tok_state *tok) { + Py_ssize_t i; + *spec = NULL; + /* Coding spec must be in a comment, and that comment must be + * the only statement on the source code line. */ + for (i = 0; i < size - 6; i++) { + if (s[i] == '#') + break; + if (s[i] != ' ' && s[i] != '\t' && s[i] != '\014') + return 1; + } + for (; i < size - 6; i++) { /* XXX inefficient search */ + const char *t = s + i; + if (memcmp(t, "coding", 6) == 0) { + const char *begin = NULL; + t += 6; + if (t[0] != ':' && t[0] != '=') + continue; + do { + t++; + } while (t[0] == ' ' || t[0] == '\t'); + + begin = t; + while (Py_ISALNUM(t[0]) || t[0] == '-' || t[0] == '_' || t[0] == '.') + t++; + + if (begin < t) { + char *r = new_string(begin, t - begin, tok); + const char *q; + if (!r) + return 0; + q = get_normal_name(r); + if (r != q) { + PyMem_Free(r); + r = new_string(q, strlen(q), tok); + if (!r) + return 0; } + *spec = r; + break; + } } - return 1; + } + return 1; } /* Check whether the line contains a coding spec. If it does, @@ -237,299 +225,288 @@ get_coding_spec(const char *s, char **spec, Py_ssize_t size, struct tok_state *t Return 1 on success, 0 on failure. */ static int -check_coding_spec(const char* line, Py_ssize_t size, struct tok_state *tok, - int set_readline(struct tok_state *, const char *)) -{ - char *cs; - if (tok->cont_line) { - /* It's a continuation line, so it can't be a coding spec. */ - tok->decoding_state = STATE_NORMAL; - return 1; - } - if (!get_coding_spec(line, &cs, size, tok)) { - return 0; - } - if (!cs) { - Py_ssize_t i; - for (i = 0; i < size; i++) { - if (line[i] == '#' || line[i] == '\n' || line[i] == '\r') - break; - if (line[i] != ' ' && line[i] != '\t' && line[i] != '\014') { - /* Stop checking coding spec after a line containing - * anything except a comment. */ - tok->decoding_state = STATE_NORMAL; - break; - } - } - return 1; - } +check_coding_spec(const char *line, Py_ssize_t size, struct tok_state *tok, + int set_readline(struct tok_state *, const char *)) { + char *cs; + if (tok->cont_line) { + /* It's a continuation line, so it can't be a coding spec. */ tok->decoding_state = STATE_NORMAL; - if (tok->encoding == NULL) { - assert(tok->decoding_readline == NULL); - if (strcmp(cs, "utf-8") != 0 && !set_readline(tok, cs)) { - error_ret(tok); - PyErr_Format(PyExc_SyntaxError, "encoding problem: %s", cs); - PyMem_Free(cs); - return 0; - } - tok->encoding = cs; - } else { /* then, compare cs with BOM */ - if (strcmp(tok->encoding, cs) != 0) { - error_ret(tok); - PyErr_Format(PyExc_SyntaxError, - "encoding problem: %s with BOM", cs); - PyMem_Free(cs); - return 0; - } - PyMem_Free(cs); + return 1; + } + if (!get_coding_spec(line, &cs, size, tok)) { + return 0; + } + if (!cs) { + Py_ssize_t i; + for (i = 0; i < size; i++) { + if (line[i] == '#' || line[i] == '\n' || line[i] == '\r') + break; + if (line[i] != ' ' && line[i] != '\t' && line[i] != '\014') { + /* Stop checking coding spec after a line containing + * anything except a comment. */ + tok->decoding_state = STATE_NORMAL; + break; + } } return 1; + } + tok->decoding_state = STATE_NORMAL; + if (tok->encoding == NULL) { + assert(tok->decoding_readline == NULL); + if (strcmp(cs, "utf-8") != 0 && !set_readline(tok, cs)) { + error_ret(tok); + PyErr_Format(PyExc_SyntaxError, "encoding problem: %s", cs); + PyMem_Free(cs); + return 0; + } + tok->encoding = cs; + } else { /* then, compare cs with BOM */ + if (strcmp(tok->encoding, cs) != 0) { + error_ret(tok); + PyErr_Format(PyExc_SyntaxError, "encoding problem: %s with BOM", cs); + PyMem_Free(cs); + return 0; + } + PyMem_Free(cs); + } + return 1; } /* See whether the file starts with a BOM. If it does, invoke the set_readline function with the new encoding. Return 1 on success, 0 on failure. */ -static int -check_bom(int get_char(struct tok_state *), - void unget_char(int, struct tok_state *), - int set_readline(struct tok_state *, const char *), - struct tok_state *tok) -{ - int ch1, ch2, ch3; - ch1 = get_char(tok); - tok->decoding_state = STATE_SEEK_CODING; - if (ch1 == EOF) { - return 1; - } else if (ch1 == 0xEF) { - ch2 = get_char(tok); - if (ch2 != 0xBB) { - unget_char(ch2, tok); - unget_char(ch1, tok); - return 1; - } - ch3 = get_char(tok); - if (ch3 != 0xBF) { - unget_char(ch3, tok); - unget_char(ch2, tok); - unget_char(ch1, tok); - return 1; - } - } else { - unget_char(ch1, tok); - return 1; - } - if (tok->encoding != NULL) - PyMem_Free(tok->encoding); - tok->encoding = new_string("utf-8", 5, tok); - if (!tok->encoding) - return 0; - /* No need to set_readline: input is already utf-8 */ +static int check_bom(int get_char(struct tok_state *), + void unget_char(int, struct tok_state *), + int set_readline(struct tok_state *, const char *), + struct tok_state *tok) { + int ch1, ch2, ch3; + ch1 = get_char(tok); + tok->decoding_state = STATE_SEEK_CODING; + if (ch1 == EOF) { + return 1; + } else if (ch1 == 0xEF) { + ch2 = get_char(tok); + if (ch2 != 0xBB) { + unget_char(ch2, tok); + unget_char(ch1, tok); + return 1; + } + ch3 = get_char(tok); + if (ch3 != 0xBF) { + unget_char(ch3, tok); + unget_char(ch2, tok); + unget_char(ch1, tok); + return 1; + } + } else { + unget_char(ch1, tok); return 1; + } + if (tok->encoding != NULL) + PyMem_Free(tok->encoding); + tok->encoding = new_string("utf-8", 5, tok); + if (!tok->encoding) + return 0; + /* No need to set_readline: input is already utf-8 */ + return 1; } -static int -tok_concatenate_interactive_new_line(struct tok_state *tok, const char *line) { - assert(tok->fp_interactive); - - if (!line) { - return 0; - } - - Py_ssize_t current_size = tok->interactive_src_end - tok->interactive_src_start; - Py_ssize_t line_size = strlen(line); - char last_char = line[line_size > 0 ? line_size - 1 : line_size]; - if (last_char != '\n') { - line_size += 1; - } - char* new_str = tok->interactive_src_start; +static int tok_concatenate_interactive_new_line(struct tok_state *tok, + const char *line) { + assert(tok->fp_interactive); - new_str = PyMem_Realloc(new_str, current_size + line_size + 1); - if (!new_str) { - if (tok->interactive_src_start) { - PyMem_Free(tok->interactive_src_start); - } - tok->interactive_src_start = NULL; - tok->interactive_src_end = NULL; - tok->done = E_NOMEM; - return -1; - } - strcpy(new_str + current_size, line); - tok->implicit_newline = 0; - if (last_char != '\n') { - /* Last line does not end in \n, fake one */ - new_str[current_size + line_size - 1] = '\n'; - new_str[current_size + line_size] = '\0'; - tok->implicit_newline = 1; - } - tok->interactive_src_start = new_str; - tok->interactive_src_end = new_str + current_size + line_size; + if (!line) { return 0; + } + + Py_ssize_t current_size = + tok->interactive_src_end - tok->interactive_src_start; + Py_ssize_t line_size = strlen(line); + char last_char = line[line_size > 0 ? line_size - 1 : line_size]; + if (last_char != '\n') { + line_size += 1; + } + char *new_str = tok->interactive_src_start; + + new_str = PyMem_Realloc(new_str, current_size + line_size + 1); + if (!new_str) { + if (tok->interactive_src_start) { + PyMem_Free(tok->interactive_src_start); + } + tok->interactive_src_start = NULL; + tok->interactive_src_end = NULL; + tok->done = E_NOMEM; + return -1; + } + strcpy(new_str + current_size, line); + tok->implicit_newline = 0; + if (last_char != '\n') { + /* Last line does not end in \n, fake one */ + new_str[current_size + line_size - 1] = '\n'; + new_str[current_size + line_size] = '\0'; + tok->implicit_newline = 1; + } + tok->interactive_src_start = new_str; + tok->interactive_src_end = new_str + current_size + line_size; + return 0; } /* Traverse and remember all f-string buffers, in order to be able to restore them after reallocating tok->buf */ -static void -remember_fstring_buffers(struct tok_state *tok) -{ - int index; - tokenizer_mode *mode; +static void remember_fstring_buffers(struct tok_state *tok) { + int index; + tokenizer_mode *mode; - for (index = tok->tok_mode_stack_index; index >= 0; --index) { - mode = &(tok->tok_mode_stack[index]); - mode->f_string_start_offset = mode->f_string_start - tok->buf; - mode->f_string_multi_line_start_offset = mode->f_string_multi_line_start - tok->buf; - } + for (index = tok->tok_mode_stack_index; index >= 0; --index) { + mode = &(tok->tok_mode_stack[index]); + mode->f_string_start_offset = mode->f_string_start - tok->buf; + mode->f_string_multi_line_start_offset = + mode->f_string_multi_line_start - tok->buf; + } } /* Traverse and restore all f-string buffers after reallocating tok->buf */ -static void -restore_fstring_buffers(struct tok_state *tok) -{ - int index; - tokenizer_mode *mode; +static void restore_fstring_buffers(struct tok_state *tok) { + int index; + tokenizer_mode *mode; - for (index = tok->tok_mode_stack_index; index >= 0; --index) { - mode = &(tok->tok_mode_stack[index]); - mode->f_string_start = tok->buf + mode->f_string_start_offset; - mode->f_string_multi_line_start = tok->buf + mode->f_string_multi_line_start_offset; - } + for (index = tok->tok_mode_stack_index; index >= 0; --index) { + mode = &(tok->tok_mode_stack[index]); + mode->f_string_start = tok->buf + mode->f_string_start_offset; + mode->f_string_multi_line_start = + tok->buf + mode->f_string_multi_line_start_offset; + } } -static int -set_fstring_expr(struct tok_state* tok, struct token *token, char c) { - assert(token != NULL); - assert(c == '}' || c == ':' || c == '!'); - tokenizer_mode *tok_mode = TOK_GET_MODE(tok); +static int set_fstring_expr(struct tok_state *tok, struct token *token, + char c) { + assert(token != NULL); + assert(c == '}' || c == ':' || c == '!'); + tokenizer_mode *tok_mode = TOK_GET_MODE(tok); - if (!tok_mode->f_string_debug || token->metadata) { - return 0; - } + if (!tok_mode->f_string_debug || token->metadata) { + return 0; + } - PyObject *res = NULL; + PyObject *res = NULL; - // Check if there is a # character in the expression - int hash_detected = 0; - for (Py_ssize_t i = 0; i < tok_mode->last_expr_size - tok_mode->last_expr_end; i++) { - if (tok_mode->last_expr_buffer[i] == '#') { - hash_detected = 1; - break; - } + // Check if there is a # character in the expression + int hash_detected = 0; + for (Py_ssize_t i = 0; i < tok_mode->last_expr_size - tok_mode->last_expr_end; + i++) { + if (tok_mode->last_expr_buffer[i] == '#') { + hash_detected = 1; + break; } + } - if (hash_detected) { - Py_ssize_t input_length = tok_mode->last_expr_size - tok_mode->last_expr_end; - char *result = (char *)PyObject_Malloc((input_length + 1) * sizeof(char)); - if (!result) { - return -1; - } - - Py_ssize_t i = 0; - Py_ssize_t j = 0; - - for (i = 0, j = 0; i < input_length; i++) { - if (tok_mode->last_expr_buffer[i] == '#') { - // Skip characters until newline or end of string - while (tok_mode->last_expr_buffer[i] != '\0' && i < input_length) { - if (tok_mode->last_expr_buffer[i] == '\n') { - result[j++] = tok_mode->last_expr_buffer[i]; - break; - } - i++; - } - } else { - result[j++] = tok_mode->last_expr_buffer[i]; - } - } - - result[j] = '\0'; // Null-terminate the result string - res = PyUnicode_DecodeUTF8(result, j, NULL); - PyObject_Free(result); - } else { - res = PyUnicode_DecodeUTF8( - tok_mode->last_expr_buffer, - tok_mode->last_expr_size - tok_mode->last_expr_end, - NULL - ); - + if (hash_detected) { + Py_ssize_t input_length = + tok_mode->last_expr_size - tok_mode->last_expr_end; + char *result = (char *)PyObject_Malloc((input_length + 1) * sizeof(char)); + if (!result) { + return -1; } + Py_ssize_t i = 0; + Py_ssize_t j = 0; - if (!res) { - return -1; + for (i = 0, j = 0; i < input_length; i++) { + if (tok_mode->last_expr_buffer[i] == '#') { + // Skip characters until newline or end of string + while (tok_mode->last_expr_buffer[i] != '\0' && i < input_length) { + if (tok_mode->last_expr_buffer[i] == '\n') { + result[j++] = tok_mode->last_expr_buffer[i]; + break; + } + i++; + } + } else { + result[j++] = tok_mode->last_expr_buffer[i]; + } } - token->metadata = res; - return 0; -} -static int -update_fstring_expr(struct tok_state *tok, char cur) -{ - assert(tok->cur != NULL); + result[j] = '\0'; // Null-terminate the result string + res = PyUnicode_DecodeUTF8(result, j, NULL); + PyObject_Free(result); + } else { + res = PyUnicode_DecodeUTF8( + tok_mode->last_expr_buffer, + tok_mode->last_expr_size - tok_mode->last_expr_end, NULL); + } - Py_ssize_t size = strlen(tok->cur); - tokenizer_mode *tok_mode = TOK_GET_MODE(tok); - - switch (cur) { - case 0: - if (!tok_mode->last_expr_buffer || tok_mode->last_expr_end >= 0) { - return 1; - } - char *new_buffer = PyMem_Realloc( - tok_mode->last_expr_buffer, - tok_mode->last_expr_size + size - ); - if (new_buffer == NULL) { - PyMem_Free(tok_mode->last_expr_buffer); - goto error; - } - tok_mode->last_expr_buffer = new_buffer; - strncpy(tok_mode->last_expr_buffer + tok_mode->last_expr_size, tok->cur, size); - tok_mode->last_expr_size += size; - break; - case '{': - if (tok_mode->last_expr_buffer != NULL) { - PyMem_Free(tok_mode->last_expr_buffer); - } - tok_mode->last_expr_buffer = PyMem_Malloc(size); - if (tok_mode->last_expr_buffer == NULL) { - goto error; - } - tok_mode->last_expr_size = size; - tok_mode->last_expr_end = -1; - strncpy(tok_mode->last_expr_buffer, tok->cur, size); - break; - case '}': - case '!': - case ':': - if (tok_mode->last_expr_end == -1) { - tok_mode->last_expr_end = strlen(tok->start); - } - break; - default: - Py_UNREACHABLE(); - } - return 1; + if (!res) { + return -1; + } + token->metadata = res; + return 0; +} + +static int update_fstring_expr(struct tok_state *tok, char cur) { + assert(tok->cur != NULL); + + Py_ssize_t size = strlen(tok->cur); + tokenizer_mode *tok_mode = TOK_GET_MODE(tok); + + switch (cur) { + case 0: + if (!tok_mode->last_expr_buffer || tok_mode->last_expr_end >= 0) { + return 1; + } + char *new_buffer = PyMem_Realloc(tok_mode->last_expr_buffer, + tok_mode->last_expr_size + size); + if (new_buffer == NULL) { + PyMem_Free(tok_mode->last_expr_buffer); + goto error; + } + tok_mode->last_expr_buffer = new_buffer; + strncpy(tok_mode->last_expr_buffer + tok_mode->last_expr_size, tok->cur, + size); + tok_mode->last_expr_size += size; + break; + case '{': + if (tok_mode->last_expr_buffer != NULL) { + PyMem_Free(tok_mode->last_expr_buffer); + } + tok_mode->last_expr_buffer = PyMem_Malloc(size); + if (tok_mode->last_expr_buffer == NULL) { + goto error; + } + tok_mode->last_expr_size = size; + tok_mode->last_expr_end = -1; + strncpy(tok_mode->last_expr_buffer, tok->cur, size); + break; + case '}': + case '!': + case ':': + if (tok_mode->last_expr_end == -1) { + tok_mode->last_expr_end = strlen(tok->start); + } + break; + default: + Py_UNREACHABLE(); + } + return 1; error: - tok->done = E_NOMEM; - return 0; + tok->done = E_NOMEM; + return 0; } -static void -free_fstring_expressions(struct tok_state *tok) -{ - int index; - tokenizer_mode *mode; - - for (index = tok->tok_mode_stack_index; index >= 0; --index) { - mode = &(tok->tok_mode_stack[index]); - if (mode->last_expr_buffer != NULL) { - PyMem_Free(mode->last_expr_buffer); - mode->last_expr_buffer = NULL; - mode->last_expr_size = 0; - mode->last_expr_end = -1; - } +static void free_fstring_expressions(struct tok_state *tok) { + int index; + tokenizer_mode *mode; + + for (index = tok->tok_mode_stack_index; index >= 0; --index) { + mode = &(tok->tok_mode_stack[index]); + if (mode->last_expr_buffer != NULL) { + PyMem_Free(mode->last_expr_buffer); + mode->last_expr_buffer = NULL; + mode->last_expr_size = 0; + mode->last_expr_end = -1; + mode->in_format_spec = 0; } + } } /* Read a line of text from TOK into S, using the stream in TOK. @@ -539,88 +516,85 @@ free_fstring_expressions(struct tok_state *tok) 1) NULL: need to call tok->decoding_readline to get a new line 2) PyUnicodeObject *: decoding_feof has called tok->decoding_readline and stored the result in tok->decoding_buffer - 3) PyByteArrayObject *: previous call to tok_readline_recode did not have enough room - (in the s buffer) to copy entire contents of the line read - by tok->decoding_readline. tok->decoding_buffer has the overflow. - In this case, tok_readline_recode is called in a loop (with an expanded buffer) - until the buffer ends with a '\n' (or until the end of the file is - reached): see tok_nextc and its calls to tok_reserve_buf. + 3) PyByteArrayObject *: previous call to tok_readline_recode did not have + enough room (in the s buffer) to copy entire contents of the line read by + tok->decoding_readline. tok->decoding_buffer has the overflow. In this case, + tok_readline_recode is called in a loop (with an expanded buffer) until the + buffer ends with a '\n' (or until the end of the file is reached): see + tok_nextc and its calls to tok_reserve_buf. */ -static int -tok_reserve_buf(struct tok_state *tok, Py_ssize_t size) -{ - Py_ssize_t cur = tok->cur - tok->buf; - Py_ssize_t oldsize = tok->inp - tok->buf; - Py_ssize_t newsize = oldsize + Py_MAX(size, oldsize >> 1); - if (newsize > tok->end - tok->buf) { - char *newbuf = tok->buf; - Py_ssize_t start = tok->start == NULL ? -1 : tok->start - tok->buf; - Py_ssize_t line_start = tok->start == NULL ? -1 : tok->line_start - tok->buf; - Py_ssize_t multi_line_start = tok->multi_line_start - tok->buf; - remember_fstring_buffers(tok); - newbuf = (char *)PyMem_Realloc(newbuf, newsize); - if (newbuf == NULL) { - tok->done = E_NOMEM; - return 0; - } - tok->buf = newbuf; - tok->cur = tok->buf + cur; - tok->inp = tok->buf + oldsize; - tok->end = tok->buf + newsize; - tok->start = start < 0 ? NULL : tok->buf + start; - tok->line_start = line_start < 0 ? NULL : tok->buf + line_start; - tok->multi_line_start = multi_line_start < 0 ? NULL : tok->buf + multi_line_start; - restore_fstring_buffers(tok); - } - return 1; -} - -static inline int -contains_null_bytes(const char* str, size_t size) { - return memchr(str, 0, size) != NULL; -} - -static int -tok_readline_recode(struct tok_state *tok) { - PyObject *line; - const char *buf; - Py_ssize_t buflen; - line = tok->decoding_buffer; +static int tok_reserve_buf(struct tok_state *tok, Py_ssize_t size) { + Py_ssize_t cur = tok->cur - tok->buf; + Py_ssize_t oldsize = tok->inp - tok->buf; + Py_ssize_t newsize = oldsize + Py_MAX(size, oldsize >> 1); + if (newsize > tok->end - tok->buf) { + char *newbuf = tok->buf; + Py_ssize_t start = tok->start == NULL ? -1 : tok->start - tok->buf; + Py_ssize_t line_start = + tok->start == NULL ? -1 : tok->line_start - tok->buf; + Py_ssize_t multi_line_start = tok->multi_line_start - tok->buf; + remember_fstring_buffers(tok); + newbuf = (char *)PyMem_Realloc(newbuf, newsize); + if (newbuf == NULL) { + tok->done = E_NOMEM; + return 0; + } + tok->buf = newbuf; + tok->cur = tok->buf + cur; + tok->inp = tok->buf + oldsize; + tok->end = tok->buf + newsize; + tok->start = start < 0 ? NULL : tok->buf + start; + tok->line_start = line_start < 0 ? NULL : tok->buf + line_start; + tok->multi_line_start = + multi_line_start < 0 ? NULL : tok->buf + multi_line_start; + restore_fstring_buffers(tok); + } + return 1; +} + +static inline int contains_null_bytes(const char *str, size_t size) { + return memchr(str, 0, size) != NULL; +} + +static int tok_readline_recode(struct tok_state *tok) { + PyObject *line; + const char *buf; + Py_ssize_t buflen; + line = tok->decoding_buffer; + if (line == NULL) { + line = PyObject_CallNoArgs(tok->decoding_readline); if (line == NULL) { - line = PyObject_CallNoArgs(tok->decoding_readline); - if (line == NULL) { - error_ret(tok); - goto error; - } - } - else { - tok->decoding_buffer = NULL; - } - buf = PyUnicode_AsUTF8AndSize(line, &buflen); - if (buf == NULL) { - error_ret(tok); - goto error; - } - // Make room for the null terminator *and* potentially - // an extra newline character that we may need to artificially - // add. - size_t buffer_size = buflen + 2; - if (!tok_reserve_buf(tok, buffer_size)) { - goto error; + error_ret(tok); + goto error; } - memcpy(tok->inp, buf, buflen); - tok->inp += buflen; - *tok->inp = '\0'; - if (tok->fp_interactive && - tok_concatenate_interactive_new_line(tok, buf) == -1) { - goto error; - } - Py_DECREF(line); - return 1; + } else { + tok->decoding_buffer = NULL; + } + buf = PyUnicode_AsUTF8AndSize(line, &buflen); + if (buf == NULL) { + error_ret(tok); + goto error; + } + // Make room for the null terminator *and* potentially + // an extra newline character that we may need to artificially + // add. + size_t buffer_size = buflen + 2; + if (!tok_reserve_buf(tok, buffer_size)) { + goto error; + } + memcpy(tok->inp, buf, buflen); + tok->inp += buflen; + *tok->inp = '\0'; + if (tok->fp_interactive && + tok_concatenate_interactive_new_line(tok, buf) == -1) { + goto error; + } + Py_DECREF(line); + return 1; error: - Py_XDECREF(line); - return 0; + Py_XDECREF(line); + return 0; } /* Set the readline function for TOK to a StreamReader's @@ -633,2383 +607,2293 @@ tok_readline_recode(struct tok_state *tok) { Return 1 on success, 0 on failure. */ -static int -fp_setreadl(struct tok_state *tok, const char* enc) -{ - PyObject *readline, *open, *stream; - int fd; - long pos; - - fd = fileno(tok->fp); - /* Due to buffering the file offset for fd can be different from the file - * position of tok->fp. If tok->fp was opened in text mode on Windows, - * its file position counts CRLF as one char and can't be directly mapped - * to the file offset for fd. Instead we step back one byte and read to - * the end of line.*/ - pos = ftell(tok->fp); - if (pos == -1 || - lseek(fd, (off_t)(pos > 0 ? pos - 1 : pos), SEEK_SET) == (off_t)-1) { - PyErr_SetFromErrnoWithFilename(PyExc_OSError, NULL); - return 0; - } +static int fp_setreadl(struct tok_state *tok, const char *enc) { + PyObject *readline, *open, *stream; + int fd; + long pos; + + fd = fileno(tok->fp); + /* Due to buffering the file offset for fd can be different from the file + * position of tok->fp. If tok->fp was opened in text mode on Windows, + * its file position counts CRLF as one char and can't be directly mapped + * to the file offset for fd. Instead we step back one byte and read to + * the end of line.*/ + pos = ftell(tok->fp); + if (pos == -1 || + lseek(fd, (off_t)(pos > 0 ? pos - 1 : pos), SEEK_SET) == (off_t)-1) { + PyErr_SetFromErrnoWithFilename(PyExc_OSError, NULL); + return 0; + } - open = _PyImport_GetModuleAttrString("io", "open"); - if (open == NULL) { - return 0; - } - stream = PyObject_CallFunction(open, "isisOOO", - fd, "r", -1, enc, Py_None, Py_None, Py_False); - Py_DECREF(open); - if (stream == NULL) { - return 0; - } + open = _PyImport_GetModuleAttrString("io", "open"); + if (open == NULL) { + return 0; + } + stream = PyObject_CallFunction(open, "isisOOO", fd, "r", -1, enc, Py_None, + Py_None, Py_False); + Py_DECREF(open); + if (stream == NULL) { + return 0; + } - readline = PyObject_GetAttr(stream, &_Py_ID(readline)); - Py_DECREF(stream); - if (readline == NULL) { - return 0; - } - Py_XSETREF(tok->decoding_readline, readline); + readline = PyObject_GetAttr(stream, &_Py_ID(readline)); + Py_DECREF(stream); + if (readline == NULL) { + return 0; + } + Py_XSETREF(tok->decoding_readline, readline); - if (pos > 0) { - PyObject *bufobj = _PyObject_CallNoArgs(readline); - if (bufobj == NULL) { - return 0; - } - Py_DECREF(bufobj); + if (pos > 0) { + PyObject *bufobj = _PyObject_CallNoArgs(readline); + if (bufobj == NULL) { + return 0; } + Py_DECREF(bufobj); + } - return 1; + return 1; } /* Fetch the next byte from TOK. */ -static int fp_getc(struct tok_state *tok) { - return getc(tok->fp); -} +static int fp_getc(struct tok_state *tok) { return getc(tok->fp); } /* Unfetch the last byte back into TOK. */ -static void fp_ungetc(int c, struct tok_state *tok) { - ungetc(c, tok->fp); -} +static void fp_ungetc(int c, struct tok_state *tok) { ungetc(c, tok->fp); } /* Check whether the characters at s start a valid UTF-8 sequence. Return the number of characters forming the sequence if yes, 0 if not. The special cases match those in stringlib/codecs.h:utf8_decode. */ -static int -valid_utf8(const unsigned char* s) -{ - int expected = 0; - int length; - if (*s < 0x80) { - /* single-byte code */ - return 1; - } - else if (*s < 0xE0) { - /* \xC2\x80-\xDF\xBF -- 0080-07FF */ - if (*s < 0xC2) { - /* invalid sequence - \x80-\xBF -- continuation byte - \xC0-\xC1 -- fake 0000-007F */ - return 0; - } - expected = 1; - } - else if (*s < 0xF0) { - /* \xE0\xA0\x80-\xEF\xBF\xBF -- 0800-FFFF */ - if (*s == 0xE0 && *(s + 1) < 0xA0) { - /* invalid sequence - \xE0\x80\x80-\xE0\x9F\xBF -- fake 0000-0800 */ - return 0; - } - else if (*s == 0xED && *(s + 1) >= 0xA0) { - /* Decoding UTF-8 sequences in range \xED\xA0\x80-\xED\xBF\xBF - will result in surrogates in range D800-DFFF. Surrogates are - not valid UTF-8 so they are rejected. - See https://www.unicode.org/versions/Unicode5.2.0/ch03.pdf - (table 3-7) and http://www.rfc-editor.org/rfc/rfc3629.txt */ - return 0; - } - expected = 2; - } - else if (*s < 0xF5) { - /* \xF0\x90\x80\x80-\xF4\x8F\xBF\xBF -- 10000-10FFFF */ - if (*(s + 1) < 0x90 ? *s == 0xF0 : *s == 0xF4) { - /* invalid sequence -- one of: - \xF0\x80\x80\x80-\xF0\x8F\xBF\xBF -- fake 0000-FFFF - \xF4\x90\x80\x80- -- 110000- overflow */ - return 0; - } - expected = 3; - } - else { - /* invalid start byte */ - return 0; - } - length = expected + 1; - for (; expected; expected--) - if (s[expected] < 0x80 || s[expected] >= 0xC0) - return 0; - return length; -} - -static int -ensure_utf8(char *line, struct tok_state *tok) -{ - int badchar = 0; - unsigned char *c; - int length; - for (c = (unsigned char *)line; *c; c += length) { - if (!(length = valid_utf8(c))) { - badchar = *c; - break; - } - } - if (badchar) { - PyErr_Format(PyExc_SyntaxError, - "Non-UTF-8 code starting with '\\x%.2x' " - "in file %U on line %i, " - "but no encoding declared; " - "see https://peps.python.org/pep-0263/ for details", - badchar, tok->filename, tok->lineno); - return 0; - } +static int valid_utf8(const unsigned char *s) { + int expected = 0; + int length; + if (*s < 0x80) { + /* single-byte code */ return 1; + } else if (*s < 0xE0) { + /* \xC2\x80-\xDF\xBF -- 0080-07FF */ + if (*s < 0xC2) { + /* invalid sequence + \x80-\xBF -- continuation byte + \xC0-\xC1 -- fake 0000-007F */ + return 0; + } + expected = 1; + } else if (*s < 0xF0) { + /* \xE0\xA0\x80-\xEF\xBF\xBF -- 0800-FFFF */ + if (*s == 0xE0 && *(s + 1) < 0xA0) { + /* invalid sequence + \xE0\x80\x80-\xE0\x9F\xBF -- fake 0000-0800 */ + return 0; + } else if (*s == 0xED && *(s + 1) >= 0xA0) { + /* Decoding UTF-8 sequences in range \xED\xA0\x80-\xED\xBF\xBF + will result in surrogates in range D800-DFFF. Surrogates are + not valid UTF-8 so they are rejected. + See https://www.unicode.org/versions/Unicode5.2.0/ch03.pdf + (table 3-7) and http://www.rfc-editor.org/rfc/rfc3629.txt */ + return 0; + } + expected = 2; + } else if (*s < 0xF5) { + /* \xF0\x90\x80\x80-\xF4\x8F\xBF\xBF -- 10000-10FFFF */ + if (*(s + 1) < 0x90 ? *s == 0xF0 : *s == 0xF4) { + /* invalid sequence -- one of: + \xF0\x80\x80\x80-\xF0\x8F\xBF\xBF -- fake 0000-FFFF + \xF4\x90\x80\x80- -- 110000- overflow */ + return 0; + } + expected = 3; + } else { + /* invalid start byte */ + return 0; + } + length = expected + 1; + for (; expected; expected--) + if (s[expected] < 0x80 || s[expected] >= 0xC0) + return 0; + return length; +} + +static int ensure_utf8(char *line, struct tok_state *tok) { + int badchar = 0; + unsigned char *c; + int length; + for (c = (unsigned char *)line; *c; c += length) { + if (!(length = valid_utf8(c))) { + badchar = *c; + break; + } + } + if (badchar) { + PyErr_Format(PyExc_SyntaxError, + "Non-UTF-8 code starting with '\\x%.2x' " + "in file %U on line %i, " + "but no encoding declared; " + "see https://peps.python.org/pep-0263/ for details", + badchar, tok->filename, tok->lineno); + return 0; + } + return 1; } /* Fetch a byte from TOK, using the string buffer. */ -static int -buf_getc(struct tok_state *tok) { - return Py_CHARMASK(*tok->str++); -} +static int buf_getc(struct tok_state *tok) { return Py_CHARMASK(*tok->str++); } /* Unfetch a byte from TOK, using the string buffer. */ -static void -buf_ungetc(int c, struct tok_state *tok) { - tok->str--; - assert(Py_CHARMASK(*tok->str) == c); /* tok->cur may point to read-only segment */ +static void buf_ungetc(int c, struct tok_state *tok) { + tok->str--; + assert(Py_CHARMASK(*tok->str) == + c); /* tok->cur may point to read-only segment */ } /* Set the readline function for TOK to ENC. For the string-based tokenizer, this means to just record the encoding. */ -static int -buf_setreadl(struct tok_state *tok, const char* enc) { - tok->enc = enc; - return 1; +static int buf_setreadl(struct tok_state *tok, const char *enc) { + tok->enc = enc; + return 1; } /* Return a UTF-8 encoding Python string object from the C byte string STR, which is encoded with ENC. */ -static PyObject * -translate_into_utf8(const char* str, const char* enc) { - PyObject *utf8; - PyObject* buf = PyUnicode_Decode(str, strlen(str), enc, NULL); - if (buf == NULL) - return NULL; - utf8 = PyUnicode_AsUTF8String(buf); - Py_DECREF(buf); - return utf8; -} - - -static char * -translate_newlines(const char *s, int exec_input, int preserve_crlf, - struct tok_state *tok) { - int skip_next_lf = 0; - size_t needed_length = strlen(s) + 2, final_length; - char *buf, *current; - char c = '\0'; - buf = PyMem_Malloc(needed_length); - if (buf == NULL) { - tok->done = E_NOMEM; - return NULL; - } - for (current = buf; *s; s++, current++) { - c = *s; - if (skip_next_lf) { - skip_next_lf = 0; - if (c == '\n') { - c = *++s; - if (!c) - break; - } - } - if (!preserve_crlf && c == '\r') { - skip_next_lf = 1; - c = '\n'; - } - *current = c; - } - /* If this is exec input, add a newline to the end of the string if - there isn't one already. */ - if (exec_input && c != '\n' && c != '\0') { - *current = '\n'; - current++; - } - *current = '\0'; - final_length = current - buf + 1; - if (final_length < needed_length && final_length) { - /* should never fail */ - char* result = PyMem_Realloc(buf, final_length); - if (result == NULL) { - PyMem_Free(buf); - } - buf = result; - } - return buf; +static PyObject *translate_into_utf8(const char *str, const char *enc) { + PyObject *utf8; + PyObject *buf = PyUnicode_Decode(str, strlen(str), enc, NULL); + if (buf == NULL) + return NULL; + utf8 = PyUnicode_AsUTF8String(buf); + Py_DECREF(buf); + return utf8; +} + +static char *translate_newlines(const char *s, int exec_input, + int preserve_crlf, struct tok_state *tok) { + int skip_next_lf = 0; + size_t needed_length = strlen(s) + 2, final_length; + char *buf, *current; + char c = '\0'; + buf = PyMem_Malloc(needed_length); + if (buf == NULL) { + tok->done = E_NOMEM; + return NULL; + } + for (current = buf; *s; s++, current++) { + c = *s; + if (skip_next_lf) { + skip_next_lf = 0; + if (c == '\n') { + c = *++s; + if (!c) + break; + } + } + if (!preserve_crlf && c == '\r') { + skip_next_lf = 1; + c = '\n'; + } + *current = c; + } + /* If this is exec input, add a newline to the end of the string if + there isn't one already. */ + if (exec_input && c != '\n' && c != '\0') { + *current = '\n'; + current++; + } + *current = '\0'; + final_length = current - buf + 1; + if (final_length < needed_length && final_length) { + /* should never fail */ + char *result = PyMem_Realloc(buf, final_length); + if (result == NULL) { + PyMem_Free(buf); + } + buf = result; + } + return buf; } /* Decode a byte string STR for use as the buffer of TOK. Look for encoding declarations inside STR, and record them inside TOK. */ -static char * -decode_str(const char *input, int single, struct tok_state *tok, int preserve_crlf) -{ - PyObject* utf8 = NULL; - char *str; - const char *s; - const char *newl[2] = {NULL, NULL}; - int lineno = 0; - tok->input = str = translate_newlines(input, single, preserve_crlf, tok); - if (str == NULL) - return NULL; - tok->enc = NULL; - tok->str = str; - if (!check_bom(buf_getc, buf_ungetc, buf_setreadl, tok)) - return error_ret(tok); - str = tok->str; /* string after BOM if any */ - assert(str); - if (tok->enc != NULL) { - utf8 = translate_into_utf8(str, tok->enc); - if (utf8 == NULL) - return error_ret(tok); - str = PyBytes_AsString(utf8); - } - for (s = str;; s++) { - if (*s == '\0') break; - else if (*s == '\n') { - assert(lineno < 2); - newl[lineno] = s; - lineno++; - if (lineno == 2) break; - } +static char *decode_str(const char *input, int single, struct tok_state *tok, + int preserve_crlf) { + PyObject *utf8 = NULL; + char *str; + const char *s; + const char *newl[2] = {NULL, NULL}; + int lineno = 0; + tok->input = str = translate_newlines(input, single, preserve_crlf, tok); + if (str == NULL) + return NULL; + tok->enc = NULL; + tok->str = str; + if (!check_bom(buf_getc, buf_ungetc, buf_setreadl, tok)) + return error_ret(tok); + str = tok->str; /* string after BOM if any */ + assert(str); + if (tok->enc != NULL) { + utf8 = translate_into_utf8(str, tok->enc); + if (utf8 == NULL) + return error_ret(tok); + str = PyBytes_AsString(utf8); + } + for (s = str;; s++) { + if (*s == '\0') + break; + else if (*s == '\n') { + assert(lineno < 2); + newl[lineno] = s; + lineno++; + if (lineno == 2) + break; } - tok->enc = NULL; - /* need to check line 1 and 2 separately since check_coding_spec - assumes a single line as input */ - if (newl[0]) { - if (!check_coding_spec(str, newl[0] - str, tok, buf_setreadl)) { - return NULL; - } - if (tok->enc == NULL && tok->decoding_state != STATE_NORMAL && newl[1]) { - if (!check_coding_spec(newl[0]+1, newl[1] - newl[0], - tok, buf_setreadl)) - return NULL; - } + } + tok->enc = NULL; + /* need to check line 1 and 2 separately since check_coding_spec + assumes a single line as input */ + if (newl[0]) { + if (!check_coding_spec(str, newl[0] - str, tok, buf_setreadl)) { + return NULL; } - if (tok->enc != NULL) { - assert(utf8 == NULL); - utf8 = translate_into_utf8(str, tok->enc); - if (utf8 == NULL) - return error_ret(tok); - str = PyBytes_AS_STRING(utf8); + if (tok->enc == NULL && tok->decoding_state != STATE_NORMAL && newl[1]) { + if (!check_coding_spec(newl[0] + 1, newl[1] - newl[0], tok, buf_setreadl)) + return NULL; } - assert(tok->decoding_buffer == NULL); - tok->decoding_buffer = utf8; /* CAUTION */ - return str; + } + if (tok->enc != NULL) { + assert(utf8 == NULL); + utf8 = translate_into_utf8(str, tok->enc); + if (utf8 == NULL) + return error_ret(tok); + str = PyBytes_AS_STRING(utf8); + } + assert(tok->decoding_buffer == NULL); + tok->decoding_buffer = utf8; /* CAUTION */ + return str; } /* Set up tokenizer for string */ -struct tok_state * -_PyTokenizer_FromString(const char *str, int exec_input, int preserve_crlf) -{ - struct tok_state *tok = tok_new(); - char *decoded; +struct tok_state *_PyTokenizer_FromString(const char *str, int exec_input, + int preserve_crlf) { + struct tok_state *tok = tok_new(); + char *decoded; - if (tok == NULL) - return NULL; - decoded = decode_str(str, exec_input, tok, preserve_crlf); - if (decoded == NULL) { - _PyTokenizer_Free(tok); - return NULL; - } + if (tok == NULL) + return NULL; + decoded = decode_str(str, exec_input, tok, preserve_crlf); + if (decoded == NULL) { + _PyTokenizer_Free(tok); + return NULL; + } - tok->buf = tok->cur = tok->inp = decoded; - tok->end = decoded; - return tok; + tok->buf = tok->cur = tok->inp = decoded; + tok->end = decoded; + return tok; } -struct tok_state * -_PyTokenizer_FromReadline(PyObject* readline, const char* enc, - int exec_input, int preserve_crlf) -{ - struct tok_state *tok = tok_new(); - if (tok == NULL) - return NULL; - if ((tok->buf = (char *)PyMem_Malloc(BUFSIZ)) == NULL) { - _PyTokenizer_Free(tok); - return NULL; - } - tok->cur = tok->inp = tok->buf; - tok->end = tok->buf + BUFSIZ; - tok->fp = NULL; - if (enc != NULL) { - tok->encoding = new_string(enc, strlen(enc), tok); - if (!tok->encoding) { - _PyTokenizer_Free(tok); - return NULL; - } +struct tok_state *_PyTokenizer_FromReadline(PyObject *readline, const char *enc, + int exec_input, int preserve_crlf) { + struct tok_state *tok = tok_new(); + if (tok == NULL) + return NULL; + if ((tok->buf = (char *)PyMem_Malloc(BUFSIZ)) == NULL) { + _PyTokenizer_Free(tok); + return NULL; + } + tok->cur = tok->inp = tok->buf; + tok->end = tok->buf + BUFSIZ; + tok->fp = NULL; + if (enc != NULL) { + tok->encoding = new_string(enc, strlen(enc), tok); + if (!tok->encoding) { + _PyTokenizer_Free(tok); + return NULL; } - tok->decoding_state = STATE_NORMAL; - Py_INCREF(readline); - tok->readline = readline; - return tok; + } + tok->decoding_state = STATE_NORMAL; + Py_INCREF(readline); + tok->readline = readline; + return tok; } /* Set up tokenizer for UTF-8 string */ -struct tok_state * -_PyTokenizer_FromUTF8(const char *str, int exec_input, int preserve_crlf) -{ - struct tok_state *tok = tok_new(); - char *translated; - if (tok == NULL) - return NULL; - tok->input = translated = translate_newlines(str, exec_input, preserve_crlf, tok); - if (translated == NULL) { - _PyTokenizer_Free(tok); - return NULL; - } - tok->decoding_state = STATE_NORMAL; - tok->enc = NULL; - tok->str = translated; - tok->encoding = new_string("utf-8", 5, tok); - if (!tok->encoding) { - _PyTokenizer_Free(tok); - return NULL; - } +struct tok_state *_PyTokenizer_FromUTF8(const char *str, int exec_input, + int preserve_crlf) { + struct tok_state *tok = tok_new(); + char *translated; + if (tok == NULL) + return NULL; + tok->input = translated = + translate_newlines(str, exec_input, preserve_crlf, tok); + if (translated == NULL) { + _PyTokenizer_Free(tok); + return NULL; + } + tok->decoding_state = STATE_NORMAL; + tok->enc = NULL; + tok->str = translated; + tok->encoding = new_string("utf-8", 5, tok); + if (!tok->encoding) { + _PyTokenizer_Free(tok); + return NULL; + } - tok->buf = tok->cur = tok->inp = translated; - tok->end = translated; - return tok; + tok->buf = tok->cur = tok->inp = translated; + tok->end = translated; + return tok; } /* Set up tokenizer for file */ -struct tok_state * -_PyTokenizer_FromFile(FILE *fp, const char* enc, - const char *ps1, const char *ps2) -{ - struct tok_state *tok = tok_new(); - if (tok == NULL) - return NULL; - if ((tok->buf = (char *)PyMem_Malloc(BUFSIZ)) == NULL) { - _PyTokenizer_Free(tok); - return NULL; - } - tok->cur = tok->inp = tok->buf; - tok->end = tok->buf + BUFSIZ; - tok->fp = fp; - tok->prompt = ps1; - tok->nextprompt = ps2; - if (enc != NULL) { - /* Must copy encoding declaration since it - gets copied into the parse tree. */ - tok->encoding = new_string(enc, strlen(enc), tok); - if (!tok->encoding) { - _PyTokenizer_Free(tok); - return NULL; - } - tok->decoding_state = STATE_NORMAL; +struct tok_state *_PyTokenizer_FromFile(FILE *fp, const char *enc, + const char *ps1, const char *ps2) { + struct tok_state *tok = tok_new(); + if (tok == NULL) + return NULL; + if ((tok->buf = (char *)PyMem_Malloc(BUFSIZ)) == NULL) { + _PyTokenizer_Free(tok); + return NULL; + } + tok->cur = tok->inp = tok->buf; + tok->end = tok->buf + BUFSIZ; + tok->fp = fp; + tok->prompt = ps1; + tok->nextprompt = ps2; + if (enc != NULL) { + /* Must copy encoding declaration since it + gets copied into the parse tree. */ + tok->encoding = new_string(enc, strlen(enc), tok); + if (!tok->encoding) { + _PyTokenizer_Free(tok); + return NULL; } - return tok; + tok->decoding_state = STATE_NORMAL; + } + return tok; } /* Free a tok_state structure */ -void -_PyTokenizer_Free(struct tok_state *tok) -{ - if (tok->encoding != NULL) { - PyMem_Free(tok->encoding); - } - Py_XDECREF(tok->decoding_readline); - Py_XDECREF(tok->decoding_buffer); - Py_XDECREF(tok->readline); - Py_XDECREF(tok->filename); - if ((tok->readline != NULL || tok->fp != NULL ) && tok->buf != NULL) { - PyMem_Free(tok->buf); +void _PyTokenizer_Free(struct tok_state *tok) { + if (tok->encoding != NULL) { + PyMem_Free(tok->encoding); + } + Py_XDECREF(tok->decoding_readline); + Py_XDECREF(tok->decoding_buffer); + Py_XDECREF(tok->readline); + Py_XDECREF(tok->filename); + if ((tok->readline != NULL || tok->fp != NULL) && tok->buf != NULL) { + PyMem_Free(tok->buf); + } + if (tok->input) { + PyMem_Free(tok->input); + } + if (tok->interactive_src_start != NULL) { + PyMem_Free(tok->interactive_src_start); + } + free_fstring_expressions(tok); + PyMem_Free(tok); +} + +void _PyToken_Free(struct token *token) { Py_XDECREF(token->metadata); } + +void _PyToken_Init(struct token *token) { token->metadata = NULL; } + +static int tok_readline_raw(struct tok_state *tok) { + do { + if (!tok_reserve_buf(tok, BUFSIZ)) { + return 0; + } + int n_chars = (int)(tok->end - tok->inp); + size_t line_size = 0; + char *line = _Py_UniversalNewlineFgetsWithSize(tok->inp, n_chars, tok->fp, + NULL, &line_size); + if (line == NULL) { + return 1; } - if (tok->input) { - PyMem_Free(tok->input); + if (tok->fp_interactive && + tok_concatenate_interactive_new_line(tok, line) == -1) { + return 0; + } + tok->inp += line_size; + if (tok->inp == tok->buf) { + return 0; + } + } while (tok->inp[-1] != '\n'); + return 1; +} + +static int tok_readline_string(struct tok_state *tok) { + PyObject *line = NULL; + PyObject *raw_line = PyObject_CallNoArgs(tok->readline); + if (raw_line == NULL) { + if (PyErr_ExceptionMatches(PyExc_StopIteration)) { + PyErr_Clear(); + return 1; + } + error_ret(tok); + goto error; + } + if (tok->encoding != NULL) { + if (!PyBytes_Check(raw_line)) { + PyErr_Format(PyExc_TypeError, "readline() returned a non-bytes object"); + error_ret(tok); + goto error; + } + line = + PyUnicode_Decode(PyBytes_AS_STRING(raw_line), + PyBytes_GET_SIZE(raw_line), tok->encoding, "replace"); + Py_CLEAR(raw_line); + if (line == NULL) { + error_ret(tok); + goto error; + } + } else { + if (!PyUnicode_Check(raw_line)) { + PyErr_Format(PyExc_TypeError, "readline() returned a non-string object"); + error_ret(tok); + goto error; + } + line = raw_line; + raw_line = NULL; + } + Py_ssize_t buflen; + const char *buf = PyUnicode_AsUTF8AndSize(line, &buflen); + if (buf == NULL) { + error_ret(tok); + goto error; + } + + // Make room for the null terminator *and* potentially + // an extra newline character that we may need to artificially + // add. + size_t buffer_size = buflen + 2; + if (!tok_reserve_buf(tok, buffer_size)) { + goto error; + } + memcpy(tok->inp, buf, buflen); + tok->inp += buflen; + *tok->inp = '\0'; + + tok->line_start = tok->cur; + Py_DECREF(line); + return 1; +error: + Py_XDECREF(raw_line); + Py_XDECREF(line); + return 0; +} + +static int tok_underflow_string(struct tok_state *tok) { + char *end = strchr(tok->inp, '\n'); + if (end != NULL) { + end++; + } else { + end = strchr(tok->inp, '\0'); + if (end == tok->inp) { + tok->done = E_EOF; + return 0; + } + } + if (tok->start == NULL) { + tok->buf = tok->cur; + } + tok->line_start = tok->cur; + ADVANCE_LINENO(); + tok->inp = end; + return 1; +} + +static int tok_underflow_interactive(struct tok_state *tok) { + if (tok->interactive_underflow == IUNDERFLOW_STOP) { + tok->done = E_INTERACT_STOP; + return 1; + } + char *newtok = PyOS_Readline(tok->fp ? tok->fp : stdin, stdout, tok->prompt); + if (newtok != NULL) { + char *translated = translate_newlines(newtok, 0, 0, tok); + PyMem_Free(newtok); + if (translated == NULL) { + return 0; } - if (tok->interactive_src_start != NULL) { - PyMem_Free(tok->interactive_src_start); + newtok = translated; + } + if (tok->encoding && newtok && *newtok) { + /* Recode to UTF-8 */ + Py_ssize_t buflen; + const char *buf; + PyObject *u = translate_into_utf8(newtok, tok->encoding); + PyMem_Free(newtok); + if (u == NULL) { + tok->done = E_DECODE; + return 0; + } + buflen = PyBytes_GET_SIZE(u); + buf = PyBytes_AS_STRING(u); + newtok = PyMem_Malloc(buflen + 1); + if (newtok == NULL) { + Py_DECREF(u); + tok->done = E_NOMEM; + return 0; + } + strcpy(newtok, buf); + Py_DECREF(u); + } + if (tok->fp_interactive && + tok_concatenate_interactive_new_line(tok, newtok) == -1) { + PyMem_Free(newtok); + return 0; + } + if (tok->nextprompt != NULL) { + tok->prompt = tok->nextprompt; + } + if (newtok == NULL) { + tok->done = E_INTR; + } else if (*newtok == '\0') { + PyMem_Free(newtok); + tok->done = E_EOF; + } else if (tok->start != NULL) { + Py_ssize_t cur_multi_line_start = tok->multi_line_start - tok->buf; + remember_fstring_buffers(tok); + size_t size = strlen(newtok); + ADVANCE_LINENO(); + if (!tok_reserve_buf(tok, size + 1)) { + PyMem_Free(tok->buf); + tok->buf = NULL; + PyMem_Free(newtok); + return 0; + } + memcpy(tok->cur, newtok, size + 1); + PyMem_Free(newtok); + tok->inp += size; + tok->multi_line_start = tok->buf + cur_multi_line_start; + restore_fstring_buffers(tok); + } else { + remember_fstring_buffers(tok); + ADVANCE_LINENO(); + PyMem_Free(tok->buf); + tok->buf = newtok; + tok->cur = tok->buf; + tok->line_start = tok->buf; + tok->inp = strchr(tok->buf, '\0'); + tok->end = tok->inp + 1; + restore_fstring_buffers(tok); + } + if (tok->done != E_OK) { + if (tok->prompt != NULL) { + PySys_WriteStderr("\n"); } - free_fstring_expressions(tok); - PyMem_Free(tok); -} + return 0; + } -void -_PyToken_Free(struct token *token) { - Py_XDECREF(token->metadata); -} - -void -_PyToken_Init(struct token *token) { - token->metadata = NULL; -} - -static int -tok_readline_raw(struct tok_state *tok) -{ - do { - if (!tok_reserve_buf(tok, BUFSIZ)) { - return 0; - } - int n_chars = (int)(tok->end - tok->inp); - size_t line_size = 0; - char *line = _Py_UniversalNewlineFgetsWithSize(tok->inp, n_chars, tok->fp, NULL, &line_size); - if (line == NULL) { - return 1; - } - if (tok->fp_interactive && - tok_concatenate_interactive_new_line(tok, line) == -1) { - return 0; - } - tok->inp += line_size; - if (tok->inp == tok->buf) { - return 0; - } - } while (tok->inp[-1] != '\n'); - return 1; + if (tok->tok_mode_stack_index && !update_fstring_expr(tok, 0)) { + return 0; + } + return 1; } -static int -tok_readline_string(struct tok_state* tok) { - PyObject* line = NULL; - PyObject* raw_line = PyObject_CallNoArgs(tok->readline); - if (raw_line == NULL) { - if (PyErr_ExceptionMatches(PyExc_StopIteration)) { - PyErr_Clear(); - return 1; - } - error_ret(tok); - goto error; - } - if(tok->encoding != NULL) { - if (!PyBytes_Check(raw_line)) { - PyErr_Format(PyExc_TypeError, "readline() returned a non-bytes object"); - error_ret(tok); - goto error; - } - line = PyUnicode_Decode(PyBytes_AS_STRING(raw_line), PyBytes_GET_SIZE(raw_line), - tok->encoding, "replace"); - Py_CLEAR(raw_line); - if (line == NULL) { - error_ret(tok); - goto error; - } - } else { - if(!PyUnicode_Check(raw_line)) { - PyErr_Format(PyExc_TypeError, "readline() returned a non-string object"); - error_ret(tok); - goto error; - } - line = raw_line; - raw_line = NULL; - } - Py_ssize_t buflen; - const char* buf = PyUnicode_AsUTF8AndSize(line, &buflen); - if (buf == NULL) { - error_ret(tok); - goto error; - } - - // Make room for the null terminator *and* potentially - // an extra newline character that we may need to artificially - // add. - size_t buffer_size = buflen + 2; - if (!tok_reserve_buf(tok, buffer_size)) { - goto error; - } - memcpy(tok->inp, buf, buflen); - tok->inp += buflen; +static int tok_underflow_file(struct tok_state *tok) { + if (tok->start == NULL && !INSIDE_FSTRING(tok)) { + tok->cur = tok->inp = tok->buf; + } + if (tok->decoding_state == STATE_INIT) { + /* We have not yet determined the encoding. + If an encoding is found, use the file-pointer + reader functions from now on. */ + if (!check_bom(fp_getc, fp_ungetc, fp_setreadl, tok)) { + error_ret(tok); + return 0; + } + assert(tok->decoding_state != STATE_INIT); + } + /* Read until '\n' or EOF */ + if (tok->decoding_readline != NULL) { + /* We already have a codec associated with this input. */ + if (!tok_readline_recode(tok)) { + return 0; + } + } else { + /* We want a 'raw' read. */ + if (!tok_readline_raw(tok)) { + return 0; + } + } + if (tok->inp == tok->cur) { + tok->done = E_EOF; + return 0; + } + tok->implicit_newline = 0; + if (tok->inp[-1] != '\n') { + assert(tok->inp + 1 < tok->end); + /* Last line does not end in \n, fake one */ + *tok->inp++ = '\n'; *tok->inp = '\0'; + tok->implicit_newline = 1; + } - tok->line_start = tok->cur; - Py_DECREF(line); - return 1; -error: - Py_XDECREF(raw_line); - Py_XDECREF(line); + if (tok->tok_mode_stack_index && !update_fstring_expr(tok, 0)) { return 0; + } + + ADVANCE_LINENO(); + if (tok->decoding_state != STATE_NORMAL) { + if (tok->lineno > 2) { + tok->decoding_state = STATE_NORMAL; + } else if (!check_coding_spec(tok->cur, strlen(tok->cur), tok, + fp_setreadl)) { + return 0; + } + } + /* The default encoding is UTF-8, so make sure we don't have any + non-UTF-8 sequences in it. */ + if (!tok->encoding && !ensure_utf8(tok->cur, tok)) { + error_ret(tok); + return 0; + } + assert(tok->done == E_OK); + return tok->done == E_OK; } -static int -tok_underflow_string(struct tok_state *tok) { - char *end = strchr(tok->inp, '\n'); - if (end != NULL) { - end++; - } - else { - end = strchr(tok->inp, '\0'); - if (end == tok->inp) { - tok->done = E_EOF; - return 0; - } - } - if (tok->start == NULL) { - tok->buf = tok->cur; - } - tok->line_start = tok->cur; - ADVANCE_LINENO(); - tok->inp = end; - return 1; -} - -static int -tok_underflow_interactive(struct tok_state *tok) { - if (tok->interactive_underflow == IUNDERFLOW_STOP) { - tok->done = E_INTERACT_STOP; - return 1; - } - char *newtok = PyOS_Readline(tok->fp ? tok->fp : stdin, stdout, tok->prompt); - if (newtok != NULL) { - char *translated = translate_newlines(newtok, 0, 0, tok); - PyMem_Free(newtok); - if (translated == NULL) { - return 0; - } - newtok = translated; - } - if (tok->encoding && newtok && *newtok) { - /* Recode to UTF-8 */ - Py_ssize_t buflen; - const char* buf; - PyObject *u = translate_into_utf8(newtok, tok->encoding); - PyMem_Free(newtok); - if (u == NULL) { - tok->done = E_DECODE; - return 0; - } - buflen = PyBytes_GET_SIZE(u); - buf = PyBytes_AS_STRING(u); - newtok = PyMem_Malloc(buflen+1); - if (newtok == NULL) { - Py_DECREF(u); - tok->done = E_NOMEM; - return 0; - } - strcpy(newtok, buf); - Py_DECREF(u); - } - if (tok->fp_interactive && - tok_concatenate_interactive_new_line(tok, newtok) == -1) { - PyMem_Free(newtok); - return 0; - } - if (tok->nextprompt != NULL) { - tok->prompt = tok->nextprompt; - } - if (newtok == NULL) { - tok->done = E_INTR; - } - else if (*newtok == '\0') { - PyMem_Free(newtok); - tok->done = E_EOF; - } - else if (tok->start != NULL) { - Py_ssize_t cur_multi_line_start = tok->multi_line_start - tok->buf; - remember_fstring_buffers(tok); - size_t size = strlen(newtok); - ADVANCE_LINENO(); - if (!tok_reserve_buf(tok, size + 1)) { - PyMem_Free(tok->buf); - tok->buf = NULL; - PyMem_Free(newtok); - return 0; - } - memcpy(tok->cur, newtok, size + 1); - PyMem_Free(newtok); - tok->inp += size; - tok->multi_line_start = tok->buf + cur_multi_line_start; - restore_fstring_buffers(tok); - } - else { - remember_fstring_buffers(tok); - ADVANCE_LINENO(); - PyMem_Free(tok->buf); - tok->buf = newtok; - tok->cur = tok->buf; - tok->line_start = tok->buf; - tok->inp = strchr(tok->buf, '\0'); - tok->end = tok->inp + 1; - restore_fstring_buffers(tok); - } - if (tok->done != E_OK) { - if (tok->prompt != NULL) { - PySys_WriteStderr("\n"); - } - return 0; - } - - if (tok->tok_mode_stack_index && !update_fstring_expr(tok, 0)) { - return 0; - } - return 1; -} - -static int -tok_underflow_file(struct tok_state *tok) { - if (tok->start == NULL && !INSIDE_FSTRING(tok)) { - tok->cur = tok->inp = tok->buf; - } - if (tok->decoding_state == STATE_INIT) { - /* We have not yet determined the encoding. - If an encoding is found, use the file-pointer - reader functions from now on. */ - if (!check_bom(fp_getc, fp_ungetc, fp_setreadl, tok)) { - error_ret(tok); - return 0; - } - assert(tok->decoding_state != STATE_INIT); - } - /* Read until '\n' or EOF */ - if (tok->decoding_readline != NULL) { - /* We already have a codec associated with this input. */ - if (!tok_readline_recode(tok)) { - return 0; - } - } - else { - /* We want a 'raw' read. */ - if (!tok_readline_raw(tok)) { - return 0; - } - } - if (tok->inp == tok->cur) { - tok->done = E_EOF; - return 0; - } - tok->implicit_newline = 0; - if (tok->inp[-1] != '\n') { - assert(tok->inp + 1 < tok->end); - /* Last line does not end in \n, fake one */ - *tok->inp++ = '\n'; - *tok->inp = '\0'; - tok->implicit_newline = 1; - } - - if (tok->tok_mode_stack_index && !update_fstring_expr(tok, 0)) { - return 0; - } - - ADVANCE_LINENO(); - if (tok->decoding_state != STATE_NORMAL) { - if (tok->lineno > 2) { - tok->decoding_state = STATE_NORMAL; - } - else if (!check_coding_spec(tok->cur, strlen(tok->cur), - tok, fp_setreadl)) - { - return 0; - } - } - /* The default encoding is UTF-8, so make sure we don't have any - non-UTF-8 sequences in it. */ - if (!tok->encoding && !ensure_utf8(tok->cur, tok)) { - error_ret(tok); - return 0; - } - assert(tok->done == E_OK); - return tok->done == E_OK; -} - -static int -tok_underflow_readline(struct tok_state* tok) { - assert(tok->decoding_state == STATE_NORMAL); - assert(tok->fp == NULL && tok->input == NULL && tok->decoding_readline == NULL); - if (tok->start == NULL && !INSIDE_FSTRING(tok)) { - tok->cur = tok->inp = tok->buf; - } - if (!tok_readline_string(tok)) { - return 0; - } - if (tok->inp == tok->cur) { - tok->done = E_EOF; - return 0; - } - tok->implicit_newline = 0; - if (tok->inp[-1] != '\n') { - assert(tok->inp + 1 < tok->end); - /* Last line does not end in \n, fake one */ - *tok->inp++ = '\n'; - *tok->inp = '\0'; - tok->implicit_newline = 1; - } +static int tok_underflow_readline(struct tok_state *tok) { + assert(tok->decoding_state == STATE_NORMAL); + assert(tok->fp == NULL && tok->input == NULL && + tok->decoding_readline == NULL); + if (tok->start == NULL && !INSIDE_FSTRING(tok)) { + tok->cur = tok->inp = tok->buf; + } + if (!tok_readline_string(tok)) { + return 0; + } + if (tok->inp == tok->cur) { + tok->done = E_EOF; + return 0; + } + tok->implicit_newline = 0; + if (tok->inp[-1] != '\n') { + assert(tok->inp + 1 < tok->end); + /* Last line does not end in \n, fake one */ + *tok->inp++ = '\n'; + *tok->inp = '\0'; + tok->implicit_newline = 1; + } - if (tok->tok_mode_stack_index && !update_fstring_expr(tok, 0)) { - return 0; - } + if (tok->tok_mode_stack_index && !update_fstring_expr(tok, 0)) { + return 0; + } - ADVANCE_LINENO(); - /* The default encoding is UTF-8, so make sure we don't have any - non-UTF-8 sequences in it. */ - if (!tok->encoding && !ensure_utf8(tok->cur, tok)) { - error_ret(tok); - return 0; - } - assert(tok->done == E_OK); - return tok->done == E_OK; + ADVANCE_LINENO(); + /* The default encoding is UTF-8, so make sure we don't have any + non-UTF-8 sequences in it. */ + if (!tok->encoding && !ensure_utf8(tok->cur, tok)) { + error_ret(tok); + return 0; + } + assert(tok->done == E_OK); + return tok->done == E_OK; } #if defined(Py_DEBUG) -static void -print_escape(FILE *f, const char *s, Py_ssize_t size) -{ - if (s == NULL) { - fputs("NULL", f); - return; - } - putc('"', f); - while (size-- > 0) { - unsigned char c = *s++; - switch (c) { - case '\n': fputs("\\n", f); break; - case '\r': fputs("\\r", f); break; - case '\t': fputs("\\t", f); break; - case '\f': fputs("\\f", f); break; - case '\'': fputs("\\'", f); break; - case '"': fputs("\\\"", f); break; - default: - if (0x20 <= c && c <= 0x7f) - putc(c, f); - else - fprintf(f, "\\x%02x", c); - } +static void print_escape(FILE *f, const char *s, Py_ssize_t size) { + if (s == NULL) { + fputs("NULL", f); + return; + } + putc('"', f); + while (size-- > 0) { + unsigned char c = *s++; + switch (c) { + case '\n': + fputs("\\n", f); + break; + case '\r': + fputs("\\r", f); + break; + case '\t': + fputs("\\t", f); + break; + case '\f': + fputs("\\f", f); + break; + case '\'': + fputs("\\'", f); + break; + case '"': + fputs("\\\"", f); + break; + default: + if (0x20 <= c && c <= 0x7f) + putc(c, f); + else + fprintf(f, "\\x%02x", c); } - putc('"', f); + } + putc('"', f); } #endif /* Get next char, updating state; error code goes into tok->done */ -static int -tok_nextc(struct tok_state *tok) -{ - int rc; - for (;;) { - if (tok->cur != tok->inp) { - if ((unsigned int) tok->col_offset >= (unsigned int) INT_MAX) { - tok->done = E_COLUMNOVERFLOW; - return EOF; - } - tok->col_offset++; - return Py_CHARMASK(*tok->cur++); /* Fast path */ - } - if (tok->done != E_OK) { - return EOF; - } - if (tok->readline) { - rc = tok_underflow_readline(tok); - } - else if (tok->fp == NULL) { - rc = tok_underflow_string(tok); - } - else if (tok->prompt != NULL) { - rc = tok_underflow_interactive(tok); - } - else { - rc = tok_underflow_file(tok); - } -#if defined(Py_DEBUG) - if (tok->debug) { - fprintf(stderr, "line[%d] = ", tok->lineno); - print_escape(stderr, tok->cur, tok->inp - tok->cur); - fprintf(stderr, " tok->done = %d\n", tok->done); - } -#endif - if (!rc) { - tok->cur = tok->inp; - return EOF; - } - tok->line_start = tok->cur; - - if (contains_null_bytes(tok->line_start, tok->inp - tok->line_start)) { - syntaxerror(tok, "source code cannot contain null bytes"); - tok->cur = tok->inp; - return EOF; - } +static int tok_nextc(struct tok_state *tok) { + int rc; + for (;;) { + if (tok->cur != tok->inp) { + if ((unsigned int)tok->col_offset >= (unsigned int)INT_MAX) { + tok->done = E_COLUMNOVERFLOW; + return EOF; + } + tok->col_offset++; + return Py_CHARMASK(*tok->cur++); /* Fast path */ } - Py_UNREACHABLE(); -} - -/* Back-up one character */ - -static void -tok_backup(struct tok_state *tok, int c) -{ - if (c != EOF) { - if (--tok->cur < tok->buf) { - Py_FatalError("tokenizer beginning of buffer"); - } - if ((int)(unsigned char)*tok->cur != Py_CHARMASK(c)) { - Py_FatalError("tok_backup: wrong character"); - } - tok->col_offset--; + if (tok->done != E_OK) { + return EOF; + } + if (tok->readline) { + rc = tok_underflow_readline(tok); + } else if (tok->fp == NULL) { + rc = tok_underflow_string(tok); + } else if (tok->prompt != NULL) { + rc = tok_underflow_interactive(tok); + } else { + rc = tok_underflow_file(tok); } -} - -static int -_syntaxerror_range(struct tok_state *tok, const char *format, - int col_offset, int end_col_offset, - va_list vargs) -{ - // In release builds, we don't want to overwrite a previous error, but in debug builds we - // want to fail if we are not doing it so we can fix it. - assert(tok->done != E_ERROR); - if (tok->done == E_ERROR) { - return ERRORTOKEN; +#if defined(Py_DEBUG) + if (tok->debug) { + fprintf(stderr, "line[%d] = ", tok->lineno); + print_escape(stderr, tok->cur, tok->inp - tok->cur); + fprintf(stderr, " tok->done = %d\n", tok->done); } - PyObject *errmsg, *errtext, *args; - errmsg = PyUnicode_FromFormatV(format, vargs); - if (!errmsg) { - goto error; +#endif + if (!rc) { + tok->cur = tok->inp; + return EOF; } + tok->line_start = tok->cur; - errtext = PyUnicode_DecodeUTF8(tok->line_start, tok->cur - tok->line_start, - "replace"); - if (!errtext) { - goto error; + if (contains_null_bytes(tok->line_start, tok->inp - tok->line_start)) { + syntaxerror(tok, "source code cannot contain null bytes"); + tok->cur = tok->inp; + return EOF; } + } + Py_UNREACHABLE(); +} - if (col_offset == -1) { - col_offset = (int)PyUnicode_GET_LENGTH(errtext); - } - if (end_col_offset == -1) { - end_col_offset = col_offset; - } +/* Back-up one character */ - Py_ssize_t line_len = strcspn(tok->line_start, "\n"); - if (line_len != tok->cur - tok->line_start) { - Py_DECREF(errtext); - errtext = PyUnicode_DecodeUTF8(tok->line_start, line_len, - "replace"); +static void tok_backup(struct tok_state *tok, int c) { + if (c != EOF) { + if (--tok->cur < tok->buf) { + Py_FatalError("tokenizer beginning of buffer"); } - if (!errtext) { - goto error; + if ((int)(unsigned char)*tok->cur != Py_CHARMASK(c)) { + Py_FatalError("tok_backup: wrong character"); } + tok->col_offset--; + } +} - args = Py_BuildValue("(O(OiiNii))", errmsg, tok->filename, tok->lineno, - col_offset, errtext, tok->lineno, end_col_offset); - if (args) { - PyErr_SetObject(PyExc_SyntaxError, args); - Py_DECREF(args); - } +static int _syntaxerror_range(struct tok_state *tok, const char *format, + int col_offset, int end_col_offset, + va_list vargs) { + // In release builds, we don't want to overwrite a previous error, but in + // debug builds we want to fail if we are not doing it so we can fix it. + assert(tok->done != E_ERROR); + if (tok->done == E_ERROR) { + return ERRORTOKEN; + } + PyObject *errmsg, *errtext, *args; + errmsg = PyUnicode_FromFormatV(format, vargs); + if (!errmsg) { + goto error; + } + + errtext = PyUnicode_DecodeUTF8(tok->line_start, tok->cur - tok->line_start, + "replace"); + if (!errtext) { + goto error; + } + + if (col_offset == -1) { + col_offset = (int)PyUnicode_GET_LENGTH(errtext); + } + if (end_col_offset == -1) { + end_col_offset = col_offset; + } + + Py_ssize_t line_len = strcspn(tok->line_start, "\n"); + if (line_len != tok->cur - tok->line_start) { + Py_DECREF(errtext); + errtext = PyUnicode_DecodeUTF8(tok->line_start, line_len, "replace"); + } + if (!errtext) { + goto error; + } + + args = Py_BuildValue("(O(OiiNii))", errmsg, tok->filename, tok->lineno, + col_offset, errtext, tok->lineno, end_col_offset); + if (args) { + PyErr_SetObject(PyExc_SyntaxError, args); + Py_DECREF(args); + } error: - Py_XDECREF(errmsg); - tok->done = E_ERROR; - return ERRORTOKEN; + Py_XDECREF(errmsg); + tok->done = E_ERROR; + return ERRORTOKEN; } -static int -syntaxerror(struct tok_state *tok, const char *format, ...) -{ - // This errors are cleaned on startup. Todo: Fix it. - va_list vargs; - va_start(vargs, format); - int ret = _syntaxerror_range(tok, format, -1, -1, vargs); - va_end(vargs); - return ret; +static int syntaxerror(struct tok_state *tok, const char *format, ...) { + // This errors are cleaned on startup. Todo: Fix it. + va_list vargs; + va_start(vargs, format); + int ret = _syntaxerror_range(tok, format, -1, -1, vargs); + va_end(vargs); + return ret; } -static int -syntaxerror_known_range(struct tok_state *tok, - int col_offset, int end_col_offset, - const char *format, ...) -{ - va_list vargs; - va_start(vargs, format); - int ret = _syntaxerror_range(tok, format, col_offset, end_col_offset, vargs); - va_end(vargs); - return ret; +static int syntaxerror_known_range(struct tok_state *tok, int col_offset, + int end_col_offset, const char *format, + ...) { + va_list vargs; + va_start(vargs, format); + int ret = _syntaxerror_range(tok, format, col_offset, end_col_offset, vargs); + va_end(vargs); + return ret; } -static int -indenterror(struct tok_state *tok) -{ - tok->done = E_TABSPACE; - tok->cur = tok->inp; - return ERRORTOKEN; +static int indenterror(struct tok_state *tok) { + tok->done = E_TABSPACE; + tok->cur = tok->inp; + return ERRORTOKEN; } -static int -parser_warn(struct tok_state *tok, PyObject *category, const char *format, ...) -{ - if (!tok->report_warnings) { - return 0; - } - - PyObject *errmsg; - va_list vargs; - va_start(vargs, format); - errmsg = PyUnicode_FromFormatV(format, vargs); - va_end(vargs); - if (!errmsg) { - goto error; - } - - if (PyErr_WarnExplicitObject(category, errmsg, tok->filename, - tok->lineno, NULL, NULL) < 0) { - if (PyErr_ExceptionMatches(category)) { - /* Replace the DeprecationWarning exception with a SyntaxError - to get a more accurate error report */ - PyErr_Clear(); - syntaxerror(tok, "%U", errmsg); - } - goto error; - } - Py_DECREF(errmsg); +static int parser_warn(struct tok_state *tok, PyObject *category, + const char *format, ...) { + if (!tok->report_warnings) { return 0; + } + + PyObject *errmsg; + va_list vargs; + va_start(vargs, format); + errmsg = PyUnicode_FromFormatV(format, vargs); + va_end(vargs); + if (!errmsg) { + goto error; + } + + if (PyErr_WarnExplicitObject(category, errmsg, tok->filename, tok->lineno, + NULL, NULL) < 0) { + if (PyErr_ExceptionMatches(category)) { + /* Replace the DeprecationWarning exception with a SyntaxError + to get a more accurate error report */ + PyErr_Clear(); + syntaxerror(tok, "%U", errmsg); + } + goto error; + } + Py_DECREF(errmsg); + return 0; error: - Py_XDECREF(errmsg); - tok->done = E_ERROR; - return -1; + Py_XDECREF(errmsg); + tok->done = E_ERROR; + return -1; } -static int -warn_invalid_escape_sequence(struct tok_state *tok, int first_invalid_escape_char) -{ - if (!tok->report_warnings) { - return 0; - } - - PyObject *msg = PyUnicode_FromFormat( - "invalid escape sequence '\\%c'", - (char) first_invalid_escape_char - ); +static int warn_invalid_escape_sequence(struct tok_state *tok, + int first_invalid_escape_char) { + if (!tok->report_warnings) { + return 0; + } - if (msg == NULL) { - return -1; - } + PyObject *msg = PyUnicode_FromFormat("invalid escape sequence '\\%c'", + (char)first_invalid_escape_char); - if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg, tok->filename, - tok->lineno, NULL, NULL) < 0) { - Py_DECREF(msg); + if (msg == NULL) { + return -1; + } - if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) { - /* Replace the SyntaxWarning exception with a SyntaxError - to get a more accurate error report */ - PyErr_Clear(); - return syntaxerror(tok, "invalid escape sequence '\\%c'", (char) first_invalid_escape_char); - } + if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg, tok->filename, + tok->lineno, NULL, NULL) < 0) { + Py_DECREF(msg); - return -1; + if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) { + /* Replace the SyntaxWarning exception with a SyntaxError + to get a more accurate error report */ + PyErr_Clear(); + return syntaxerror(tok, "invalid escape sequence '\\%c'", + (char)first_invalid_escape_char); } - Py_DECREF(msg); - return 0; + return -1; + } + + Py_DECREF(msg); + return 0; } -static int -lookahead(struct tok_state *tok, const char *test) -{ - const char *s = test; - int res = 0; - while (1) { - int c = tok_nextc(tok); - if (*s == 0) { - res = !is_potential_identifier_char(c); - } - else if (c == *s) { - s++; - continue; - } +static int lookahead(struct tok_state *tok, const char *test) { + const char *s = test; + int res = 0; + while (1) { + int c = tok_nextc(tok); + if (*s == 0) { + res = !is_potential_identifier_char(c); + } else if (c == *s) { + s++; + continue; + } - tok_backup(tok, c); - while (s != test) { - tok_backup(tok, *--s); - } - return res; + tok_backup(tok, c); + while (s != test) { + tok_backup(tok, *--s); } + return res; + } } -static int -verify_end_of_number(struct tok_state *tok, int c, const char *kind) { - if (tok->tok_extra_tokens) { - // When we are parsing extra tokens, we don't want to emit warnings - // about invalid literals, because we want to be a bit more liberal. - return 1; - } - /* Emit a deprecation warning only if the numeric literal is immediately - * followed by one of keywords which can occur after a numeric literal - * in valid code: "and", "else", "for", "if", "in", "is" and "or". - * It allows to gradually deprecate existing valid code without adding - * warning before error in most cases of invalid numeric literal (which - * would be confusing and break existing tests). - * Raise a syntax error with slightly better message than plain - * "invalid syntax" if the numeric literal is immediately followed by - * other keyword or identifier. - */ - int r = 0; - if (c == 'a') { - r = lookahead(tok, "nd"); - } - else if (c == 'e') { - r = lookahead(tok, "lse"); - } - else if (c == 'f') { - r = lookahead(tok, "or"); - } - else if (c == 'i') { - int c2 = tok_nextc(tok); - if (c2 == 'f' || c2 == 'n' || c2 == 's') { - r = 1; - } - tok_backup(tok, c2); - } - else if (c == 'o') { - r = lookahead(tok, "r"); - } - else if (c == 'n') { - r = lookahead(tok, "ot"); - } - if (r) { - tok_backup(tok, c); - if (parser_warn(tok, PyExc_SyntaxWarning, - "invalid %s literal", kind)) - { - return 0; - } - tok_nextc(tok); +static int verify_end_of_number(struct tok_state *tok, int c, + const char *kind) { + if (tok->tok_extra_tokens) { + // When we are parsing extra tokens, we don't want to emit warnings + // about invalid literals, because we want to be a bit more liberal. + return 1; + } + /* Emit a deprecation warning only if the numeric literal is immediately + * followed by one of keywords which can occur after a numeric literal + * in valid code: "and", "else", "for", "if", "in", "is" and "or". + * It allows to gradually deprecate existing valid code without adding + * warning before error in most cases of invalid numeric literal (which + * would be confusing and break existing tests). + * Raise a syntax error with slightly better message than plain + * "invalid syntax" if the numeric literal is immediately followed by + * other keyword or identifier. + */ + int r = 0; + if (c == 'a') { + r = lookahead(tok, "nd"); + } else if (c == 'e') { + r = lookahead(tok, "lse"); + } else if (c == 'f') { + r = lookahead(tok, "or"); + } else if (c == 'i') { + int c2 = tok_nextc(tok); + if (c2 == 'f' || c2 == 'n' || c2 == 's') { + r = 1; + } + tok_backup(tok, c2); + } else if (c == 'o') { + r = lookahead(tok, "r"); + } else if (c == 'n') { + r = lookahead(tok, "ot"); + } + if (r) { + tok_backup(tok, c); + if (parser_warn(tok, PyExc_SyntaxWarning, "invalid %s literal", kind)) { + return 0; } - else /* In future releases, only error will remain. */ + tok_nextc(tok); + } else /* In future releases, only error will remain. */ if (c < 128 && is_potential_identifier_char(c)) { - tok_backup(tok, c); - syntaxerror(tok, "invalid %s literal", kind); - return 0; + tok_backup(tok, c); + syntaxerror(tok, "invalid %s literal", kind); + return 0; } - return 1; + return 1; } /* Verify that the identifier follows PEP 3131. All identifier strings are guaranteed to be "ready" unicode objects. */ -static int -verify_identifier(struct tok_state *tok) -{ - if (tok->tok_extra_tokens) { - return 1; - } - PyObject *s; - if (tok->decoding_erred) - return 0; - s = PyUnicode_DecodeUTF8(tok->start, tok->cur - tok->start, NULL); - if (s == NULL) { - if (PyErr_ExceptionMatches(PyExc_UnicodeDecodeError)) { - tok->done = E_DECODE; - } - else { - tok->done = E_ERROR; - } - return 0; +static int verify_identifier(struct tok_state *tok) { + if (tok->tok_extra_tokens) { + return 1; + } + PyObject *s; + if (tok->decoding_erred) + return 0; + s = PyUnicode_DecodeUTF8(tok->start, tok->cur - tok->start, NULL); + if (s == NULL) { + if (PyErr_ExceptionMatches(PyExc_UnicodeDecodeError)) { + tok->done = E_DECODE; + } else { + tok->done = E_ERROR; } - Py_ssize_t invalid = _PyUnicode_ScanIdentifier(s); - if (invalid < 0) { - Py_DECREF(s); + return 0; + } + Py_ssize_t invalid = _PyUnicode_ScanIdentifier(s); + if (invalid < 0) { + Py_DECREF(s); + tok->done = E_ERROR; + return 0; + } + assert(PyUnicode_GET_LENGTH(s) > 0); + if (invalid < PyUnicode_GET_LENGTH(s)) { + Py_UCS4 ch = PyUnicode_READ_CHAR(s, invalid); + if (invalid + 1 < PyUnicode_GET_LENGTH(s)) { + /* Determine the offset in UTF-8 encoded input */ + Py_SETREF(s, PyUnicode_Substring(s, 0, invalid + 1)); + if (s != NULL) { + Py_SETREF(s, PyUnicode_AsUTF8String(s)); + } + if (s == NULL) { tok->done = E_ERROR; return 0; - } - assert(PyUnicode_GET_LENGTH(s) > 0); - if (invalid < PyUnicode_GET_LENGTH(s)) { - Py_UCS4 ch = PyUnicode_READ_CHAR(s, invalid); - if (invalid + 1 < PyUnicode_GET_LENGTH(s)) { - /* Determine the offset in UTF-8 encoded input */ - Py_SETREF(s, PyUnicode_Substring(s, 0, invalid + 1)); - if (s != NULL) { - Py_SETREF(s, PyUnicode_AsUTF8String(s)); - } - if (s == NULL) { - tok->done = E_ERROR; - return 0; - } - tok->cur = (char *)tok->start + PyBytes_GET_SIZE(s); - } - Py_DECREF(s); - if (Py_UNICODE_ISPRINTABLE(ch)) { - syntaxerror(tok, "invalid character '%c' (U+%04X)", ch, ch); - } - else { - syntaxerror(tok, "invalid non-printable character U+%04X", ch); - } - return 0; + } + tok->cur = (char *)tok->start + PyBytes_GET_SIZE(s); } Py_DECREF(s); - return 1; -} - -static int -tok_decimal_tail(struct tok_state *tok) -{ - int c; - - while (1) { - do { - c = tok_nextc(tok); - } while (isdigit(c)); - if (c != '_') { - break; - } - c = tok_nextc(tok); - if (!isdigit(c)) { - tok_backup(tok, c); - syntaxerror(tok, "invalid decimal literal"); - return 0; - } - } - return c; -} - - -static inline int -tok_continuation_line(struct tok_state *tok) { - int c = tok_nextc(tok); - if (c == '\r') { - c = tok_nextc(tok); - } - if (c != '\n') { - tok->done = E_LINECONT; - return -1; - } - c = tok_nextc(tok); - if (c == EOF) { - tok->done = E_EOF; - tok->cur = tok->inp; - return -1; + if (Py_UNICODE_ISPRINTABLE(ch)) { + syntaxerror(tok, "invalid character '%c' (U+%04X)", ch, ch); } else { - tok_backup(tok, c); + syntaxerror(tok, "invalid non-printable character U+%04X", ch); } - return c; + return 0; + } + Py_DECREF(s); + return 1; } -static int -type_comment_token_setup(struct tok_state *tok, struct token *token, int type, int col_offset, - int end_col_offset, const char *start, const char *end) -{ - token->level = tok->level; - token->lineno = token->end_lineno = tok->lineno; - token->col_offset = col_offset; - token->end_col_offset = end_col_offset; - token->start = start; - token->end = end; - return type; -} +static int tok_decimal_tail(struct tok_state *tok) { + int c; -static int -token_setup(struct tok_state *tok, struct token *token, int type, const char *start, const char *end) -{ - assert((start == NULL && end == NULL) || (start != NULL && end != NULL)); - token->level = tok->level; - if (ISSTRINGLIT(type)) { - token->lineno = tok->first_lineno; - } - else { - token->lineno = tok->lineno; + while (1) { + do { + c = tok_nextc(tok); + } while (isdigit(c)); + if (c != '_') { + break; } - token->end_lineno = tok->lineno; - token->col_offset = token->end_col_offset = -1; - token->start = start; - token->end = end; - - if (start != NULL && end != NULL) { - token->col_offset = tok->starting_col_offset; - token->end_col_offset = tok->col_offset; + c = tok_nextc(tok); + if (!isdigit(c)) { + tok_backup(tok, c); + syntaxerror(tok, "invalid decimal literal"); + return 0; } - return type; + } + return c; } - -static int -tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct token *token) -{ - int c; - int blankline, nonascii; - - const char *p_start = NULL; - const char *p_end = NULL; - nextline: - tok->start = NULL; - tok->starting_col_offset = -1; - blankline = 0; - - - /* Get indentation level */ - if (tok->atbol) { - int col = 0; - int altcol = 0; - tok->atbol = 0; - int cont_line_col = 0; - for (;;) { - c = tok_nextc(tok); - if (c == ' ') { - col++, altcol++; - } - else if (c == '\t') { - col = (col / tok->tabsize + 1) * tok->tabsize; - altcol = (altcol / ALTTABSIZE + 1) * ALTTABSIZE; - } - else if (c == '\014') {/* Control-L (formfeed) */ - col = altcol = 0; /* For Emacs users */ - } - else if (c == '\\') { - // Indentation cannot be split over multiple physical lines - // using backslashes. This means that if we found a backslash - // preceded by whitespace, **the first one we find** determines - // the level of indentation of whatever comes next. - cont_line_col = cont_line_col ? cont_line_col : col; - if ((c = tok_continuation_line(tok)) == -1) { - return MAKE_TOKEN(ERRORTOKEN); - } - } - else { - break; - } - } - tok_backup(tok, c); - if (c == '#' || c == '\n' || c == '\r') { - /* Lines with only whitespace and/or comments - shouldn't affect the indentation and are - not passed to the parser as NEWLINE tokens, - except *totally* empty lines in interactive - mode, which signal the end of a command group. */ - if (col == 0 && c == '\n' && tok->prompt != NULL) { - blankline = 0; /* Let it through */ - } - else if (tok->prompt != NULL && tok->lineno == 1) { - /* In interactive mode, if the first line contains - only spaces and/or a comment, let it through. */ - blankline = 0; - col = altcol = 0; - } - else { - blankline = 1; /* Ignore completely */ - } - /* We can't jump back right here since we still - may need to skip to the end of a comment */ - } - if (!blankline && tok->level == 0) { - col = cont_line_col ? cont_line_col : col; - altcol = cont_line_col ? cont_line_col : altcol; - if (col == tok->indstack[tok->indent]) { - /* No change */ - if (altcol != tok->altindstack[tok->indent]) { - return MAKE_TOKEN(indenterror(tok)); - } - } - else if (col > tok->indstack[tok->indent]) { - /* Indent -- always one */ - if (tok->indent+1 >= MAXINDENT) { - tok->done = E_TOODEEP; - tok->cur = tok->inp; - return MAKE_TOKEN(ERRORTOKEN); - } - if (altcol <= tok->altindstack[tok->indent]) { - return MAKE_TOKEN(indenterror(tok)); - } - tok->pendin++; - tok->indstack[++tok->indent] = col; - tok->altindstack[tok->indent] = altcol; - } - else /* col < tok->indstack[tok->indent] */ { - /* Dedent -- any number, must be consistent */ - while (tok->indent > 0 && - col < tok->indstack[tok->indent]) { - tok->pendin--; - tok->indent--; - } - if (col != tok->indstack[tok->indent]) { - tok->done = E_DEDENT; - tok->cur = tok->inp; - return MAKE_TOKEN(ERRORTOKEN); - } - if (altcol != tok->altindstack[tok->indent]) { - return MAKE_TOKEN(indenterror(tok)); - } - } - } - } - - tok->start = tok->cur; - tok->starting_col_offset = tok->col_offset; - - /* Return pending indents/dedents */ - if (tok->pendin != 0) { - if (tok->pendin < 0) { - if (tok->tok_extra_tokens) { - p_start = tok->cur; - p_end = tok->cur; - } - tok->pendin++; - return MAKE_TOKEN(DEDENT); - } - else { - if (tok->tok_extra_tokens) { - p_start = tok->buf; - p_end = tok->cur; - } - tok->pendin--; - return MAKE_TOKEN(INDENT); +static inline int tok_continuation_line(struct tok_state *tok) { + int c = tok_nextc(tok); + if (c == '\r') { + c = tok_nextc(tok); + } + if (c != '\n') { + tok->done = E_LINECONT; + return -1; + } + c = tok_nextc(tok); + if (c == EOF) { + tok->done = E_EOF; + tok->cur = tok->inp; + return -1; + } else { + tok_backup(tok, c); + } + return c; +} + +static int type_comment_token_setup(struct tok_state *tok, struct token *token, + int type, int col_offset, + int end_col_offset, const char *start, + const char *end) { + token->level = tok->level; + token->lineno = token->end_lineno = tok->lineno; + token->col_offset = col_offset; + token->end_col_offset = end_col_offset; + token->start = start; + token->end = end; + return type; +} + +static int token_setup(struct tok_state *tok, struct token *token, int type, + const char *start, const char *end) { + assert((start == NULL && end == NULL) || (start != NULL && end != NULL)); + token->level = tok->level; + if (ISSTRINGLIT(type)) { + token->lineno = tok->first_lineno; + } else { + token->lineno = tok->lineno; + } + token->end_lineno = tok->lineno; + token->col_offset = token->end_col_offset = -1; + token->start = start; + token->end = end; + + if (start != NULL && end != NULL) { + token->col_offset = tok->starting_col_offset; + token->end_col_offset = tok->col_offset; + } + return type; +} + +static int tok_get_normal_mode(struct tok_state *tok, + tokenizer_mode *current_tok, + struct token *token) { + int c; + int blankline, nonascii; + + const char *p_start = NULL; + const char *p_end = NULL; +nextline: + tok->start = NULL; + tok->starting_col_offset = -1; + blankline = 0; + + /* Get indentation level */ + if (tok->atbol) { + int col = 0; + int altcol = 0; + tok->atbol = 0; + int cont_line_col = 0; + for (;;) { + c = tok_nextc(tok); + if (c == ' ') { + col++, altcol++; + } else if (c == '\t') { + col = (col / tok->tabsize + 1) * tok->tabsize; + altcol = (altcol / ALTTABSIZE + 1) * ALTTABSIZE; + } else if (c == '\014') { /* Control-L (formfeed) */ + col = altcol = 0; /* For Emacs users */ + } else if (c == '\\') { + // Indentation cannot be split over multiple physical lines + // using backslashes. This means that if we found a backslash + // preceded by whitespace, **the first one we find** determines + // the level of indentation of whatever comes next. + cont_line_col = cont_line_col ? cont_line_col : col; + if ((c = tok_continuation_line(tok)) == -1) { + return MAKE_TOKEN(ERRORTOKEN); } + } else { + break; + } } - - /* 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 */ - do { - c = tok_nextc(tok); - } while (c == ' ' || c == '\t' || c == '\014'); - - /* Set start of current token */ - tok->start = tok->cur == NULL ? NULL : tok->cur - 1; - tok->starting_col_offset = tok->col_offset - 1; - - /* Skip comment, unless it's a type comment */ - if (c == '#') { + if (c == '#' || c == '\n' || c == '\r') { + /* Lines with only whitespace and/or comments + shouldn't affect the indentation and are + not passed to the parser as NEWLINE tokens, + except *totally* empty lines in interactive + mode, which signal the end of a command group. */ + if (col == 0 && c == '\n' && tok->prompt != NULL) { + blankline = 0; /* Let it through */ + } else if (tok->prompt != NULL && tok->lineno == 1) { + /* In interactive mode, if the first line contains + only spaces and/or a comment, let it through. */ + blankline = 0; + col = altcol = 0; + } else { + blankline = 1; /* Ignore completely */ + } + /* We can't jump back right here since we still + may need to skip to the end of a comment */ + } + if (!blankline && tok->level == 0) { + col = cont_line_col ? cont_line_col : col; + altcol = cont_line_col ? cont_line_col : altcol; + if (col == tok->indstack[tok->indent]) { + /* No change */ + if (altcol != tok->altindstack[tok->indent]) { + return MAKE_TOKEN(indenterror(tok)); + } + } else if (col > tok->indstack[tok->indent]) { + /* Indent -- always one */ + if (tok->indent + 1 >= MAXINDENT) { + tok->done = E_TOODEEP; + tok->cur = tok->inp; + return MAKE_TOKEN(ERRORTOKEN); + } + if (altcol <= tok->altindstack[tok->indent]) { + return MAKE_TOKEN(indenterror(tok)); + } + tok->pendin++; + tok->indstack[++tok->indent] = col; + tok->altindstack[tok->indent] = altcol; + } else /* col < tok->indstack[tok->indent] */ { + /* Dedent -- any number, must be consistent */ + while (tok->indent > 0 && col < tok->indstack[tok->indent]) { + tok->pendin--; + tok->indent--; + } + if (col != tok->indstack[tok->indent]) { + tok->done = E_DEDENT; + tok->cur = tok->inp; + return MAKE_TOKEN(ERRORTOKEN); + } + if (altcol != tok->altindstack[tok->indent]) { + return MAKE_TOKEN(indenterror(tok)); + } + } + } + } + + tok->start = tok->cur; + tok->starting_col_offset = tok->col_offset; + + /* Return pending indents/dedents */ + if (tok->pendin != 0) { + if (tok->pendin < 0) { + if (tok->tok_extra_tokens) { + p_start = tok->cur; + p_end = tok->cur; + } + tok->pendin++; + return MAKE_TOKEN(DEDENT); + } else { + if (tok->tok_extra_tokens) { + p_start = tok->buf; + p_end = tok->cur; + } + tok->pendin--; + return MAKE_TOKEN(INDENT); + } + } + + /* 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; + } - const char* p = NULL; - const char *prefix, *type_start; - int current_starting_col_offset; +again: + tok->start = NULL; + /* Skip spaces */ + do { + c = tok_nextc(tok); + } while (c == ' ' || c == '\t' || c == '\014'); - while (c != EOF && c != '\n' && c != '\r') { - c = tok_nextc(tok); - } + /* Set start of current token */ + tok->start = tok->cur == NULL ? NULL : tok->cur - 1; + tok->starting_col_offset = tok->col_offset - 1; - if (tok->tok_extra_tokens) { - p = tok->start; - } + /* Skip comment, unless it's a type comment */ + if (c == '#') { - if (tok->type_comments) { - p = tok->start; - current_starting_col_offset = tok->starting_col_offset; - prefix = type_comment_prefix; - while (*prefix && p < tok->cur) { - if (*prefix == ' ') { - while (*p == ' ' || *p == '\t') { - p++; - current_starting_col_offset++; - } - } else if (*prefix == *p) { - p++; - current_starting_col_offset++; - } else { - break; - } - - prefix++; - } + const char *p = NULL; + const char *prefix, *type_start; + int current_starting_col_offset; - /* This is a type comment if we matched all of type_comment_prefix. */ - if (!*prefix) { - int is_type_ignore = 1; - // +6 in order to skip the word 'ignore' - const char *ignore_end = p + 6; - const int ignore_end_col_offset = current_starting_col_offset + 6; - tok_backup(tok, c); /* don't eat the newline or EOF */ - - type_start = p; - - /* A TYPE_IGNORE is "type: ignore" followed by the end of the token - * or anything ASCII and non-alphanumeric. */ - is_type_ignore = ( - tok->cur >= ignore_end && memcmp(p, "ignore", 6) == 0 - && !(tok->cur > ignore_end - && ((unsigned char)ignore_end[0] >= 128 || Py_ISALNUM(ignore_end[0])))); - - if (is_type_ignore) { - p_start = ignore_end; - p_end = tok->cur; - - /* If this type ignore is the only thing on the line, consume the newline also. */ - if (blankline) { - tok_nextc(tok); - tok->atbol = 1; - } - return MAKE_TYPE_COMMENT_TOKEN(TYPE_IGNORE, ignore_end_col_offset, tok->col_offset); - } else { - p_start = type_start; - p_end = tok->cur; - return MAKE_TYPE_COMMENT_TOKEN(TYPE_COMMENT, current_starting_col_offset, tok->col_offset); - } - } - } - if (tok->tok_extra_tokens) { - tok_backup(tok, c); /* don't eat the newline or EOF */ - p_start = p; - p_end = tok->cur; - tok->comment_newline = blankline; - return MAKE_TOKEN(COMMENT); - } + while (c != EOF && c != '\n' && c != '\r') { + c = tok_nextc(tok); } - if (tok->done == E_INTERACT_STOP) { - return MAKE_TOKEN(ENDMARKER); + if (tok->tok_extra_tokens) { + p = tok->start; + } + + if (tok->type_comments) { + p = tok->start; + current_starting_col_offset = tok->starting_col_offset; + prefix = type_comment_prefix; + while (*prefix && p < tok->cur) { + if (*prefix == ' ') { + while (*p == ' ' || *p == '\t') { + p++; + current_starting_col_offset++; + } + } else if (*prefix == *p) { + p++; + current_starting_col_offset++; + } else { + break; + } + + prefix++; + } + + /* This is a type comment if we matched all of type_comment_prefix. */ + if (!*prefix) { + int is_type_ignore = 1; + // +6 in order to skip the word 'ignore' + const char *ignore_end = p + 6; + const int ignore_end_col_offset = current_starting_col_offset + 6; + tok_backup(tok, c); /* don't eat the newline or EOF */ + + type_start = p; + + /* A TYPE_IGNORE is "type: ignore" followed by the end of the token + * or anything ASCII and non-alphanumeric. */ + is_type_ignore = + (tok->cur >= ignore_end && memcmp(p, "ignore", 6) == 0 && + !(tok->cur > ignore_end && ((unsigned char)ignore_end[0] >= 128 || + Py_ISALNUM(ignore_end[0])))); + + if (is_type_ignore) { + p_start = ignore_end; + p_end = tok->cur; + + /* If this type ignore is the only thing on the line, consume the + * newline also. */ + if (blankline) { + tok_nextc(tok); + tok->atbol = 1; + } + return MAKE_TYPE_COMMENT_TOKEN(TYPE_IGNORE, ignore_end_col_offset, + tok->col_offset); + } else { + p_start = type_start; + p_end = tok->cur; + return MAKE_TYPE_COMMENT_TOKEN( + TYPE_COMMENT, current_starting_col_offset, tok->col_offset); + } + } } - - /* Check for EOF and errors now */ - if (c == EOF) { - if (tok->level) { - return MAKE_TOKEN(ERRORTOKEN); + if (tok->tok_extra_tokens) { + tok_backup(tok, c); /* don't eat the newline or EOF */ + p_start = p; + p_end = tok->cur; + tok->comment_newline = blankline; + return MAKE_TOKEN(COMMENT); + } + } + + if (tok->done == E_INTERACT_STOP) { + return MAKE_TOKEN(ENDMARKER); + } + + /* Check for EOF and errors now */ + if (c == EOF) { + if (tok->level) { + return MAKE_TOKEN(ERRORTOKEN); + } + return MAKE_TOKEN(tok->done == E_EOF ? ENDMARKER : ERRORTOKEN); + } + + /* Identifier (most frequent token!) */ + nonascii = 0; + if (is_potential_identifier_start(c)) { + /* Process the various legal combinations of b"", r"", u"", and f"". */ + int saw_b = 0, saw_r = 0, saw_u = 0, saw_f = 0; + while (1) { + if (!(saw_b || saw_u || saw_f) && (c == 'b' || c == 'B')) + saw_b = 1; + /* Since this is a backwards compatibility support literal we don't + want to support it in arbitrary order like byte literals. */ + else if (!(saw_b || saw_u || saw_r || saw_f) && (c == 'u' || c == 'U')) { + saw_u = 1; + } + /* ur"" and ru"" are not supported */ + else if (!(saw_r || saw_u) && (c == 'r' || c == 'R')) { + saw_r = 1; + } else if (!(saw_f || saw_b || saw_u) && (c == 'f' || c == 'F')) { + saw_f = 1; + } else { + break; + } + c = tok_nextc(tok); + if (c == '"' || c == '\'') { + if (saw_f) { + goto f_string_quote; } - return MAKE_TOKEN(tok->done == E_EOF ? ENDMARKER : ERRORTOKEN); + goto letter_quote; + } + } + while (is_potential_identifier_char(c)) { + if (c >= 128) { + nonascii = 1; + } + c = tok_nextc(tok); + } + tok_backup(tok, c); + if (nonascii && !verify_identifier(tok)) { + return MAKE_TOKEN(ERRORTOKEN); } - /* Identifier (most frequent token!) */ - nonascii = 0; - if (is_potential_identifier_start(c)) { - /* Process the various legal combinations of b"", r"", u"", and f"". */ - int saw_b = 0, saw_r = 0, saw_u = 0, saw_f = 0; - while (1) { - if (!(saw_b || saw_u || saw_f) && (c == 'b' || c == 'B')) - saw_b = 1; - /* Since this is a backwards compatibility support literal we don't - want to support it in arbitrary order like byte literals. */ - else if (!(saw_b || saw_u || saw_r || saw_f) - && (c == 'u'|| c == 'U')) { - saw_u = 1; - } - /* ur"" and ru"" are not supported */ - else if (!(saw_r || saw_u) && (c == 'r' || c == 'R')) { - saw_r = 1; - } - else if (!(saw_f || saw_b || saw_u) && (c == 'f' || c == 'F')) { - saw_f = 1; - } - else { - break; - } - c = tok_nextc(tok); - if (c == '"' || c == '\'') { - if (saw_f) { - goto f_string_quote; - } - goto letter_quote; - } - } - while (is_potential_identifier_char(c)) { - if (c >= 128) { - nonascii = 1; - } - c = tok_nextc(tok); - } - tok_backup(tok, c); - if (nonascii && !verify_identifier(tok)) { - return MAKE_TOKEN(ERRORTOKEN); - } + p_start = tok->start; + p_end = tok->cur; - 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 MAKE_TOKEN(ASYNC); + } + if (memcmp(tok->start, "await", 5) == 0) { + return MAKE_TOKEN(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; + struct token ahead_token; + _PyToken_Init(&ahead_token); + int ahead_tok_kind; + + memcpy(&ahead_tok, tok, sizeof(ahead_tok)); + ahead_tok_kind = + tok_get_normal_mode(&ahead_tok, current_tok, &ahead_token); + + 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; + _PyToken_Free(&ahead_token); + return MAKE_TOKEN(ASYNC); + } + _PyToken_Free(&ahead_token); + } + } + + return MAKE_TOKEN(NAME); + } + + if (c == '\r') { + c = tok_nextc(tok); + } - /* 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 MAKE_TOKEN(ASYNC); - } - if (memcmp(tok->start, "await", 5) == 0) { - return MAKE_TOKEN(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; - struct token ahead_token; - _PyToken_Init(&ahead_token); - int ahead_tok_kind; - - memcpy(&ahead_tok, tok, sizeof(ahead_tok)); - ahead_tok_kind = tok_get_normal_mode(&ahead_tok, - current_tok, - &ahead_token); - - 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; - _PyToken_Free(&ahead_token); - return MAKE_TOKEN(ASYNC); - } - _PyToken_Free(&ahead_token); - } + /* Newline */ + if (c == '\n') { + tok->atbol = 1; + if (blankline || tok->level > 0) { + if (tok->tok_extra_tokens) { + if (tok->comment_newline) { + tok->comment_newline = 0; } - - return MAKE_TOKEN(NAME); + p_start = tok->start; + p_end = tok->cur; + return MAKE_TOKEN(NL); + } + goto nextline; } - - if (c == '\r') { - c = tok_nextc(tok); + if (tok->comment_newline && tok->tok_extra_tokens) { + tok->comment_newline = 0; + p_start = tok->start; + p_end = tok->cur; + return MAKE_TOKEN(NL); + } + 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 MAKE_TOKEN(NEWLINE); + } - /* Newline */ - if (c == '\n') { - tok->atbol = 1; - if (blankline || tok->level > 0) { - if (tok->tok_extra_tokens) { - if (tok->comment_newline) { - tok->comment_newline = 0; - } - p_start = tok->start; - p_end = tok->cur; - return MAKE_TOKEN(NL); - } - goto nextline; - } - if (tok->comment_newline && tok->tok_extra_tokens) { - tok->comment_newline = 0; - p_start = tok->start; - p_end = tok->cur; - return MAKE_TOKEN(NL); - } + /* Period or number starting with period? */ + if (c == '.') { + c = tok_nextc(tok); + if (isdigit(c)) { + goto fraction; + } else if (c == '.') { + c = tok_nextc(tok); + if (c == '.') { 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 MAKE_TOKEN(NEWLINE); + p_end = tok->cur; + return MAKE_TOKEN(ELLIPSIS); + } else { + tok_backup(tok, c); + } + tok_backup(tok, '.'); + } else { + tok_backup(tok, c); } - - /* Period or number starting with period? */ - if (c == '.') { + p_start = tok->start; + p_end = tok->cur; + return MAKE_TOKEN(DOT); + } + + /* Number */ + if (isdigit(c)) { + if (c == '0') { + /* Hex, octal or binary -- maybe. */ + c = tok_nextc(tok); + if (c == 'x' || c == 'X') { + /* Hex */ c = tok_nextc(tok); - if (isdigit(c)) { - goto fraction; - } else if (c == '.') { + do { + if (c == '_') { c = tok_nextc(tok); - if (c == '.') { - p_start = tok->start; - p_end = tok->cur; - return MAKE_TOKEN(ELLIPSIS); - } - else { - tok_backup(tok, c); - } - tok_backup(tok, '.'); - } - else { + } + if (!isxdigit(c)) { tok_backup(tok, c); - } - p_start = tok->start; - p_end = tok->cur; - return MAKE_TOKEN(DOT); - } - - /* Number */ - if (isdigit(c)) { - if (c == '0') { - /* Hex, octal or binary -- maybe. */ + return MAKE_TOKEN(syntaxerror(tok, "invalid hexadecimal literal")); + } + do { c = tok_nextc(tok); - if (c == 'x' || c == 'X') { - /* Hex */ - c = tok_nextc(tok); - do { - if (c == '_') { - c = tok_nextc(tok); - } - if (!isxdigit(c)) { - tok_backup(tok, c); - return MAKE_TOKEN(syntaxerror(tok, "invalid hexadecimal literal")); - } - do { - c = tok_nextc(tok); - } while (isxdigit(c)); - } while (c == '_'); - if (!verify_end_of_number(tok, c, "hexadecimal")) { - return MAKE_TOKEN(ERRORTOKEN); - } - } - else if (c == 'o' || c == 'O') { - /* Octal */ - c = tok_nextc(tok); - do { - if (c == '_') { - c = tok_nextc(tok); - } - if (c < '0' || c >= '8') { - if (isdigit(c)) { - return MAKE_TOKEN(syntaxerror(tok, - "invalid digit '%c' in octal literal", c)); - } - else { - tok_backup(tok, c); - return MAKE_TOKEN(syntaxerror(tok, "invalid octal literal")); - } - } - do { - c = tok_nextc(tok); - } while ('0' <= c && c < '8'); - } while (c == '_'); - if (isdigit(c)) { - return MAKE_TOKEN(syntaxerror(tok, - "invalid digit '%c' in octal literal", c)); - } - if (!verify_end_of_number(tok, c, "octal")) { - return MAKE_TOKEN(ERRORTOKEN); - } - } - else if (c == 'b' || c == 'B') { - /* Binary */ - c = tok_nextc(tok); - do { - if (c == '_') { - c = tok_nextc(tok); - } - if (c != '0' && c != '1') { - if (isdigit(c)) { - return MAKE_TOKEN(syntaxerror(tok, "invalid digit '%c' in binary literal", c)); - } - else { - tok_backup(tok, c); - return MAKE_TOKEN(syntaxerror(tok, "invalid binary literal")); - } - } - do { - c = tok_nextc(tok); - } while (c == '0' || c == '1'); - } while (c == '_'); - if (isdigit(c)) { - return MAKE_TOKEN(syntaxerror(tok, "invalid digit '%c' in binary literal", c)); - } - if (!verify_end_of_number(tok, c, "binary")) { - return MAKE_TOKEN(ERRORTOKEN); - } - } - else { - int nonzero = 0; - /* maybe old-style octal; c is first char of it */ - /* in any case, allow '0' as a literal */ - while (1) { - if (c == '_') { - c = tok_nextc(tok); - if (!isdigit(c)) { - tok_backup(tok, c); - return MAKE_TOKEN(syntaxerror(tok, "invalid decimal literal")); - } - } - if (c != '0') { - break; - } - c = tok_nextc(tok); - } - char* zeros_end = tok->cur; - if (isdigit(c)) { - nonzero = 1; - c = tok_decimal_tail(tok); - if (c == 0) { - return MAKE_TOKEN(ERRORTOKEN); - } - } - if (c == '.') { - c = tok_nextc(tok); - goto fraction; - } - else if (c == 'e' || c == 'E') { - goto exponent; - } - else if (c == 'j' || c == 'J') { - goto imaginary; - } - else if (nonzero && !tok->tok_extra_tokens) { - /* Old-style octal: now disallowed. */ - tok_backup(tok, c); - return MAKE_TOKEN(syntaxerror_known_range( - tok, (int)(tok->start + 1 - tok->line_start), - (int)(zeros_end - tok->line_start), - "leading zeros in decimal integer " - "literals are not permitted; " - "use an 0o prefix for octal integers")); - } - if (!verify_end_of_number(tok, c, "decimal")) { - return MAKE_TOKEN(ERRORTOKEN); - } - } - } - else { - /* Decimal */ - c = tok_decimal_tail(tok); - if (c == 0) { - return MAKE_TOKEN(ERRORTOKEN); - } - { - /* Accept floating point numbers. */ - if (c == '.') { - c = tok_nextc(tok); - fraction: - /* Fraction */ - if (isdigit(c)) { - c = tok_decimal_tail(tok); - if (c == 0) { - return MAKE_TOKEN(ERRORTOKEN); - } - } - } - if (c == 'e' || c == 'E') { - int e; - exponent: - e = c; - /* Exponent part */ - c = tok_nextc(tok); - if (c == '+' || c == '-') { - c = tok_nextc(tok); - if (!isdigit(c)) { - tok_backup(tok, c); - return MAKE_TOKEN(syntaxerror(tok, "invalid decimal literal")); - } - } else if (!isdigit(c)) { - tok_backup(tok, c); - if (!verify_end_of_number(tok, e, "decimal")) { - return MAKE_TOKEN(ERRORTOKEN); - } - tok_backup(tok, e); - p_start = tok->start; - p_end = tok->cur; - return MAKE_TOKEN(NUMBER); - } - c = tok_decimal_tail(tok); - if (c == 0) { - return MAKE_TOKEN(ERRORTOKEN); - } - } - if (c == 'j' || c == 'J') { - /* Imaginary part */ - imaginary: - c = tok_nextc(tok); - if (!verify_end_of_number(tok, c, "imaginary")) { - return MAKE_TOKEN(ERRORTOKEN); - } - } - else if (!verify_end_of_number(tok, c, "decimal")) { - return MAKE_TOKEN(ERRORTOKEN); - } - } + } while (isxdigit(c)); + } while (c == '_'); + if (!verify_end_of_number(tok, c, "hexadecimal")) { + return MAKE_TOKEN(ERRORTOKEN); } - tok_backup(tok, c); - p_start = tok->start; - p_end = tok->cur; - return MAKE_TOKEN(NUMBER); - } - - f_string_quote: - if (((tolower(*tok->start) == 'f' || tolower(*tok->start) == 'r') && (c == '\'' || c == '"'))) { - int quote = c; - int quote_size = 1; /* 1 or 3 */ - - /* Nodes of type STRING, especially multi line strings - must be handled differently in order to get both - the starting line number and the column offset right. - (cf. issue 16806) */ - tok->first_lineno = tok->lineno; - tok->multi_line_start = tok->line_start; - - /* Find the quote size and start of string */ - int after_quote = tok_nextc(tok); - if (after_quote == quote) { - int after_after_quote = tok_nextc(tok); - if (after_after_quote == quote) { - quote_size = 3; - } - else { - // TODO: Check this - tok_backup(tok, after_after_quote); - tok_backup(tok, after_quote); + } else if (c == 'o' || c == 'O') { + /* Octal */ + c = tok_nextc(tok); + do { + if (c == '_') { + c = tok_nextc(tok); + } + if (c < '0' || c >= '8') { + if (isdigit(c)) { + return MAKE_TOKEN( + syntaxerror(tok, "invalid digit '%c' in octal literal", c)); + } else { + tok_backup(tok, c); + return MAKE_TOKEN(syntaxerror(tok, "invalid octal literal")); } + } + do { + c = tok_nextc(tok); + } while ('0' <= c && c < '8'); + } while (c == '_'); + if (isdigit(c)) { + return MAKE_TOKEN( + syntaxerror(tok, "invalid digit '%c' in octal literal", c)); } - if (after_quote != quote) { - tok_backup(tok, after_quote); - } - - - p_start = tok->start; - p_end = tok->cur; - if (tok->tok_mode_stack_index + 1 >= MAXFSTRINGLEVEL) { - return MAKE_TOKEN(syntaxerror(tok, "too many nested f-strings")); - } - tokenizer_mode *the_current_tok = TOK_NEXT_MODE(tok); - the_current_tok->kind = TOK_FSTRING_MODE; - the_current_tok->f_string_quote = quote; - the_current_tok->f_string_quote_size = quote_size; - the_current_tok->f_string_start = tok->start; - the_current_tok->f_string_multi_line_start = tok->line_start; - the_current_tok->f_string_line_start = tok->lineno; - the_current_tok->f_string_start_offset = -1; - the_current_tok->f_string_multi_line_start_offset = -1; - the_current_tok->last_expr_buffer = NULL; - the_current_tok->last_expr_size = 0; - the_current_tok->last_expr_end = -1; - the_current_tok->f_string_debug = 0; - - switch (*tok->start) { - case 'F': - case 'f': - the_current_tok->f_string_raw = tolower(*(tok->start + 1)) == 'r'; - break; - case 'R': - case 'r': - the_current_tok->f_string_raw = 1; - break; - default: - Py_UNREACHABLE(); + if (!verify_end_of_number(tok, c, "octal")) { + return MAKE_TOKEN(ERRORTOKEN); } - - the_current_tok->curly_bracket_depth = 0; - the_current_tok->curly_bracket_expr_start_depth = -1; - return MAKE_TOKEN(FSTRING_START); - } - - letter_quote: - /* String */ - if (c == '\'' || c == '"') { - int quote = c; - int quote_size = 1; /* 1 or 3 */ - int end_quote_size = 0; - - /* Nodes of type STRING, especially multi line strings - must be handled differently in order to get both - the starting line number and the column offset right. - (cf. issue 16806) */ - tok->first_lineno = tok->lineno; - tok->multi_line_start = tok->line_start; - - /* Find the quote size and start of string */ + } else if (c == 'b' || c == 'B') { + /* Binary */ c = tok_nextc(tok); - if (c == quote) { + do { + if (c == '_') { c = tok_nextc(tok); - if (c == quote) { - quote_size = 3; - } - else { - end_quote_size = 1; /* empty string found */ + } + if (c != '0' && c != '1') { + if (isdigit(c)) { + return MAKE_TOKEN( + syntaxerror(tok, "invalid digit '%c' in binary literal", c)); + } else { + tok_backup(tok, c); + return MAKE_TOKEN(syntaxerror(tok, "invalid binary literal")); } + } + do { + c = tok_nextc(tok); + } while (c == '0' || c == '1'); + } while (c == '_'); + if (isdigit(c)) { + return MAKE_TOKEN( + syntaxerror(tok, "invalid digit '%c' in binary literal", c)); } - if (c != quote) { - tok_backup(tok, c); + if (!verify_end_of_number(tok, c, "binary")) { + return MAKE_TOKEN(ERRORTOKEN); } - - /* Get rest of string */ - while (end_quote_size != quote_size) { + } else { + int nonzero = 0; + /* maybe old-style octal; c is first char of it */ + /* in any case, allow '0' as a literal */ + while (1) { + if (c == '_') { c = tok_nextc(tok); - if (tok->done == E_ERROR) { - return MAKE_TOKEN(ERRORTOKEN); - } - if (tok->done == E_DECODE) { - break; - } - if (c == EOF || (quote_size == 1 && c == '\n')) { - assert(tok->multi_line_start != NULL); - // shift the tok_state's location into - // the start of string, and report the error - // from the initial quote character - tok->cur = (char *)tok->start; - tok->cur++; - tok->line_start = tok->multi_line_start; - int start = tok->lineno; - tok->lineno = tok->first_lineno; - - if (INSIDE_FSTRING(tok)) { - /* When we are in an f-string, before raising the - * unterminated string literal error, check whether - * does the initial quote matches with f-strings quotes - * and if it is, then this must be a missing '}' token - * so raise the proper error */ - tokenizer_mode *the_current_tok = TOK_GET_MODE(tok); - if (the_current_tok->f_string_quote == quote && - the_current_tok->f_string_quote_size == quote_size) { - return MAKE_TOKEN(syntaxerror(tok, "f-string: expecting '}'", start)); - } - } - - if (quote_size == 3) { - syntaxerror(tok, "unterminated triple-quoted string literal" - " (detected at line %d)", start); - if (c != '\n') { - tok->done = E_EOFS; - } - return MAKE_TOKEN(ERRORTOKEN); - } - else { - syntaxerror(tok, "unterminated string literal (detected at" - " line %d)", start); - if (c != '\n') { - tok->done = E_EOLS; - } - return MAKE_TOKEN(ERRORTOKEN); - } + if (!isdigit(c)) { + tok_backup(tok, c); + return MAKE_TOKEN(syntaxerror(tok, "invalid decimal literal")); } - if (c == quote) { - end_quote_size += 1; - } - else { - end_quote_size = 0; - if (c == '\\') { - c = tok_nextc(tok); /* skip escaped char */ - if (c == '\r') { - c = tok_nextc(tok); - } - } - } - } - - p_start = tok->start; - p_end = tok->cur; - return MAKE_TOKEN(STRING); - } - - /* Line continuation */ - if (c == '\\') { - if ((c = tok_continuation_line(tok)) == -1) { - return MAKE_TOKEN(ERRORTOKEN); - } - tok->cont_line = 1; - goto again; /* Read next line */ - } - - /* Punctuation character */ - int is_punctuation = (c == ':' || c == '}' || c == '!' || c == '{'); - if (is_punctuation && INSIDE_FSTRING(tok) && INSIDE_FSTRING_EXPR(current_tok)) { - /* This code block gets executed before the curly_bracket_depth is incremented - * by the `{` case, so for ensuring that we are on the 0th level, we need - * to adjust it manually */ - int cursor = current_tok->curly_bracket_depth - (c != '{'); - if (cursor == 0 && !update_fstring_expr(tok, c)) { - return MAKE_TOKEN(ENDMARKER); + } + if (c != '0') { + break; + } + c = tok_nextc(tok); } - if (cursor == 0 && c != '{' && set_fstring_expr(tok, token, c)) { + char *zeros_end = tok->cur; + if (isdigit(c)) { + nonzero = 1; + c = tok_decimal_tail(tok); + if (c == 0) { return MAKE_TOKEN(ERRORTOKEN); + } + } + if (c == '.') { + c = tok_nextc(tok); + goto fraction; + } else if (c == 'e' || c == 'E') { + goto exponent; + } else if (c == 'j' || c == 'J') { + goto imaginary; + } else if (nonzero && !tok->tok_extra_tokens) { + /* Old-style octal: now disallowed. */ + tok_backup(tok, c); + return MAKE_TOKEN(syntaxerror_known_range( + tok, (int)(tok->start + 1 - tok->line_start), + (int)(zeros_end - tok->line_start), + "leading zeros in decimal integer " + "literals are not permitted; " + "use an 0o prefix for octal integers")); + } + if (!verify_end_of_number(tok, c, "decimal")) { + return MAKE_TOKEN(ERRORTOKEN); + } + } + } else { + /* Decimal */ + c = tok_decimal_tail(tok); + if (c == 0) { + return MAKE_TOKEN(ERRORTOKEN); + } + { + /* Accept floating point numbers. */ + if (c == '.') { + c = tok_nextc(tok); + fraction: + /* Fraction */ + if (isdigit(c)) { + c = tok_decimal_tail(tok); + if (c == 0) { + return MAKE_TOKEN(ERRORTOKEN); + } + } } - - if (c == ':' && cursor == current_tok->curly_bracket_expr_start_depth) { - current_tok->kind = TOK_FSTRING_MODE; - p_start = tok->start; - p_end = tok->cur; - return MAKE_TOKEN(_PyToken_OneChar(c)); - } - } - - /* Check for two-character token */ - { - int c2 = tok_nextc(tok); - int current_token = _PyToken_TwoChars(c, c2); - if (current_token != OP) { - int c3 = tok_nextc(tok); - int current_token3 = _PyToken_ThreeChars(c, c2, c3); - if (current_token3 != OP) { - current_token = current_token3; + if (c == 'e' || c == 'E') { + int e; + exponent: + e = c; + /* Exponent part */ + c = tok_nextc(tok); + if (c == '+' || c == '-') { + c = tok_nextc(tok); + if (!isdigit(c)) { + tok_backup(tok, c); + return MAKE_TOKEN(syntaxerror(tok, "invalid decimal literal")); } - else { - tok_backup(tok, c3); + } else if (!isdigit(c)) { + tok_backup(tok, c); + if (!verify_end_of_number(tok, e, "decimal")) { + return MAKE_TOKEN(ERRORTOKEN); } + tok_backup(tok, e); p_start = tok->start; p_end = tok->cur; - return MAKE_TOKEN(current_token); - } - tok_backup(tok, c2); - } - - /* Keep track of parentheses nesting level */ - switch (c) { - case '(': - case '[': - case '{': - if (tok->level >= MAXLEVEL) { - return MAKE_TOKEN(syntaxerror(tok, "too many nested parentheses")); - } - tok->parenstack[tok->level] = c; - tok->parenlinenostack[tok->level] = tok->lineno; - tok->parencolstack[tok->level] = (int)(tok->start - tok->line_start); - tok->level++; - if (INSIDE_FSTRING(tok)) { - current_tok->curly_bracket_depth++; - } - break; - case ')': - case ']': - case '}': - if (INSIDE_FSTRING(tok) && !current_tok->curly_bracket_depth && c == '}') { - return MAKE_TOKEN(syntaxerror(tok, "f-string: single '}' is not allowed")); - } - if (!tok->tok_extra_tokens && !tok->level) { - return MAKE_TOKEN(syntaxerror(tok, "unmatched '%c'", c)); - } - if (tok->level > 0) { - tok->level--; - int opening = tok->parenstack[tok->level]; - if (!tok->tok_extra_tokens && !((opening == '(' && c == ')') || - (opening == '[' && c == ']') || - (opening == '{' && c == '}'))) { - /* If the opening bracket belongs to an f-string's expression - part (e.g. f"{)}") and the closing bracket is an arbitrary - nested expression, then instead of matching a different - syntactical construct with it; we'll throw an unmatched - parentheses error. */ - if (INSIDE_FSTRING(tok) && opening == '{') { - assert(current_tok->curly_bracket_depth >= 0); - int previous_bracket = current_tok->curly_bracket_depth - 1; - if (previous_bracket == current_tok->curly_bracket_expr_start_depth) { - return MAKE_TOKEN(syntaxerror(tok, "f-string: unmatched '%c'", c)); - } - } - if (tok->parenlinenostack[tok->level] != tok->lineno) { - return MAKE_TOKEN(syntaxerror(tok, - "closing parenthesis '%c' does not match " - "opening parenthesis '%c' on line %d", - c, opening, tok->parenlinenostack[tok->level])); - } - else { - return MAKE_TOKEN(syntaxerror(tok, - "closing parenthesis '%c' does not match " - "opening parenthesis '%c'", - c, opening)); - } - } + return MAKE_TOKEN(NUMBER); + } + c = tok_decimal_tail(tok); + if (c == 0) { + return MAKE_TOKEN(ERRORTOKEN); + } } - - if (INSIDE_FSTRING(tok)) { - current_tok->curly_bracket_depth--; - if (c == '}' && current_tok->curly_bracket_depth == current_tok->curly_bracket_expr_start_depth) { - current_tok->curly_bracket_expr_start_depth--; - current_tok->kind = TOK_FSTRING_MODE; - current_tok->f_string_debug = 0; - } + if (c == 'j' || c == 'J') { + /* Imaginary part */ + imaginary: + c = tok_nextc(tok); + if (!verify_end_of_number(tok, c, "imaginary")) { + return MAKE_TOKEN(ERRORTOKEN); + } + } else if (!verify_end_of_number(tok, c, "decimal")) { + return MAKE_TOKEN(ERRORTOKEN); } - break; - default: - break; - } - - if (!Py_UNICODE_ISPRINTABLE(c)) { - return MAKE_TOKEN(syntaxerror(tok, "invalid non-printable character U+%04X", c)); + } } - - if( c == '=' && INSIDE_FSTRING_EXPR(current_tok)) { - current_tok->f_string_debug = 1; - } - - /* Punctuation character */ + tok_backup(tok, c); p_start = tok->start; p_end = tok->cur; - return MAKE_TOKEN(_PyToken_OneChar(c)); -} - -static int -tok_get_fstring_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct token *token) -{ - const char *p_start = NULL; - const char *p_end = NULL; - int end_quote_size = 0; - int unicode_escape = 0; - - tok->start = tok->cur; + return MAKE_TOKEN(NUMBER); + } + +f_string_quote: + if (((tolower(*tok->start) == 'f' || tolower(*tok->start) == 'r') && + (c == '\'' || c == '"'))) { + int quote = c; + int quote_size = 1; /* 1 or 3 */ + + /* Nodes of type STRING, especially multi line strings + must be handled differently in order to get both + the starting line number and the column offset right. + (cf. issue 16806) */ tok->first_lineno = tok->lineno; - tok->starting_col_offset = tok->col_offset; - - // If we start with a bracket, we defer to the normal mode as there is nothing for us to tokenize - // before it. - int start_char = tok_nextc(tok); - if (start_char == '{') { - int peek1 = tok_nextc(tok); - tok_backup(tok, peek1); - tok_backup(tok, start_char); - if (peek1 != '{') { - current_tok->curly_bracket_expr_start_depth++; - if (current_tok->curly_bracket_expr_start_depth >= MAX_EXPR_NESTING) { - return MAKE_TOKEN(syntaxerror(tok, "f-string: expressions nested too deeply")); - } - TOK_GET_MODE(tok)->kind = TOK_REGULAR_MODE; - return tok_get_normal_mode(tok, current_tok, token); - } - } - else { - tok_backup(tok, start_char); - } + tok->multi_line_start = tok->line_start; - // Check if we are at the end of the string - for (int i = 0; i < current_tok->f_string_quote_size; i++) { - int quote = tok_nextc(tok); - if (quote != current_tok->f_string_quote) { - tok_backup(tok, quote); - goto f_string_middle; - } + /* Find the quote size and start of string */ + int after_quote = tok_nextc(tok); + if (after_quote == quote) { + int after_after_quote = tok_nextc(tok); + if (after_after_quote == quote) { + quote_size = 3; + } else { + // TODO: Check this + tok_backup(tok, after_after_quote); + tok_backup(tok, after_quote); + } } - - if (current_tok->last_expr_buffer != NULL) { - PyMem_Free(current_tok->last_expr_buffer); - current_tok->last_expr_buffer = NULL; - current_tok->last_expr_size = 0; - current_tok->last_expr_end = -1; + if (after_quote != quote) { + tok_backup(tok, after_quote); } p_start = tok->start; p_end = tok->cur; - tok->tok_mode_stack_index--; - return MAKE_TOKEN(FSTRING_END); + if (tok->tok_mode_stack_index + 1 >= MAXFSTRINGLEVEL) { + return MAKE_TOKEN(syntaxerror(tok, "too many nested f-strings")); + } + tokenizer_mode *the_current_tok = TOK_NEXT_MODE(tok); + the_current_tok->kind = TOK_FSTRING_MODE; + the_current_tok->f_string_quote = quote; + the_current_tok->f_string_quote_size = quote_size; + the_current_tok->f_string_start = tok->start; + the_current_tok->f_string_multi_line_start = tok->line_start; + the_current_tok->f_string_line_start = tok->lineno; + the_current_tok->f_string_start_offset = -1; + the_current_tok->f_string_multi_line_start_offset = -1; + the_current_tok->last_expr_buffer = NULL; + the_current_tok->last_expr_size = 0; + the_current_tok->last_expr_end = -1; + the_current_tok->f_string_debug = 0; + + switch (*tok->start) { + case 'F': + case 'f': + the_current_tok->f_string_raw = tolower(*(tok->start + 1)) == 'r'; + break; + case 'R': + case 'r': + the_current_tok->f_string_raw = 1; + break; + default: + Py_UNREACHABLE(); + } -f_string_middle: + the_current_tok->curly_bracket_depth = 0; + the_current_tok->curly_bracket_expr_start_depth = -1; + return MAKE_TOKEN(FSTRING_START); + } - // TODO: This is a bit of a hack, but it works for now. We need to find a better way to handle - // this. - tok->multi_line_start = tok->line_start; - while (end_quote_size != current_tok->f_string_quote_size) { - int c = tok_nextc(tok); - if (tok->done == E_ERROR) { - return MAKE_TOKEN(ERRORTOKEN); - } - int in_format_spec = ( - current_tok->last_expr_end != -1 - && - INSIDE_FSTRING_EXPR(current_tok) - ); - - if (c == EOF || (current_tok->f_string_quote_size == 1 && c == '\n')) { - if (tok->decoding_erred) { - return MAKE_TOKEN(ERRORTOKEN); - } +letter_quote: + /* String */ + if (c == '\'' || c == '"') { + int quote = c; + int quote_size = 1; /* 1 or 3 */ + int end_quote_size = 0; - // If we are in a format spec and we found a newline, - // it means that the format spec ends here and we should - // return to the regular mode. - if (in_format_spec && c == '\n') { - tok_backup(tok, c); - TOK_GET_MODE(tok)->kind = TOK_REGULAR_MODE; - p_start = tok->start; - p_end = tok->cur; - return MAKE_TOKEN(FSTRING_MIDDLE); - } + /* Nodes of type STRING, especially multi line strings + must be handled differently in order to get both + the starting line number and the column offset right. + (cf. issue 16806) */ + tok->first_lineno = tok->lineno; + tok->multi_line_start = tok->line_start; - assert(tok->multi_line_start != NULL); - // shift the tok_state's location into - // the start of string, and report the error - // from the initial quote character - tok->cur = (char *)current_tok->f_string_start; - tok->cur++; - tok->line_start = current_tok->f_string_multi_line_start; - int start = tok->lineno; - - tokenizer_mode *the_current_tok = TOK_GET_MODE(tok); - tok->lineno = the_current_tok->f_string_line_start; - - if (current_tok->f_string_quote_size == 3) { - syntaxerror(tok, - "unterminated triple-quoted f-string literal" - " (detected at line %d)", start); - if (c != '\n') { - tok->done = E_EOFS; - } - return MAKE_TOKEN(ERRORTOKEN); - } - else { - return MAKE_TOKEN(syntaxerror(tok, - "unterminated f-string literal (detected at" - " line %d)", start)); - } - } + /* Find the quote size and start of string */ + c = tok_nextc(tok); + if (c == quote) { + c = tok_nextc(tok); + if (c == quote) { + quote_size = 3; + } else { + end_quote_size = 1; /* empty string found */ + } + } + if (c != quote) { + tok_backup(tok, c); + } + + /* Get rest of string */ + while (end_quote_size != quote_size) { + c = tok_nextc(tok); + if (tok->done == E_ERROR) { + return MAKE_TOKEN(ERRORTOKEN); + } + if (tok->done == E_DECODE) { + break; + } + if (c == EOF || (quote_size == 1 && c == '\n')) { + assert(tok->multi_line_start != NULL); + // shift the tok_state's location into + // the start of string, and report the error + // from the initial quote character + tok->cur = (char *)tok->start; + tok->cur++; + tok->line_start = tok->multi_line_start; + int start = tok->lineno; + tok->lineno = tok->first_lineno; - if (c == current_tok->f_string_quote) { - end_quote_size += 1; - continue; + if (INSIDE_FSTRING(tok)) { + /* When we are in an f-string, before raising the + * unterminated string literal error, check whether + * does the initial quote matches with f-strings quotes + * and if it is, then this must be a missing '}' token + * so raise the proper error */ + tokenizer_mode *the_current_tok = TOK_GET_MODE(tok); + if (the_current_tok->f_string_quote == quote && + the_current_tok->f_string_quote_size == quote_size) { + return MAKE_TOKEN( + syntaxerror(tok, "f-string: expecting '}'", start)); + } + } + + if (quote_size == 3) { + syntaxerror(tok, + "unterminated triple-quoted string literal" + " (detected at line %d)", + start); + if (c != '\n') { + tok->done = E_EOFS; + } + return MAKE_TOKEN(ERRORTOKEN); } else { - end_quote_size = 0; - } - - if (c == '{') { - int peek = tok_nextc(tok); - if (peek != '{' || in_format_spec) { - tok_backup(tok, peek); - tok_backup(tok, c); - current_tok->curly_bracket_expr_start_depth++; - if (current_tok->curly_bracket_expr_start_depth >= MAX_EXPR_NESTING) { - return MAKE_TOKEN(syntaxerror(tok, "f-string: expressions nested too deeply")); - } - TOK_GET_MODE(tok)->kind = TOK_REGULAR_MODE; - p_start = tok->start; - p_end = tok->cur; - } else { - p_start = tok->start; - p_end = tok->cur - 1; - } - return MAKE_TOKEN(FSTRING_MIDDLE); - } else if (c == '}') { - if (unicode_escape) { - p_start = tok->start; - p_end = tok->cur; - return MAKE_TOKEN(FSTRING_MIDDLE); - } - int peek = tok_nextc(tok); - - // The tokenizer can only be in the format spec if we have already completed the expression - // scanning (indicated by the end of the expression being set) and we are not at the top level - // of the bracket stack (-1 is the top level). Since format specifiers can't legally use double - // brackets, we can bypass it here. - if (peek == '}' && !in_format_spec) { - p_start = tok->start; - p_end = tok->cur - 1; - } else { - tok_backup(tok, peek); - tok_backup(tok, c); - TOK_GET_MODE(tok)->kind = TOK_REGULAR_MODE; - p_start = tok->start; - p_end = tok->cur; - } - return MAKE_TOKEN(FSTRING_MIDDLE); - } else if (c == '\\') { - int peek = tok_nextc(tok); - if (peek == '\r') { - peek = tok_nextc(tok); - } - // Special case when the backslash is right before a curly - // brace. We have to restore and return the control back - // to the loop for the next iteration. - if (peek == '{' || peek == '}') { - if (!current_tok->f_string_raw) { - if (warn_invalid_escape_sequence(tok, peek)) { - return MAKE_TOKEN(ERRORTOKEN); - } - } - tok_backup(tok, peek); - continue; - } - - if (!current_tok->f_string_raw) { - if (peek == 'N') { - /* Handle named unicode escapes (\N{BULLET}) */ - peek = tok_nextc(tok); - if (peek == '{') { - unicode_escape = 1; - } else { - tok_backup(tok, peek); - } - } - } /* else { - skip the escaped character - }*/ + syntaxerror(tok, + "unterminated string literal (detected at" + " line %d)", + start); + if (c != '\n') { + tok->done = E_EOLS; + } + return MAKE_TOKEN(ERRORTOKEN); + } + } + if (c == quote) { + end_quote_size += 1; + } else { + end_quote_size = 0; + if (c == '\\') { + c = tok_nextc(tok); /* skip escaped char */ + if (c == '\r') { + c = tok_nextc(tok); + } } + } } - // Backup the f-string quotes to emit a final FSTRING_MIDDLE and - // add the quotes to the FSTRING_END in the next tokenizer iteration. - for (int i = 0; i < current_tok->f_string_quote_size; i++) { - tok_backup(tok, current_tok->f_string_quote); - } p_start = tok->start; p_end = tok->cur; - return MAKE_TOKEN(FSTRING_MIDDLE); -} + return MAKE_TOKEN(STRING); + } + + /* Line continuation */ + if (c == '\\') { + if ((c = tok_continuation_line(tok)) == -1) { + return MAKE_TOKEN(ERRORTOKEN); + } + tok->cont_line = 1; + goto again; /* Read next line */ + } + + /* Punctuation character */ + int is_punctuation = (c == ':' || c == '}' || c == '!' || c == '{'); + if (is_punctuation && INSIDE_FSTRING(tok) && + INSIDE_FSTRING_EXPR(current_tok)) { + /* This code block gets executed before the curly_bracket_depth is + * incremented by the `{` case, so for ensuring that we are on the 0th + * level, we need to adjust it manually */ + int cursor = current_tok->curly_bracket_depth - (c != '{'); + int in_format_spec = current_tok->in_format_spec; + int cursor_in_format_with_debug = + cursor == 1 && (current_tok->f_string_debug || in_format_spec); + int cursor_valid = cursor == 0 || cursor_in_format_with_debug; + if (cursor_valid && !update_fstring_expr(tok, c)) { + return MAKE_TOKEN(ENDMARKER); + } + if (cursor_valid && c != '{' && set_fstring_expr(tok, token, c)) { + return MAKE_TOKEN(ERRORTOKEN); + } + + if (c == ':' && cursor == current_tok->curly_bracket_expr_start_depth) { + current_tok->kind = TOK_FSTRING_MODE; + current_tok->in_format_spec = 1; + p_start = tok->start; + p_end = tok->cur; + return MAKE_TOKEN(_PyToken_OneChar(c)); + } + } + + /* Check for two-character token */ + { + int c2 = tok_nextc(tok); + int current_token = _PyToken_TwoChars(c, c2); + if (current_token != OP) { + int c3 = tok_nextc(tok); + int current_token3 = _PyToken_ThreeChars(c, c2, c3); + if (current_token3 != OP) { + current_token = current_token3; + } else { + tok_backup(tok, c3); + } + p_start = tok->start; + p_end = tok->cur; + return MAKE_TOKEN(current_token); + } + tok_backup(tok, c2); + } + + /* Keep track of parentheses nesting level */ + switch (c) { + case '(': + case '[': + case '{': + if (tok->level >= MAXLEVEL) { + return MAKE_TOKEN(syntaxerror(tok, "too many nested parentheses")); + } + tok->parenstack[tok->level] = c; + tok->parenlinenostack[tok->level] = tok->lineno; + tok->parencolstack[tok->level] = (int)(tok->start - tok->line_start); + tok->level++; + if (INSIDE_FSTRING(tok)) { + current_tok->curly_bracket_depth++; + } + break; + case ')': + case ']': + case '}': + if (INSIDE_FSTRING(tok) && !current_tok->curly_bracket_depth && c == '}') { + return MAKE_TOKEN( + syntaxerror(tok, "f-string: single '}' is not allowed")); + } + if (!tok->tok_extra_tokens && !tok->level) { + return MAKE_TOKEN(syntaxerror(tok, "unmatched '%c'", c)); + } + if (tok->level > 0) { + tok->level--; + int opening = tok->parenstack[tok->level]; + if (!tok->tok_extra_tokens && + !((opening == '(' && c == ')') || (opening == '[' && c == ']') || + (opening == '{' && c == '}'))) { + /* If the opening bracket belongs to an f-string's expression + part (e.g. f"{)}") and the closing bracket is an arbitrary + nested expression, then instead of matching a different + syntactical construct with it; we'll throw an unmatched + parentheses error. */ + if (INSIDE_FSTRING(tok) && opening == '{') { + assert(current_tok->curly_bracket_depth >= 0); + int previous_bracket = current_tok->curly_bracket_depth - 1; + if (previous_bracket == current_tok->curly_bracket_expr_start_depth) { + return MAKE_TOKEN(syntaxerror(tok, "f-string: unmatched '%c'", c)); + } + } + if (tok->parenlinenostack[tok->level] != tok->lineno) { + return MAKE_TOKEN( + syntaxerror(tok, + "closing parenthesis '%c' does not match " + "opening parenthesis '%c' on line %d", + c, opening, tok->parenlinenostack[tok->level])); + } else { + return MAKE_TOKEN( + syntaxerror(tok, + "closing parenthesis '%c' does not match " + "opening parenthesis '%c'", + c, opening)); + } + } + } + + if (INSIDE_FSTRING(tok)) { + current_tok->curly_bracket_depth--; + if (current_tok->curly_bracket_depth < 0) { + return MAKE_TOKEN(syntaxerror(tok, "f-string: unmatched '%c'", c)); + } + if (c == '}' && current_tok->curly_bracket_depth == + current_tok->curly_bracket_expr_start_depth) { + current_tok->curly_bracket_expr_start_depth--; + current_tok->kind = TOK_FSTRING_MODE; + current_tok->in_format_spec = 0; + current_tok->f_string_debug = 0; + } + } + break; + default: + break; + } + + if (!Py_UNICODE_ISPRINTABLE(c)) { + return MAKE_TOKEN( + syntaxerror(tok, "invalid non-printable character U+%04X", c)); + } + + if (c == '=' && INSIDE_FSTRING_EXPR(current_tok)) { + current_tok->f_string_debug = 1; + } + + /* Punctuation character */ + p_start = tok->start; + p_end = tok->cur; + return MAKE_TOKEN(_PyToken_OneChar(c)); +} + +static int tok_get_fstring_mode(struct tok_state *tok, + tokenizer_mode *current_tok, + struct token *token) { + const char *p_start = NULL; + const char *p_end = NULL; + int end_quote_size = 0; + int unicode_escape = 0; + + tok->start = tok->cur; + tok->first_lineno = tok->lineno; + tok->starting_col_offset = tok->col_offset; + + // If we start with a bracket, we defer to the normal mode as there is nothing + // for us to tokenize before it. + int start_char = tok_nextc(tok); + if (start_char == '{') { + int peek1 = tok_nextc(tok); + tok_backup(tok, peek1); + tok_backup(tok, start_char); + if (peek1 != '{') { + current_tok->curly_bracket_expr_start_depth++; + if (current_tok->curly_bracket_expr_start_depth >= MAX_EXPR_NESTING) { + return MAKE_TOKEN( + syntaxerror(tok, "f-string: expressions nested too deeply")); + } + TOK_GET_MODE(tok)->kind = TOK_REGULAR_MODE; + return tok_get_normal_mode(tok, current_tok, token); + } + } else { + tok_backup(tok, start_char); + } + + // Check if we are at the end of the string + for (int i = 0; i < current_tok->f_string_quote_size; i++) { + int quote = tok_nextc(tok); + if (quote != current_tok->f_string_quote) { + tok_backup(tok, quote); + goto f_string_middle; + } + } + + if (current_tok->last_expr_buffer != NULL) { + PyMem_Free(current_tok->last_expr_buffer); + current_tok->last_expr_buffer = NULL; + current_tok->last_expr_size = 0; + current_tok->last_expr_end = -1; + } + + p_start = tok->start; + p_end = tok->cur; + tok->tok_mode_stack_index--; + return MAKE_TOKEN(FSTRING_END); +f_string_middle: -static int -tok_get(struct tok_state *tok, struct token *token) -{ - tokenizer_mode *current_tok = TOK_GET_MODE(tok); - if (current_tok->kind == TOK_REGULAR_MODE) { - return tok_get_normal_mode(tok, current_tok, token); - } else { - return tok_get_fstring_mode(tok, current_tok, token); + // TODO: This is a bit of a hack, but it works for now. We need to find a + // better way to handle this. + tok->multi_line_start = tok->line_start; + while (end_quote_size != current_tok->f_string_quote_size) { + int c = tok_nextc(tok); + if (tok->done == E_ERROR || tok->done == E_DECODE) { + return MAKE_TOKEN(ERRORTOKEN); } -} + int in_format_spec = + (current_tok->in_format_spec && INSIDE_FSTRING_EXPR(current_tok)); -int -_PyTokenizer_Get(struct tok_state *tok, struct token *token) -{ - int result = tok_get(tok, token); - if (tok->decoding_erred) { - result = ERRORTOKEN; - tok->done = E_DECODE; + if (c == EOF || (current_tok->f_string_quote_size == 1 && c == '\n')) { + if (tok->decoding_erred) { + return MAKE_TOKEN(ERRORTOKEN); + } + + // If we are in a format spec and we found a newline, + // it means that the format spec ends here and we should + // return to the regular mode. + if (in_format_spec && c == '\n') { + tok_backup(tok, c); + TOK_GET_MODE(tok)->kind = TOK_REGULAR_MODE; + current_tok->in_format_spec = 0; + p_start = tok->start; + p_end = tok->cur; + return MAKE_TOKEN(FSTRING_MIDDLE); + } + + assert(tok->multi_line_start != NULL); + // shift the tok_state's location into + // the start of string, and report the error + // from the initial quote character + tok->cur = (char *)current_tok->f_string_start; + tok->cur++; + tok->line_start = current_tok->f_string_multi_line_start; + int start = tok->lineno; + + tokenizer_mode *the_current_tok = TOK_GET_MODE(tok); + tok->lineno = the_current_tok->f_string_line_start; + + if (current_tok->f_string_quote_size == 3) { + syntaxerror(tok, + "unterminated triple-quoted f-string literal" + " (detected at line %d)", + start); + if (c != '\n') { + tok->done = E_EOFS; + } + return MAKE_TOKEN(ERRORTOKEN); + } else { + return MAKE_TOKEN( + syntaxerror(tok, + "unterminated f-string literal (detected at" + " line %d)", + start)); + } + } + + if (c == current_tok->f_string_quote) { + end_quote_size += 1; + continue; + } else { + end_quote_size = 0; } - return result; + + if (c == '{') { + if (!update_fstring_expr(tok, c)) { + return MAKE_TOKEN(ENDMARKER); + } + int peek = tok_nextc(tok); + if (peek != '{' || in_format_spec) { + tok_backup(tok, peek); + tok_backup(tok, c); + current_tok->curly_bracket_expr_start_depth++; + if (current_tok->curly_bracket_expr_start_depth >= MAX_EXPR_NESTING) { + return MAKE_TOKEN( + syntaxerror(tok, "f-string: expressions nested too deeply")); + } + TOK_GET_MODE(tok)->kind = TOK_REGULAR_MODE; + current_tok->in_format_spec = 0; + p_start = tok->start; + p_end = tok->cur; + } else { + p_start = tok->start; + p_end = tok->cur - 1; + } + return MAKE_TOKEN(FSTRING_MIDDLE); + } else if (c == '}') { + if (unicode_escape) { + p_start = tok->start; + p_end = tok->cur; + return MAKE_TOKEN(FSTRING_MIDDLE); + } + int peek = tok_nextc(tok); + + // The tokenizer can only be in the format spec if we have already + // completed the expression scanning (indicated by the end of the + // expression being set) and we are not at the top level of the bracket + // stack (-1 is the top level). Since format specifiers can't legally use + // double brackets, we can bypass it here. + int cursor = current_tok->curly_bracket_depth; + if (peek == '}' && !in_format_spec && cursor == 0) { + p_start = tok->start; + p_end = tok->cur - 1; + } else { + tok_backup(tok, peek); + tok_backup(tok, c); + TOK_GET_MODE(tok)->kind = TOK_REGULAR_MODE; + p_start = tok->start; + p_end = tok->cur; + } + return MAKE_TOKEN(FSTRING_MIDDLE); + } else if (c == '\\') { + int peek = tok_nextc(tok); + if (peek == '\r') { + peek = tok_nextc(tok); + } + // Special case when the backslash is right before a curly + // brace. We have to restore and return the control back + // to the loop for the next iteration. + if (peek == '{' || peek == '}') { + if (!current_tok->f_string_raw) { + if (warn_invalid_escape_sequence(tok, peek)) { + return MAKE_TOKEN(ERRORTOKEN); + } + } + tok_backup(tok, peek); + continue; + } + + if (!current_tok->f_string_raw) { + if (peek == 'N') { + /* Handle named unicode escapes (\N{BULLET}) */ + peek = tok_nextc(tok); + if (peek == '{') { + unicode_escape = 1; + } else { + tok_backup(tok, peek); + } + } + } /* else { + skip the escaped character + }*/ + } + } + + // Backup the f-string quotes to emit a final FSTRING_MIDDLE and + // add the quotes to the FSTRING_END in the next tokenizer iteration. + for (int i = 0; i < current_tok->f_string_quote_size; i++) { + tok_backup(tok, current_tok->f_string_quote); + } + p_start = tok->start; + p_end = tok->cur; + return MAKE_TOKEN(FSTRING_MIDDLE); +} + +static int tok_get(struct tok_state *tok, struct token *token) { + tokenizer_mode *current_tok = TOK_GET_MODE(tok); + if (current_tok->kind == TOK_REGULAR_MODE) { + return tok_get_normal_mode(tok, current_tok, token); + } else { + return tok_get_fstring_mode(tok, current_tok, token); + } +} + +int _PyTokenizer_Get(struct tok_state *tok, struct token *token) { + int result = tok_get(tok, token); + if (tok->decoding_erred) { + result = ERRORTOKEN; + tok->done = E_DECODE; + } + return result; } -#if defined(__wasi__) || (defined(__EMSCRIPTEN__) && (__EMSCRIPTEN_major__ >= 3)) +#if defined(__wasi__) || \ + (defined(__EMSCRIPTEN__) && (__EMSCRIPTEN_major__ >= 3)) // fdopen() with borrowed fd. WASI does not provide dup() and Emscripten's // dup() emulation with open() is slow. typedef union { - void *cookie; - int fd; + void *cookie; + int fd; } borrowed; -static ssize_t -borrow_read(void *cookie, char *buf, size_t size) -{ - borrowed b = {.cookie = cookie}; - return read(b.fd, (void *)buf, size); +static ssize_t borrow_read(void *cookie, char *buf, size_t size) { + borrowed b = {.cookie = cookie}; + return read(b.fd, (void *)buf, size); } -static FILE * -fdopen_borrow(int fd) { - // supports only reading. seek fails. close and write are no-ops. - cookie_io_functions_t io_cb = {borrow_read, NULL, NULL, NULL}; - borrowed b = {.fd = fd}; - return fopencookie(b.cookie, "r", io_cb); +static FILE *fdopen_borrow(int fd) { + // supports only reading. seek fails. close and write are no-ops. + cookie_io_functions_t io_cb = {borrow_read, NULL, NULL, NULL}; + borrowed b = {.fd = fd}; + return fopencookie(b.cookie, "r", io_cb); } #else -static FILE * -fdopen_borrow(int fd) { - fd = _Py_dup(fd); - if (fd < 0) { - return NULL; - } - return fdopen(fd, "r"); +static FILE *fdopen_borrow(int fd) { + fd = _Py_dup(fd); + if (fd < 0) { + return NULL; + } + return fdopen(fd, "r"); } #endif @@ -3023,59 +2907,54 @@ fdopen_borrow(int fd) { The char* returned is malloc'ed via PyMem_Malloc() and thus must be freed by the caller. */ -char * -_PyTokenizer_FindEncodingFilename(int fd, PyObject *filename) -{ - struct tok_state *tok; - FILE *fp; - char *encoding = NULL; - - fp = fdopen_borrow(fd); - if (fp == NULL) { - return NULL; - } - tok = _PyTokenizer_FromFile(fp, NULL, NULL, NULL); - if (tok == NULL) { - fclose(fp); - return NULL; - } - if (filename != NULL) { - tok->filename = Py_NewRef(filename); - } - else { - tok->filename = PyUnicode_FromString(""); - if (tok->filename == NULL) { - fclose(fp); - _PyTokenizer_Free(tok); - return encoding; - } - } - struct token token; - // We don't want to report warnings here because it could cause infinite recursion - // if fetching the encoding shows a warning. - tok->report_warnings = 0; - while (tok->lineno < 2 && tok->done == E_OK) { - _PyToken_Init(&token); - _PyTokenizer_Get(tok, &token); - _PyToken_Free(&token); - } +char *_PyTokenizer_FindEncodingFilename(int fd, PyObject *filename) { + struct tok_state *tok; + FILE *fp; + char *encoding = NULL; + + fp = fdopen_borrow(fd); + if (fp == NULL) { + return NULL; + } + tok = _PyTokenizer_FromFile(fp, NULL, NULL, NULL); + if (tok == NULL) { fclose(fp); - if (tok->encoding) { - encoding = (char *)PyMem_Malloc(strlen(tok->encoding) + 1); - if (encoding) { - strcpy(encoding, tok->encoding); - } - } - _PyTokenizer_Free(tok); - return encoding; + return NULL; + } + if (filename != NULL) { + tok->filename = Py_NewRef(filename); + } else { + tok->filename = PyUnicode_FromString(""); + if (tok->filename == NULL) { + fclose(fp); + _PyTokenizer_Free(tok); + return encoding; + } + } + struct token token; + // We don't want to report warnings here because it could cause infinite + // recursion if fetching the encoding shows a warning. + tok->report_warnings = 0; + while (tok->lineno < 2 && tok->done == E_OK) { + _PyToken_Init(&token); + _PyTokenizer_Get(tok, &token); + _PyToken_Free(&token); + } + fclose(fp); + if (tok->encoding) { + encoding = (char *)PyMem_Malloc(strlen(tok->encoding) + 1); + if (encoding) { + strcpy(encoding, tok->encoding); + } + } + _PyTokenizer_Free(tok); + return encoding; } #ifdef Py_DEBUG -void -tok_dump(int type, char *start, char *end) -{ - fprintf(stderr, "%s", _PyParser_TokenNames[type]); - if (type == NAME || type == NUMBER || type == STRING || type == OP) - fprintf(stderr, "(%.*s)", (int)(end - start), start); +void tok_dump(int type, char *start, char *end) { + fprintf(stderr, "%s", _PyParser_TokenNames[type]); + if (type == NAME || type == NUMBER || type == STRING || type == OP) + fprintf(stderr, "(%.*s)", (int)(end - start), start); } -#endif // Py_DEBUG +#endif // Py_DEBUG diff --git a/Parser/tokenizer.h b/Parser/tokenizer.h index 1e1daa36..4eeeb1f2 100644 --- a/Parser/tokenizer.h +++ b/Parser/tokenizer.h @@ -14,133 +14,136 @@ extern "C" { #define MAXLEVEL 200 /* Max parentheses level */ #define MAXFSTRINGLEVEL 150 /* Max f-string nesting level */ -enum decoding_state { - STATE_INIT, - STATE_SEEK_CODING, - STATE_NORMAL -}; +enum decoding_state { STATE_INIT, STATE_SEEK_CODING, STATE_NORMAL }; enum interactive_underflow_t { - /* Normal mode of operation: return a new token when asked in interactive mode */ - IUNDERFLOW_NORMAL, - /* Forcefully return ENDMARKER when asked for a new token in interactive mode. This - * can be used to prevent the tokenizer to prompt the user for new tokens */ - IUNDERFLOW_STOP, + /* Normal mode of operation: return a new token when asked in interactive mode + */ + IUNDERFLOW_NORMAL, + /* Forcefully return ENDMARKER when asked for a new token in interactive mode. + * This can be used to prevent the tokenizer to prompt the user for new tokens + */ + IUNDERFLOW_STOP, }; struct token { - int level; - int lineno, col_offset, end_lineno, end_col_offset; - const char *start, *end; - PyObject *metadata; + int level; + int lineno, col_offset, end_lineno, end_col_offset; + const char *start, *end; + PyObject *metadata; }; enum tokenizer_mode_kind_t { - TOK_REGULAR_MODE, - TOK_FSTRING_MODE, + TOK_REGULAR_MODE, + TOK_FSTRING_MODE, }; #define MAX_EXPR_NESTING 3 typedef struct _tokenizer_mode { - enum tokenizer_mode_kind_t kind; - - int curly_bracket_depth; - int curly_bracket_expr_start_depth; - - char f_string_quote; - int f_string_quote_size; - int f_string_raw; - const char* f_string_start; - const char* f_string_multi_line_start; - int f_string_line_start; - - Py_ssize_t f_string_start_offset; - Py_ssize_t f_string_multi_line_start_offset; - - Py_ssize_t last_expr_size; - Py_ssize_t last_expr_end; - char* last_expr_buffer; - int f_string_debug; + enum tokenizer_mode_kind_t kind; + + int curly_bracket_depth; + int curly_bracket_expr_start_depth; + + char f_string_quote; + int f_string_quote_size; + int f_string_raw; + const char *f_string_start; + const char *f_string_multi_line_start; + int f_string_line_start; + + Py_ssize_t f_string_start_offset; + Py_ssize_t f_string_multi_line_start_offset; + + Py_ssize_t last_expr_size; + Py_ssize_t last_expr_end; + char *last_expr_buffer; + int f_string_debug; + int in_format_spec; } tokenizer_mode; /* Tokenizer state */ struct tok_state { - /* Input state; buf <= cur <= inp <= end */ - /* NB an entire line is held in the buffer */ - char *buf; /* Input buffer, or NULL; malloc'ed if fp != NULL or readline != NULL */ - char *cur; /* Next character in buffer */ - char *inp; /* End of data in buffer */ - int fp_interactive; /* If the file descriptor is interactive */ - char *interactive_src_start; /* The start of the source parsed so far in interactive mode */ - char *interactive_src_end; /* The end of the source parsed so far in interactive mode */ - const char *end; /* End of input buffer if buf != NULL */ - const char *start; /* Start of current token if not NULL */ - int done; /* E_OK normally, E_EOF at EOF, otherwise error code */ - /* NB If done != E_OK, cur must be == inp!!! */ - FILE *fp; /* Rest of input; NULL if tokenizing a string */ - int tabsize; /* Tab spacing */ - int indent; /* Current indentation index */ - int indstack[MAXINDENT]; /* Stack of indents */ - int atbol; /* Nonzero if at begin of new line */ - int pendin; /* Pending indents (if > 0) or dedents (if < 0) */ - const char *prompt, *nextprompt; /* For interactive prompting */ - int lineno; /* Current line number */ - int first_lineno; /* First line of a single line or multi line string - expression (cf. issue 16806) */ - int starting_col_offset; /* The column offset at the beginning of a token */ - int col_offset; /* Current col offset */ - int level; /* () [] {} Parentheses nesting level */ - /* Used to allow free continuations inside them */ - char parenstack[MAXLEVEL]; - int parenlinenostack[MAXLEVEL]; - int parencolstack[MAXLEVEL]; - PyObject *filename; - /* Stuff for checking on different tab sizes */ - int altindstack[MAXINDENT]; /* Stack of alternate indents */ - /* Stuff for PEP 0263 */ - enum decoding_state decoding_state; - int decoding_erred; /* whether erred in decoding */ - char *encoding; /* Source encoding. */ - int cont_line; /* whether we are in a continuation line. */ - const char* line_start; /* pointer to start of current line */ - const char* multi_line_start; /* pointer to start of first line of - a single line or multi line string - expression (cf. issue 16806) */ - PyObject *decoding_readline; /* open(...).readline */ - PyObject *decoding_buffer; - PyObject *readline; /* readline() function */ - const char* enc; /* Encoding for the current str. */ - char* str; /* Source string being tokenized (if tokenizing from a string)*/ - 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. */ - /* How to proceed when asked for a new token in interactive mode */ - enum interactive_underflow_t interactive_underflow; - int report_warnings; - // TODO: Factor this into its own thing - tokenizer_mode tok_mode_stack[MAXFSTRINGLEVEL]; - int tok_mode_stack_index; - int tok_extra_tokens; - int comment_newline; - int implicit_newline; + /* Input state; buf <= cur <= inp <= end */ + /* NB an entire line is held in the buffer */ + char *buf; /* Input buffer, or NULL; malloc'ed if fp != NULL or readline != + NULL */ + char *cur; /* Next character in buffer */ + char *inp; /* End of data in buffer */ + int fp_interactive; /* If the file descriptor is interactive */ + char *interactive_src_start; /* The start of the source parsed so far in + interactive mode */ + char *interactive_src_end; /* The end of the source parsed so far in + interactive mode */ + const char *end; /* End of input buffer if buf != NULL */ + const char *start; /* Start of current token if not NULL */ + int done; /* E_OK normally, E_EOF at EOF, otherwise error code */ + /* NB If done != E_OK, cur must be == inp!!! */ + FILE *fp; /* Rest of input; NULL if tokenizing a string */ + int tabsize; /* Tab spacing */ + int indent; /* Current indentation index */ + int indstack[MAXINDENT]; /* Stack of indents */ + int atbol; /* Nonzero if at begin of new line */ + int pendin; /* Pending indents (if > 0) or dedents (if < 0) */ + const char *prompt, *nextprompt; /* For interactive prompting */ + int lineno; /* Current line number */ + int first_lineno; /* First line of a single line or multi line string + expression (cf. issue 16806) */ + int starting_col_offset; /* The column offset at the beginning of a token */ + int col_offset; /* Current col offset */ + int level; /* () [] {} Parentheses nesting level */ + /* Used to allow free continuations inside them */ + char parenstack[MAXLEVEL]; + int parenlinenostack[MAXLEVEL]; + int parencolstack[MAXLEVEL]; + PyObject *filename; + /* Stuff for checking on different tab sizes */ + int altindstack[MAXINDENT]; /* Stack of alternate indents */ + /* Stuff for PEP 0263 */ + enum decoding_state decoding_state; + int decoding_erred; /* whether erred in decoding */ + char *encoding; /* Source encoding. */ + int cont_line; /* whether we are in a continuation line. */ + const char *line_start; /* pointer to start of current line */ + const char *multi_line_start; /* pointer to start of first line of + a single line or multi line string + expression (cf. issue 16806) */ + PyObject *decoding_readline; /* open(...).readline */ + PyObject *decoding_buffer; + PyObject *readline; /* readline() function */ + const char *enc; /* Encoding for the current str. */ + char *str; /* Source string being tokenized (if tokenizing from a string)*/ + 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. */ + /* How to proceed when asked for a new token in interactive mode */ + enum interactive_underflow_t interactive_underflow; + int report_warnings; + // TODO: Factor this into its own thing + tokenizer_mode tok_mode_stack[MAXFSTRINGLEVEL]; + int tok_mode_stack_index; + int tok_extra_tokens; + int comment_newline; + int implicit_newline; #ifdef Py_DEBUG - int debug; + int debug; #endif }; extern struct tok_state *_PyTokenizer_FromString(const char *, int, int); extern struct tok_state *_PyTokenizer_FromUTF8(const char *, int, int); -extern struct tok_state *_PyTokenizer_FromReadline(PyObject*, const char*, int, int); -extern struct tok_state *_PyTokenizer_FromFile(FILE *, const char*, - const char *, const char *); +extern struct tok_state *_PyTokenizer_FromReadline(PyObject *, const char *, + int, int); +extern struct tok_state *_PyTokenizer_FromFile(FILE *, const char *, + const char *, const char *); extern void _PyTokenizer_Free(struct tok_state *); extern void _PyToken_Free(struct token *); extern void _PyToken_Init(struct token *); diff --git a/Programs/_freeze_module.c b/Programs/_freeze_module.c index e55f1d56..c669d96c 100644 --- a/Programs/_freeze_module.c +++ b/Programs/_freeze_module.c @@ -123,6 +123,9 @@ static PyObject * compile_and_marshal(const char *name, const char *text) { char *filename = (char *) malloc(strlen(name) + 10); + if (filename == NULL) { + return PyErr_NoMemory(); + } sprintf(filename, "", name); PyObject *code = Py_CompileStringExFlags(text, filename, Py_file_input, NULL, 0); @@ -146,6 +149,9 @@ get_varname(const char *name, const char *prefix) { size_t n = strlen(prefix); char *varname = (char *) malloc(strlen(name) + n + 1); + if (varname == NULL) { + return NULL; + } (void)strcpy(varname, prefix); for (size_t i = 0; name[i] != '\0'; i++) { if (name[i] == '.') { @@ -191,6 +197,11 @@ write_frozen(const char *outpath, const char *inpath, const char *name, fprintf(outfile, "%s\n", header); char *arrayname = get_varname(name, "_Py_M__"); + if (arrayname == NULL) { + fprintf(stderr, "memory error: could not allocate varname\n"); + fclose(outfile); + return -1; + } write_code(outfile, marshalled, arrayname); free(arrayname); diff --git a/Programs/_testembed.c b/Programs/_testembed.c index f78ba41f..1386153a 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -163,15 +163,23 @@ PyInit_embedded_ext(void) static int test_repeated_init_exec(void) { if (main_argc < 3) { - fprintf(stderr, "usage: %s test_repeated_init_exec CODE\n", PROGRAM); + fprintf(stderr, + "usage: %s test_repeated_init_exec CODE ...\n", PROGRAM); exit(1); } const char *code = main_argv[2]; + int loops = main_argc > 3 + ? main_argc - 2 + : INIT_LOOPS; - for (int i=1; i <= INIT_LOOPS; i++) { - fprintf(stderr, "--- Loop #%d ---\n", i); + for (int i=0; i < loops; i++) { + fprintf(stderr, "--- Loop #%d ---\n", i+1); fflush(stderr); + if (main_argc > 3) { + code = main_argv[i+2]; + } + _testembed_Py_InitializeFromConfig(); int err = PyRun_SimpleString(code); Py_Finalize(); diff --git a/Programs/test_frozenmain.h b/Programs/test_frozenmain.h index cd9d1032..17a87d9a 100644 --- a/Programs/test_frozenmain.h +++ b/Programs/test_frozenmain.h @@ -26,13 +26,12 @@ unsigned char M_test_frozenmain[] = { 103,101,116,95,99,111,110,102,105,103,115,114,3,0,0,0, 218,3,107,101,121,169,0,243,0,0,0,0,250,18,116,101, 115,116,95,102,114,111,122,101,110,109,97,105,110,46,112,121, - 250,8,60,109,111,100,117,108,101,62,114,18,0,0,0,1, - 0,0,0,115,102,0,0,0,240,3,1,1,1,243,8,0, + 218,8,60,109,111,100,117,108,101,62,114,18,0,0,0,1, + 0,0,0,115,97,0,0,0,240,3,1,1,1,243,8,0, 1,11,219,0,24,225,0,5,208,6,26,212,0,27,217,0, 5,128,106,144,35,151,40,145,40,212,0,27,216,9,38,208, 9,26,215,9,38,209,9,38,211,9,40,168,24,209,9,50, - 128,6,240,2,6,12,2,242,0,7,1,42,128,67,241,14, - 0,5,10,136,71,144,67,144,53,152,2,152,54,160,35,153, - 59,152,45,208,10,40,213,4,41,241,15,7,1,42,114,16, - 0,0,0, + 128,6,243,2,6,12,2,128,67,241,14,0,5,10,136,71, + 144,67,144,53,152,2,152,54,160,35,153,59,152,45,208,10, + 40,213,4,41,241,15,6,12,2,114,16,0,0,0, }; diff --git a/Python/Python-ast.c b/Python/Python-ast.c index ecaff204..3d5aeff8 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -863,14 +863,15 @@ ast_type_init(PyObject *self, PyObject *args, PyObject *kw) Py_ssize_t i, numfields = 0; int res = -1; PyObject *key, *value, *fields; - if (_PyObject_LookupAttr((PyObject*)Py_TYPE(self), state->_fields, &fields) < 0) { + + fields = PyObject_GetAttr((PyObject*)Py_TYPE(self), state->_fields); + if (fields == NULL) { goto cleanup; } - if (fields) { - numfields = PySequence_Size(fields); - if (numfields == -1) { - goto cleanup; - } + + numfields = PySequence_Size(fields); + if (numfields == -1) { + goto cleanup; } res = 0; /* if no error occurs, this stays 0 to the end */ diff --git a/Python/Python-tokenize.c b/Python/Python-tokenize.c index 664e7d8a..baad836d 100644 --- a/Python/Python-tokenize.c +++ b/Python/Python-tokenize.c @@ -35,6 +35,7 @@ typedef struct /* Needed to cache line for performance */ PyObject *last_line; Py_ssize_t last_lineno; + Py_ssize_t last_end_lineno; Py_ssize_t byte_col_offset_diff; } tokenizeriterobject; @@ -76,6 +77,7 @@ tokenizeriter_new_impl(PyTypeObject *type, PyObject *readline, self->last_line = NULL; self->byte_col_offset_diff = 0; self->last_lineno = 0; + self->last_end_lineno = 0; return (PyObject *)self; } @@ -212,6 +214,7 @@ tokenizeriter_next(tokenizeriterobject *it) const char *line_start = ISSTRINGLIT(type) ? it->tok->multi_line_start : it->tok->line_start; PyObject* line = NULL; + int line_changed = 1; if (it->tok->tok_extra_tokens && is_trailing_token) { line = PyUnicode_FromString(""); } else { @@ -230,6 +233,7 @@ tokenizeriter_next(tokenizeriterobject *it) } else { // Line hasn't changed so we reuse the cached one. line = it->last_line; + line_changed = 0; } } if (line == NULL) { @@ -240,13 +244,20 @@ tokenizeriter_next(tokenizeriterobject *it) Py_ssize_t lineno = ISSTRINGLIT(type) ? it->tok->first_lineno : it->tok->lineno; Py_ssize_t end_lineno = it->tok->lineno; it->last_lineno = lineno; + it->last_end_lineno = end_lineno; Py_ssize_t col_offset = -1; Py_ssize_t end_col_offset = -1; Py_ssize_t byte_offset = -1; if (token.start != NULL && token.start >= line_start) { byte_offset = token.start - line_start; - col_offset = byte_offset - it->byte_col_offset_diff; + if (line_changed) { + col_offset = _PyPegen_byte_offset_to_character_offset_line(line, 0, byte_offset); + it->byte_col_offset_diff = byte_offset - col_offset; + } + else { + col_offset = byte_offset - it->byte_col_offset_diff; + } } if (token.end != NULL && token.end >= it->tok->line_start) { Py_ssize_t end_byte_offset = token.end - it->tok->line_start; diff --git a/Python/ast_opt.c b/Python/ast_opt.c index e881b7fe..e8a53786 100644 --- a/Python/ast_opt.c +++ b/Python/ast_opt.c @@ -275,10 +275,9 @@ parse_literal(PyObject *fmt, Py_ssize_t *ppos, PyArena *arena) PyObject *str = PyUnicode_Substring(fmt, start, pos); /* str = str.replace('%%', '%') */ if (str && has_percents) { - _Py_DECLARE_STR(percent, "%"); _Py_DECLARE_STR(dbl_percent, "%%"); Py_SETREF(str, PyUnicode_Replace(str, &_Py_STR(dbl_percent), - &_Py_STR(percent), -1)); + _Py_LATIN1_CHR('%'), -1)); } if (!str) { return NULL; diff --git a/Python/ast_unparse.c b/Python/ast_unparse.c index 8aff0451..10e9d9b7 100644 --- a/Python/ast_unparse.c +++ b/Python/ast_unparse.c @@ -10,9 +10,7 @@ * See ast.unparse for a full unparser (written in Python) */ -_Py_DECLARE_STR(open_br, "{"); _Py_DECLARE_STR(dbl_open_br, "{{"); -_Py_DECLARE_STR(close_br, "}"); _Py_DECLARE_STR(dbl_close_br, "}}"); /* We would statically initialize this if doing so were simple enough. */ @@ -580,11 +578,13 @@ escape_braces(PyObject *orig) { PyObject *temp; PyObject *result; - temp = PyUnicode_Replace(orig, &_Py_STR(open_br), &_Py_STR(dbl_open_br), -1); + temp = PyUnicode_Replace(orig, _Py_LATIN1_CHR('{'), + &_Py_STR(dbl_open_br), -1); if (!temp) { return NULL; } - result = PyUnicode_Replace(temp, &_Py_STR(close_br), &_Py_STR(dbl_close_br), -1); + result = PyUnicode_Replace(temp, _Py_LATIN1_CHR('}'), + &_Py_STR(dbl_close_br), -1); Py_DECREF(temp); return result; } @@ -678,7 +678,7 @@ append_formattedvalue(_PyUnicodeWriter *writer, expr_ty e) if (!temp_fv_str) { return -1; } - if (PyUnicode_Find(temp_fv_str, &_Py_STR(open_br), 0, 1, 1) == 0) { + if (PyUnicode_Find(temp_fv_str, _Py_LATIN1_CHR('{'), 0, 1, 1) == 0) { /* Expression starts with a brace, split it with a space from the outer one. */ outer_brace = "{ "; diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 84fbc33a..1a65ddd0 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -2559,8 +2559,8 @@ builtin_sum_impl(PyObject *module, PyObject *iterable, PyObject *start) b = PyLong_AsLongAndOverflow(item, &overflow); } if (overflow == 0 && - (i_result >= 0 ? (b <= LONG_MAX - i_result) - : (b >= LONG_MIN - i_result))) + (i_result >= 0 ? (b <= PY_SSIZE_T_MAX - i_result) + : (b >= PY_SSIZE_T_MIN - i_result))) { i_result += b; Py_DECREF(item); diff --git a/Python/bytecodes.c b/Python/bytecodes.c index e17b2294..b307edd5 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -1999,14 +1999,15 @@ dummy_func( new_version = _PyDict_NotifyEvent(tstate->interp, PyDict_EVENT_MODIFIED, dict, name, value); ep->me_value = value; } - Py_DECREF(old_value); - STAT_INC(STORE_ATTR, hit); /* Ensure dict is GC tracked if it needs to be */ if (!_PyObject_GC_IS_TRACKED(dict) && _PyObject_GC_MAY_BE_TRACKED(value)) { _PyObject_GC_TRACK(dict); } - /* PEP 509 */ - dict->ma_version_tag = new_version; + dict->ma_version_tag = new_version; // PEP 509 + // old_value should be DECREFed after GC track checking is done, if not, it could raise a segmentation fault, + // when dict only holds the strong reference to value in ep->me_value. + Py_DECREF(old_value); + STAT_INC(STORE_ATTR, hit); Py_DECREF(owner); } diff --git a/Python/clinic/sysmodule.c.h b/Python/clinic/sysmodule.c.h index 7a7c188b..e46c01e1 100644 --- a/Python/clinic/sysmodule.c.h +++ b/Python/clinic/sysmodule.c.h @@ -913,24 +913,64 @@ sys_getallocatedblocks(PyObject *module, PyObject *Py_UNUSED(ignored)) } PyDoc_STRVAR(sys_getunicodeinternedsize__doc__, -"getunicodeinternedsize($module, /)\n" +"getunicodeinternedsize($module, /, *, _only_immortal=False)\n" "--\n" "\n" "Return the number of elements of the unicode interned dictionary"); #define SYS_GETUNICODEINTERNEDSIZE_METHODDEF \ - {"getunicodeinternedsize", (PyCFunction)sys_getunicodeinternedsize, METH_NOARGS, sys_getunicodeinternedsize__doc__}, + {"getunicodeinternedsize", _PyCFunction_CAST(sys_getunicodeinternedsize), METH_FASTCALL|METH_KEYWORDS, sys_getunicodeinternedsize__doc__}, static Py_ssize_t -sys_getunicodeinternedsize_impl(PyObject *module); +sys_getunicodeinternedsize_impl(PyObject *module, int _only_immortal); static PyObject * -sys_getunicodeinternedsize(PyObject *module, PyObject *Py_UNUSED(ignored)) +sys_getunicodeinternedsize(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; + #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) + + #define NUM_KEYWORDS 1 + static struct { + PyGC_Head _this_is_not_used; + PyObject_VAR_HEAD + PyObject *ob_item[NUM_KEYWORDS]; + } _kwtuple = { + .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS) + .ob_item = { &_Py_ID(_only_immortal), }, + }; + #undef NUM_KEYWORDS + #define KWTUPLE (&_kwtuple.ob_base.ob_base) + + #else // !Py_BUILD_CORE + # define KWTUPLE NULL + #endif // !Py_BUILD_CORE + + static const char * const _keywords[] = {"_only_immortal", NULL}; + static _PyArg_Parser _parser = { + .keywords = _keywords, + .fname = "getunicodeinternedsize", + .kwtuple = KWTUPLE, + }; + #undef KWTUPLE + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + int _only_immortal = 0; Py_ssize_t _return_value; - _return_value = sys_getunicodeinternedsize_impl(module); + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_kwonly; + } + _only_immortal = PyObject_IsTrue(args[0]); + if (_only_immortal < 0) { + goto exit; + } +skip_optional_kwonly: + _return_value = sys_getunicodeinternedsize_impl(module, _only_immortal); if ((_return_value == -1) && PyErr_Occurred()) { goto exit; } @@ -1415,4 +1455,4 @@ sys__getframemodulename(PyObject *module, PyObject *const *args, Py_ssize_t narg #ifndef SYS_GETANDROIDAPILEVEL_METHODDEF #define SYS_GETANDROIDAPILEVEL_METHODDEF #endif /* !defined(SYS_GETANDROIDAPILEVEL_METHODDEF) */ -/*[clinic end generated code: output=6d598acc26237fbe input=a9049054013a1b77]*/ +/*[clinic end generated code: output=2a1fbdf7de450c63 input=a9049054013a1b77]*/ diff --git a/Python/codecs.c b/Python/codecs.c index 1983f56b..b041339e 100644 --- a/Python/codecs.c +++ b/Python/codecs.c @@ -144,7 +144,9 @@ PyObject *_PyCodec_Lookup(const char *encoding) if (v == NULL) { return NULL; } - PyUnicode_InternInPlace(&v); + + /* Intern the string. We'll make it immortal later if lookup succeeds. */ + _PyUnicode_InternMortal(interp, &v); /* First, try to lookup the name in the registry dictionary */ PyObject *result = PyDict_GetItemWithError(interp->codec_search_cache, v); @@ -197,6 +199,8 @@ PyObject *_PyCodec_Lookup(const char *encoding) goto onError; } + _PyUnicode_InternImmortal(interp, &v); + /* Cache and return the result */ if (PyDict_SetItem(interp->codec_search_cache, v, result) < 0) { Py_DECREF(result); diff --git a/Python/compile.c b/Python/compile.c index 40335f6d..56fdbfae 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -135,6 +135,7 @@ enum fblocktype { WHILE_LOOP, FOR_LOOP, TRY_EXCEPT, FINALLY_TRY, FINALLY_END, struct fblockinfo { enum fblocktype fb_type; jump_target_label fb_block; + location fb_loc; /* (optional) type-specific exit or cleanup block */ jump_target_label fb_exit; /* (optional) additional information required for unwinding */ @@ -772,8 +773,7 @@ compiler_set_qualname(struct compiler *c) } if (base != NULL) { - _Py_DECLARE_STR(dot, "."); - name = PyUnicode_Concat(base, &_Py_STR(dot)); + name = PyUnicode_Concat(base, _Py_LATIN1_CHR('.')); Py_DECREF(base); if (name == NULL) { return ERROR; @@ -1467,6 +1467,7 @@ compiler_push_fblock(struct compiler *c, location loc, f = &c->u->u_fblock[c->u->u_nfblocks++]; f->fb_type = t; f->fb_block = block_label; + f->fb_loc = loc; f->fb_exit = exit; f->fb_datum = datum; return SUCCESS; @@ -1594,7 +1595,7 @@ compiler_unwind_fblock(struct compiler *c, location *ploc, case WITH: case ASYNC_WITH: - *ploc = LOC((stmt_ty)info->fb_datum); + *ploc = info->fb_loc; ADDOP(c, *ploc, POP_BLOCK); if (preserve_tos) { ADDOP_I(c, *ploc, SWAP, 2); @@ -1834,7 +1835,7 @@ compiler_make_closure(struct compiler *c, location loc, c->u->u_metadata.u_name, co->co_name, freevars); - Py_DECREF(freevars); + Py_XDECREF(freevars); return ERROR; } ADDOP_I(c, loc, LOAD_CLOSURE, arg); @@ -2966,7 +2967,7 @@ compiler_lambda(struct compiler *c, expr_ty e) co = optimize_and_assemble(c, 0); } else { - location loc = LOCATION(e->lineno, e->lineno, 0, 0); + location loc = LOC(e->v.Lambda.body); ADDOP_IN_SCOPE(c, loc, RETURN_VALUE); co = optimize_and_assemble(c, 1); } @@ -3024,11 +3025,18 @@ compiler_for(struct compiler *c, stmt_ty s) RETURN_IF_ERROR(compiler_push_fblock(c, loc, FOR_LOOP, start, end, NULL)); VISIT(c, expr, s->v.For.iter); + + loc = LOC(s->v.For.iter); ADDOP(c, loc, GET_ITER); USE_LABEL(c, start); ADDOP_JUMP(c, loc, FOR_ITER, cleanup); + /* Add NOP to ensure correct line tracing of multiline for statements. + * It will be removed later if redundant. + */ + ADDOP(c, LOC(s->v.For.target), NOP); + USE_LABEL(c, body); VISIT(c, expr, s->v.For.target); VISIT_SEQ(c, stmt, s->v.For.body); @@ -3062,7 +3070,7 @@ compiler_async_for(struct compiler *c, stmt_ty s) NEW_JUMP_TARGET_LABEL(c, end); VISIT(c, expr, s->v.AsyncFor.iter); - ADDOP(c, loc, GET_AITER); + ADDOP(c, LOC(s->v.AsyncFor.iter), GET_AITER); USE_LABEL(c, start); RETURN_IF_ERROR(compiler_push_fblock(c, loc, FOR_LOOP, start, end, NULL)); @@ -5183,9 +5191,12 @@ compiler_call_helper(struct compiler *c, location loc, } -/* List and set comprehensions and generator expressions work by creating a - nested function to perform the actual iteration. This means that the - iteration variables don't leak into the current scope. +/* List and set comprehensions work by being inlined at the location where + they are defined. The isolation of iteration variables is provided by + pushing/popping clashing locals on the stack. Generator expressions work + by creating a nested function to perform the actual iteration. + This means that the iteration variables don't leak into the current scope. + See https://peps.python.org/pep-0709/ for additional information. The defined function is called immediately following its definition, with the result of that call being the result of the expression. The LC/SC version returns the populated container, while the GE version is @@ -5265,14 +5276,15 @@ compiler_sync_comprehension_generator(struct compiler *c, location loc, } if (IS_LABEL(start)) { VISIT(c, expr, gen->iter); - ADDOP(c, loc, GET_ITER); + ADDOP(c, LOC(gen->iter), GET_ITER); } } } + if (IS_LABEL(start)) { depth++; USE_LABEL(c, start); - ADDOP_JUMP(c, loc, FOR_ITER, anchor); + ADDOP_JUMP(c, LOC(gen->iter), FOR_ITER, anchor); } VISIT(c, expr, gen->target); @@ -5359,7 +5371,7 @@ compiler_async_comprehension_generator(struct compiler *c, location loc, else { /* Sub-iter - calculate on the fly */ VISIT(c, expr, gen->iter); - ADDOP(c, loc, GET_AITER); + ADDOP(c, LOC(gen->iter), GET_AITER); } } @@ -5644,15 +5656,14 @@ pop_inlined_comprehension_state(struct compiler *c, location loc, } static inline int -compiler_comprehension_iter(struct compiler *c, location loc, - comprehension_ty comp) +compiler_comprehension_iter(struct compiler *c, comprehension_ty comp) { VISIT(c, expr, comp->iter); if (comp->is_async) { - ADDOP(c, loc, GET_AITER); + ADDOP(c, LOC(comp->iter), GET_AITER); } else { - ADDOP(c, loc, GET_ITER); + ADDOP(c, LOC(comp->iter), GET_ITER); } return SUCCESS; } @@ -5678,7 +5689,7 @@ compiler_comprehension(struct compiler *c, expr_ty e, int type, outermost = (comprehension_ty) asdl_seq_GET(generators, 0); if (is_inlined) { - if (compiler_comprehension_iter(c, loc, outermost)) { + if (compiler_comprehension_iter(c, outermost)) { goto error; } if (push_inlined_comprehension_state(c, loc, entry, &inline_state)) { @@ -5764,7 +5775,7 @@ compiler_comprehension(struct compiler *c, expr_ty e, int type, } Py_CLEAR(co); - if (compiler_comprehension_iter(c, loc, outermost)) { + if (compiler_comprehension_iter(c, outermost)) { goto error; } @@ -5906,7 +5917,7 @@ compiler_async_with(struct compiler *c, stmt_ty s, int pos) /* Evaluate EXPR */ VISIT(c, expr, item->context_expr); - + loc = LOC(item->context_expr); ADDOP(c, loc, BEFORE_ASYNC_WITH); ADDOP_I(c, loc, GET_AWAITABLE, 1); ADDOP_LOAD_CONST(c, loc, Py_None); @@ -6004,7 +6015,7 @@ compiler_with(struct compiler *c, stmt_ty s, int pos) /* Evaluate EXPR */ VISIT(c, expr, item->context_expr); /* Will push bound __exit__ */ - location loc = LOC(s); + location loc = LOC(item->context_expr); ADDOP(c, loc, BEFORE_WITH); ADDOP_JUMP(c, loc, SETUP_WITH, final); @@ -6037,7 +6048,6 @@ compiler_with(struct compiler *c, stmt_ty s, int pos) /* For successful outcome: * call __exit__(None, None, None) */ - loc = LOC(s); RETURN_IF_ERROR(compiler_call_exit_with_nones(c, loc)); ADDOP(c, loc, POP_TOP); ADDOP_JUMP(c, loc, JUMP, exit); @@ -6110,7 +6120,7 @@ compiler_visit_expr1(struct compiler *c, expr_ty e) break; case YieldFrom_kind: if (!_PyST_IsFunctionLike(c->u->u_ste)) { - return compiler_error(c, loc, "'yield' outside function"); + return compiler_error(c, loc, "'yield from' outside function"); } if (c->u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION) { return compiler_error(c, loc, "'yield from' inside async function"); @@ -7682,7 +7692,7 @@ optimize_and_assemble_code_unit(struct compiler_unit *u, PyObject *const_cache, PyCodeObject *co = NULL; PyObject *consts = consts_dict_keys_inorder(u->u_metadata.u_consts); if (consts == NULL) { - goto error; + return NULL; } cfg_builder g; if (instr_sequence_to_cfg(&u->u_instr_sequence, &g) < 0) { diff --git a/Python/context.c b/Python/context.c index 1ffae987..7bccfad1 100644 --- a/Python/context.c +++ b/Python/context.c @@ -669,6 +669,7 @@ context_run(PyContext *self, PyObject *const *args, ts, args[0], args + 1, nargs - 1, kwnames); if (_PyContext_Exit(ts, (PyObject *)self)) { + Py_XDECREF(call_result); return NULL; } diff --git a/Python/errors.c b/Python/errors.c index 6c46d1f2..cbfc2faf 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -1871,44 +1871,44 @@ PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset) functionality in tb_displayline() in traceback.c. */ static PyObject * -err_programtext(PyThreadState *tstate, FILE *fp, int lineno, const char* encoding) +err_programtext(FILE *fp, int lineno, const char* encoding) { - int i; char linebuf[1000]; - if (fp == NULL) { - return NULL; + size_t line_size = 0; + + for (int i = 0; i < lineno; ) { + line_size = 0; + if (_Py_UniversalNewlineFgetsWithSize(linebuf, sizeof(linebuf), + fp, NULL, &line_size) == NULL) + { + /* Error or EOF. */ + return NULL; + } + /* fgets read *something*; if it didn't fill the + whole buffer, it must have found a newline + or hit the end of the file; if the last character is \n, + it obviously found a newline; else we haven't + yet seen a newline, so must continue */ + if (i + 1 < lineno + && line_size == sizeof(linebuf) - 1 + && linebuf[sizeof(linebuf) - 2] != '\n') + { + continue; + } + i++; } - for (i = 0; i < lineno; i++) { - char *pLastChar = &linebuf[sizeof(linebuf) - 2]; - do { - *pLastChar = '\0'; - if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf, - fp, NULL) == NULL) { - goto after_loop; - } - /* fgets read *something*; if it didn't get as - far as pLastChar, it must have found a newline - or hit the end of the file; if pLastChar is \n, - it obviously found a newline; else we haven't - yet seen a newline, so must continue */ - } while (*pLastChar != '\0' && *pLastChar != '\n'); + const char *line = linebuf; + /* Skip BOM. */ + if (lineno == 1 && line_size >= 3 && memcmp(line, "\xef\xbb\xbf", 3) == 0) { + line += 3; + line_size -= 3; } - -after_loop: - fclose(fp); - if (i == lineno) { - PyObject *res; - if (encoding != NULL) { - res = PyUnicode_Decode(linebuf, strlen(linebuf), encoding, "replace"); - } else { - res = PyUnicode_FromString(linebuf); - } - if (res == NULL) - _PyErr_Clear(tstate); - return res; + PyObject *res = PyUnicode_Decode(line, line_size, encoding, "replace"); + if (res == NULL) { + PyErr_Clear(); } - return NULL; + return res; } PyObject * @@ -1928,20 +1928,41 @@ PyErr_ProgramText(const char *filename, int lineno) return res; } +/* Function from Parser/tokenizer/file_tokenizer.c */ +extern char* _PyTokenizer_FindEncodingFilename(int, PyObject *); + PyObject * _PyErr_ProgramDecodedTextObject(PyObject *filename, int lineno, const char* encoding) { + char *found_encoding = NULL; if (filename == NULL || lineno <= 0) { return NULL; } - PyThreadState *tstate = _PyThreadState_GET(); FILE *fp = _Py_fopen_obj(filename, "r" PY_STDIOTEXTMODE); if (fp == NULL) { - _PyErr_Clear(tstate); + PyErr_Clear(); return NULL; } - return err_programtext(tstate, fp, lineno, encoding); + if (encoding == NULL) { + int fd = fileno(fp); + found_encoding = _PyTokenizer_FindEncodingFilename(fd, filename); + encoding = found_encoding; + if (encoding == NULL) { + PyErr_Clear(); + encoding = "utf-8"; + } + /* Reset position */ + if (lseek(fd, 0, SEEK_SET) == (off_t)-1) { + fclose(fp); + PyMem_Free(found_encoding); + return NULL; + } + } + PyObject *res = err_programtext(fp, lineno, encoding); + fclose(fp); + PyMem_Free(found_encoding); + return res; } PyObject * diff --git a/Python/frame.c b/Python/frame.c index a49215fa..b84fd9b6 100644 --- a/Python/frame.c +++ b/Python/frame.c @@ -115,18 +115,6 @@ take_ownership(PyFrameObject *f, _PyInterpreterFrame *frame) } } -void -_PyFrame_ClearLocals(_PyInterpreterFrame *frame) -{ - assert(frame->stacktop >= 0); - int stacktop = frame->stacktop; - frame->stacktop = 0; - for (int i = 0; i < stacktop; i++) { - Py_XDECREF(frame->localsplus[i]); - } - Py_CLEAR(frame->f_locals); -} - void _PyFrame_ClearExceptCode(_PyInterpreterFrame *frame) { @@ -147,8 +135,12 @@ _PyFrame_ClearExceptCode(_PyInterpreterFrame *frame) } Py_DECREF(f); } - _PyFrame_ClearLocals(frame); + assert(frame->stacktop >= 0); + for (int i = 0; i < frame->stacktop; i++) { + Py_XDECREF(frame->localsplus[i]); + } Py_XDECREF(frame->frame_obj); + Py_XDECREF(frame->f_locals); Py_DECREF(frame->f_funcobj); } diff --git a/Python/future.c b/Python/future.c index d56f7330..998a7f74 100644 --- a/Python/future.c +++ b/Python/future.c @@ -39,12 +39,20 @@ future_check_features(PyFutureFeatures *ff, stmt_ty s, PyObject *filename) } else if (strcmp(feature, "braces") == 0) { PyErr_SetString(PyExc_SyntaxError, "not a chance"); - PyErr_SyntaxLocationObject(filename, s->lineno, s->col_offset + 1); + PyErr_RangedSyntaxLocationObject(filename, + name->lineno, + name->col_offset + 1, + name->end_lineno, + name->end_col_offset + 1); return 0; } else { PyErr_Format(PyExc_SyntaxError, UNDEFINED_FUTURE_FEATURE, feature); - PyErr_SyntaxLocationObject(filename, s->lineno, s->col_offset + 1); + PyErr_RangedSyntaxLocationObject(filename, + name->lineno, + name->col_offset + 1, + name->end_lineno, + name->end_col_offset + 1); return 0; } } diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index a23cbd52..bbaf589e 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -2762,16 +2762,17 @@ new_version = _PyDict_NotifyEvent(tstate->interp, PyDict_EVENT_MODIFIED, dict, name, value); ep->me_value = value; } - Py_DECREF(old_value); - STAT_INC(STORE_ATTR, hit); /* Ensure dict is GC tracked if it needs to be */ if (!_PyObject_GC_IS_TRACKED(dict) && _PyObject_GC_MAY_BE_TRACKED(value)) { _PyObject_GC_TRACK(dict); } - /* PEP 509 */ - dict->ma_version_tag = new_version; + dict->ma_version_tag = new_version; // PEP 509 + // old_value should be DECREFed after GC track checking is done, if not, it could raise a segmentation fault, + // when dict only holds the strong reference to value in ep->me_value. + Py_DECREF(old_value); + STAT_INC(STORE_ATTR, hit); Py_DECREF(owner); - #line 2775 "Python/generated_cases.c.h" + #line 2776 "Python/generated_cases.c.h" STACK_SHRINK(2); next_instr += 4; DISPATCH(); @@ -2782,7 +2783,7 @@ PyObject *value = stack_pointer[-2]; uint32_t type_version = read_u32(&next_instr[1].cache); uint16_t index = read_u16(&next_instr[3].cache); - #line 2014 "Python/bytecodes.c" + #line 2015 "Python/bytecodes.c" PyTypeObject *tp = Py_TYPE(owner); assert(type_version != 0); DEOPT_IF(tp->tp_version_tag != type_version, STORE_ATTR); @@ -2792,7 +2793,7 @@ *(PyObject **)addr = value; Py_XDECREF(old_value); Py_DECREF(owner); - #line 2796 "Python/generated_cases.c.h" + #line 2797 "Python/generated_cases.c.h" STACK_SHRINK(2); next_instr += 4; DISPATCH(); @@ -2804,7 +2805,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *res; - #line 2033 "Python/bytecodes.c" + #line 2034 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyCompareOpCache *cache = (_PyCompareOpCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { @@ -2817,12 +2818,12 @@ #endif /* ENABLE_SPECIALIZATION */ assert((oparg >> 4) <= Py_GE); res = PyObject_RichCompare(left, right, oparg>>4); - #line 2821 "Python/generated_cases.c.h" + #line 2822 "Python/generated_cases.c.h" Py_DECREF(left); Py_DECREF(right); - #line 2046 "Python/bytecodes.c" + #line 2047 "Python/bytecodes.c" if (res == NULL) goto pop_2_error; - #line 2826 "Python/generated_cases.c.h" + #line 2827 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = res; next_instr += 1; @@ -2833,7 +2834,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *res; - #line 2050 "Python/bytecodes.c" + #line 2051 "Python/bytecodes.c" DEOPT_IF(!PyFloat_CheckExact(left), COMPARE_OP); DEOPT_IF(!PyFloat_CheckExact(right), COMPARE_OP); STAT_INC(COMPARE_OP, hit); @@ -2844,7 +2845,7 @@ _Py_DECREF_SPECIALIZED(left, _PyFloat_ExactDealloc); _Py_DECREF_SPECIALIZED(right, _PyFloat_ExactDealloc); res = (sign_ish & oparg) ? Py_True : Py_False; - #line 2848 "Python/generated_cases.c.h" + #line 2849 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = res; next_instr += 1; @@ -2855,7 +2856,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *res; - #line 2064 "Python/bytecodes.c" + #line 2065 "Python/bytecodes.c" DEOPT_IF(!PyLong_CheckExact(left), COMPARE_OP); DEOPT_IF(!PyLong_CheckExact(right), COMPARE_OP); DEOPT_IF(!_PyLong_IsCompact((PyLongObject *)left), COMPARE_OP); @@ -2870,7 +2871,7 @@ _Py_DECREF_SPECIALIZED(left, (destructor)PyObject_Free); _Py_DECREF_SPECIALIZED(right, (destructor)PyObject_Free); res = (sign_ish & oparg) ? Py_True : Py_False; - #line 2874 "Python/generated_cases.c.h" + #line 2875 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = res; next_instr += 1; @@ -2881,7 +2882,7 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *res; - #line 2082 "Python/bytecodes.c" + #line 2083 "Python/bytecodes.c" DEOPT_IF(!PyUnicode_CheckExact(left), COMPARE_OP); DEOPT_IF(!PyUnicode_CheckExact(right), COMPARE_OP); STAT_INC(COMPARE_OP, hit); @@ -2893,7 +2894,7 @@ assert((oparg & 0xf) == COMPARISON_NOT_EQUALS || (oparg & 0xf) == COMPARISON_EQUALS); assert(COMPARISON_NOT_EQUALS + 1 == COMPARISON_EQUALS); res = ((COMPARISON_NOT_EQUALS + eq) & oparg) ? Py_True : Py_False; - #line 2897 "Python/generated_cases.c.h" + #line 2898 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = res; next_instr += 1; @@ -2904,14 +2905,14 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *b; - #line 2096 "Python/bytecodes.c" + #line 2097 "Python/bytecodes.c" int res = Py_Is(left, right) ^ oparg; - #line 2910 "Python/generated_cases.c.h" + #line 2911 "Python/generated_cases.c.h" Py_DECREF(left); Py_DECREF(right); - #line 2098 "Python/bytecodes.c" + #line 2099 "Python/bytecodes.c" b = res ? Py_True : Py_False; - #line 2915 "Python/generated_cases.c.h" + #line 2916 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = b; DISPATCH(); @@ -2921,15 +2922,15 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *b; - #line 2102 "Python/bytecodes.c" + #line 2103 "Python/bytecodes.c" int res = PySequence_Contains(right, left); - #line 2927 "Python/generated_cases.c.h" + #line 2928 "Python/generated_cases.c.h" Py_DECREF(left); Py_DECREF(right); - #line 2104 "Python/bytecodes.c" + #line 2105 "Python/bytecodes.c" if (res < 0) goto pop_2_error; b = (res ^ oparg) ? Py_True : Py_False; - #line 2933 "Python/generated_cases.c.h" + #line 2934 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = b; DISPATCH(); @@ -2940,12 +2941,12 @@ PyObject *exc_value = stack_pointer[-2]; PyObject *rest; PyObject *match; - #line 2109 "Python/bytecodes.c" + #line 2110 "Python/bytecodes.c" if (check_except_star_type_valid(tstate, match_type) < 0) { - #line 2946 "Python/generated_cases.c.h" + #line 2947 "Python/generated_cases.c.h" Py_DECREF(exc_value); Py_DECREF(match_type); - #line 2111 "Python/bytecodes.c" + #line 2112 "Python/bytecodes.c" if (true) goto pop_2_error; } @@ -2953,10 +2954,10 @@ rest = NULL; int res = exception_group_match(exc_value, match_type, &match, &rest); - #line 2957 "Python/generated_cases.c.h" + #line 2958 "Python/generated_cases.c.h" Py_DECREF(exc_value); Py_DECREF(match_type); - #line 2119 "Python/bytecodes.c" + #line 2120 "Python/bytecodes.c" if (res < 0) goto pop_2_error; assert((match == NULL) == (rest == NULL)); @@ -2965,7 +2966,7 @@ if (!Py_IsNone(match)) { PyErr_SetHandledException(match); } - #line 2969 "Python/generated_cases.c.h" + #line 2970 "Python/generated_cases.c.h" stack_pointer[-1] = match; stack_pointer[-2] = rest; DISPATCH(); @@ -2975,21 +2976,21 @@ PyObject *right = stack_pointer[-1]; PyObject *left = stack_pointer[-2]; PyObject *b; - #line 2130 "Python/bytecodes.c" + #line 2131 "Python/bytecodes.c" assert(PyExceptionInstance_Check(left)); if (check_except_type_valid(tstate, right) < 0) { - #line 2982 "Python/generated_cases.c.h" + #line 2983 "Python/generated_cases.c.h" Py_DECREF(right); - #line 2133 "Python/bytecodes.c" + #line 2134 "Python/bytecodes.c" if (true) goto pop_1_error; } int res = PyErr_GivenExceptionMatches(left, right); - #line 2989 "Python/generated_cases.c.h" + #line 2990 "Python/generated_cases.c.h" Py_DECREF(right); - #line 2138 "Python/bytecodes.c" + #line 2139 "Python/bytecodes.c" b = res ? Py_True : Py_False; - #line 2993 "Python/generated_cases.c.h" + #line 2994 "Python/generated_cases.c.h" stack_pointer[-1] = b; DISPATCH(); } @@ -2998,15 +2999,15 @@ PyObject *fromlist = stack_pointer[-1]; PyObject *level = stack_pointer[-2]; PyObject *res; - #line 2142 "Python/bytecodes.c" + #line 2143 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); res = import_name(tstate, frame, name, fromlist, level); - #line 3005 "Python/generated_cases.c.h" + #line 3006 "Python/generated_cases.c.h" Py_DECREF(level); Py_DECREF(fromlist); - #line 2145 "Python/bytecodes.c" + #line 2146 "Python/bytecodes.c" if (res == NULL) goto pop_2_error; - #line 3010 "Python/generated_cases.c.h" + #line 3011 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = res; DISPATCH(); @@ -3015,29 +3016,29 @@ TARGET(IMPORT_FROM) { PyObject *from = stack_pointer[-1]; PyObject *res; - #line 2149 "Python/bytecodes.c" + #line 2150 "Python/bytecodes.c" PyObject *name = GETITEM(frame->f_code->co_names, oparg); res = import_from(tstate, from, name); if (res == NULL) goto error; - #line 3023 "Python/generated_cases.c.h" + #line 3024 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = res; DISPATCH(); } TARGET(JUMP_FORWARD) { - #line 2155 "Python/bytecodes.c" + #line 2156 "Python/bytecodes.c" JUMPBY(oparg); - #line 3032 "Python/generated_cases.c.h" + #line 3033 "Python/generated_cases.c.h" DISPATCH(); } TARGET(JUMP_BACKWARD) { PREDICTED(JUMP_BACKWARD); - #line 2159 "Python/bytecodes.c" + #line 2160 "Python/bytecodes.c" assert(oparg < INSTR_OFFSET()); JUMPBY(-oparg); - #line 3041 "Python/generated_cases.c.h" + #line 3042 "Python/generated_cases.c.h" CHECK_EVAL_BREAKER(); DISPATCH(); } @@ -3045,15 +3046,15 @@ TARGET(POP_JUMP_IF_FALSE) { PREDICTED(POP_JUMP_IF_FALSE); PyObject *cond = stack_pointer[-1]; - #line 2165 "Python/bytecodes.c" + #line 2166 "Python/bytecodes.c" if (Py_IsFalse(cond)) { JUMPBY(oparg); } else if (!Py_IsTrue(cond)) { int err = PyObject_IsTrue(cond); - #line 3055 "Python/generated_cases.c.h" + #line 3056 "Python/generated_cases.c.h" Py_DECREF(cond); - #line 2171 "Python/bytecodes.c" + #line 2172 "Python/bytecodes.c" if (err == 0) { JUMPBY(oparg); } @@ -3061,22 +3062,22 @@ if (err < 0) goto pop_1_error; } } - #line 3065 "Python/generated_cases.c.h" + #line 3066 "Python/generated_cases.c.h" STACK_SHRINK(1); DISPATCH(); } TARGET(POP_JUMP_IF_TRUE) { PyObject *cond = stack_pointer[-1]; - #line 2181 "Python/bytecodes.c" + #line 2182 "Python/bytecodes.c" if (Py_IsTrue(cond)) { JUMPBY(oparg); } else if (!Py_IsFalse(cond)) { int err = PyObject_IsTrue(cond); - #line 3078 "Python/generated_cases.c.h" + #line 3079 "Python/generated_cases.c.h" Py_DECREF(cond); - #line 2187 "Python/bytecodes.c" + #line 2188 "Python/bytecodes.c" if (err > 0) { JUMPBY(oparg); } @@ -3084,63 +3085,63 @@ if (err < 0) goto pop_1_error; } } - #line 3088 "Python/generated_cases.c.h" + #line 3089 "Python/generated_cases.c.h" STACK_SHRINK(1); DISPATCH(); } TARGET(POP_JUMP_IF_NOT_NONE) { PyObject *value = stack_pointer[-1]; - #line 2197 "Python/bytecodes.c" + #line 2198 "Python/bytecodes.c" if (!Py_IsNone(value)) { - #line 3097 "Python/generated_cases.c.h" + #line 3098 "Python/generated_cases.c.h" Py_DECREF(value); - #line 2199 "Python/bytecodes.c" + #line 2200 "Python/bytecodes.c" JUMPBY(oparg); } - #line 3102 "Python/generated_cases.c.h" + #line 3103 "Python/generated_cases.c.h" STACK_SHRINK(1); DISPATCH(); } TARGET(POP_JUMP_IF_NONE) { PyObject *value = stack_pointer[-1]; - #line 2204 "Python/bytecodes.c" + #line 2205 "Python/bytecodes.c" if (Py_IsNone(value)) { JUMPBY(oparg); } else { - #line 3114 "Python/generated_cases.c.h" + #line 3115 "Python/generated_cases.c.h" Py_DECREF(value); - #line 2209 "Python/bytecodes.c" + #line 2210 "Python/bytecodes.c" } - #line 3118 "Python/generated_cases.c.h" + #line 3119 "Python/generated_cases.c.h" STACK_SHRINK(1); DISPATCH(); } TARGET(JUMP_BACKWARD_NO_INTERRUPT) { - #line 2213 "Python/bytecodes.c" + #line 2214 "Python/bytecodes.c" /* This bytecode is used in the `yield from` or `await` loop. * If there is an interrupt, we want it handled in the innermost * generator or coroutine, so we deliberately do not check it here. * (see bpo-30039). */ JUMPBY(-oparg); - #line 3131 "Python/generated_cases.c.h" + #line 3132 "Python/generated_cases.c.h" DISPATCH(); } TARGET(GET_LEN) { PyObject *obj = stack_pointer[-1]; PyObject *len_o; - #line 2222 "Python/bytecodes.c" + #line 2223 "Python/bytecodes.c" // PUSH(len(TOS)) Py_ssize_t len_i = PyObject_Length(obj); if (len_i < 0) goto error; len_o = PyLong_FromSsize_t(len_i); if (len_o == NULL) goto error; - #line 3144 "Python/generated_cases.c.h" + #line 3145 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = len_o; DISPATCH(); @@ -3151,16 +3152,16 @@ PyObject *type = stack_pointer[-2]; PyObject *subject = stack_pointer[-3]; PyObject *attrs; - #line 2230 "Python/bytecodes.c" + #line 2231 "Python/bytecodes.c" // Pop TOS and TOS1. Set TOS to a tuple of attributes on success, or // None on failure. assert(PyTuple_CheckExact(names)); attrs = match_class(tstate, subject, type, oparg, names); - #line 3160 "Python/generated_cases.c.h" + #line 3161 "Python/generated_cases.c.h" Py_DECREF(subject); Py_DECREF(type); Py_DECREF(names); - #line 2235 "Python/bytecodes.c" + #line 2236 "Python/bytecodes.c" if (attrs) { assert(PyTuple_CheckExact(attrs)); // Success! } @@ -3168,7 +3169,7 @@ if (_PyErr_Occurred(tstate)) goto pop_3_error; attrs = Py_None; // Failure! } - #line 3172 "Python/generated_cases.c.h" + #line 3173 "Python/generated_cases.c.h" STACK_SHRINK(2); stack_pointer[-1] = attrs; DISPATCH(); @@ -3177,10 +3178,10 @@ TARGET(MATCH_MAPPING) { PyObject *subject = stack_pointer[-1]; PyObject *res; - #line 2245 "Python/bytecodes.c" + #line 2246 "Python/bytecodes.c" int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_MAPPING; res = match ? Py_True : Py_False; - #line 3184 "Python/generated_cases.c.h" + #line 3185 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = res; PREDICT(POP_JUMP_IF_FALSE); @@ -3190,10 +3191,10 @@ TARGET(MATCH_SEQUENCE) { PyObject *subject = stack_pointer[-1]; PyObject *res; - #line 2251 "Python/bytecodes.c" + #line 2252 "Python/bytecodes.c" int match = Py_TYPE(subject)->tp_flags & Py_TPFLAGS_SEQUENCE; res = match ? Py_True : Py_False; - #line 3197 "Python/generated_cases.c.h" + #line 3198 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = res; PREDICT(POP_JUMP_IF_FALSE); @@ -3204,11 +3205,11 @@ PyObject *keys = stack_pointer[-1]; PyObject *subject = stack_pointer[-2]; PyObject *values_or_none; - #line 2257 "Python/bytecodes.c" + #line 2258 "Python/bytecodes.c" // On successful match, PUSH(values). Otherwise, PUSH(None). values_or_none = match_keys(tstate, subject, keys); if (values_or_none == NULL) goto error; - #line 3212 "Python/generated_cases.c.h" + #line 3213 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = values_or_none; DISPATCH(); @@ -3217,14 +3218,14 @@ TARGET(GET_ITER) { PyObject *iterable = stack_pointer[-1]; PyObject *iter; - #line 2263 "Python/bytecodes.c" + #line 2264 "Python/bytecodes.c" /* before: [obj]; after [getiter(obj)] */ iter = PyObject_GetIter(iterable); - #line 3224 "Python/generated_cases.c.h" + #line 3225 "Python/generated_cases.c.h" Py_DECREF(iterable); - #line 2266 "Python/bytecodes.c" + #line 2267 "Python/bytecodes.c" if (iter == NULL) goto pop_1_error; - #line 3228 "Python/generated_cases.c.h" + #line 3229 "Python/generated_cases.c.h" stack_pointer[-1] = iter; DISPATCH(); } @@ -3232,7 +3233,7 @@ TARGET(GET_YIELD_FROM_ITER) { PyObject *iterable = stack_pointer[-1]; PyObject *iter; - #line 2270 "Python/bytecodes.c" + #line 2271 "Python/bytecodes.c" /* before: [obj]; after [getiter(obj)] */ if (PyCoro_CheckExact(iterable)) { /* `iterable` is a coroutine */ @@ -3255,11 +3256,11 @@ if (iter == NULL) { goto error; } - #line 3259 "Python/generated_cases.c.h" + #line 3260 "Python/generated_cases.c.h" Py_DECREF(iterable); - #line 2293 "Python/bytecodes.c" + #line 2294 "Python/bytecodes.c" } - #line 3263 "Python/generated_cases.c.h" + #line 3264 "Python/generated_cases.c.h" stack_pointer[-1] = iter; PREDICT(LOAD_CONST); DISPATCH(); @@ -3270,7 +3271,7 @@ static_assert(INLINE_CACHE_ENTRIES_FOR_ITER == 1, "incorrect cache size"); PyObject *iter = stack_pointer[-1]; PyObject *next; - #line 2312 "Python/bytecodes.c" + #line 2313 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyForIterCache *cache = (_PyForIterCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { @@ -3301,7 +3302,7 @@ DISPATCH(); } // Common case: no jump, leave it to the code generator - #line 3305 "Python/generated_cases.c.h" + #line 3306 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = next; next_instr += 1; @@ -3309,7 +3310,7 @@ } TARGET(INSTRUMENTED_FOR_ITER) { - #line 2345 "Python/bytecodes.c" + #line 2346 "Python/bytecodes.c" _Py_CODEUNIT *here = next_instr-1; _Py_CODEUNIT *target; PyObject *iter = TOP(); @@ -3335,14 +3336,14 @@ target = next_instr + INLINE_CACHE_ENTRIES_FOR_ITER + oparg + 1; } INSTRUMENTED_JUMP(here, target, PY_MONITORING_EVENT_BRANCH); - #line 3339 "Python/generated_cases.c.h" + #line 3340 "Python/generated_cases.c.h" DISPATCH(); } TARGET(FOR_ITER_LIST) { PyObject *iter = stack_pointer[-1]; PyObject *next; - #line 2373 "Python/bytecodes.c" + #line 2374 "Python/bytecodes.c" DEOPT_IF(Py_TYPE(iter) != &PyListIter_Type, FOR_ITER); _PyListIterObject *it = (_PyListIterObject *)iter; STAT_INC(FOR_ITER, hit); @@ -3362,7 +3363,7 @@ DISPATCH(); end_for_iter_list: // Common case: no jump, leave it to the code generator - #line 3366 "Python/generated_cases.c.h" + #line 3367 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = next; next_instr += 1; @@ -3372,7 +3373,7 @@ TARGET(FOR_ITER_TUPLE) { PyObject *iter = stack_pointer[-1]; PyObject *next; - #line 2395 "Python/bytecodes.c" + #line 2396 "Python/bytecodes.c" _PyTupleIterObject *it = (_PyTupleIterObject *)iter; DEOPT_IF(Py_TYPE(it) != &PyTupleIter_Type, FOR_ITER); STAT_INC(FOR_ITER, hit); @@ -3392,7 +3393,7 @@ DISPATCH(); end_for_iter_tuple: // Common case: no jump, leave it to the code generator - #line 3396 "Python/generated_cases.c.h" + #line 3397 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = next; next_instr += 1; @@ -3402,7 +3403,7 @@ TARGET(FOR_ITER_RANGE) { PyObject *iter = stack_pointer[-1]; PyObject *next; - #line 2417 "Python/bytecodes.c" + #line 2418 "Python/bytecodes.c" _PyRangeIterObject *r = (_PyRangeIterObject *)iter; DEOPT_IF(Py_TYPE(r) != &PyRangeIter_Type, FOR_ITER); STAT_INC(FOR_ITER, hit); @@ -3420,7 +3421,7 @@ if (next == NULL) { goto error; } - #line 3424 "Python/generated_cases.c.h" + #line 3425 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = next; next_instr += 1; @@ -3429,7 +3430,7 @@ TARGET(FOR_ITER_GEN) { PyObject *iter = stack_pointer[-1]; - #line 2437 "Python/bytecodes.c" + #line 2438 "Python/bytecodes.c" DEOPT_IF(tstate->interp->eval_frame, FOR_ITER); PyGenObject *gen = (PyGenObject *)iter; DEOPT_IF(Py_TYPE(gen) != &PyGen_Type, FOR_ITER); @@ -3445,14 +3446,14 @@ assert(next_instr[oparg].op.code == END_FOR || next_instr[oparg].op.code == INSTRUMENTED_END_FOR); DISPATCH_INLINED(gen_frame); - #line 3449 "Python/generated_cases.c.h" + #line 3450 "Python/generated_cases.c.h" } TARGET(BEFORE_ASYNC_WITH) { PyObject *mgr = stack_pointer[-1]; PyObject *exit; PyObject *res; - #line 2455 "Python/bytecodes.c" + #line 2456 "Python/bytecodes.c" PyObject *enter = _PyObject_LookupSpecial(mgr, &_Py_ID(__aenter__)); if (enter == NULL) { if (!_PyErr_Occurred(tstate)) { @@ -3475,16 +3476,16 @@ Py_DECREF(enter); goto error; } - #line 3479 "Python/generated_cases.c.h" + #line 3480 "Python/generated_cases.c.h" Py_DECREF(mgr); - #line 2478 "Python/bytecodes.c" + #line 2479 "Python/bytecodes.c" res = _PyObject_CallNoArgs(enter); Py_DECREF(enter); if (res == NULL) { Py_DECREF(exit); if (true) goto pop_1_error; } - #line 3488 "Python/generated_cases.c.h" + #line 3489 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = res; stack_pointer[-2] = exit; @@ -3496,7 +3497,7 @@ PyObject *mgr = stack_pointer[-1]; PyObject *exit; PyObject *res; - #line 2488 "Python/bytecodes.c" + #line 2489 "Python/bytecodes.c" /* pop the context manager, push its __exit__ and the * value returned from calling its __enter__ */ @@ -3522,16 +3523,16 @@ Py_DECREF(enter); goto error; } - #line 3526 "Python/generated_cases.c.h" + #line 3527 "Python/generated_cases.c.h" Py_DECREF(mgr); - #line 2514 "Python/bytecodes.c" + #line 2515 "Python/bytecodes.c" res = _PyObject_CallNoArgs(enter); Py_DECREF(enter); if (res == NULL) { Py_DECREF(exit); if (true) goto pop_1_error; } - #line 3535 "Python/generated_cases.c.h" + #line 3536 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = res; stack_pointer[-2] = exit; @@ -3543,7 +3544,7 @@ PyObject *lasti = stack_pointer[-3]; PyObject *exit_func = stack_pointer[-4]; PyObject *res; - #line 2523 "Python/bytecodes.c" + #line 2524 "Python/bytecodes.c" /* At the top of the stack are 4 values: - val: TOP = exc_info() - unused: SECOND = previous exception @@ -3569,7 +3570,7 @@ res = PyObject_Vectorcall(exit_func, stack + 1, 3 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); if (res == NULL) goto error; - #line 3573 "Python/generated_cases.c.h" + #line 3574 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = res; DISPATCH(); @@ -3578,7 +3579,7 @@ TARGET(PUSH_EXC_INFO) { PyObject *new_exc = stack_pointer[-1]; PyObject *prev_exc; - #line 2551 "Python/bytecodes.c" + #line 2552 "Python/bytecodes.c" _PyErr_StackItem *exc_info = tstate->exc_info; if (exc_info->exc_value != NULL) { prev_exc = exc_info->exc_value; @@ -3588,7 +3589,7 @@ } assert(PyExceptionInstance_Check(new_exc)); exc_info->exc_value = Py_NewRef(new_exc); - #line 3592 "Python/generated_cases.c.h" + #line 3593 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = new_exc; stack_pointer[-2] = prev_exc; @@ -3602,7 +3603,7 @@ uint32_t type_version = read_u32(&next_instr[1].cache); uint32_t keys_version = read_u32(&next_instr[3].cache); PyObject *descr = read_obj(&next_instr[5].cache); - #line 2563 "Python/bytecodes.c" + #line 2564 "Python/bytecodes.c" /* Cached method object */ PyTypeObject *self_cls = Py_TYPE(self); assert(type_version != 0); @@ -3619,7 +3620,7 @@ assert(_PyType_HasFeature(Py_TYPE(res2), Py_TPFLAGS_METHOD_DESCRIPTOR)); res = self; assert(oparg & 1); - #line 3623 "Python/generated_cases.c.h" + #line 3624 "Python/generated_cases.c.h" STACK_GROW(((oparg & 1) ? 1 : 0)); stack_pointer[-1] = res; if (oparg & 1) { stack_pointer[-(1 + ((oparg & 1) ? 1 : 0))] = res2; } @@ -3633,7 +3634,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); PyObject *descr = read_obj(&next_instr[5].cache); - #line 2582 "Python/bytecodes.c" + #line 2583 "Python/bytecodes.c" PyTypeObject *self_cls = Py_TYPE(self); DEOPT_IF(self_cls->tp_version_tag != type_version, LOAD_ATTR); assert(self_cls->tp_dictoffset == 0); @@ -3643,7 +3644,7 @@ res2 = Py_NewRef(descr); res = self; assert(oparg & 1); - #line 3647 "Python/generated_cases.c.h" + #line 3648 "Python/generated_cases.c.h" STACK_GROW(((oparg & 1) ? 1 : 0)); stack_pointer[-1] = res; if (oparg & 1) { stack_pointer[-(1 + ((oparg & 1) ? 1 : 0))] = res2; } @@ -3657,7 +3658,7 @@ PyObject *res; uint32_t type_version = read_u32(&next_instr[1].cache); PyObject *descr = read_obj(&next_instr[5].cache); - #line 2594 "Python/bytecodes.c" + #line 2595 "Python/bytecodes.c" PyTypeObject *self_cls = Py_TYPE(self); DEOPT_IF(self_cls->tp_version_tag != type_version, LOAD_ATTR); Py_ssize_t dictoffset = self_cls->tp_dictoffset; @@ -3671,7 +3672,7 @@ res2 = Py_NewRef(descr); res = self; assert(oparg & 1); - #line 3675 "Python/generated_cases.c.h" + #line 3676 "Python/generated_cases.c.h" STACK_GROW(((oparg & 1) ? 1 : 0)); stack_pointer[-1] = res; if (oparg & 1) { stack_pointer[-(1 + ((oparg & 1) ? 1 : 0))] = res2; } @@ -3680,16 +3681,16 @@ } TARGET(KW_NAMES) { - #line 2610 "Python/bytecodes.c" + #line 2611 "Python/bytecodes.c" assert(kwnames == NULL); assert(oparg < PyTuple_GET_SIZE(frame->f_code->co_consts)); kwnames = GETITEM(frame->f_code->co_consts, oparg); - #line 3688 "Python/generated_cases.c.h" + #line 3689 "Python/generated_cases.c.h" DISPATCH(); } TARGET(INSTRUMENTED_CALL) { - #line 2616 "Python/bytecodes.c" + #line 2617 "Python/bytecodes.c" int is_meth = PEEK(oparg+2) != NULL; int total_args = oparg + is_meth; PyObject *function = PEEK(total_args + 1); @@ -3702,7 +3703,7 @@ _PyCallCache *cache = (_PyCallCache *)next_instr; INCREMENT_ADAPTIVE_COUNTER(cache->counter); GO_TO_INSTRUCTION(CALL); - #line 3706 "Python/generated_cases.c.h" + #line 3707 "Python/generated_cases.c.h" } TARGET(CALL) { @@ -3712,7 +3713,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2661 "Python/bytecodes.c" + #line 2662 "Python/bytecodes.c" int is_meth = method != NULL; int total_args = oparg; if (is_meth) { @@ -3794,7 +3795,7 @@ Py_DECREF(args[i]); } if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3798 "Python/generated_cases.c.h" + #line 3799 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -3806,7 +3807,7 @@ TARGET(CALL_BOUND_METHOD_EXACT_ARGS) { PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; - #line 2749 "Python/bytecodes.c" + #line 2750 "Python/bytecodes.c" DEOPT_IF(method != NULL, CALL); DEOPT_IF(Py_TYPE(callable) != &PyMethod_Type, CALL); STAT_INC(CALL, hit); @@ -3816,7 +3817,7 @@ PEEK(oparg + 2) = Py_NewRef(meth); // method Py_DECREF(callable); GO_TO_INSTRUCTION(CALL_PY_EXACT_ARGS); - #line 3820 "Python/generated_cases.c.h" + #line 3821 "Python/generated_cases.c.h" } TARGET(CALL_PY_EXACT_ARGS) { @@ -3825,7 +3826,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; uint32_t func_version = read_u32(&next_instr[1].cache); - #line 2761 "Python/bytecodes.c" + #line 2762 "Python/bytecodes.c" assert(kwnames == NULL); DEOPT_IF(tstate->interp->eval_frame, CALL); int is_meth = method != NULL; @@ -3851,7 +3852,7 @@ JUMPBY(INLINE_CACHE_ENTRIES_CALL); frame->return_offset = 0; DISPATCH_INLINED(new_frame); - #line 3855 "Python/generated_cases.c.h" + #line 3856 "Python/generated_cases.c.h" } TARGET(CALL_PY_WITH_DEFAULTS) { @@ -3859,7 +3860,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; uint32_t func_version = read_u32(&next_instr[1].cache); - #line 2789 "Python/bytecodes.c" + #line 2790 "Python/bytecodes.c" assert(kwnames == NULL); DEOPT_IF(tstate->interp->eval_frame, CALL); int is_meth = method != NULL; @@ -3895,7 +3896,7 @@ JUMPBY(INLINE_CACHE_ENTRIES_CALL); frame->return_offset = 0; DISPATCH_INLINED(new_frame); - #line 3899 "Python/generated_cases.c.h" + #line 3900 "Python/generated_cases.c.h" } TARGET(CALL_NO_KW_TYPE_1) { @@ -3903,7 +3904,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *null = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2827 "Python/bytecodes.c" + #line 2828 "Python/bytecodes.c" assert(kwnames == NULL); assert(oparg == 1); DEOPT_IF(null != NULL, CALL); @@ -3913,7 +3914,7 @@ res = Py_NewRef(Py_TYPE(obj)); Py_DECREF(obj); Py_DECREF(&PyType_Type); // I.e., callable - #line 3917 "Python/generated_cases.c.h" + #line 3918 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -3926,7 +3927,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *null = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2839 "Python/bytecodes.c" + #line 2840 "Python/bytecodes.c" assert(kwnames == NULL); assert(oparg == 1); DEOPT_IF(null != NULL, CALL); @@ -3937,7 +3938,7 @@ Py_DECREF(arg); Py_DECREF(&PyUnicode_Type); // I.e., callable if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3941 "Python/generated_cases.c.h" + #line 3942 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -3951,7 +3952,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *null = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2853 "Python/bytecodes.c" + #line 2854 "Python/bytecodes.c" assert(kwnames == NULL); assert(oparg == 1); DEOPT_IF(null != NULL, CALL); @@ -3962,7 +3963,7 @@ Py_DECREF(arg); Py_DECREF(&PyTuple_Type); // I.e., tuple if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 3966 "Python/generated_cases.c.h" + #line 3967 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -3976,7 +3977,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2867 "Python/bytecodes.c" + #line 2868 "Python/bytecodes.c" int is_meth = method != NULL; int total_args = oparg; if (is_meth) { @@ -3998,7 +3999,7 @@ } Py_DECREF(tp); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 4002 "Python/generated_cases.c.h" + #line 4003 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -4012,7 +4013,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2892 "Python/bytecodes.c" + #line 2893 "Python/bytecodes.c" /* Builtin METH_O functions */ assert(kwnames == NULL); int is_meth = method != NULL; @@ -4040,7 +4041,7 @@ Py_DECREF(arg); Py_DECREF(callable); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 4044 "Python/generated_cases.c.h" + #line 4045 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -4054,7 +4055,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2923 "Python/bytecodes.c" + #line 2924 "Python/bytecodes.c" /* Builtin METH_FASTCALL functions, without keywords */ assert(kwnames == NULL); int is_meth = method != NULL; @@ -4086,7 +4087,7 @@ 'invalid'). In those cases an exception is set, so we must handle it. */ - #line 4090 "Python/generated_cases.c.h" + #line 4091 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -4100,7 +4101,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2958 "Python/bytecodes.c" + #line 2959 "Python/bytecodes.c" /* Builtin METH_FASTCALL | METH_KEYWORDS functions */ int is_meth = method != NULL; int total_args = oparg; @@ -4132,7 +4133,7 @@ } Py_DECREF(callable); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 4136 "Python/generated_cases.c.h" + #line 4137 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -4146,7 +4147,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 2993 "Python/bytecodes.c" + #line 2994 "Python/bytecodes.c" assert(kwnames == NULL); /* len(o) */ int is_meth = method != NULL; @@ -4171,7 +4172,7 @@ Py_DECREF(callable); Py_DECREF(arg); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 4175 "Python/generated_cases.c.h" + #line 4176 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -4184,7 +4185,7 @@ PyObject *callable = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 3020 "Python/bytecodes.c" + #line 3021 "Python/bytecodes.c" assert(kwnames == NULL); /* isinstance(o, o2) */ int is_meth = method != NULL; @@ -4211,7 +4212,7 @@ Py_DECREF(cls); Py_DECREF(callable); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 4215 "Python/generated_cases.c.h" + #line 4216 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -4223,7 +4224,7 @@ PyObject **args = (stack_pointer - oparg); PyObject *self = stack_pointer[-(1 + oparg)]; PyObject *method = stack_pointer[-(2 + oparg)]; - #line 3050 "Python/bytecodes.c" + #line 3051 "Python/bytecodes.c" assert(kwnames == NULL); assert(oparg == 1); PyInterpreterState *interp = _PyInterpreterState_GET(); @@ -4241,14 +4242,14 @@ JUMPBY(INLINE_CACHE_ENTRIES_CALL + 1); assert(next_instr[-1].op.code == POP_TOP); DISPATCH(); - #line 4245 "Python/generated_cases.c.h" + #line 4246 "Python/generated_cases.c.h" } TARGET(CALL_NO_KW_METHOD_DESCRIPTOR_O) { PyObject **args = (stack_pointer - oparg); PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 3070 "Python/bytecodes.c" + #line 3071 "Python/bytecodes.c" assert(kwnames == NULL); int is_meth = method != NULL; int total_args = oparg; @@ -4279,7 +4280,7 @@ Py_DECREF(arg); Py_DECREF(callable); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 4283 "Python/generated_cases.c.h" + #line 4284 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -4292,7 +4293,7 @@ PyObject **args = (stack_pointer - oparg); PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 3104 "Python/bytecodes.c" + #line 3105 "Python/bytecodes.c" int is_meth = method != NULL; int total_args = oparg; if (is_meth) { @@ -4321,7 +4322,7 @@ } Py_DECREF(callable); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 4325 "Python/generated_cases.c.h" + #line 4326 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -4334,7 +4335,7 @@ PyObject **args = (stack_pointer - oparg); PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 3136 "Python/bytecodes.c" + #line 3137 "Python/bytecodes.c" assert(kwnames == NULL); assert(oparg == 0 || oparg == 1); int is_meth = method != NULL; @@ -4363,7 +4364,7 @@ Py_DECREF(self); Py_DECREF(callable); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 4367 "Python/generated_cases.c.h" + #line 4368 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -4376,7 +4377,7 @@ PyObject **args = (stack_pointer - oparg); PyObject *method = stack_pointer[-(2 + oparg)]; PyObject *res; - #line 3168 "Python/bytecodes.c" + #line 3169 "Python/bytecodes.c" assert(kwnames == NULL); int is_meth = method != NULL; int total_args = oparg; @@ -4404,7 +4405,7 @@ } Py_DECREF(callable); if (res == NULL) { STACK_SHRINK(oparg); goto pop_2_error; } - #line 4408 "Python/generated_cases.c.h" + #line 4409 "Python/generated_cases.c.h" STACK_SHRINK(oparg); STACK_SHRINK(1); stack_pointer[-1] = res; @@ -4414,9 +4415,9 @@ } TARGET(INSTRUMENTED_CALL_FUNCTION_EX) { - #line 3199 "Python/bytecodes.c" + #line 3200 "Python/bytecodes.c" GO_TO_INSTRUCTION(CALL_FUNCTION_EX); - #line 4420 "Python/generated_cases.c.h" + #line 4421 "Python/generated_cases.c.h" } TARGET(CALL_FUNCTION_EX) { @@ -4425,7 +4426,7 @@ PyObject *callargs = stack_pointer[-(1 + ((oparg & 1) ? 1 : 0))]; PyObject *func = stack_pointer[-(2 + ((oparg & 1) ? 1 : 0))]; PyObject *result; - #line 3203 "Python/bytecodes.c" + #line 3204 "Python/bytecodes.c" // DICT_MERGE is called before this opcode if there are kwargs. // It converts all dict subtypes in kwargs into regular dicts. assert(kwargs == NULL || PyDict_CheckExact(kwargs)); @@ -4487,14 +4488,14 @@ } result = PyObject_Call(func, callargs, kwargs); } - #line 4491 "Python/generated_cases.c.h" + #line 4492 "Python/generated_cases.c.h" Py_DECREF(func); Py_DECREF(callargs); Py_XDECREF(kwargs); - #line 3265 "Python/bytecodes.c" + #line 3266 "Python/bytecodes.c" assert(PEEK(3 + (oparg & 1)) == NULL); if (result == NULL) { STACK_SHRINK(((oparg & 1) ? 1 : 0)); goto pop_3_error; } - #line 4498 "Python/generated_cases.c.h" + #line 4499 "Python/generated_cases.c.h" STACK_SHRINK(((oparg & 1) ? 1 : 0)); STACK_SHRINK(2); stack_pointer[-1] = result; @@ -4509,7 +4510,7 @@ PyObject *kwdefaults = (oparg & 0x02) ? stack_pointer[-(1 + ((oparg & 0x08) ? 1 : 0) + ((oparg & 0x04) ? 1 : 0) + ((oparg & 0x02) ? 1 : 0))] : NULL; PyObject *defaults = (oparg & 0x01) ? stack_pointer[-(1 + ((oparg & 0x08) ? 1 : 0) + ((oparg & 0x04) ? 1 : 0) + ((oparg & 0x02) ? 1 : 0) + ((oparg & 0x01) ? 1 : 0))] : NULL; PyObject *func; - #line 3275 "Python/bytecodes.c" + #line 3276 "Python/bytecodes.c" PyFunctionObject *func_obj = (PyFunctionObject *) PyFunction_New(codeobj, GLOBALS()); @@ -4538,14 +4539,14 @@ func_obj->func_version = ((PyCodeObject *)codeobj)->co_version; func = (PyObject *)func_obj; - #line 4542 "Python/generated_cases.c.h" + #line 4543 "Python/generated_cases.c.h" STACK_SHRINK(((oparg & 0x01) ? 1 : 0) + ((oparg & 0x02) ? 1 : 0) + ((oparg & 0x04) ? 1 : 0) + ((oparg & 0x08) ? 1 : 0)); stack_pointer[-1] = func; DISPATCH(); } TARGET(RETURN_GENERATOR) { - #line 3306 "Python/bytecodes.c" + #line 3307 "Python/bytecodes.c" assert(PyFunction_Check(frame->f_funcobj)); PyFunctionObject *func = (PyFunctionObject *)frame->f_funcobj; PyGenObject *gen = (PyGenObject *)_Py_MakeCoro(func); @@ -4566,7 +4567,7 @@ frame = cframe.current_frame = prev; _PyFrame_StackPush(frame, (PyObject *)gen); goto resume_frame; - #line 4570 "Python/generated_cases.c.h" + #line 4571 "Python/generated_cases.c.h" } TARGET(BUILD_SLICE) { @@ -4574,15 +4575,15 @@ PyObject *stop = stack_pointer[-(1 + ((oparg == 3) ? 1 : 0))]; PyObject *start = stack_pointer[-(2 + ((oparg == 3) ? 1 : 0))]; PyObject *slice; - #line 3329 "Python/bytecodes.c" + #line 3330 "Python/bytecodes.c" slice = PySlice_New(start, stop, step); - #line 4580 "Python/generated_cases.c.h" + #line 4581 "Python/generated_cases.c.h" Py_DECREF(start); Py_DECREF(stop); Py_XDECREF(step); - #line 3331 "Python/bytecodes.c" + #line 3332 "Python/bytecodes.c" if (slice == NULL) { STACK_SHRINK(((oparg == 3) ? 1 : 0)); goto pop_2_error; } - #line 4586 "Python/generated_cases.c.h" + #line 4587 "Python/generated_cases.c.h" STACK_SHRINK(((oparg == 3) ? 1 : 0)); STACK_SHRINK(1); stack_pointer[-1] = slice; @@ -4593,7 +4594,7 @@ PyObject *fmt_spec = ((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? stack_pointer[-((((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? 1 : 0))] : NULL; PyObject *value = stack_pointer[-(1 + (((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? 1 : 0))]; PyObject *result; - #line 3335 "Python/bytecodes.c" + #line 3336 "Python/bytecodes.c" /* Handles f-string value formatting. */ PyObject *(*conv_fn)(PyObject *); int which_conversion = oparg & FVC_MASK; @@ -4628,7 +4629,7 @@ Py_DECREF(value); Py_XDECREF(fmt_spec); if (result == NULL) { STACK_SHRINK((((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? 1 : 0)); goto pop_1_error; } - #line 4632 "Python/generated_cases.c.h" + #line 4633 "Python/generated_cases.c.h" STACK_SHRINK((((oparg & FVS_MASK) == FVS_HAVE_SPEC) ? 1 : 0)); stack_pointer[-1] = result; DISPATCH(); @@ -4637,10 +4638,10 @@ TARGET(COPY) { PyObject *bottom = stack_pointer[-(1 + (oparg-1))]; PyObject *top; - #line 3372 "Python/bytecodes.c" + #line 3373 "Python/bytecodes.c" assert(oparg > 0); top = Py_NewRef(bottom); - #line 4644 "Python/generated_cases.c.h" + #line 4645 "Python/generated_cases.c.h" STACK_GROW(1); stack_pointer[-1] = top; DISPATCH(); @@ -4652,7 +4653,7 @@ PyObject *rhs = stack_pointer[-1]; PyObject *lhs = stack_pointer[-2]; PyObject *res; - #line 3377 "Python/bytecodes.c" + #line 3378 "Python/bytecodes.c" #if ENABLE_SPECIALIZATION _PyBinaryOpCache *cache = (_PyBinaryOpCache *)next_instr; if (ADAPTIVE_COUNTER_IS_ZERO(cache->counter)) { @@ -4667,12 +4668,12 @@ assert((unsigned)oparg < Py_ARRAY_LENGTH(binary_ops)); assert(binary_ops[oparg]); res = binary_ops[oparg](lhs, rhs); - #line 4671 "Python/generated_cases.c.h" + #line 4672 "Python/generated_cases.c.h" Py_DECREF(lhs); Py_DECREF(rhs); - #line 3392 "Python/bytecodes.c" + #line 3393 "Python/bytecodes.c" if (res == NULL) goto pop_2_error; - #line 4676 "Python/generated_cases.c.h" + #line 4677 "Python/generated_cases.c.h" STACK_SHRINK(1); stack_pointer[-1] = res; next_instr += 1; @@ -4682,16 +4683,16 @@ TARGET(SWAP) { PyObject *top = stack_pointer[-1]; PyObject *bottom = stack_pointer[-(2 + (oparg-2))]; - #line 3397 "Python/bytecodes.c" + #line 3398 "Python/bytecodes.c" assert(oparg >= 2); - #line 4688 "Python/generated_cases.c.h" + #line 4689 "Python/generated_cases.c.h" stack_pointer[-1] = bottom; stack_pointer[-(2 + (oparg-2))] = top; DISPATCH(); } TARGET(INSTRUMENTED_INSTRUCTION) { - #line 3401 "Python/bytecodes.c" + #line 3402 "Python/bytecodes.c" int next_opcode = _Py_call_instrumentation_instruction( tstate, frame, next_instr-1); if (next_opcode < 0) goto error; @@ -4703,26 +4704,26 @@ assert(next_opcode > 0 && next_opcode < 256); opcode = next_opcode; DISPATCH_GOTO(); - #line 4707 "Python/generated_cases.c.h" + #line 4708 "Python/generated_cases.c.h" } TARGET(INSTRUMENTED_JUMP_FORWARD) { - #line 3415 "Python/bytecodes.c" + #line 3416 "Python/bytecodes.c" INSTRUMENTED_JUMP(next_instr-1, next_instr+oparg, PY_MONITORING_EVENT_JUMP); - #line 4713 "Python/generated_cases.c.h" + #line 4714 "Python/generated_cases.c.h" DISPATCH(); } TARGET(INSTRUMENTED_JUMP_BACKWARD) { - #line 3419 "Python/bytecodes.c" + #line 3420 "Python/bytecodes.c" INSTRUMENTED_JUMP(next_instr-1, next_instr-oparg, PY_MONITORING_EVENT_JUMP); - #line 4720 "Python/generated_cases.c.h" + #line 4721 "Python/generated_cases.c.h" CHECK_EVAL_BREAKER(); DISPATCH(); } TARGET(INSTRUMENTED_POP_JUMP_IF_TRUE) { - #line 3424 "Python/bytecodes.c" + #line 3425 "Python/bytecodes.c" PyObject *cond = POP(); int err = PyObject_IsTrue(cond); Py_DECREF(cond); @@ -4731,12 +4732,12 @@ assert(err == 0 || err == 1); int offset = err*oparg; INSTRUMENTED_JUMP(here, next_instr + offset, PY_MONITORING_EVENT_BRANCH); - #line 4735 "Python/generated_cases.c.h" + #line 4736 "Python/generated_cases.c.h" DISPATCH(); } TARGET(INSTRUMENTED_POP_JUMP_IF_FALSE) { - #line 3435 "Python/bytecodes.c" + #line 3436 "Python/bytecodes.c" PyObject *cond = POP(); int err = PyObject_IsTrue(cond); Py_DECREF(cond); @@ -4745,12 +4746,12 @@ assert(err == 0 || err == 1); int offset = (1-err)*oparg; INSTRUMENTED_JUMP(here, next_instr + offset, PY_MONITORING_EVENT_BRANCH); - #line 4749 "Python/generated_cases.c.h" + #line 4750 "Python/generated_cases.c.h" DISPATCH(); } TARGET(INSTRUMENTED_POP_JUMP_IF_NONE) { - #line 3446 "Python/bytecodes.c" + #line 3447 "Python/bytecodes.c" PyObject *value = POP(); _Py_CODEUNIT *here = next_instr-1; int offset; @@ -4762,12 +4763,12 @@ offset = 0; } INSTRUMENTED_JUMP(here, next_instr + offset, PY_MONITORING_EVENT_BRANCH); - #line 4766 "Python/generated_cases.c.h" + #line 4767 "Python/generated_cases.c.h" DISPATCH(); } TARGET(INSTRUMENTED_POP_JUMP_IF_NOT_NONE) { - #line 3460 "Python/bytecodes.c" + #line 3461 "Python/bytecodes.c" PyObject *value = POP(); _Py_CODEUNIT *here = next_instr-1; int offset; @@ -4779,30 +4780,30 @@ offset = oparg; } INSTRUMENTED_JUMP(here, next_instr + offset, PY_MONITORING_EVENT_BRANCH); - #line 4783 "Python/generated_cases.c.h" + #line 4784 "Python/generated_cases.c.h" DISPATCH(); } TARGET(EXTENDED_ARG) { - #line 3474 "Python/bytecodes.c" + #line 3475 "Python/bytecodes.c" assert(oparg); opcode = next_instr->op.code; oparg = oparg << 8 | next_instr->op.arg; PRE_DISPATCH_GOTO(); DISPATCH_GOTO(); - #line 4794 "Python/generated_cases.c.h" + #line 4795 "Python/generated_cases.c.h" } TARGET(CACHE) { - #line 3482 "Python/bytecodes.c" + #line 3483 "Python/bytecodes.c" assert(0 && "Executing a cache."); Py_UNREACHABLE(); - #line 4801 "Python/generated_cases.c.h" + #line 4802 "Python/generated_cases.c.h" } TARGET(RESERVED) { - #line 3487 "Python/bytecodes.c" + #line 3488 "Python/bytecodes.c" assert(0 && "Executing RESERVED instruction."); Py_UNREACHABLE(); - #line 4808 "Python/generated_cases.c.h" + #line 4809 "Python/generated_cases.c.h" } diff --git a/Python/getargs.c b/Python/getargs.c index 02bddf06..0bba8b1d 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -1964,7 +1964,8 @@ new_kwtuple(const char * const *keywords, int total, int pos) Py_DECREF(kwtuple); return NULL; } - PyUnicode_InternInPlace(&str); + PyInterpreterState *interp = _PyInterpreterState_GET(); + _PyUnicode_InternImmortal(interp, &str); PyTuple_SET_ITEM(kwtuple, i, str); } return kwtuple; @@ -2071,6 +2072,18 @@ parser_clear(struct _PyArg_Parser *parser) if (parser->initialized == 1) { Py_CLEAR(parser->kwtuple); } + + if (parser->format) { + parser->fname = NULL; + } + else { + assert(parser->fname != NULL); + } + parser->custom_msg = NULL; + parser->pos = 0; + parser->min = 0; + parser->max = 0; + parser->initialized = 0; } static PyObject* @@ -2628,7 +2641,7 @@ _PyArg_UnpackKeywordsWithVararg(PyObject *const *args, Py_ssize_t nargs, * * Otherwise, we leave a place at `buf[vararg]` for vararg tuple * so the index is `i + 1`. */ - if (nargs < vararg) { + if (i < vararg) { buf[i] = current_arg; } else { diff --git a/Python/import.c b/Python/import.c index db709099..66391c04 100644 --- a/Python/import.c +++ b/Python/import.c @@ -917,12 +917,14 @@ extensions_lock_release(void) static void * hashtable_key_from_2_strings(PyObject *str1, PyObject *str2, const char sep) { - Py_ssize_t str1_len, str2_len; - const char *str1_data = PyUnicode_AsUTF8AndSize(str1, &str1_len); - const char *str2_data = PyUnicode_AsUTF8AndSize(str2, &str2_len); + const char *str1_data = _PyUnicode_AsUTF8NoNUL(str1); + const char *str2_data = _PyUnicode_AsUTF8NoNUL(str2); if (str1_data == NULL || str2_data == NULL) { return NULL; } + Py_ssize_t str1_len = strlen(str1_data); + Py_ssize_t str2_len = strlen(str2_data); + /* Make sure sep and the NULL byte won't cause an overflow. */ assert(SIZE_MAX - str1_len - str2_len > 2); size_t size = str1_len + 1 + str2_len + 1; @@ -3539,7 +3541,7 @@ _imp_find_frozen_impl(PyObject *module, PyObject *name, int withdata) if (info.origname != NULL && info.origname[0] != '\0') { origname = PyUnicode_FromString(info.origname); if (origname == NULL) { - Py_DECREF(data); + Py_XDECREF(data); return NULL; } } diff --git a/Python/legacy_tracing.c b/Python/legacy_tracing.c index 43fa5910..4a6565be 100644 --- a/Python/legacy_tracing.c +++ b/Python/legacy_tracing.c @@ -103,6 +103,19 @@ sys_profile_call_or_return( Py_DECREF(meth); return res; } + else if (Py_TYPE(callable) == &PyMethod_Type) { + // CALL instruction will grab the function from the method, + // so if the function is a C function, the return event will + // be emitted. However, CALL event happens before CALL + // instruction, so we need to handle this case here. + PyObject* func = PyMethod_GET_FUNCTION(callable); + if (func == NULL) { + return NULL; + } + if (PyCFunction_Check(func)) { + return call_profile_func(self, func); + } + } Py_RETURN_NONE; } diff --git a/Python/marshal.c b/Python/marshal.c index 90953cbb..3fc3f890 100644 --- a/Python/marshal.c +++ b/Python/marshal.c @@ -14,6 +14,7 @@ #include "pycore_long.h" // _PyLong_DigitCount #include "pycore_hashtable.h" // _Py_hashtable_t #include "marshal.h" // Py_MARSHAL_VERSION +#include "pycore_pystate.h" // _PyInterpreterState_GET() /*[clinic input] module marshal @@ -1158,8 +1159,12 @@ r_object(RFILE *p) v = PyUnicode_FromKindAndData(PyUnicode_1BYTE_KIND, ptr, n); if (v == NULL) break; - if (is_interned) - PyUnicode_InternInPlace(&v); + if (is_interned) { + // marshal is meant to serialize .pyc files with code + // objects, and code-related strings are currently immortal. + PyInterpreterState *interp = _PyInterpreterState_GET(); + _PyUnicode_InternImmortal(interp, &v); + } retval = v; R_REF(retval); break; @@ -1191,8 +1196,12 @@ r_object(RFILE *p) } if (v == NULL) break; - if (is_interned) - PyUnicode_InternInPlace(&v); + if (is_interned) { + // marshal is meant to serialize .pyc files with code + // objects, and code-related strings are currently immortal. + PyInterpreterState *interp = _PyInterpreterState_GET(); + _PyUnicode_InternImmortal(interp, &v); + } retval = v; R_REF(retval); break; @@ -1851,7 +1860,7 @@ machine architecture issues.\n\ Not all Python object types are supported; in general, only objects\n\ whose value is independent from a particular invocation of Python can be\n\ written and read by this module. The following types are supported:\n\ -None, integers, floating point numbers, strings, bytes, bytearrays,\n\ +None, integers, floating-point numbers, strings, bytes, bytearrays,\n\ tuples, lists, sets, dictionaries, and code objects, where it\n\ should be understood that tuples, lists and dictionaries are only\n\ supported as long as the values contained therein are themselves\n\ @@ -1862,7 +1871,7 @@ Variables:\n\ \n\ version -- indicates the format that the module uses. Version 0 is the\n\ historical format, version 1 shares interned strings and version 2\n\ - uses a binary format for floating point numbers.\n\ + uses a binary format for floating-point numbers.\n\ Version 3 shares common object references (New in version 3.4).\n\ \n\ Functions:\n\ diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 2c36527a..e9c1a0d7 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -650,6 +650,10 @@ pycore_create_interpreter(_PyRuntimeState *runtime, return status; } + // This could be done in init_interpreter() (in pystate.c) if it + // didn't depend on interp->feature_flags being set already. + _PyObject_InitState(interp); + PyThreadState *tstate = _PyThreadState_New(interp); if (tstate == NULL) { return _PyStatus_ERR("can't make first thread"); @@ -839,6 +843,13 @@ pycore_interp_init(PyThreadState *tstate) return _PyStatus_ERR("failed to initialize deep-frozen modules"); } + // Per-interpreter interned string dict is created after deep-frozen + // modules have interned the global strings. + status = _PyUnicode_InitInternDict(interp); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + status = pycore_init_types(interp); if (_PyStatus_EXCEPTION(status)) { goto done; @@ -2096,6 +2107,10 @@ new_interpreter(PyThreadState **tstate_p, const PyInterpreterConfig *config) goto error; } + // This could be done in init_interpreter() (in pystate.c) if it + // didn't depend on interp->feature_flags being set already. + _PyObject_InitState(interp); + status = init_interp_create_gil(tstate, config->gil); if (_PyStatus_EXCEPTION(status)) { goto error; diff --git a/Python/pystate.c b/Python/pystate.c index d0651fbd..6aed9ac3 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -686,7 +686,9 @@ init_interpreter(PyInterpreterState *interp, _obmalloc_pools_INIT(interp->obmalloc.pools); memcpy(&interp->obmalloc.pools.used, temp, sizeof(temp)); } - _PyObject_InitState(interp); + + // We would call _PyObject_InitState() at this point + // if interp->feature_flags were alredy set. _PyEval_InitState(interp, pending_lock); _PyGC_InitState(&interp->gc); @@ -1593,7 +1595,9 @@ tstate_delete_common(PyThreadState *tstate) if (tstate->_status.bound_gilstate) { unbind_gilstate_tstate(tstate); } - unbind_tstate(tstate); + if (tstate->_status.bound) { + unbind_tstate(tstate); + } // XXX Move to PyThreadState_Clear()? clear_datastack(tstate); diff --git a/Python/stdlib_module_names.h b/Python/stdlib_module_names.h index ed4a0ac2..1b1a1bde 100644 --- a/Python/stdlib_module_names.h +++ b/Python/stdlib_module_names.h @@ -89,6 +89,7 @@ static const char* _Py_stdlib_module_names[] = { "_weakref", "_weakrefset", "_winapi", +"_wmi", "_zoneinfo", "abc", "aifc", diff --git a/Python/symtable.c b/Python/symtable.c index ba428421..f99ca4fd 100644 --- a/Python/symtable.c +++ b/Python/symtable.c @@ -675,22 +675,19 @@ inline_comprehension(PySTEntryObject *ste, PySTEntryObject *comp, if (existing == NULL && PyErr_Occurred()) { return 0; } + // __class__ is never allowed to be free through a class scope (see + // drop_class_free) + if (scope == FREE && ste->ste_type == ClassBlock && + _PyUnicode_EqualToASCIIString(k, "__class__")) { + scope = GLOBAL_IMPLICIT; + if (PySet_Discard(comp_free, k) < 0) { + return 0; + } + remove_dunder_class = 1; + } if (!existing) { // name does not exist in scope, copy from comprehension assert(scope != FREE || PySet_Contains(comp_free, k) == 1); - if (scope == FREE && ste->ste_type == ClassBlock && - _PyUnicode_EqualToASCIIString(k, "__class__")) { - // if __class__ is unbound in the enclosing class scope and free - // in the comprehension scope, it needs special handling; just - // letting it be marked as free in class scope will break due to - // drop_class_free - scope = GLOBAL_IMPLICIT; - only_flags &= ~DEF_FREE; - if (PySet_Discard(comp_free, k) < 0) { - return 0; - } - remove_dunder_class = 1; - } PyObject *v_flags = PyLong_FromLong(only_flags); if (v_flags == NULL) { return 0; diff --git a/Python/sysmodule.c b/Python/sysmodule.c index a99a97fe..d41fe822 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -722,7 +722,7 @@ sys_displayhook(PyObject *module, PyObject *o) if (o == Py_None) { Py_RETURN_NONE; } - if (PyObject_SetAttr(builtins, &_Py_ID(_), Py_None) != 0) + if (PyObject_SetAttr(builtins, _Py_LATIN1_CHR('_'), Py_None) != 0) return NULL; outf = _PySys_GetAttr(tstate, &_Py_ID(stdout)); if (outf == NULL || outf == Py_None) { @@ -744,10 +744,9 @@ sys_displayhook(PyObject *module, PyObject *o) return NULL; } } - _Py_DECLARE_STR(newline, "\n"); - if (PyFile_WriteObject(&_Py_STR(newline), outf, Py_PRINT_RAW) != 0) + if (PyFile_WriteObject(_Py_LATIN1_CHR('\n'), outf, Py_PRINT_RAW) != 0) return NULL; - if (PyObject_SetAttr(builtins, &_Py_ID(_), o) != 0) + if (PyObject_SetAttr(builtins, _Py_LATIN1_CHR('_'), o) != 0) return NULL; Py_RETURN_NONE; } @@ -927,8 +926,9 @@ sys_intern_impl(PyObject *module, PyObject *s) /*[clinic end generated code: output=be680c24f5c9e5d6 input=849483c006924e2f]*/ { if (PyUnicode_CheckExact(s)) { + PyInterpreterState *interp = _PyInterpreterState_GET(); Py_INCREF(s); - PyUnicode_InternInPlace(&s); + _PyUnicode_InternMortal(interp, &s); return s; } else { @@ -1918,14 +1918,22 @@ sys_getallocatedblocks_impl(PyObject *module) /*[clinic input] sys.getunicodeinternedsize -> Py_ssize_t + * + _only_immortal: bool = False + Return the number of elements of the unicode interned dictionary [clinic start generated code]*/ static Py_ssize_t -sys_getunicodeinternedsize_impl(PyObject *module) -/*[clinic end generated code: output=ad0e4c9738ed4129 input=726298eaa063347a]*/ +sys_getunicodeinternedsize_impl(PyObject *module, int _only_immortal) +/*[clinic end generated code: output=29a6377a94a14f70 input=0330b3408dd5bcc6]*/ { - return _PyUnicode_InternedSize(); + if (_only_immortal) { + return _PyUnicode_InternedSize_Immortal(); + } + else { + return _PyUnicode_InternedSize(); + } } /*[clinic input] diff --git a/Python/traceback.c b/Python/traceback.c index fdaf19d3..fba3594e 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -1242,6 +1242,8 @@ _Py_DumpASCII(int fd, PyObject *text) static void dump_frame(int fd, _PyInterpreterFrame *frame) { + assert(frame->owner != FRAME_OWNED_BY_CSTACK); + PyCodeObject *code = frame->f_code; PUTS(fd, " File "); if (code->co_filename != NULL @@ -1315,24 +1317,27 @@ dump_traceback(int fd, PyThreadState *tstate, int write_header) unsigned int depth = 0; while (1) { + if (frame->owner == FRAME_OWNED_BY_CSTACK) { + /* Trampoline frame */ + frame = frame->previous; + if (frame == NULL) { + break; + } + + /* Can't have more than one shim frame in a row */ + assert(frame->owner != FRAME_OWNED_BY_CSTACK); + } + if (MAX_FRAME_DEPTH <= depth) { PUTS(fd, " ...\n"); break; } + dump_frame(fd, frame); frame = frame->previous; if (frame == NULL) { break; } - if (frame->owner == FRAME_OWNED_BY_CSTACK) { - /* Trampoline frame */ - frame = frame->previous; - } - if (frame == NULL) { - break; - } - /* Can't have more than one shim frame in a row */ - assert(frame->owner != FRAME_OWNED_BY_CSTACK); depth++; } } diff --git a/Python/tracemalloc.c b/Python/tracemalloc.c index bc765623..e13064bd 100644 --- a/Python/tracemalloc.c +++ b/Python/tracemalloc.c @@ -836,7 +836,7 @@ _PyTraceMalloc_Init(void) tracemalloc_tracebacks = hashtable_new(hashtable_hash_traceback, hashtable_compare_traceback, - NULL, raw_free); + raw_free, NULL); tracemalloc_traces = tracemalloc_create_traces_table(); tracemalloc_domains = tracemalloc_create_domains_table(); diff --git a/README.rst b/README.rst index 840ac75b..c6dc40b1 100644 --- a/README.rst +++ b/README.rst @@ -1,4 +1,4 @@ -This is Python version 3.12.4 +This is Python version 3.12.8 ============================= .. image:: https://github.com/python/cpython/workflows/Tests/badge.svg @@ -64,7 +64,7 @@ the executable is called ``python.exe``; elsewhere it's just ``python``. Building a complete Python installation requires the use of various additional third-party libraries, depending on your build platform and configure options. Not all standard library modules are buildable or -useable on all platforms. Refer to the +usable on all platforms. Refer to the `Install dependencies `_ section of the `Developer Guide`_ for current detailed information on dependencies for various Linux distributions and macOS. diff --git a/Tools/build/check_extension_modules.py b/Tools/build/check_extension_modules.py index 59239c62..aa1ade71 100644 --- a/Tools/build/check_extension_modules.py +++ b/Tools/build/check_extension_modules.py @@ -54,6 +54,7 @@ "_overlapped", "_testconsole", "_winapi", + "_wmi", "msvcrt", "nt", "winreg", diff --git a/Tools/build/generate_global_objects.py b/Tools/build/generate_global_objects.py index ded19ee4..4cafeea9 100644 --- a/Tools/build/generate_global_objects.py +++ b/Tools/build/generate_global_objects.py @@ -362,9 +362,14 @@ def generate_static_strings_initializer(identifiers, strings): # This use of _Py_ID() is ignored by iter_global_strings() # since iter_files() ignores .h files. printer.write(f'string = &_Py_ID({i});') + printer.write(f'_PyUnicode_InternStatic(interp, &string);') printer.write(f'assert(_PyUnicode_CheckConsistency(string, 1));') - printer.write(f'_PyUnicode_InternInPlace(interp, &string);') - # XXX What about "strings"? + printer.write(f'assert(PyUnicode_GET_LENGTH(string) != 1);') + for value, name in sorted(strings.items()): + printer.write(f'string = &_Py_STR({name});') + printer.write(f'_PyUnicode_InternStatic(interp, &string);') + printer.write(f'assert(_PyUnicode_CheckConsistency(string, 1));') + printer.write(f'assert(PyUnicode_GET_LENGTH(string) != 1);') printer.write(END) printer.write(after) @@ -406,15 +411,31 @@ def generate_global_object_finalizers(generated_immortal_objects): def get_identifiers_and_strings() -> 'tuple[set[str], dict[str, str]]': identifiers = set(IDENTIFIERS) strings = {} + # Note that we store strings as they appear in C source, so the checks here + # can be defeated, e.g.: + # - "a" and "\0x61" won't be reported as duplicate. + # - "\n" appears as 2 characters. + # Probably not worth adding a C string parser. for name, string, *_ in iter_global_strings(): if string is None: if name not in IGNORED: identifiers.add(name) else: + if len(string) == 1 and ord(string) < 256: + # Give a nice message for common mistakes. + # To cover tricky cases (like "\n") we also generate C asserts. + raise ValueError( + 'do not use &_Py_ID or &_Py_STR for one-character latin-1 ' + + f'strings, use _Py_LATIN1_CHR instead: {string!r}') if string not in strings: strings[string] = name elif name != strings[string]: raise ValueError(f'string mismatch for {name!r} ({string!r} != {strings[name]!r}') + overlap = identifiers & set(strings.keys()) + if overlap: + raise ValueError( + 'do not use both _Py_ID and _Py_DECLARE_STR for the same string: ' + + repr(overlap)) return identifiers, strings diff --git a/Tools/build/generate_re_casefix.py b/Tools/build/generate_re_casefix.py index b57ac074..6cebfbd0 100755 --- a/Tools/build/generate_re_casefix.py +++ b/Tools/build/generate_re_casefix.py @@ -23,9 +23,9 @@ def update_file(file, content): # Maps the code of lowercased character to codes of different lowercased # characters which have the same uppercase. -_EXTRA_CASES = { +_EXTRA_CASES = {{ %s -} +}} """ def uname(i): diff --git a/Tools/build/generate_sbom.py b/Tools/build/generate_sbom.py index c08568f2..3299e447 100644 --- a/Tools/build/generate_sbom.py +++ b/Tools/build/generate_sbom.py @@ -59,6 +59,8 @@ class PackageFiles(typing.NamedTuple): include=["Modules/expat/**"], exclude=[ "Modules/expat/expat_config.h", + "Modules/expat/pyexpatns.h", + "Modules/_hacl/refresh.sh", ] ), "macholib": PackageFiles( @@ -96,6 +98,19 @@ def error_if(value: bool, error_message: str) -> None: sys.exit(1) +def is_root_directory_git_index() -> bool: + """Checks if the root directory is a git index""" + try: + subprocess.check_call( + ["git", "-C", str(CPYTHON_ROOT_DIR), "rev-parse"], + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + ) + except subprocess.CalledProcessError: + return False + return True + + def filter_gitignored_paths(paths: list[str]) -> list[str]: """ Filter out paths excluded by the gitignore file. @@ -108,6 +123,10 @@ def filter_gitignored_paths(paths: list[str]) -> list[str]: '.gitignore:9:*.a Tools/lib.a' """ + # No paths means no filtering to be done. + if not paths: + return [] + # Filter out files in gitignore. # Non-matching files show up as '::' git_check_ignore_proc = subprocess.run( @@ -204,6 +223,32 @@ def check_sbom_packages(sbom_data: dict[str, typing.Any]) -> None: "HACL* SBOM version doesn't match value in 'Modules/_hacl/refresh.sh'" ) + # libexpat specifies its expected rev in a refresh script. + if package["name"] == "libexpat": + libexpat_refresh_sh = (CPYTHON_ROOT_DIR / "Modules/expat/refresh.sh").read_text() + libexpat_expected_version_match = re.search( + r"expected_libexpat_version=\"([0-9]+\.[0-9]+\.[0-9]+)\"", + libexpat_refresh_sh + ) + libexpat_expected_sha256_match = re.search( + r"expected_libexpat_sha256=\"[a-f0-9]{40}\"", + libexpat_refresh_sh + ) + libexpat_expected_version = libexpat_expected_version_match and libexpat_expected_version_match.group(1) + libexpat_expected_sha256 = libexpat_expected_sha256_match and libexpat_expected_sha256_match.group(1) + + error_if( + libexpat_expected_version != version, + "libexpat SBOM version doesn't match value in 'Modules/expat/refresh.sh'" + ) + error_if( + package["checksums"] != [{ + "algorithm": "SHA256", + "checksumValue": libexpat_expected_sha256 + }], + "libexpat SBOM checksum doesn't match value in 'Modules/expat/refresh.sh'" + ) + # License must be on the approved list for SPDX. license_concluded = package["licenseConcluded"] error_if( @@ -337,6 +382,11 @@ def create_externals_sbom() -> None: def main() -> None: + # Don't regenerate the SBOM if we're not a git repository. + if not is_root_directory_git_index(): + print("Skipping SBOM generation due to not being a git repository") + return + create_source_sbom() create_externals_sbom() diff --git a/Tools/build/generate_token.py b/Tools/build/generate_token.py index 3bd307c1..6d27bc41 100755 --- a/Tools/build/generate_token.py +++ b/Tools/build/generate_token.py @@ -226,7 +226,8 @@ def make_rst(infile, outfile='Doc/library/token-list.inc'): # {AUTO_GENERATED_BY_SCRIPT} ''' token_py_template += ''' -__all__ = ['tok_name', 'ISTERMINAL', 'ISNONTERMINAL', 'ISEOF'] +__all__ = ['tok_name', 'ISTERMINAL', 'ISNONTERMINAL', 'ISEOF', + 'EXACT_TOKEN_TYPES'] %s N_TOKENS = %d diff --git a/Tools/build/regen-configure.sh b/Tools/build/regen-configure.sh index e34a36c1..c3df2917 100755 --- a/Tools/build/regen-configure.sh +++ b/Tools/build/regen-configure.sh @@ -5,12 +5,10 @@ set -e -x # The check_generated_files job of .github/workflows/build.yml must kept in # sync with this script. Use the same container image than the job so the job # doesn't need to run autoreconf in a container. -IMAGE="ubuntu:22.04" -DEPENDENCIES="autotools-dev autoconf autoconf-archive pkg-config" +IMAGE="ghcr.io/python/autoconf:2024.10.16.11360930377" AUTORECONF="autoreconf -ivf -Werror" WORK_DIR="/src" -SHELL_CMD="apt-get update && apt-get -yq install $DEPENDENCIES && cd $WORK_DIR && $AUTORECONF" abs_srcdir=$(cd $(dirname $0)/../..; pwd) @@ -28,4 +26,4 @@ if command -v selinuxenabled >/dev/null && selinuxenabled; then PATH_OPT=":Z" fi -"$RUNTIME" run --rm -v "$abs_srcdir:$WORK_DIR$PATH_OPT" "$IMAGE" /usr/bin/bash -c "$SHELL_CMD" +"$RUNTIME" run --rm -v "$abs_srcdir:$WORK_DIR$PATH_OPT" "$IMAGE" diff --git a/Tools/build/stable_abi.py b/Tools/build/stable_abi.py index c6363fda..ef162277 100644 --- a/Tools/build/stable_abi.py +++ b/Tools/build/stable_abi.py @@ -226,9 +226,9 @@ def sort_key(item): key=sort_key): write(f'EXPORT_DATA({item.name})') -REST_ROLES = { - 'function': 'function', - 'data': 'var', +ITEM_KIND_TO_DOC_ROLE = { + 'function': 'func', + 'data': 'data', 'struct': 'type', 'macro': 'macro', # 'const': 'const', # all undocumented @@ -237,22 +237,28 @@ def sort_key(item): @generator("doc_list", 'Doc/data/stable_abi.dat') def gen_doc_annotations(manifest, args, outfile): - """Generate/check the stable ABI list for documentation annotations""" + """Generate/check the stable ABI list for documentation annotations + + See ``StableABIEntry`` in ``Doc/tools/extensions/c_annotations.py`` + for a description of each field. + """ writer = csv.DictWriter( outfile, ['role', 'name', 'added', 'ifdef_note', 'struct_abi_kind'], lineterminator='\n') writer.writeheader() - for item in manifest.select(REST_ROLES.keys(), include_abi_only=False): + kinds = set(ITEM_KIND_TO_DOC_ROLE) + for item in manifest.select(kinds, include_abi_only=False): if item.ifdef: ifdef_note = manifest.contents[item.ifdef].doc else: ifdef_note = None row = { - 'role': REST_ROLES[item.kind], + 'role': ITEM_KIND_TO_DOC_ROLE[item.kind], 'name': item.name, 'added': item.added, - 'ifdef_note': ifdef_note} + 'ifdef_note': ifdef_note, + } rows = [row] if item.kind == 'struct': row['struct_abi_kind'] = item.struct_abi_kind @@ -260,7 +266,8 @@ def gen_doc_annotations(manifest, args, outfile): rows.append({ 'role': 'member', 'name': f'{item.name}.{member_name}', - 'added': item.added}) + 'added': item.added, + }) writer.writerows(rows) @generator("ctypes_test", 'Lib/test/test_stable_abi_ctypes.py') diff --git a/Tools/c-analyzer/c_parser/preprocessor/gcc.py b/Tools/c-analyzer/c_parser/preprocessor/gcc.py index 14761570..1108bdef 100644 --- a/Tools/c-analyzer/c_parser/preprocessor/gcc.py +++ b/Tools/c-analyzer/c_parser/preprocessor/gcc.py @@ -125,7 +125,7 @@ def _iter_top_include_lines(lines, topfile, cwd, raw): partial = 0 # depth files = [topfile] - # We start at 1 in case there are source lines (including blank onces) + # We start at 1 in case there are source lines (including blank ones) # before the first marker line. Also, we already verified in # _parse_marker_line() that the preprocessor reported lno as 1. lno = 1 diff --git a/Tools/c-analyzer/cpython/globals-to-fix.tsv b/Tools/c-analyzer/cpython/globals-to-fix.tsv index b47393e6..ac60ee4e 100644 --- a/Tools/c-analyzer/cpython/globals-to-fix.tsv +++ b/Tools/c-analyzer/cpython/globals-to-fix.tsv @@ -422,7 +422,6 @@ Modules/_ctypes/_ctypes.c CreateSwappedType suffix - Modules/_ctypes/_ctypes.c - _unpickle - Modules/_ctypes/_ctypes.c PyCArrayType_from_ctype cache - Modules/_cursesmodule.c - ModDict - -Modules/_datetimemodule.c datetime_strptime module - Modules/_datetimemodule.c - PyDateTime_TimeZone_UTC - Modules/_datetimemodule.c - PyDateTime_Epoch - Modules/_datetimemodule.c - us_per_ms - diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index efd519ff..b55bfab3 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -86,6 +86,17 @@ def __repr__(self) -> str: Outputter = Callable[[], str] TemplateDict = dict[str, str] + +def c_id(name: str) -> str: + if len(name) == 1 and ord(name) < 256: + if name.isalnum(): + return f"_Py_LATIN1_CHR('{name}')" + else: + return f'_Py_LATIN1_CHR({ord(name)})' + else: + return f'&_Py_ID({name})' + + class _TextAccumulator(NamedTuple): text: list[str] append: Appender @@ -1504,7 +1515,7 @@ def render_function(self, clinic, f): template_dict['keywords_c'] = ' '.join('"' + k + '",' for k in data.keywords) keywords = [k for k in data.keywords if k] - template_dict['keywords_py'] = ' '.join('&_Py_ID(' + k + '),' + template_dict['keywords_py'] = ' '.join(c_id(k) + ',' for k in keywords) template_dict['format_units'] = ''.join(data.format_units) template_dict['parse_arguments'] = ', '.join(data.parse_arguments) diff --git a/Tools/i18n/pygettext.py b/Tools/i18n/pygettext.py index 3a0b27ba..0d16e8f7 100755 --- a/Tools/i18n/pygettext.py +++ b/Tools/i18n/pygettext.py @@ -341,6 +341,9 @@ def __waiting(self, ttype, tstring, lineno): if ttype == tokenize.NAME and tstring in ('class', 'def'): self.__state = self.__suiteseen return + if ttype == tokenize.NAME and tstring in ('class', 'def'): + self.__state = self.__ignorenext + return if ttype == tokenize.NAME and tstring in opts.keywords: self.__state = self.__keywordseen return @@ -448,6 +451,9 @@ def __openseen(self, ttype, tstring, lineno): }, file=sys.stderr) self.__state = self.__waiting + def __ignorenext(self, ttype, tstring, lineno): + self.__state = self.__waiting + def __addentry(self, msg, lineno=None, isdocstring=0): if lineno is None: lineno = self.__lineno diff --git a/Tools/msi/buildrelease.bat b/Tools/msi/buildrelease.bat index b140839f..28f8bf02 100644 --- a/Tools/msi/buildrelease.bat +++ b/Tools/msi/buildrelease.bat @@ -127,7 +127,7 @@ if "%1" EQU "x86" ( set OUTDIR_PLAT=amd64 set OBJDIR_PLAT=x64 ) else if "%1" EQU "ARM64" ( - set BUILD=%Py_OutDir%amd64\ + set BUILD=%Py_OutDir%arm64\ set PGO=%~2 set BUILD_PLAT=ARM64 set OUTDIR_PLAT=arm64 diff --git a/Tools/msi/pip/pip.wxs b/Tools/msi/pip/pip.wxs index 1d8083ca..627c4710 100644 --- a/Tools/msi/pip/pip.wxs +++ b/Tools/msi/pip/pip.wxs @@ -25,8 +25,8 @@ - - + + (&DefaultFeature=3) AND NOT (!DefaultFeature=3) diff --git a/Tools/peg_generator/peg_extension/peg_extension.c b/Tools/peg_generator/peg_extension/peg_extension.c index 7df134b5..d8545c9d 100644 --- a/Tools/peg_generator/peg_extension/peg_extension.c +++ b/Tools/peg_generator/peg_extension/peg_extension.c @@ -108,7 +108,7 @@ parse_string(PyObject *self, PyObject *args, PyObject *kwds) static PyObject * clear_memo_stats(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(ignored)) { -#if defined(PY_DEBUG) +#if defined(Py_DEBUG) _PyPegen_clear_memo_statistics(); #endif Py_RETURN_NONE; @@ -117,7 +117,7 @@ clear_memo_stats(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(ignored)) static PyObject * get_memo_stats(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(ignored)) { -#if defined(PY_DEBUG) +#if defined(Py_DEBUG) return _PyPegen_get_memo_statistics(); #else Py_RETURN_NONE; @@ -128,7 +128,7 @@ get_memo_stats(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(ignored)) static PyObject * dump_memo_stats(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(ignored)) { -#if defined(PY_DEBUG) +#if defined(Py_DEBUG) PyObject *list = _PyPegen_get_memo_statistics(); if (list == NULL) { return NULL; diff --git a/Tools/requirements-hypothesis.txt b/Tools/requirements-hypothesis.txt index 9db2b74c..66898885 100644 --- a/Tools/requirements-hypothesis.txt +++ b/Tools/requirements-hypothesis.txt @@ -1,4 +1,4 @@ # Requirements file for hypothesis that # we use to run our property-based tests in CI. -hypothesis==6.84.0 +hypothesis==6.111.2 diff --git a/Tools/ssl/multissltests.py b/Tools/ssl/multissltests.py index efc4b243..2cab972a 100755 --- a/Tools/ssl/multissltests.py +++ b/Tools/ssl/multissltests.py @@ -43,13 +43,14 @@ log = logging.getLogger("multissl") OPENSSL_OLD_VERSIONS = [ + "1.1.1w", ] OPENSSL_RECENT_VERSIONS = [ - "1.1.1w", - "3.0.13", - "3.1.5", - "3.2.1", + "3.0.15", + "3.1.7", + "3.2.3", + "3.3.2", ] LIBRESSL_OLD_VERSIONS = [ @@ -394,6 +395,7 @@ def run_python_tests(self, tests, network=True): class BuildOpenSSL(AbstractBuilder): library = "OpenSSL" url_templates = ( + "https://github.com/openssl/openssl/releases/download/openssl-{v}/openssl-{v}.tar.gz", "https://www.openssl.org/source/openssl-{v}.tar.gz", "https://www.openssl.org/source/old/{s}/openssl-{v}.tar.gz" ) @@ -436,6 +438,7 @@ def short_version(self): parsed = parsed[:2] return ".".join(str(i) for i in parsed) + class BuildLibreSSL(AbstractBuilder): library = "LibreSSL" url_templates = ( diff --git a/Tools/unicode/makeunicodedata.py b/Tools/unicode/makeunicodedata.py index 034642db..8732db22 100644 --- a/Tools/unicode/makeunicodedata.py +++ b/Tools/unicode/makeunicodedata.py @@ -35,7 +35,7 @@ from textwrap import dedent from typing import Iterator, List, Optional, Set, Tuple -SCRIPT = sys.argv[0] +SCRIPT = os.path.normpath(sys.argv[0]) VERSION = "3.3" # The Unicode Database diff --git a/aclocal.m4 b/aclocal.m4 index 09ae5d1a..97514d83 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -41,32 +41,81 @@ m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun # If neither value is found, the user is instructed to specify the # ordering. # +# Early versions of this macro (i.e., before serial 12) would not work +# when interprocedural optimization (via link-time optimization) was +# enabled. This would happen when, say, the GCC/clang "-flto" flag, or the +# ICC "-ipo" flag was used, for example. The problem was that under +# these conditions, the compiler did not allocate for and write the special +# float value in the data segment of the object file, since doing so might +# not prove optimal once more context was available. Thus, the special value +# (in platform-dependent binary form) could not be found in the object file, +# and the macro would fail. +# +# The solution to the above problem was to: +# +# 1) Compile and link a whole test program rather than just compile an +# object file. This ensures that we reach the point where even an +# interprocedural optimizing compiler writes values to the data segment. +# +# 2) Add code that requires the compiler to write the special value to +# the data segment, as opposed to "optimizing away" the variable's +# allocation. This could be done via compiler keywords or options, but +# it's tricky to make this work for all versions of all compilers with +# all optimization settings. The chosen solution was to make the exit +# code of the test program depend on the storing of the special value +# in memory (in the data segment). Because the exit code can be +# verified, any compiler that aspires to be correct will produce a +# program binary that contains the value, which the macro can then find. +# +# How does the exit code depend on the special value residing in memory? +# Memory, unlike variables and registers, can be addressed indirectly at run +# time. The exit code of this test program is a result of indirectly reading +# and writing to the memory region where the special value is supposed to +# reside. The actual memory addresses used and the values to be written are +# derived from the the program input ("argv") and are therefore not known at +# compile or link time. The compiler has no choice but to defer the +# computation to run time, and to prepare by allocating and populating the +# data segment with the special value. For further details, refer to the +# source code of the test program. +# +# Note that the test program is never meant to be run. It only exists to host +# a double float value in a given platform's binary format. Thus, error +# handling is not included. +# # LICENSE # -# Copyright (c) 2008 Daniel Amelang +# Copyright (c) 2008, 2023 Daniel Amelang # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 11 +#serial 12 AC_DEFUN([AX_C_FLOAT_WORDS_BIGENDIAN], [AC_CACHE_CHECK(whether float word ordering is bigendian, ax_cv_c_float_words_bigendian, [ ax_cv_c_float_words_bigendian=unknown -AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ +AC_LINK_IFELSE([AC_LANG_SOURCE([[ + +#include + +static double m[] = {9.090423496703681e+223, 0.0}; -double d = 90904234967036810337470478905505011476211692735615632014797120844053488865816695273723469097858056257517020191247487429516932130503560650002327564517570778480236724525140520121371739201496540132640109977779420565776568942592.0; +int main (int argc, char *argv[]) +{ + m[atoi (argv[1])] += atof (argv[2]); + return m[atoi (argv[3])] > 0.0; +} ]])], [ -if grep noonsees conftest.$ac_objext >/dev/null ; then +if grep noonsees conftest$EXEEXT >/dev/null ; then ax_cv_c_float_words_bigendian=yes fi -if grep seesnoon conftest.$ac_objext >/dev/null ; then +if grep seesnoon conftest$EXEEXT >/dev/null ; then if test "$ax_cv_c_float_words_bigendian" = unknown; then ax_cv_c_float_words_bigendian=no else diff --git a/configure b/configure index 6dc8a66e..241cf8f3 100755 --- a/configure +++ b/configure @@ -7252,6 +7252,9 @@ fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $EXEEXT" >&5 printf "%s\n" "$EXEEXT" >&6; } +# Make sure we keep EXEEXT and ac_exeext sync'ed. +ac_exeext=$EXEEXT + # Test whether we're running on a non-case-sensitive system, in which # case we give a warning if no ext is given @@ -9509,7 +9512,7 @@ then : else $as_nop py_cflags=$CFLAGS - as_fn_append CFLAGS "-Wextra -Werror" + as_fn_append CFLAGS " -Wextra -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -9627,7 +9630,7 @@ then : else $as_nop py_cflags=$CFLAGS - as_fn_append CFLAGS "-Wunused-result -Werror" + as_fn_append CFLAGS " -Wunused-result -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -9672,7 +9675,7 @@ then : else $as_nop py_cflags=$CFLAGS - as_fn_append CFLAGS "-Wunused-parameter -Werror" + as_fn_append CFLAGS " -Wunused-parameter -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -9713,7 +9716,7 @@ then : else $as_nop py_cflags=$CFLAGS - as_fn_append CFLAGS "-Wint-conversion -Werror" + as_fn_append CFLAGS " -Wint-conversion -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -9754,7 +9757,7 @@ then : else $as_nop py_cflags=$CFLAGS - as_fn_append CFLAGS "-Wmissing-field-initializers -Werror" + as_fn_append CFLAGS " -Wmissing-field-initializers -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -9795,7 +9798,7 @@ then : else $as_nop py_cflags=$CFLAGS - as_fn_append CFLAGS "-Wsign-compare -Werror" + as_fn_append CFLAGS " -Wsign-compare -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -9836,7 +9839,7 @@ then : else $as_nop py_cflags=$CFLAGS - as_fn_append CFLAGS "-Wunreachable-code -Werror" + as_fn_append CFLAGS " -Wunreachable-code -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -9888,7 +9891,7 @@ then : else $as_nop py_cflags=$CFLAGS - as_fn_append CFLAGS "-Wstrict-prototypes -Werror" + as_fn_append CFLAGS " -Wstrict-prototypes -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -12789,7 +12792,7 @@ then BLDSHARED="$LDSHARED" fi ;; - Emscripten|WASI) + Emscripten*|WASI*) LDSHARED='$(CC) -shared' LDCXXSHARED='$(CXX) -shared';; Linux*|GNU*|QNX*|VxWorks*|Haiku*) @@ -22041,16 +22044,18 @@ else $as_nop #include #endif #include + volatile void *func; int main (void) { #ifdef HAVE_CRYPT_R - void *x = crypt_r; + func = crypt_r; #else - void *x = crypt; + func = crypt; #endif + return (func != NULL); ; return 0; @@ -23520,18 +23525,26 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -double d = 90904234967036810337470478905505011476211692735615632014797120844053488865816695273723469097858056257517020191247487429516932130503560650002327564517570778480236724525140520121371739201496540132640109977779420565776568942592.0; +#include + +static double m[] = {9.090423496703681e+223, 0.0}; + +int main (int argc, char *argv[]) +{ + m[atoi (argv[1])] += atof (argv[2]); + return m[atoi (argv[3])] > 0.0; +} _ACEOF -if ac_fn_c_try_compile "$LINENO" +if ac_fn_c_try_link "$LINENO" then : -if grep noonsees conftest.$ac_objext >/dev/null ; then +if grep noonsees conftest$EXEEXT >/dev/null ; then ax_cv_c_float_words_bigendian=yes fi -if grep seesnoon conftest.$ac_objext >/dev/null ; then +if grep seesnoon conftest$EXEEXT >/dev/null ; then if test "$ax_cv_c_float_words_bigendian" = unknown; then ax_cv_c_float_words_bigendian=no else @@ -23541,7 +23554,8 @@ fi fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_c_float_words_bigendian" >&5 printf "%s\n" "$ax_cv_c_float_words_bigendian" >&6; } @@ -23549,41 +23563,34 @@ printf "%s\n" "$ax_cv_c_float_words_bigendian" >&6; } case $ax_cv_c_float_words_bigendian in yes) -printf "%s\n" "#define FLOAT_WORDS_BIGENDIAN 1" >>confdefs.h +printf "%s\n" "#define DOUBLE_IS_BIG_ENDIAN_IEEE754 1" >>confdefs.h ;; no) - ;; - *) - as_fn_error $? " - -Unknown float word ordering. You need to manually preset -ax_cv_c_float_words_bigendian=no (or yes) according to your system. - - " "$LINENO" 5 ;; -esac +printf "%s\n" "#define DOUBLE_IS_LITTLE_ENDIAN_IEEE754 1" >>confdefs.h + ;; + *) + case $host_cpu in #( + *arm*) : + # Some ARM platforms use a mixed-endian representation for + # doubles. While Python doesn't currently have full support + # for these platforms (see e.g., issue 1762561), we can at + # least make sure that float <-> string conversions work. + # FLOAT_WORDS_BIGENDIAN doesn't actually detect this case, + # but if it's not big or little, then it must be this? -if test "$ax_cv_c_float_words_bigendian" = "yes" -then - -printf "%s\n" "#define DOUBLE_IS_BIG_ENDIAN_IEEE754 1" >>confdefs.h - -elif test "$ax_cv_c_float_words_bigendian" = "no" -then +printf "%s\n" "#define DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 1" >>confdefs.h + ;; #( + wasm*) : printf "%s\n" "#define DOUBLE_IS_LITTLE_ENDIAN_IEEE754 1" >>confdefs.h + ;; #( + *) : + ;; +esac ;; +esac -else - # Some ARM platforms use a mixed-endian representation for doubles. - # While Python doesn't currently have full support for these platforms - # (see e.g., issue 1762561), we can at least make sure that float <-> string - # conversions work. - # FLOAT_WORDS_BIGENDIAN doesnt actually detect this case, but if it's not big - # or little, then it must be this? - -printf "%s\n" "#define DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 1" >>confdefs.h -fi # The short float repr introduced in Python 3.1 requires the # correctly-rounded string <-> double conversion functions from @@ -28646,9 +28653,15 @@ case $ac_sys_system in #( py_cv_module__ctypes_test=n/a + py_cv_module__testexternalinspection=n/a + py_cv_module__testimportmultiple=n/a + py_cv_module__testmultiphase=n/a + py_cv_module__testsinglephase=n/a py_cv_module_fcntl=n/a py_cv_module_mmap=n/a py_cv_module_termios=n/a + py_cv_module_xxlimited=n/a + py_cv_module_xxlimited_35=n/a py_cv_module_=n/a diff --git a/configure.ac b/configure.ac index 8a32cb58..9270b5f7 100644 --- a/configure.ac +++ b/configure.ac @@ -1308,6 +1308,9 @@ AC_ARG_WITH([suffix], ]) AC_MSG_RESULT([$EXEEXT]) +# Make sure we keep EXEEXT and ac_exeext sync'ed. +AS_VAR_SET([ac_exeext], [$EXEEXT]) + # Test whether we're running on a non-case-sensitive system, in which # case we give a warning if no ext is given AC_SUBST([BUILDEXEEXT]) @@ -1599,7 +1602,7 @@ then AS_VAR_IF([host_cpu], [wasm64], [AS_VAR_APPEND([HOSTRUNNER], [" --experimental-wasm-memory64"])]) ], dnl TODO: support other WASI runtimes - dnl wasmtime starts the proces with "/" as CWD. For OOT builds add the + dnl wasmtime starts the process with "/" as CWD. For OOT builds add the dnl directory containing _sysconfigdata to PYTHONPATH. [WASI/*], [HOSTRUNNER='wasmtime run --wasm max-wasm-stack=8388608 --wasi preview2 --env PYTHONPATH=/$(shell realpath --relative-to $(abs_srcdir) $(abs_builddir))/$(shell cat pybuilddir.txt):/Lib --dir $(srcdir)::/'], [HOSTRUNNER=''] @@ -2371,7 +2374,7 @@ AC_DEFUN([PY_CHECK_CC_WARNING], [ AS_VAR_PUSHDEF([py_var], [ac_cv_$1_]m4_normalize($2)[_warning]) AC_CACHE_CHECK([m4_ifblank([$3], [if we can $1 $CC $2 warning], [$3])], [py_var], [ AS_VAR_COPY([py_cflags], [CFLAGS]) - AS_VAR_APPEND([CFLAGS], ["-W$2 -Werror"]) + AS_VAR_APPEND([CFLAGS], [" -W$2 -Werror"]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [AS_VAR_SET([py_var], [yes])], [AS_VAR_SET([py_var], [no])]) @@ -3356,7 +3359,7 @@ then BLDSHARED="$LDSHARED" fi ;; - Emscripten|WASI) + Emscripten*|WASI*) LDSHARED='$(CC) -shared' LDCXXSHARED='$(CXX) -shared';; Linux*|GNU*|QNX*|VxWorks*|Haiku*) @@ -3402,7 +3405,7 @@ then LDCXXSHARED='$(CXX) -Wl,-G,-Bexport';; WASI*) AS_VAR_IF([enable_wasm_dynamic_linking], [yes], [ - dnl not iplemented yet + dnl not implemented yet ]);; CYGWIN*) LDSHARED="gcc -shared -Wl,--enable-auto-image-base" @@ -3572,7 +3575,7 @@ esac AC_MSG_RESULT([$SHLIBS]) dnl perf trampoline is Linux specific and requires an arch-specific -dnl trampoline in asssembly. +dnl trampoline in assembly. AC_MSG_CHECKING([perf trampoline]) AS_CASE([$PLATFORM_TRIPLET], [x86_64-linux-gnu], [perf_trampoline=yes], @@ -5237,12 +5240,14 @@ WITH_SAVE_ENV([ #include #endif #include + volatile void *func; ], [ #ifdef HAVE_CRYPT_R - void *x = crypt_r; + func = crypt_r; #else - void *x = crypt; + func = crypt; #endif + return (func != NULL); ]) ], [ac_cv_crypt_crypt=yes], [ac_cv_crypt_crypt=no]) ]) @@ -5674,28 +5679,26 @@ AS_VAR_IF([ac_cv_gcc_asm_for_x64], [yes], [ # * Check for various properties of floating point * # ************************************************** -AX_C_FLOAT_WORDS_BIGENDIAN -if test "$ax_cv_c_float_words_bigendian" = "yes" -then - AC_DEFINE([DOUBLE_IS_BIG_ENDIAN_IEEE754], [1], - [Define if C doubles are 64-bit IEEE 754 binary format, stored - with the most significant byte first]) -elif test "$ax_cv_c_float_words_bigendian" = "no" -then - AC_DEFINE([DOUBLE_IS_LITTLE_ENDIAN_IEEE754], [1], - [Define if C doubles are 64-bit IEEE 754 binary format, stored - with the least significant byte first]) -else - # Some ARM platforms use a mixed-endian representation for doubles. - # While Python doesn't currently have full support for these platforms - # (see e.g., issue 1762561), we can at least make sure that float <-> string - # conversions work. - # FLOAT_WORDS_BIGENDIAN doesnt actually detect this case, but if it's not big - # or little, then it must be this? - AC_DEFINE([DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754], [1], - [Define if C doubles are 64-bit IEEE 754 binary format, stored - in ARM mixed-endian order (byte order 45670123)]) -fi +AX_C_FLOAT_WORDS_BIGENDIAN( + [AC_DEFINE([DOUBLE_IS_BIG_ENDIAN_IEEE754], [1], + [Define if C doubles are 64-bit IEEE 754 binary format, + stored with the most significant byte first])], + [AC_DEFINE([DOUBLE_IS_LITTLE_ENDIAN_IEEE754], [1], + [Define if C doubles are 64-bit IEEE 754 binary format, + stored with the least significant byte first])], + [AS_CASE([$host_cpu], + [*arm*], [# Some ARM platforms use a mixed-endian representation for + # doubles. While Python doesn't currently have full support + # for these platforms (see e.g., issue 1762561), we can at + # least make sure that float <-> string conversions work. + # FLOAT_WORDS_BIGENDIAN doesn't actually detect this case, + # but if it's not big or little, then it must be this? + AC_DEFINE([DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754], [1], + [Define if C doubles are 64-bit IEEE 754 binary format, + stored in ARM mixed-endian order (byte order 45670123)])], + [wasm*], [AC_DEFINE([DOUBLE_IS_LITTLE_ENDIAN_IEEE754], [1], + [Define if C doubles are 64-bit IEEE 754 binary format, + stored with the least significant byte first])])]) # The short float repr introduced in Python 3.1 requires the # correctly-rounded string <-> double conversion functions from @@ -7300,11 +7303,19 @@ AS_CASE([$ac_sys_system], [Emscripten/node*], [], [WASI/*], [ dnl WASI SDK 15.0 does not support file locking, mmap, and more. + dnl Test modules that must be compiled as shared libraries are not supported + dnl (see Modules/Setup.stdlib.in). PY_STDLIB_MOD_SET_NA( [_ctypes_test], + [_testexternalinspection], + [_testimportmultiple], + [_testmultiphase], + [_testsinglephase], [fcntl], [mmap], [termios], + [xxlimited], + [xxlimited_35], ) ] ) diff --git a/debian/PVER-dbg.postinst.in b/debian/PVER-dbg.postinst.in index 8f0208e8..2f015f9a 100644 --- a/debian/PVER-dbg.postinst.in +++ b/debian/PVER-dbg.postinst.in @@ -3,7 +3,7 @@ set -e if [ "$1" = configure ]; then - files=$(dpkg -L lib@PVER@-dbg@HOST_QUAL@ | sed -n '/^\/usr\/lib\/@PVER@\/.*\.py$/p') + files=$(LC_ALL=C.UTF8 dpkg -L @PVER@-dbg | sed -n '/^\/usr\/lib\/@PVER@\/.*\.py$/p') if [ -n "$files" ]; then /usr/bin/@PVER@ -E -S /usr/lib/@PVER@/py_compile.py $files if grep -sq '^byte-compile[^#]*optimize' /etc/python/debian_config; then diff --git a/debian/PVER-dbg.prerm.in b/debian/PVER-dbg.prerm.in index 3d92951d..fa1c5bb2 100644 --- a/debian/PVER-dbg.prerm.in +++ b/debian/PVER-dbg.prerm.in @@ -6,7 +6,7 @@ remove_bytecode() { pkg=$1 max=$(LANG=C LC_ALL=C xargs --show-limits < /dev/null 2>&1 | awk '/Maximum length/ {print int($NF / 4)}') - dpkg -L $pkg \ + LC_ALL=C.UTF8 dpkg -L $pkg \ | awk -F/ 'BEGIN {OFS="/"} /\.py$/ {$NF=sprintf("__pycache__/%s.*.py[co]", substr($NF,1,length($NF)-3)); print}' \ | xargs --max-chars=$max echo \ | while read files; do rm -f $files; done @@ -17,10 +17,10 @@ remove_bytecode() case "$1" in remove) - remove_bytecode lib@PVER@-dbg@HOST_QUAL@ + remove_bytecode @PVER@-dbg ;; upgrade) - remove_bytecode lib@PVER@-dbg@HOST_QUAL@ + remove_bytecode @PVER@-dbg ;; deconfigure) ;; diff --git a/debian/PVER-tk.postinst.in b/debian/PVER-tk.postinst.in new file mode 100644 index 00000000..da1df3c7 --- /dev/null +++ b/debian/PVER-tk.postinst.in @@ -0,0 +1,22 @@ +#! /bin/sh + +set -e + +case "$1" in + configure) + files=$(LC_ALL=C.UTF8 dpkg -L @PVER@-tk | sed -n '/^\/usr\/lib\/@PVER@\/.*\.py$/p') + if [ -n "$files" ]; then + if command -v @PVER@ >/dev/null; then + /usr/bin/@PVER@ -E -S /usr/lib/@PVER@/py_compile.py $files + if grep -sq '^byte-compile[^#]*optimize' /etc/python/debian_config; then + /usr/bin/@PVER@ -E -S -O /usr/lib/@PVER@/py_compile.py $files + fi + fi + else + echo >&2 "@PVER@: can't get files for byte-compilation" + fi +esac + +#DEBHELPER# + +exit 0 diff --git a/debian/PVER-tk.prerm.in b/debian/PVER-tk.prerm.in new file mode 100644 index 00000000..c0c9d324 --- /dev/null +++ b/debian/PVER-tk.prerm.in @@ -0,0 +1,35 @@ +#! /bin/sh + +set -e + +remove_bytecode() +{ + pkg=$1 + max=$(LANG=C LC_ALL=C xargs --show-limits < /dev/null 2>&1 | awk '/Maximum length/ {print int($NF / 4)}') + LC_ALL=C.UTF8 dpkg -L $pkg \ + | awk -F/ 'BEGIN {OFS="/"} /\.py$/ {$NF=sprintf("__pycache__/%s.*.py[co]", substr($NF,1,length($NF)-3)); print}' \ + | xargs --max-chars="$max" echo \ + | while read files; do rm -f $files; done + + find /usr/lib/@PVER@/tkinter \ + -name __pycache__ -type d -empty -print \ + | xargs -r rm -rf +} + +case "$1" in + remove) + remove_bytecode @PVER@-tk + ;; + upgrade) + ;; + deconfigure) + ;; + failed-upgrade) + ;; + *) + echo "prerm called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +#DEBHELPER# diff --git a/debian/PVER-venv.postinst.in b/debian/PVER-venv.postinst.in index a8304858..654a75e2 100644 --- a/debian/PVER-venv.postinst.in +++ b/debian/PVER-venv.postinst.in @@ -4,7 +4,7 @@ set -e case "$1" in configure) - files=$(dpkg -L @PVER@-venv | sed -n '/^\/usr\/lib\/@PVER@\/.*\.py$/p') + files=$(LC_ALL=C.UTF8 dpkg -L @PVER@-venv | sed -n '/^\/usr\/lib\/@PVER@\/.*\.py$/p') if [ -n "$files" ]; then /usr/bin/@PVER@ -E -S /usr/lib/@PVER@/py_compile.py $files if grep -sq '^byte-compile[^#]*optimize' /etc/python/debian_config; then diff --git a/debian/PVER-venv.prerm.in b/debian/PVER-venv.prerm.in index 9d864f0f..ad7706f2 100644 --- a/debian/PVER-venv.prerm.in +++ b/debian/PVER-venv.prerm.in @@ -6,7 +6,7 @@ remove_bytecode() { pkg=$1 max=$(LANG=C LC_ALL=C xargs --show-limits < /dev/null 2>&1 | awk '/Maximum length/ {print int($NF / 4)}') - dpkg -L $pkg \ + LC_ALL=C.UTF8 dpkg -L $pkg \ | awk -F/ 'BEGIN {OFS="/"} /\.py$/ {$NF=sprintf("__pycache__/%s.*.py[co]", substr($NF,1,length($NF)-3)); print}' \ | xargs --max-chars="$max" echo \ | while read files; do rm -f $files; done diff --git a/debian/PVER.postinst.in b/debian/PVER.postinst.in index 073bfb84..b158aecd 100644 --- a/debian/PVER.postinst.in +++ b/debian/PVER.postinst.in @@ -4,7 +4,7 @@ set -e case "$1" in configure) - files=$(dpkg -L lib@PVER@-stdlib@HOST_QUAL@ | sed -n '/^\/usr\/lib\/@PVER@\/.*\.py$/p') + files=$(LC_ALL=C.UTF8 dpkg -L lib@PVER@-stdlib@HOST_QUAL@ | sed -n '/^\/usr\/lib\/@PVER@\/.*\.py$/p') if [ -n "$files" ]; then /usr/bin/@PVER@ -E -S /usr/lib/@PVER@/py_compile.py $files if grep -sq '^byte-compile[^#]*optimize' /etc/python/debian_config; then diff --git a/debian/PVER.prerm.in b/debian/PVER.prerm.in index 0e7e5c59..a3cf30aa 100644 --- a/debian/PVER.prerm.in +++ b/debian/PVER.prerm.in @@ -6,7 +6,7 @@ remove_bytecode() { pkg=$1 max=$(LANG=C LC_ALL=C xargs --show-limits < /dev/null 2>&1 | awk '/Maximum length/ {print int($NF / 4)}') - dpkg -L $pkg \ + LC_ALL=C.UTF8 dpkg -L $pkg \ | awk -F/ 'BEGIN {OFS="/"} /\.py$/ {$NF=sprintf("__pycache__/%s.*.py[co]", substr($NF,1,length($NF)-3)); print}' \ | xargs --max-chars="$max" echo \ | while read files; do rm -f $files; done diff --git a/debian/changelog b/debian/changelog index ecda2f89..e8c1f3fe 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,9 +1,182 @@ -python3.12 (3.12.4-0deepin1) unstable; urgency=medium +python3.12 (3.12.8-3deepin1) UNRELEASED; urgency=medium + + * Revert t64 changes. + + -- Tianyu Chen Wed, 18 Dec 2024 18:05:18 +0800 + +python3.12 (3.12.8-3) unstable; urgency=medium + + * Update to the 3.12 branch 2024-12-13. + - Make sure extern "C" is closed when using Py_LIMITED_API (#127904). + Closes: #1089823. + + -- Matthias Klose Fri, 13 Dec 2024 14:19:48 +0100 + +python3.12 (3.12.8-2) unstable; urgency=medium + + * Update to the 3.12 branch 2024-12-12. + - Fix issue #127655, CVE-2024-12254. + * Add support for OpenSSL 3.4, issue #127330. + + -- Matthias Klose Thu, 12 Dec 2024 11:32:36 +0100 + +python3.12 (3.12.8-1) unstable; urgency=medium + + * Python 3.12.8 release. + * Refresh patches. + + -- Stefano Rivera Wed, 04 Dec 2024 08:15:27 -0400 + +python3.12 (3.12.7-3) unstable; urgency=medium + + * Strip the trailing + from PY_VERSION, again. (Closes: #1087011) + + -- Stefano Rivera Fri, 08 Nov 2024 09:55:36 -0800 + +python3.12 (3.12.7-2) unstable; urgency=medium + + * Update symbols file. + * Apply git updates to 2024-11-03. + * Adjust lib-argparse.diff to avoid failing test_argparse's translation + test. + + -- Stefano Rivera Mon, 04 Nov 2024 20:56:37 -0800 + +python3.12 (3.12.7-1) unstable; urgency=medium + + * Python 3.12.7 release. + * Refresh patches. + * Build-Depend on python3-{pip,setuptools,wheel}-whl for tests. + * Verify upstream PGP signature. + * Patch: Strip absolute --libdir paths from configure args in test_freeze. + + -- Stefano Rivera Thu, 03 Oct 2024 09:15:22 -0600 + +python3.12 (3.12.6-1) unstable; urgency=medium + + * Python 3.12.6 release. + - Fixes: CVE-2015-2104, CVE-2023-27043 (Closes: #1059299), CVE-2024-4030, + CVE-2024-4032, CVE-2024-6232, CVE-2024-6923, CVE-2024-7592, and + CVE-2024-8088. + * Refresh patches. + * Remove debian/locale-gen, we use locales-all. (Closes: #1076778) + * Re-enable build-time tests. (Closes: #1076779) + - Build-Depend on xvfb and xauth again. + + -- Stefano Rivera Sat, 07 Sep 2024 16:20:15 +0200 + +python3.12 (3.12.5-4) unstable; urgency=medium + + * python3.x-tk: Make byte-compilation depend on the availability of + the interpreter. + + -- Matthias Klose Thu, 22 Aug 2024 15:11:09 +0200 + +python3.12 (3.12.5-3) unstable; urgency=medium + + * Add python3.x-tk maintainer scripts. + * Call dpkg with LC_ALL=C.UTF8 set. + + -- Matthias Klose Thu, 22 Aug 2024 09:49:39 +0200 + +python3.12 (3.12.5-2) experimental; urgency=medium + + * Build python3.12-gdbm and python3.12-tk packages again; Having these + extensions hidden in the libpython-stdlib packages raises some chrootkit + warnings. These packages should not be used as dependencies, and do not + depend on the Python interpreter. For dependencies, the existing + python3-gdbm and python3-tk packages should be used. + + -- Matthias Klose Wed, 21 Aug 2024 09:45:53 +0200 + +python3.12 (3.12.5-1) unstable; urgency=medium + + * Python 3.12.5 release. + * libpython-stdlib: Include the _gdbm and _tkinter extensions, prefixed + with a dot, and no dependencies on the gbm and tcl/tk libraries. + * Refresh patches. + * Bump standards version. + + -- Matthias Klose Wed, 07 Aug 2024 15:49:14 +0200 + +python3.12 (3.12.4-3) unstable; urgency=medium + + [ Matthias Klose ] + * Set ELF_PACKAGE_METADATA, if unset. + * Fix multiarch path for hurd-amd64. Closes: #1076321. + * Don't configure -with-dtrace on the Hurd. Closes: #1065456. + * Update from the 3.12 branch 2024-07-15. + + [ Benjamin Drung ] + * debian/rules: Use pkg-info.mk. + * debian/rules: Use architecture.mk. + * Rely on SOURCE_DATE_EPOCH for reproducibility. + + [ Graham Inggs ] + * Drop test dependencies on python3-distutils. + * Skip test_exceptions and test_repl which never run to + completion on the Ubuntu autopkgtest infrastructure. + + -- Matthias Klose Mon, 15 Jul 2024 14:17:32 +0200 + +python3.12 (3.12.4-1) unstable; urgency=medium * Python 3.12.4 release. * Refresh patches. + * Patch: Ignore test/wheeldata completely in test_makefile. + + -- Stefano Rivera Wed, 12 Jun 2024 20:06:53 +0100 + +python3.12 (3.12.3-1) unstable; urgency=medium + + * Python 3.12.3 release. + + -- Matthias Klose Wed, 10 Apr 2024 07:33:47 +0200 + +python3.12 (3.12.2-5) unstable; urgency=medium + + * Update to the 3.12 branch 2024-02-02. + - Make C API compatible with ISO C90 (GH-116950). Closes: #1064028. + - Upstream patch for GH-115874. + - Still identify as "3.12.2", because "3.12.2+" is mis-treated by some + third-party packages. + * Use CFLAGS_NODIST, LDFLAGS_NODIST for passing build flags. + * d/rules: Move configure/build targets for each build together. + * Drop ffi configure options, obsolete. + * Re-enable PGO/LTO builds. + + -- Matthias Klose Tue, 02 Apr 2024 16:53:02 +0200 + +python3.12 (3.12.2-4) unstable; urgency=medium + + [ Stefano Rivera ] + * Build-Depend on libnsl-dev for NIS support. Closes: #1065128. + + [ Matthias Klose ] + * Fix override files for renamed t64 packages. + * Fix package names in PVER-dbg maintainer scripts. Addresses: #1065164. + * Really build without LTO when requested. + * Disable LTO builds and testsuite for now (mesa t64 transition ...). + + -- Matthias Klose Sun, 03 Mar 2024 10:11:00 +0100 + +python3.12 (3.12.2-3) unstable; urgency=medium + + * Actually apply the teedataobject_clear patch. Closes: #1063345. + + -- Stefano Rivera Thu, 29 Feb 2024 11:43:19 -0400 + +python3.12 (3.12.2-2) unstable; urgency=medium + + [ Colin Watson ] + * Don't rely on module state in teedataobject_clear (from Brandt Bucher in + https://github.com/python/cpython/issues/115874). Closes: #1063345. + + [ Steve Langasek ] + * Rename libraries for 64-bit time_t transition, declare X-Time64-Compat + to get proper Provides (Steve Langasek). Closes: #1064336. - -- Tianyu Chen Tue, 09 Jul 2024 11:31:23 +0200 + -- Matthias Klose Thu, 29 Feb 2024 02:56:09 +0100 python3.12 (3.12.2-1) unstable; urgency=medium diff --git a/debian/control b/debian/control index 84901df4..ac403ab2 100644 --- a/debian/control +++ b/debian/control @@ -9,18 +9,25 @@ Build-Depends: debhelper (>= 11), dpkg-dev (>= 1.17.11), libreadline-dev | libeditreadline-dev, libncurses-dev, zlib1g-dev, libbz2-dev, liblzma-dev, libgdbm-dev, libdb-dev, - tk-dev, blt-dev (>= 2.4z), libssl-dev, + tk-dev, blt-dev (>= 2.4z), + libssl-dev, libexpat1-dev, libbluetooth-dev [linux-any] , locales-all, + libnsl-dev, libsqlite3-dev, libffi-dev (>= 3.0.5) [!or1k], libgpm2 [linux-any], media-types | mime-support, netbase, bzip2, time, python3:any, python3.12:any , - net-tools, xvfb , xauth , tzdata , + net-tools, + python3-pip-whl , + python3-setuptools-whl , + python3-wheel-whl , + xvfb , xauth , + tzdata , systemtap-sdt-dev [!hurd-amd64 !hurd-i386], valgrind-if-available, Build-Depends-Indep: python3-sphinx, python3-docs-theme, texinfo -Standards-Version: 4.6.2 +Standards-Version: 4.7.0 Vcs-Browser: https://salsa.debian.org/cpython-team/python3 Vcs-Git: https://salsa.debian.org/cpython-team/python3.git XS-Testsuite: autopkgtest @@ -240,8 +247,10 @@ Architecture: any Multi-Arch: same Pre-Depends: ${misc:Pre-Depends} Depends: libpython3.12-stdlib (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Breaks: python3-gdbm-dbg (<< 3.9.9-1~) -Replaces: python3-gdbm-dbg (<< 3.9.9-1~) +Breaks: libpython3.12-dbg (<< ${source:Version}), + python3-gdbm-dbg (<< 3.12.5-2~), python3-tk-dbg (<< 3.12.5-2~) +Replaces: libpython3.12-dbg, + python3-gdbm-dbg (<< 3.12.5-2~), python3-tk-dbg (<< 3.12.5-2~) Description: Debug Build of the Python Interpreter (version 3.12) The package holds two things: . @@ -276,3 +285,25 @@ Description: Python Interpreter with complete class library (version 3.12) . According to the Debian Python policy, this package must not be used in build dependencies, dependencies and recommendations. + +Package: python3.12-tk +Architecture: any +Depends: ${misc:Depends}, ${shlibs:Depends} +Enhances: python3.12 +Suggests: tix +Breaks: python3-tk (<< 3.12.5-2~) +Replaces: python3-tk (<< 3.12.5-2~) +XB-Python-Version: 3.12 +Description: Tkinter - Writing Tk applications with Python (v3.12) + A module for writing portable GUI applications with Python (v3.12) using Tk. + Also known as Tkinter. + +Package: python3.12-gdbm +Architecture: any +Depends: ${misc:Depends}, ${shlibs:Depends} +Enhances: python3.12 +Breaks: python3-gdbm (<< 3.12.5-2~) +Replaces: python3-gdbm (<< 3.12.5-2~) +Description: GNU dbm database support for Python (v3.12) + GNU dbm database module for Python. Install this if you want to + create or read GNU dbm database files with Python. diff --git a/debian/control.in b/debian/control.in index 8b7d1df2..a6186fae 100644 --- a/debian/control.in +++ b/debian/control.in @@ -9,18 +9,25 @@ Build-Depends: debhelper (>= 11), @bd_dpkgdev@ libreadline-dev | libeditreadline-dev, libncurses-dev, @bd_gcc@ zlib1g-dev, libbz2-dev, liblzma-dev, libgdbm-dev, @bd_dbm@, - tk-dev, blt-dev (>= 2.4z), libssl-dev, + tk-dev, blt-dev (>= 2.4z), + libssl-dev, libexpat1-dev, libbluetooth-dev [linux-any] , locales-all, + libnsl-dev, libsqlite3-dev, libffi-dev (>= 3.0.5) [!or1k], libgpm2 [linux-any], media-types | mime-support, netbase, bzip2, time, python3@bd_qual@, @PVER@@bd_qual@ , - net-tools, xvfb , xauth , tzdata , + net-tools, + python3-pip-whl , + python3-setuptools-whl , + python3-wheel-whl , + xvfb , xauth , + tzdata , systemtap-sdt-dev [!hurd-amd64 !hurd-i386], valgrind-if-available, Build-Depends-Indep: python3-sphinx, python3-docs-theme, texinfo -Standards-Version: 4.6.2 +Standards-Version: 4.7.0 Vcs-Browser: https://salsa.debian.org/cpython-team/python3 Vcs-Git: https://salsa.debian.org/cpython-team/python3.git XS-Testsuite: autopkgtest @@ -240,8 +247,10 @@ Architecture: any Multi-Arch: same Pre-Depends: ${misc:Pre-Depends} Depends: lib@PVER@-stdlib (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Breaks: python3-gdbm-dbg (<< 3.9.9-1~) -Replaces: python3-gdbm-dbg (<< 3.9.9-1~) +Breaks: lib@PVER@-dbg (<< ${source:Version}), + python3-gdbm-dbg (<< 3.12.5-2~), python3-tk-dbg (<< 3.12.5-2~) +Replaces: lib@PVER@-dbg, + python3-gdbm-dbg (<< 3.12.5-2~), python3-tk-dbg (<< 3.12.5-2~) Description: Debug Build of the Python Interpreter (version @VER@) The package holds two things: . diff --git a/debian/control.stdlib b/debian/control.stdlib index fa1d4446..c1c5c4d5 100644 --- a/debian/control.stdlib +++ b/debian/control.stdlib @@ -1,7 +1,11 @@ + Package: @PVER@-tk Architecture: any -Depends: @PVER@ (= ${Source-Version}), ${shlibs:Depends} +Depends: ${misc:Depends}, ${shlibs:Depends} +Enhances: @PVER@ Suggests: tix +Breaks: python3-tk (<< 3.12.5-2~) +Replaces: python3-tk (<< 3.12.5-2~) XB-Python-Version: @VER@ Description: Tkinter - Writing Tk applications with Python (v@VER@) A module for writing portable GUI applications with Python (v@VER@) using Tk. @@ -9,8 +13,10 @@ Description: Tkinter - Writing Tk applications with Python (v@VER@) Package: @PVER@-gdbm Architecture: any -Depends: @PVER@ (= ${Source-Version}), ${shlibs:Depends} +Depends: ${misc:Depends}, ${shlibs:Depends} +Enhances: @PVER@ +Breaks: python3-gdbm (<< 3.12.5-2~) +Replaces: python3-gdbm (<< 3.12.5-2~) Description: GNU dbm database support for Python (v@VER@) GNU dbm database module for Python. Install this if you want to create or read GNU dbm database files with Python. - diff --git a/debian/idle-PVER.prerm.in b/debian/idle-PVER.prerm.in index 6fc9ca63..de035f8b 100644 --- a/debian/idle-PVER.prerm.in +++ b/debian/idle-PVER.prerm.in @@ -6,7 +6,7 @@ remove_bytecode() { pkg=$1 max=$(LANG=C LC_ALL=C xargs --show-limits < /dev/null 2>&1 | awk '/Maximum length/ {print int($NF / 4)}') - dpkg -L $pkg \ + LC_ALL=C.UTF8 dpkg -L $pkg \ | awk -F/ 'BEGIN {OFS="/"} /\.py$/ {$NF=sprintf("__pycache__/%s.*.py[co]", substr($NF,1,length($NF)-3)); print}' \ | xargs --max-chars=$max echo \ | while read files; do rm -f $files; done diff --git a/debian/libPVER-dbg.overrides.in b/debian/libPVER-dbg.overrides.in index 2496cd5f..edd9f468 100644 --- a/debian/libPVER-dbg.overrides.in +++ b/debian/libPVER-dbg.overrides.in @@ -1,4 +1,3 @@ -lib@PVER@-dbg binary: package-name-doesnt-match-sonames lib@PVER@-dbg binary: non-dev-pkg-with-shlib-symlink # no, it's not unusual diff --git a/debian/libPVER-minimal.postrm.in b/debian/libPVER-minimal.postrm.in index e267ac41..e44228d2 100644 --- a/debian/libPVER-minimal.postrm.in +++ b/debian/libPVER-minimal.postrm.in @@ -3,7 +3,7 @@ set -e if [ "$1" = "purge" ]; then - pc=$(dpkg-query -f '${db:Status-Abbrev} ${binary:Package}\n' -W lib@PVER@-minimal \ + pc=$(LC_ALL=C.UTF8 dpkg-query -f '${db:Status-Abbrev} ${binary:Package}\n' -W lib@PVER@-minimal \ | grep -v '^.n' | wc -l) if [ "$pc" -lt 1 ]; then find /usr/lib/@PVER@ -depth -type d -name __pycache__ \ diff --git a/debian/libPVER-minimal.prerm.in b/debian/libPVER-minimal.prerm.in index 16aa0840..65e75b92 100644 --- a/debian/libPVER-minimal.prerm.in +++ b/debian/libPVER-minimal.prerm.in @@ -6,7 +6,7 @@ remove_bytecode() { pkg=$1 max=$(LANG=C LC_ALL=C xargs --show-limits < /dev/null 2>&1 | awk '/Maximum length/ {print int($NF / 4)}') - dpkg -L $pkg \ + LC_ALL=C.UTF8 dpkg -L $pkg \ | awk -F/ 'BEGIN {OFS="/"} /\.py$/ {$NF=sprintf("__pycache__/%s.*.py[co]", substr($NF,1,length($NF)-3)); print}' \ | xargs --max-chars="$max" echo \ | while read files; do rm -f $files; done @@ -18,7 +18,7 @@ remove_bytecode() case "$1" in remove) - pc=$(dpkg-query -f '${db:Status-Abbrev} ${binary:Package}\n' -W lib@PVER@-minimal \ + pc=$(LC_ALL=C.UTF8 dpkg-query -f '${db:Status-Abbrev} ${binary:Package}\n' -W lib@PVER@-minimal \ | grep -v '^.n' | wc -l) if [ "$pc" -le 1 ]; then remove_bytecode lib@PVER@-minimal@HOST_QUAL@ diff --git a/debian/libPVER-stdlib.prerm.in b/debian/libPVER-stdlib.prerm.in index 4a5611b6..897eabfa 100644 --- a/debian/libPVER-stdlib.prerm.in +++ b/debian/libPVER-stdlib.prerm.in @@ -6,7 +6,7 @@ remove_bytecode() { pkg=$1 max=$(LANG=C LC_ALL=C xargs --show-limits < /dev/null 2>&1 | awk '/Maximum length/ {print int($NF / 4)}') - dpkg -L $pkg \ + LC_ALL=C.UTF8 dpkg -L $pkg \ | awk -F/ 'BEGIN {OFS="/"} /\.py$/ {$NF=sprintf("__pycache__/%s.*.py[co]", substr($NF,1,length($NF)-3)); print}' \ | xargs --max-chars="$max" echo \ | while read files; do rm -f $files; done @@ -20,7 +20,7 @@ remove_bytecode() case "$1" in remove) - pc=$(dpkg-query -f '${db:Status-Abbrev} ${binary:Package}\n' -W lib@PVER@-stdlib \ + pc=$(LC_ALL=C.UTF8 dpkg-query -f '${db:Status-Abbrev} ${binary:Package}\n' -W lib@PVER@-stdlib \ | grep -v '^.n' | wc -l) if [ "$pc" -le 1 ]; then remove_bytecode lib@PVER@-stdlib@HOST_QUAL@ diff --git a/debian/libPVER-testsuite.postinst.in b/debian/libPVER-testsuite.postinst.in index 45b81e97..d11ca230 100644 --- a/debian/libPVER-testsuite.postinst.in +++ b/debian/libPVER-testsuite.postinst.in @@ -4,7 +4,7 @@ set -e case "$1" in configure) - files=$(dpkg -L lib@PVER@-testsuite | sed -n '/^\/usr\/lib\/@PVER@\/.*\.py$/p' | grep -Ev '/test_lib2to3/data|/tokenizedata/bad_|/badsyntax_') + files=$(LC_ALL=C.UTF8 dpkg -L lib@PVER@-testsuite | sed -n '/^\/usr\/lib\/@PVER@\/.*\.py$/p' | grep -Ev '/test_lib2to3/data|/tokenizedata/bad_|/badsyntax_') if [ -n "$files" ]; then /usr/bin/@PVER@ -E -S -W ignore /usr/lib/@PVER@/py_compile.py $files if grep -sq '^byte-compile[^#]*optimize' /etc/python/debian_config; then diff --git a/debian/libPVER-testsuite.prerm.in b/debian/libPVER-testsuite.prerm.in index f003f91a..eddeb91c 100644 --- a/debian/libPVER-testsuite.prerm.in +++ b/debian/libPVER-testsuite.prerm.in @@ -6,7 +6,7 @@ remove_bytecode() { pkg=$1 max=$(LANG=C LC_ALL=C xargs --show-limits < /dev/null 2>&1 | awk '/Maximum length/ {print int($NF / 4)}') - dpkg -L $pkg \ + LC_ALL=C.UTF8 dpkg -L $pkg \ | awk -F/ 'BEGIN {OFS="/"} /\.py$/ {$NF=sprintf("__pycache__/%s.*.py[co]", substr($NF,1,length($NF)-3)); print}' \ | xargs --max-chars="$max" echo \ | while read files; do rm -f $files; done diff --git a/debian/libPVER.overrides.in b/debian/libPVER.overrides.in index 062dd469..aeb562aa 100644 --- a/debian/libPVER.overrides.in +++ b/debian/libPVER.overrides.in @@ -1,4 +1,2 @@ -lib@PVER@ binary: package-name-doesnt-match-sonames - # pyexpat.c contains expat error messages that lintian mis-attributes to embedding lib@PVER@ binary: embedded-library diff --git a/debian/libpython.symbols.in b/debian/libpython.symbols.in index 2169c972..a70c6194 100644 --- a/debian/libpython.symbols.in +++ b/debian/libpython.symbols.in @@ -1567,6 +1567,9 @@ _PyUnicode_FromASCII@Base @SVER@ _PyUnicode_FromId@Base @SVER@ _PyUnicode_InsertThousandsGrouping@Base @SVER@ + _PyUnicode_InternImmortal@Base @SVER@ + _PyUnicode_InternInPlace@Base @SVER@ + _PyUnicode_InternMortal@Base @SVER@ _PyUnicode_IsAlpha@Base @SVER@ _PyUnicode_IsCaseIgnorable@Base @SVER@ _PyUnicode_IsCased@Base @SVER@ diff --git a/debian/multiarch.h.in b/debian/multiarch.h.in index e00632c6..bb37cec9 100644 --- a/debian/multiarch.h.in +++ b/debian/multiarch.h.in @@ -115,7 +115,13 @@ # error unknown multiarch location for @header@ # endif #elif defined(__gnu_hurd__) -# include +# if defined(__LP64__) +# include +# elif defined(__i386__) +# include +# else +# error unknown multiarch location for @header@ +# endif #else # error unknown multiarch location for @header@ #endif diff --git a/debian/patches/argparse-no-shutil.diff b/debian/patches/argparse-no-shutil.diff index b105553f..a3b08cf2 100644 --- a/debian/patches/argparse-no-shutil.diff +++ b/debian/patches/argparse-no-shutil.diff @@ -6,7 +6,7 @@ Forwarded: not-needed --- a/Lib/argparse.py +++ b/Lib/argparse.py -@@ -178,9 +178,12 @@ +@@ -180,9 +180,12 @@ # default setting for width if width is None: diff --git a/debian/patches/deb-locations.diff b/debian/patches/deb-locations.diff index b5a39f26..4c19fb20 100644 --- a/debian/patches/deb-locations.diff +++ b/debian/patches/deb-locations.diff @@ -3,7 +3,7 @@ Forwarded: not-needed --- a/Lib/pydoc.py +++ b/Lib/pydoc.py -@@ -31,6 +31,10 @@ +@@ -31,6 +31,10 @@ to a file named ".html". Module docs for core modules are assumed to be in @@ -16,7 +16,7 @@ Forwarded: not-needed This can be overridden by setting the PYTHONDOCS environment variable --- a/Misc/python.man +++ b/Misc/python.man -@@ -425,7 +425,7 @@ +@@ -426,7 +426,7 @@ exception). Error messages are written These are subject to difference depending on local installation conventions; ${prefix} and ${exec_prefix} are installation-dependent and should be interpreted as for GNU software; they may be the same. diff --git a/debian/patches/destshared-location.diff b/debian/patches/destshared-location.diff index 6b918741..d03d1e5d 100644 --- a/debian/patches/destshared-location.diff +++ b/debian/patches/destshared-location.diff @@ -6,10 +6,10 @@ Forwarded: no --- a/Makefile.pre.in +++ b/Makefile.pre.in -@@ -168,7 +168,7 @@ EXT_SUFFIX= @EXT_SUFFIX@ +@@ -168,7 +168,7 @@ LDSHARED= @LDSHARED@ $(PY_LDFLAGS) BLDSHARED= @BLDSHARED@ $(PY_CORE_LDFLAGS) - LDCXXSHARED= @LDCXXSHARED@ + LDCXXSHARED= @LDCXXSHARED@ $(PY_LDFLAGS) -DESTSHARED= $(BINLIBDEST)/lib-dynload +DESTSHARED= $(LIBDEST)/lib-dynload diff --git a/debian/patches/disable-sem-check.diff b/debian/patches/disable-sem-check.diff index 4fa84e50..d5adc1d5 100644 --- a/debian/patches/disable-sem-check.diff +++ b/debian/patches/disable-sem-check.diff @@ -6,7 +6,7 @@ Forwarded: not-needed --- a/configure.ac +++ b/configure.ac -@@ -5790,10 +5790,15 @@ AC_CACHE_CHECK([whether POSIX semaphores +@@ -5819,10 +5819,15 @@ [ac_cv_posix_semaphores_enabled=yes]) ) AS_VAR_IF([ac_cv_posix_semaphores_enabled], [no], [ diff --git a/debian/patches/distutils-install-layout.diff b/debian/patches/distutils-install-layout.diff index 77463538..d101da0f 100644 --- a/debian/patches/distutils-install-layout.diff +++ b/debian/patches/distutils-install-layout.diff @@ -34,7 +34,7 @@ Forwarded: not-needed If a file named "pyvenv.cfg" exists one directory above sys.executable, sys.prefix and sys.exec_prefix are set to that directory and it is also checked for site-packages (sys.base_prefix and -@@ -377,6 +383,8 @@ def getsitepackages(prefixes=None): +@@ -377,6 +383,8 @@ if prefixes is None: prefixes = PREFIXES @@ -43,7 +43,7 @@ Forwarded: not-needed for prefix in prefixes: if not prefix or prefix in seen: continue -@@ -387,10 +395,21 @@ def getsitepackages(prefixes=None): +@@ -387,10 +395,21 @@ if sys.platlibdir != "lib": libdirs.append("lib") @@ -68,7 +68,7 @@ Forwarded: not-needed sitepackages.append(prefix) --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py -@@ -325,16 +325,16 @@ class HelperFunctionsTests(unittest.Test +@@ -325,16 +325,16 @@ if os.sep == '/': # OS X, Linux, FreeBSD, etc if sys.platlibdir != "lib": @@ -92,7 +92,7 @@ Forwarded: not-needed # other platforms --- a/Lib/pydoc.py +++ b/Lib/pydoc.py -@@ -532,6 +532,7 @@ class Doc: +@@ -532,6 +532,7 @@ 'marshal', 'posix', 'signal', 'sys', '_thread', 'zipimport') or (file.startswith(basedir) and diff --git a/debian/patches/ensurepip-disabled.diff b/debian/patches/ensurepip-disabled.diff index 1f11ce99..b2cea69e 100644 --- a/debian/patches/ensurepip-disabled.diff +++ b/debian/patches/ensurepip-disabled.diff @@ -6,7 +6,7 @@ Forwarded: not-needed --- a/Lib/ensurepip/__init__.py +++ b/Lib/ensurepip/__init__.py -@@ -7,6 +7,34 @@ import sysconfig +@@ -7,6 +7,34 @@ import tempfile from importlib import resources @@ -41,7 +41,7 @@ Forwarded: not-needed __all__ = ["version", "bootstrap"] _PACKAGE_NAMES = ('pip',) -@@ -144,6 +172,11 @@ def _bootstrap(*, root=None, upgrade=Fal +@@ -144,6 +172,11 @@ Note that calling this function will alter both sys.path and os.environ. """ @@ -55,7 +55,7 @@ Forwarded: not-needed --- a/Lib/venv/__init__.py +++ b/Lib/venv/__init__.py -@@ -356,8 +356,26 @@ class EnvBuilder: +@@ -384,8 +384,26 @@ def _setup_pip(self, context): """Installs or upgrades pip in a virtual environment""" diff --git a/debian/patches/git-updates.diff b/debian/patches/git-updates.diff index cbede850..6311b0eb 100644 --- a/debian/patches/git-updates.diff +++ b/debian/patches/git-updates.diff @@ -1,6 +1,1370 @@ -Description: Updates from the 3.12 branch (until 2023-12-02). +Description: Updates from the 3.12 branch (until 2024-12-13). We pick the latest updates from the maintainance branch, and carry them in a patch, rather than creating and uploading uploading a new .orig tarball. -# git diff --no-renames 0fb18b02c8ad56299d6a2910be0bab8ad601ef24 acc62db8af4e472a4922c10b91c60c36c49a5f79 | filterdiff -x ?/.hgignore -x ?/.hgeol -x ?/.hgtags -x ?/.hgtouch -x ?/.gitignore -x ?/.gitattributes -x '?/.github/*' -x '?/.git*' -x ?/.codecov.yml -x ?/.travis.yml -x ?/configure --remove-timestamps +# git diff --no-renames 2dc476bcb9142cd25d7e1d52392b73a3dcdf1756 6544f994637c7d4fc86d8a360e519a4e560606db | filterdiff -x ?/.hgignore -x ?/.hgeol -x ?/.hgtags -x ?/.hgtouch -x ?/.gitignore -x ?/.gitattributes -x '?/.github/*' -x '?/.git*' -x ?/.codecov.yml -x ?/.travis.yml -x ?/configure --remove-timestamps +diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst +index 2109b12bac9..cefd384fd35 100644 +--- a/Doc/c-api/object.rst ++++ b/Doc/c-api/object.rst +@@ -410,6 +410,12 @@ Object Protocol + iterated. + + ++.. c:function:: PyObject* PyObject_SelfIter(PyObject *obj) ++ ++ This is equivalent to the Python ``__iter__(self): return self`` method. ++ It is intended for :term:`iterator` types, to be used in the :c:member:`PyTypeObject.tp_iter` slot. ++ ++ + .. c:function:: PyObject* PyObject_GetAIter(PyObject *o) + + This is the equivalent to the Python expression ``aiter(o)``. Takes an +diff --git a/Doc/data/refcounts.dat b/Doc/data/refcounts.dat +index 28532620ba6..88d283aa51e 100644 +--- a/Doc/data/refcounts.dat ++++ b/Doc/data/refcounts.dat +@@ -1818,6 +1818,9 @@ PyObject_RichCompareBool:PyObject*:o1:0: + PyObject_RichCompareBool:PyObject*:o2:0: + PyObject_RichCompareBool:int:opid:: + ++PyObject_SelfIter:PyObject*::+1: ++PyObject_SelfIter:PyObject*:obj:0: ++ + PyObject_SetAttr:int::: + PyObject_SetAttr:PyObject*:o:0: + PyObject_SetAttr:PyObject*:attr_name:0: +diff --git a/Doc/howto/enum.rst b/Doc/howto/enum.rst +index 9b6bb613749..3743e68192f 100644 +--- a/Doc/howto/enum.rst ++++ b/Doc/howto/enum.rst +@@ -1,3 +1,5 @@ ++.. _enum-howto: ++ + ========== + Enum HOWTO + ========== +diff --git a/Doc/howto/functional.rst b/Doc/howto/functional.rst +index b0f9d22d74f..1f0608fb0fc 100644 +--- a/Doc/howto/functional.rst ++++ b/Doc/howto/functional.rst +@@ -1,3 +1,5 @@ ++.. _functional-howto: ++ + ******************************** + Functional Programming HOWTO + ******************************** +diff --git a/Doc/howto/gdb_helpers.rst b/Doc/howto/gdb_helpers.rst +index 53bbf7ddaa2..98ce813ca4a 100644 +--- a/Doc/howto/gdb_helpers.rst ++++ b/Doc/howto/gdb_helpers.rst +@@ -180,7 +180,7 @@ regular machine-level integer:: + (gdb) p some_python_integer + $4 = 42 + +-The internal structure can be revealed with a cast to :c:expr:`PyLongObject *`: ++The internal structure can be revealed with a cast to :c:expr:`PyLongObject *`:: + + (gdb) p *(PyLongObject*)some_python_integer + $5 = {ob_base = {ob_base = {ob_refcnt = 8, ob_type = 0x3dad39f5e0}, ob_size = 1}, +diff --git a/Doc/howto/index.rst b/Doc/howto/index.rst +index 9c8458f2bb6..98364aaf027 100644 +--- a/Doc/howto/index.rst ++++ b/Doc/howto/index.rst +@@ -2,16 +2,14 @@ + Python HOWTOs + *************** + +-Python HOWTOs are documents that cover a single, specific topic, +-and attempt to cover it fairly completely. Modelled on the Linux +-Documentation Project's HOWTO collection, this collection is an ++Python HOWTOs are documents that cover a specific topic in-depth. ++Modeled on the Linux Documentation Project's HOWTO collection, this collection is an + effort to foster documentation that's more detailed than the + Python Library Reference. + +-Currently, the HOWTOs are: +- + .. toctree:: + :maxdepth: 1 ++ :hidden: + + cporting.rst + curses.rst +@@ -33,3 +31,32 @@ Currently, the HOWTOs are: + annotations.rst + isolating-extensions.rst + mro.rst ++ ++General: ++ ++* :ref:`annotations-howto` ++* :ref:`argparse-tutorial` ++* :ref:`descriptorhowto` ++* :ref:`enum-howto` ++* :ref:`functional-howto` ++* :ref:`ipaddress-howto` ++* :ref:`logging-howto` ++* :ref:`logging-cookbook` ++* :ref:`regex-howto` ++* :ref:`sortinghowto` ++* :ref:`unicode-howto` ++* :ref:`urllib-howto` ++ ++Advanced development: ++ ++* :ref:`curses-howto` ++* :ref:`isolating-extensions-howto` ++* :ref:`python_2.3_mro` ++* :ref:`socket-howto` ++* :ref:`cporting-howto` ++ ++Debugging and profiling: ++ ++* :ref:`gdb` ++* :ref:`instrumentation` ++* :ref:`perf_profiling` +diff --git a/Doc/howto/logging.rst b/Doc/howto/logging.rst +index 5a392f94da4..597de77a828 100644 +--- a/Doc/howto/logging.rst ++++ b/Doc/howto/logging.rst +@@ -1,3 +1,5 @@ ++.. _logging-howto: ++ + ============= + Logging HOWTO + ============= +diff --git a/Doc/library/http.cookies.rst b/Doc/library/http.cookies.rst +index 4ce2e3c4f4c..ad37a0fca47 100644 +--- a/Doc/library/http.cookies.rst ++++ b/Doc/library/http.cookies.rst +@@ -98,7 +98,7 @@ Cookie Objects + .. method:: BaseCookie.output(attrs=None, header='Set-Cookie:', sep='\r\n') + + Return a string representation suitable to be sent as HTTP headers. *attrs* and +- *header* are sent to each :class:`Morsel`'s :meth:`output` method. *sep* is used ++ *header* are sent to each :class:`Morsel`'s :meth:`~Morsel.output` method. *sep* is used + to join the headers together, and is by default the combination ``'\r\n'`` + (CRLF). + +diff --git a/Doc/library/traceback.rst b/Doc/library/traceback.rst +index 9d57c354523..0a2b9c5cfb1 100644 +--- a/Doc/library/traceback.rst ++++ b/Doc/library/traceback.rst +@@ -157,6 +157,13 @@ Module-Level Functions + arguments have the same meaning as for :func:`print_stack`. + + ++.. function:: print_list(extracted_list, file=None) ++ ++ Print the list of tuples as returned by :func:`extract_tb` or ++ :func:`extract_stack` as a formatted stack trace to the given file. ++ If *file* is ``None``, the output is written to :data:`sys.stderr`. ++ ++ + .. function:: format_list(extracted_list) + + Given a list of tuples or :class:`FrameSummary` objects as returned by +@@ -256,7 +263,7 @@ Module-Level Functions + :class:`!TracebackException` objects are created from actual exceptions to + capture data for later printing. They offer a more lightweight method of + storing this information by avoiding holding references to +-:ref:`traceback` and :ref:`frame` objects ++:ref:`traceback` and :ref:`frame` objects. + In addition, they expose more options to configure the output compared to + the module-level functions described above. + +diff --git a/Doc/library/xmlrpc.client.rst b/Doc/library/xmlrpc.client.rst +index c57f433e6ef..971e6560584 100644 +--- a/Doc/library/xmlrpc.client.rst ++++ b/Doc/library/xmlrpc.client.rst +@@ -64,11 +64,11 @@ between conformable Python objects and XML on the wire. + The obsolete *use_datetime* flag is similar to *use_builtin_types* but it + applies only to date/time values. + +-.. versionchanged:: 3.3 +- The *use_builtin_types* flag was added. ++ .. versionchanged:: 3.3 ++ The *use_builtin_types* flag was added. + +-.. versionchanged:: 3.8 +- The *headers* parameter was added. ++ .. versionchanged:: 3.8 ++ The *headers* parameter was added. + + Both the HTTP and HTTPS transports support the URL syntax extension for HTTP + Basic Authentication: ``http://user:pass@host:port/path``. The ``user:pass`` +diff --git a/Doc/library/xmlrpc.rst b/Doc/library/xmlrpc.rst +index 5f0a2cf68d0..a93d08f78cf 100644 +--- a/Doc/library/xmlrpc.rst ++++ b/Doc/library/xmlrpc.rst +@@ -1,6 +1,9 @@ + :mod:`!xmlrpc` --- XMLRPC server and client modules + =================================================== + ++.. module:: xmlrpc ++ :synopsis: Server and client modules implementing XML-RPC. ++ + XML-RPC is a Remote Procedure Call method that uses XML passed via HTTP as a + transport. With it, a client can call methods with parameters on a remote + server (the server is named by a URI) and get back structured data. +diff --git a/Doc/tools/.nitignore b/Doc/tools/.nitignore +index c665ddd1bb9..e69e6100945 100644 +--- a/Doc/tools/.nitignore ++++ b/Doc/tools/.nitignore +@@ -94,7 +94,6 @@ Doc/whatsnew/2.4.rst + Doc/whatsnew/2.5.rst + Doc/whatsnew/2.6.rst + Doc/whatsnew/2.7.rst +-Doc/whatsnew/3.0.rst + Doc/whatsnew/3.3.rst + Doc/whatsnew/3.4.rst + Doc/whatsnew/3.5.rst +diff --git a/Doc/tutorial/datastructures.rst b/Doc/tutorial/datastructures.rst +index 263b0c2e281..cbe780e075b 100644 +--- a/Doc/tutorial/datastructures.rst ++++ b/Doc/tutorial/datastructures.rst +@@ -142,8 +142,8 @@ Using Lists as Stacks + + The list methods make it very easy to use a list as a stack, where the last + element added is the first element retrieved ("last-in, first-out"). To add an +-item to the top of the stack, use :meth:`!~list.append`. To retrieve an item from the +-top of the stack, use :meth:`!~list.pop` without an explicit index. For example:: ++item to the top of the stack, use :meth:`!append`. To retrieve an item from the ++top of the stack, use :meth:`!pop` without an explicit index. For example:: + + >>> stack = [3, 4, 5] + >>> stack.append(6) +@@ -340,7 +340,7 @@ The :keyword:`!del` statement + ============================= + + There is a way to remove an item from a list given its index instead of its +-value: the :keyword:`del` statement. This differs from the :meth:`!~list.pop` method ++value: the :keyword:`del` statement. This differs from the :meth:`!pop` method + which returns a value. The :keyword:`!del` statement can also be used to remove + slices from a list or clear the entire list (which we did earlier by assignment + of an empty list to the slice). For example:: +@@ -500,8 +500,8 @@ any immutable type; strings and numbers can always be keys. Tuples can be used + as keys if they contain only strings, numbers, or tuples; if a tuple contains + any mutable object either directly or indirectly, it cannot be used as a key. + You can't use lists as keys, since lists can be modified in place using index +-assignments, slice assignments, or methods like :meth:`!~list.append` and +-:meth:`!~list.extend`. ++assignments, slice assignments, or methods like :meth:`!append` and ++:meth:`!extend`. + + It is best to think of a dictionary as a set of *key: value* pairs, + with the requirement that the keys are unique (within one dictionary). A pair of +diff --git a/Doc/whatsnew/3.0.rst b/Doc/whatsnew/3.0.rst +index 766db5ecc67..7cd2ffd39c9 100644 +--- a/Doc/whatsnew/3.0.rst ++++ b/Doc/whatsnew/3.0.rst +@@ -150,8 +150,8 @@ Some well-known APIs no longer return lists: + sorted(d)`` instead (this works in Python 2.5 too and is just + as efficient). + +-* Also, the :meth:`dict.iterkeys`, :meth:`dict.iteritems` and +- :meth:`dict.itervalues` methods are no longer supported. ++* Also, the :meth:`!dict.iterkeys`, :meth:`!dict.iteritems` and ++ :meth:`!dict.itervalues` methods are no longer supported. + + * :func:`map` and :func:`filter` return iterators. If you really need + a list and the input sequences are all of equal length, a quick +@@ -170,7 +170,7 @@ Some well-known APIs no longer return lists: + :func:`itertools.zip_longest`, e.g. ``map(func, *sequences)`` becomes + ``list(map(func, itertools.zip_longest(*sequences)))``. + +-* :func:`range` now behaves like :func:`xrange` used to behave, except ++* :func:`range` now behaves like :func:`!xrange` used to behave, except + it works with values of arbitrary size. The latter no longer + exists. + +@@ -192,33 +192,33 @@ Python 3.0 has simplified the rules for ordering comparisons: + operators: objects of different incomparable types always compare + unequal to each other. + +-* :meth:`builtin.sorted` and :meth:`list.sort` no longer accept the ++* :meth:`sorted` and :meth:`list.sort` no longer accept the + *cmp* argument providing a comparison function. Use the *key* + argument instead. N.B. the *key* and *reverse* arguments are now + "keyword-only". + +-* The :func:`cmp` function should be treated as gone, and the :meth:`__cmp__` +- special method is no longer supported. Use :meth:`__lt__` for sorting, +- :meth:`__eq__` with :meth:`__hash__`, and other rich comparisons as needed. +- (If you really need the :func:`cmp` functionality, you could use the ++* The :func:`!cmp` function should be treated as gone, and the :meth:`!__cmp__` ++ special method is no longer supported. Use :meth:`~object.__lt__` for sorting, ++ :meth:`~object.__eq__` with :meth:`~object.__hash__`, and other rich comparisons as needed. ++ (If you really need the :func:`!cmp` functionality, you could use the + expression ``(a > b) - (a < b)`` as the equivalent for ``cmp(a, b)``.) + + Integers + -------- + +-* :pep:`237`: Essentially, :class:`long` renamed to :class:`int`. ++* :pep:`237`: Essentially, :class:`!long` renamed to :class:`int`. + That is, there is only one built-in integral type, named +- :class:`int`; but it behaves mostly like the old :class:`long` type. ++ :class:`int`; but it behaves mostly like the old :class:`!long` type. + + * :pep:`238`: An expression like ``1/2`` returns a float. Use + ``1//2`` to get the truncating behavior. (The latter syntax has + existed for years, at least since Python 2.2.) + +-* The :data:`sys.maxint` constant was removed, since there is no ++* The :data:`!sys.maxint` constant was removed, since there is no + longer a limit to the value of integers. However, :data:`sys.maxsize` + can be used as an integer larger than any practical list or string + index. It conforms to the implementation's "natural" integer size +- and is typically the same as :data:`sys.maxint` in previous releases ++ and is typically the same as :data:`!sys.maxint` in previous releases + on the same platform (assuming the same build options). + + * The :func:`repr` of a long integer doesn't include the trailing ``L`` +@@ -251,7 +251,7 @@ changed. + that uses Unicode, encodings or binary data most likely has to + change. The change is for the better, as in the 2.x world there + were numerous bugs having to do with mixing encoded and unencoded +- text. To be prepared in Python 2.x, start using :class:`unicode` ++ text. To be prepared in Python 2.x, start using :class:`!unicode` + for all unencoded text, and :class:`str` for binary or encoded data + only. Then the ``2to3`` tool will do most of the work for you. + +@@ -269,7 +269,7 @@ changed. + separate *mutable* type to hold buffered binary data, + :class:`bytearray`. Nearly all APIs that accept :class:`bytes` also + accept :class:`bytearray`. The mutable API is based on +- :class:`collections.MutableSequence`. ++ :class:`collections.MutableSequence `. + + * All backslashes in raw string literals are interpreted literally. + This means that ``'\U'`` and ``'\u'`` escapes in raw strings are not +@@ -278,11 +278,11 @@ changed. + single "euro" character. (Of course, this change only affects raw + string literals; the euro character is ``'\u20ac'`` in Python 3.0.) + +-* The built-in :class:`basestring` abstract type was removed. Use ++* The built-in :class:`!basestring` abstract type was removed. Use + :class:`str` instead. The :class:`str` and :class:`bytes` types + don't have functionality enough in common to warrant a shared base + class. The ``2to3`` tool (see below) replaces every occurrence of +- :class:`basestring` with :class:`str`. ++ :class:`!basestring` with :class:`str`. + + * Files opened as text files (still the default mode for :func:`open`) + always use an encoding to map between strings (in memory) and bytes +@@ -357,7 +357,7 @@ New Syntax + provides a standardized way of annotating a function's parameters + and return value. There are no semantics attached to such + annotations except that they can be introspected at runtime using +- the :attr:`~object.__annotations__` attribute. The intent is to ++ the :attr:`!__annotations__` attribute. The intent is to + encourage experimentation through metaclasses, decorators or frameworks. + + * :pep:`3102`: Keyword-only arguments. Named parameters occurring +@@ -428,7 +428,7 @@ Changed Syntax + class C(metaclass=M): + ... + +- The module-global :data:`__metaclass__` variable is no longer ++ The module-global :data:`!__metaclass__` variable is no longer + supported. (It was a crutch to make it easier to default to + new-style classes without deriving every class from + :class:`object`.) +@@ -522,19 +522,19 @@ consulted for longer descriptions. + *encoding*, *errors*, *newline* and *closefd*. Also note that an + invalid *mode* argument now raises :exc:`ValueError`, not + :exc:`IOError`. The binary file object underlying a text file +- object can be accessed as :attr:`f.buffer` (but beware that the ++ object can be accessed as :attr:`!f.buffer` (but beware that the + text object maintains a buffer of itself in order to speed up + the encoding and decoding operations). + +-* :ref:`pep-3118`. The old builtin :func:`buffer` is now really gone; ++* :ref:`pep-3118`. The old builtin :func:`!buffer` is now really gone; + the new builtin :func:`memoryview` provides (mostly) similar + functionality. + + * :ref:`pep-3119`. The :mod:`abc` module and the ABCs defined in the + :mod:`collections` module plays a somewhat more prominent role in + the language now, and built-in collection types like :class:`dict` +- and :class:`list` conform to the :class:`collections.MutableMapping` +- and :class:`collections.MutableSequence` ABCs, respectively. ++ and :class:`list` conform to the :class:`collections.MutableMapping ` ++ and :class:`collections.MutableSequence ` ABCs, respectively. + + * :ref:`pep-3127`. As mentioned above, the new octal literal + notation is the only one supported, and binary literals have been +@@ -612,7 +612,7 @@ review: + :mod:`!CGIHTTPServer`, :mod:`!SimpleHTTPServer`, :mod:`!Cookie`, + :mod:`!cookielib`). + +- * :mod:`tkinter` (all :mod:`Tkinter`-related modules except ++ * :mod:`tkinter` (all ``Tkinter``-related modules except + :mod:`turtle`). The target audience of :mod:`turtle` doesn't + really care about :mod:`tkinter`. Also note that as of Python + 2.6, the functionality of :mod:`turtle` has been greatly enhanced. +@@ -628,47 +628,47 @@ Some other changes to standard library modules, not covered by + + * Killed :mod:`!sets`. Use the built-in :func:`set` class. + +-* Cleanup of the :mod:`sys` module: removed :func:`sys.exitfunc`, +- :func:`sys.exc_clear`, :data:`sys.exc_type`, :data:`sys.exc_value`, +- :data:`sys.exc_traceback`. (Note that :data:`sys.last_type` ++* Cleanup of the :mod:`sys` module: removed :func:`!sys.exitfunc`, ++ :func:`!sys.exc_clear`, :data:`!sys.exc_type`, :data:`!sys.exc_value`, ++ :data:`!sys.exc_traceback`. (Note that :data:`sys.last_type` + etc. remain.) + +-* Cleanup of the :class:`array.array` type: the :meth:`read` and +- :meth:`write` methods are gone; use :meth:`fromfile` and +- :meth:`tofile` instead. Also, the ``'c'`` typecode for array is ++* Cleanup of the :class:`array.array` type: the :meth:`!read` and ++ :meth:`!write` methods are gone; use :meth:`~array.array.fromfile` and ++ :meth:`~array.array.tofile` instead. Also, the ``'c'`` typecode for array is + gone -- use either ``'b'`` for bytes or ``'u'`` for Unicode + characters. + + * Cleanup of the :mod:`operator` module: removed +- :func:`sequenceIncludes` and :func:`isCallable`. ++ :func:`!sequenceIncludes` and :func:`!isCallable`. + + * Cleanup of the :mod:`!thread` module: :func:`!acquire_lock` and + :func:`!release_lock` are gone; use :meth:`~threading.Lock.acquire` and + :meth:`~threading.Lock.release` instead. + +-* Cleanup of the :mod:`random` module: removed the :func:`jumpahead` API. ++* Cleanup of the :mod:`random` module: removed the :func:`!jumpahead` API. + + * The :mod:`!new` module is gone. + +-* The functions :func:`os.tmpnam`, :func:`os.tempnam` and +- :func:`os.tmpfile` have been removed in favor of the :mod:`tempfile` ++* The functions :func:`!os.tmpnam`, :func:`!os.tempnam` and ++ :func:`!os.tmpfile` have been removed in favor of the :mod:`tempfile` + module. + + * The :mod:`tokenize` module has been changed to work with bytes. The + main entry point is now :func:`tokenize.tokenize`, instead of + generate_tokens. + +-* :data:`string.letters` and its friends (:data:`string.lowercase` and +- :data:`string.uppercase`) are gone. Use ++* :data:`!string.letters` and its friends (:data:`!string.lowercase` and ++ :data:`!string.uppercase`) are gone. Use + :data:`string.ascii_letters` etc. instead. (The reason for the +- removal is that :data:`string.letters` and friends had ++ removal is that :data:`!string.letters` and friends had + locale-specific behavior, which is a bad idea for such + attractively named global "constants".) + +-* Renamed module :mod:`__builtin__` to :mod:`builtins` (removing the +- underscores, adding an 's'). The :data:`__builtins__` variable ++* Renamed module :mod:`!__builtin__` to :mod:`builtins` (removing the ++ underscores, adding an 's'). The :data:`!__builtins__` variable + found in most global namespaces is unchanged. To modify a builtin, +- you should use :mod:`builtins`, not :data:`__builtins__`! ++ you should use :mod:`builtins`, not :data:`!__builtins__`! + + + :pep:`3101`: A New Approach To String Formatting +@@ -702,9 +702,9 @@ new powerful features added: + idiom for handling all exceptions except for this latter category is + to use :keyword:`except` :exc:`Exception`. + +-* :exc:`StandardError` was removed. ++* :exc:`!StandardError` was removed. + +-* Exceptions no longer behave as sequences. Use the :attr:`args` ++* Exceptions no longer behave as sequences. Use the :attr:`~BaseException.args` + attribute instead. + + * :pep:`3109`: Raising exceptions. You must now use :samp:`raise +@@ -765,20 +765,20 @@ Operators And Special Methods + When referencing a method as a class attribute, you now get a plain + function object. + +-* :meth:`__getslice__`, :meth:`__setslice__` and :meth:`__delslice__` ++* :meth:`!__getslice__`, :meth:`!__setslice__` and :meth:`!__delslice__` + were killed. The syntax ``a[i:j]`` now translates to +- ``a.__getitem__(slice(i, j))`` (or :meth:`__setitem__` or +- :meth:`__delitem__`, when used as an assignment or deletion target, ++ ``a.__getitem__(slice(i, j))`` (or :meth:`~object.__setitem__` or ++ :meth:`~object.__delitem__`, when used as an assignment or deletion target, + respectively). + + * :pep:`3114`: the standard :meth:`next` method has been renamed to + :meth:`~iterator.__next__`. + +-* The :meth:`__oct__` and :meth:`__hex__` special methods are removed +- -- :func:`oct` and :func:`hex` use :meth:`__index__` now to convert ++* The :meth:`!__oct__` and :meth:`!__hex__` special methods are removed ++ -- :func:`oct` and :func:`hex` use :meth:`~object.__index__` now to convert + the argument to an integer. + +-* Removed support for :attr:`__members__` and :attr:`__methods__`. ++* Removed support for :attr:`!__members__` and :attr:`!__methods__`. + + * The function attributes named :attr:`!func_X` have been renamed to + use the :attr:`!__X__` form, freeing up these names in the function +@@ -802,7 +802,7 @@ Builtins + instance will automatically be chosen. With arguments, the behavior + of :func:`super` is unchanged. + +-* :pep:`3111`: :func:`raw_input` was renamed to :func:`input`. That ++* :pep:`3111`: :func:`!raw_input` was renamed to :func:`input`. That + is, the new :func:`input` function reads a line from + :data:`sys.stdin` and returns it with the trailing newline stripped. + It raises :exc:`EOFError` if the input is terminated prematurely. +@@ -820,31 +820,31 @@ Builtins + argument and a value of the same type as ``x`` when called with two + arguments. + +-* Moved :func:`intern` to :func:`sys.intern`. ++* Moved :func:`!intern` to :func:`sys.intern`. + +-* Removed: :func:`apply`. Instead of ``apply(f, args)`` use ++* Removed: :func:`!apply`. Instead of ``apply(f, args)`` use + ``f(*args)``. + + * Removed :func:`callable`. Instead of ``callable(f)`` you can use +- ``isinstance(f, collections.Callable)``. The :func:`operator.isCallable` ++ ``isinstance(f, collections.Callable)``. The :func:`!operator.isCallable` + function is also gone. + +-* Removed :func:`coerce`. This function no longer serves a purpose ++* Removed :func:`!coerce`. This function no longer serves a purpose + now that classic classes are gone. + +-* Removed :func:`execfile`. Instead of ``execfile(fn)`` use ++* Removed :func:`!execfile`. Instead of ``execfile(fn)`` use + ``exec(open(fn).read())``. + +-* Removed the :class:`file` type. Use :func:`open`. There are now several ++* Removed the :class:`!file` type. Use :func:`open`. There are now several + different kinds of streams that open can return in the :mod:`io` module. + +-* Removed :func:`reduce`. Use :func:`functools.reduce` if you really ++* Removed :func:`!reduce`. Use :func:`functools.reduce` if you really + need it; however, 99 percent of the time an explicit :keyword:`for` + loop is more readable. + +-* Removed :func:`reload`. Use :func:`!imp.reload`. ++* Removed :func:`!reload`. Use :func:`!imp.reload`. + +-* Removed. :meth:`dict.has_key` -- use the :keyword:`in` operator ++* Removed. :meth:`!dict.has_key` -- use the :keyword:`in` operator + instead. + + .. ====================================================================== +diff --git a/Include/cpython/pytime.h b/Include/cpython/pytime.h +index 16d88d191e9..46cc97bd7cf 100644 +--- a/Include/cpython/pytime.h ++++ b/Include/cpython/pytime.h +@@ -53,7 +53,7 @@ functions and constants + extern "C" { + #endif + +-#ifdef __clang__ ++#if defined(__clang__) || defined(_MSC_VER) + struct timeval; + #endif + +diff --git a/Include/patchlevel.h b/Include/patchlevel.h +index 6c597837da0..2fa45090034 100644 +--- a/Include/patchlevel.h ++++ b/Include/patchlevel.h +@@ -23,7 +23,7 @@ + #define PY_RELEASE_SERIAL 0 + + /* Version as a string */ +-#define PY_VERSION "3.12.8" ++#define PY_VERSION "3.12.8+" + /*--end constants--*/ + + /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. +diff --git a/Include/pymacro.h b/Include/pymacro.h +index d5700dc3893..94e6248d283 100644 +--- a/Include/pymacro.h ++++ b/Include/pymacro.h +@@ -118,6 +118,15 @@ + */ + #if defined(__GNUC__) || defined(__clang__) + # define Py_UNUSED(name) _unused_ ## name __attribute__((unused)) ++#elif defined(_MSC_VER) ++ // Disable warning C4100: unreferenced formal parameter, ++ // declare the parameter, ++ // restore old compiler warnings. ++# define Py_UNUSED(name) \ ++ __pragma(warning(push)) \ ++ __pragma(warning(suppress: 4100)) \ ++ _unused_ ## name \ ++ __pragma(warning(pop)) + #else + # define Py_UNUSED(name) _unused_ ## name + #endif +diff --git a/Include/tracemalloc.h b/Include/tracemalloc.h +index 580027a8e36..4db34b9509e 100644 +--- a/Include/tracemalloc.h ++++ b/Include/tracemalloc.h +@@ -1,7 +1,10 @@ + #ifndef Py_TRACEMALLOC_H + #define Py_TRACEMALLOC_H +- + #ifndef Py_LIMITED_API ++#ifdef __cplusplus ++extern "C" { ++#endif ++ + /* Track an allocated memory block in the tracemalloc module. + Return 0 on success, return -1 on error (failed to allocate memory to store + the trace). +@@ -67,6 +70,8 @@ PyAPI_FUNC(PyObject *) _PyTraceMalloc_GetTracedMemory(void); + /* Set the peak size of traced memory blocks to the current size */ + PyAPI_FUNC(void) _PyTraceMalloc_ResetPeak(void); + ++#ifdef __cplusplus ++} + #endif +- ++#endif /* !Py_LIMITED_API */ + #endif /* !Py_TRACEMALLOC_H */ +diff --git a/Lib/_pydecimal.py b/Lib/_pydecimal.py +index 75df3db2624..ff80180a79e 100644 +--- a/Lib/_pydecimal.py ++++ b/Lib/_pydecimal.py +@@ -97,7 +97,7 @@ class DecimalException(ArithmeticError): + + Used exceptions derive from this. + If an exception derives from another exception besides this (such as +- Underflow (Inexact, Rounded, Subnormal) that indicates that it is only ++ Underflow (Inexact, Rounded, Subnormal)) that indicates that it is only + called if the others are present. This isn't actually used for + anything, though. + +@@ -145,7 +145,7 @@ class InvalidOperation(DecimalException): + x ** (+-)INF + An operand is invalid + +- The result of the operation after these is a quiet positive NaN, ++ The result of the operation after this is a quiet positive NaN, + except when the cause is a signaling NaN, in which case the result is + also a quiet NaN, but with the original sign, and an optional + diagnostic information. +diff --git a/Lib/_strptime.py b/Lib/_strptime.py +index dfd2bc5d8b4..5d9df2b12f8 100644 +--- a/Lib/_strptime.py ++++ b/Lib/_strptime.py +@@ -300,8 +300,6 @@ def __init__(self, locale_time=None): + 'V': r"(?P5[0-3]|0[1-9]|[1-4]\d|\d)", + # W is set below by using 'U' + 'y': r"(?P\d\d)", +- #XXX: Does 'Y' need to worry about having less or more than +- # 4 digits? + 'Y': r"(?P\d\d\d\d)", + 'z': r"(?P[+-]\d\d:?[0-5]\d(:?[0-5]\d(\.\d{1,6})?)?|(?-i:Z))", + 'A': self.__seqToRE(self.locale_time.f_weekday, 'A'), +diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py +index 790711f8340..dd79ad18df3 100644 +--- a/Lib/asyncio/selector_events.py ++++ b/Lib/asyncio/selector_events.py +@@ -1183,6 +1183,7 @@ def writelines(self, list_of_data): + # If the entire buffer couldn't be written, register a write handler + if self._buffer: + self._loop._add_writer(self._sock_fd, self._write_ready) ++ self._maybe_pause_protocol() + + def can_write_eof(self): + return True +diff --git a/Lib/http/cookies.py b/Lib/http/cookies.py +index 6b9ed24ad8e..57791c6ab08 100644 +--- a/Lib/http/cookies.py ++++ b/Lib/http/cookies.py +@@ -424,9 +424,11 @@ def OutputString(self, attrs=None): + ( # Optional group: there may not be a value. + \s*=\s* # Equal Sign + (?P # Start of group 'val' +- "(?:[^\\"]|\\.)*" # Any doublequoted string ++ "(?:[^\\"]|\\.)*" # Any double-quoted string + | # or +- \w{3},\s[\w\d\s-]{9,11}\s[\d:]{8}\sGMT # Special case for "expires" attr ++ # Special case for "expires" attr ++ (\w{3,6}day|\w{3}),\s # Day of the week or abbreviated day ++ [\w\d\s-]{9,11}\s[\d:]{8}\sGMT # Date and time in specific format + | # or + [""" + _LegalValueChars + r"""]* # Any word or empty string + ) # End of group 'val' +diff --git a/Lib/linecache.py b/Lib/linecache.py +index 248cba93874..b6453fe2f31 100644 +--- a/Lib/linecache.py ++++ b/Lib/linecache.py +@@ -54,14 +54,17 @@ def checkcache(filename=None): + (This is not checked upon each call!)""" + + if filename is None: +- filenames = list(cache.keys()) +- elif filename in cache: +- filenames = [filename] ++ # get keys atomically ++ filenames = cache.copy().keys() + else: +- return ++ filenames = [filename] + + for filename in filenames: +- entry = cache[filename] ++ try: ++ entry = cache[filename] ++ except KeyError: ++ continue ++ + if len(entry) == 1: + # lazy cache entry, leave it lazy. + continue +diff --git a/Lib/platform.py b/Lib/platform.py +index c5b60480369..b86e6834911 100755 +--- a/Lib/platform.py ++++ b/Lib/platform.py +@@ -348,7 +348,8 @@ def _wmi_query(table, *keys): + ] + + _WIN32_SERVER_RELEASES = [ +- ((10, 1, 0), "post2022Server"), ++ ((10, 1, 0), "post2025Server"), ++ ((10, 0, 26100), "2025Server"), + ((10, 0, 20348), "2022Server"), + ((10, 0, 17763), "2019Server"), + ((6, 4, 0), "2016Server"), +diff --git a/Lib/poplib.py b/Lib/poplib.py +index 9a5ef03c983..81b01385987 100644 +--- a/Lib/poplib.py ++++ b/Lib/poplib.py +@@ -309,7 +309,7 @@ def close(self): + # optional commands: + + def rpop(self, user): +- """Not sure what this does.""" ++ """Send RPOP command to access the mailbox with an alternate user.""" + return self._shortcmd('RPOP %s' % user) + + +diff --git a/Lib/test/test__locale.py b/Lib/test/test__locale.py +index 89c20325055..606dd297452 100644 +--- a/Lib/test/test__locale.py ++++ b/Lib/test/test__locale.py +@@ -102,6 +102,11 @@ def accept(loc): + # ps_AF doesn't work on Windows: see bpo-38324 (msg361830) + del known_numerics['ps_AF'] + ++if sys.platform == 'sunos5': ++ # On Solaris, Japanese ERAs start with the year 1927, ++ # and thus there's less of them. ++ known_era['ja_JP'] = (5, '+:1:2019/05/01:2019/12/31:令和:%EC元年') ++ + class _LocaleTests(unittest.TestCase): + + def setUp(self): +diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py +index 47693ea4d3c..736c19796ef 100644 +--- a/Lib/test/test_asyncio/test_selector_events.py ++++ b/Lib/test/test_asyncio/test_selector_events.py +@@ -805,6 +805,18 @@ def test_writelines_send_partial(self): + self.assertTrue(self.sock.send.called) + self.assertTrue(self.loop.writers) + ++ def test_writelines_pauses_protocol(self): ++ data = memoryview(b'data') ++ self.sock.send.return_value = 2 ++ self.sock.send.fileno.return_value = 7 ++ ++ transport = self.socket_transport() ++ transport._high_water = 1 ++ transport.writelines([data]) ++ self.assertTrue(self.protocol.pause_writing.called) ++ self.assertTrue(self.sock.send.called) ++ self.assertTrue(self.loop.writers) ++ + @unittest.skipUnless(selector_events._HAS_SENDMSG, 'no sendmsg') + def test_write_sendmsg_full(self): + data = memoryview(b'data') +diff --git a/Lib/test/test_cppext/__init__.py b/Lib/test/test_cppext/__init__.py +index f02a823bd22..efd79448c66 100644 +--- a/Lib/test/test_cppext/__init__.py ++++ b/Lib/test/test_cppext/__init__.py +@@ -1,45 +1,52 @@ + # gh-91321: Build a basic C++ test extension to check that the Python C API is + # compatible with C++ and does not emit C++ compiler warnings. + import os.path ++import shlex + import shutil +-import sys +-import unittest + import subprocess +-import sysconfig ++import unittest + from test import support +-from test.support import os_helper + + + SOURCE = os.path.join(os.path.dirname(__file__), 'extension.cpp') + SETUP = os.path.join(os.path.dirname(__file__), 'setup.py') + + ++# With MSVC on a debug build, the linker fails with: cannot open file ++# 'python311.lib', it should look 'python311_d.lib'. ++@unittest.skipIf(support.MS_WINDOWS and support.Py_DEBUG, ++ 'test fails on Windows debug build') ++# Building and running an extension in clang sanitizing mode is not ++# straightforward ++@support.skip_if_sanitizer('test does not work with analyzing builds', ++ address=True, memory=True, ub=True, thread=True) ++# the test uses venv+pip: skip if it's not available ++@support.requires_venv_with_pip() + @support.requires_subprocess() ++@support.requires_resource('cpu') + class TestCPPExt(unittest.TestCase): +- @support.requires_resource('cpu') +- def test_build_cpp11(self): +- self.check_build(False, '_testcpp11ext') ++ def test_build(self): ++ self.check_build('_testcppext') + +- @support.requires_resource('cpu') + def test_build_cpp03(self): +- self.check_build(True, '_testcpp03ext') ++ self.check_build('_testcpp03ext', std='c++03') ++ ++ @unittest.skipIf(support.MS_WINDOWS, "MSVC doesn't support /std:c++11") ++ def test_build_cpp11(self): ++ self.check_build('_testcpp11ext', std='c++11') ++ ++ # Only test C++14 on MSVC. ++ # On s390x RHEL7, GCC 4.8.5 doesn't support C++14. ++ @unittest.skipIf(not support.MS_WINDOWS, "need Windows") ++ def test_build_cpp14(self): ++ self.check_build('_testcpp14ext', std='c++14') + +- # With MSVC, the linker fails with: cannot open file 'python311.lib' +- # https://github.com/python/cpython/pull/32175#issuecomment-1111175897 +- @unittest.skipIf(support.MS_WINDOWS, 'test fails on Windows') +- # Building and running an extension in clang sanitizing mode is not +- # straightforward +- @unittest.skipIf( +- '-fsanitize' in (sysconfig.get_config_var('PY_CFLAGS') or ''), +- 'test does not work with analyzing builds') +- # the test uses venv+pip: skip if it's not available +- @support.requires_venv_with_pip() +- def check_build(self, std_cpp03, extension_name): ++ def check_build(self, extension_name, std=None): + venv_dir = 'env' + with support.setup_venv_with_pip_setuptools_wheel(venv_dir) as python_exe: +- self._check_build(std_cpp03, extension_name, python_exe) ++ self._check_build(extension_name, python_exe, std=std) + +- def _check_build(self, std_cpp03, extension_name, python_exe): ++ def _check_build(self, extension_name, python_exe, std): + pkg_dir = 'pkg' + os.mkdir(pkg_dir) + shutil.copy(SETUP, os.path.join(pkg_dir, os.path.basename(SETUP))) +@@ -47,10 +54,11 @@ def _check_build(self, std_cpp03, extension_name, python_exe): + + def run_cmd(operation, cmd): + env = os.environ.copy() +- env['CPYTHON_TEST_CPP_STD'] = 'c++03' if std_cpp03 else 'c++11' ++ if std: ++ env['CPYTHON_TEST_CPP_STD'] = std + env['CPYTHON_TEST_EXT_NAME'] = extension_name + if support.verbose: +- print('Run:', ' '.join(cmd)) ++ print('Run:', ' '.join(map(shlex.quote, cmd))) + subprocess.run(cmd, check=True, env=env) + else: + proc = subprocess.run(cmd, +@@ -59,6 +67,7 @@ def run_cmd(operation, cmd): + stderr=subprocess.STDOUT, + text=True) + if proc.returncode: ++ print('Run:', ' '.join(map(shlex.quote, cmd))) + print(proc.stdout, end='') + self.fail( + f"{operation} failed with exit code {proc.returncode}") +@@ -67,6 +76,8 @@ def run_cmd(operation, cmd): + cmd = [python_exe, '-X', 'dev', + '-m', 'pip', 'install', '--no-build-isolation', + os.path.abspath(pkg_dir)] ++ if support.verbose: ++ cmd.append('-v') + run_cmd('Install', cmd) + + # Do a reference run. Until we test that running python +diff --git a/Lib/test/test_cppext/extension.cpp b/Lib/test/test_cppext/extension.cpp +index 90669b10cb2..ab485b629b7 100644 +--- a/Lib/test/test_cppext/extension.cpp ++++ b/Lib/test/test_cppext/extension.cpp +@@ -8,10 +8,8 @@ + + #include "Python.h" + +-#if __cplusplus >= 201103 +-# define NAME _testcpp11ext +-#else +-# define NAME _testcpp03ext ++#ifndef MODULE_NAME ++# error "MODULE_NAME macro must be defined" + #endif + + #define _STR(NAME) #NAME +@@ -160,7 +158,7 @@ PyType_Slot VirtualPyObject_Slots[] = { + }; + + PyType_Spec VirtualPyObject_Spec = { +- /* .name */ STR(NAME) ".VirtualPyObject", ++ /* .name */ STR(MODULE_NAME) ".VirtualPyObject", + /* .basicsize */ sizeof(VirtualPyObject), + /* .itemsize */ 0, + /* .flags */ Py_TPFLAGS_DEFAULT, +@@ -227,6 +225,10 @@ _testcppext_exec(PyObject *module) + if (!result) return -1; + Py_DECREF(result); + ++ // test Py_BUILD_ASSERT() and Py_BUILD_ASSERT_EXPR() ++ Py_BUILD_ASSERT(sizeof(int) == sizeof(unsigned int)); ++ assert(Py_BUILD_ASSERT_EXPR(sizeof(int) == sizeof(unsigned int)) == 0); ++ + return 0; + } + +@@ -240,7 +242,7 @@ PyDoc_STRVAR(_testcppext_doc, "C++ test extension."); + + static struct PyModuleDef _testcppext_module = { + PyModuleDef_HEAD_INIT, // m_base +- STR(NAME), // m_name ++ STR(MODULE_NAME), // m_name + _testcppext_doc, // m_doc + 0, // m_size + _testcppext_methods, // m_methods +@@ -254,7 +256,7 @@ static struct PyModuleDef _testcppext_module = { + #define FUNC_NAME(NAME) _FUNC_NAME(NAME) + + PyMODINIT_FUNC +-FUNC_NAME(NAME)(void) ++FUNC_NAME(MODULE_NAME)(void) + { + return PyModuleDef_Init(&_testcppext_module); + } +diff --git a/Lib/test/test_cppext/setup.py b/Lib/test/test_cppext/setup.py +index c7ba1efb4dd..d97b238b8d1 100644 +--- a/Lib/test/test_cppext/setup.py ++++ b/Lib/test/test_cppext/setup.py +@@ -1,8 +1,8 @@ + # gh-91321: Build a basic C++ test extension to check that the Python C API is + # compatible with C++ and does not emit C++ compiler warnings. + import os ++import platform + import shlex +-import sys + import sysconfig + from test import support + +@@ -10,6 +10,7 @@ + + + SOURCE = 'extension.cpp' ++ + if not support.MS_WINDOWS: + # C++ compiler flags for GCC and clang + CPPFLAGS = [ +@@ -19,34 +20,77 @@ + '-Werror', + ] + else: +- # Don't pass any compiler flag to MSVC +- CPPFLAGS = [] ++ # MSVC compiler flags ++ CPPFLAGS = [ ++ # Display warnings level 1 to 4 ++ '/W4', ++ # Treat all compiler warnings as compiler errors ++ '/WX', ++ ] + + + def main(): + cppflags = list(CPPFLAGS) +- std = os.environ["CPYTHON_TEST_CPP_STD"] +- name = os.environ["CPYTHON_TEST_EXT_NAME"] ++ std = os.environ.get("CPYTHON_TEST_CPP_STD", "") ++ module_name = os.environ["CPYTHON_TEST_EXT_NAME"] + +- cppflags = [*CPPFLAGS, f'-std={std}'] ++ cppflags = list(CPPFLAGS) ++ cppflags.append(f'-DMODULE_NAME={module_name}') ++ ++ # Add -std=STD or /std:STD (MSVC) compiler flag ++ if std: ++ if support.MS_WINDOWS: ++ cppflags.append(f'/std:{std}') ++ else: ++ cppflags.append(f'-std={std}') + + # gh-105776: When "gcc -std=11" is used as the C++ compiler, -std=c11 + # option emits a C++ compiler warning. Remove "-std11" option from the + # CC command. + cmd = (sysconfig.get_config_var('CC') or '') + if cmd is not None: ++ if support.MS_WINDOWS: ++ std_prefix = '/std' ++ else: ++ std_prefix = '-std' + cmd = shlex.split(cmd) +- cmd = [arg for arg in cmd if not arg.startswith('-std=')] ++ cmd = [arg for arg in cmd if not arg.startswith(std_prefix)] + cmd = shlex.join(cmd) + # CC env var overrides sysconfig CC variable in setuptools + os.environ['CC'] = cmd + +- cpp_ext = Extension( +- name, ++ # On Windows, add PCbuild\amd64\ to include and library directories ++ include_dirs = [] ++ library_dirs = [] ++ if support.MS_WINDOWS: ++ srcdir = sysconfig.get_config_var('srcdir') ++ machine = platform.uname().machine ++ pcbuild = os.path.join(srcdir, 'PCbuild', machine) ++ if os.path.exists(pcbuild): ++ # pyconfig.h is generated in PCbuild\amd64\ ++ include_dirs.append(pcbuild) ++ # python313.lib is generated in PCbuild\amd64\ ++ library_dirs.append(pcbuild) ++ print(f"Add PCbuild directory: {pcbuild}") ++ ++ # Display information to help debugging ++ for env_name in ('CC', 'CFLAGS', 'CPPFLAGS'): ++ if env_name in os.environ: ++ print(f"{env_name} env var: {os.environ[env_name]!r}") ++ else: ++ print(f"{env_name} env var: ") ++ print(f"extra_compile_args: {cppflags!r}") ++ ++ ext = Extension( ++ module_name, + sources=[SOURCE], + language='c++', +- extra_compile_args=cppflags) +- setup(name='internal' + name, version='0.0', ext_modules=[cpp_ext]) ++ extra_compile_args=cppflags, ++ include_dirs=include_dirs, ++ library_dirs=library_dirs) ++ setup(name=f'internal_{module_name}', ++ version='0.0', ++ ext_modules=[ext]) + + + if __name__ == "__main__": +diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py +index 72c86eecae2..f4f2011a51a 100644 +--- a/Lib/test/test_exceptions.py ++++ b/Lib/test/test_exceptions.py +@@ -2195,6 +2195,22 @@ def test_range_of_offsets(self): + self.assertIn(expected, err.getvalue()) + the_exception = exc + ++ def test_subclass(self): ++ class MySyntaxError(SyntaxError): ++ pass ++ ++ try: ++ raise MySyntaxError("bad bad", ("bad.py", 1, 2, "abcdefg", 1, 7)) ++ except SyntaxError as exc: ++ with support.captured_stderr() as err: ++ sys.__excepthook__(*sys.exc_info()) ++ self.assertIn(""" ++ File "bad.py", line 1 ++ abcdefg ++ ^^^^^ ++""", err.getvalue()) ++ ++ + def test_encodings(self): + self.addCleanup(unlink, TESTFN) + source = ( +diff --git a/Lib/test/test_http_cookies.py b/Lib/test/test_http_cookies.py +index 8879902a6e2..7b3dc0fdaed 100644 +--- a/Lib/test/test_http_cookies.py ++++ b/Lib/test/test_http_cookies.py +@@ -59,6 +59,52 @@ def test_basic(self): + for k, v in sorted(case['dict'].items()): + self.assertEqual(C[k].value, v) + ++ def test_obsolete_rfc850_date_format(self): ++ # Test cases with different days and dates in obsolete RFC 850 format ++ test_cases = [ ++ # from RFC 850, change EST to GMT ++ # https://datatracker.ietf.org/doc/html/rfc850#section-2 ++ { ++ 'data': 'key=value; expires=Saturday, 01-Jan-83 00:00:00 GMT', ++ 'output': 'Saturday, 01-Jan-83 00:00:00 GMT' ++ }, ++ { ++ 'data': 'key=value; expires=Friday, 19-Nov-82 16:59:30 GMT', ++ 'output': 'Friday, 19-Nov-82 16:59:30 GMT' ++ }, ++ # from RFC 9110 ++ # https://www.rfc-editor.org/rfc/rfc9110.html#section-5.6.7-6 ++ { ++ 'data': 'key=value; expires=Sunday, 06-Nov-94 08:49:37 GMT', ++ 'output': 'Sunday, 06-Nov-94 08:49:37 GMT' ++ }, ++ # other test cases ++ { ++ 'data': 'key=value; expires=Wednesday, 09-Nov-94 08:49:37 GMT', ++ 'output': 'Wednesday, 09-Nov-94 08:49:37 GMT' ++ }, ++ { ++ 'data': 'key=value; expires=Friday, 11-Nov-94 08:49:37 GMT', ++ 'output': 'Friday, 11-Nov-94 08:49:37 GMT' ++ }, ++ { ++ 'data': 'key=value; expires=Monday, 14-Nov-94 08:49:37 GMT', ++ 'output': 'Monday, 14-Nov-94 08:49:37 GMT' ++ }, ++ ] ++ ++ for case in test_cases: ++ with self.subTest(data=case['data']): ++ C = cookies.SimpleCookie() ++ C.load(case['data']) ++ ++ # Extract the cookie name from the data string ++ cookie_name = case['data'].split('=')[0] ++ ++ # Check if the cookie is loaded correctly ++ self.assertIn(cookie_name, C) ++ self.assertEqual(C[cookie_name].get('expires'), case['output']) ++ + def test_unquote(self): + cases = [ + (r'a="b=\""', 'b="'), +diff --git a/Lib/test/test_long.py b/Lib/test/test_long.py +index d299c34cec0..41b973da2c7 100644 +--- a/Lib/test/test_long.py ++++ b/Lib/test/test_long.py +@@ -1639,6 +1639,8 @@ class MyInt(int): + MyInt.__basicsize__ + MyInt.__itemsize__ * ndigits + ) + ++ # GH-117195 -- This shouldn't crash ++ object.__sizeof__(1) + + if __name__ == "__main__": + unittest.main() +diff --git a/Lib/test/test_readline.py b/Lib/test/test_readline.py +index fab124ae4ad..e8a92f2b912 100644 +--- a/Lib/test/test_readline.py ++++ b/Lib/test/test_readline.py +@@ -114,6 +114,14 @@ def test_write_read_append(self): + # write_history_file can create the target + readline.write_history_file(hfilename) + ++ # Negative values should be disallowed ++ with self.assertRaises(ValueError): ++ readline.append_history_file(-42, hfilename) ++ ++ # See gh-122431, using the minimum signed integer value caused a segfault ++ with self.assertRaises(ValueError): ++ readline.append_history_file(-2147483648, hfilename) ++ + def test_nonascii_history(self): + readline.clear_history() + try: +diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py +index 9a559f44152..c7ded0f67fc 100644 +--- a/Lib/urllib/request.py ++++ b/Lib/urllib/request.py +@@ -903,9 +903,9 @@ def find_user_password(self, realm, authuri): + + class HTTPPasswordMgrWithPriorAuth(HTTPPasswordMgrWithDefaultRealm): + +- def __init__(self, *args, **kwargs): ++ def __init__(self): + self.authenticated = {} +- super().__init__(*args, **kwargs) ++ super().__init__() + + def add_password(self, realm, uri, user, passwd, is_authenticated=False): + self.update_authenticated(uri, is_authenticated) +diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c +index d5298519b58..82078a56988 100644 +--- a/Modules/posixmodule.c ++++ b/Modules/posixmodule.c +@@ -61,6 +61,9 @@ + + #include // ctermid() + #include // system() ++#ifdef HAVE_SYS_PIDFD_H ++# include // PIDFD_NONBLOCK ++#endif + + /* + * A number of APIs are available on macOS from a certain macOS version. +diff --git a/Modules/readline.c b/Modules/readline.c +index 0b6f96fdbfd..db2e7e35a49 100644 +--- a/Modules/readline.c ++++ b/Modules/readline.c +@@ -336,6 +336,12 @@ readline_append_history_file_impl(PyObject *module, int nelements, + PyObject *filename_obj) + /*[clinic end generated code: output=5df06fc9da56e4e4 input=784b774db3a4b7c5]*/ + { ++ if (nelements < 0) ++ { ++ PyErr_SetString(PyExc_ValueError, "nelements must be positive"); ++ return NULL; ++ } ++ + PyObject *filename_bytes; + const char *filename; + int err; +diff --git a/Objects/dictobject.c b/Objects/dictobject.c +index 4e965314945..7337e290e89 100644 +--- a/Objects/dictobject.c ++++ b/Objects/dictobject.c +@@ -458,11 +458,14 @@ estimate_log2_keysize(Py_ssize_t n) + + /* This immutable, empty PyDictKeysObject is used for PyDict_Clear() + * (which cannot fail and thus can do no allocation). ++ * ++ * See https://github.com/python/cpython/pull/127568#discussion_r1868070614 ++ * for the rationale of using dk_log2_index_bytes=3 instead of 0. + */ + static PyDictKeysObject empty_keys_struct = { + _Py_IMMORTAL_REFCNT, /* dk_refcnt */ + 0, /* dk_log2_size */ +- 0, /* dk_log2_index_bytes */ ++ 3, /* dk_log2_index_bytes */ + DICT_KEYS_UNICODE, /* dk_kind */ + 1, /* dk_version */ + 0, /* dk_usable (immutable) */ +diff --git a/Objects/typeobject.c b/Objects/typeobject.c +index 5bca4b4e788..06857e36857 100644 +--- a/Objects/typeobject.c ++++ b/Objects/typeobject.c +@@ -6462,8 +6462,11 @@ object___sizeof___impl(PyObject *self) + + res = 0; + isize = Py_TYPE(self)->tp_itemsize; +- if (isize > 0) +- res = Py_SIZE(self) * isize; ++ if (isize > 0) { ++ /* This assumes that ob_size is valid if tp_itemsize is not 0, ++ which isn't true for PyLongObject. */ ++ res = _PyVarObject_CAST(self)->ob_size * isize; ++ } + res += Py_TYPE(self)->tp_basicsize; + + return PyLong_FromSsize_t(res); +diff --git a/Python/pythonrun.c b/Python/pythonrun.c +index 5f3d249df45..cf84573a8e6 100644 +--- a/Python/pythonrun.c ++++ b/Python/pythonrun.c +@@ -538,43 +538,37 @@ parse_syntax_error(PyObject *err, PyObject **message, PyObject **filename, + *offset = hold; + } + +- if (Py_TYPE(err) == (PyTypeObject*)PyExc_SyntaxError) { +- v = PyObject_GetAttr(err, &_Py_ID(end_lineno)); +- if (!v) { +- PyErr_Clear(); +- *end_lineno = *lineno; +- } +- else if (v == Py_None) { +- *end_lineno = *lineno; +- Py_DECREF(v); +- } else { +- hold = PyLong_AsSsize_t(v); +- Py_DECREF(v); +- if (hold < 0 && PyErr_Occurred()) +- goto finally; +- *end_lineno = hold; +- } +- +- v = PyObject_GetAttr(err, &_Py_ID(end_offset)); +- if (!v) { +- PyErr_Clear(); +- *end_offset = -1; +- } +- else if (v == Py_None) { +- *end_offset = -1; +- Py_DECREF(v); +- } else { +- hold = PyLong_AsSsize_t(v); +- Py_DECREF(v); +- if (hold < 0 && PyErr_Occurred()) +- goto finally; +- *end_offset = hold; +- } +- } else { +- // SyntaxError subclasses ++ v = PyObject_GetAttr(err, &_Py_ID(end_lineno)); ++ if (!v) { ++ PyErr_Clear(); + *end_lineno = *lineno; ++ } ++ else if (v == Py_None) { ++ *end_lineno = *lineno; ++ Py_DECREF(v); ++ } else { ++ hold = PyLong_AsSsize_t(v); ++ Py_DECREF(v); ++ if (hold < 0 && PyErr_Occurred()) ++ goto finally; ++ *end_lineno = hold; ++ } ++ ++ v = PyObject_GetAttr(err, &_Py_ID(end_offset)); ++ if (!v) { ++ PyErr_Clear(); + *end_offset = -1; + } ++ else if (v == Py_None) { ++ *end_offset = -1; ++ Py_DECREF(v); ++ } else { ++ hold = PyLong_AsSsize_t(v); ++ Py_DECREF(v); ++ if (hold < 0 && PyErr_Occurred()) ++ goto finally; ++ *end_offset = hold; ++ } + + v = PyObject_GetAttr(err, &_Py_ID(text)); + if (!v) +diff --git a/configure.ac b/configure.ac +index 9270b5f7172..de9d7f56ffb 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -2874,7 +2874,7 @@ AC_CHECK_HEADERS([ \ + linux/tipc.h linux/wait.h netdb.h net/ethernet.h netinet/in.h netpacket/packet.h poll.h process.h pthread.h pty.h \ + sched.h setjmp.h shadow.h signal.h spawn.h stropts.h sys/audioio.h sys/bsdtty.h sys/devpoll.h \ + sys/endian.h sys/epoll.h sys/event.h sys/eventfd.h sys/file.h sys/ioctl.h sys/kern_control.h \ +- sys/loadavg.h sys/lock.h sys/memfd.h sys/mkdev.h sys/mman.h sys/modem.h sys/param.h sys/poll.h \ ++ sys/loadavg.h sys/lock.h sys/memfd.h sys/mkdev.h sys/mman.h sys/modem.h sys/param.h sys/pidfd.h sys/poll.h \ + sys/random.h sys/resource.h sys/select.h sys/sendfile.h sys/socket.h sys/soundcard.h sys/stat.h \ + sys/statvfs.h sys/sys_domain.h sys/syscall.h sys/sysmacros.h sys/termio.h sys/time.h sys/times.h \ + sys/types.h sys/uio.h sys/un.h sys/utsname.h sys/wait.h sys/xattr.h sysexits.h syslog.h \ +diff --git a/pyconfig.h.in b/pyconfig.h.in +index 7d3537e5dd8..167c6a11411 100644 +--- a/pyconfig.h.in ++++ b/pyconfig.h.in +@@ -1332,6 +1332,9 @@ + /* Define to 1 if you have the header file. */ + #undef HAVE_SYS_PARAM_H + ++/* Define to 1 if you have the header file. */ ++#undef HAVE_SYS_PIDFD_H ++ + /* Define to 1 if you have the header file. */ + #undef HAVE_SYS_POLL_H + diff --git a/debian/patches/ignore-wheeldata.diff b/debian/patches/ignore-wheeldata.diff new file mode 100644 index 00000000..303e83a4 --- /dev/null +++ b/debian/patches/ignore-wheeldata.diff @@ -0,0 +1,39 @@ +Description: Don't assume wheeldata is deleted if `WHEEL_PKG_DIR` is set + Remove wheeldata from both sides of the `assertEqual`, so that we're + *actually* ignoring it from the test set. + . + This test is only making assertions about the source tree, no code is being + executed that would do anything different based on the value of + `WHEEL_PKG_DIR`. +Author: Stefano Rivera +Bug-upstream: https://github.com/python/cpython/issues/120418 +Forwarded: https://github.com/python/cpython/pull/120419 + +--- a/Lib/test/test_tools/test_makefile.py ++++ b/Lib/test/test_tools/test_makefile.py +@@ -40,7 +40,7 @@ + idle_test = 'idlelib/idle_test' + self.assertIn(idle_test, test_dirs) + +- used = [idle_test] ++ used = set([idle_test]) + for dirpath, dirs, files in os.walk(support.TEST_HOME_DIR): + dirname = os.path.basename(dirpath) + # Skip temporary dirs: +@@ -67,13 +67,14 @@ + "of test directories to install" + ) + ) +- used.append(relpath) ++ used.add(relpath) + + # Don't check the wheel dir when Python is built --with-wheel-pkg-dir + if sysconfig.get_config_var('WHEEL_PKG_DIR'): + test_dirs.remove('test/wheeldata') ++ used.discard('test/wheeldata') + + # Check that there are no extra entries: + unique_test_dirs = set(test_dirs) +- self.assertSetEqual(unique_test_dirs, set(used)) ++ self.assertSetEqual(unique_test_dirs, used) + self.assertEqual(len(test_dirs), len(unique_test_dirs)) diff --git a/debian/patches/issue127330.diff b/debian/patches/issue127330.diff new file mode 100644 index 00000000..3ea33048 --- /dev/null +++ b/debian/patches/issue127330.diff @@ -0,0 +1,18006 @@ +--- a/Modules/_ssl.c ++++ b/Modules/_ssl.c +@@ -116,8 +116,9 @@ static void _PySSLFixErrno(void) { + #endif + + /* Include generated data (error codes) */ ++/* See make_ssl_data.h for notes on adding a new version. */ + #if (OPENSSL_VERSION_NUMBER >= 0x30100000L) +-#include "_ssl_data_31.h" ++#include "_ssl_data_34.h" + #elif (OPENSSL_VERSION_NUMBER >= 0x30000000L) + #include "_ssl_data_300.h" + #elif (OPENSSL_VERSION_NUMBER >= 0x10101000L) && !defined(LIBRESSL_VERSION_NUMBER) +--- a/Modules/_ssl_data_111.h ++++ b/Modules/_ssl_data_111.h +@@ -1,4 +1,6 @@ +-/* File generated by Tools/ssl/make_ssl_data.py *//* Generated on 2023-06-01T02:58:04.081473 */ ++/* File generated by Tools/ssl/make_ssl_data.py */ ++/* Generated on 2024-11-27T12:48:46.194048+00:00 */ ++/* Generated from Git commit OpenSSL_1_1_1w-0-ge04bd3433f */ + static struct py_ssl_library_code library_codes[] = { + #ifdef ERR_LIB_ASN1 + {"ASN1", ERR_LIB_ASN1}, +--- a/Modules/_ssl_data_300.h ++++ b/Modules/_ssl_data_300.h +@@ -1,4 +1,7 @@ +-/* File generated by Tools/ssl/make_ssl_data.py *//* Generated on 2023-06-01T03:03:52.163218 */ ++/* File generated by Tools/ssl/make_ssl_data.py */ ++/* Generated on 2023-06-01T03:03:52.163218 */ ++/* Manually edited to add definitions from 1.1.1 (GH-105174) */ ++ + static struct py_ssl_library_code library_codes[] = { + #ifdef ERR_LIB_ASN1 + {"ASN1", ERR_LIB_ASN1}, +--- a/Modules/_ssl_data_31.h ++++ /dev/null +@@ -1,8605 +0,0 @@ +-/* File generated by Tools/ssl/make_ssl_data.py *//* Generated on 2023-06-01T03:04:00.275280 */ +-static struct py_ssl_library_code library_codes[] = { +-#ifdef ERR_LIB_ASN1 +- {"ASN1", ERR_LIB_ASN1}, +-#endif +-#ifdef ERR_LIB_ASYNC +- {"ASYNC", ERR_LIB_ASYNC}, +-#endif +-#ifdef ERR_LIB_BIO +- {"BIO", ERR_LIB_BIO}, +-#endif +-#ifdef ERR_LIB_BN +- {"BN", ERR_LIB_BN}, +-#endif +-#ifdef ERR_LIB_BUF +- {"BUF", ERR_LIB_BUF}, +-#endif +-#ifdef ERR_LIB_CMP +- {"CMP", ERR_LIB_CMP}, +-#endif +-#ifdef ERR_LIB_CMS +- {"CMS", ERR_LIB_CMS}, +-#endif +-#ifdef ERR_LIB_COMP +- {"COMP", ERR_LIB_COMP}, +-#endif +-#ifdef ERR_LIB_CONF +- {"CONF", ERR_LIB_CONF}, +-#endif +-#ifdef ERR_LIB_CRMF +- {"CRMF", ERR_LIB_CRMF}, +-#endif +-#ifdef ERR_LIB_CRYPTO +- {"CRYPTO", ERR_LIB_CRYPTO}, +-#endif +-#ifdef ERR_LIB_CT +- {"CT", ERR_LIB_CT}, +-#endif +-#ifdef ERR_LIB_DH +- {"DH", ERR_LIB_DH}, +-#endif +-#ifdef ERR_LIB_DSA +- {"DSA", ERR_LIB_DSA}, +-#endif +-#ifdef ERR_LIB_DSO +- {"DSO", ERR_LIB_DSO}, +-#endif +-#ifdef ERR_LIB_EC +- {"EC", ERR_LIB_EC}, +-#endif +-#ifdef ERR_LIB_ECDH +- {"ECDH", ERR_LIB_ECDH}, +-#endif +-#ifdef ERR_LIB_ECDSA +- {"ECDSA", ERR_LIB_ECDSA}, +-#endif +-#ifdef ERR_LIB_ENGINE +- {"ENGINE", ERR_LIB_ENGINE}, +-#endif +-#ifdef ERR_LIB_ESS +- {"ESS", ERR_LIB_ESS}, +-#endif +-#ifdef ERR_LIB_EVP +- {"EVP", ERR_LIB_EVP}, +-#endif +-#ifdef ERR_LIB_FIPS +- {"FIPS", ERR_LIB_FIPS}, +-#endif +-#ifdef ERR_LIB_HMAC +- {"HMAC", ERR_LIB_HMAC}, +-#endif +-#ifdef ERR_LIB_HTTP +- {"HTTP", ERR_LIB_HTTP}, +-#endif +-#ifdef ERR_LIB_JPAKE +- {"JPAKE", ERR_LIB_JPAKE}, +-#endif +-#ifdef ERR_LIB_KDF +- {"KDF", ERR_LIB_KDF}, +-#endif +-#ifdef ERR_LIB_MASK +- {"MASK", ERR_LIB_MASK}, +-#endif +-#ifdef ERR_LIB_METH +- {"METH", ERR_LIB_METH}, +-#endif +-#ifdef ERR_LIB_NONE +- {"NONE", ERR_LIB_NONE}, +-#endif +-#ifdef ERR_LIB_OBJ +- {"OBJ", ERR_LIB_OBJ}, +-#endif +-#ifdef ERR_LIB_OCSP +- {"OCSP", ERR_LIB_OCSP}, +-#endif +-#ifdef ERR_LIB_OFFSET +- {"OFFSET", ERR_LIB_OFFSET}, +-#endif +-#ifdef ERR_LIB_OSSL_DECODER +- {"OSSL_DECODER", ERR_LIB_OSSL_DECODER}, +-#endif +-#ifdef ERR_LIB_OSSL_ENCODER +- {"OSSL_ENCODER", ERR_LIB_OSSL_ENCODER}, +-#endif +-#ifdef ERR_LIB_OSSL_STORE +- {"OSSL_STORE", ERR_LIB_OSSL_STORE}, +-#endif +-#ifdef ERR_LIB_PEM +- {"PEM", ERR_LIB_PEM}, +-#endif +-#ifdef ERR_LIB_PKCS12 +- {"PKCS12", ERR_LIB_PKCS12}, +-#endif +-#ifdef ERR_LIB_PKCS7 +- {"PKCS7", ERR_LIB_PKCS7}, +-#endif +-#ifdef ERR_LIB_PROP +- {"PROP", ERR_LIB_PROP}, +-#endif +-#ifdef ERR_LIB_PROV +- {"PROV", ERR_LIB_PROV}, +-#endif +-#ifdef ERR_LIB_PROXY +- {"PROXY", ERR_LIB_PROXY}, +-#endif +-#ifdef ERR_LIB_RAND +- {"RAND", ERR_LIB_RAND}, +-#endif +-#ifdef ERR_LIB_RSA +- {"RSA", ERR_LIB_RSA}, +-#endif +-#ifdef ERR_LIB_RSAREF +- {"RSAREF", ERR_LIB_RSAREF}, +-#endif +-#ifdef ERR_LIB_SM2 +- {"SM2", ERR_LIB_SM2}, +-#endif +-#ifdef ERR_LIB_SSL +- {"SSL", ERR_LIB_SSL}, +-#endif +-#ifdef ERR_LIB_SSL2 +- {"SSL2", ERR_LIB_SSL2}, +-#endif +-#ifdef ERR_LIB_SSL23 +- {"SSL23", ERR_LIB_SSL23}, +-#endif +-#ifdef ERR_LIB_SSL3 +- {"SSL3", ERR_LIB_SSL3}, +-#endif +-#ifdef ERR_LIB_SYS +- {"SYS", ERR_LIB_SYS}, +-#endif +-#ifdef ERR_LIB_TS +- {"TS", ERR_LIB_TS}, +-#endif +-#ifdef ERR_LIB_UI +- {"UI", ERR_LIB_UI}, +-#endif +-#ifdef ERR_LIB_USER +- {"USER", ERR_LIB_USER}, +-#endif +-#ifdef ERR_LIB_X509 +- {"X509", ERR_LIB_X509}, +-#endif +-#ifdef ERR_LIB_X509V3 +- {"X509V3", ERR_LIB_X509V3}, +-#endif +- { NULL } +-}; +- +- +-static struct py_ssl_error_code error_codes[] = { +- #ifdef ASN1_R_ADDING_OBJECT +- {"ADDING_OBJECT", ERR_LIB_ASN1, ASN1_R_ADDING_OBJECT}, +- #else +- {"ADDING_OBJECT", 13, 171}, +- #endif +- #ifdef ASN1_R_ASN1_PARSE_ERROR +- {"ASN1_PARSE_ERROR", ERR_LIB_ASN1, ASN1_R_ASN1_PARSE_ERROR}, +- #else +- {"ASN1_PARSE_ERROR", 13, 203}, +- #endif +- #ifdef ASN1_R_ASN1_SIG_PARSE_ERROR +- {"ASN1_SIG_PARSE_ERROR", ERR_LIB_ASN1, ASN1_R_ASN1_SIG_PARSE_ERROR}, +- #else +- {"ASN1_SIG_PARSE_ERROR", 13, 204}, +- #endif +- #ifdef ASN1_R_AUX_ERROR +- {"AUX_ERROR", ERR_LIB_ASN1, ASN1_R_AUX_ERROR}, +- #else +- {"AUX_ERROR", 13, 100}, +- #endif +- #ifdef ASN1_R_BAD_OBJECT_HEADER +- {"BAD_OBJECT_HEADER", ERR_LIB_ASN1, ASN1_R_BAD_OBJECT_HEADER}, +- #else +- {"BAD_OBJECT_HEADER", 13, 102}, +- #endif +- #ifdef ASN1_R_BAD_TEMPLATE +- {"BAD_TEMPLATE", ERR_LIB_ASN1, ASN1_R_BAD_TEMPLATE}, +- #else +- {"BAD_TEMPLATE", 13, 230}, +- #endif +- #ifdef ASN1_R_BMPSTRING_IS_WRONG_LENGTH +- {"BMPSTRING_IS_WRONG_LENGTH", ERR_LIB_ASN1, ASN1_R_BMPSTRING_IS_WRONG_LENGTH}, +- #else +- {"BMPSTRING_IS_WRONG_LENGTH", 13, 214}, +- #endif +- #ifdef ASN1_R_BN_LIB +- {"BN_LIB", ERR_LIB_ASN1, ASN1_R_BN_LIB}, +- #else +- {"BN_LIB", 13, 105}, +- #endif +- #ifdef ASN1_R_BOOLEAN_IS_WRONG_LENGTH +- {"BOOLEAN_IS_WRONG_LENGTH", ERR_LIB_ASN1, ASN1_R_BOOLEAN_IS_WRONG_LENGTH}, +- #else +- {"BOOLEAN_IS_WRONG_LENGTH", 13, 106}, +- #endif +- #ifdef ASN1_R_BUFFER_TOO_SMALL +- {"BUFFER_TOO_SMALL", ERR_LIB_ASN1, ASN1_R_BUFFER_TOO_SMALL}, +- #else +- {"BUFFER_TOO_SMALL", 13, 107}, +- #endif +- #ifdef ASN1_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER +- {"CIPHER_HAS_NO_OBJECT_IDENTIFIER", ERR_LIB_ASN1, ASN1_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER}, +- #else +- {"CIPHER_HAS_NO_OBJECT_IDENTIFIER", 13, 108}, +- #endif +- #ifdef ASN1_R_CONTEXT_NOT_INITIALISED +- {"CONTEXT_NOT_INITIALISED", ERR_LIB_ASN1, ASN1_R_CONTEXT_NOT_INITIALISED}, +- #else +- {"CONTEXT_NOT_INITIALISED", 13, 217}, +- #endif +- #ifdef ASN1_R_DATA_IS_WRONG +- {"DATA_IS_WRONG", ERR_LIB_ASN1, ASN1_R_DATA_IS_WRONG}, +- #else +- {"DATA_IS_WRONG", 13, 109}, +- #endif +- #ifdef ASN1_R_DECODE_ERROR +- {"DECODE_ERROR", ERR_LIB_ASN1, ASN1_R_DECODE_ERROR}, +- #else +- {"DECODE_ERROR", 13, 110}, +- #endif +- #ifdef ASN1_R_DEPTH_EXCEEDED +- {"DEPTH_EXCEEDED", ERR_LIB_ASN1, ASN1_R_DEPTH_EXCEEDED}, +- #else +- {"DEPTH_EXCEEDED", 13, 174}, +- #endif +- #ifdef ASN1_R_DIGEST_AND_KEY_TYPE_NOT_SUPPORTED +- {"DIGEST_AND_KEY_TYPE_NOT_SUPPORTED", ERR_LIB_ASN1, ASN1_R_DIGEST_AND_KEY_TYPE_NOT_SUPPORTED}, +- #else +- {"DIGEST_AND_KEY_TYPE_NOT_SUPPORTED", 13, 198}, +- #endif +- #ifdef ASN1_R_ENCODE_ERROR +- {"ENCODE_ERROR", ERR_LIB_ASN1, ASN1_R_ENCODE_ERROR}, +- #else +- {"ENCODE_ERROR", 13, 112}, +- #endif +- #ifdef ASN1_R_ERROR_GETTING_TIME +- {"ERROR_GETTING_TIME", ERR_LIB_ASN1, ASN1_R_ERROR_GETTING_TIME}, +- #else +- {"ERROR_GETTING_TIME", 13, 173}, +- #endif +- #ifdef ASN1_R_ERROR_LOADING_SECTION +- {"ERROR_LOADING_SECTION", ERR_LIB_ASN1, ASN1_R_ERROR_LOADING_SECTION}, +- #else +- {"ERROR_LOADING_SECTION", 13, 172}, +- #endif +- #ifdef ASN1_R_ERROR_SETTING_CIPHER_PARAMS +- {"ERROR_SETTING_CIPHER_PARAMS", ERR_LIB_ASN1, ASN1_R_ERROR_SETTING_CIPHER_PARAMS}, +- #else +- {"ERROR_SETTING_CIPHER_PARAMS", 13, 114}, +- #endif +- #ifdef ASN1_R_EXPECTING_AN_INTEGER +- {"EXPECTING_AN_INTEGER", ERR_LIB_ASN1, ASN1_R_EXPECTING_AN_INTEGER}, +- #else +- {"EXPECTING_AN_INTEGER", 13, 115}, +- #endif +- #ifdef ASN1_R_EXPECTING_AN_OBJECT +- {"EXPECTING_AN_OBJECT", ERR_LIB_ASN1, ASN1_R_EXPECTING_AN_OBJECT}, +- #else +- {"EXPECTING_AN_OBJECT", 13, 116}, +- #endif +- #ifdef ASN1_R_EXPLICIT_LENGTH_MISMATCH +- {"EXPLICIT_LENGTH_MISMATCH", ERR_LIB_ASN1, ASN1_R_EXPLICIT_LENGTH_MISMATCH}, +- #else +- {"EXPLICIT_LENGTH_MISMATCH", 13, 119}, +- #endif +- #ifdef ASN1_R_EXPLICIT_TAG_NOT_CONSTRUCTED +- {"EXPLICIT_TAG_NOT_CONSTRUCTED", ERR_LIB_ASN1, ASN1_R_EXPLICIT_TAG_NOT_CONSTRUCTED}, +- #else +- {"EXPLICIT_TAG_NOT_CONSTRUCTED", 13, 120}, +- #endif +- #ifdef ASN1_R_FIELD_MISSING +- {"FIELD_MISSING", ERR_LIB_ASN1, ASN1_R_FIELD_MISSING}, +- #else +- {"FIELD_MISSING", 13, 121}, +- #endif +- #ifdef ASN1_R_FIRST_NUM_TOO_LARGE +- {"FIRST_NUM_TOO_LARGE", ERR_LIB_ASN1, ASN1_R_FIRST_NUM_TOO_LARGE}, +- #else +- {"FIRST_NUM_TOO_LARGE", 13, 122}, +- #endif +- #ifdef ASN1_R_HEADER_TOO_LONG +- {"HEADER_TOO_LONG", ERR_LIB_ASN1, ASN1_R_HEADER_TOO_LONG}, +- #else +- {"HEADER_TOO_LONG", 13, 123}, +- #endif +- #ifdef ASN1_R_ILLEGAL_BITSTRING_FORMAT +- {"ILLEGAL_BITSTRING_FORMAT", ERR_LIB_ASN1, ASN1_R_ILLEGAL_BITSTRING_FORMAT}, +- #else +- {"ILLEGAL_BITSTRING_FORMAT", 13, 175}, +- #endif +- #ifdef ASN1_R_ILLEGAL_BOOLEAN +- {"ILLEGAL_BOOLEAN", ERR_LIB_ASN1, ASN1_R_ILLEGAL_BOOLEAN}, +- #else +- {"ILLEGAL_BOOLEAN", 13, 176}, +- #endif +- #ifdef ASN1_R_ILLEGAL_CHARACTERS +- {"ILLEGAL_CHARACTERS", ERR_LIB_ASN1, ASN1_R_ILLEGAL_CHARACTERS}, +- #else +- {"ILLEGAL_CHARACTERS", 13, 124}, +- #endif +- #ifdef ASN1_R_ILLEGAL_FORMAT +- {"ILLEGAL_FORMAT", ERR_LIB_ASN1, ASN1_R_ILLEGAL_FORMAT}, +- #else +- {"ILLEGAL_FORMAT", 13, 177}, +- #endif +- #ifdef ASN1_R_ILLEGAL_HEX +- {"ILLEGAL_HEX", ERR_LIB_ASN1, ASN1_R_ILLEGAL_HEX}, +- #else +- {"ILLEGAL_HEX", 13, 178}, +- #endif +- #ifdef ASN1_R_ILLEGAL_IMPLICIT_TAG +- {"ILLEGAL_IMPLICIT_TAG", ERR_LIB_ASN1, ASN1_R_ILLEGAL_IMPLICIT_TAG}, +- #else +- {"ILLEGAL_IMPLICIT_TAG", 13, 179}, +- #endif +- #ifdef ASN1_R_ILLEGAL_INTEGER +- {"ILLEGAL_INTEGER", ERR_LIB_ASN1, ASN1_R_ILLEGAL_INTEGER}, +- #else +- {"ILLEGAL_INTEGER", 13, 180}, +- #endif +- #ifdef ASN1_R_ILLEGAL_NEGATIVE_VALUE +- {"ILLEGAL_NEGATIVE_VALUE", ERR_LIB_ASN1, ASN1_R_ILLEGAL_NEGATIVE_VALUE}, +- #else +- {"ILLEGAL_NEGATIVE_VALUE", 13, 226}, +- #endif +- #ifdef ASN1_R_ILLEGAL_NESTED_TAGGING +- {"ILLEGAL_NESTED_TAGGING", ERR_LIB_ASN1, ASN1_R_ILLEGAL_NESTED_TAGGING}, +- #else +- {"ILLEGAL_NESTED_TAGGING", 13, 181}, +- #endif +- #ifdef ASN1_R_ILLEGAL_NULL +- {"ILLEGAL_NULL", ERR_LIB_ASN1, ASN1_R_ILLEGAL_NULL}, +- #else +- {"ILLEGAL_NULL", 13, 125}, +- #endif +- #ifdef ASN1_R_ILLEGAL_NULL_VALUE +- {"ILLEGAL_NULL_VALUE", ERR_LIB_ASN1, ASN1_R_ILLEGAL_NULL_VALUE}, +- #else +- {"ILLEGAL_NULL_VALUE", 13, 182}, +- #endif +- #ifdef ASN1_R_ILLEGAL_OBJECT +- {"ILLEGAL_OBJECT", ERR_LIB_ASN1, ASN1_R_ILLEGAL_OBJECT}, +- #else +- {"ILLEGAL_OBJECT", 13, 183}, +- #endif +- #ifdef ASN1_R_ILLEGAL_OPTIONAL_ANY +- {"ILLEGAL_OPTIONAL_ANY", ERR_LIB_ASN1, ASN1_R_ILLEGAL_OPTIONAL_ANY}, +- #else +- {"ILLEGAL_OPTIONAL_ANY", 13, 126}, +- #endif +- #ifdef ASN1_R_ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE +- {"ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE", ERR_LIB_ASN1, ASN1_R_ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE}, +- #else +- {"ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE", 13, 170}, +- #endif +- #ifdef ASN1_R_ILLEGAL_PADDING +- {"ILLEGAL_PADDING", ERR_LIB_ASN1, ASN1_R_ILLEGAL_PADDING}, +- #else +- {"ILLEGAL_PADDING", 13, 221}, +- #endif +- #ifdef ASN1_R_ILLEGAL_TAGGED_ANY +- {"ILLEGAL_TAGGED_ANY", ERR_LIB_ASN1, ASN1_R_ILLEGAL_TAGGED_ANY}, +- #else +- {"ILLEGAL_TAGGED_ANY", 13, 127}, +- #endif +- #ifdef ASN1_R_ILLEGAL_TIME_VALUE +- {"ILLEGAL_TIME_VALUE", ERR_LIB_ASN1, ASN1_R_ILLEGAL_TIME_VALUE}, +- #else +- {"ILLEGAL_TIME_VALUE", 13, 184}, +- #endif +- #ifdef ASN1_R_ILLEGAL_ZERO_CONTENT +- {"ILLEGAL_ZERO_CONTENT", ERR_LIB_ASN1, ASN1_R_ILLEGAL_ZERO_CONTENT}, +- #else +- {"ILLEGAL_ZERO_CONTENT", 13, 222}, +- #endif +- #ifdef ASN1_R_INTEGER_NOT_ASCII_FORMAT +- {"INTEGER_NOT_ASCII_FORMAT", ERR_LIB_ASN1, ASN1_R_INTEGER_NOT_ASCII_FORMAT}, +- #else +- {"INTEGER_NOT_ASCII_FORMAT", 13, 185}, +- #endif +- #ifdef ASN1_R_INTEGER_TOO_LARGE_FOR_LONG +- {"INTEGER_TOO_LARGE_FOR_LONG", ERR_LIB_ASN1, ASN1_R_INTEGER_TOO_LARGE_FOR_LONG}, +- #else +- {"INTEGER_TOO_LARGE_FOR_LONG", 13, 128}, +- #endif +- #ifdef ASN1_R_INVALID_BIT_STRING_BITS_LEFT +- {"INVALID_BIT_STRING_BITS_LEFT", ERR_LIB_ASN1, ASN1_R_INVALID_BIT_STRING_BITS_LEFT}, +- #else +- {"INVALID_BIT_STRING_BITS_LEFT", 13, 220}, +- #endif +- #ifdef ASN1_R_INVALID_BMPSTRING_LENGTH +- {"INVALID_BMPSTRING_LENGTH", ERR_LIB_ASN1, ASN1_R_INVALID_BMPSTRING_LENGTH}, +- #else +- {"INVALID_BMPSTRING_LENGTH", 13, 129}, +- #endif +- #ifdef ASN1_R_INVALID_DIGIT +- {"INVALID_DIGIT", ERR_LIB_ASN1, ASN1_R_INVALID_DIGIT}, +- #else +- {"INVALID_DIGIT", 13, 130}, +- #endif +- #ifdef ASN1_R_INVALID_MIME_TYPE +- {"INVALID_MIME_TYPE", ERR_LIB_ASN1, ASN1_R_INVALID_MIME_TYPE}, +- #else +- {"INVALID_MIME_TYPE", 13, 205}, +- #endif +- #ifdef ASN1_R_INVALID_MODIFIER +- {"INVALID_MODIFIER", ERR_LIB_ASN1, ASN1_R_INVALID_MODIFIER}, +- #else +- {"INVALID_MODIFIER", 13, 186}, +- #endif +- #ifdef ASN1_R_INVALID_NUMBER +- {"INVALID_NUMBER", ERR_LIB_ASN1, ASN1_R_INVALID_NUMBER}, +- #else +- {"INVALID_NUMBER", 13, 187}, +- #endif +- #ifdef ASN1_R_INVALID_OBJECT_ENCODING +- {"INVALID_OBJECT_ENCODING", ERR_LIB_ASN1, ASN1_R_INVALID_OBJECT_ENCODING}, +- #else +- {"INVALID_OBJECT_ENCODING", 13, 216}, +- #endif +- #ifdef ASN1_R_INVALID_SCRYPT_PARAMETERS +- {"INVALID_SCRYPT_PARAMETERS", ERR_LIB_ASN1, ASN1_R_INVALID_SCRYPT_PARAMETERS}, +- #else +- {"INVALID_SCRYPT_PARAMETERS", 13, 227}, +- #endif +- #ifdef ASN1_R_INVALID_SEPARATOR +- {"INVALID_SEPARATOR", ERR_LIB_ASN1, ASN1_R_INVALID_SEPARATOR}, +- #else +- {"INVALID_SEPARATOR", 13, 131}, +- #endif +- #ifdef ASN1_R_INVALID_STRING_TABLE_VALUE +- {"INVALID_STRING_TABLE_VALUE", ERR_LIB_ASN1, ASN1_R_INVALID_STRING_TABLE_VALUE}, +- #else +- {"INVALID_STRING_TABLE_VALUE", 13, 218}, +- #endif +- #ifdef ASN1_R_INVALID_UNIVERSALSTRING_LENGTH +- {"INVALID_UNIVERSALSTRING_LENGTH", ERR_LIB_ASN1, ASN1_R_INVALID_UNIVERSALSTRING_LENGTH}, +- #else +- {"INVALID_UNIVERSALSTRING_LENGTH", 13, 133}, +- #endif +- #ifdef ASN1_R_INVALID_UTF8STRING +- {"INVALID_UTF8STRING", ERR_LIB_ASN1, ASN1_R_INVALID_UTF8STRING}, +- #else +- {"INVALID_UTF8STRING", 13, 134}, +- #endif +- #ifdef ASN1_R_INVALID_VALUE +- {"INVALID_VALUE", ERR_LIB_ASN1, ASN1_R_INVALID_VALUE}, +- #else +- {"INVALID_VALUE", 13, 219}, +- #endif +- #ifdef ASN1_R_LENGTH_TOO_LONG +- {"LENGTH_TOO_LONG", ERR_LIB_ASN1, ASN1_R_LENGTH_TOO_LONG}, +- #else +- {"LENGTH_TOO_LONG", 13, 231}, +- #endif +- #ifdef ASN1_R_LIST_ERROR +- {"LIST_ERROR", ERR_LIB_ASN1, ASN1_R_LIST_ERROR}, +- #else +- {"LIST_ERROR", 13, 188}, +- #endif +- #ifdef ASN1_R_MIME_NO_CONTENT_TYPE +- {"MIME_NO_CONTENT_TYPE", ERR_LIB_ASN1, ASN1_R_MIME_NO_CONTENT_TYPE}, +- #else +- {"MIME_NO_CONTENT_TYPE", 13, 206}, +- #endif +- #ifdef ASN1_R_MIME_PARSE_ERROR +- {"MIME_PARSE_ERROR", ERR_LIB_ASN1, ASN1_R_MIME_PARSE_ERROR}, +- #else +- {"MIME_PARSE_ERROR", 13, 207}, +- #endif +- #ifdef ASN1_R_MIME_SIG_PARSE_ERROR +- {"MIME_SIG_PARSE_ERROR", ERR_LIB_ASN1, ASN1_R_MIME_SIG_PARSE_ERROR}, +- #else +- {"MIME_SIG_PARSE_ERROR", 13, 208}, +- #endif +- #ifdef ASN1_R_MISSING_EOC +- {"MISSING_EOC", ERR_LIB_ASN1, ASN1_R_MISSING_EOC}, +- #else +- {"MISSING_EOC", 13, 137}, +- #endif +- #ifdef ASN1_R_MISSING_SECOND_NUMBER +- {"MISSING_SECOND_NUMBER", ERR_LIB_ASN1, ASN1_R_MISSING_SECOND_NUMBER}, +- #else +- {"MISSING_SECOND_NUMBER", 13, 138}, +- #endif +- #ifdef ASN1_R_MISSING_VALUE +- {"MISSING_VALUE", ERR_LIB_ASN1, ASN1_R_MISSING_VALUE}, +- #else +- {"MISSING_VALUE", 13, 189}, +- #endif +- #ifdef ASN1_R_MSTRING_NOT_UNIVERSAL +- {"MSTRING_NOT_UNIVERSAL", ERR_LIB_ASN1, ASN1_R_MSTRING_NOT_UNIVERSAL}, +- #else +- {"MSTRING_NOT_UNIVERSAL", 13, 139}, +- #endif +- #ifdef ASN1_R_MSTRING_WRONG_TAG +- {"MSTRING_WRONG_TAG", ERR_LIB_ASN1, ASN1_R_MSTRING_WRONG_TAG}, +- #else +- {"MSTRING_WRONG_TAG", 13, 140}, +- #endif +- #ifdef ASN1_R_NESTED_ASN1_STRING +- {"NESTED_ASN1_STRING", ERR_LIB_ASN1, ASN1_R_NESTED_ASN1_STRING}, +- #else +- {"NESTED_ASN1_STRING", 13, 197}, +- #endif +- #ifdef ASN1_R_NESTED_TOO_DEEP +- {"NESTED_TOO_DEEP", ERR_LIB_ASN1, ASN1_R_NESTED_TOO_DEEP}, +- #else +- {"NESTED_TOO_DEEP", 13, 201}, +- #endif +- #ifdef ASN1_R_NON_HEX_CHARACTERS +- {"NON_HEX_CHARACTERS", ERR_LIB_ASN1, ASN1_R_NON_HEX_CHARACTERS}, +- #else +- {"NON_HEX_CHARACTERS", 13, 141}, +- #endif +- #ifdef ASN1_R_NOT_ASCII_FORMAT +- {"NOT_ASCII_FORMAT", ERR_LIB_ASN1, ASN1_R_NOT_ASCII_FORMAT}, +- #else +- {"NOT_ASCII_FORMAT", 13, 190}, +- #endif +- #ifdef ASN1_R_NOT_ENOUGH_DATA +- {"NOT_ENOUGH_DATA", ERR_LIB_ASN1, ASN1_R_NOT_ENOUGH_DATA}, +- #else +- {"NOT_ENOUGH_DATA", 13, 142}, +- #endif +- #ifdef ASN1_R_NO_CONTENT_TYPE +- {"NO_CONTENT_TYPE", ERR_LIB_ASN1, ASN1_R_NO_CONTENT_TYPE}, +- #else +- {"NO_CONTENT_TYPE", 13, 209}, +- #endif +- #ifdef ASN1_R_NO_MATCHING_CHOICE_TYPE +- {"NO_MATCHING_CHOICE_TYPE", ERR_LIB_ASN1, ASN1_R_NO_MATCHING_CHOICE_TYPE}, +- #else +- {"NO_MATCHING_CHOICE_TYPE", 13, 143}, +- #endif +- #ifdef ASN1_R_NO_MULTIPART_BODY_FAILURE +- {"NO_MULTIPART_BODY_FAILURE", ERR_LIB_ASN1, ASN1_R_NO_MULTIPART_BODY_FAILURE}, +- #else +- {"NO_MULTIPART_BODY_FAILURE", 13, 210}, +- #endif +- #ifdef ASN1_R_NO_MULTIPART_BOUNDARY +- {"NO_MULTIPART_BOUNDARY", ERR_LIB_ASN1, ASN1_R_NO_MULTIPART_BOUNDARY}, +- #else +- {"NO_MULTIPART_BOUNDARY", 13, 211}, +- #endif +- #ifdef ASN1_R_NO_SIG_CONTENT_TYPE +- {"NO_SIG_CONTENT_TYPE", ERR_LIB_ASN1, ASN1_R_NO_SIG_CONTENT_TYPE}, +- #else +- {"NO_SIG_CONTENT_TYPE", 13, 212}, +- #endif +- #ifdef ASN1_R_NULL_IS_WRONG_LENGTH +- {"NULL_IS_WRONG_LENGTH", ERR_LIB_ASN1, ASN1_R_NULL_IS_WRONG_LENGTH}, +- #else +- {"NULL_IS_WRONG_LENGTH", 13, 144}, +- #endif +- #ifdef ASN1_R_OBJECT_NOT_ASCII_FORMAT +- {"OBJECT_NOT_ASCII_FORMAT", ERR_LIB_ASN1, ASN1_R_OBJECT_NOT_ASCII_FORMAT}, +- #else +- {"OBJECT_NOT_ASCII_FORMAT", 13, 191}, +- #endif +- #ifdef ASN1_R_ODD_NUMBER_OF_CHARS +- {"ODD_NUMBER_OF_CHARS", ERR_LIB_ASN1, ASN1_R_ODD_NUMBER_OF_CHARS}, +- #else +- {"ODD_NUMBER_OF_CHARS", 13, 145}, +- #endif +- #ifdef ASN1_R_SECOND_NUMBER_TOO_LARGE +- {"SECOND_NUMBER_TOO_LARGE", ERR_LIB_ASN1, ASN1_R_SECOND_NUMBER_TOO_LARGE}, +- #else +- {"SECOND_NUMBER_TOO_LARGE", 13, 147}, +- #endif +- #ifdef ASN1_R_SEQUENCE_LENGTH_MISMATCH +- {"SEQUENCE_LENGTH_MISMATCH", ERR_LIB_ASN1, ASN1_R_SEQUENCE_LENGTH_MISMATCH}, +- #else +- {"SEQUENCE_LENGTH_MISMATCH", 13, 148}, +- #endif +- #ifdef ASN1_R_SEQUENCE_NOT_CONSTRUCTED +- {"SEQUENCE_NOT_CONSTRUCTED", ERR_LIB_ASN1, ASN1_R_SEQUENCE_NOT_CONSTRUCTED}, +- #else +- {"SEQUENCE_NOT_CONSTRUCTED", 13, 149}, +- #endif +- #ifdef ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG +- {"SEQUENCE_OR_SET_NEEDS_CONFIG", ERR_LIB_ASN1, ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG}, +- #else +- {"SEQUENCE_OR_SET_NEEDS_CONFIG", 13, 192}, +- #endif +- #ifdef ASN1_R_SHORT_LINE +- {"SHORT_LINE", ERR_LIB_ASN1, ASN1_R_SHORT_LINE}, +- #else +- {"SHORT_LINE", 13, 150}, +- #endif +- #ifdef ASN1_R_SIG_INVALID_MIME_TYPE +- {"SIG_INVALID_MIME_TYPE", ERR_LIB_ASN1, ASN1_R_SIG_INVALID_MIME_TYPE}, +- #else +- {"SIG_INVALID_MIME_TYPE", 13, 213}, +- #endif +- #ifdef ASN1_R_STREAMING_NOT_SUPPORTED +- {"STREAMING_NOT_SUPPORTED", ERR_LIB_ASN1, ASN1_R_STREAMING_NOT_SUPPORTED}, +- #else +- {"STREAMING_NOT_SUPPORTED", 13, 202}, +- #endif +- #ifdef ASN1_R_STRING_TOO_LONG +- {"STRING_TOO_LONG", ERR_LIB_ASN1, ASN1_R_STRING_TOO_LONG}, +- #else +- {"STRING_TOO_LONG", 13, 151}, +- #endif +- #ifdef ASN1_R_STRING_TOO_SHORT +- {"STRING_TOO_SHORT", ERR_LIB_ASN1, ASN1_R_STRING_TOO_SHORT}, +- #else +- {"STRING_TOO_SHORT", 13, 152}, +- #endif +- #ifdef ASN1_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD +- {"THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD", ERR_LIB_ASN1, ASN1_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD}, +- #else +- {"THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD", 13, 154}, +- #endif +- #ifdef ASN1_R_TIME_NOT_ASCII_FORMAT +- {"TIME_NOT_ASCII_FORMAT", ERR_LIB_ASN1, ASN1_R_TIME_NOT_ASCII_FORMAT}, +- #else +- {"TIME_NOT_ASCII_FORMAT", 13, 193}, +- #endif +- #ifdef ASN1_R_TOO_LARGE +- {"TOO_LARGE", ERR_LIB_ASN1, ASN1_R_TOO_LARGE}, +- #else +- {"TOO_LARGE", 13, 223}, +- #endif +- #ifdef ASN1_R_TOO_LONG +- {"TOO_LONG", ERR_LIB_ASN1, ASN1_R_TOO_LONG}, +- #else +- {"TOO_LONG", 13, 155}, +- #endif +- #ifdef ASN1_R_TOO_SMALL +- {"TOO_SMALL", ERR_LIB_ASN1, ASN1_R_TOO_SMALL}, +- #else +- {"TOO_SMALL", 13, 224}, +- #endif +- #ifdef ASN1_R_TYPE_NOT_CONSTRUCTED +- {"TYPE_NOT_CONSTRUCTED", ERR_LIB_ASN1, ASN1_R_TYPE_NOT_CONSTRUCTED}, +- #else +- {"TYPE_NOT_CONSTRUCTED", 13, 156}, +- #endif +- #ifdef ASN1_R_TYPE_NOT_PRIMITIVE +- {"TYPE_NOT_PRIMITIVE", ERR_LIB_ASN1, ASN1_R_TYPE_NOT_PRIMITIVE}, +- #else +- {"TYPE_NOT_PRIMITIVE", 13, 195}, +- #endif +- #ifdef ASN1_R_UNEXPECTED_EOC +- {"UNEXPECTED_EOC", ERR_LIB_ASN1, ASN1_R_UNEXPECTED_EOC}, +- #else +- {"UNEXPECTED_EOC", 13, 159}, +- #endif +- #ifdef ASN1_R_UNIVERSALSTRING_IS_WRONG_LENGTH +- {"UNIVERSALSTRING_IS_WRONG_LENGTH", ERR_LIB_ASN1, ASN1_R_UNIVERSALSTRING_IS_WRONG_LENGTH}, +- #else +- {"UNIVERSALSTRING_IS_WRONG_LENGTH", 13, 215}, +- #endif +- #ifdef ASN1_R_UNKNOWN_DIGEST +- {"UNKNOWN_DIGEST", ERR_LIB_ASN1, ASN1_R_UNKNOWN_DIGEST}, +- #else +- {"UNKNOWN_DIGEST", 13, 229}, +- #endif +- #ifdef ASN1_R_UNKNOWN_FORMAT +- {"UNKNOWN_FORMAT", ERR_LIB_ASN1, ASN1_R_UNKNOWN_FORMAT}, +- #else +- {"UNKNOWN_FORMAT", 13, 160}, +- #endif +- #ifdef ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM +- {"UNKNOWN_MESSAGE_DIGEST_ALGORITHM", ERR_LIB_ASN1, ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM}, +- #else +- {"UNKNOWN_MESSAGE_DIGEST_ALGORITHM", 13, 161}, +- #endif +- #ifdef ASN1_R_UNKNOWN_OBJECT_TYPE +- {"UNKNOWN_OBJECT_TYPE", ERR_LIB_ASN1, ASN1_R_UNKNOWN_OBJECT_TYPE}, +- #else +- {"UNKNOWN_OBJECT_TYPE", 13, 162}, +- #endif +- #ifdef ASN1_R_UNKNOWN_PUBLIC_KEY_TYPE +- {"UNKNOWN_PUBLIC_KEY_TYPE", ERR_LIB_ASN1, ASN1_R_UNKNOWN_PUBLIC_KEY_TYPE}, +- #else +- {"UNKNOWN_PUBLIC_KEY_TYPE", 13, 163}, +- #endif +- #ifdef ASN1_R_UNKNOWN_SIGNATURE_ALGORITHM +- {"UNKNOWN_SIGNATURE_ALGORITHM", ERR_LIB_ASN1, ASN1_R_UNKNOWN_SIGNATURE_ALGORITHM}, +- #else +- {"UNKNOWN_SIGNATURE_ALGORITHM", 13, 199}, +- #endif +- #ifdef ASN1_R_UNKNOWN_TAG +- {"UNKNOWN_TAG", ERR_LIB_ASN1, ASN1_R_UNKNOWN_TAG}, +- #else +- {"UNKNOWN_TAG", 13, 194}, +- #endif +- #ifdef ASN1_R_UNSUPPORTED_ANY_DEFINED_BY_TYPE +- {"UNSUPPORTED_ANY_DEFINED_BY_TYPE", ERR_LIB_ASN1, ASN1_R_UNSUPPORTED_ANY_DEFINED_BY_TYPE}, +- #else +- {"UNSUPPORTED_ANY_DEFINED_BY_TYPE", 13, 164}, +- #endif +- #ifdef ASN1_R_UNSUPPORTED_CIPHER +- {"UNSUPPORTED_CIPHER", ERR_LIB_ASN1, ASN1_R_UNSUPPORTED_CIPHER}, +- #else +- {"UNSUPPORTED_CIPHER", 13, 228}, +- #endif +- #ifdef ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE +- {"UNSUPPORTED_PUBLIC_KEY_TYPE", ERR_LIB_ASN1, ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE}, +- #else +- {"UNSUPPORTED_PUBLIC_KEY_TYPE", 13, 167}, +- #endif +- #ifdef ASN1_R_UNSUPPORTED_TYPE +- {"UNSUPPORTED_TYPE", ERR_LIB_ASN1, ASN1_R_UNSUPPORTED_TYPE}, +- #else +- {"UNSUPPORTED_TYPE", 13, 196}, +- #endif +- #ifdef ASN1_R_WRONG_INTEGER_TYPE +- {"WRONG_INTEGER_TYPE", ERR_LIB_ASN1, ASN1_R_WRONG_INTEGER_TYPE}, +- #else +- {"WRONG_INTEGER_TYPE", 13, 225}, +- #endif +- #ifdef ASN1_R_WRONG_PUBLIC_KEY_TYPE +- {"WRONG_PUBLIC_KEY_TYPE", ERR_LIB_ASN1, ASN1_R_WRONG_PUBLIC_KEY_TYPE}, +- #else +- {"WRONG_PUBLIC_KEY_TYPE", 13, 200}, +- #endif +- #ifdef ASN1_R_WRONG_TAG +- {"WRONG_TAG", ERR_LIB_ASN1, ASN1_R_WRONG_TAG}, +- #else +- {"WRONG_TAG", 13, 168}, +- #endif +- #ifdef ASYNC_R_FAILED_TO_SET_POOL +- {"FAILED_TO_SET_POOL", ERR_LIB_ASYNC, ASYNC_R_FAILED_TO_SET_POOL}, +- #else +- {"FAILED_TO_SET_POOL", 51, 101}, +- #endif +- #ifdef ASYNC_R_FAILED_TO_SWAP_CONTEXT +- {"FAILED_TO_SWAP_CONTEXT", ERR_LIB_ASYNC, ASYNC_R_FAILED_TO_SWAP_CONTEXT}, +- #else +- {"FAILED_TO_SWAP_CONTEXT", 51, 102}, +- #endif +- #ifdef ASYNC_R_INIT_FAILED +- {"INIT_FAILED", ERR_LIB_ASYNC, ASYNC_R_INIT_FAILED}, +- #else +- {"INIT_FAILED", 51, 105}, +- #endif +- #ifdef ASYNC_R_INVALID_POOL_SIZE +- {"INVALID_POOL_SIZE", ERR_LIB_ASYNC, ASYNC_R_INVALID_POOL_SIZE}, +- #else +- {"INVALID_POOL_SIZE", 51, 103}, +- #endif +- #ifdef BIO_R_ACCEPT_ERROR +- {"ACCEPT_ERROR", ERR_LIB_BIO, BIO_R_ACCEPT_ERROR}, +- #else +- {"ACCEPT_ERROR", 32, 100}, +- #endif +- #ifdef BIO_R_ADDRINFO_ADDR_IS_NOT_AF_INET +- {"ADDRINFO_ADDR_IS_NOT_AF_INET", ERR_LIB_BIO, BIO_R_ADDRINFO_ADDR_IS_NOT_AF_INET}, +- #else +- {"ADDRINFO_ADDR_IS_NOT_AF_INET", 32, 141}, +- #endif +- #ifdef BIO_R_AMBIGUOUS_HOST_OR_SERVICE +- {"AMBIGUOUS_HOST_OR_SERVICE", ERR_LIB_BIO, BIO_R_AMBIGUOUS_HOST_OR_SERVICE}, +- #else +- {"AMBIGUOUS_HOST_OR_SERVICE", 32, 129}, +- #endif +- #ifdef BIO_R_BAD_FOPEN_MODE +- {"BAD_FOPEN_MODE", ERR_LIB_BIO, BIO_R_BAD_FOPEN_MODE}, +- #else +- {"BAD_FOPEN_MODE", 32, 101}, +- #endif +- #ifdef BIO_R_BROKEN_PIPE +- {"BROKEN_PIPE", ERR_LIB_BIO, BIO_R_BROKEN_PIPE}, +- #else +- {"BROKEN_PIPE", 32, 124}, +- #endif +- #ifdef BIO_R_CONNECT_ERROR +- {"CONNECT_ERROR", ERR_LIB_BIO, BIO_R_CONNECT_ERROR}, +- #else +- {"CONNECT_ERROR", 32, 103}, +- #endif +- #ifdef BIO_R_CONNECT_TIMEOUT +- {"CONNECT_TIMEOUT", ERR_LIB_BIO, BIO_R_CONNECT_TIMEOUT}, +- #else +- {"CONNECT_TIMEOUT", 32, 147}, +- #endif +- #ifdef BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET +- {"GETHOSTBYNAME_ADDR_IS_NOT_AF_INET", ERR_LIB_BIO, BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET}, +- #else +- {"GETHOSTBYNAME_ADDR_IS_NOT_AF_INET", 32, 107}, +- #endif +- #ifdef BIO_R_GETSOCKNAME_ERROR +- {"GETSOCKNAME_ERROR", ERR_LIB_BIO, BIO_R_GETSOCKNAME_ERROR}, +- #else +- {"GETSOCKNAME_ERROR", 32, 132}, +- #endif +- #ifdef BIO_R_GETSOCKNAME_TRUNCATED_ADDRESS +- {"GETSOCKNAME_TRUNCATED_ADDRESS", ERR_LIB_BIO, BIO_R_GETSOCKNAME_TRUNCATED_ADDRESS}, +- #else +- {"GETSOCKNAME_TRUNCATED_ADDRESS", 32, 133}, +- #endif +- #ifdef BIO_R_GETTING_SOCKTYPE +- {"GETTING_SOCKTYPE", ERR_LIB_BIO, BIO_R_GETTING_SOCKTYPE}, +- #else +- {"GETTING_SOCKTYPE", 32, 134}, +- #endif +- #ifdef BIO_R_INVALID_ARGUMENT +- {"INVALID_ARGUMENT", ERR_LIB_BIO, BIO_R_INVALID_ARGUMENT}, +- #else +- {"INVALID_ARGUMENT", 32, 125}, +- #endif +- #ifdef BIO_R_INVALID_SOCKET +- {"INVALID_SOCKET", ERR_LIB_BIO, BIO_R_INVALID_SOCKET}, +- #else +- {"INVALID_SOCKET", 32, 135}, +- #endif +- #ifdef BIO_R_IN_USE +- {"IN_USE", ERR_LIB_BIO, BIO_R_IN_USE}, +- #else +- {"IN_USE", 32, 123}, +- #endif +- #ifdef BIO_R_LENGTH_TOO_LONG +- {"LENGTH_TOO_LONG", ERR_LIB_BIO, BIO_R_LENGTH_TOO_LONG}, +- #else +- {"LENGTH_TOO_LONG", 32, 102}, +- #endif +- #ifdef BIO_R_LISTEN_V6_ONLY +- {"LISTEN_V6_ONLY", ERR_LIB_BIO, BIO_R_LISTEN_V6_ONLY}, +- #else +- {"LISTEN_V6_ONLY", 32, 136}, +- #endif +- #ifdef BIO_R_LOOKUP_RETURNED_NOTHING +- {"LOOKUP_RETURNED_NOTHING", ERR_LIB_BIO, BIO_R_LOOKUP_RETURNED_NOTHING}, +- #else +- {"LOOKUP_RETURNED_NOTHING", 32, 142}, +- #endif +- #ifdef BIO_R_MALFORMED_HOST_OR_SERVICE +- {"MALFORMED_HOST_OR_SERVICE", ERR_LIB_BIO, BIO_R_MALFORMED_HOST_OR_SERVICE}, +- #else +- {"MALFORMED_HOST_OR_SERVICE", 32, 130}, +- #endif +- #ifdef BIO_R_NBIO_CONNECT_ERROR +- {"NBIO_CONNECT_ERROR", ERR_LIB_BIO, BIO_R_NBIO_CONNECT_ERROR}, +- #else +- {"NBIO_CONNECT_ERROR", 32, 110}, +- #endif +- #ifdef BIO_R_NO_ACCEPT_ADDR_OR_SERVICE_SPECIFIED +- {"NO_ACCEPT_ADDR_OR_SERVICE_SPECIFIED", ERR_LIB_BIO, BIO_R_NO_ACCEPT_ADDR_OR_SERVICE_SPECIFIED}, +- #else +- {"NO_ACCEPT_ADDR_OR_SERVICE_SPECIFIED", 32, 143}, +- #endif +- #ifdef BIO_R_NO_HOSTNAME_OR_SERVICE_SPECIFIED +- {"NO_HOSTNAME_OR_SERVICE_SPECIFIED", ERR_LIB_BIO, BIO_R_NO_HOSTNAME_OR_SERVICE_SPECIFIED}, +- #else +- {"NO_HOSTNAME_OR_SERVICE_SPECIFIED", 32, 144}, +- #endif +- #ifdef BIO_R_NO_PORT_DEFINED +- {"NO_PORT_DEFINED", ERR_LIB_BIO, BIO_R_NO_PORT_DEFINED}, +- #else +- {"NO_PORT_DEFINED", 32, 113}, +- #endif +- #ifdef BIO_R_NO_SUCH_FILE +- {"NO_SUCH_FILE", ERR_LIB_BIO, BIO_R_NO_SUCH_FILE}, +- #else +- {"NO_SUCH_FILE", 32, 128}, +- #endif +- #ifdef BIO_R_TRANSFER_ERROR +- {"TRANSFER_ERROR", ERR_LIB_BIO, BIO_R_TRANSFER_ERROR}, +- #else +- {"TRANSFER_ERROR", 32, 104}, +- #endif +- #ifdef BIO_R_TRANSFER_TIMEOUT +- {"TRANSFER_TIMEOUT", ERR_LIB_BIO, BIO_R_TRANSFER_TIMEOUT}, +- #else +- {"TRANSFER_TIMEOUT", 32, 105}, +- #endif +- #ifdef BIO_R_UNABLE_TO_BIND_SOCKET +- {"UNABLE_TO_BIND_SOCKET", ERR_LIB_BIO, BIO_R_UNABLE_TO_BIND_SOCKET}, +- #else +- {"UNABLE_TO_BIND_SOCKET", 32, 117}, +- #endif +- #ifdef BIO_R_UNABLE_TO_CREATE_SOCKET +- {"UNABLE_TO_CREATE_SOCKET", ERR_LIB_BIO, BIO_R_UNABLE_TO_CREATE_SOCKET}, +- #else +- {"UNABLE_TO_CREATE_SOCKET", 32, 118}, +- #endif +- #ifdef BIO_R_UNABLE_TO_KEEPALIVE +- {"UNABLE_TO_KEEPALIVE", ERR_LIB_BIO, BIO_R_UNABLE_TO_KEEPALIVE}, +- #else +- {"UNABLE_TO_KEEPALIVE", 32, 137}, +- #endif +- #ifdef BIO_R_UNABLE_TO_LISTEN_SOCKET +- {"UNABLE_TO_LISTEN_SOCKET", ERR_LIB_BIO, BIO_R_UNABLE_TO_LISTEN_SOCKET}, +- #else +- {"UNABLE_TO_LISTEN_SOCKET", 32, 119}, +- #endif +- #ifdef BIO_R_UNABLE_TO_NODELAY +- {"UNABLE_TO_NODELAY", ERR_LIB_BIO, BIO_R_UNABLE_TO_NODELAY}, +- #else +- {"UNABLE_TO_NODELAY", 32, 138}, +- #endif +- #ifdef BIO_R_UNABLE_TO_REUSEADDR +- {"UNABLE_TO_REUSEADDR", ERR_LIB_BIO, BIO_R_UNABLE_TO_REUSEADDR}, +- #else +- {"UNABLE_TO_REUSEADDR", 32, 139}, +- #endif +- #ifdef BIO_R_UNAVAILABLE_IP_FAMILY +- {"UNAVAILABLE_IP_FAMILY", ERR_LIB_BIO, BIO_R_UNAVAILABLE_IP_FAMILY}, +- #else +- {"UNAVAILABLE_IP_FAMILY", 32, 145}, +- #endif +- #ifdef BIO_R_UNINITIALIZED +- {"UNINITIALIZED", ERR_LIB_BIO, BIO_R_UNINITIALIZED}, +- #else +- {"UNINITIALIZED", 32, 120}, +- #endif +- #ifdef BIO_R_UNKNOWN_INFO_TYPE +- {"UNKNOWN_INFO_TYPE", ERR_LIB_BIO, BIO_R_UNKNOWN_INFO_TYPE}, +- #else +- {"UNKNOWN_INFO_TYPE", 32, 140}, +- #endif +- #ifdef BIO_R_UNSUPPORTED_IP_FAMILY +- {"UNSUPPORTED_IP_FAMILY", ERR_LIB_BIO, BIO_R_UNSUPPORTED_IP_FAMILY}, +- #else +- {"UNSUPPORTED_IP_FAMILY", 32, 146}, +- #endif +- #ifdef BIO_R_UNSUPPORTED_METHOD +- {"UNSUPPORTED_METHOD", ERR_LIB_BIO, BIO_R_UNSUPPORTED_METHOD}, +- #else +- {"UNSUPPORTED_METHOD", 32, 121}, +- #endif +- #ifdef BIO_R_UNSUPPORTED_PROTOCOL_FAMILY +- {"UNSUPPORTED_PROTOCOL_FAMILY", ERR_LIB_BIO, BIO_R_UNSUPPORTED_PROTOCOL_FAMILY}, +- #else +- {"UNSUPPORTED_PROTOCOL_FAMILY", 32, 131}, +- #endif +- #ifdef BIO_R_WRITE_TO_READ_ONLY_BIO +- {"WRITE_TO_READ_ONLY_BIO", ERR_LIB_BIO, BIO_R_WRITE_TO_READ_ONLY_BIO}, +- #else +- {"WRITE_TO_READ_ONLY_BIO", 32, 126}, +- #endif +- #ifdef BIO_R_WSASTARTUP +- {"WSASTARTUP", ERR_LIB_BIO, BIO_R_WSASTARTUP}, +- #else +- {"WSASTARTUP", 32, 122}, +- #endif +- #ifdef BN_R_ARG2_LT_ARG3 +- {"ARG2_LT_ARG3", ERR_LIB_BN, BN_R_ARG2_LT_ARG3}, +- #else +- {"ARG2_LT_ARG3", 3, 100}, +- #endif +- #ifdef BN_R_BAD_RECIPROCAL +- {"BAD_RECIPROCAL", ERR_LIB_BN, BN_R_BAD_RECIPROCAL}, +- #else +- {"BAD_RECIPROCAL", 3, 101}, +- #endif +- #ifdef BN_R_BIGNUM_TOO_LONG +- {"BIGNUM_TOO_LONG", ERR_LIB_BN, BN_R_BIGNUM_TOO_LONG}, +- #else +- {"BIGNUM_TOO_LONG", 3, 114}, +- #endif +- #ifdef BN_R_BITS_TOO_SMALL +- {"BITS_TOO_SMALL", ERR_LIB_BN, BN_R_BITS_TOO_SMALL}, +- #else +- {"BITS_TOO_SMALL", 3, 118}, +- #endif +- #ifdef BN_R_CALLED_WITH_EVEN_MODULUS +- {"CALLED_WITH_EVEN_MODULUS", ERR_LIB_BN, BN_R_CALLED_WITH_EVEN_MODULUS}, +- #else +- {"CALLED_WITH_EVEN_MODULUS", 3, 102}, +- #endif +- #ifdef BN_R_DIV_BY_ZERO +- {"DIV_BY_ZERO", ERR_LIB_BN, BN_R_DIV_BY_ZERO}, +- #else +- {"DIV_BY_ZERO", 3, 103}, +- #endif +- #ifdef BN_R_ENCODING_ERROR +- {"ENCODING_ERROR", ERR_LIB_BN, BN_R_ENCODING_ERROR}, +- #else +- {"ENCODING_ERROR", 3, 104}, +- #endif +- #ifdef BN_R_EXPAND_ON_STATIC_BIGNUM_DATA +- {"EXPAND_ON_STATIC_BIGNUM_DATA", ERR_LIB_BN, BN_R_EXPAND_ON_STATIC_BIGNUM_DATA}, +- #else +- {"EXPAND_ON_STATIC_BIGNUM_DATA", 3, 105}, +- #endif +- #ifdef BN_R_INPUT_NOT_REDUCED +- {"INPUT_NOT_REDUCED", ERR_LIB_BN, BN_R_INPUT_NOT_REDUCED}, +- #else +- {"INPUT_NOT_REDUCED", 3, 110}, +- #endif +- #ifdef BN_R_INVALID_LENGTH +- {"INVALID_LENGTH", ERR_LIB_BN, BN_R_INVALID_LENGTH}, +- #else +- {"INVALID_LENGTH", 3, 106}, +- #endif +- #ifdef BN_R_INVALID_RANGE +- {"INVALID_RANGE", ERR_LIB_BN, BN_R_INVALID_RANGE}, +- #else +- {"INVALID_RANGE", 3, 115}, +- #endif +- #ifdef BN_R_INVALID_SHIFT +- {"INVALID_SHIFT", ERR_LIB_BN, BN_R_INVALID_SHIFT}, +- #else +- {"INVALID_SHIFT", 3, 119}, +- #endif +- #ifdef BN_R_NOT_A_SQUARE +- {"NOT_A_SQUARE", ERR_LIB_BN, BN_R_NOT_A_SQUARE}, +- #else +- {"NOT_A_SQUARE", 3, 111}, +- #endif +- #ifdef BN_R_NOT_INITIALIZED +- {"NOT_INITIALIZED", ERR_LIB_BN, BN_R_NOT_INITIALIZED}, +- #else +- {"NOT_INITIALIZED", 3, 107}, +- #endif +- #ifdef BN_R_NO_INVERSE +- {"NO_INVERSE", ERR_LIB_BN, BN_R_NO_INVERSE}, +- #else +- {"NO_INVERSE", 3, 108}, +- #endif +- #ifdef BN_R_NO_PRIME_CANDIDATE +- {"NO_PRIME_CANDIDATE", ERR_LIB_BN, BN_R_NO_PRIME_CANDIDATE}, +- #else +- {"NO_PRIME_CANDIDATE", 3, 121}, +- #endif +- #ifdef BN_R_NO_SOLUTION +- {"NO_SOLUTION", ERR_LIB_BN, BN_R_NO_SOLUTION}, +- #else +- {"NO_SOLUTION", 3, 116}, +- #endif +- #ifdef BN_R_NO_SUITABLE_DIGEST +- {"NO_SUITABLE_DIGEST", ERR_LIB_BN, BN_R_NO_SUITABLE_DIGEST}, +- #else +- {"NO_SUITABLE_DIGEST", 3, 120}, +- #endif +- #ifdef BN_R_PRIVATE_KEY_TOO_LARGE +- {"PRIVATE_KEY_TOO_LARGE", ERR_LIB_BN, BN_R_PRIVATE_KEY_TOO_LARGE}, +- #else +- {"PRIVATE_KEY_TOO_LARGE", 3, 117}, +- #endif +- #ifdef BN_R_P_IS_NOT_PRIME +- {"P_IS_NOT_PRIME", ERR_LIB_BN, BN_R_P_IS_NOT_PRIME}, +- #else +- {"P_IS_NOT_PRIME", 3, 112}, +- #endif +- #ifdef BN_R_TOO_MANY_ITERATIONS +- {"TOO_MANY_ITERATIONS", ERR_LIB_BN, BN_R_TOO_MANY_ITERATIONS}, +- #else +- {"TOO_MANY_ITERATIONS", 3, 113}, +- #endif +- #ifdef BN_R_TOO_MANY_TEMPORARY_VARIABLES +- {"TOO_MANY_TEMPORARY_VARIABLES", ERR_LIB_BN, BN_R_TOO_MANY_TEMPORARY_VARIABLES}, +- #else +- {"TOO_MANY_TEMPORARY_VARIABLES", 3, 109}, +- #endif +- #ifdef CMP_R_ALGORITHM_NOT_SUPPORTED +- {"ALGORITHM_NOT_SUPPORTED", ERR_LIB_CMP, CMP_R_ALGORITHM_NOT_SUPPORTED}, +- #else +- {"ALGORITHM_NOT_SUPPORTED", 58, 139}, +- #endif +- #ifdef CMP_R_BAD_CHECKAFTER_IN_POLLREP +- {"BAD_CHECKAFTER_IN_POLLREP", ERR_LIB_CMP, CMP_R_BAD_CHECKAFTER_IN_POLLREP}, +- #else +- {"BAD_CHECKAFTER_IN_POLLREP", 58, 167}, +- #endif +- #ifdef CMP_R_BAD_REQUEST_ID +- {"BAD_REQUEST_ID", ERR_LIB_CMP, CMP_R_BAD_REQUEST_ID}, +- #else +- {"BAD_REQUEST_ID", 58, 108}, +- #endif +- #ifdef CMP_R_CERTHASH_UNMATCHED +- {"CERTHASH_UNMATCHED", ERR_LIB_CMP, CMP_R_CERTHASH_UNMATCHED}, +- #else +- {"CERTHASH_UNMATCHED", 58, 156}, +- #endif +- #ifdef CMP_R_CERTID_NOT_FOUND +- {"CERTID_NOT_FOUND", ERR_LIB_CMP, CMP_R_CERTID_NOT_FOUND}, +- #else +- {"CERTID_NOT_FOUND", 58, 109}, +- #endif +- #ifdef CMP_R_CERTIFICATE_NOT_ACCEPTED +- {"CERTIFICATE_NOT_ACCEPTED", ERR_LIB_CMP, CMP_R_CERTIFICATE_NOT_ACCEPTED}, +- #else +- {"CERTIFICATE_NOT_ACCEPTED", 58, 169}, +- #endif +- #ifdef CMP_R_CERTIFICATE_NOT_FOUND +- {"CERTIFICATE_NOT_FOUND", ERR_LIB_CMP, CMP_R_CERTIFICATE_NOT_FOUND}, +- #else +- {"CERTIFICATE_NOT_FOUND", 58, 112}, +- #endif +- #ifdef CMP_R_CERTREQMSG_NOT_FOUND +- {"CERTREQMSG_NOT_FOUND", ERR_LIB_CMP, CMP_R_CERTREQMSG_NOT_FOUND}, +- #else +- {"CERTREQMSG_NOT_FOUND", 58, 157}, +- #endif +- #ifdef CMP_R_CERTRESPONSE_NOT_FOUND +- {"CERTRESPONSE_NOT_FOUND", ERR_LIB_CMP, CMP_R_CERTRESPONSE_NOT_FOUND}, +- #else +- {"CERTRESPONSE_NOT_FOUND", 58, 113}, +- #endif +- #ifdef CMP_R_CERT_AND_KEY_DO_NOT_MATCH +- {"CERT_AND_KEY_DO_NOT_MATCH", ERR_LIB_CMP, CMP_R_CERT_AND_KEY_DO_NOT_MATCH}, +- #else +- {"CERT_AND_KEY_DO_NOT_MATCH", 58, 114}, +- #endif +- #ifdef CMP_R_CHECKAFTER_OUT_OF_RANGE +- {"CHECKAFTER_OUT_OF_RANGE", ERR_LIB_CMP, CMP_R_CHECKAFTER_OUT_OF_RANGE}, +- #else +- {"CHECKAFTER_OUT_OF_RANGE", 58, 181}, +- #endif +- #ifdef CMP_R_ENCOUNTERED_KEYUPDATEWARNING +- {"ENCOUNTERED_KEYUPDATEWARNING", ERR_LIB_CMP, CMP_R_ENCOUNTERED_KEYUPDATEWARNING}, +- #else +- {"ENCOUNTERED_KEYUPDATEWARNING", 58, 176}, +- #endif +- #ifdef CMP_R_ENCOUNTERED_WAITING +- {"ENCOUNTERED_WAITING", ERR_LIB_CMP, CMP_R_ENCOUNTERED_WAITING}, +- #else +- {"ENCOUNTERED_WAITING", 58, 162}, +- #endif +- #ifdef CMP_R_ERROR_CALCULATING_PROTECTION +- {"ERROR_CALCULATING_PROTECTION", ERR_LIB_CMP, CMP_R_ERROR_CALCULATING_PROTECTION}, +- #else +- {"ERROR_CALCULATING_PROTECTION", 58, 115}, +- #endif +- #ifdef CMP_R_ERROR_CREATING_CERTCONF +- {"ERROR_CREATING_CERTCONF", ERR_LIB_CMP, CMP_R_ERROR_CREATING_CERTCONF}, +- #else +- {"ERROR_CREATING_CERTCONF", 58, 116}, +- #endif +- #ifdef CMP_R_ERROR_CREATING_CERTREP +- {"ERROR_CREATING_CERTREP", ERR_LIB_CMP, CMP_R_ERROR_CREATING_CERTREP}, +- #else +- {"ERROR_CREATING_CERTREP", 58, 117}, +- #endif +- #ifdef CMP_R_ERROR_CREATING_CERTREQ +- {"ERROR_CREATING_CERTREQ", ERR_LIB_CMP, CMP_R_ERROR_CREATING_CERTREQ}, +- #else +- {"ERROR_CREATING_CERTREQ", 58, 163}, +- #endif +- #ifdef CMP_R_ERROR_CREATING_ERROR +- {"ERROR_CREATING_ERROR", ERR_LIB_CMP, CMP_R_ERROR_CREATING_ERROR}, +- #else +- {"ERROR_CREATING_ERROR", 58, 118}, +- #endif +- #ifdef CMP_R_ERROR_CREATING_GENM +- {"ERROR_CREATING_GENM", ERR_LIB_CMP, CMP_R_ERROR_CREATING_GENM}, +- #else +- {"ERROR_CREATING_GENM", 58, 119}, +- #endif +- #ifdef CMP_R_ERROR_CREATING_GENP +- {"ERROR_CREATING_GENP", ERR_LIB_CMP, CMP_R_ERROR_CREATING_GENP}, +- #else +- {"ERROR_CREATING_GENP", 58, 120}, +- #endif +- #ifdef CMP_R_ERROR_CREATING_PKICONF +- {"ERROR_CREATING_PKICONF", ERR_LIB_CMP, CMP_R_ERROR_CREATING_PKICONF}, +- #else +- {"ERROR_CREATING_PKICONF", 58, 122}, +- #endif +- #ifdef CMP_R_ERROR_CREATING_POLLREP +- {"ERROR_CREATING_POLLREP", ERR_LIB_CMP, CMP_R_ERROR_CREATING_POLLREP}, +- #else +- {"ERROR_CREATING_POLLREP", 58, 123}, +- #endif +- #ifdef CMP_R_ERROR_CREATING_POLLREQ +- {"ERROR_CREATING_POLLREQ", ERR_LIB_CMP, CMP_R_ERROR_CREATING_POLLREQ}, +- #else +- {"ERROR_CREATING_POLLREQ", 58, 124}, +- #endif +- #ifdef CMP_R_ERROR_CREATING_RP +- {"ERROR_CREATING_RP", ERR_LIB_CMP, CMP_R_ERROR_CREATING_RP}, +- #else +- {"ERROR_CREATING_RP", 58, 125}, +- #endif +- #ifdef CMP_R_ERROR_CREATING_RR +- {"ERROR_CREATING_RR", ERR_LIB_CMP, CMP_R_ERROR_CREATING_RR}, +- #else +- {"ERROR_CREATING_RR", 58, 126}, +- #endif +- #ifdef CMP_R_ERROR_PARSING_PKISTATUS +- {"ERROR_PARSING_PKISTATUS", ERR_LIB_CMP, CMP_R_ERROR_PARSING_PKISTATUS}, +- #else +- {"ERROR_PARSING_PKISTATUS", 58, 107}, +- #endif +- #ifdef CMP_R_ERROR_PROCESSING_MESSAGE +- {"ERROR_PROCESSING_MESSAGE", ERR_LIB_CMP, CMP_R_ERROR_PROCESSING_MESSAGE}, +- #else +- {"ERROR_PROCESSING_MESSAGE", 58, 158}, +- #endif +- #ifdef CMP_R_ERROR_PROTECTING_MESSAGE +- {"ERROR_PROTECTING_MESSAGE", ERR_LIB_CMP, CMP_R_ERROR_PROTECTING_MESSAGE}, +- #else +- {"ERROR_PROTECTING_MESSAGE", 58, 127}, +- #endif +- #ifdef CMP_R_ERROR_SETTING_CERTHASH +- {"ERROR_SETTING_CERTHASH", ERR_LIB_CMP, CMP_R_ERROR_SETTING_CERTHASH}, +- #else +- {"ERROR_SETTING_CERTHASH", 58, 128}, +- #endif +- #ifdef CMP_R_ERROR_UNEXPECTED_CERTCONF +- {"ERROR_UNEXPECTED_CERTCONF", ERR_LIB_CMP, CMP_R_ERROR_UNEXPECTED_CERTCONF}, +- #else +- {"ERROR_UNEXPECTED_CERTCONF", 58, 160}, +- #endif +- #ifdef CMP_R_ERROR_VALIDATING_PROTECTION +- {"ERROR_VALIDATING_PROTECTION", ERR_LIB_CMP, CMP_R_ERROR_VALIDATING_PROTECTION}, +- #else +- {"ERROR_VALIDATING_PROTECTION", 58, 140}, +- #endif +- #ifdef CMP_R_ERROR_VALIDATING_SIGNATURE +- {"ERROR_VALIDATING_SIGNATURE", ERR_LIB_CMP, CMP_R_ERROR_VALIDATING_SIGNATURE}, +- #else +- {"ERROR_VALIDATING_SIGNATURE", 58, 171}, +- #endif +- #ifdef CMP_R_FAILED_BUILDING_OWN_CHAIN +- {"FAILED_BUILDING_OWN_CHAIN", ERR_LIB_CMP, CMP_R_FAILED_BUILDING_OWN_CHAIN}, +- #else +- {"FAILED_BUILDING_OWN_CHAIN", 58, 164}, +- #endif +- #ifdef CMP_R_FAILED_EXTRACTING_PUBKEY +- {"FAILED_EXTRACTING_PUBKEY", ERR_LIB_CMP, CMP_R_FAILED_EXTRACTING_PUBKEY}, +- #else +- {"FAILED_EXTRACTING_PUBKEY", 58, 141}, +- #endif +- #ifdef CMP_R_FAILURE_OBTAINING_RANDOM +- {"FAILURE_OBTAINING_RANDOM", ERR_LIB_CMP, CMP_R_FAILURE_OBTAINING_RANDOM}, +- #else +- {"FAILURE_OBTAINING_RANDOM", 58, 110}, +- #endif +- #ifdef CMP_R_FAIL_INFO_OUT_OF_RANGE +- {"FAIL_INFO_OUT_OF_RANGE", ERR_LIB_CMP, CMP_R_FAIL_INFO_OUT_OF_RANGE}, +- #else +- {"FAIL_INFO_OUT_OF_RANGE", 58, 129}, +- #endif +- #ifdef CMP_R_INVALID_ARGS +- {"INVALID_ARGS", ERR_LIB_CMP, CMP_R_INVALID_ARGS}, +- #else +- {"INVALID_ARGS", 58, 100}, +- #endif +- #ifdef CMP_R_INVALID_OPTION +- {"INVALID_OPTION", ERR_LIB_CMP, CMP_R_INVALID_OPTION}, +- #else +- {"INVALID_OPTION", 58, 174}, +- #endif +- #ifdef CMP_R_MISSING_CERTID +- {"MISSING_CERTID", ERR_LIB_CMP, CMP_R_MISSING_CERTID}, +- #else +- {"MISSING_CERTID", 58, 165}, +- #endif +- #ifdef CMP_R_MISSING_KEY_INPUT_FOR_CREATING_PROTECTION +- {"MISSING_KEY_INPUT_FOR_CREATING_PROTECTION", ERR_LIB_CMP, CMP_R_MISSING_KEY_INPUT_FOR_CREATING_PROTECTION}, +- #else +- {"MISSING_KEY_INPUT_FOR_CREATING_PROTECTION", 58, 130}, +- #endif +- #ifdef CMP_R_MISSING_KEY_USAGE_DIGITALSIGNATURE +- {"MISSING_KEY_USAGE_DIGITALSIGNATURE", ERR_LIB_CMP, CMP_R_MISSING_KEY_USAGE_DIGITALSIGNATURE}, +- #else +- {"MISSING_KEY_USAGE_DIGITALSIGNATURE", 58, 142}, +- #endif +- #ifdef CMP_R_MISSING_P10CSR +- {"MISSING_P10CSR", ERR_LIB_CMP, CMP_R_MISSING_P10CSR}, +- #else +- {"MISSING_P10CSR", 58, 121}, +- #endif +- #ifdef CMP_R_MISSING_PBM_SECRET +- {"MISSING_PBM_SECRET", ERR_LIB_CMP, CMP_R_MISSING_PBM_SECRET}, +- #else +- {"MISSING_PBM_SECRET", 58, 166}, +- #endif +- #ifdef CMP_R_MISSING_PRIVATE_KEY +- {"MISSING_PRIVATE_KEY", ERR_LIB_CMP, CMP_R_MISSING_PRIVATE_KEY}, +- #else +- {"MISSING_PRIVATE_KEY", 58, 131}, +- #endif +- #ifdef CMP_R_MISSING_PRIVATE_KEY_FOR_POPO +- {"MISSING_PRIVATE_KEY_FOR_POPO", ERR_LIB_CMP, CMP_R_MISSING_PRIVATE_KEY_FOR_POPO}, +- #else +- {"MISSING_PRIVATE_KEY_FOR_POPO", 58, 190}, +- #endif +- #ifdef CMP_R_MISSING_PROTECTION +- {"MISSING_PROTECTION", ERR_LIB_CMP, CMP_R_MISSING_PROTECTION}, +- #else +- {"MISSING_PROTECTION", 58, 143}, +- #endif +- #ifdef CMP_R_MISSING_PUBLIC_KEY +- {"MISSING_PUBLIC_KEY", ERR_LIB_CMP, CMP_R_MISSING_PUBLIC_KEY}, +- #else +- {"MISSING_PUBLIC_KEY", 58, 183}, +- #endif +- #ifdef CMP_R_MISSING_REFERENCE_CERT +- {"MISSING_REFERENCE_CERT", ERR_LIB_CMP, CMP_R_MISSING_REFERENCE_CERT}, +- #else +- {"MISSING_REFERENCE_CERT", 58, 168}, +- #endif +- #ifdef CMP_R_MISSING_SECRET +- {"MISSING_SECRET", ERR_LIB_CMP, CMP_R_MISSING_SECRET}, +- #else +- {"MISSING_SECRET", 58, 178}, +- #endif +- #ifdef CMP_R_MISSING_SENDER_IDENTIFICATION +- {"MISSING_SENDER_IDENTIFICATION", ERR_LIB_CMP, CMP_R_MISSING_SENDER_IDENTIFICATION}, +- #else +- {"MISSING_SENDER_IDENTIFICATION", 58, 111}, +- #endif +- #ifdef CMP_R_MISSING_TRUST_ANCHOR +- {"MISSING_TRUST_ANCHOR", ERR_LIB_CMP, CMP_R_MISSING_TRUST_ANCHOR}, +- #else +- {"MISSING_TRUST_ANCHOR", 58, 179}, +- #endif +- #ifdef CMP_R_MISSING_TRUST_STORE +- {"MISSING_TRUST_STORE", ERR_LIB_CMP, CMP_R_MISSING_TRUST_STORE}, +- #else +- {"MISSING_TRUST_STORE", 58, 144}, +- #endif +- #ifdef CMP_R_MULTIPLE_REQUESTS_NOT_SUPPORTED +- {"MULTIPLE_REQUESTS_NOT_SUPPORTED", ERR_LIB_CMP, CMP_R_MULTIPLE_REQUESTS_NOT_SUPPORTED}, +- #else +- {"MULTIPLE_REQUESTS_NOT_SUPPORTED", 58, 161}, +- #endif +- #ifdef CMP_R_MULTIPLE_RESPONSES_NOT_SUPPORTED +- {"MULTIPLE_RESPONSES_NOT_SUPPORTED", ERR_LIB_CMP, CMP_R_MULTIPLE_RESPONSES_NOT_SUPPORTED}, +- #else +- {"MULTIPLE_RESPONSES_NOT_SUPPORTED", 58, 170}, +- #endif +- #ifdef CMP_R_MULTIPLE_SAN_SOURCES +- {"MULTIPLE_SAN_SOURCES", ERR_LIB_CMP, CMP_R_MULTIPLE_SAN_SOURCES}, +- #else +- {"MULTIPLE_SAN_SOURCES", 58, 102}, +- #endif +- #ifdef CMP_R_NO_STDIO +- {"NO_STDIO", ERR_LIB_CMP, CMP_R_NO_STDIO}, +- #else +- {"NO_STDIO", 58, 194}, +- #endif +- #ifdef CMP_R_NO_SUITABLE_SENDER_CERT +- {"NO_SUITABLE_SENDER_CERT", ERR_LIB_CMP, CMP_R_NO_SUITABLE_SENDER_CERT}, +- #else +- {"NO_SUITABLE_SENDER_CERT", 58, 145}, +- #endif +- #ifdef CMP_R_NULL_ARGUMENT +- {"NULL_ARGUMENT", ERR_LIB_CMP, CMP_R_NULL_ARGUMENT}, +- #else +- {"NULL_ARGUMENT", 58, 103}, +- #endif +- #ifdef CMP_R_PKIBODY_ERROR +- {"PKIBODY_ERROR", ERR_LIB_CMP, CMP_R_PKIBODY_ERROR}, +- #else +- {"PKIBODY_ERROR", 58, 146}, +- #endif +- #ifdef CMP_R_PKISTATUSINFO_NOT_FOUND +- {"PKISTATUSINFO_NOT_FOUND", ERR_LIB_CMP, CMP_R_PKISTATUSINFO_NOT_FOUND}, +- #else +- {"PKISTATUSINFO_NOT_FOUND", 58, 132}, +- #endif +- #ifdef CMP_R_POLLING_FAILED +- {"POLLING_FAILED", ERR_LIB_CMP, CMP_R_POLLING_FAILED}, +- #else +- {"POLLING_FAILED", 58, 172}, +- #endif +- #ifdef CMP_R_POTENTIALLY_INVALID_CERTIFICATE +- {"POTENTIALLY_INVALID_CERTIFICATE", ERR_LIB_CMP, CMP_R_POTENTIALLY_INVALID_CERTIFICATE}, +- #else +- {"POTENTIALLY_INVALID_CERTIFICATE", 58, 147}, +- #endif +- #ifdef CMP_R_RECEIVED_ERROR +- {"RECEIVED_ERROR", ERR_LIB_CMP, CMP_R_RECEIVED_ERROR}, +- #else +- {"RECEIVED_ERROR", 58, 180}, +- #endif +- #ifdef CMP_R_RECIPNONCE_UNMATCHED +- {"RECIPNONCE_UNMATCHED", ERR_LIB_CMP, CMP_R_RECIPNONCE_UNMATCHED}, +- #else +- {"RECIPNONCE_UNMATCHED", 58, 148}, +- #endif +- #ifdef CMP_R_REQUEST_NOT_ACCEPTED +- {"REQUEST_NOT_ACCEPTED", ERR_LIB_CMP, CMP_R_REQUEST_NOT_ACCEPTED}, +- #else +- {"REQUEST_NOT_ACCEPTED", 58, 149}, +- #endif +- #ifdef CMP_R_REQUEST_REJECTED_BY_SERVER +- {"REQUEST_REJECTED_BY_SERVER", ERR_LIB_CMP, CMP_R_REQUEST_REJECTED_BY_SERVER}, +- #else +- {"REQUEST_REJECTED_BY_SERVER", 58, 182}, +- #endif +- #ifdef CMP_R_SENDER_GENERALNAME_TYPE_NOT_SUPPORTED +- {"SENDER_GENERALNAME_TYPE_NOT_SUPPORTED", ERR_LIB_CMP, CMP_R_SENDER_GENERALNAME_TYPE_NOT_SUPPORTED}, +- #else +- {"SENDER_GENERALNAME_TYPE_NOT_SUPPORTED", 58, 150}, +- #endif +- #ifdef CMP_R_SRVCERT_DOES_NOT_VALIDATE_MSG +- {"SRVCERT_DOES_NOT_VALIDATE_MSG", ERR_LIB_CMP, CMP_R_SRVCERT_DOES_NOT_VALIDATE_MSG}, +- #else +- {"SRVCERT_DOES_NOT_VALIDATE_MSG", 58, 151}, +- #endif +- #ifdef CMP_R_TOTAL_TIMEOUT +- {"TOTAL_TIMEOUT", ERR_LIB_CMP, CMP_R_TOTAL_TIMEOUT}, +- #else +- {"TOTAL_TIMEOUT", 58, 184}, +- #endif +- #ifdef CMP_R_TRANSACTIONID_UNMATCHED +- {"TRANSACTIONID_UNMATCHED", ERR_LIB_CMP, CMP_R_TRANSACTIONID_UNMATCHED}, +- #else +- {"TRANSACTIONID_UNMATCHED", 58, 152}, +- #endif +- #ifdef CMP_R_TRANSFER_ERROR +- {"TRANSFER_ERROR", ERR_LIB_CMP, CMP_R_TRANSFER_ERROR}, +- #else +- {"TRANSFER_ERROR", 58, 159}, +- #endif +- #ifdef CMP_R_UNEXPECTED_PKIBODY +- {"UNEXPECTED_PKIBODY", ERR_LIB_CMP, CMP_R_UNEXPECTED_PKIBODY}, +- #else +- {"UNEXPECTED_PKIBODY", 58, 133}, +- #endif +- #ifdef CMP_R_UNEXPECTED_PKISTATUS +- {"UNEXPECTED_PKISTATUS", ERR_LIB_CMP, CMP_R_UNEXPECTED_PKISTATUS}, +- #else +- {"UNEXPECTED_PKISTATUS", 58, 185}, +- #endif +- #ifdef CMP_R_UNEXPECTED_PVNO +- {"UNEXPECTED_PVNO", ERR_LIB_CMP, CMP_R_UNEXPECTED_PVNO}, +- #else +- {"UNEXPECTED_PVNO", 58, 153}, +- #endif +- #ifdef CMP_R_UNKNOWN_ALGORITHM_ID +- {"UNKNOWN_ALGORITHM_ID", ERR_LIB_CMP, CMP_R_UNKNOWN_ALGORITHM_ID}, +- #else +- {"UNKNOWN_ALGORITHM_ID", 58, 134}, +- #endif +- #ifdef CMP_R_UNKNOWN_CERT_TYPE +- {"UNKNOWN_CERT_TYPE", ERR_LIB_CMP, CMP_R_UNKNOWN_CERT_TYPE}, +- #else +- {"UNKNOWN_CERT_TYPE", 58, 135}, +- #endif +- #ifdef CMP_R_UNKNOWN_PKISTATUS +- {"UNKNOWN_PKISTATUS", ERR_LIB_CMP, CMP_R_UNKNOWN_PKISTATUS}, +- #else +- {"UNKNOWN_PKISTATUS", 58, 186}, +- #endif +- #ifdef CMP_R_UNSUPPORTED_ALGORITHM +- {"UNSUPPORTED_ALGORITHM", ERR_LIB_CMP, CMP_R_UNSUPPORTED_ALGORITHM}, +- #else +- {"UNSUPPORTED_ALGORITHM", 58, 136}, +- #endif +- #ifdef CMP_R_UNSUPPORTED_KEY_TYPE +- {"UNSUPPORTED_KEY_TYPE", ERR_LIB_CMP, CMP_R_UNSUPPORTED_KEY_TYPE}, +- #else +- {"UNSUPPORTED_KEY_TYPE", 58, 137}, +- #endif +- #ifdef CMP_R_UNSUPPORTED_PROTECTION_ALG_DHBASEDMAC +- {"UNSUPPORTED_PROTECTION_ALG_DHBASEDMAC", ERR_LIB_CMP, CMP_R_UNSUPPORTED_PROTECTION_ALG_DHBASEDMAC}, +- #else +- {"UNSUPPORTED_PROTECTION_ALG_DHBASEDMAC", 58, 154}, +- #endif +- #ifdef CMP_R_VALUE_TOO_LARGE +- {"VALUE_TOO_LARGE", ERR_LIB_CMP, CMP_R_VALUE_TOO_LARGE}, +- #else +- {"VALUE_TOO_LARGE", 58, 175}, +- #endif +- #ifdef CMP_R_VALUE_TOO_SMALL +- {"VALUE_TOO_SMALL", ERR_LIB_CMP, CMP_R_VALUE_TOO_SMALL}, +- #else +- {"VALUE_TOO_SMALL", 58, 177}, +- #endif +- #ifdef CMP_R_WRONG_ALGORITHM_OID +- {"WRONG_ALGORITHM_OID", ERR_LIB_CMP, CMP_R_WRONG_ALGORITHM_OID}, +- #else +- {"WRONG_ALGORITHM_OID", 58, 138}, +- #endif +- #ifdef CMP_R_WRONG_CERTID +- {"WRONG_CERTID", ERR_LIB_CMP, CMP_R_WRONG_CERTID}, +- #else +- {"WRONG_CERTID", 58, 189}, +- #endif +- #ifdef CMP_R_WRONG_CERTID_IN_RP +- {"WRONG_CERTID_IN_RP", ERR_LIB_CMP, CMP_R_WRONG_CERTID_IN_RP}, +- #else +- {"WRONG_CERTID_IN_RP", 58, 187}, +- #endif +- #ifdef CMP_R_WRONG_PBM_VALUE +- {"WRONG_PBM_VALUE", ERR_LIB_CMP, CMP_R_WRONG_PBM_VALUE}, +- #else +- {"WRONG_PBM_VALUE", 58, 155}, +- #endif +- #ifdef CMP_R_WRONG_RP_COMPONENT_COUNT +- {"WRONG_RP_COMPONENT_COUNT", ERR_LIB_CMP, CMP_R_WRONG_RP_COMPONENT_COUNT}, +- #else +- {"WRONG_RP_COMPONENT_COUNT", 58, 188}, +- #endif +- #ifdef CMP_R_WRONG_SERIAL_IN_RP +- {"WRONG_SERIAL_IN_RP", ERR_LIB_CMP, CMP_R_WRONG_SERIAL_IN_RP}, +- #else +- {"WRONG_SERIAL_IN_RP", 58, 173}, +- #endif +- #ifdef CMS_R_ADD_SIGNER_ERROR +- {"ADD_SIGNER_ERROR", ERR_LIB_CMS, CMS_R_ADD_SIGNER_ERROR}, +- #else +- {"ADD_SIGNER_ERROR", 46, 99}, +- #endif +- #ifdef CMS_R_ATTRIBUTE_ERROR +- {"ATTRIBUTE_ERROR", ERR_LIB_CMS, CMS_R_ATTRIBUTE_ERROR}, +- #else +- {"ATTRIBUTE_ERROR", 46, 161}, +- #endif +- #ifdef CMS_R_CERTIFICATE_ALREADY_PRESENT +- {"CERTIFICATE_ALREADY_PRESENT", ERR_LIB_CMS, CMS_R_CERTIFICATE_ALREADY_PRESENT}, +- #else +- {"CERTIFICATE_ALREADY_PRESENT", 46, 175}, +- #endif +- #ifdef CMS_R_CERTIFICATE_HAS_NO_KEYID +- {"CERTIFICATE_HAS_NO_KEYID", ERR_LIB_CMS, CMS_R_CERTIFICATE_HAS_NO_KEYID}, +- #else +- {"CERTIFICATE_HAS_NO_KEYID", 46, 160}, +- #endif +- #ifdef CMS_R_CERTIFICATE_VERIFY_ERROR +- {"CERTIFICATE_VERIFY_ERROR", ERR_LIB_CMS, CMS_R_CERTIFICATE_VERIFY_ERROR}, +- #else +- {"CERTIFICATE_VERIFY_ERROR", 46, 100}, +- #endif +- #ifdef CMS_R_CIPHER_AEAD_SET_TAG_ERROR +- {"CIPHER_AEAD_SET_TAG_ERROR", ERR_LIB_CMS, CMS_R_CIPHER_AEAD_SET_TAG_ERROR}, +- #else +- {"CIPHER_AEAD_SET_TAG_ERROR", 46, 184}, +- #endif +- #ifdef CMS_R_CIPHER_GET_TAG +- {"CIPHER_GET_TAG", ERR_LIB_CMS, CMS_R_CIPHER_GET_TAG}, +- #else +- {"CIPHER_GET_TAG", 46, 185}, +- #endif +- #ifdef CMS_R_CIPHER_INITIALISATION_ERROR +- {"CIPHER_INITIALISATION_ERROR", ERR_LIB_CMS, CMS_R_CIPHER_INITIALISATION_ERROR}, +- #else +- {"CIPHER_INITIALISATION_ERROR", 46, 101}, +- #endif +- #ifdef CMS_R_CIPHER_PARAMETER_INITIALISATION_ERROR +- {"CIPHER_PARAMETER_INITIALISATION_ERROR", ERR_LIB_CMS, CMS_R_CIPHER_PARAMETER_INITIALISATION_ERROR}, +- #else +- {"CIPHER_PARAMETER_INITIALISATION_ERROR", 46, 102}, +- #endif +- #ifdef CMS_R_CMS_DATAFINAL_ERROR +- {"CMS_DATAFINAL_ERROR", ERR_LIB_CMS, CMS_R_CMS_DATAFINAL_ERROR}, +- #else +- {"CMS_DATAFINAL_ERROR", 46, 103}, +- #endif +- #ifdef CMS_R_CMS_LIB +- {"CMS_LIB", ERR_LIB_CMS, CMS_R_CMS_LIB}, +- #else +- {"CMS_LIB", 46, 104}, +- #endif +- #ifdef CMS_R_CONTENTIDENTIFIER_MISMATCH +- {"CONTENTIDENTIFIER_MISMATCH", ERR_LIB_CMS, CMS_R_CONTENTIDENTIFIER_MISMATCH}, +- #else +- {"CONTENTIDENTIFIER_MISMATCH", 46, 170}, +- #endif +- #ifdef CMS_R_CONTENT_NOT_FOUND +- {"CONTENT_NOT_FOUND", ERR_LIB_CMS, CMS_R_CONTENT_NOT_FOUND}, +- #else +- {"CONTENT_NOT_FOUND", 46, 105}, +- #endif +- #ifdef CMS_R_CONTENT_TYPE_MISMATCH +- {"CONTENT_TYPE_MISMATCH", ERR_LIB_CMS, CMS_R_CONTENT_TYPE_MISMATCH}, +- #else +- {"CONTENT_TYPE_MISMATCH", 46, 171}, +- #endif +- #ifdef CMS_R_CONTENT_TYPE_NOT_COMPRESSED_DATA +- {"CONTENT_TYPE_NOT_COMPRESSED_DATA", ERR_LIB_CMS, CMS_R_CONTENT_TYPE_NOT_COMPRESSED_DATA}, +- #else +- {"CONTENT_TYPE_NOT_COMPRESSED_DATA", 46, 106}, +- #endif +- #ifdef CMS_R_CONTENT_TYPE_NOT_ENVELOPED_DATA +- {"CONTENT_TYPE_NOT_ENVELOPED_DATA", ERR_LIB_CMS, CMS_R_CONTENT_TYPE_NOT_ENVELOPED_DATA}, +- #else +- {"CONTENT_TYPE_NOT_ENVELOPED_DATA", 46, 107}, +- #endif +- #ifdef CMS_R_CONTENT_TYPE_NOT_SIGNED_DATA +- {"CONTENT_TYPE_NOT_SIGNED_DATA", ERR_LIB_CMS, CMS_R_CONTENT_TYPE_NOT_SIGNED_DATA}, +- #else +- {"CONTENT_TYPE_NOT_SIGNED_DATA", 46, 108}, +- #endif +- #ifdef CMS_R_CONTENT_VERIFY_ERROR +- {"CONTENT_VERIFY_ERROR", ERR_LIB_CMS, CMS_R_CONTENT_VERIFY_ERROR}, +- #else +- {"CONTENT_VERIFY_ERROR", 46, 109}, +- #endif +- #ifdef CMS_R_CTRL_ERROR +- {"CTRL_ERROR", ERR_LIB_CMS, CMS_R_CTRL_ERROR}, +- #else +- {"CTRL_ERROR", 46, 110}, +- #endif +- #ifdef CMS_R_CTRL_FAILURE +- {"CTRL_FAILURE", ERR_LIB_CMS, CMS_R_CTRL_FAILURE}, +- #else +- {"CTRL_FAILURE", 46, 111}, +- #endif +- #ifdef CMS_R_DECODE_ERROR +- {"DECODE_ERROR", ERR_LIB_CMS, CMS_R_DECODE_ERROR}, +- #else +- {"DECODE_ERROR", 46, 187}, +- #endif +- #ifdef CMS_R_DECRYPT_ERROR +- {"DECRYPT_ERROR", ERR_LIB_CMS, CMS_R_DECRYPT_ERROR}, +- #else +- {"DECRYPT_ERROR", 46, 112}, +- #endif +- #ifdef CMS_R_ERROR_GETTING_PUBLIC_KEY +- {"ERROR_GETTING_PUBLIC_KEY", ERR_LIB_CMS, CMS_R_ERROR_GETTING_PUBLIC_KEY}, +- #else +- {"ERROR_GETTING_PUBLIC_KEY", 46, 113}, +- #endif +- #ifdef CMS_R_ERROR_READING_MESSAGEDIGEST_ATTRIBUTE +- {"ERROR_READING_MESSAGEDIGEST_ATTRIBUTE", ERR_LIB_CMS, CMS_R_ERROR_READING_MESSAGEDIGEST_ATTRIBUTE}, +- #else +- {"ERROR_READING_MESSAGEDIGEST_ATTRIBUTE", 46, 114}, +- #endif +- #ifdef CMS_R_ERROR_SETTING_KEY +- {"ERROR_SETTING_KEY", ERR_LIB_CMS, CMS_R_ERROR_SETTING_KEY}, +- #else +- {"ERROR_SETTING_KEY", 46, 115}, +- #endif +- #ifdef CMS_R_ERROR_SETTING_RECIPIENTINFO +- {"ERROR_SETTING_RECIPIENTINFO", ERR_LIB_CMS, CMS_R_ERROR_SETTING_RECIPIENTINFO}, +- #else +- {"ERROR_SETTING_RECIPIENTINFO", 46, 116}, +- #endif +- #ifdef CMS_R_ESS_SIGNING_CERTID_MISMATCH_ERROR +- {"ESS_SIGNING_CERTID_MISMATCH_ERROR", ERR_LIB_CMS, CMS_R_ESS_SIGNING_CERTID_MISMATCH_ERROR}, +- #else +- {"ESS_SIGNING_CERTID_MISMATCH_ERROR", 46, 183}, +- #endif +- #ifdef CMS_R_INVALID_ENCRYPTED_KEY_LENGTH +- {"INVALID_ENCRYPTED_KEY_LENGTH", ERR_LIB_CMS, CMS_R_INVALID_ENCRYPTED_KEY_LENGTH}, +- #else +- {"INVALID_ENCRYPTED_KEY_LENGTH", 46, 117}, +- #endif +- #ifdef CMS_R_INVALID_KEY_ENCRYPTION_PARAMETER +- {"INVALID_KEY_ENCRYPTION_PARAMETER", ERR_LIB_CMS, CMS_R_INVALID_KEY_ENCRYPTION_PARAMETER}, +- #else +- {"INVALID_KEY_ENCRYPTION_PARAMETER", 46, 176}, +- #endif +- #ifdef CMS_R_INVALID_KEY_LENGTH +- {"INVALID_KEY_LENGTH", ERR_LIB_CMS, CMS_R_INVALID_KEY_LENGTH}, +- #else +- {"INVALID_KEY_LENGTH", 46, 118}, +- #endif +- #ifdef CMS_R_INVALID_LABEL +- {"INVALID_LABEL", ERR_LIB_CMS, CMS_R_INVALID_LABEL}, +- #else +- {"INVALID_LABEL", 46, 190}, +- #endif +- #ifdef CMS_R_INVALID_OAEP_PARAMETERS +- {"INVALID_OAEP_PARAMETERS", ERR_LIB_CMS, CMS_R_INVALID_OAEP_PARAMETERS}, +- #else +- {"INVALID_OAEP_PARAMETERS", 46, 191}, +- #endif +- #ifdef CMS_R_KDF_PARAMETER_ERROR +- {"KDF_PARAMETER_ERROR", ERR_LIB_CMS, CMS_R_KDF_PARAMETER_ERROR}, +- #else +- {"KDF_PARAMETER_ERROR", 46, 186}, +- #endif +- #ifdef CMS_R_MD_BIO_INIT_ERROR +- {"MD_BIO_INIT_ERROR", ERR_LIB_CMS, CMS_R_MD_BIO_INIT_ERROR}, +- #else +- {"MD_BIO_INIT_ERROR", 46, 119}, +- #endif +- #ifdef CMS_R_MESSAGEDIGEST_ATTRIBUTE_WRONG_LENGTH +- {"MESSAGEDIGEST_ATTRIBUTE_WRONG_LENGTH", ERR_LIB_CMS, CMS_R_MESSAGEDIGEST_ATTRIBUTE_WRONG_LENGTH}, +- #else +- {"MESSAGEDIGEST_ATTRIBUTE_WRONG_LENGTH", 46, 120}, +- #endif +- #ifdef CMS_R_MESSAGEDIGEST_WRONG_LENGTH +- {"MESSAGEDIGEST_WRONG_LENGTH", ERR_LIB_CMS, CMS_R_MESSAGEDIGEST_WRONG_LENGTH}, +- #else +- {"MESSAGEDIGEST_WRONG_LENGTH", 46, 121}, +- #endif +- #ifdef CMS_R_MSGSIGDIGEST_ERROR +- {"MSGSIGDIGEST_ERROR", ERR_LIB_CMS, CMS_R_MSGSIGDIGEST_ERROR}, +- #else +- {"MSGSIGDIGEST_ERROR", 46, 172}, +- #endif +- #ifdef CMS_R_MSGSIGDIGEST_VERIFICATION_FAILURE +- {"MSGSIGDIGEST_VERIFICATION_FAILURE", ERR_LIB_CMS, CMS_R_MSGSIGDIGEST_VERIFICATION_FAILURE}, +- #else +- {"MSGSIGDIGEST_VERIFICATION_FAILURE", 46, 162}, +- #endif +- #ifdef CMS_R_MSGSIGDIGEST_WRONG_LENGTH +- {"MSGSIGDIGEST_WRONG_LENGTH", ERR_LIB_CMS, CMS_R_MSGSIGDIGEST_WRONG_LENGTH}, +- #else +- {"MSGSIGDIGEST_WRONG_LENGTH", 46, 163}, +- #endif +- #ifdef CMS_R_NEED_ONE_SIGNER +- {"NEED_ONE_SIGNER", ERR_LIB_CMS, CMS_R_NEED_ONE_SIGNER}, +- #else +- {"NEED_ONE_SIGNER", 46, 164}, +- #endif +- #ifdef CMS_R_NOT_A_SIGNED_RECEIPT +- {"NOT_A_SIGNED_RECEIPT", ERR_LIB_CMS, CMS_R_NOT_A_SIGNED_RECEIPT}, +- #else +- {"NOT_A_SIGNED_RECEIPT", 46, 165}, +- #endif +- #ifdef CMS_R_NOT_ENCRYPTED_DATA +- {"NOT_ENCRYPTED_DATA", ERR_LIB_CMS, CMS_R_NOT_ENCRYPTED_DATA}, +- #else +- {"NOT_ENCRYPTED_DATA", 46, 122}, +- #endif +- #ifdef CMS_R_NOT_KEK +- {"NOT_KEK", ERR_LIB_CMS, CMS_R_NOT_KEK}, +- #else +- {"NOT_KEK", 46, 123}, +- #endif +- #ifdef CMS_R_NOT_KEY_AGREEMENT +- {"NOT_KEY_AGREEMENT", ERR_LIB_CMS, CMS_R_NOT_KEY_AGREEMENT}, +- #else +- {"NOT_KEY_AGREEMENT", 46, 181}, +- #endif +- #ifdef CMS_R_NOT_KEY_TRANSPORT +- {"NOT_KEY_TRANSPORT", ERR_LIB_CMS, CMS_R_NOT_KEY_TRANSPORT}, +- #else +- {"NOT_KEY_TRANSPORT", 46, 124}, +- #endif +- #ifdef CMS_R_NOT_PWRI +- {"NOT_PWRI", ERR_LIB_CMS, CMS_R_NOT_PWRI}, +- #else +- {"NOT_PWRI", 46, 177}, +- #endif +- #ifdef CMS_R_NOT_SUPPORTED_FOR_THIS_KEY_TYPE +- {"NOT_SUPPORTED_FOR_THIS_KEY_TYPE", ERR_LIB_CMS, CMS_R_NOT_SUPPORTED_FOR_THIS_KEY_TYPE}, +- #else +- {"NOT_SUPPORTED_FOR_THIS_KEY_TYPE", 46, 125}, +- #endif +- #ifdef CMS_R_NO_CIPHER +- {"NO_CIPHER", ERR_LIB_CMS, CMS_R_NO_CIPHER}, +- #else +- {"NO_CIPHER", 46, 126}, +- #endif +- #ifdef CMS_R_NO_CONTENT +- {"NO_CONTENT", ERR_LIB_CMS, CMS_R_NO_CONTENT}, +- #else +- {"NO_CONTENT", 46, 127}, +- #endif +- #ifdef CMS_R_NO_CONTENT_TYPE +- {"NO_CONTENT_TYPE", ERR_LIB_CMS, CMS_R_NO_CONTENT_TYPE}, +- #else +- {"NO_CONTENT_TYPE", 46, 173}, +- #endif +- #ifdef CMS_R_NO_DEFAULT_DIGEST +- {"NO_DEFAULT_DIGEST", ERR_LIB_CMS, CMS_R_NO_DEFAULT_DIGEST}, +- #else +- {"NO_DEFAULT_DIGEST", 46, 128}, +- #endif +- #ifdef CMS_R_NO_DIGEST_SET +- {"NO_DIGEST_SET", ERR_LIB_CMS, CMS_R_NO_DIGEST_SET}, +- #else +- {"NO_DIGEST_SET", 46, 129}, +- #endif +- #ifdef CMS_R_NO_KEY +- {"NO_KEY", ERR_LIB_CMS, CMS_R_NO_KEY}, +- #else +- {"NO_KEY", 46, 130}, +- #endif +- #ifdef CMS_R_NO_KEY_OR_CERT +- {"NO_KEY_OR_CERT", ERR_LIB_CMS, CMS_R_NO_KEY_OR_CERT}, +- #else +- {"NO_KEY_OR_CERT", 46, 174}, +- #endif +- #ifdef CMS_R_NO_MATCHING_DIGEST +- {"NO_MATCHING_DIGEST", ERR_LIB_CMS, CMS_R_NO_MATCHING_DIGEST}, +- #else +- {"NO_MATCHING_DIGEST", 46, 131}, +- #endif +- #ifdef CMS_R_NO_MATCHING_RECIPIENT +- {"NO_MATCHING_RECIPIENT", ERR_LIB_CMS, CMS_R_NO_MATCHING_RECIPIENT}, +- #else +- {"NO_MATCHING_RECIPIENT", 46, 132}, +- #endif +- #ifdef CMS_R_NO_MATCHING_SIGNATURE +- {"NO_MATCHING_SIGNATURE", ERR_LIB_CMS, CMS_R_NO_MATCHING_SIGNATURE}, +- #else +- {"NO_MATCHING_SIGNATURE", 46, 166}, +- #endif +- #ifdef CMS_R_NO_MSGSIGDIGEST +- {"NO_MSGSIGDIGEST", ERR_LIB_CMS, CMS_R_NO_MSGSIGDIGEST}, +- #else +- {"NO_MSGSIGDIGEST", 46, 167}, +- #endif +- #ifdef CMS_R_NO_PASSWORD +- {"NO_PASSWORD", ERR_LIB_CMS, CMS_R_NO_PASSWORD}, +- #else +- {"NO_PASSWORD", 46, 178}, +- #endif +- #ifdef CMS_R_NO_PRIVATE_KEY +- {"NO_PRIVATE_KEY", ERR_LIB_CMS, CMS_R_NO_PRIVATE_KEY}, +- #else +- {"NO_PRIVATE_KEY", 46, 133}, +- #endif +- #ifdef CMS_R_NO_PUBLIC_KEY +- {"NO_PUBLIC_KEY", ERR_LIB_CMS, CMS_R_NO_PUBLIC_KEY}, +- #else +- {"NO_PUBLIC_KEY", 46, 134}, +- #endif +- #ifdef CMS_R_NO_RECEIPT_REQUEST +- {"NO_RECEIPT_REQUEST", ERR_LIB_CMS, CMS_R_NO_RECEIPT_REQUEST}, +- #else +- {"NO_RECEIPT_REQUEST", 46, 168}, +- #endif +- #ifdef CMS_R_NO_SIGNERS +- {"NO_SIGNERS", ERR_LIB_CMS, CMS_R_NO_SIGNERS}, +- #else +- {"NO_SIGNERS", 46, 135}, +- #endif +- #ifdef CMS_R_PEER_KEY_ERROR +- {"PEER_KEY_ERROR", ERR_LIB_CMS, CMS_R_PEER_KEY_ERROR}, +- #else +- {"PEER_KEY_ERROR", 46, 188}, +- #endif +- #ifdef CMS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE +- {"PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE", ERR_LIB_CMS, CMS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE}, +- #else +- {"PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE", 46, 136}, +- #endif +- #ifdef CMS_R_RECEIPT_DECODE_ERROR +- {"RECEIPT_DECODE_ERROR", ERR_LIB_CMS, CMS_R_RECEIPT_DECODE_ERROR}, +- #else +- {"RECEIPT_DECODE_ERROR", 46, 169}, +- #endif +- #ifdef CMS_R_RECIPIENT_ERROR +- {"RECIPIENT_ERROR", ERR_LIB_CMS, CMS_R_RECIPIENT_ERROR}, +- #else +- {"RECIPIENT_ERROR", 46, 137}, +- #endif +- #ifdef CMS_R_SHARED_INFO_ERROR +- {"SHARED_INFO_ERROR", ERR_LIB_CMS, CMS_R_SHARED_INFO_ERROR}, +- #else +- {"SHARED_INFO_ERROR", 46, 189}, +- #endif +- #ifdef CMS_R_SIGNER_CERTIFICATE_NOT_FOUND +- {"SIGNER_CERTIFICATE_NOT_FOUND", ERR_LIB_CMS, CMS_R_SIGNER_CERTIFICATE_NOT_FOUND}, +- #else +- {"SIGNER_CERTIFICATE_NOT_FOUND", 46, 138}, +- #endif +- #ifdef CMS_R_SIGNFINAL_ERROR +- {"SIGNFINAL_ERROR", ERR_LIB_CMS, CMS_R_SIGNFINAL_ERROR}, +- #else +- {"SIGNFINAL_ERROR", 46, 139}, +- #endif +- #ifdef CMS_R_SMIME_TEXT_ERROR +- {"SMIME_TEXT_ERROR", ERR_LIB_CMS, CMS_R_SMIME_TEXT_ERROR}, +- #else +- {"SMIME_TEXT_ERROR", 46, 140}, +- #endif +- #ifdef CMS_R_STORE_INIT_ERROR +- {"STORE_INIT_ERROR", ERR_LIB_CMS, CMS_R_STORE_INIT_ERROR}, +- #else +- {"STORE_INIT_ERROR", 46, 141}, +- #endif +- #ifdef CMS_R_TYPE_NOT_COMPRESSED_DATA +- {"TYPE_NOT_COMPRESSED_DATA", ERR_LIB_CMS, CMS_R_TYPE_NOT_COMPRESSED_DATA}, +- #else +- {"TYPE_NOT_COMPRESSED_DATA", 46, 142}, +- #endif +- #ifdef CMS_R_TYPE_NOT_DATA +- {"TYPE_NOT_DATA", ERR_LIB_CMS, CMS_R_TYPE_NOT_DATA}, +- #else +- {"TYPE_NOT_DATA", 46, 143}, +- #endif +- #ifdef CMS_R_TYPE_NOT_DIGESTED_DATA +- {"TYPE_NOT_DIGESTED_DATA", ERR_LIB_CMS, CMS_R_TYPE_NOT_DIGESTED_DATA}, +- #else +- {"TYPE_NOT_DIGESTED_DATA", 46, 144}, +- #endif +- #ifdef CMS_R_TYPE_NOT_ENCRYPTED_DATA +- {"TYPE_NOT_ENCRYPTED_DATA", ERR_LIB_CMS, CMS_R_TYPE_NOT_ENCRYPTED_DATA}, +- #else +- {"TYPE_NOT_ENCRYPTED_DATA", 46, 145}, +- #endif +- #ifdef CMS_R_TYPE_NOT_ENVELOPED_DATA +- {"TYPE_NOT_ENVELOPED_DATA", ERR_LIB_CMS, CMS_R_TYPE_NOT_ENVELOPED_DATA}, +- #else +- {"TYPE_NOT_ENVELOPED_DATA", 46, 146}, +- #endif +- #ifdef CMS_R_UNABLE_TO_FINALIZE_CONTEXT +- {"UNABLE_TO_FINALIZE_CONTEXT", ERR_LIB_CMS, CMS_R_UNABLE_TO_FINALIZE_CONTEXT}, +- #else +- {"UNABLE_TO_FINALIZE_CONTEXT", 46, 147}, +- #endif +- #ifdef CMS_R_UNKNOWN_CIPHER +- {"UNKNOWN_CIPHER", ERR_LIB_CMS, CMS_R_UNKNOWN_CIPHER}, +- #else +- {"UNKNOWN_CIPHER", 46, 148}, +- #endif +- #ifdef CMS_R_UNKNOWN_DIGEST_ALGORITHM +- {"UNKNOWN_DIGEST_ALGORITHM", ERR_LIB_CMS, CMS_R_UNKNOWN_DIGEST_ALGORITHM}, +- #else +- {"UNKNOWN_DIGEST_ALGORITHM", 46, 149}, +- #endif +- #ifdef CMS_R_UNKNOWN_ID +- {"UNKNOWN_ID", ERR_LIB_CMS, CMS_R_UNKNOWN_ID}, +- #else +- {"UNKNOWN_ID", 46, 150}, +- #endif +- #ifdef CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM +- {"UNSUPPORTED_COMPRESSION_ALGORITHM", ERR_LIB_CMS, CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM}, +- #else +- {"UNSUPPORTED_COMPRESSION_ALGORITHM", 46, 151}, +- #endif +- #ifdef CMS_R_UNSUPPORTED_CONTENT_ENCRYPTION_ALGORITHM +- {"UNSUPPORTED_CONTENT_ENCRYPTION_ALGORITHM", ERR_LIB_CMS, CMS_R_UNSUPPORTED_CONTENT_ENCRYPTION_ALGORITHM}, +- #else +- {"UNSUPPORTED_CONTENT_ENCRYPTION_ALGORITHM", 46, 194}, +- #endif +- #ifdef CMS_R_UNSUPPORTED_CONTENT_TYPE +- {"UNSUPPORTED_CONTENT_TYPE", ERR_LIB_CMS, CMS_R_UNSUPPORTED_CONTENT_TYPE}, +- #else +- {"UNSUPPORTED_CONTENT_TYPE", 46, 152}, +- #endif +- #ifdef CMS_R_UNSUPPORTED_ENCRYPTION_TYPE +- {"UNSUPPORTED_ENCRYPTION_TYPE", ERR_LIB_CMS, CMS_R_UNSUPPORTED_ENCRYPTION_TYPE}, +- #else +- {"UNSUPPORTED_ENCRYPTION_TYPE", 46, 192}, +- #endif +- #ifdef CMS_R_UNSUPPORTED_KEK_ALGORITHM +- {"UNSUPPORTED_KEK_ALGORITHM", ERR_LIB_CMS, CMS_R_UNSUPPORTED_KEK_ALGORITHM}, +- #else +- {"UNSUPPORTED_KEK_ALGORITHM", 46, 153}, +- #endif +- #ifdef CMS_R_UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM +- {"UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM", ERR_LIB_CMS, CMS_R_UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM}, +- #else +- {"UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM", 46, 179}, +- #endif +- #ifdef CMS_R_UNSUPPORTED_LABEL_SOURCE +- {"UNSUPPORTED_LABEL_SOURCE", ERR_LIB_CMS, CMS_R_UNSUPPORTED_LABEL_SOURCE}, +- #else +- {"UNSUPPORTED_LABEL_SOURCE", 46, 193}, +- #endif +- #ifdef CMS_R_UNSUPPORTED_RECIPIENTINFO_TYPE +- {"UNSUPPORTED_RECIPIENTINFO_TYPE", ERR_LIB_CMS, CMS_R_UNSUPPORTED_RECIPIENTINFO_TYPE}, +- #else +- {"UNSUPPORTED_RECIPIENTINFO_TYPE", 46, 155}, +- #endif +- #ifdef CMS_R_UNSUPPORTED_RECIPIENT_TYPE +- {"UNSUPPORTED_RECIPIENT_TYPE", ERR_LIB_CMS, CMS_R_UNSUPPORTED_RECIPIENT_TYPE}, +- #else +- {"UNSUPPORTED_RECIPIENT_TYPE", 46, 154}, +- #endif +- #ifdef CMS_R_UNSUPPORTED_TYPE +- {"UNSUPPORTED_TYPE", ERR_LIB_CMS, CMS_R_UNSUPPORTED_TYPE}, +- #else +- {"UNSUPPORTED_TYPE", 46, 156}, +- #endif +- #ifdef CMS_R_UNWRAP_ERROR +- {"UNWRAP_ERROR", ERR_LIB_CMS, CMS_R_UNWRAP_ERROR}, +- #else +- {"UNWRAP_ERROR", 46, 157}, +- #endif +- #ifdef CMS_R_UNWRAP_FAILURE +- {"UNWRAP_FAILURE", ERR_LIB_CMS, CMS_R_UNWRAP_FAILURE}, +- #else +- {"UNWRAP_FAILURE", 46, 180}, +- #endif +- #ifdef CMS_R_VERIFICATION_FAILURE +- {"VERIFICATION_FAILURE", ERR_LIB_CMS, CMS_R_VERIFICATION_FAILURE}, +- #else +- {"VERIFICATION_FAILURE", 46, 158}, +- #endif +- #ifdef CMS_R_WRAP_ERROR +- {"WRAP_ERROR", ERR_LIB_CMS, CMS_R_WRAP_ERROR}, +- #else +- {"WRAP_ERROR", 46, 159}, +- #endif +- #ifdef COMP_R_ZLIB_DEFLATE_ERROR +- {"ZLIB_DEFLATE_ERROR", ERR_LIB_COMP, COMP_R_ZLIB_DEFLATE_ERROR}, +- #else +- {"ZLIB_DEFLATE_ERROR", 41, 99}, +- #endif +- #ifdef COMP_R_ZLIB_INFLATE_ERROR +- {"ZLIB_INFLATE_ERROR", ERR_LIB_COMP, COMP_R_ZLIB_INFLATE_ERROR}, +- #else +- {"ZLIB_INFLATE_ERROR", 41, 100}, +- #endif +- #ifdef COMP_R_ZLIB_NOT_SUPPORTED +- {"ZLIB_NOT_SUPPORTED", ERR_LIB_COMP, COMP_R_ZLIB_NOT_SUPPORTED}, +- #else +- {"ZLIB_NOT_SUPPORTED", 41, 101}, +- #endif +- #ifdef CONF_R_ERROR_LOADING_DSO +- {"ERROR_LOADING_DSO", ERR_LIB_CONF, CONF_R_ERROR_LOADING_DSO}, +- #else +- {"ERROR_LOADING_DSO", 14, 110}, +- #endif +- #ifdef CONF_R_INVALID_PRAGMA +- {"INVALID_PRAGMA", ERR_LIB_CONF, CONF_R_INVALID_PRAGMA}, +- #else +- {"INVALID_PRAGMA", 14, 122}, +- #endif +- #ifdef CONF_R_LIST_CANNOT_BE_NULL +- {"LIST_CANNOT_BE_NULL", ERR_LIB_CONF, CONF_R_LIST_CANNOT_BE_NULL}, +- #else +- {"LIST_CANNOT_BE_NULL", 14, 115}, +- #endif +- #ifdef CONF_R_MANDATORY_BRACES_IN_VARIABLE_EXPANSION +- {"MANDATORY_BRACES_IN_VARIABLE_EXPANSION", ERR_LIB_CONF, CONF_R_MANDATORY_BRACES_IN_VARIABLE_EXPANSION}, +- #else +- {"MANDATORY_BRACES_IN_VARIABLE_EXPANSION", 14, 123}, +- #endif +- #ifdef CONF_R_MISSING_CLOSE_SQUARE_BRACKET +- {"MISSING_CLOSE_SQUARE_BRACKET", ERR_LIB_CONF, CONF_R_MISSING_CLOSE_SQUARE_BRACKET}, +- #else +- {"MISSING_CLOSE_SQUARE_BRACKET", 14, 100}, +- #endif +- #ifdef CONF_R_MISSING_EQUAL_SIGN +- {"MISSING_EQUAL_SIGN", ERR_LIB_CONF, CONF_R_MISSING_EQUAL_SIGN}, +- #else +- {"MISSING_EQUAL_SIGN", 14, 101}, +- #endif +- #ifdef CONF_R_MISSING_INIT_FUNCTION +- {"MISSING_INIT_FUNCTION", ERR_LIB_CONF, CONF_R_MISSING_INIT_FUNCTION}, +- #else +- {"MISSING_INIT_FUNCTION", 14, 112}, +- #endif +- #ifdef CONF_R_MODULE_INITIALIZATION_ERROR +- {"MODULE_INITIALIZATION_ERROR", ERR_LIB_CONF, CONF_R_MODULE_INITIALIZATION_ERROR}, +- #else +- {"MODULE_INITIALIZATION_ERROR", 14, 109}, +- #endif +- #ifdef CONF_R_NO_CLOSE_BRACE +- {"NO_CLOSE_BRACE", ERR_LIB_CONF, CONF_R_NO_CLOSE_BRACE}, +- #else +- {"NO_CLOSE_BRACE", 14, 102}, +- #endif +- #ifdef CONF_R_NO_CONF +- {"NO_CONF", ERR_LIB_CONF, CONF_R_NO_CONF}, +- #else +- {"NO_CONF", 14, 105}, +- #endif +- #ifdef CONF_R_NO_CONF_OR_ENVIRONMENT_VARIABLE +- {"NO_CONF_OR_ENVIRONMENT_VARIABLE", ERR_LIB_CONF, CONF_R_NO_CONF_OR_ENVIRONMENT_VARIABLE}, +- #else +- {"NO_CONF_OR_ENVIRONMENT_VARIABLE", 14, 106}, +- #endif +- #ifdef CONF_R_NO_SECTION +- {"NO_SECTION", ERR_LIB_CONF, CONF_R_NO_SECTION}, +- #else +- {"NO_SECTION", 14, 107}, +- #endif +- #ifdef CONF_R_NO_SUCH_FILE +- {"NO_SUCH_FILE", ERR_LIB_CONF, CONF_R_NO_SUCH_FILE}, +- #else +- {"NO_SUCH_FILE", 14, 114}, +- #endif +- #ifdef CONF_R_NO_VALUE +- {"NO_VALUE", ERR_LIB_CONF, CONF_R_NO_VALUE}, +- #else +- {"NO_VALUE", 14, 108}, +- #endif +- #ifdef CONF_R_NUMBER_TOO_LARGE +- {"NUMBER_TOO_LARGE", ERR_LIB_CONF, CONF_R_NUMBER_TOO_LARGE}, +- #else +- {"NUMBER_TOO_LARGE", 14, 121}, +- #endif +- #ifdef CONF_R_OPENSSL_CONF_REFERENCES_MISSING_SECTION +- {"OPENSSL_CONF_REFERENCES_MISSING_SECTION", ERR_LIB_CONF, CONF_R_OPENSSL_CONF_REFERENCES_MISSING_SECTION}, +- #else +- {"OPENSSL_CONF_REFERENCES_MISSING_SECTION", 14, 124}, +- #endif +- #ifdef CONF_R_RECURSIVE_DIRECTORY_INCLUDE +- {"RECURSIVE_DIRECTORY_INCLUDE", ERR_LIB_CONF, CONF_R_RECURSIVE_DIRECTORY_INCLUDE}, +- #else +- {"RECURSIVE_DIRECTORY_INCLUDE", 14, 111}, +- #endif +- #ifdef CONF_R_RELATIVE_PATH +- {"RELATIVE_PATH", ERR_LIB_CONF, CONF_R_RELATIVE_PATH}, +- #else +- {"RELATIVE_PATH", 14, 125}, +- #endif +- #ifdef CONF_R_SSL_COMMAND_SECTION_EMPTY +- {"SSL_COMMAND_SECTION_EMPTY", ERR_LIB_CONF, CONF_R_SSL_COMMAND_SECTION_EMPTY}, +- #else +- {"SSL_COMMAND_SECTION_EMPTY", 14, 117}, +- #endif +- #ifdef CONF_R_SSL_COMMAND_SECTION_NOT_FOUND +- {"SSL_COMMAND_SECTION_NOT_FOUND", ERR_LIB_CONF, CONF_R_SSL_COMMAND_SECTION_NOT_FOUND}, +- #else +- {"SSL_COMMAND_SECTION_NOT_FOUND", 14, 118}, +- #endif +- #ifdef CONF_R_SSL_SECTION_EMPTY +- {"SSL_SECTION_EMPTY", ERR_LIB_CONF, CONF_R_SSL_SECTION_EMPTY}, +- #else +- {"SSL_SECTION_EMPTY", 14, 119}, +- #endif +- #ifdef CONF_R_SSL_SECTION_NOT_FOUND +- {"SSL_SECTION_NOT_FOUND", ERR_LIB_CONF, CONF_R_SSL_SECTION_NOT_FOUND}, +- #else +- {"SSL_SECTION_NOT_FOUND", 14, 120}, +- #endif +- #ifdef CONF_R_UNABLE_TO_CREATE_NEW_SECTION +- {"UNABLE_TO_CREATE_NEW_SECTION", ERR_LIB_CONF, CONF_R_UNABLE_TO_CREATE_NEW_SECTION}, +- #else +- {"UNABLE_TO_CREATE_NEW_SECTION", 14, 103}, +- #endif +- #ifdef CONF_R_UNKNOWN_MODULE_NAME +- {"UNKNOWN_MODULE_NAME", ERR_LIB_CONF, CONF_R_UNKNOWN_MODULE_NAME}, +- #else +- {"UNKNOWN_MODULE_NAME", 14, 113}, +- #endif +- #ifdef CONF_R_VARIABLE_EXPANSION_TOO_LONG +- {"VARIABLE_EXPANSION_TOO_LONG", ERR_LIB_CONF, CONF_R_VARIABLE_EXPANSION_TOO_LONG}, +- #else +- {"VARIABLE_EXPANSION_TOO_LONG", 14, 116}, +- #endif +- #ifdef CONF_R_VARIABLE_HAS_NO_VALUE +- {"VARIABLE_HAS_NO_VALUE", ERR_LIB_CONF, CONF_R_VARIABLE_HAS_NO_VALUE}, +- #else +- {"VARIABLE_HAS_NO_VALUE", 14, 104}, +- #endif +- #ifdef CRMF_R_BAD_PBM_ITERATIONCOUNT +- {"BAD_PBM_ITERATIONCOUNT", ERR_LIB_CRMF, CRMF_R_BAD_PBM_ITERATIONCOUNT}, +- #else +- {"BAD_PBM_ITERATIONCOUNT", 56, 100}, +- #endif +- #ifdef CRMF_R_CRMFERROR +- {"CRMFERROR", ERR_LIB_CRMF, CRMF_R_CRMFERROR}, +- #else +- {"CRMFERROR", 56, 102}, +- #endif +- #ifdef CRMF_R_ERROR +- {"ERROR", ERR_LIB_CRMF, CRMF_R_ERROR}, +- #else +- {"ERROR", 56, 103}, +- #endif +- #ifdef CRMF_R_ERROR_DECODING_CERTIFICATE +- {"ERROR_DECODING_CERTIFICATE", ERR_LIB_CRMF, CRMF_R_ERROR_DECODING_CERTIFICATE}, +- #else +- {"ERROR_DECODING_CERTIFICATE", 56, 104}, +- #endif +- #ifdef CRMF_R_ERROR_DECRYPTING_CERTIFICATE +- {"ERROR_DECRYPTING_CERTIFICATE", ERR_LIB_CRMF, CRMF_R_ERROR_DECRYPTING_CERTIFICATE}, +- #else +- {"ERROR_DECRYPTING_CERTIFICATE", 56, 105}, +- #endif +- #ifdef CRMF_R_ERROR_DECRYPTING_SYMMETRIC_KEY +- {"ERROR_DECRYPTING_SYMMETRIC_KEY", ERR_LIB_CRMF, CRMF_R_ERROR_DECRYPTING_SYMMETRIC_KEY}, +- #else +- {"ERROR_DECRYPTING_SYMMETRIC_KEY", 56, 106}, +- #endif +- #ifdef CRMF_R_FAILURE_OBTAINING_RANDOM +- {"FAILURE_OBTAINING_RANDOM", ERR_LIB_CRMF, CRMF_R_FAILURE_OBTAINING_RANDOM}, +- #else +- {"FAILURE_OBTAINING_RANDOM", 56, 107}, +- #endif +- #ifdef CRMF_R_ITERATIONCOUNT_BELOW_100 +- {"ITERATIONCOUNT_BELOW_100", ERR_LIB_CRMF, CRMF_R_ITERATIONCOUNT_BELOW_100}, +- #else +- {"ITERATIONCOUNT_BELOW_100", 56, 108}, +- #endif +- #ifdef CRMF_R_MALFORMED_IV +- {"MALFORMED_IV", ERR_LIB_CRMF, CRMF_R_MALFORMED_IV}, +- #else +- {"MALFORMED_IV", 56, 101}, +- #endif +- #ifdef CRMF_R_NULL_ARGUMENT +- {"NULL_ARGUMENT", ERR_LIB_CRMF, CRMF_R_NULL_ARGUMENT}, +- #else +- {"NULL_ARGUMENT", 56, 109}, +- #endif +- #ifdef CRMF_R_POPOSKINPUT_NOT_SUPPORTED +- {"POPOSKINPUT_NOT_SUPPORTED", ERR_LIB_CRMF, CRMF_R_POPOSKINPUT_NOT_SUPPORTED}, +- #else +- {"POPOSKINPUT_NOT_SUPPORTED", 56, 113}, +- #endif +- #ifdef CRMF_R_POPO_INCONSISTENT_PUBLIC_KEY +- {"POPO_INCONSISTENT_PUBLIC_KEY", ERR_LIB_CRMF, CRMF_R_POPO_INCONSISTENT_PUBLIC_KEY}, +- #else +- {"POPO_INCONSISTENT_PUBLIC_KEY", 56, 117}, +- #endif +- #ifdef CRMF_R_POPO_MISSING +- {"POPO_MISSING", ERR_LIB_CRMF, CRMF_R_POPO_MISSING}, +- #else +- {"POPO_MISSING", 56, 121}, +- #endif +- #ifdef CRMF_R_POPO_MISSING_PUBLIC_KEY +- {"POPO_MISSING_PUBLIC_KEY", ERR_LIB_CRMF, CRMF_R_POPO_MISSING_PUBLIC_KEY}, +- #else +- {"POPO_MISSING_PUBLIC_KEY", 56, 118}, +- #endif +- #ifdef CRMF_R_POPO_MISSING_SUBJECT +- {"POPO_MISSING_SUBJECT", ERR_LIB_CRMF, CRMF_R_POPO_MISSING_SUBJECT}, +- #else +- {"POPO_MISSING_SUBJECT", 56, 119}, +- #endif +- #ifdef CRMF_R_POPO_RAVERIFIED_NOT_ACCEPTED +- {"POPO_RAVERIFIED_NOT_ACCEPTED", ERR_LIB_CRMF, CRMF_R_POPO_RAVERIFIED_NOT_ACCEPTED}, +- #else +- {"POPO_RAVERIFIED_NOT_ACCEPTED", 56, 120}, +- #endif +- #ifdef CRMF_R_SETTING_MAC_ALGOR_FAILURE +- {"SETTING_MAC_ALGOR_FAILURE", ERR_LIB_CRMF, CRMF_R_SETTING_MAC_ALGOR_FAILURE}, +- #else +- {"SETTING_MAC_ALGOR_FAILURE", 56, 110}, +- #endif +- #ifdef CRMF_R_SETTING_OWF_ALGOR_FAILURE +- {"SETTING_OWF_ALGOR_FAILURE", ERR_LIB_CRMF, CRMF_R_SETTING_OWF_ALGOR_FAILURE}, +- #else +- {"SETTING_OWF_ALGOR_FAILURE", 56, 111}, +- #endif +- #ifdef CRMF_R_UNSUPPORTED_ALGORITHM +- {"UNSUPPORTED_ALGORITHM", ERR_LIB_CRMF, CRMF_R_UNSUPPORTED_ALGORITHM}, +- #else +- {"UNSUPPORTED_ALGORITHM", 56, 112}, +- #endif +- #ifdef CRMF_R_UNSUPPORTED_CIPHER +- {"UNSUPPORTED_CIPHER", ERR_LIB_CRMF, CRMF_R_UNSUPPORTED_CIPHER}, +- #else +- {"UNSUPPORTED_CIPHER", 56, 114}, +- #endif +- #ifdef CRMF_R_UNSUPPORTED_METHOD_FOR_CREATING_POPO +- {"UNSUPPORTED_METHOD_FOR_CREATING_POPO", ERR_LIB_CRMF, CRMF_R_UNSUPPORTED_METHOD_FOR_CREATING_POPO}, +- #else +- {"UNSUPPORTED_METHOD_FOR_CREATING_POPO", 56, 115}, +- #endif +- #ifdef CRMF_R_UNSUPPORTED_POPO_METHOD +- {"UNSUPPORTED_POPO_METHOD", ERR_LIB_CRMF, CRMF_R_UNSUPPORTED_POPO_METHOD}, +- #else +- {"UNSUPPORTED_POPO_METHOD", 56, 116}, +- #endif +- #ifdef CRYPTO_R_BAD_ALGORITHM_NAME +- {"BAD_ALGORITHM_NAME", ERR_LIB_CRYPTO, CRYPTO_R_BAD_ALGORITHM_NAME}, +- #else +- {"BAD_ALGORITHM_NAME", 15, 117}, +- #endif +- #ifdef CRYPTO_R_CONFLICTING_NAMES +- {"CONFLICTING_NAMES", ERR_LIB_CRYPTO, CRYPTO_R_CONFLICTING_NAMES}, +- #else +- {"CONFLICTING_NAMES", 15, 118}, +- #endif +- #ifdef CRYPTO_R_HEX_STRING_TOO_SHORT +- {"HEX_STRING_TOO_SHORT", ERR_LIB_CRYPTO, CRYPTO_R_HEX_STRING_TOO_SHORT}, +- #else +- {"HEX_STRING_TOO_SHORT", 15, 121}, +- #endif +- #ifdef CRYPTO_R_ILLEGAL_HEX_DIGIT +- {"ILLEGAL_HEX_DIGIT", ERR_LIB_CRYPTO, CRYPTO_R_ILLEGAL_HEX_DIGIT}, +- #else +- {"ILLEGAL_HEX_DIGIT", 15, 102}, +- #endif +- #ifdef CRYPTO_R_INSUFFICIENT_DATA_SPACE +- {"INSUFFICIENT_DATA_SPACE", ERR_LIB_CRYPTO, CRYPTO_R_INSUFFICIENT_DATA_SPACE}, +- #else +- {"INSUFFICIENT_DATA_SPACE", 15, 106}, +- #endif +- #ifdef CRYPTO_R_INSUFFICIENT_PARAM_SIZE +- {"INSUFFICIENT_PARAM_SIZE", ERR_LIB_CRYPTO, CRYPTO_R_INSUFFICIENT_PARAM_SIZE}, +- #else +- {"INSUFFICIENT_PARAM_SIZE", 15, 107}, +- #endif +- #ifdef CRYPTO_R_INSUFFICIENT_SECURE_DATA_SPACE +- {"INSUFFICIENT_SECURE_DATA_SPACE", ERR_LIB_CRYPTO, CRYPTO_R_INSUFFICIENT_SECURE_DATA_SPACE}, +- #else +- {"INSUFFICIENT_SECURE_DATA_SPACE", 15, 108}, +- #endif +- #ifdef CRYPTO_R_INTEGER_OVERFLOW +- {"INTEGER_OVERFLOW", ERR_LIB_CRYPTO, CRYPTO_R_INTEGER_OVERFLOW}, +- #else +- {"INTEGER_OVERFLOW", 15, 127}, +- #endif +- #ifdef CRYPTO_R_INVALID_NEGATIVE_VALUE +- {"INVALID_NEGATIVE_VALUE", ERR_LIB_CRYPTO, CRYPTO_R_INVALID_NEGATIVE_VALUE}, +- #else +- {"INVALID_NEGATIVE_VALUE", 15, 122}, +- #endif +- #ifdef CRYPTO_R_INVALID_NULL_ARGUMENT +- {"INVALID_NULL_ARGUMENT", ERR_LIB_CRYPTO, CRYPTO_R_INVALID_NULL_ARGUMENT}, +- #else +- {"INVALID_NULL_ARGUMENT", 15, 109}, +- #endif +- #ifdef CRYPTO_R_INVALID_OSSL_PARAM_TYPE +- {"INVALID_OSSL_PARAM_TYPE", ERR_LIB_CRYPTO, CRYPTO_R_INVALID_OSSL_PARAM_TYPE}, +- #else +- {"INVALID_OSSL_PARAM_TYPE", 15, 110}, +- #endif +- #ifdef CRYPTO_R_NO_PARAMS_TO_MERGE +- {"NO_PARAMS_TO_MERGE", ERR_LIB_CRYPTO, CRYPTO_R_NO_PARAMS_TO_MERGE}, +- #else +- {"NO_PARAMS_TO_MERGE", 15, 131}, +- #endif +- #ifdef CRYPTO_R_NO_SPACE_FOR_TERMINATING_NULL +- {"NO_SPACE_FOR_TERMINATING_NULL", ERR_LIB_CRYPTO, CRYPTO_R_NO_SPACE_FOR_TERMINATING_NULL}, +- #else +- {"NO_SPACE_FOR_TERMINATING_NULL", 15, 128}, +- #endif +- #ifdef CRYPTO_R_ODD_NUMBER_OF_DIGITS +- {"ODD_NUMBER_OF_DIGITS", ERR_LIB_CRYPTO, CRYPTO_R_ODD_NUMBER_OF_DIGITS}, +- #else +- {"ODD_NUMBER_OF_DIGITS", 15, 103}, +- #endif +- #ifdef CRYPTO_R_PARAM_CANNOT_BE_REPRESENTED_EXACTLY +- {"PARAM_CANNOT_BE_REPRESENTED_EXACTLY", ERR_LIB_CRYPTO, CRYPTO_R_PARAM_CANNOT_BE_REPRESENTED_EXACTLY}, +- #else +- {"PARAM_CANNOT_BE_REPRESENTED_EXACTLY", 15, 123}, +- #endif +- #ifdef CRYPTO_R_PARAM_NOT_INTEGER_TYPE +- {"PARAM_NOT_INTEGER_TYPE", ERR_LIB_CRYPTO, CRYPTO_R_PARAM_NOT_INTEGER_TYPE}, +- #else +- {"PARAM_NOT_INTEGER_TYPE", 15, 124}, +- #endif +- #ifdef CRYPTO_R_PARAM_OF_INCOMPATIBLE_TYPE +- {"PARAM_OF_INCOMPATIBLE_TYPE", ERR_LIB_CRYPTO, CRYPTO_R_PARAM_OF_INCOMPATIBLE_TYPE}, +- #else +- {"PARAM_OF_INCOMPATIBLE_TYPE", 15, 129}, +- #endif +- #ifdef CRYPTO_R_PARAM_UNSIGNED_INTEGER_NEGATIVE_VALUE_UNSUPPORTED +- {"PARAM_UNSIGNED_INTEGER_NEGATIVE_VALUE_UNSUPPORTED", ERR_LIB_CRYPTO, CRYPTO_R_PARAM_UNSIGNED_INTEGER_NEGATIVE_VALUE_UNSUPPORTED}, +- #else +- {"PARAM_UNSIGNED_INTEGER_NEGATIVE_VALUE_UNSUPPORTED", 15, 125}, +- #endif +- #ifdef CRYPTO_R_PARAM_UNSUPPORTED_FLOATING_POINT_FORMAT +- {"PARAM_UNSUPPORTED_FLOATING_POINT_FORMAT", ERR_LIB_CRYPTO, CRYPTO_R_PARAM_UNSUPPORTED_FLOATING_POINT_FORMAT}, +- #else +- {"PARAM_UNSUPPORTED_FLOATING_POINT_FORMAT", 15, 130}, +- #endif +- #ifdef CRYPTO_R_PARAM_VALUE_TOO_LARGE_FOR_DESTINATION +- {"PARAM_VALUE_TOO_LARGE_FOR_DESTINATION", ERR_LIB_CRYPTO, CRYPTO_R_PARAM_VALUE_TOO_LARGE_FOR_DESTINATION}, +- #else +- {"PARAM_VALUE_TOO_LARGE_FOR_DESTINATION", 15, 126}, +- #endif +- #ifdef CRYPTO_R_PROVIDER_ALREADY_EXISTS +- {"PROVIDER_ALREADY_EXISTS", ERR_LIB_CRYPTO, CRYPTO_R_PROVIDER_ALREADY_EXISTS}, +- #else +- {"PROVIDER_ALREADY_EXISTS", 15, 104}, +- #endif +- #ifdef CRYPTO_R_PROVIDER_SECTION_ERROR +- {"PROVIDER_SECTION_ERROR", ERR_LIB_CRYPTO, CRYPTO_R_PROVIDER_SECTION_ERROR}, +- #else +- {"PROVIDER_SECTION_ERROR", 15, 105}, +- #endif +- #ifdef CRYPTO_R_RANDOM_SECTION_ERROR +- {"RANDOM_SECTION_ERROR", ERR_LIB_CRYPTO, CRYPTO_R_RANDOM_SECTION_ERROR}, +- #else +- {"RANDOM_SECTION_ERROR", 15, 119}, +- #endif +- #ifdef CRYPTO_R_SECURE_MALLOC_FAILURE +- {"SECURE_MALLOC_FAILURE", ERR_LIB_CRYPTO, CRYPTO_R_SECURE_MALLOC_FAILURE}, +- #else +- {"SECURE_MALLOC_FAILURE", 15, 111}, +- #endif +- #ifdef CRYPTO_R_STRING_TOO_LONG +- {"STRING_TOO_LONG", ERR_LIB_CRYPTO, CRYPTO_R_STRING_TOO_LONG}, +- #else +- {"STRING_TOO_LONG", 15, 112}, +- #endif +- #ifdef CRYPTO_R_TOO_MANY_BYTES +- {"TOO_MANY_BYTES", ERR_LIB_CRYPTO, CRYPTO_R_TOO_MANY_BYTES}, +- #else +- {"TOO_MANY_BYTES", 15, 113}, +- #endif +- #ifdef CRYPTO_R_TOO_MANY_RECORDS +- {"TOO_MANY_RECORDS", ERR_LIB_CRYPTO, CRYPTO_R_TOO_MANY_RECORDS}, +- #else +- {"TOO_MANY_RECORDS", 15, 114}, +- #endif +- #ifdef CRYPTO_R_TOO_SMALL_BUFFER +- {"TOO_SMALL_BUFFER", ERR_LIB_CRYPTO, CRYPTO_R_TOO_SMALL_BUFFER}, +- #else +- {"TOO_SMALL_BUFFER", 15, 116}, +- #endif +- #ifdef CRYPTO_R_UNKNOWN_NAME_IN_RANDOM_SECTION +- {"UNKNOWN_NAME_IN_RANDOM_SECTION", ERR_LIB_CRYPTO, CRYPTO_R_UNKNOWN_NAME_IN_RANDOM_SECTION}, +- #else +- {"UNKNOWN_NAME_IN_RANDOM_SECTION", 15, 120}, +- #endif +- #ifdef CRYPTO_R_ZERO_LENGTH_NUMBER +- {"ZERO_LENGTH_NUMBER", ERR_LIB_CRYPTO, CRYPTO_R_ZERO_LENGTH_NUMBER}, +- #else +- {"ZERO_LENGTH_NUMBER", 15, 115}, +- #endif +- #ifdef CT_R_BASE64_DECODE_ERROR +- {"BASE64_DECODE_ERROR", ERR_LIB_CT, CT_R_BASE64_DECODE_ERROR}, +- #else +- {"BASE64_DECODE_ERROR", 50, 108}, +- #endif +- #ifdef CT_R_INVALID_LOG_ID_LENGTH +- {"INVALID_LOG_ID_LENGTH", ERR_LIB_CT, CT_R_INVALID_LOG_ID_LENGTH}, +- #else +- {"INVALID_LOG_ID_LENGTH", 50, 100}, +- #endif +- #ifdef CT_R_LOG_CONF_INVALID +- {"LOG_CONF_INVALID", ERR_LIB_CT, CT_R_LOG_CONF_INVALID}, +- #else +- {"LOG_CONF_INVALID", 50, 109}, +- #endif +- #ifdef CT_R_LOG_CONF_INVALID_KEY +- {"LOG_CONF_INVALID_KEY", ERR_LIB_CT, CT_R_LOG_CONF_INVALID_KEY}, +- #else +- {"LOG_CONF_INVALID_KEY", 50, 110}, +- #endif +- #ifdef CT_R_LOG_CONF_MISSING_DESCRIPTION +- {"LOG_CONF_MISSING_DESCRIPTION", ERR_LIB_CT, CT_R_LOG_CONF_MISSING_DESCRIPTION}, +- #else +- {"LOG_CONF_MISSING_DESCRIPTION", 50, 111}, +- #endif +- #ifdef CT_R_LOG_CONF_MISSING_KEY +- {"LOG_CONF_MISSING_KEY", ERR_LIB_CT, CT_R_LOG_CONF_MISSING_KEY}, +- #else +- {"LOG_CONF_MISSING_KEY", 50, 112}, +- #endif +- #ifdef CT_R_LOG_KEY_INVALID +- {"LOG_KEY_INVALID", ERR_LIB_CT, CT_R_LOG_KEY_INVALID}, +- #else +- {"LOG_KEY_INVALID", 50, 113}, +- #endif +- #ifdef CT_R_SCT_FUTURE_TIMESTAMP +- {"SCT_FUTURE_TIMESTAMP", ERR_LIB_CT, CT_R_SCT_FUTURE_TIMESTAMP}, +- #else +- {"SCT_FUTURE_TIMESTAMP", 50, 116}, +- #endif +- #ifdef CT_R_SCT_INVALID +- {"SCT_INVALID", ERR_LIB_CT, CT_R_SCT_INVALID}, +- #else +- {"SCT_INVALID", 50, 104}, +- #endif +- #ifdef CT_R_SCT_INVALID_SIGNATURE +- {"SCT_INVALID_SIGNATURE", ERR_LIB_CT, CT_R_SCT_INVALID_SIGNATURE}, +- #else +- {"SCT_INVALID_SIGNATURE", 50, 107}, +- #endif +- #ifdef CT_R_SCT_LIST_INVALID +- {"SCT_LIST_INVALID", ERR_LIB_CT, CT_R_SCT_LIST_INVALID}, +- #else +- {"SCT_LIST_INVALID", 50, 105}, +- #endif +- #ifdef CT_R_SCT_LOG_ID_MISMATCH +- {"SCT_LOG_ID_MISMATCH", ERR_LIB_CT, CT_R_SCT_LOG_ID_MISMATCH}, +- #else +- {"SCT_LOG_ID_MISMATCH", 50, 114}, +- #endif +- #ifdef CT_R_SCT_NOT_SET +- {"SCT_NOT_SET", ERR_LIB_CT, CT_R_SCT_NOT_SET}, +- #else +- {"SCT_NOT_SET", 50, 106}, +- #endif +- #ifdef CT_R_SCT_UNSUPPORTED_VERSION +- {"SCT_UNSUPPORTED_VERSION", ERR_LIB_CT, CT_R_SCT_UNSUPPORTED_VERSION}, +- #else +- {"SCT_UNSUPPORTED_VERSION", 50, 115}, +- #endif +- #ifdef CT_R_UNRECOGNIZED_SIGNATURE_NID +- {"UNRECOGNIZED_SIGNATURE_NID", ERR_LIB_CT, CT_R_UNRECOGNIZED_SIGNATURE_NID}, +- #else +- {"UNRECOGNIZED_SIGNATURE_NID", 50, 101}, +- #endif +- #ifdef CT_R_UNSUPPORTED_ENTRY_TYPE +- {"UNSUPPORTED_ENTRY_TYPE", ERR_LIB_CT, CT_R_UNSUPPORTED_ENTRY_TYPE}, +- #else +- {"UNSUPPORTED_ENTRY_TYPE", 50, 102}, +- #endif +- #ifdef CT_R_UNSUPPORTED_VERSION +- {"UNSUPPORTED_VERSION", ERR_LIB_CT, CT_R_UNSUPPORTED_VERSION}, +- #else +- {"UNSUPPORTED_VERSION", 50, 103}, +- #endif +- #ifdef DH_R_BAD_FFC_PARAMETERS +- {"BAD_FFC_PARAMETERS", ERR_LIB_DH, DH_R_BAD_FFC_PARAMETERS}, +- #else +- {"BAD_FFC_PARAMETERS", 5, 127}, +- #endif +- #ifdef DH_R_BAD_GENERATOR +- {"BAD_GENERATOR", ERR_LIB_DH, DH_R_BAD_GENERATOR}, +- #else +- {"BAD_GENERATOR", 5, 101}, +- #endif +- #ifdef DH_R_BN_DECODE_ERROR +- {"BN_DECODE_ERROR", ERR_LIB_DH, DH_R_BN_DECODE_ERROR}, +- #else +- {"BN_DECODE_ERROR", 5, 109}, +- #endif +- #ifdef DH_R_BN_ERROR +- {"BN_ERROR", ERR_LIB_DH, DH_R_BN_ERROR}, +- #else +- {"BN_ERROR", 5, 106}, +- #endif +- #ifdef DH_R_CHECK_INVALID_J_VALUE +- {"CHECK_INVALID_J_VALUE", ERR_LIB_DH, DH_R_CHECK_INVALID_J_VALUE}, +- #else +- {"CHECK_INVALID_J_VALUE", 5, 115}, +- #endif +- #ifdef DH_R_CHECK_INVALID_Q_VALUE +- {"CHECK_INVALID_Q_VALUE", ERR_LIB_DH, DH_R_CHECK_INVALID_Q_VALUE}, +- #else +- {"CHECK_INVALID_Q_VALUE", 5, 116}, +- #endif +- #ifdef DH_R_CHECK_PUBKEY_INVALID +- {"CHECK_PUBKEY_INVALID", ERR_LIB_DH, DH_R_CHECK_PUBKEY_INVALID}, +- #else +- {"CHECK_PUBKEY_INVALID", 5, 122}, +- #endif +- #ifdef DH_R_CHECK_PUBKEY_TOO_LARGE +- {"CHECK_PUBKEY_TOO_LARGE", ERR_LIB_DH, DH_R_CHECK_PUBKEY_TOO_LARGE}, +- #else +- {"CHECK_PUBKEY_TOO_LARGE", 5, 123}, +- #endif +- #ifdef DH_R_CHECK_PUBKEY_TOO_SMALL +- {"CHECK_PUBKEY_TOO_SMALL", ERR_LIB_DH, DH_R_CHECK_PUBKEY_TOO_SMALL}, +- #else +- {"CHECK_PUBKEY_TOO_SMALL", 5, 124}, +- #endif +- #ifdef DH_R_CHECK_P_NOT_PRIME +- {"CHECK_P_NOT_PRIME", ERR_LIB_DH, DH_R_CHECK_P_NOT_PRIME}, +- #else +- {"CHECK_P_NOT_PRIME", 5, 117}, +- #endif +- #ifdef DH_R_CHECK_P_NOT_SAFE_PRIME +- {"CHECK_P_NOT_SAFE_PRIME", ERR_LIB_DH, DH_R_CHECK_P_NOT_SAFE_PRIME}, +- #else +- {"CHECK_P_NOT_SAFE_PRIME", 5, 118}, +- #endif +- #ifdef DH_R_CHECK_Q_NOT_PRIME +- {"CHECK_Q_NOT_PRIME", ERR_LIB_DH, DH_R_CHECK_Q_NOT_PRIME}, +- #else +- {"CHECK_Q_NOT_PRIME", 5, 119}, +- #endif +- #ifdef DH_R_DECODE_ERROR +- {"DECODE_ERROR", ERR_LIB_DH, DH_R_DECODE_ERROR}, +- #else +- {"DECODE_ERROR", 5, 104}, +- #endif +- #ifdef DH_R_INVALID_PARAMETER_NAME +- {"INVALID_PARAMETER_NAME", ERR_LIB_DH, DH_R_INVALID_PARAMETER_NAME}, +- #else +- {"INVALID_PARAMETER_NAME", 5, 110}, +- #endif +- #ifdef DH_R_INVALID_PARAMETER_NID +- {"INVALID_PARAMETER_NID", ERR_LIB_DH, DH_R_INVALID_PARAMETER_NID}, +- #else +- {"INVALID_PARAMETER_NID", 5, 114}, +- #endif +- #ifdef DH_R_INVALID_PUBKEY +- {"INVALID_PUBKEY", ERR_LIB_DH, DH_R_INVALID_PUBKEY}, +- #else +- {"INVALID_PUBKEY", 5, 102}, +- #endif +- #ifdef DH_R_INVALID_SECRET +- {"INVALID_SECRET", ERR_LIB_DH, DH_R_INVALID_SECRET}, +- #else +- {"INVALID_SECRET", 5, 128}, +- #endif +- #ifdef DH_R_KDF_PARAMETER_ERROR +- {"KDF_PARAMETER_ERROR", ERR_LIB_DH, DH_R_KDF_PARAMETER_ERROR}, +- #else +- {"KDF_PARAMETER_ERROR", 5, 112}, +- #endif +- #ifdef DH_R_KEYS_NOT_SET +- {"KEYS_NOT_SET", ERR_LIB_DH, DH_R_KEYS_NOT_SET}, +- #else +- {"KEYS_NOT_SET", 5, 108}, +- #endif +- #ifdef DH_R_MISSING_PUBKEY +- {"MISSING_PUBKEY", ERR_LIB_DH, DH_R_MISSING_PUBKEY}, +- #else +- {"MISSING_PUBKEY", 5, 125}, +- #endif +- #ifdef DH_R_MODULUS_TOO_LARGE +- {"MODULUS_TOO_LARGE", ERR_LIB_DH, DH_R_MODULUS_TOO_LARGE}, +- #else +- {"MODULUS_TOO_LARGE", 5, 103}, +- #endif +- #ifdef DH_R_MODULUS_TOO_SMALL +- {"MODULUS_TOO_SMALL", ERR_LIB_DH, DH_R_MODULUS_TOO_SMALL}, +- #else +- {"MODULUS_TOO_SMALL", 5, 126}, +- #endif +- #ifdef DH_R_NOT_SUITABLE_GENERATOR +- {"NOT_SUITABLE_GENERATOR", ERR_LIB_DH, DH_R_NOT_SUITABLE_GENERATOR}, +- #else +- {"NOT_SUITABLE_GENERATOR", 5, 120}, +- #endif +- #ifdef DH_R_NO_PARAMETERS_SET +- {"NO_PARAMETERS_SET", ERR_LIB_DH, DH_R_NO_PARAMETERS_SET}, +- #else +- {"NO_PARAMETERS_SET", 5, 107}, +- #endif +- #ifdef DH_R_NO_PRIVATE_VALUE +- {"NO_PRIVATE_VALUE", ERR_LIB_DH, DH_R_NO_PRIVATE_VALUE}, +- #else +- {"NO_PRIVATE_VALUE", 5, 100}, +- #endif +- #ifdef DH_R_PARAMETER_ENCODING_ERROR +- {"PARAMETER_ENCODING_ERROR", ERR_LIB_DH, DH_R_PARAMETER_ENCODING_ERROR}, +- #else +- {"PARAMETER_ENCODING_ERROR", 5, 105}, +- #endif +- #ifdef DH_R_PEER_KEY_ERROR +- {"PEER_KEY_ERROR", ERR_LIB_DH, DH_R_PEER_KEY_ERROR}, +- #else +- {"PEER_KEY_ERROR", 5, 111}, +- #endif +- #ifdef DH_R_SHARED_INFO_ERROR +- {"SHARED_INFO_ERROR", ERR_LIB_DH, DH_R_SHARED_INFO_ERROR}, +- #else +- {"SHARED_INFO_ERROR", 5, 113}, +- #endif +- #ifdef DH_R_UNABLE_TO_CHECK_GENERATOR +- {"UNABLE_TO_CHECK_GENERATOR", ERR_LIB_DH, DH_R_UNABLE_TO_CHECK_GENERATOR}, +- #else +- {"UNABLE_TO_CHECK_GENERATOR", 5, 121}, +- #endif +- #ifdef DSA_R_BAD_FFC_PARAMETERS +- {"BAD_FFC_PARAMETERS", ERR_LIB_DSA, DSA_R_BAD_FFC_PARAMETERS}, +- #else +- {"BAD_FFC_PARAMETERS", 10, 114}, +- #endif +- #ifdef DSA_R_BAD_Q_VALUE +- {"BAD_Q_VALUE", ERR_LIB_DSA, DSA_R_BAD_Q_VALUE}, +- #else +- {"BAD_Q_VALUE", 10, 102}, +- #endif +- #ifdef DSA_R_BN_DECODE_ERROR +- {"BN_DECODE_ERROR", ERR_LIB_DSA, DSA_R_BN_DECODE_ERROR}, +- #else +- {"BN_DECODE_ERROR", 10, 108}, +- #endif +- #ifdef DSA_R_BN_ERROR +- {"BN_ERROR", ERR_LIB_DSA, DSA_R_BN_ERROR}, +- #else +- {"BN_ERROR", 10, 109}, +- #endif +- #ifdef DSA_R_DECODE_ERROR +- {"DECODE_ERROR", ERR_LIB_DSA, DSA_R_DECODE_ERROR}, +- #else +- {"DECODE_ERROR", 10, 104}, +- #endif +- #ifdef DSA_R_INVALID_DIGEST_TYPE +- {"INVALID_DIGEST_TYPE", ERR_LIB_DSA, DSA_R_INVALID_DIGEST_TYPE}, +- #else +- {"INVALID_DIGEST_TYPE", 10, 106}, +- #endif +- #ifdef DSA_R_INVALID_PARAMETERS +- {"INVALID_PARAMETERS", ERR_LIB_DSA, DSA_R_INVALID_PARAMETERS}, +- #else +- {"INVALID_PARAMETERS", 10, 112}, +- #endif +- #ifdef DSA_R_MISSING_PARAMETERS +- {"MISSING_PARAMETERS", ERR_LIB_DSA, DSA_R_MISSING_PARAMETERS}, +- #else +- {"MISSING_PARAMETERS", 10, 101}, +- #endif +- #ifdef DSA_R_MISSING_PRIVATE_KEY +- {"MISSING_PRIVATE_KEY", ERR_LIB_DSA, DSA_R_MISSING_PRIVATE_KEY}, +- #else +- {"MISSING_PRIVATE_KEY", 10, 111}, +- #endif +- #ifdef DSA_R_MODULUS_TOO_LARGE +- {"MODULUS_TOO_LARGE", ERR_LIB_DSA, DSA_R_MODULUS_TOO_LARGE}, +- #else +- {"MODULUS_TOO_LARGE", 10, 103}, +- #endif +- #ifdef DSA_R_NO_PARAMETERS_SET +- {"NO_PARAMETERS_SET", ERR_LIB_DSA, DSA_R_NO_PARAMETERS_SET}, +- #else +- {"NO_PARAMETERS_SET", 10, 107}, +- #endif +- #ifdef DSA_R_PARAMETER_ENCODING_ERROR +- {"PARAMETER_ENCODING_ERROR", ERR_LIB_DSA, DSA_R_PARAMETER_ENCODING_ERROR}, +- #else +- {"PARAMETER_ENCODING_ERROR", 10, 105}, +- #endif +- #ifdef DSA_R_P_NOT_PRIME +- {"P_NOT_PRIME", ERR_LIB_DSA, DSA_R_P_NOT_PRIME}, +- #else +- {"P_NOT_PRIME", 10, 115}, +- #endif +- #ifdef DSA_R_Q_NOT_PRIME +- {"Q_NOT_PRIME", ERR_LIB_DSA, DSA_R_Q_NOT_PRIME}, +- #else +- {"Q_NOT_PRIME", 10, 113}, +- #endif +- #ifdef DSA_R_SEED_LEN_SMALL +- {"SEED_LEN_SMALL", ERR_LIB_DSA, DSA_R_SEED_LEN_SMALL}, +- #else +- {"SEED_LEN_SMALL", 10, 110}, +- #endif +- #ifdef DSA_R_TOO_MANY_RETRIES +- {"TOO_MANY_RETRIES", ERR_LIB_DSA, DSA_R_TOO_MANY_RETRIES}, +- #else +- {"TOO_MANY_RETRIES", 10, 116}, +- #endif +- #ifdef DSO_R_CTRL_FAILED +- {"CTRL_FAILED", ERR_LIB_DSO, DSO_R_CTRL_FAILED}, +- #else +- {"CTRL_FAILED", 37, 100}, +- #endif +- #ifdef DSO_R_DSO_ALREADY_LOADED +- {"DSO_ALREADY_LOADED", ERR_LIB_DSO, DSO_R_DSO_ALREADY_LOADED}, +- #else +- {"DSO_ALREADY_LOADED", 37, 110}, +- #endif +- #ifdef DSO_R_EMPTY_FILE_STRUCTURE +- {"EMPTY_FILE_STRUCTURE", ERR_LIB_DSO, DSO_R_EMPTY_FILE_STRUCTURE}, +- #else +- {"EMPTY_FILE_STRUCTURE", 37, 113}, +- #endif +- #ifdef DSO_R_FAILURE +- {"FAILURE", ERR_LIB_DSO, DSO_R_FAILURE}, +- #else +- {"FAILURE", 37, 114}, +- #endif +- #ifdef DSO_R_FILENAME_TOO_BIG +- {"FILENAME_TOO_BIG", ERR_LIB_DSO, DSO_R_FILENAME_TOO_BIG}, +- #else +- {"FILENAME_TOO_BIG", 37, 101}, +- #endif +- #ifdef DSO_R_FINISH_FAILED +- {"FINISH_FAILED", ERR_LIB_DSO, DSO_R_FINISH_FAILED}, +- #else +- {"FINISH_FAILED", 37, 102}, +- #endif +- #ifdef DSO_R_INCORRECT_FILE_SYNTAX +- {"INCORRECT_FILE_SYNTAX", ERR_LIB_DSO, DSO_R_INCORRECT_FILE_SYNTAX}, +- #else +- {"INCORRECT_FILE_SYNTAX", 37, 115}, +- #endif +- #ifdef DSO_R_LOAD_FAILED +- {"LOAD_FAILED", ERR_LIB_DSO, DSO_R_LOAD_FAILED}, +- #else +- {"LOAD_FAILED", 37, 103}, +- #endif +- #ifdef DSO_R_NAME_TRANSLATION_FAILED +- {"NAME_TRANSLATION_FAILED", ERR_LIB_DSO, DSO_R_NAME_TRANSLATION_FAILED}, +- #else +- {"NAME_TRANSLATION_FAILED", 37, 109}, +- #endif +- #ifdef DSO_R_NO_FILENAME +- {"NO_FILENAME", ERR_LIB_DSO, DSO_R_NO_FILENAME}, +- #else +- {"NO_FILENAME", 37, 111}, +- #endif +- #ifdef DSO_R_NULL_HANDLE +- {"NULL_HANDLE", ERR_LIB_DSO, DSO_R_NULL_HANDLE}, +- #else +- {"NULL_HANDLE", 37, 104}, +- #endif +- #ifdef DSO_R_SET_FILENAME_FAILED +- {"SET_FILENAME_FAILED", ERR_LIB_DSO, DSO_R_SET_FILENAME_FAILED}, +- #else +- {"SET_FILENAME_FAILED", 37, 112}, +- #endif +- #ifdef DSO_R_STACK_ERROR +- {"STACK_ERROR", ERR_LIB_DSO, DSO_R_STACK_ERROR}, +- #else +- {"STACK_ERROR", 37, 105}, +- #endif +- #ifdef DSO_R_SYM_FAILURE +- {"SYM_FAILURE", ERR_LIB_DSO, DSO_R_SYM_FAILURE}, +- #else +- {"SYM_FAILURE", 37, 106}, +- #endif +- #ifdef DSO_R_UNLOAD_FAILED +- {"UNLOAD_FAILED", ERR_LIB_DSO, DSO_R_UNLOAD_FAILED}, +- #else +- {"UNLOAD_FAILED", 37, 107}, +- #endif +- #ifdef DSO_R_UNSUPPORTED +- {"UNSUPPORTED", ERR_LIB_DSO, DSO_R_UNSUPPORTED}, +- #else +- {"UNSUPPORTED", 37, 108}, +- #endif +- #ifdef EC_R_ASN1_ERROR +- {"ASN1_ERROR", ERR_LIB_EC, EC_R_ASN1_ERROR}, +- #else +- {"ASN1_ERROR", 16, 115}, +- #endif +- #ifdef EC_R_BAD_SIGNATURE +- {"BAD_SIGNATURE", ERR_LIB_EC, EC_R_BAD_SIGNATURE}, +- #else +- {"BAD_SIGNATURE", 16, 156}, +- #endif +- #ifdef EC_R_BIGNUM_OUT_OF_RANGE +- {"BIGNUM_OUT_OF_RANGE", ERR_LIB_EC, EC_R_BIGNUM_OUT_OF_RANGE}, +- #else +- {"BIGNUM_OUT_OF_RANGE", 16, 144}, +- #endif +- #ifdef EC_R_BUFFER_TOO_SMALL +- {"BUFFER_TOO_SMALL", ERR_LIB_EC, EC_R_BUFFER_TOO_SMALL}, +- #else +- {"BUFFER_TOO_SMALL", 16, 100}, +- #endif +- #ifdef EC_R_CANNOT_INVERT +- {"CANNOT_INVERT", ERR_LIB_EC, EC_R_CANNOT_INVERT}, +- #else +- {"CANNOT_INVERT", 16, 165}, +- #endif +- #ifdef EC_R_COORDINATES_OUT_OF_RANGE +- {"COORDINATES_OUT_OF_RANGE", ERR_LIB_EC, EC_R_COORDINATES_OUT_OF_RANGE}, +- #else +- {"COORDINATES_OUT_OF_RANGE", 16, 146}, +- #endif +- #ifdef EC_R_CURVE_DOES_NOT_SUPPORT_ECDH +- {"CURVE_DOES_NOT_SUPPORT_ECDH", ERR_LIB_EC, EC_R_CURVE_DOES_NOT_SUPPORT_ECDH}, +- #else +- {"CURVE_DOES_NOT_SUPPORT_ECDH", 16, 160}, +- #endif +- #ifdef EC_R_CURVE_DOES_NOT_SUPPORT_ECDSA +- {"CURVE_DOES_NOT_SUPPORT_ECDSA", ERR_LIB_EC, EC_R_CURVE_DOES_NOT_SUPPORT_ECDSA}, +- #else +- {"CURVE_DOES_NOT_SUPPORT_ECDSA", 16, 170}, +- #endif +- #ifdef EC_R_CURVE_DOES_NOT_SUPPORT_SIGNING +- {"CURVE_DOES_NOT_SUPPORT_SIGNING", ERR_LIB_EC, EC_R_CURVE_DOES_NOT_SUPPORT_SIGNING}, +- #else +- {"CURVE_DOES_NOT_SUPPORT_SIGNING", 16, 159}, +- #endif +- #ifdef EC_R_DECODE_ERROR +- {"DECODE_ERROR", ERR_LIB_EC, EC_R_DECODE_ERROR}, +- #else +- {"DECODE_ERROR", 16, 142}, +- #endif +- #ifdef EC_R_DISCRIMINANT_IS_ZERO +- {"DISCRIMINANT_IS_ZERO", ERR_LIB_EC, EC_R_DISCRIMINANT_IS_ZERO}, +- #else +- {"DISCRIMINANT_IS_ZERO", 16, 118}, +- #endif +- #ifdef EC_R_EC_GROUP_NEW_BY_NAME_FAILURE +- {"EC_GROUP_NEW_BY_NAME_FAILURE", ERR_LIB_EC, EC_R_EC_GROUP_NEW_BY_NAME_FAILURE}, +- #else +- {"EC_GROUP_NEW_BY_NAME_FAILURE", 16, 119}, +- #endif +- #ifdef EC_R_EXPLICIT_PARAMS_NOT_SUPPORTED +- {"EXPLICIT_PARAMS_NOT_SUPPORTED", ERR_LIB_EC, EC_R_EXPLICIT_PARAMS_NOT_SUPPORTED}, +- #else +- {"EXPLICIT_PARAMS_NOT_SUPPORTED", 16, 127}, +- #endif +- #ifdef EC_R_FAILED_MAKING_PUBLIC_KEY +- {"FAILED_MAKING_PUBLIC_KEY", ERR_LIB_EC, EC_R_FAILED_MAKING_PUBLIC_KEY}, +- #else +- {"FAILED_MAKING_PUBLIC_KEY", 16, 166}, +- #endif +- #ifdef EC_R_FIELD_TOO_LARGE +- {"FIELD_TOO_LARGE", ERR_LIB_EC, EC_R_FIELD_TOO_LARGE}, +- #else +- {"FIELD_TOO_LARGE", 16, 143}, +- #endif +- #ifdef EC_R_GF2M_NOT_SUPPORTED +- {"GF2M_NOT_SUPPORTED", ERR_LIB_EC, EC_R_GF2M_NOT_SUPPORTED}, +- #else +- {"GF2M_NOT_SUPPORTED", 16, 147}, +- #endif +- #ifdef EC_R_GROUP2PKPARAMETERS_FAILURE +- {"GROUP2PKPARAMETERS_FAILURE", ERR_LIB_EC, EC_R_GROUP2PKPARAMETERS_FAILURE}, +- #else +- {"GROUP2PKPARAMETERS_FAILURE", 16, 120}, +- #endif +- #ifdef EC_R_I2D_ECPKPARAMETERS_FAILURE +- {"I2D_ECPKPARAMETERS_FAILURE", ERR_LIB_EC, EC_R_I2D_ECPKPARAMETERS_FAILURE}, +- #else +- {"I2D_ECPKPARAMETERS_FAILURE", 16, 121}, +- #endif +- #ifdef EC_R_INCOMPATIBLE_OBJECTS +- {"INCOMPATIBLE_OBJECTS", ERR_LIB_EC, EC_R_INCOMPATIBLE_OBJECTS}, +- #else +- {"INCOMPATIBLE_OBJECTS", 16, 101}, +- #endif +- #ifdef EC_R_INVALID_A +- {"INVALID_A", ERR_LIB_EC, EC_R_INVALID_A}, +- #else +- {"INVALID_A", 16, 168}, +- #endif +- #ifdef EC_R_INVALID_ARGUMENT +- {"INVALID_ARGUMENT", ERR_LIB_EC, EC_R_INVALID_ARGUMENT}, +- #else +- {"INVALID_ARGUMENT", 16, 112}, +- #endif +- #ifdef EC_R_INVALID_B +- {"INVALID_B", ERR_LIB_EC, EC_R_INVALID_B}, +- #else +- {"INVALID_B", 16, 169}, +- #endif +- #ifdef EC_R_INVALID_COFACTOR +- {"INVALID_COFACTOR", ERR_LIB_EC, EC_R_INVALID_COFACTOR}, +- #else +- {"INVALID_COFACTOR", 16, 171}, +- #endif +- #ifdef EC_R_INVALID_COMPRESSED_POINT +- {"INVALID_COMPRESSED_POINT", ERR_LIB_EC, EC_R_INVALID_COMPRESSED_POINT}, +- #else +- {"INVALID_COMPRESSED_POINT", 16, 110}, +- #endif +- #ifdef EC_R_INVALID_COMPRESSION_BIT +- {"INVALID_COMPRESSION_BIT", ERR_LIB_EC, EC_R_INVALID_COMPRESSION_BIT}, +- #else +- {"INVALID_COMPRESSION_BIT", 16, 109}, +- #endif +- #ifdef EC_R_INVALID_CURVE +- {"INVALID_CURVE", ERR_LIB_EC, EC_R_INVALID_CURVE}, +- #else +- {"INVALID_CURVE", 16, 141}, +- #endif +- #ifdef EC_R_INVALID_DIGEST +- {"INVALID_DIGEST", ERR_LIB_EC, EC_R_INVALID_DIGEST}, +- #else +- {"INVALID_DIGEST", 16, 151}, +- #endif +- #ifdef EC_R_INVALID_DIGEST_TYPE +- {"INVALID_DIGEST_TYPE", ERR_LIB_EC, EC_R_INVALID_DIGEST_TYPE}, +- #else +- {"INVALID_DIGEST_TYPE", 16, 138}, +- #endif +- #ifdef EC_R_INVALID_ENCODING +- {"INVALID_ENCODING", ERR_LIB_EC, EC_R_INVALID_ENCODING}, +- #else +- {"INVALID_ENCODING", 16, 102}, +- #endif +- #ifdef EC_R_INVALID_FIELD +- {"INVALID_FIELD", ERR_LIB_EC, EC_R_INVALID_FIELD}, +- #else +- {"INVALID_FIELD", 16, 103}, +- #endif +- #ifdef EC_R_INVALID_FORM +- {"INVALID_FORM", ERR_LIB_EC, EC_R_INVALID_FORM}, +- #else +- {"INVALID_FORM", 16, 104}, +- #endif +- #ifdef EC_R_INVALID_GENERATOR +- {"INVALID_GENERATOR", ERR_LIB_EC, EC_R_INVALID_GENERATOR}, +- #else +- {"INVALID_GENERATOR", 16, 173}, +- #endif +- #ifdef EC_R_INVALID_GROUP_ORDER +- {"INVALID_GROUP_ORDER", ERR_LIB_EC, EC_R_INVALID_GROUP_ORDER}, +- #else +- {"INVALID_GROUP_ORDER", 16, 122}, +- #endif +- #ifdef EC_R_INVALID_KEY +- {"INVALID_KEY", ERR_LIB_EC, EC_R_INVALID_KEY}, +- #else +- {"INVALID_KEY", 16, 116}, +- #endif +- #ifdef EC_R_INVALID_LENGTH +- {"INVALID_LENGTH", ERR_LIB_EC, EC_R_INVALID_LENGTH}, +- #else +- {"INVALID_LENGTH", 16, 117}, +- #endif +- #ifdef EC_R_INVALID_NAMED_GROUP_CONVERSION +- {"INVALID_NAMED_GROUP_CONVERSION", ERR_LIB_EC, EC_R_INVALID_NAMED_GROUP_CONVERSION}, +- #else +- {"INVALID_NAMED_GROUP_CONVERSION", 16, 174}, +- #endif +- #ifdef EC_R_INVALID_OUTPUT_LENGTH +- {"INVALID_OUTPUT_LENGTH", ERR_LIB_EC, EC_R_INVALID_OUTPUT_LENGTH}, +- #else +- {"INVALID_OUTPUT_LENGTH", 16, 161}, +- #endif +- #ifdef EC_R_INVALID_P +- {"INVALID_P", ERR_LIB_EC, EC_R_INVALID_P}, +- #else +- {"INVALID_P", 16, 172}, +- #endif +- #ifdef EC_R_INVALID_PEER_KEY +- {"INVALID_PEER_KEY", ERR_LIB_EC, EC_R_INVALID_PEER_KEY}, +- #else +- {"INVALID_PEER_KEY", 16, 133}, +- #endif +- #ifdef EC_R_INVALID_PENTANOMIAL_BASIS +- {"INVALID_PENTANOMIAL_BASIS", ERR_LIB_EC, EC_R_INVALID_PENTANOMIAL_BASIS}, +- #else +- {"INVALID_PENTANOMIAL_BASIS", 16, 132}, +- #endif +- #ifdef EC_R_INVALID_PRIVATE_KEY +- {"INVALID_PRIVATE_KEY", ERR_LIB_EC, EC_R_INVALID_PRIVATE_KEY}, +- #else +- {"INVALID_PRIVATE_KEY", 16, 123}, +- #endif +- #ifdef EC_R_INVALID_SEED +- {"INVALID_SEED", ERR_LIB_EC, EC_R_INVALID_SEED}, +- #else +- {"INVALID_SEED", 16, 175}, +- #endif +- #ifdef EC_R_INVALID_TRINOMIAL_BASIS +- {"INVALID_TRINOMIAL_BASIS", ERR_LIB_EC, EC_R_INVALID_TRINOMIAL_BASIS}, +- #else +- {"INVALID_TRINOMIAL_BASIS", 16, 137}, +- #endif +- #ifdef EC_R_KDF_PARAMETER_ERROR +- {"KDF_PARAMETER_ERROR", ERR_LIB_EC, EC_R_KDF_PARAMETER_ERROR}, +- #else +- {"KDF_PARAMETER_ERROR", 16, 148}, +- #endif +- #ifdef EC_R_KEYS_NOT_SET +- {"KEYS_NOT_SET", ERR_LIB_EC, EC_R_KEYS_NOT_SET}, +- #else +- {"KEYS_NOT_SET", 16, 140}, +- #endif +- #ifdef EC_R_LADDER_POST_FAILURE +- {"LADDER_POST_FAILURE", ERR_LIB_EC, EC_R_LADDER_POST_FAILURE}, +- #else +- {"LADDER_POST_FAILURE", 16, 136}, +- #endif +- #ifdef EC_R_LADDER_PRE_FAILURE +- {"LADDER_PRE_FAILURE", ERR_LIB_EC, EC_R_LADDER_PRE_FAILURE}, +- #else +- {"LADDER_PRE_FAILURE", 16, 153}, +- #endif +- #ifdef EC_R_LADDER_STEP_FAILURE +- {"LADDER_STEP_FAILURE", ERR_LIB_EC, EC_R_LADDER_STEP_FAILURE}, +- #else +- {"LADDER_STEP_FAILURE", 16, 162}, +- #endif +- #ifdef EC_R_MISSING_OID +- {"MISSING_OID", ERR_LIB_EC, EC_R_MISSING_OID}, +- #else +- {"MISSING_OID", 16, 167}, +- #endif +- #ifdef EC_R_MISSING_PARAMETERS +- {"MISSING_PARAMETERS", ERR_LIB_EC, EC_R_MISSING_PARAMETERS}, +- #else +- {"MISSING_PARAMETERS", 16, 124}, +- #endif +- #ifdef EC_R_MISSING_PRIVATE_KEY +- {"MISSING_PRIVATE_KEY", ERR_LIB_EC, EC_R_MISSING_PRIVATE_KEY}, +- #else +- {"MISSING_PRIVATE_KEY", 16, 125}, +- #endif +- #ifdef EC_R_NEED_NEW_SETUP_VALUES +- {"NEED_NEW_SETUP_VALUES", ERR_LIB_EC, EC_R_NEED_NEW_SETUP_VALUES}, +- #else +- {"NEED_NEW_SETUP_VALUES", 16, 157}, +- #endif +- #ifdef EC_R_NOT_A_NIST_PRIME +- {"NOT_A_NIST_PRIME", ERR_LIB_EC, EC_R_NOT_A_NIST_PRIME}, +- #else +- {"NOT_A_NIST_PRIME", 16, 135}, +- #endif +- #ifdef EC_R_NOT_IMPLEMENTED +- {"NOT_IMPLEMENTED", ERR_LIB_EC, EC_R_NOT_IMPLEMENTED}, +- #else +- {"NOT_IMPLEMENTED", 16, 126}, +- #endif +- #ifdef EC_R_NOT_INITIALIZED +- {"NOT_INITIALIZED", ERR_LIB_EC, EC_R_NOT_INITIALIZED}, +- #else +- {"NOT_INITIALIZED", 16, 111}, +- #endif +- #ifdef EC_R_NO_PARAMETERS_SET +- {"NO_PARAMETERS_SET", ERR_LIB_EC, EC_R_NO_PARAMETERS_SET}, +- #else +- {"NO_PARAMETERS_SET", 16, 139}, +- #endif +- #ifdef EC_R_NO_PRIVATE_VALUE +- {"NO_PRIVATE_VALUE", ERR_LIB_EC, EC_R_NO_PRIVATE_VALUE}, +- #else +- {"NO_PRIVATE_VALUE", 16, 154}, +- #endif +- #ifdef EC_R_OPERATION_NOT_SUPPORTED +- {"OPERATION_NOT_SUPPORTED", ERR_LIB_EC, EC_R_OPERATION_NOT_SUPPORTED}, +- #else +- {"OPERATION_NOT_SUPPORTED", 16, 152}, +- #endif +- #ifdef EC_R_PASSED_NULL_PARAMETER +- {"PASSED_NULL_PARAMETER", ERR_LIB_EC, EC_R_PASSED_NULL_PARAMETER}, +- #else +- {"PASSED_NULL_PARAMETER", 16, 134}, +- #endif +- #ifdef EC_R_PEER_KEY_ERROR +- {"PEER_KEY_ERROR", ERR_LIB_EC, EC_R_PEER_KEY_ERROR}, +- #else +- {"PEER_KEY_ERROR", 16, 149}, +- #endif +- #ifdef EC_R_POINT_ARITHMETIC_FAILURE +- {"POINT_ARITHMETIC_FAILURE", ERR_LIB_EC, EC_R_POINT_ARITHMETIC_FAILURE}, +- #else +- {"POINT_ARITHMETIC_FAILURE", 16, 155}, +- #endif +- #ifdef EC_R_POINT_AT_INFINITY +- {"POINT_AT_INFINITY", ERR_LIB_EC, EC_R_POINT_AT_INFINITY}, +- #else +- {"POINT_AT_INFINITY", 16, 106}, +- #endif +- #ifdef EC_R_POINT_COORDINATES_BLIND_FAILURE +- {"POINT_COORDINATES_BLIND_FAILURE", ERR_LIB_EC, EC_R_POINT_COORDINATES_BLIND_FAILURE}, +- #else +- {"POINT_COORDINATES_BLIND_FAILURE", 16, 163}, +- #endif +- #ifdef EC_R_POINT_IS_NOT_ON_CURVE +- {"POINT_IS_NOT_ON_CURVE", ERR_LIB_EC, EC_R_POINT_IS_NOT_ON_CURVE}, +- #else +- {"POINT_IS_NOT_ON_CURVE", 16, 107}, +- #endif +- #ifdef EC_R_RANDOM_NUMBER_GENERATION_FAILED +- {"RANDOM_NUMBER_GENERATION_FAILED", ERR_LIB_EC, EC_R_RANDOM_NUMBER_GENERATION_FAILED}, +- #else +- {"RANDOM_NUMBER_GENERATION_FAILED", 16, 158}, +- #endif +- #ifdef EC_R_SHARED_INFO_ERROR +- {"SHARED_INFO_ERROR", ERR_LIB_EC, EC_R_SHARED_INFO_ERROR}, +- #else +- {"SHARED_INFO_ERROR", 16, 150}, +- #endif +- #ifdef EC_R_SLOT_FULL +- {"SLOT_FULL", ERR_LIB_EC, EC_R_SLOT_FULL}, +- #else +- {"SLOT_FULL", 16, 108}, +- #endif +- #ifdef EC_R_TOO_MANY_RETRIES +- {"TOO_MANY_RETRIES", ERR_LIB_EC, EC_R_TOO_MANY_RETRIES}, +- #else +- {"TOO_MANY_RETRIES", 16, 176}, +- #endif +- #ifdef EC_R_UNDEFINED_GENERATOR +- {"UNDEFINED_GENERATOR", ERR_LIB_EC, EC_R_UNDEFINED_GENERATOR}, +- #else +- {"UNDEFINED_GENERATOR", 16, 113}, +- #endif +- #ifdef EC_R_UNDEFINED_ORDER +- {"UNDEFINED_ORDER", ERR_LIB_EC, EC_R_UNDEFINED_ORDER}, +- #else +- {"UNDEFINED_ORDER", 16, 128}, +- #endif +- #ifdef EC_R_UNKNOWN_COFACTOR +- {"UNKNOWN_COFACTOR", ERR_LIB_EC, EC_R_UNKNOWN_COFACTOR}, +- #else +- {"UNKNOWN_COFACTOR", 16, 164}, +- #endif +- #ifdef EC_R_UNKNOWN_GROUP +- {"UNKNOWN_GROUP", ERR_LIB_EC, EC_R_UNKNOWN_GROUP}, +- #else +- {"UNKNOWN_GROUP", 16, 129}, +- #endif +- #ifdef EC_R_UNKNOWN_ORDER +- {"UNKNOWN_ORDER", ERR_LIB_EC, EC_R_UNKNOWN_ORDER}, +- #else +- {"UNKNOWN_ORDER", 16, 114}, +- #endif +- #ifdef EC_R_UNSUPPORTED_FIELD +- {"UNSUPPORTED_FIELD", ERR_LIB_EC, EC_R_UNSUPPORTED_FIELD}, +- #else +- {"UNSUPPORTED_FIELD", 16, 131}, +- #endif +- #ifdef EC_R_WRONG_CURVE_PARAMETERS +- {"WRONG_CURVE_PARAMETERS", ERR_LIB_EC, EC_R_WRONG_CURVE_PARAMETERS}, +- #else +- {"WRONG_CURVE_PARAMETERS", 16, 145}, +- #endif +- #ifdef EC_R_WRONG_ORDER +- {"WRONG_ORDER", ERR_LIB_EC, EC_R_WRONG_ORDER}, +- #else +- {"WRONG_ORDER", 16, 130}, +- #endif +- #ifdef ENGINE_R_ALREADY_LOADED +- {"ALREADY_LOADED", ERR_LIB_ENGINE, ENGINE_R_ALREADY_LOADED}, +- #else +- {"ALREADY_LOADED", 38, 100}, +- #endif +- #ifdef ENGINE_R_ARGUMENT_IS_NOT_A_NUMBER +- {"ARGUMENT_IS_NOT_A_NUMBER", ERR_LIB_ENGINE, ENGINE_R_ARGUMENT_IS_NOT_A_NUMBER}, +- #else +- {"ARGUMENT_IS_NOT_A_NUMBER", 38, 133}, +- #endif +- #ifdef ENGINE_R_CMD_NOT_EXECUTABLE +- {"CMD_NOT_EXECUTABLE", ERR_LIB_ENGINE, ENGINE_R_CMD_NOT_EXECUTABLE}, +- #else +- {"CMD_NOT_EXECUTABLE", 38, 134}, +- #endif +- #ifdef ENGINE_R_COMMAND_TAKES_INPUT +- {"COMMAND_TAKES_INPUT", ERR_LIB_ENGINE, ENGINE_R_COMMAND_TAKES_INPUT}, +- #else +- {"COMMAND_TAKES_INPUT", 38, 135}, +- #endif +- #ifdef ENGINE_R_COMMAND_TAKES_NO_INPUT +- {"COMMAND_TAKES_NO_INPUT", ERR_LIB_ENGINE, ENGINE_R_COMMAND_TAKES_NO_INPUT}, +- #else +- {"COMMAND_TAKES_NO_INPUT", 38, 136}, +- #endif +- #ifdef ENGINE_R_CONFLICTING_ENGINE_ID +- {"CONFLICTING_ENGINE_ID", ERR_LIB_ENGINE, ENGINE_R_CONFLICTING_ENGINE_ID}, +- #else +- {"CONFLICTING_ENGINE_ID", 38, 103}, +- #endif +- #ifdef ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED +- {"CTRL_COMMAND_NOT_IMPLEMENTED", ERR_LIB_ENGINE, ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED}, +- #else +- {"CTRL_COMMAND_NOT_IMPLEMENTED", 38, 119}, +- #endif +- #ifdef ENGINE_R_DSO_FAILURE +- {"DSO_FAILURE", ERR_LIB_ENGINE, ENGINE_R_DSO_FAILURE}, +- #else +- {"DSO_FAILURE", 38, 104}, +- #endif +- #ifdef ENGINE_R_DSO_NOT_FOUND +- {"DSO_NOT_FOUND", ERR_LIB_ENGINE, ENGINE_R_DSO_NOT_FOUND}, +- #else +- {"DSO_NOT_FOUND", 38, 132}, +- #endif +- #ifdef ENGINE_R_ENGINES_SECTION_ERROR +- {"ENGINES_SECTION_ERROR", ERR_LIB_ENGINE, ENGINE_R_ENGINES_SECTION_ERROR}, +- #else +- {"ENGINES_SECTION_ERROR", 38, 148}, +- #endif +- #ifdef ENGINE_R_ENGINE_CONFIGURATION_ERROR +- {"ENGINE_CONFIGURATION_ERROR", ERR_LIB_ENGINE, ENGINE_R_ENGINE_CONFIGURATION_ERROR}, +- #else +- {"ENGINE_CONFIGURATION_ERROR", 38, 102}, +- #endif +- #ifdef ENGINE_R_ENGINE_IS_NOT_IN_LIST +- {"ENGINE_IS_NOT_IN_LIST", ERR_LIB_ENGINE, ENGINE_R_ENGINE_IS_NOT_IN_LIST}, +- #else +- {"ENGINE_IS_NOT_IN_LIST", 38, 105}, +- #endif +- #ifdef ENGINE_R_ENGINE_SECTION_ERROR +- {"ENGINE_SECTION_ERROR", ERR_LIB_ENGINE, ENGINE_R_ENGINE_SECTION_ERROR}, +- #else +- {"ENGINE_SECTION_ERROR", 38, 149}, +- #endif +- #ifdef ENGINE_R_FAILED_LOADING_PRIVATE_KEY +- {"FAILED_LOADING_PRIVATE_KEY", ERR_LIB_ENGINE, ENGINE_R_FAILED_LOADING_PRIVATE_KEY}, +- #else +- {"FAILED_LOADING_PRIVATE_KEY", 38, 128}, +- #endif +- #ifdef ENGINE_R_FAILED_LOADING_PUBLIC_KEY +- {"FAILED_LOADING_PUBLIC_KEY", ERR_LIB_ENGINE, ENGINE_R_FAILED_LOADING_PUBLIC_KEY}, +- #else +- {"FAILED_LOADING_PUBLIC_KEY", 38, 129}, +- #endif +- #ifdef ENGINE_R_FINISH_FAILED +- {"FINISH_FAILED", ERR_LIB_ENGINE, ENGINE_R_FINISH_FAILED}, +- #else +- {"FINISH_FAILED", 38, 106}, +- #endif +- #ifdef ENGINE_R_ID_OR_NAME_MISSING +- {"ID_OR_NAME_MISSING", ERR_LIB_ENGINE, ENGINE_R_ID_OR_NAME_MISSING}, +- #else +- {"ID_OR_NAME_MISSING", 38, 108}, +- #endif +- #ifdef ENGINE_R_INIT_FAILED +- {"INIT_FAILED", ERR_LIB_ENGINE, ENGINE_R_INIT_FAILED}, +- #else +- {"INIT_FAILED", 38, 109}, +- #endif +- #ifdef ENGINE_R_INTERNAL_LIST_ERROR +- {"INTERNAL_LIST_ERROR", ERR_LIB_ENGINE, ENGINE_R_INTERNAL_LIST_ERROR}, +- #else +- {"INTERNAL_LIST_ERROR", 38, 110}, +- #endif +- #ifdef ENGINE_R_INVALID_ARGUMENT +- {"INVALID_ARGUMENT", ERR_LIB_ENGINE, ENGINE_R_INVALID_ARGUMENT}, +- #else +- {"INVALID_ARGUMENT", 38, 143}, +- #endif +- #ifdef ENGINE_R_INVALID_CMD_NAME +- {"INVALID_CMD_NAME", ERR_LIB_ENGINE, ENGINE_R_INVALID_CMD_NAME}, +- #else +- {"INVALID_CMD_NAME", 38, 137}, +- #endif +- #ifdef ENGINE_R_INVALID_CMD_NUMBER +- {"INVALID_CMD_NUMBER", ERR_LIB_ENGINE, ENGINE_R_INVALID_CMD_NUMBER}, +- #else +- {"INVALID_CMD_NUMBER", 38, 138}, +- #endif +- #ifdef ENGINE_R_INVALID_INIT_VALUE +- {"INVALID_INIT_VALUE", ERR_LIB_ENGINE, ENGINE_R_INVALID_INIT_VALUE}, +- #else +- {"INVALID_INIT_VALUE", 38, 151}, +- #endif +- #ifdef ENGINE_R_INVALID_STRING +- {"INVALID_STRING", ERR_LIB_ENGINE, ENGINE_R_INVALID_STRING}, +- #else +- {"INVALID_STRING", 38, 150}, +- #endif +- #ifdef ENGINE_R_NOT_INITIALISED +- {"NOT_INITIALISED", ERR_LIB_ENGINE, ENGINE_R_NOT_INITIALISED}, +- #else +- {"NOT_INITIALISED", 38, 117}, +- #endif +- #ifdef ENGINE_R_NOT_LOADED +- {"NOT_LOADED", ERR_LIB_ENGINE, ENGINE_R_NOT_LOADED}, +- #else +- {"NOT_LOADED", 38, 112}, +- #endif +- #ifdef ENGINE_R_NO_CONTROL_FUNCTION +- {"NO_CONTROL_FUNCTION", ERR_LIB_ENGINE, ENGINE_R_NO_CONTROL_FUNCTION}, +- #else +- {"NO_CONTROL_FUNCTION", 38, 120}, +- #endif +- #ifdef ENGINE_R_NO_INDEX +- {"NO_INDEX", ERR_LIB_ENGINE, ENGINE_R_NO_INDEX}, +- #else +- {"NO_INDEX", 38, 144}, +- #endif +- #ifdef ENGINE_R_NO_LOAD_FUNCTION +- {"NO_LOAD_FUNCTION", ERR_LIB_ENGINE, ENGINE_R_NO_LOAD_FUNCTION}, +- #else +- {"NO_LOAD_FUNCTION", 38, 125}, +- #endif +- #ifdef ENGINE_R_NO_REFERENCE +- {"NO_REFERENCE", ERR_LIB_ENGINE, ENGINE_R_NO_REFERENCE}, +- #else +- {"NO_REFERENCE", 38, 130}, +- #endif +- #ifdef ENGINE_R_NO_SUCH_ENGINE +- {"NO_SUCH_ENGINE", ERR_LIB_ENGINE, ENGINE_R_NO_SUCH_ENGINE}, +- #else +- {"NO_SUCH_ENGINE", 38, 116}, +- #endif +- #ifdef ENGINE_R_UNIMPLEMENTED_CIPHER +- {"UNIMPLEMENTED_CIPHER", ERR_LIB_ENGINE, ENGINE_R_UNIMPLEMENTED_CIPHER}, +- #else +- {"UNIMPLEMENTED_CIPHER", 38, 146}, +- #endif +- #ifdef ENGINE_R_UNIMPLEMENTED_DIGEST +- {"UNIMPLEMENTED_DIGEST", ERR_LIB_ENGINE, ENGINE_R_UNIMPLEMENTED_DIGEST}, +- #else +- {"UNIMPLEMENTED_DIGEST", 38, 147}, +- #endif +- #ifdef ENGINE_R_UNIMPLEMENTED_PUBLIC_KEY_METHOD +- {"UNIMPLEMENTED_PUBLIC_KEY_METHOD", ERR_LIB_ENGINE, ENGINE_R_UNIMPLEMENTED_PUBLIC_KEY_METHOD}, +- #else +- {"UNIMPLEMENTED_PUBLIC_KEY_METHOD", 38, 101}, +- #endif +- #ifdef ENGINE_R_VERSION_INCOMPATIBILITY +- {"VERSION_INCOMPATIBILITY", ERR_LIB_ENGINE, ENGINE_R_VERSION_INCOMPATIBILITY}, +- #else +- {"VERSION_INCOMPATIBILITY", 38, 145}, +- #endif +- #ifdef ESS_R_EMPTY_ESS_CERT_ID_LIST +- {"EMPTY_ESS_CERT_ID_LIST", ERR_LIB_ESS, ESS_R_EMPTY_ESS_CERT_ID_LIST}, +- #else +- {"EMPTY_ESS_CERT_ID_LIST", 54, 107}, +- #endif +- #ifdef ESS_R_ESS_CERT_DIGEST_ERROR +- {"ESS_CERT_DIGEST_ERROR", ERR_LIB_ESS, ESS_R_ESS_CERT_DIGEST_ERROR}, +- #else +- {"ESS_CERT_DIGEST_ERROR", 54, 103}, +- #endif +- #ifdef ESS_R_ESS_CERT_ID_NOT_FOUND +- {"ESS_CERT_ID_NOT_FOUND", ERR_LIB_ESS, ESS_R_ESS_CERT_ID_NOT_FOUND}, +- #else +- {"ESS_CERT_ID_NOT_FOUND", 54, 104}, +- #endif +- #ifdef ESS_R_ESS_CERT_ID_WRONG_ORDER +- {"ESS_CERT_ID_WRONG_ORDER", ERR_LIB_ESS, ESS_R_ESS_CERT_ID_WRONG_ORDER}, +- #else +- {"ESS_CERT_ID_WRONG_ORDER", 54, 105}, +- #endif +- #ifdef ESS_R_ESS_DIGEST_ALG_UNKNOWN +- {"ESS_DIGEST_ALG_UNKNOWN", ERR_LIB_ESS, ESS_R_ESS_DIGEST_ALG_UNKNOWN}, +- #else +- {"ESS_DIGEST_ALG_UNKNOWN", 54, 106}, +- #endif +- #ifdef ESS_R_ESS_SIGNING_CERTIFICATE_ERROR +- {"ESS_SIGNING_CERTIFICATE_ERROR", ERR_LIB_ESS, ESS_R_ESS_SIGNING_CERTIFICATE_ERROR}, +- #else +- {"ESS_SIGNING_CERTIFICATE_ERROR", 54, 102}, +- #endif +- #ifdef ESS_R_ESS_SIGNING_CERT_ADD_ERROR +- {"ESS_SIGNING_CERT_ADD_ERROR", ERR_LIB_ESS, ESS_R_ESS_SIGNING_CERT_ADD_ERROR}, +- #else +- {"ESS_SIGNING_CERT_ADD_ERROR", 54, 100}, +- #endif +- #ifdef ESS_R_ESS_SIGNING_CERT_V2_ADD_ERROR +- {"ESS_SIGNING_CERT_V2_ADD_ERROR", ERR_LIB_ESS, ESS_R_ESS_SIGNING_CERT_V2_ADD_ERROR}, +- #else +- {"ESS_SIGNING_CERT_V2_ADD_ERROR", 54, 101}, +- #endif +- #ifdef ESS_R_MISSING_SIGNING_CERTIFICATE_ATTRIBUTE +- {"MISSING_SIGNING_CERTIFICATE_ATTRIBUTE", ERR_LIB_ESS, ESS_R_MISSING_SIGNING_CERTIFICATE_ATTRIBUTE}, +- #else +- {"MISSING_SIGNING_CERTIFICATE_ATTRIBUTE", 54, 108}, +- #endif +- #ifdef EVP_R_AES_KEY_SETUP_FAILED +- {"AES_KEY_SETUP_FAILED", ERR_LIB_EVP, EVP_R_AES_KEY_SETUP_FAILED}, +- #else +- {"AES_KEY_SETUP_FAILED", 6, 143}, +- #endif +- #ifdef EVP_R_ARIA_KEY_SETUP_FAILED +- {"ARIA_KEY_SETUP_FAILED", ERR_LIB_EVP, EVP_R_ARIA_KEY_SETUP_FAILED}, +- #else +- {"ARIA_KEY_SETUP_FAILED", 6, 176}, +- #endif +- #ifdef EVP_R_BAD_ALGORITHM_NAME +- {"BAD_ALGORITHM_NAME", ERR_LIB_EVP, EVP_R_BAD_ALGORITHM_NAME}, +- #else +- {"BAD_ALGORITHM_NAME", 6, 200}, +- #endif +- #ifdef EVP_R_BAD_DECRYPT +- {"BAD_DECRYPT", ERR_LIB_EVP, EVP_R_BAD_DECRYPT}, +- #else +- {"BAD_DECRYPT", 6, 100}, +- #endif +- #ifdef EVP_R_BAD_KEY_LENGTH +- {"BAD_KEY_LENGTH", ERR_LIB_EVP, EVP_R_BAD_KEY_LENGTH}, +- #else +- {"BAD_KEY_LENGTH", 6, 195}, +- #endif +- #ifdef EVP_R_BUFFER_TOO_SMALL +- {"BUFFER_TOO_SMALL", ERR_LIB_EVP, EVP_R_BUFFER_TOO_SMALL}, +- #else +- {"BUFFER_TOO_SMALL", 6, 155}, +- #endif +- #ifdef EVP_R_CACHE_CONSTANTS_FAILED +- {"CACHE_CONSTANTS_FAILED", ERR_LIB_EVP, EVP_R_CACHE_CONSTANTS_FAILED}, +- #else +- {"CACHE_CONSTANTS_FAILED", 6, 225}, +- #endif +- #ifdef EVP_R_CAMELLIA_KEY_SETUP_FAILED +- {"CAMELLIA_KEY_SETUP_FAILED", ERR_LIB_EVP, EVP_R_CAMELLIA_KEY_SETUP_FAILED}, +- #else +- {"CAMELLIA_KEY_SETUP_FAILED", 6, 157}, +- #endif +- #ifdef EVP_R_CANNOT_GET_PARAMETERS +- {"CANNOT_GET_PARAMETERS", ERR_LIB_EVP, EVP_R_CANNOT_GET_PARAMETERS}, +- #else +- {"CANNOT_GET_PARAMETERS", 6, 197}, +- #endif +- #ifdef EVP_R_CANNOT_SET_PARAMETERS +- {"CANNOT_SET_PARAMETERS", ERR_LIB_EVP, EVP_R_CANNOT_SET_PARAMETERS}, +- #else +- {"CANNOT_SET_PARAMETERS", 6, 198}, +- #endif +- #ifdef EVP_R_CIPHER_NOT_GCM_MODE +- {"CIPHER_NOT_GCM_MODE", ERR_LIB_EVP, EVP_R_CIPHER_NOT_GCM_MODE}, +- #else +- {"CIPHER_NOT_GCM_MODE", 6, 184}, +- #endif +- #ifdef EVP_R_CIPHER_PARAMETER_ERROR +- {"CIPHER_PARAMETER_ERROR", ERR_LIB_EVP, EVP_R_CIPHER_PARAMETER_ERROR}, +- #else +- {"CIPHER_PARAMETER_ERROR", 6, 122}, +- #endif +- #ifdef EVP_R_COMMAND_NOT_SUPPORTED +- {"COMMAND_NOT_SUPPORTED", ERR_LIB_EVP, EVP_R_COMMAND_NOT_SUPPORTED}, +- #else +- {"COMMAND_NOT_SUPPORTED", 6, 147}, +- #endif +- #ifdef EVP_R_CONFLICTING_ALGORITHM_NAME +- {"CONFLICTING_ALGORITHM_NAME", ERR_LIB_EVP, EVP_R_CONFLICTING_ALGORITHM_NAME}, +- #else +- {"CONFLICTING_ALGORITHM_NAME", 6, 201}, +- #endif +- #ifdef EVP_R_COPY_ERROR +- {"COPY_ERROR", ERR_LIB_EVP, EVP_R_COPY_ERROR}, +- #else +- {"COPY_ERROR", 6, 173}, +- #endif +- #ifdef EVP_R_CTRL_NOT_IMPLEMENTED +- {"CTRL_NOT_IMPLEMENTED", ERR_LIB_EVP, EVP_R_CTRL_NOT_IMPLEMENTED}, +- #else +- {"CTRL_NOT_IMPLEMENTED", 6, 132}, +- #endif +- #ifdef EVP_R_CTRL_OPERATION_NOT_IMPLEMENTED +- {"CTRL_OPERATION_NOT_IMPLEMENTED", ERR_LIB_EVP, EVP_R_CTRL_OPERATION_NOT_IMPLEMENTED}, +- #else +- {"CTRL_OPERATION_NOT_IMPLEMENTED", 6, 133}, +- #endif +- #ifdef EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH +- {"DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH", ERR_LIB_EVP, EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH}, +- #else +- {"DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH", 6, 138}, +- #endif +- #ifdef EVP_R_DECODE_ERROR +- {"DECODE_ERROR", ERR_LIB_EVP, EVP_R_DECODE_ERROR}, +- #else +- {"DECODE_ERROR", 6, 114}, +- #endif +- #ifdef EVP_R_DEFAULT_QUERY_PARSE_ERROR +- {"DEFAULT_QUERY_PARSE_ERROR", ERR_LIB_EVP, EVP_R_DEFAULT_QUERY_PARSE_ERROR}, +- #else +- {"DEFAULT_QUERY_PARSE_ERROR", 6, 210}, +- #endif +- #ifdef EVP_R_DIFFERENT_KEY_TYPES +- {"DIFFERENT_KEY_TYPES", ERR_LIB_EVP, EVP_R_DIFFERENT_KEY_TYPES}, +- #else +- {"DIFFERENT_KEY_TYPES", 6, 101}, +- #endif +- #ifdef EVP_R_DIFFERENT_PARAMETERS +- {"DIFFERENT_PARAMETERS", ERR_LIB_EVP, EVP_R_DIFFERENT_PARAMETERS}, +- #else +- {"DIFFERENT_PARAMETERS", 6, 153}, +- #endif +- #ifdef EVP_R_ERROR_LOADING_SECTION +- {"ERROR_LOADING_SECTION", ERR_LIB_EVP, EVP_R_ERROR_LOADING_SECTION}, +- #else +- {"ERROR_LOADING_SECTION", 6, 165}, +- #endif +- #ifdef EVP_R_EXPECTING_AN_HMAC_KEY +- {"EXPECTING_AN_HMAC_KEY", ERR_LIB_EVP, EVP_R_EXPECTING_AN_HMAC_KEY}, +- #else +- {"EXPECTING_AN_HMAC_KEY", 6, 174}, +- #endif +- #ifdef EVP_R_EXPECTING_AN_RSA_KEY +- {"EXPECTING_AN_RSA_KEY", ERR_LIB_EVP, EVP_R_EXPECTING_AN_RSA_KEY}, +- #else +- {"EXPECTING_AN_RSA_KEY", 6, 127}, +- #endif +- #ifdef EVP_R_EXPECTING_A_DH_KEY +- {"EXPECTING_A_DH_KEY", ERR_LIB_EVP, EVP_R_EXPECTING_A_DH_KEY}, +- #else +- {"EXPECTING_A_DH_KEY", 6, 128}, +- #endif +- #ifdef EVP_R_EXPECTING_A_DSA_KEY +- {"EXPECTING_A_DSA_KEY", ERR_LIB_EVP, EVP_R_EXPECTING_A_DSA_KEY}, +- #else +- {"EXPECTING_A_DSA_KEY", 6, 129}, +- #endif +- #ifdef EVP_R_EXPECTING_A_ECX_KEY +- {"EXPECTING_A_ECX_KEY", ERR_LIB_EVP, EVP_R_EXPECTING_A_ECX_KEY}, +- #else +- {"EXPECTING_A_ECX_KEY", 6, 219}, +- #endif +- #ifdef EVP_R_EXPECTING_A_EC_KEY +- {"EXPECTING_A_EC_KEY", ERR_LIB_EVP, EVP_R_EXPECTING_A_EC_KEY}, +- #else +- {"EXPECTING_A_EC_KEY", 6, 142}, +- #endif +- #ifdef EVP_R_EXPECTING_A_POLY1305_KEY +- {"EXPECTING_A_POLY1305_KEY", ERR_LIB_EVP, EVP_R_EXPECTING_A_POLY1305_KEY}, +- #else +- {"EXPECTING_A_POLY1305_KEY", 6, 164}, +- #endif +- #ifdef EVP_R_EXPECTING_A_SIPHASH_KEY +- {"EXPECTING_A_SIPHASH_KEY", ERR_LIB_EVP, EVP_R_EXPECTING_A_SIPHASH_KEY}, +- #else +- {"EXPECTING_A_SIPHASH_KEY", 6, 175}, +- #endif +- #ifdef EVP_R_FINAL_ERROR +- {"FINAL_ERROR", ERR_LIB_EVP, EVP_R_FINAL_ERROR}, +- #else +- {"FINAL_ERROR", 6, 188}, +- #endif +- #ifdef EVP_R_GENERATE_ERROR +- {"GENERATE_ERROR", ERR_LIB_EVP, EVP_R_GENERATE_ERROR}, +- #else +- {"GENERATE_ERROR", 6, 214}, +- #endif +- #ifdef EVP_R_GET_RAW_KEY_FAILED +- {"GET_RAW_KEY_FAILED", ERR_LIB_EVP, EVP_R_GET_RAW_KEY_FAILED}, +- #else +- {"GET_RAW_KEY_FAILED", 6, 182}, +- #endif +- #ifdef EVP_R_ILLEGAL_SCRYPT_PARAMETERS +- {"ILLEGAL_SCRYPT_PARAMETERS", ERR_LIB_EVP, EVP_R_ILLEGAL_SCRYPT_PARAMETERS}, +- #else +- {"ILLEGAL_SCRYPT_PARAMETERS", 6, 171}, +- #endif +- #ifdef EVP_R_INACCESSIBLE_DOMAIN_PARAMETERS +- {"INACCESSIBLE_DOMAIN_PARAMETERS", ERR_LIB_EVP, EVP_R_INACCESSIBLE_DOMAIN_PARAMETERS}, +- #else +- {"INACCESSIBLE_DOMAIN_PARAMETERS", 6, 204}, +- #endif +- #ifdef EVP_R_INACCESSIBLE_KEY +- {"INACCESSIBLE_KEY", ERR_LIB_EVP, EVP_R_INACCESSIBLE_KEY}, +- #else +- {"INACCESSIBLE_KEY", 6, 203}, +- #endif +- #ifdef EVP_R_INITIALIZATION_ERROR +- {"INITIALIZATION_ERROR", ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR}, +- #else +- {"INITIALIZATION_ERROR", 6, 134}, +- #endif +- #ifdef EVP_R_INPUT_NOT_INITIALIZED +- {"INPUT_NOT_INITIALIZED", ERR_LIB_EVP, EVP_R_INPUT_NOT_INITIALIZED}, +- #else +- {"INPUT_NOT_INITIALIZED", 6, 111}, +- #endif +- #ifdef EVP_R_INVALID_CUSTOM_LENGTH +- {"INVALID_CUSTOM_LENGTH", ERR_LIB_EVP, EVP_R_INVALID_CUSTOM_LENGTH}, +- #else +- {"INVALID_CUSTOM_LENGTH", 6, 185}, +- #endif +- #ifdef EVP_R_INVALID_DIGEST +- {"INVALID_DIGEST", ERR_LIB_EVP, EVP_R_INVALID_DIGEST}, +- #else +- {"INVALID_DIGEST", 6, 152}, +- #endif +- #ifdef EVP_R_INVALID_IV_LENGTH +- {"INVALID_IV_LENGTH", ERR_LIB_EVP, EVP_R_INVALID_IV_LENGTH}, +- #else +- {"INVALID_IV_LENGTH", 6, 194}, +- #endif +- #ifdef EVP_R_INVALID_KEY +- {"INVALID_KEY", ERR_LIB_EVP, EVP_R_INVALID_KEY}, +- #else +- {"INVALID_KEY", 6, 163}, +- #endif +- #ifdef EVP_R_INVALID_KEY_LENGTH +- {"INVALID_KEY_LENGTH", ERR_LIB_EVP, EVP_R_INVALID_KEY_LENGTH}, +- #else +- {"INVALID_KEY_LENGTH", 6, 130}, +- #endif +- #ifdef EVP_R_INVALID_LENGTH +- {"INVALID_LENGTH", ERR_LIB_EVP, EVP_R_INVALID_LENGTH}, +- #else +- {"INVALID_LENGTH", 6, 221}, +- #endif +- #ifdef EVP_R_INVALID_NULL_ALGORITHM +- {"INVALID_NULL_ALGORITHM", ERR_LIB_EVP, EVP_R_INVALID_NULL_ALGORITHM}, +- #else +- {"INVALID_NULL_ALGORITHM", 6, 218}, +- #endif +- #ifdef EVP_R_INVALID_OPERATION +- {"INVALID_OPERATION", ERR_LIB_EVP, EVP_R_INVALID_OPERATION}, +- #else +- {"INVALID_OPERATION", 6, 148}, +- #endif +- #ifdef EVP_R_INVALID_PROVIDER_FUNCTIONS +- {"INVALID_PROVIDER_FUNCTIONS", ERR_LIB_EVP, EVP_R_INVALID_PROVIDER_FUNCTIONS}, +- #else +- {"INVALID_PROVIDER_FUNCTIONS", 6, 193}, +- #endif +- #ifdef EVP_R_INVALID_SALT_LENGTH +- {"INVALID_SALT_LENGTH", ERR_LIB_EVP, EVP_R_INVALID_SALT_LENGTH}, +- #else +- {"INVALID_SALT_LENGTH", 6, 186}, +- #endif +- #ifdef EVP_R_INVALID_SECRET_LENGTH +- {"INVALID_SECRET_LENGTH", ERR_LIB_EVP, EVP_R_INVALID_SECRET_LENGTH}, +- #else +- {"INVALID_SECRET_LENGTH", 6, 223}, +- #endif +- #ifdef EVP_R_INVALID_SEED_LENGTH +- {"INVALID_SEED_LENGTH", ERR_LIB_EVP, EVP_R_INVALID_SEED_LENGTH}, +- #else +- {"INVALID_SEED_LENGTH", 6, 220}, +- #endif +- #ifdef EVP_R_INVALID_VALUE +- {"INVALID_VALUE", ERR_LIB_EVP, EVP_R_INVALID_VALUE}, +- #else +- {"INVALID_VALUE", 6, 222}, +- #endif +- #ifdef EVP_R_KEYMGMT_EXPORT_FAILURE +- {"KEYMGMT_EXPORT_FAILURE", ERR_LIB_EVP, EVP_R_KEYMGMT_EXPORT_FAILURE}, +- #else +- {"KEYMGMT_EXPORT_FAILURE", 6, 205}, +- #endif +- #ifdef EVP_R_KEY_SETUP_FAILED +- {"KEY_SETUP_FAILED", ERR_LIB_EVP, EVP_R_KEY_SETUP_FAILED}, +- #else +- {"KEY_SETUP_FAILED", 6, 180}, +- #endif +- #ifdef EVP_R_LOCKING_NOT_SUPPORTED +- {"LOCKING_NOT_SUPPORTED", ERR_LIB_EVP, EVP_R_LOCKING_NOT_SUPPORTED}, +- #else +- {"LOCKING_NOT_SUPPORTED", 6, 213}, +- #endif +- #ifdef EVP_R_MEMORY_LIMIT_EXCEEDED +- {"MEMORY_LIMIT_EXCEEDED", ERR_LIB_EVP, EVP_R_MEMORY_LIMIT_EXCEEDED}, +- #else +- {"MEMORY_LIMIT_EXCEEDED", 6, 172}, +- #endif +- #ifdef EVP_R_MESSAGE_DIGEST_IS_NULL +- {"MESSAGE_DIGEST_IS_NULL", ERR_LIB_EVP, EVP_R_MESSAGE_DIGEST_IS_NULL}, +- #else +- {"MESSAGE_DIGEST_IS_NULL", 6, 159}, +- #endif +- #ifdef EVP_R_METHOD_NOT_SUPPORTED +- {"METHOD_NOT_SUPPORTED", ERR_LIB_EVP, EVP_R_METHOD_NOT_SUPPORTED}, +- #else +- {"METHOD_NOT_SUPPORTED", 6, 144}, +- #endif +- #ifdef EVP_R_MISSING_PARAMETERS +- {"MISSING_PARAMETERS", ERR_LIB_EVP, EVP_R_MISSING_PARAMETERS}, +- #else +- {"MISSING_PARAMETERS", 6, 103}, +- #endif +- #ifdef EVP_R_NOT_ABLE_TO_COPY_CTX +- {"NOT_ABLE_TO_COPY_CTX", ERR_LIB_EVP, EVP_R_NOT_ABLE_TO_COPY_CTX}, +- #else +- {"NOT_ABLE_TO_COPY_CTX", 6, 190}, +- #endif +- #ifdef EVP_R_NOT_XOF_OR_INVALID_LENGTH +- {"NOT_XOF_OR_INVALID_LENGTH", ERR_LIB_EVP, EVP_R_NOT_XOF_OR_INVALID_LENGTH}, +- #else +- {"NOT_XOF_OR_INVALID_LENGTH", 6, 178}, +- #endif +- #ifdef EVP_R_NO_CIPHER_SET +- {"NO_CIPHER_SET", ERR_LIB_EVP, EVP_R_NO_CIPHER_SET}, +- #else +- {"NO_CIPHER_SET", 6, 131}, +- #endif +- #ifdef EVP_R_NO_DEFAULT_DIGEST +- {"NO_DEFAULT_DIGEST", ERR_LIB_EVP, EVP_R_NO_DEFAULT_DIGEST}, +- #else +- {"NO_DEFAULT_DIGEST", 6, 158}, +- #endif +- #ifdef EVP_R_NO_DIGEST_SET +- {"NO_DIGEST_SET", ERR_LIB_EVP, EVP_R_NO_DIGEST_SET}, +- #else +- {"NO_DIGEST_SET", 6, 139}, +- #endif +- #ifdef EVP_R_NO_IMPORT_FUNCTION +- {"NO_IMPORT_FUNCTION", ERR_LIB_EVP, EVP_R_NO_IMPORT_FUNCTION}, +- #else +- {"NO_IMPORT_FUNCTION", 6, 206}, +- #endif +- #ifdef EVP_R_NO_KEYMGMT_AVAILABLE +- {"NO_KEYMGMT_AVAILABLE", ERR_LIB_EVP, EVP_R_NO_KEYMGMT_AVAILABLE}, +- #else +- {"NO_KEYMGMT_AVAILABLE", 6, 199}, +- #endif +- #ifdef EVP_R_NO_KEYMGMT_PRESENT +- {"NO_KEYMGMT_PRESENT", ERR_LIB_EVP, EVP_R_NO_KEYMGMT_PRESENT}, +- #else +- {"NO_KEYMGMT_PRESENT", 6, 196}, +- #endif +- #ifdef EVP_R_NO_KEY_SET +- {"NO_KEY_SET", ERR_LIB_EVP, EVP_R_NO_KEY_SET}, +- #else +- {"NO_KEY_SET", 6, 154}, +- #endif +- #ifdef EVP_R_NO_OPERATION_SET +- {"NO_OPERATION_SET", ERR_LIB_EVP, EVP_R_NO_OPERATION_SET}, +- #else +- {"NO_OPERATION_SET", 6, 149}, +- #endif +- #ifdef EVP_R_NULL_MAC_PKEY_CTX +- {"NULL_MAC_PKEY_CTX", ERR_LIB_EVP, EVP_R_NULL_MAC_PKEY_CTX}, +- #else +- {"NULL_MAC_PKEY_CTX", 6, 208}, +- #endif +- #ifdef EVP_R_ONLY_ONESHOT_SUPPORTED +- {"ONLY_ONESHOT_SUPPORTED", ERR_LIB_EVP, EVP_R_ONLY_ONESHOT_SUPPORTED}, +- #else +- {"ONLY_ONESHOT_SUPPORTED", 6, 177}, +- #endif +- #ifdef EVP_R_OPERATION_NOT_INITIALIZED +- {"OPERATION_NOT_INITIALIZED", ERR_LIB_EVP, EVP_R_OPERATION_NOT_INITIALIZED}, +- #else +- {"OPERATION_NOT_INITIALIZED", 6, 151}, +- #endif +- #ifdef EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE +- {"OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE", ERR_LIB_EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE}, +- #else +- {"OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE", 6, 150}, +- #endif +- #ifdef EVP_R_OUTPUT_WOULD_OVERFLOW +- {"OUTPUT_WOULD_OVERFLOW", ERR_LIB_EVP, EVP_R_OUTPUT_WOULD_OVERFLOW}, +- #else +- {"OUTPUT_WOULD_OVERFLOW", 6, 202}, +- #endif +- #ifdef EVP_R_PARAMETER_TOO_LARGE +- {"PARAMETER_TOO_LARGE", ERR_LIB_EVP, EVP_R_PARAMETER_TOO_LARGE}, +- #else +- {"PARAMETER_TOO_LARGE", 6, 187}, +- #endif +- #ifdef EVP_R_PARTIALLY_OVERLAPPING +- {"PARTIALLY_OVERLAPPING", ERR_LIB_EVP, EVP_R_PARTIALLY_OVERLAPPING}, +- #else +- {"PARTIALLY_OVERLAPPING", 6, 162}, +- #endif +- #ifdef EVP_R_PBKDF2_ERROR +- {"PBKDF2_ERROR", ERR_LIB_EVP, EVP_R_PBKDF2_ERROR}, +- #else +- {"PBKDF2_ERROR", 6, 181}, +- #endif +- #ifdef EVP_R_PKEY_APPLICATION_ASN1_METHOD_ALREADY_REGISTERED +- {"PKEY_APPLICATION_ASN1_METHOD_ALREADY_REGISTERED", ERR_LIB_EVP, EVP_R_PKEY_APPLICATION_ASN1_METHOD_ALREADY_REGISTERED}, +- #else +- {"PKEY_APPLICATION_ASN1_METHOD_ALREADY_REGISTERED", 6, 179}, +- #endif +- #ifdef EVP_R_PRIVATE_KEY_DECODE_ERROR +- {"PRIVATE_KEY_DECODE_ERROR", ERR_LIB_EVP, EVP_R_PRIVATE_KEY_DECODE_ERROR}, +- #else +- {"PRIVATE_KEY_DECODE_ERROR", 6, 145}, +- #endif +- #ifdef EVP_R_PRIVATE_KEY_ENCODE_ERROR +- {"PRIVATE_KEY_ENCODE_ERROR", ERR_LIB_EVP, EVP_R_PRIVATE_KEY_ENCODE_ERROR}, +- #else +- {"PRIVATE_KEY_ENCODE_ERROR", 6, 146}, +- #endif +- #ifdef EVP_R_PUBLIC_KEY_NOT_RSA +- {"PUBLIC_KEY_NOT_RSA", ERR_LIB_EVP, EVP_R_PUBLIC_KEY_NOT_RSA}, +- #else +- {"PUBLIC_KEY_NOT_RSA", 6, 106}, +- #endif +- #ifdef EVP_R_SETTING_XOF_FAILED +- {"SETTING_XOF_FAILED", ERR_LIB_EVP, EVP_R_SETTING_XOF_FAILED}, +- #else +- {"SETTING_XOF_FAILED", 6, 227}, +- #endif +- #ifdef EVP_R_SET_DEFAULT_PROPERTY_FAILURE +- {"SET_DEFAULT_PROPERTY_FAILURE", ERR_LIB_EVP, EVP_R_SET_DEFAULT_PROPERTY_FAILURE}, +- #else +- {"SET_DEFAULT_PROPERTY_FAILURE", 6, 209}, +- #endif +- #ifdef EVP_R_TOO_MANY_RECORDS +- {"TOO_MANY_RECORDS", ERR_LIB_EVP, EVP_R_TOO_MANY_RECORDS}, +- #else +- {"TOO_MANY_RECORDS", 6, 183}, +- #endif +- #ifdef EVP_R_UNABLE_TO_ENABLE_LOCKING +- {"UNABLE_TO_ENABLE_LOCKING", ERR_LIB_EVP, EVP_R_UNABLE_TO_ENABLE_LOCKING}, +- #else +- {"UNABLE_TO_ENABLE_LOCKING", 6, 212}, +- #endif +- #ifdef EVP_R_UNABLE_TO_GET_MAXIMUM_REQUEST_SIZE +- {"UNABLE_TO_GET_MAXIMUM_REQUEST_SIZE", ERR_LIB_EVP, EVP_R_UNABLE_TO_GET_MAXIMUM_REQUEST_SIZE}, +- #else +- {"UNABLE_TO_GET_MAXIMUM_REQUEST_SIZE", 6, 215}, +- #endif +- #ifdef EVP_R_UNABLE_TO_GET_RANDOM_STRENGTH +- {"UNABLE_TO_GET_RANDOM_STRENGTH", ERR_LIB_EVP, EVP_R_UNABLE_TO_GET_RANDOM_STRENGTH}, +- #else +- {"UNABLE_TO_GET_RANDOM_STRENGTH", 6, 216}, +- #endif +- #ifdef EVP_R_UNABLE_TO_LOCK_CONTEXT +- {"UNABLE_TO_LOCK_CONTEXT", ERR_LIB_EVP, EVP_R_UNABLE_TO_LOCK_CONTEXT}, +- #else +- {"UNABLE_TO_LOCK_CONTEXT", 6, 211}, +- #endif +- #ifdef EVP_R_UNABLE_TO_SET_CALLBACKS +- {"UNABLE_TO_SET_CALLBACKS", ERR_LIB_EVP, EVP_R_UNABLE_TO_SET_CALLBACKS}, +- #else +- {"UNABLE_TO_SET_CALLBACKS", 6, 217}, +- #endif +- #ifdef EVP_R_UNKNOWN_CIPHER +- {"UNKNOWN_CIPHER", ERR_LIB_EVP, EVP_R_UNKNOWN_CIPHER}, +- #else +- {"UNKNOWN_CIPHER", 6, 160}, +- #endif +- #ifdef EVP_R_UNKNOWN_DIGEST +- {"UNKNOWN_DIGEST", ERR_LIB_EVP, EVP_R_UNKNOWN_DIGEST}, +- #else +- {"UNKNOWN_DIGEST", 6, 161}, +- #endif +- #ifdef EVP_R_UNKNOWN_KEY_TYPE +- {"UNKNOWN_KEY_TYPE", ERR_LIB_EVP, EVP_R_UNKNOWN_KEY_TYPE}, +- #else +- {"UNKNOWN_KEY_TYPE", 6, 207}, +- #endif +- #ifdef EVP_R_UNKNOWN_OPTION +- {"UNKNOWN_OPTION", ERR_LIB_EVP, EVP_R_UNKNOWN_OPTION}, +- #else +- {"UNKNOWN_OPTION", 6, 169}, +- #endif +- #ifdef EVP_R_UNKNOWN_PBE_ALGORITHM +- {"UNKNOWN_PBE_ALGORITHM", ERR_LIB_EVP, EVP_R_UNKNOWN_PBE_ALGORITHM}, +- #else +- {"UNKNOWN_PBE_ALGORITHM", 6, 121}, +- #endif +- #ifdef EVP_R_UNSUPPORTED_ALGORITHM +- {"UNSUPPORTED_ALGORITHM", ERR_LIB_EVP, EVP_R_UNSUPPORTED_ALGORITHM}, +- #else +- {"UNSUPPORTED_ALGORITHM", 6, 156}, +- #endif +- #ifdef EVP_R_UNSUPPORTED_CIPHER +- {"UNSUPPORTED_CIPHER", ERR_LIB_EVP, EVP_R_UNSUPPORTED_CIPHER}, +- #else +- {"UNSUPPORTED_CIPHER", 6, 107}, +- #endif +- #ifdef EVP_R_UNSUPPORTED_KEYLENGTH +- {"UNSUPPORTED_KEYLENGTH", ERR_LIB_EVP, EVP_R_UNSUPPORTED_KEYLENGTH}, +- #else +- {"UNSUPPORTED_KEYLENGTH", 6, 123}, +- #endif +- #ifdef EVP_R_UNSUPPORTED_KEY_DERIVATION_FUNCTION +- {"UNSUPPORTED_KEY_DERIVATION_FUNCTION", ERR_LIB_EVP, EVP_R_UNSUPPORTED_KEY_DERIVATION_FUNCTION}, +- #else +- {"UNSUPPORTED_KEY_DERIVATION_FUNCTION", 6, 124}, +- #endif +- #ifdef EVP_R_UNSUPPORTED_KEY_SIZE +- {"UNSUPPORTED_KEY_SIZE", ERR_LIB_EVP, EVP_R_UNSUPPORTED_KEY_SIZE}, +- #else +- {"UNSUPPORTED_KEY_SIZE", 6, 108}, +- #endif +- #ifdef EVP_R_UNSUPPORTED_KEY_TYPE +- {"UNSUPPORTED_KEY_TYPE", ERR_LIB_EVP, EVP_R_UNSUPPORTED_KEY_TYPE}, +- #else +- {"UNSUPPORTED_KEY_TYPE", 6, 224}, +- #endif +- #ifdef EVP_R_UNSUPPORTED_NUMBER_OF_ROUNDS +- {"UNSUPPORTED_NUMBER_OF_ROUNDS", ERR_LIB_EVP, EVP_R_UNSUPPORTED_NUMBER_OF_ROUNDS}, +- #else +- {"UNSUPPORTED_NUMBER_OF_ROUNDS", 6, 135}, +- #endif +- #ifdef EVP_R_UNSUPPORTED_PRF +- {"UNSUPPORTED_PRF", ERR_LIB_EVP, EVP_R_UNSUPPORTED_PRF}, +- #else +- {"UNSUPPORTED_PRF", 6, 125}, +- #endif +- #ifdef EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM +- {"UNSUPPORTED_PRIVATE_KEY_ALGORITHM", ERR_LIB_EVP, EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM}, +- #else +- {"UNSUPPORTED_PRIVATE_KEY_ALGORITHM", 6, 118}, +- #endif +- #ifdef EVP_R_UNSUPPORTED_SALT_TYPE +- {"UNSUPPORTED_SALT_TYPE", ERR_LIB_EVP, EVP_R_UNSUPPORTED_SALT_TYPE}, +- #else +- {"UNSUPPORTED_SALT_TYPE", 6, 126}, +- #endif +- #ifdef EVP_R_UPDATE_ERROR +- {"UPDATE_ERROR", ERR_LIB_EVP, EVP_R_UPDATE_ERROR}, +- #else +- {"UPDATE_ERROR", 6, 189}, +- #endif +- #ifdef EVP_R_WRAP_MODE_NOT_ALLOWED +- {"WRAP_MODE_NOT_ALLOWED", ERR_LIB_EVP, EVP_R_WRAP_MODE_NOT_ALLOWED}, +- #else +- {"WRAP_MODE_NOT_ALLOWED", 6, 170}, +- #endif +- #ifdef EVP_R_WRONG_FINAL_BLOCK_LENGTH +- {"WRONG_FINAL_BLOCK_LENGTH", ERR_LIB_EVP, EVP_R_WRONG_FINAL_BLOCK_LENGTH}, +- #else +- {"WRONG_FINAL_BLOCK_LENGTH", 6, 109}, +- #endif +- #ifdef EVP_R_XTS_DATA_UNIT_IS_TOO_LARGE +- {"XTS_DATA_UNIT_IS_TOO_LARGE", ERR_LIB_EVP, EVP_R_XTS_DATA_UNIT_IS_TOO_LARGE}, +- #else +- {"XTS_DATA_UNIT_IS_TOO_LARGE", 6, 191}, +- #endif +- #ifdef EVP_R_XTS_DUPLICATED_KEYS +- {"XTS_DUPLICATED_KEYS", ERR_LIB_EVP, EVP_R_XTS_DUPLICATED_KEYS}, +- #else +- {"XTS_DUPLICATED_KEYS", 6, 192}, +- #endif +- #ifdef HTTP_R_ASN1_LEN_EXCEEDS_MAX_RESP_LEN +- {"ASN1_LEN_EXCEEDS_MAX_RESP_LEN", ERR_LIB_HTTP, HTTP_R_ASN1_LEN_EXCEEDS_MAX_RESP_LEN}, +- #else +- {"ASN1_LEN_EXCEEDS_MAX_RESP_LEN", 61, 108}, +- #endif +- #ifdef HTTP_R_CONNECT_FAILURE +- {"CONNECT_FAILURE", ERR_LIB_HTTP, HTTP_R_CONNECT_FAILURE}, +- #else +- {"CONNECT_FAILURE", 61, 100}, +- #endif +- #ifdef HTTP_R_ERROR_PARSING_ASN1_LENGTH +- {"ERROR_PARSING_ASN1_LENGTH", ERR_LIB_HTTP, HTTP_R_ERROR_PARSING_ASN1_LENGTH}, +- #else +- {"ERROR_PARSING_ASN1_LENGTH", 61, 109}, +- #endif +- #ifdef HTTP_R_ERROR_PARSING_CONTENT_LENGTH +- {"ERROR_PARSING_CONTENT_LENGTH", ERR_LIB_HTTP, HTTP_R_ERROR_PARSING_CONTENT_LENGTH}, +- #else +- {"ERROR_PARSING_CONTENT_LENGTH", 61, 119}, +- #endif +- #ifdef HTTP_R_ERROR_PARSING_URL +- {"ERROR_PARSING_URL", ERR_LIB_HTTP, HTTP_R_ERROR_PARSING_URL}, +- #else +- {"ERROR_PARSING_URL", 61, 101}, +- #endif +- #ifdef HTTP_R_ERROR_RECEIVING +- {"ERROR_RECEIVING", ERR_LIB_HTTP, HTTP_R_ERROR_RECEIVING}, +- #else +- {"ERROR_RECEIVING", 61, 103}, +- #endif +- #ifdef HTTP_R_ERROR_SENDING +- {"ERROR_SENDING", ERR_LIB_HTTP, HTTP_R_ERROR_SENDING}, +- #else +- {"ERROR_SENDING", 61, 102}, +- #endif +- #ifdef HTTP_R_FAILED_READING_DATA +- {"FAILED_READING_DATA", ERR_LIB_HTTP, HTTP_R_FAILED_READING_DATA}, +- #else +- {"FAILED_READING_DATA", 61, 128}, +- #endif +- #ifdef HTTP_R_HEADER_PARSE_ERROR +- {"HEADER_PARSE_ERROR", ERR_LIB_HTTP, HTTP_R_HEADER_PARSE_ERROR}, +- #else +- {"HEADER_PARSE_ERROR", 61, 126}, +- #endif +- #ifdef HTTP_R_INCONSISTENT_CONTENT_LENGTH +- {"INCONSISTENT_CONTENT_LENGTH", ERR_LIB_HTTP, HTTP_R_INCONSISTENT_CONTENT_LENGTH}, +- #else +- {"INCONSISTENT_CONTENT_LENGTH", 61, 120}, +- #endif +- #ifdef HTTP_R_INVALID_PORT_NUMBER +- {"INVALID_PORT_NUMBER", ERR_LIB_HTTP, HTTP_R_INVALID_PORT_NUMBER}, +- #else +- {"INVALID_PORT_NUMBER", 61, 123}, +- #endif +- #ifdef HTTP_R_INVALID_URL_PATH +- {"INVALID_URL_PATH", ERR_LIB_HTTP, HTTP_R_INVALID_URL_PATH}, +- #else +- {"INVALID_URL_PATH", 61, 125}, +- #endif +- #ifdef HTTP_R_INVALID_URL_SCHEME +- {"INVALID_URL_SCHEME", ERR_LIB_HTTP, HTTP_R_INVALID_URL_SCHEME}, +- #else +- {"INVALID_URL_SCHEME", 61, 124}, +- #endif +- #ifdef HTTP_R_MAX_RESP_LEN_EXCEEDED +- {"MAX_RESP_LEN_EXCEEDED", ERR_LIB_HTTP, HTTP_R_MAX_RESP_LEN_EXCEEDED}, +- #else +- {"MAX_RESP_LEN_EXCEEDED", 61, 117}, +- #endif +- #ifdef HTTP_R_MISSING_ASN1_ENCODING +- {"MISSING_ASN1_ENCODING", ERR_LIB_HTTP, HTTP_R_MISSING_ASN1_ENCODING}, +- #else +- {"MISSING_ASN1_ENCODING", 61, 110}, +- #endif +- #ifdef HTTP_R_MISSING_CONTENT_TYPE +- {"MISSING_CONTENT_TYPE", ERR_LIB_HTTP, HTTP_R_MISSING_CONTENT_TYPE}, +- #else +- {"MISSING_CONTENT_TYPE", 61, 121}, +- #endif +- #ifdef HTTP_R_MISSING_REDIRECT_LOCATION +- {"MISSING_REDIRECT_LOCATION", ERR_LIB_HTTP, HTTP_R_MISSING_REDIRECT_LOCATION}, +- #else +- {"MISSING_REDIRECT_LOCATION", 61, 111}, +- #endif +- #ifdef HTTP_R_RECEIVED_ERROR +- {"RECEIVED_ERROR", ERR_LIB_HTTP, HTTP_R_RECEIVED_ERROR}, +- #else +- {"RECEIVED_ERROR", 61, 105}, +- #endif +- #ifdef HTTP_R_RECEIVED_WRONG_HTTP_VERSION +- {"RECEIVED_WRONG_HTTP_VERSION", ERR_LIB_HTTP, HTTP_R_RECEIVED_WRONG_HTTP_VERSION}, +- #else +- {"RECEIVED_WRONG_HTTP_VERSION", 61, 106}, +- #endif +- #ifdef HTTP_R_REDIRECTION_FROM_HTTPS_TO_HTTP +- {"REDIRECTION_FROM_HTTPS_TO_HTTP", ERR_LIB_HTTP, HTTP_R_REDIRECTION_FROM_HTTPS_TO_HTTP}, +- #else +- {"REDIRECTION_FROM_HTTPS_TO_HTTP", 61, 112}, +- #endif +- #ifdef HTTP_R_REDIRECTION_NOT_ENABLED +- {"REDIRECTION_NOT_ENABLED", ERR_LIB_HTTP, HTTP_R_REDIRECTION_NOT_ENABLED}, +- #else +- {"REDIRECTION_NOT_ENABLED", 61, 116}, +- #endif +- #ifdef HTTP_R_RESPONSE_LINE_TOO_LONG +- {"RESPONSE_LINE_TOO_LONG", ERR_LIB_HTTP, HTTP_R_RESPONSE_LINE_TOO_LONG}, +- #else +- {"RESPONSE_LINE_TOO_LONG", 61, 113}, +- #endif +- #ifdef HTTP_R_RESPONSE_PARSE_ERROR +- {"RESPONSE_PARSE_ERROR", ERR_LIB_HTTP, HTTP_R_RESPONSE_PARSE_ERROR}, +- #else +- {"RESPONSE_PARSE_ERROR", 61, 104}, +- #endif +- #ifdef HTTP_R_RETRY_TIMEOUT +- {"RETRY_TIMEOUT", ERR_LIB_HTTP, HTTP_R_RETRY_TIMEOUT}, +- #else +- {"RETRY_TIMEOUT", 61, 129}, +- #endif +- #ifdef HTTP_R_SERVER_CANCELED_CONNECTION +- {"SERVER_CANCELED_CONNECTION", ERR_LIB_HTTP, HTTP_R_SERVER_CANCELED_CONNECTION}, +- #else +- {"SERVER_CANCELED_CONNECTION", 61, 127}, +- #endif +- #ifdef HTTP_R_SOCK_NOT_SUPPORTED +- {"SOCK_NOT_SUPPORTED", ERR_LIB_HTTP, HTTP_R_SOCK_NOT_SUPPORTED}, +- #else +- {"SOCK_NOT_SUPPORTED", 61, 122}, +- #endif +- #ifdef HTTP_R_STATUS_CODE_UNSUPPORTED +- {"STATUS_CODE_UNSUPPORTED", ERR_LIB_HTTP, HTTP_R_STATUS_CODE_UNSUPPORTED}, +- #else +- {"STATUS_CODE_UNSUPPORTED", 61, 114}, +- #endif +- #ifdef HTTP_R_TLS_NOT_ENABLED +- {"TLS_NOT_ENABLED", ERR_LIB_HTTP, HTTP_R_TLS_NOT_ENABLED}, +- #else +- {"TLS_NOT_ENABLED", 61, 107}, +- #endif +- #ifdef HTTP_R_TOO_MANY_REDIRECTIONS +- {"TOO_MANY_REDIRECTIONS", ERR_LIB_HTTP, HTTP_R_TOO_MANY_REDIRECTIONS}, +- #else +- {"TOO_MANY_REDIRECTIONS", 61, 115}, +- #endif +- #ifdef HTTP_R_UNEXPECTED_CONTENT_TYPE +- {"UNEXPECTED_CONTENT_TYPE", ERR_LIB_HTTP, HTTP_R_UNEXPECTED_CONTENT_TYPE}, +- #else +- {"UNEXPECTED_CONTENT_TYPE", 61, 118}, +- #endif +- #ifdef OBJ_R_OID_EXISTS +- {"OID_EXISTS", ERR_LIB_OBJ, OBJ_R_OID_EXISTS}, +- #else +- {"OID_EXISTS", 8, 102}, +- #endif +- #ifdef OBJ_R_UNKNOWN_NID +- {"UNKNOWN_NID", ERR_LIB_OBJ, OBJ_R_UNKNOWN_NID}, +- #else +- {"UNKNOWN_NID", 8, 101}, +- #endif +- #ifdef OBJ_R_UNKNOWN_OBJECT_NAME +- {"UNKNOWN_OBJECT_NAME", ERR_LIB_OBJ, OBJ_R_UNKNOWN_OBJECT_NAME}, +- #else +- {"UNKNOWN_OBJECT_NAME", 8, 103}, +- #endif +- #ifdef OCSP_R_CERTIFICATE_VERIFY_ERROR +- {"CERTIFICATE_VERIFY_ERROR", ERR_LIB_OCSP, OCSP_R_CERTIFICATE_VERIFY_ERROR}, +- #else +- {"CERTIFICATE_VERIFY_ERROR", 39, 101}, +- #endif +- #ifdef OCSP_R_DIGEST_ERR +- {"DIGEST_ERR", ERR_LIB_OCSP, OCSP_R_DIGEST_ERR}, +- #else +- {"DIGEST_ERR", 39, 102}, +- #endif +- #ifdef OCSP_R_DIGEST_NAME_ERR +- {"DIGEST_NAME_ERR", ERR_LIB_OCSP, OCSP_R_DIGEST_NAME_ERR}, +- #else +- {"DIGEST_NAME_ERR", 39, 106}, +- #endif +- #ifdef OCSP_R_DIGEST_SIZE_ERR +- {"DIGEST_SIZE_ERR", ERR_LIB_OCSP, OCSP_R_DIGEST_SIZE_ERR}, +- #else +- {"DIGEST_SIZE_ERR", 39, 107}, +- #endif +- #ifdef OCSP_R_ERROR_IN_NEXTUPDATE_FIELD +- {"ERROR_IN_NEXTUPDATE_FIELD", ERR_LIB_OCSP, OCSP_R_ERROR_IN_NEXTUPDATE_FIELD}, +- #else +- {"ERROR_IN_NEXTUPDATE_FIELD", 39, 122}, +- #endif +- #ifdef OCSP_R_ERROR_IN_THISUPDATE_FIELD +- {"ERROR_IN_THISUPDATE_FIELD", ERR_LIB_OCSP, OCSP_R_ERROR_IN_THISUPDATE_FIELD}, +- #else +- {"ERROR_IN_THISUPDATE_FIELD", 39, 123}, +- #endif +- #ifdef OCSP_R_MISSING_OCSPSIGNING_USAGE +- {"MISSING_OCSPSIGNING_USAGE", ERR_LIB_OCSP, OCSP_R_MISSING_OCSPSIGNING_USAGE}, +- #else +- {"MISSING_OCSPSIGNING_USAGE", 39, 103}, +- #endif +- #ifdef OCSP_R_NEXTUPDATE_BEFORE_THISUPDATE +- {"NEXTUPDATE_BEFORE_THISUPDATE", ERR_LIB_OCSP, OCSP_R_NEXTUPDATE_BEFORE_THISUPDATE}, +- #else +- {"NEXTUPDATE_BEFORE_THISUPDATE", 39, 124}, +- #endif +- #ifdef OCSP_R_NOT_BASIC_RESPONSE +- {"NOT_BASIC_RESPONSE", ERR_LIB_OCSP, OCSP_R_NOT_BASIC_RESPONSE}, +- #else +- {"NOT_BASIC_RESPONSE", 39, 104}, +- #endif +- #ifdef OCSP_R_NO_CERTIFICATES_IN_CHAIN +- {"NO_CERTIFICATES_IN_CHAIN", ERR_LIB_OCSP, OCSP_R_NO_CERTIFICATES_IN_CHAIN}, +- #else +- {"NO_CERTIFICATES_IN_CHAIN", 39, 105}, +- #endif +- #ifdef OCSP_R_NO_RESPONSE_DATA +- {"NO_RESPONSE_DATA", ERR_LIB_OCSP, OCSP_R_NO_RESPONSE_DATA}, +- #else +- {"NO_RESPONSE_DATA", 39, 108}, +- #endif +- #ifdef OCSP_R_NO_REVOKED_TIME +- {"NO_REVOKED_TIME", ERR_LIB_OCSP, OCSP_R_NO_REVOKED_TIME}, +- #else +- {"NO_REVOKED_TIME", 39, 109}, +- #endif +- #ifdef OCSP_R_NO_SIGNER_KEY +- {"NO_SIGNER_KEY", ERR_LIB_OCSP, OCSP_R_NO_SIGNER_KEY}, +- #else +- {"NO_SIGNER_KEY", 39, 130}, +- #endif +- #ifdef OCSP_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE +- {"PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE", ERR_LIB_OCSP, OCSP_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE}, +- #else +- {"PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE", 39, 110}, +- #endif +- #ifdef OCSP_R_REQUEST_NOT_SIGNED +- {"REQUEST_NOT_SIGNED", ERR_LIB_OCSP, OCSP_R_REQUEST_NOT_SIGNED}, +- #else +- {"REQUEST_NOT_SIGNED", 39, 128}, +- #endif +- #ifdef OCSP_R_RESPONSE_CONTAINS_NO_REVOCATION_DATA +- {"RESPONSE_CONTAINS_NO_REVOCATION_DATA", ERR_LIB_OCSP, OCSP_R_RESPONSE_CONTAINS_NO_REVOCATION_DATA}, +- #else +- {"RESPONSE_CONTAINS_NO_REVOCATION_DATA", 39, 111}, +- #endif +- #ifdef OCSP_R_ROOT_CA_NOT_TRUSTED +- {"ROOT_CA_NOT_TRUSTED", ERR_LIB_OCSP, OCSP_R_ROOT_CA_NOT_TRUSTED}, +- #else +- {"ROOT_CA_NOT_TRUSTED", 39, 112}, +- #endif +- #ifdef OCSP_R_SIGNATURE_FAILURE +- {"SIGNATURE_FAILURE", ERR_LIB_OCSP, OCSP_R_SIGNATURE_FAILURE}, +- #else +- {"SIGNATURE_FAILURE", 39, 117}, +- #endif +- #ifdef OCSP_R_SIGNER_CERTIFICATE_NOT_FOUND +- {"SIGNER_CERTIFICATE_NOT_FOUND", ERR_LIB_OCSP, OCSP_R_SIGNER_CERTIFICATE_NOT_FOUND}, +- #else +- {"SIGNER_CERTIFICATE_NOT_FOUND", 39, 118}, +- #endif +- #ifdef OCSP_R_STATUS_EXPIRED +- {"STATUS_EXPIRED", ERR_LIB_OCSP, OCSP_R_STATUS_EXPIRED}, +- #else +- {"STATUS_EXPIRED", 39, 125}, +- #endif +- #ifdef OCSP_R_STATUS_NOT_YET_VALID +- {"STATUS_NOT_YET_VALID", ERR_LIB_OCSP, OCSP_R_STATUS_NOT_YET_VALID}, +- #else +- {"STATUS_NOT_YET_VALID", 39, 126}, +- #endif +- #ifdef OCSP_R_STATUS_TOO_OLD +- {"STATUS_TOO_OLD", ERR_LIB_OCSP, OCSP_R_STATUS_TOO_OLD}, +- #else +- {"STATUS_TOO_OLD", 39, 127}, +- #endif +- #ifdef OCSP_R_UNKNOWN_MESSAGE_DIGEST +- {"UNKNOWN_MESSAGE_DIGEST", ERR_LIB_OCSP, OCSP_R_UNKNOWN_MESSAGE_DIGEST}, +- #else +- {"UNKNOWN_MESSAGE_DIGEST", 39, 119}, +- #endif +- #ifdef OCSP_R_UNKNOWN_NID +- {"UNKNOWN_NID", ERR_LIB_OCSP, OCSP_R_UNKNOWN_NID}, +- #else +- {"UNKNOWN_NID", 39, 120}, +- #endif +- #ifdef OCSP_R_UNSUPPORTED_REQUESTORNAME_TYPE +- {"UNSUPPORTED_REQUESTORNAME_TYPE", ERR_LIB_OCSP, OCSP_R_UNSUPPORTED_REQUESTORNAME_TYPE}, +- #else +- {"UNSUPPORTED_REQUESTORNAME_TYPE", 39, 129}, +- #endif +- #ifdef OSSL_DECODER_R_COULD_NOT_DECODE_OBJECT +- {"COULD_NOT_DECODE_OBJECT", ERR_LIB_OSSL_DECODER, OSSL_DECODER_R_COULD_NOT_DECODE_OBJECT}, +- #else +- {"COULD_NOT_DECODE_OBJECT", 60, 101}, +- #endif +- #ifdef OSSL_DECODER_R_DECODER_NOT_FOUND +- {"DECODER_NOT_FOUND", ERR_LIB_OSSL_DECODER, OSSL_DECODER_R_DECODER_NOT_FOUND}, +- #else +- {"DECODER_NOT_FOUND", 60, 102}, +- #endif +- #ifdef OSSL_DECODER_R_MISSING_GET_PARAMS +- {"MISSING_GET_PARAMS", ERR_LIB_OSSL_DECODER, OSSL_DECODER_R_MISSING_GET_PARAMS}, +- #else +- {"MISSING_GET_PARAMS", 60, 100}, +- #endif +- #ifdef OSSL_ENCODER_R_ENCODER_NOT_FOUND +- {"ENCODER_NOT_FOUND", ERR_LIB_OSSL_ENCODER, OSSL_ENCODER_R_ENCODER_NOT_FOUND}, +- #else +- {"ENCODER_NOT_FOUND", 59, 101}, +- #endif +- #ifdef OSSL_ENCODER_R_INCORRECT_PROPERTY_QUERY +- {"INCORRECT_PROPERTY_QUERY", ERR_LIB_OSSL_ENCODER, OSSL_ENCODER_R_INCORRECT_PROPERTY_QUERY}, +- #else +- {"INCORRECT_PROPERTY_QUERY", 59, 100}, +- #endif +- #ifdef OSSL_ENCODER_R_MISSING_GET_PARAMS +- {"MISSING_GET_PARAMS", ERR_LIB_OSSL_ENCODER, OSSL_ENCODER_R_MISSING_GET_PARAMS}, +- #else +- {"MISSING_GET_PARAMS", 59, 102}, +- #endif +- #ifdef OSSL_STORE_R_AMBIGUOUS_CONTENT_TYPE +- {"AMBIGUOUS_CONTENT_TYPE", ERR_LIB_OSSL_STORE, OSSL_STORE_R_AMBIGUOUS_CONTENT_TYPE}, +- #else +- {"AMBIGUOUS_CONTENT_TYPE", 44, 107}, +- #endif +- #ifdef OSSL_STORE_R_BAD_PASSWORD_READ +- {"BAD_PASSWORD_READ", ERR_LIB_OSSL_STORE, OSSL_STORE_R_BAD_PASSWORD_READ}, +- #else +- {"BAD_PASSWORD_READ", 44, 115}, +- #endif +- #ifdef OSSL_STORE_R_ERROR_VERIFYING_PKCS12_MAC +- {"ERROR_VERIFYING_PKCS12_MAC", ERR_LIB_OSSL_STORE, OSSL_STORE_R_ERROR_VERIFYING_PKCS12_MAC}, +- #else +- {"ERROR_VERIFYING_PKCS12_MAC", 44, 113}, +- #endif +- #ifdef OSSL_STORE_R_FINGERPRINT_SIZE_DOES_NOT_MATCH_DIGEST +- {"FINGERPRINT_SIZE_DOES_NOT_MATCH_DIGEST", ERR_LIB_OSSL_STORE, OSSL_STORE_R_FINGERPRINT_SIZE_DOES_NOT_MATCH_DIGEST}, +- #else +- {"FINGERPRINT_SIZE_DOES_NOT_MATCH_DIGEST", 44, 121}, +- #endif +- #ifdef OSSL_STORE_R_INVALID_SCHEME +- {"INVALID_SCHEME", ERR_LIB_OSSL_STORE, OSSL_STORE_R_INVALID_SCHEME}, +- #else +- {"INVALID_SCHEME", 44, 106}, +- #endif +- #ifdef OSSL_STORE_R_IS_NOT_A +- {"IS_NOT_A", ERR_LIB_OSSL_STORE, OSSL_STORE_R_IS_NOT_A}, +- #else +- {"IS_NOT_A", 44, 112}, +- #endif +- #ifdef OSSL_STORE_R_LOADER_INCOMPLETE +- {"LOADER_INCOMPLETE", ERR_LIB_OSSL_STORE, OSSL_STORE_R_LOADER_INCOMPLETE}, +- #else +- {"LOADER_INCOMPLETE", 44, 116}, +- #endif +- #ifdef OSSL_STORE_R_LOADING_STARTED +- {"LOADING_STARTED", ERR_LIB_OSSL_STORE, OSSL_STORE_R_LOADING_STARTED}, +- #else +- {"LOADING_STARTED", 44, 117}, +- #endif +- #ifdef OSSL_STORE_R_NOT_A_CERTIFICATE +- {"NOT_A_CERTIFICATE", ERR_LIB_OSSL_STORE, OSSL_STORE_R_NOT_A_CERTIFICATE}, +- #else +- {"NOT_A_CERTIFICATE", 44, 100}, +- #endif +- #ifdef OSSL_STORE_R_NOT_A_CRL +- {"NOT_A_CRL", ERR_LIB_OSSL_STORE, OSSL_STORE_R_NOT_A_CRL}, +- #else +- {"NOT_A_CRL", 44, 101}, +- #endif +- #ifdef OSSL_STORE_R_NOT_A_NAME +- {"NOT_A_NAME", ERR_LIB_OSSL_STORE, OSSL_STORE_R_NOT_A_NAME}, +- #else +- {"NOT_A_NAME", 44, 103}, +- #endif +- #ifdef OSSL_STORE_R_NOT_A_PRIVATE_KEY +- {"NOT_A_PRIVATE_KEY", ERR_LIB_OSSL_STORE, OSSL_STORE_R_NOT_A_PRIVATE_KEY}, +- #else +- {"NOT_A_PRIVATE_KEY", 44, 102}, +- #endif +- #ifdef OSSL_STORE_R_NOT_A_PUBLIC_KEY +- {"NOT_A_PUBLIC_KEY", ERR_LIB_OSSL_STORE, OSSL_STORE_R_NOT_A_PUBLIC_KEY}, +- #else +- {"NOT_A_PUBLIC_KEY", 44, 122}, +- #endif +- #ifdef OSSL_STORE_R_NOT_PARAMETERS +- {"NOT_PARAMETERS", ERR_LIB_OSSL_STORE, OSSL_STORE_R_NOT_PARAMETERS}, +- #else +- {"NOT_PARAMETERS", 44, 104}, +- #endif +- #ifdef OSSL_STORE_R_NO_LOADERS_FOUND +- {"NO_LOADERS_FOUND", ERR_LIB_OSSL_STORE, OSSL_STORE_R_NO_LOADERS_FOUND}, +- #else +- {"NO_LOADERS_FOUND", 44, 123}, +- #endif +- #ifdef OSSL_STORE_R_PASSPHRASE_CALLBACK_ERROR +- {"PASSPHRASE_CALLBACK_ERROR", ERR_LIB_OSSL_STORE, OSSL_STORE_R_PASSPHRASE_CALLBACK_ERROR}, +- #else +- {"PASSPHRASE_CALLBACK_ERROR", 44, 114}, +- #endif +- #ifdef OSSL_STORE_R_PATH_MUST_BE_ABSOLUTE +- {"PATH_MUST_BE_ABSOLUTE", ERR_LIB_OSSL_STORE, OSSL_STORE_R_PATH_MUST_BE_ABSOLUTE}, +- #else +- {"PATH_MUST_BE_ABSOLUTE", 44, 108}, +- #endif +- #ifdef OSSL_STORE_R_SEARCH_ONLY_SUPPORTED_FOR_DIRECTORIES +- {"SEARCH_ONLY_SUPPORTED_FOR_DIRECTORIES", ERR_LIB_OSSL_STORE, OSSL_STORE_R_SEARCH_ONLY_SUPPORTED_FOR_DIRECTORIES}, +- #else +- {"SEARCH_ONLY_SUPPORTED_FOR_DIRECTORIES", 44, 119}, +- #endif +- #ifdef OSSL_STORE_R_UI_PROCESS_INTERRUPTED_OR_CANCELLED +- {"UI_PROCESS_INTERRUPTED_OR_CANCELLED", ERR_LIB_OSSL_STORE, OSSL_STORE_R_UI_PROCESS_INTERRUPTED_OR_CANCELLED}, +- #else +- {"UI_PROCESS_INTERRUPTED_OR_CANCELLED", 44, 109}, +- #endif +- #ifdef OSSL_STORE_R_UNREGISTERED_SCHEME +- {"UNREGISTERED_SCHEME", ERR_LIB_OSSL_STORE, OSSL_STORE_R_UNREGISTERED_SCHEME}, +- #else +- {"UNREGISTERED_SCHEME", 44, 105}, +- #endif +- #ifdef OSSL_STORE_R_UNSUPPORTED_CONTENT_TYPE +- {"UNSUPPORTED_CONTENT_TYPE", ERR_LIB_OSSL_STORE, OSSL_STORE_R_UNSUPPORTED_CONTENT_TYPE}, +- #else +- {"UNSUPPORTED_CONTENT_TYPE", 44, 110}, +- #endif +- #ifdef OSSL_STORE_R_UNSUPPORTED_OPERATION +- {"UNSUPPORTED_OPERATION", ERR_LIB_OSSL_STORE, OSSL_STORE_R_UNSUPPORTED_OPERATION}, +- #else +- {"UNSUPPORTED_OPERATION", 44, 118}, +- #endif +- #ifdef OSSL_STORE_R_UNSUPPORTED_SEARCH_TYPE +- {"UNSUPPORTED_SEARCH_TYPE", ERR_LIB_OSSL_STORE, OSSL_STORE_R_UNSUPPORTED_SEARCH_TYPE}, +- #else +- {"UNSUPPORTED_SEARCH_TYPE", 44, 120}, +- #endif +- #ifdef OSSL_STORE_R_URI_AUTHORITY_UNSUPPORTED +- {"URI_AUTHORITY_UNSUPPORTED", ERR_LIB_OSSL_STORE, OSSL_STORE_R_URI_AUTHORITY_UNSUPPORTED}, +- #else +- {"URI_AUTHORITY_UNSUPPORTED", 44, 111}, +- #endif +- #ifdef PEM_R_BAD_BASE64_DECODE +- {"BAD_BASE64_DECODE", ERR_LIB_PEM, PEM_R_BAD_BASE64_DECODE}, +- #else +- {"BAD_BASE64_DECODE", 9, 100}, +- #endif +- #ifdef PEM_R_BAD_DECRYPT +- {"BAD_DECRYPT", ERR_LIB_PEM, PEM_R_BAD_DECRYPT}, +- #else +- {"BAD_DECRYPT", 9, 101}, +- #endif +- #ifdef PEM_R_BAD_END_LINE +- {"BAD_END_LINE", ERR_LIB_PEM, PEM_R_BAD_END_LINE}, +- #else +- {"BAD_END_LINE", 9, 102}, +- #endif +- #ifdef PEM_R_BAD_IV_CHARS +- {"BAD_IV_CHARS", ERR_LIB_PEM, PEM_R_BAD_IV_CHARS}, +- #else +- {"BAD_IV_CHARS", 9, 103}, +- #endif +- #ifdef PEM_R_BAD_MAGIC_NUMBER +- {"BAD_MAGIC_NUMBER", ERR_LIB_PEM, PEM_R_BAD_MAGIC_NUMBER}, +- #else +- {"BAD_MAGIC_NUMBER", 9, 116}, +- #endif +- #ifdef PEM_R_BAD_PASSWORD_READ +- {"BAD_PASSWORD_READ", ERR_LIB_PEM, PEM_R_BAD_PASSWORD_READ}, +- #else +- {"BAD_PASSWORD_READ", 9, 104}, +- #endif +- #ifdef PEM_R_BAD_VERSION_NUMBER +- {"BAD_VERSION_NUMBER", ERR_LIB_PEM, PEM_R_BAD_VERSION_NUMBER}, +- #else +- {"BAD_VERSION_NUMBER", 9, 117}, +- #endif +- #ifdef PEM_R_BIO_WRITE_FAILURE +- {"BIO_WRITE_FAILURE", ERR_LIB_PEM, PEM_R_BIO_WRITE_FAILURE}, +- #else +- {"BIO_WRITE_FAILURE", 9, 118}, +- #endif +- #ifdef PEM_R_CIPHER_IS_NULL +- {"CIPHER_IS_NULL", ERR_LIB_PEM, PEM_R_CIPHER_IS_NULL}, +- #else +- {"CIPHER_IS_NULL", 9, 127}, +- #endif +- #ifdef PEM_R_ERROR_CONVERTING_PRIVATE_KEY +- {"ERROR_CONVERTING_PRIVATE_KEY", ERR_LIB_PEM, PEM_R_ERROR_CONVERTING_PRIVATE_KEY}, +- #else +- {"ERROR_CONVERTING_PRIVATE_KEY", 9, 115}, +- #endif +- #ifdef PEM_R_EXPECTING_DSS_KEY_BLOB +- {"EXPECTING_DSS_KEY_BLOB", ERR_LIB_PEM, PEM_R_EXPECTING_DSS_KEY_BLOB}, +- #else +- {"EXPECTING_DSS_KEY_BLOB", 9, 131}, +- #endif +- #ifdef PEM_R_EXPECTING_PRIVATE_KEY_BLOB +- {"EXPECTING_PRIVATE_KEY_BLOB", ERR_LIB_PEM, PEM_R_EXPECTING_PRIVATE_KEY_BLOB}, +- #else +- {"EXPECTING_PRIVATE_KEY_BLOB", 9, 119}, +- #endif +- #ifdef PEM_R_EXPECTING_PUBLIC_KEY_BLOB +- {"EXPECTING_PUBLIC_KEY_BLOB", ERR_LIB_PEM, PEM_R_EXPECTING_PUBLIC_KEY_BLOB}, +- #else +- {"EXPECTING_PUBLIC_KEY_BLOB", 9, 120}, +- #endif +- #ifdef PEM_R_EXPECTING_RSA_KEY_BLOB +- {"EXPECTING_RSA_KEY_BLOB", ERR_LIB_PEM, PEM_R_EXPECTING_RSA_KEY_BLOB}, +- #else +- {"EXPECTING_RSA_KEY_BLOB", 9, 132}, +- #endif +- #ifdef PEM_R_HEADER_TOO_LONG +- {"HEADER_TOO_LONG", ERR_LIB_PEM, PEM_R_HEADER_TOO_LONG}, +- #else +- {"HEADER_TOO_LONG", 9, 128}, +- #endif +- #ifdef PEM_R_INCONSISTENT_HEADER +- {"INCONSISTENT_HEADER", ERR_LIB_PEM, PEM_R_INCONSISTENT_HEADER}, +- #else +- {"INCONSISTENT_HEADER", 9, 121}, +- #endif +- #ifdef PEM_R_KEYBLOB_HEADER_PARSE_ERROR +- {"KEYBLOB_HEADER_PARSE_ERROR", ERR_LIB_PEM, PEM_R_KEYBLOB_HEADER_PARSE_ERROR}, +- #else +- {"KEYBLOB_HEADER_PARSE_ERROR", 9, 122}, +- #endif +- #ifdef PEM_R_KEYBLOB_TOO_SHORT +- {"KEYBLOB_TOO_SHORT", ERR_LIB_PEM, PEM_R_KEYBLOB_TOO_SHORT}, +- #else +- {"KEYBLOB_TOO_SHORT", 9, 123}, +- #endif +- #ifdef PEM_R_MISSING_DEK_IV +- {"MISSING_DEK_IV", ERR_LIB_PEM, PEM_R_MISSING_DEK_IV}, +- #else +- {"MISSING_DEK_IV", 9, 129}, +- #endif +- #ifdef PEM_R_NOT_DEK_INFO +- {"NOT_DEK_INFO", ERR_LIB_PEM, PEM_R_NOT_DEK_INFO}, +- #else +- {"NOT_DEK_INFO", 9, 105}, +- #endif +- #ifdef PEM_R_NOT_ENCRYPTED +- {"NOT_ENCRYPTED", ERR_LIB_PEM, PEM_R_NOT_ENCRYPTED}, +- #else +- {"NOT_ENCRYPTED", 9, 106}, +- #endif +- #ifdef PEM_R_NOT_PROC_TYPE +- {"NOT_PROC_TYPE", ERR_LIB_PEM, PEM_R_NOT_PROC_TYPE}, +- #else +- {"NOT_PROC_TYPE", 9, 107}, +- #endif +- #ifdef PEM_R_NO_START_LINE +- {"NO_START_LINE", ERR_LIB_PEM, PEM_R_NO_START_LINE}, +- #else +- {"NO_START_LINE", 9, 108}, +- #endif +- #ifdef PEM_R_PROBLEMS_GETTING_PASSWORD +- {"PROBLEMS_GETTING_PASSWORD", ERR_LIB_PEM, PEM_R_PROBLEMS_GETTING_PASSWORD}, +- #else +- {"PROBLEMS_GETTING_PASSWORD", 9, 109}, +- #endif +- #ifdef PEM_R_PVK_DATA_TOO_SHORT +- {"PVK_DATA_TOO_SHORT", ERR_LIB_PEM, PEM_R_PVK_DATA_TOO_SHORT}, +- #else +- {"PVK_DATA_TOO_SHORT", 9, 124}, +- #endif +- #ifdef PEM_R_PVK_TOO_SHORT +- {"PVK_TOO_SHORT", ERR_LIB_PEM, PEM_R_PVK_TOO_SHORT}, +- #else +- {"PVK_TOO_SHORT", 9, 125}, +- #endif +- #ifdef PEM_R_READ_KEY +- {"READ_KEY", ERR_LIB_PEM, PEM_R_READ_KEY}, +- #else +- {"READ_KEY", 9, 111}, +- #endif +- #ifdef PEM_R_SHORT_HEADER +- {"SHORT_HEADER", ERR_LIB_PEM, PEM_R_SHORT_HEADER}, +- #else +- {"SHORT_HEADER", 9, 112}, +- #endif +- #ifdef PEM_R_UNEXPECTED_DEK_IV +- {"UNEXPECTED_DEK_IV", ERR_LIB_PEM, PEM_R_UNEXPECTED_DEK_IV}, +- #else +- {"UNEXPECTED_DEK_IV", 9, 130}, +- #endif +- #ifdef PEM_R_UNSUPPORTED_CIPHER +- {"UNSUPPORTED_CIPHER", ERR_LIB_PEM, PEM_R_UNSUPPORTED_CIPHER}, +- #else +- {"UNSUPPORTED_CIPHER", 9, 113}, +- #endif +- #ifdef PEM_R_UNSUPPORTED_ENCRYPTION +- {"UNSUPPORTED_ENCRYPTION", ERR_LIB_PEM, PEM_R_UNSUPPORTED_ENCRYPTION}, +- #else +- {"UNSUPPORTED_ENCRYPTION", 9, 114}, +- #endif +- #ifdef PEM_R_UNSUPPORTED_KEY_COMPONENTS +- {"UNSUPPORTED_KEY_COMPONENTS", ERR_LIB_PEM, PEM_R_UNSUPPORTED_KEY_COMPONENTS}, +- #else +- {"UNSUPPORTED_KEY_COMPONENTS", 9, 126}, +- #endif +- #ifdef PEM_R_UNSUPPORTED_PUBLIC_KEY_TYPE +- {"UNSUPPORTED_PUBLIC_KEY_TYPE", ERR_LIB_PEM, PEM_R_UNSUPPORTED_PUBLIC_KEY_TYPE}, +- #else +- {"UNSUPPORTED_PUBLIC_KEY_TYPE", 9, 110}, +- #endif +- #ifdef PKCS12_R_CANT_PACK_STRUCTURE +- {"CANT_PACK_STRUCTURE", ERR_LIB_PKCS12, PKCS12_R_CANT_PACK_STRUCTURE}, +- #else +- {"CANT_PACK_STRUCTURE", 35, 100}, +- #endif +- #ifdef PKCS12_R_CONTENT_TYPE_NOT_DATA +- {"CONTENT_TYPE_NOT_DATA", ERR_LIB_PKCS12, PKCS12_R_CONTENT_TYPE_NOT_DATA}, +- #else +- {"CONTENT_TYPE_NOT_DATA", 35, 121}, +- #endif +- #ifdef PKCS12_R_DECODE_ERROR +- {"DECODE_ERROR", ERR_LIB_PKCS12, PKCS12_R_DECODE_ERROR}, +- #else +- {"DECODE_ERROR", 35, 101}, +- #endif +- #ifdef PKCS12_R_ENCODE_ERROR +- {"ENCODE_ERROR", ERR_LIB_PKCS12, PKCS12_R_ENCODE_ERROR}, +- #else +- {"ENCODE_ERROR", 35, 102}, +- #endif +- #ifdef PKCS12_R_ENCRYPT_ERROR +- {"ENCRYPT_ERROR", ERR_LIB_PKCS12, PKCS12_R_ENCRYPT_ERROR}, +- #else +- {"ENCRYPT_ERROR", 35, 103}, +- #endif +- #ifdef PKCS12_R_ERROR_SETTING_ENCRYPTED_DATA_TYPE +- {"ERROR_SETTING_ENCRYPTED_DATA_TYPE", ERR_LIB_PKCS12, PKCS12_R_ERROR_SETTING_ENCRYPTED_DATA_TYPE}, +- #else +- {"ERROR_SETTING_ENCRYPTED_DATA_TYPE", 35, 120}, +- #endif +- #ifdef PKCS12_R_INVALID_NULL_ARGUMENT +- {"INVALID_NULL_ARGUMENT", ERR_LIB_PKCS12, PKCS12_R_INVALID_NULL_ARGUMENT}, +- #else +- {"INVALID_NULL_ARGUMENT", 35, 104}, +- #endif +- #ifdef PKCS12_R_INVALID_NULL_PKCS12_POINTER +- {"INVALID_NULL_PKCS12_POINTER", ERR_LIB_PKCS12, PKCS12_R_INVALID_NULL_PKCS12_POINTER}, +- #else +- {"INVALID_NULL_PKCS12_POINTER", 35, 105}, +- #endif +- #ifdef PKCS12_R_INVALID_TYPE +- {"INVALID_TYPE", ERR_LIB_PKCS12, PKCS12_R_INVALID_TYPE}, +- #else +- {"INVALID_TYPE", 35, 112}, +- #endif +- #ifdef PKCS12_R_IV_GEN_ERROR +- {"IV_GEN_ERROR", ERR_LIB_PKCS12, PKCS12_R_IV_GEN_ERROR}, +- #else +- {"IV_GEN_ERROR", 35, 106}, +- #endif +- #ifdef PKCS12_R_KEY_GEN_ERROR +- {"KEY_GEN_ERROR", ERR_LIB_PKCS12, PKCS12_R_KEY_GEN_ERROR}, +- #else +- {"KEY_GEN_ERROR", 35, 107}, +- #endif +- #ifdef PKCS12_R_MAC_ABSENT +- {"MAC_ABSENT", ERR_LIB_PKCS12, PKCS12_R_MAC_ABSENT}, +- #else +- {"MAC_ABSENT", 35, 108}, +- #endif +- #ifdef PKCS12_R_MAC_GENERATION_ERROR +- {"MAC_GENERATION_ERROR", ERR_LIB_PKCS12, PKCS12_R_MAC_GENERATION_ERROR}, +- #else +- {"MAC_GENERATION_ERROR", 35, 109}, +- #endif +- #ifdef PKCS12_R_MAC_SETUP_ERROR +- {"MAC_SETUP_ERROR", ERR_LIB_PKCS12, PKCS12_R_MAC_SETUP_ERROR}, +- #else +- {"MAC_SETUP_ERROR", 35, 110}, +- #endif +- #ifdef PKCS12_R_MAC_STRING_SET_ERROR +- {"MAC_STRING_SET_ERROR", ERR_LIB_PKCS12, PKCS12_R_MAC_STRING_SET_ERROR}, +- #else +- {"MAC_STRING_SET_ERROR", 35, 111}, +- #endif +- #ifdef PKCS12_R_MAC_VERIFY_FAILURE +- {"MAC_VERIFY_FAILURE", ERR_LIB_PKCS12, PKCS12_R_MAC_VERIFY_FAILURE}, +- #else +- {"MAC_VERIFY_FAILURE", 35, 113}, +- #endif +- #ifdef PKCS12_R_PARSE_ERROR +- {"PARSE_ERROR", ERR_LIB_PKCS12, PKCS12_R_PARSE_ERROR}, +- #else +- {"PARSE_ERROR", 35, 114}, +- #endif +- #ifdef PKCS12_R_PKCS12_CIPHERFINAL_ERROR +- {"PKCS12_CIPHERFINAL_ERROR", ERR_LIB_PKCS12, PKCS12_R_PKCS12_CIPHERFINAL_ERROR}, +- #else +- {"PKCS12_CIPHERFINAL_ERROR", 35, 116}, +- #endif +- #ifdef PKCS12_R_UNKNOWN_DIGEST_ALGORITHM +- {"UNKNOWN_DIGEST_ALGORITHM", ERR_LIB_PKCS12, PKCS12_R_UNKNOWN_DIGEST_ALGORITHM}, +- #else +- {"UNKNOWN_DIGEST_ALGORITHM", 35, 118}, +- #endif +- #ifdef PKCS12_R_UNSUPPORTED_PKCS12_MODE +- {"UNSUPPORTED_PKCS12_MODE", ERR_LIB_PKCS12, PKCS12_R_UNSUPPORTED_PKCS12_MODE}, +- #else +- {"UNSUPPORTED_PKCS12_MODE", 35, 119}, +- #endif +- #ifdef PKCS7_R_CERTIFICATE_VERIFY_ERROR +- {"CERTIFICATE_VERIFY_ERROR", ERR_LIB_PKCS7, PKCS7_R_CERTIFICATE_VERIFY_ERROR}, +- #else +- {"CERTIFICATE_VERIFY_ERROR", 33, 117}, +- #endif +- #ifdef PKCS7_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER +- {"CIPHER_HAS_NO_OBJECT_IDENTIFIER", ERR_LIB_PKCS7, PKCS7_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER}, +- #else +- {"CIPHER_HAS_NO_OBJECT_IDENTIFIER", 33, 144}, +- #endif +- #ifdef PKCS7_R_CIPHER_NOT_INITIALIZED +- {"CIPHER_NOT_INITIALIZED", ERR_LIB_PKCS7, PKCS7_R_CIPHER_NOT_INITIALIZED}, +- #else +- {"CIPHER_NOT_INITIALIZED", 33, 116}, +- #endif +- #ifdef PKCS7_R_CONTENT_AND_DATA_PRESENT +- {"CONTENT_AND_DATA_PRESENT", ERR_LIB_PKCS7, PKCS7_R_CONTENT_AND_DATA_PRESENT}, +- #else +- {"CONTENT_AND_DATA_PRESENT", 33, 118}, +- #endif +- #ifdef PKCS7_R_CTRL_ERROR +- {"CTRL_ERROR", ERR_LIB_PKCS7, PKCS7_R_CTRL_ERROR}, +- #else +- {"CTRL_ERROR", 33, 152}, +- #endif +- #ifdef PKCS7_R_DECRYPT_ERROR +- {"DECRYPT_ERROR", ERR_LIB_PKCS7, PKCS7_R_DECRYPT_ERROR}, +- #else +- {"DECRYPT_ERROR", 33, 119}, +- #endif +- #ifdef PKCS7_R_DIGEST_FAILURE +- {"DIGEST_FAILURE", ERR_LIB_PKCS7, PKCS7_R_DIGEST_FAILURE}, +- #else +- {"DIGEST_FAILURE", 33, 101}, +- #endif +- #ifdef PKCS7_R_ENCRYPTION_CTRL_FAILURE +- {"ENCRYPTION_CTRL_FAILURE", ERR_LIB_PKCS7, PKCS7_R_ENCRYPTION_CTRL_FAILURE}, +- #else +- {"ENCRYPTION_CTRL_FAILURE", 33, 149}, +- #endif +- #ifdef PKCS7_R_ENCRYPTION_NOT_SUPPORTED_FOR_THIS_KEY_TYPE +- {"ENCRYPTION_NOT_SUPPORTED_FOR_THIS_KEY_TYPE", ERR_LIB_PKCS7, PKCS7_R_ENCRYPTION_NOT_SUPPORTED_FOR_THIS_KEY_TYPE}, +- #else +- {"ENCRYPTION_NOT_SUPPORTED_FOR_THIS_KEY_TYPE", 33, 150}, +- #endif +- #ifdef PKCS7_R_ERROR_ADDING_RECIPIENT +- {"ERROR_ADDING_RECIPIENT", ERR_LIB_PKCS7, PKCS7_R_ERROR_ADDING_RECIPIENT}, +- #else +- {"ERROR_ADDING_RECIPIENT", 33, 120}, +- #endif +- #ifdef PKCS7_R_ERROR_SETTING_CIPHER +- {"ERROR_SETTING_CIPHER", ERR_LIB_PKCS7, PKCS7_R_ERROR_SETTING_CIPHER}, +- #else +- {"ERROR_SETTING_CIPHER", 33, 121}, +- #endif +- #ifdef PKCS7_R_INVALID_NULL_POINTER +- {"INVALID_NULL_POINTER", ERR_LIB_PKCS7, PKCS7_R_INVALID_NULL_POINTER}, +- #else +- {"INVALID_NULL_POINTER", 33, 143}, +- #endif +- #ifdef PKCS7_R_INVALID_SIGNED_DATA_TYPE +- {"INVALID_SIGNED_DATA_TYPE", ERR_LIB_PKCS7, PKCS7_R_INVALID_SIGNED_DATA_TYPE}, +- #else +- {"INVALID_SIGNED_DATA_TYPE", 33, 155}, +- #endif +- #ifdef PKCS7_R_NO_CONTENT +- {"NO_CONTENT", ERR_LIB_PKCS7, PKCS7_R_NO_CONTENT}, +- #else +- {"NO_CONTENT", 33, 122}, +- #endif +- #ifdef PKCS7_R_NO_DEFAULT_DIGEST +- {"NO_DEFAULT_DIGEST", ERR_LIB_PKCS7, PKCS7_R_NO_DEFAULT_DIGEST}, +- #else +- {"NO_DEFAULT_DIGEST", 33, 151}, +- #endif +- #ifdef PKCS7_R_NO_MATCHING_DIGEST_TYPE_FOUND +- {"NO_MATCHING_DIGEST_TYPE_FOUND", ERR_LIB_PKCS7, PKCS7_R_NO_MATCHING_DIGEST_TYPE_FOUND}, +- #else +- {"NO_MATCHING_DIGEST_TYPE_FOUND", 33, 154}, +- #endif +- #ifdef PKCS7_R_NO_RECIPIENT_MATCHES_CERTIFICATE +- {"NO_RECIPIENT_MATCHES_CERTIFICATE", ERR_LIB_PKCS7, PKCS7_R_NO_RECIPIENT_MATCHES_CERTIFICATE}, +- #else +- {"NO_RECIPIENT_MATCHES_CERTIFICATE", 33, 115}, +- #endif +- #ifdef PKCS7_R_NO_SIGNATURES_ON_DATA +- {"NO_SIGNATURES_ON_DATA", ERR_LIB_PKCS7, PKCS7_R_NO_SIGNATURES_ON_DATA}, +- #else +- {"NO_SIGNATURES_ON_DATA", 33, 123}, +- #endif +- #ifdef PKCS7_R_NO_SIGNERS +- {"NO_SIGNERS", ERR_LIB_PKCS7, PKCS7_R_NO_SIGNERS}, +- #else +- {"NO_SIGNERS", 33, 142}, +- #endif +- #ifdef PKCS7_R_OPERATION_NOT_SUPPORTED_ON_THIS_TYPE +- {"OPERATION_NOT_SUPPORTED_ON_THIS_TYPE", ERR_LIB_PKCS7, PKCS7_R_OPERATION_NOT_SUPPORTED_ON_THIS_TYPE}, +- #else +- {"OPERATION_NOT_SUPPORTED_ON_THIS_TYPE", 33, 104}, +- #endif +- #ifdef PKCS7_R_PKCS7_ADD_SIGNATURE_ERROR +- {"PKCS7_ADD_SIGNATURE_ERROR", ERR_LIB_PKCS7, PKCS7_R_PKCS7_ADD_SIGNATURE_ERROR}, +- #else +- {"PKCS7_ADD_SIGNATURE_ERROR", 33, 124}, +- #endif +- #ifdef PKCS7_R_PKCS7_ADD_SIGNER_ERROR +- {"PKCS7_ADD_SIGNER_ERROR", ERR_LIB_PKCS7, PKCS7_R_PKCS7_ADD_SIGNER_ERROR}, +- #else +- {"PKCS7_ADD_SIGNER_ERROR", 33, 153}, +- #endif +- #ifdef PKCS7_R_PKCS7_DATASIGN +- {"PKCS7_DATASIGN", ERR_LIB_PKCS7, PKCS7_R_PKCS7_DATASIGN}, +- #else +- {"PKCS7_DATASIGN", 33, 145}, +- #endif +- #ifdef PKCS7_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE +- {"PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE", ERR_LIB_PKCS7, PKCS7_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE}, +- #else +- {"PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE", 33, 127}, +- #endif +- #ifdef PKCS7_R_SIGNATURE_FAILURE +- {"SIGNATURE_FAILURE", ERR_LIB_PKCS7, PKCS7_R_SIGNATURE_FAILURE}, +- #else +- {"SIGNATURE_FAILURE", 33, 105}, +- #endif +- #ifdef PKCS7_R_SIGNER_CERTIFICATE_NOT_FOUND +- {"SIGNER_CERTIFICATE_NOT_FOUND", ERR_LIB_PKCS7, PKCS7_R_SIGNER_CERTIFICATE_NOT_FOUND}, +- #else +- {"SIGNER_CERTIFICATE_NOT_FOUND", 33, 128}, +- #endif +- #ifdef PKCS7_R_SIGNING_CTRL_FAILURE +- {"SIGNING_CTRL_FAILURE", ERR_LIB_PKCS7, PKCS7_R_SIGNING_CTRL_FAILURE}, +- #else +- {"SIGNING_CTRL_FAILURE", 33, 147}, +- #endif +- #ifdef PKCS7_R_SIGNING_NOT_SUPPORTED_FOR_THIS_KEY_TYPE +- {"SIGNING_NOT_SUPPORTED_FOR_THIS_KEY_TYPE", ERR_LIB_PKCS7, PKCS7_R_SIGNING_NOT_SUPPORTED_FOR_THIS_KEY_TYPE}, +- #else +- {"SIGNING_NOT_SUPPORTED_FOR_THIS_KEY_TYPE", 33, 148}, +- #endif +- #ifdef PKCS7_R_SMIME_TEXT_ERROR +- {"SMIME_TEXT_ERROR", ERR_LIB_PKCS7, PKCS7_R_SMIME_TEXT_ERROR}, +- #else +- {"SMIME_TEXT_ERROR", 33, 129}, +- #endif +- #ifdef PKCS7_R_UNABLE_TO_FIND_CERTIFICATE +- {"UNABLE_TO_FIND_CERTIFICATE", ERR_LIB_PKCS7, PKCS7_R_UNABLE_TO_FIND_CERTIFICATE}, +- #else +- {"UNABLE_TO_FIND_CERTIFICATE", 33, 106}, +- #endif +- #ifdef PKCS7_R_UNABLE_TO_FIND_MEM_BIO +- {"UNABLE_TO_FIND_MEM_BIO", ERR_LIB_PKCS7, PKCS7_R_UNABLE_TO_FIND_MEM_BIO}, +- #else +- {"UNABLE_TO_FIND_MEM_BIO", 33, 107}, +- #endif +- #ifdef PKCS7_R_UNABLE_TO_FIND_MESSAGE_DIGEST +- {"UNABLE_TO_FIND_MESSAGE_DIGEST", ERR_LIB_PKCS7, PKCS7_R_UNABLE_TO_FIND_MESSAGE_DIGEST}, +- #else +- {"UNABLE_TO_FIND_MESSAGE_DIGEST", 33, 108}, +- #endif +- #ifdef PKCS7_R_UNKNOWN_DIGEST_TYPE +- {"UNKNOWN_DIGEST_TYPE", ERR_LIB_PKCS7, PKCS7_R_UNKNOWN_DIGEST_TYPE}, +- #else +- {"UNKNOWN_DIGEST_TYPE", 33, 109}, +- #endif +- #ifdef PKCS7_R_UNKNOWN_OPERATION +- {"UNKNOWN_OPERATION", ERR_LIB_PKCS7, PKCS7_R_UNKNOWN_OPERATION}, +- #else +- {"UNKNOWN_OPERATION", 33, 110}, +- #endif +- #ifdef PKCS7_R_UNSUPPORTED_CIPHER_TYPE +- {"UNSUPPORTED_CIPHER_TYPE", ERR_LIB_PKCS7, PKCS7_R_UNSUPPORTED_CIPHER_TYPE}, +- #else +- {"UNSUPPORTED_CIPHER_TYPE", 33, 111}, +- #endif +- #ifdef PKCS7_R_UNSUPPORTED_CONTENT_TYPE +- {"UNSUPPORTED_CONTENT_TYPE", ERR_LIB_PKCS7, PKCS7_R_UNSUPPORTED_CONTENT_TYPE}, +- #else +- {"UNSUPPORTED_CONTENT_TYPE", 33, 112}, +- #endif +- #ifdef PKCS7_R_WRONG_CONTENT_TYPE +- {"WRONG_CONTENT_TYPE", ERR_LIB_PKCS7, PKCS7_R_WRONG_CONTENT_TYPE}, +- #else +- {"WRONG_CONTENT_TYPE", 33, 113}, +- #endif +- #ifdef PKCS7_R_WRONG_PKCS7_TYPE +- {"WRONG_PKCS7_TYPE", ERR_LIB_PKCS7, PKCS7_R_WRONG_PKCS7_TYPE}, +- #else +- {"WRONG_PKCS7_TYPE", 33, 114}, +- #endif +- #ifdef PROP_R_NAME_TOO_LONG +- {"NAME_TOO_LONG", ERR_LIB_PROP, PROP_R_NAME_TOO_LONG}, +- #else +- {"NAME_TOO_LONG", 55, 100}, +- #endif +- #ifdef PROP_R_NOT_AN_ASCII_CHARACTER +- {"NOT_AN_ASCII_CHARACTER", ERR_LIB_PROP, PROP_R_NOT_AN_ASCII_CHARACTER}, +- #else +- {"NOT_AN_ASCII_CHARACTER", 55, 101}, +- #endif +- #ifdef PROP_R_NOT_AN_HEXADECIMAL_DIGIT +- {"NOT_AN_HEXADECIMAL_DIGIT", ERR_LIB_PROP, PROP_R_NOT_AN_HEXADECIMAL_DIGIT}, +- #else +- {"NOT_AN_HEXADECIMAL_DIGIT", 55, 102}, +- #endif +- #ifdef PROP_R_NOT_AN_IDENTIFIER +- {"NOT_AN_IDENTIFIER", ERR_LIB_PROP, PROP_R_NOT_AN_IDENTIFIER}, +- #else +- {"NOT_AN_IDENTIFIER", 55, 103}, +- #endif +- #ifdef PROP_R_NOT_AN_OCTAL_DIGIT +- {"NOT_AN_OCTAL_DIGIT", ERR_LIB_PROP, PROP_R_NOT_AN_OCTAL_DIGIT}, +- #else +- {"NOT_AN_OCTAL_DIGIT", 55, 104}, +- #endif +- #ifdef PROP_R_NOT_A_DECIMAL_DIGIT +- {"NOT_A_DECIMAL_DIGIT", ERR_LIB_PROP, PROP_R_NOT_A_DECIMAL_DIGIT}, +- #else +- {"NOT_A_DECIMAL_DIGIT", 55, 105}, +- #endif +- #ifdef PROP_R_NO_MATCHING_STRING_DELIMITER +- {"NO_MATCHING_STRING_DELIMITER", ERR_LIB_PROP, PROP_R_NO_MATCHING_STRING_DELIMITER}, +- #else +- {"NO_MATCHING_STRING_DELIMITER", 55, 106}, +- #endif +- #ifdef PROP_R_NO_VALUE +- {"NO_VALUE", ERR_LIB_PROP, PROP_R_NO_VALUE}, +- #else +- {"NO_VALUE", 55, 107}, +- #endif +- #ifdef PROP_R_PARSE_FAILED +- {"PARSE_FAILED", ERR_LIB_PROP, PROP_R_PARSE_FAILED}, +- #else +- {"PARSE_FAILED", 55, 108}, +- #endif +- #ifdef PROP_R_STRING_TOO_LONG +- {"STRING_TOO_LONG", ERR_LIB_PROP, PROP_R_STRING_TOO_LONG}, +- #else +- {"STRING_TOO_LONG", 55, 109}, +- #endif +- #ifdef PROP_R_TRAILING_CHARACTERS +- {"TRAILING_CHARACTERS", ERR_LIB_PROP, PROP_R_TRAILING_CHARACTERS}, +- #else +- {"TRAILING_CHARACTERS", 55, 110}, +- #endif +- #ifdef PROV_R_ADDITIONAL_INPUT_TOO_LONG +- {"ADDITIONAL_INPUT_TOO_LONG", ERR_LIB_PROV, PROV_R_ADDITIONAL_INPUT_TOO_LONG}, +- #else +- {"ADDITIONAL_INPUT_TOO_LONG", 57, 184}, +- #endif +- #ifdef PROV_R_ALGORITHM_MISMATCH +- {"ALGORITHM_MISMATCH", ERR_LIB_PROV, PROV_R_ALGORITHM_MISMATCH}, +- #else +- {"ALGORITHM_MISMATCH", 57, 173}, +- #endif +- #ifdef PROV_R_ALREADY_INSTANTIATED +- {"ALREADY_INSTANTIATED", ERR_LIB_PROV, PROV_R_ALREADY_INSTANTIATED}, +- #else +- {"ALREADY_INSTANTIATED", 57, 185}, +- #endif +- #ifdef PROV_R_BAD_DECRYPT +- {"BAD_DECRYPT", ERR_LIB_PROV, PROV_R_BAD_DECRYPT}, +- #else +- {"BAD_DECRYPT", 57, 100}, +- #endif +- #ifdef PROV_R_BAD_ENCODING +- {"BAD_ENCODING", ERR_LIB_PROV, PROV_R_BAD_ENCODING}, +- #else +- {"BAD_ENCODING", 57, 141}, +- #endif +- #ifdef PROV_R_BAD_LENGTH +- {"BAD_LENGTH", ERR_LIB_PROV, PROV_R_BAD_LENGTH}, +- #else +- {"BAD_LENGTH", 57, 142}, +- #endif +- #ifdef PROV_R_BAD_TLS_CLIENT_VERSION +- {"BAD_TLS_CLIENT_VERSION", ERR_LIB_PROV, PROV_R_BAD_TLS_CLIENT_VERSION}, +- #else +- {"BAD_TLS_CLIENT_VERSION", 57, 161}, +- #endif +- #ifdef PROV_R_BN_ERROR +- {"BN_ERROR", ERR_LIB_PROV, PROV_R_BN_ERROR}, +- #else +- {"BN_ERROR", 57, 160}, +- #endif +- #ifdef PROV_R_CIPHER_OPERATION_FAILED +- {"CIPHER_OPERATION_FAILED", ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED}, +- #else +- {"CIPHER_OPERATION_FAILED", 57, 102}, +- #endif +- #ifdef PROV_R_DERIVATION_FUNCTION_INIT_FAILED +- {"DERIVATION_FUNCTION_INIT_FAILED", ERR_LIB_PROV, PROV_R_DERIVATION_FUNCTION_INIT_FAILED}, +- #else +- {"DERIVATION_FUNCTION_INIT_FAILED", 57, 205}, +- #endif +- #ifdef PROV_R_DIGEST_NOT_ALLOWED +- {"DIGEST_NOT_ALLOWED", ERR_LIB_PROV, PROV_R_DIGEST_NOT_ALLOWED}, +- #else +- {"DIGEST_NOT_ALLOWED", 57, 174}, +- #endif +- #ifdef PROV_R_EMS_NOT_ENABLED +- {"EMS_NOT_ENABLED", ERR_LIB_PROV, PROV_R_EMS_NOT_ENABLED}, +- #else +- {"EMS_NOT_ENABLED", 57, 233}, +- #endif +- #ifdef PROV_R_ENTROPY_SOURCE_STRENGTH_TOO_WEAK +- {"ENTROPY_SOURCE_STRENGTH_TOO_WEAK", ERR_LIB_PROV, PROV_R_ENTROPY_SOURCE_STRENGTH_TOO_WEAK}, +- #else +- {"ENTROPY_SOURCE_STRENGTH_TOO_WEAK", 57, 186}, +- #endif +- #ifdef PROV_R_ERROR_INSTANTIATING_DRBG +- {"ERROR_INSTANTIATING_DRBG", ERR_LIB_PROV, PROV_R_ERROR_INSTANTIATING_DRBG}, +- #else +- {"ERROR_INSTANTIATING_DRBG", 57, 188}, +- #endif +- #ifdef PROV_R_ERROR_RETRIEVING_ENTROPY +- {"ERROR_RETRIEVING_ENTROPY", ERR_LIB_PROV, PROV_R_ERROR_RETRIEVING_ENTROPY}, +- #else +- {"ERROR_RETRIEVING_ENTROPY", 57, 189}, +- #endif +- #ifdef PROV_R_ERROR_RETRIEVING_NONCE +- {"ERROR_RETRIEVING_NONCE", ERR_LIB_PROV, PROV_R_ERROR_RETRIEVING_NONCE}, +- #else +- {"ERROR_RETRIEVING_NONCE", 57, 190}, +- #endif +- #ifdef PROV_R_FAILED_DURING_DERIVATION +- {"FAILED_DURING_DERIVATION", ERR_LIB_PROV, PROV_R_FAILED_DURING_DERIVATION}, +- #else +- {"FAILED_DURING_DERIVATION", 57, 164}, +- #endif +- #ifdef PROV_R_FAILED_TO_CREATE_LOCK +- {"FAILED_TO_CREATE_LOCK", ERR_LIB_PROV, PROV_R_FAILED_TO_CREATE_LOCK}, +- #else +- {"FAILED_TO_CREATE_LOCK", 57, 180}, +- #endif +- #ifdef PROV_R_FAILED_TO_DECRYPT +- {"FAILED_TO_DECRYPT", ERR_LIB_PROV, PROV_R_FAILED_TO_DECRYPT}, +- #else +- {"FAILED_TO_DECRYPT", 57, 162}, +- #endif +- #ifdef PROV_R_FAILED_TO_GENERATE_KEY +- {"FAILED_TO_GENERATE_KEY", ERR_LIB_PROV, PROV_R_FAILED_TO_GENERATE_KEY}, +- #else +- {"FAILED_TO_GENERATE_KEY", 57, 121}, +- #endif +- #ifdef PROV_R_FAILED_TO_GET_PARAMETER +- {"FAILED_TO_GET_PARAMETER", ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER}, +- #else +- {"FAILED_TO_GET_PARAMETER", 57, 103}, +- #endif +- #ifdef PROV_R_FAILED_TO_SET_PARAMETER +- {"FAILED_TO_SET_PARAMETER", ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER}, +- #else +- {"FAILED_TO_SET_PARAMETER", 57, 104}, +- #endif +- #ifdef PROV_R_FAILED_TO_SIGN +- {"FAILED_TO_SIGN", ERR_LIB_PROV, PROV_R_FAILED_TO_SIGN}, +- #else +- {"FAILED_TO_SIGN", 57, 175}, +- #endif +- #ifdef PROV_R_FIPS_MODULE_CONDITIONAL_ERROR +- {"FIPS_MODULE_CONDITIONAL_ERROR", ERR_LIB_PROV, PROV_R_FIPS_MODULE_CONDITIONAL_ERROR}, +- #else +- {"FIPS_MODULE_CONDITIONAL_ERROR", 57, 227}, +- #endif +- #ifdef PROV_R_FIPS_MODULE_ENTERING_ERROR_STATE +- {"FIPS_MODULE_ENTERING_ERROR_STATE", ERR_LIB_PROV, PROV_R_FIPS_MODULE_ENTERING_ERROR_STATE}, +- #else +- {"FIPS_MODULE_ENTERING_ERROR_STATE", 57, 224}, +- #endif +- #ifdef PROV_R_FIPS_MODULE_IN_ERROR_STATE +- {"FIPS_MODULE_IN_ERROR_STATE", ERR_LIB_PROV, PROV_R_FIPS_MODULE_IN_ERROR_STATE}, +- #else +- {"FIPS_MODULE_IN_ERROR_STATE", 57, 225}, +- #endif +- #ifdef PROV_R_GENERATE_ERROR +- {"GENERATE_ERROR", ERR_LIB_PROV, PROV_R_GENERATE_ERROR}, +- #else +- {"GENERATE_ERROR", 57, 191}, +- #endif +- #ifdef PROV_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE +- {"ILLEGAL_OR_UNSUPPORTED_PADDING_MODE", ERR_LIB_PROV, PROV_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE}, +- #else +- {"ILLEGAL_OR_UNSUPPORTED_PADDING_MODE", 57, 165}, +- #endif +- #ifdef PROV_R_INDICATOR_INTEGRITY_FAILURE +- {"INDICATOR_INTEGRITY_FAILURE", ERR_LIB_PROV, PROV_R_INDICATOR_INTEGRITY_FAILURE}, +- #else +- {"INDICATOR_INTEGRITY_FAILURE", 57, 210}, +- #endif +- #ifdef PROV_R_INSUFFICIENT_DRBG_STRENGTH +- {"INSUFFICIENT_DRBG_STRENGTH", ERR_LIB_PROV, PROV_R_INSUFFICIENT_DRBG_STRENGTH}, +- #else +- {"INSUFFICIENT_DRBG_STRENGTH", 57, 181}, +- #endif +- #ifdef PROV_R_INVALID_AAD +- {"INVALID_AAD", ERR_LIB_PROV, PROV_R_INVALID_AAD}, +- #else +- {"INVALID_AAD", 57, 108}, +- #endif +- #ifdef PROV_R_INVALID_CONFIG_DATA +- {"INVALID_CONFIG_DATA", ERR_LIB_PROV, PROV_R_INVALID_CONFIG_DATA}, +- #else +- {"INVALID_CONFIG_DATA", 57, 211}, +- #endif +- #ifdef PROV_R_INVALID_CONSTANT_LENGTH +- {"INVALID_CONSTANT_LENGTH", ERR_LIB_PROV, PROV_R_INVALID_CONSTANT_LENGTH}, +- #else +- {"INVALID_CONSTANT_LENGTH", 57, 157}, +- #endif +- #ifdef PROV_R_INVALID_CURVE +- {"INVALID_CURVE", ERR_LIB_PROV, PROV_R_INVALID_CURVE}, +- #else +- {"INVALID_CURVE", 57, 176}, +- #endif +- #ifdef PROV_R_INVALID_CUSTOM_LENGTH +- {"INVALID_CUSTOM_LENGTH", ERR_LIB_PROV, PROV_R_INVALID_CUSTOM_LENGTH}, +- #else +- {"INVALID_CUSTOM_LENGTH", 57, 111}, +- #endif +- #ifdef PROV_R_INVALID_DATA +- {"INVALID_DATA", ERR_LIB_PROV, PROV_R_INVALID_DATA}, +- #else +- {"INVALID_DATA", 57, 115}, +- #endif +- #ifdef PROV_R_INVALID_DIGEST +- {"INVALID_DIGEST", ERR_LIB_PROV, PROV_R_INVALID_DIGEST}, +- #else +- {"INVALID_DIGEST", 57, 122}, +- #endif +- #ifdef PROV_R_INVALID_DIGEST_LENGTH +- {"INVALID_DIGEST_LENGTH", ERR_LIB_PROV, PROV_R_INVALID_DIGEST_LENGTH}, +- #else +- {"INVALID_DIGEST_LENGTH", 57, 166}, +- #endif +- #ifdef PROV_R_INVALID_DIGEST_SIZE +- {"INVALID_DIGEST_SIZE", ERR_LIB_PROV, PROV_R_INVALID_DIGEST_SIZE}, +- #else +- {"INVALID_DIGEST_SIZE", 57, 218}, +- #endif +- #ifdef PROV_R_INVALID_INPUT_LENGTH +- {"INVALID_INPUT_LENGTH", ERR_LIB_PROV, PROV_R_INVALID_INPUT_LENGTH}, +- #else +- {"INVALID_INPUT_LENGTH", 57, 230}, +- #endif +- #ifdef PROV_R_INVALID_ITERATION_COUNT +- {"INVALID_ITERATION_COUNT", ERR_LIB_PROV, PROV_R_INVALID_ITERATION_COUNT}, +- #else +- {"INVALID_ITERATION_COUNT", 57, 123}, +- #endif +- #ifdef PROV_R_INVALID_IV_LENGTH +- {"INVALID_IV_LENGTH", ERR_LIB_PROV, PROV_R_INVALID_IV_LENGTH}, +- #else +- {"INVALID_IV_LENGTH", 57, 109}, +- #endif +- #ifdef PROV_R_INVALID_KEY +- {"INVALID_KEY", ERR_LIB_PROV, PROV_R_INVALID_KEY}, +- #else +- {"INVALID_KEY", 57, 158}, +- #endif +- #ifdef PROV_R_INVALID_KEY_LENGTH +- {"INVALID_KEY_LENGTH", ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH}, +- #else +- {"INVALID_KEY_LENGTH", 57, 105}, +- #endif +- #ifdef PROV_R_INVALID_MAC +- {"INVALID_MAC", ERR_LIB_PROV, PROV_R_INVALID_MAC}, +- #else +- {"INVALID_MAC", 57, 151}, +- #endif +- #ifdef PROV_R_INVALID_MGF1_MD +- {"INVALID_MGF1_MD", ERR_LIB_PROV, PROV_R_INVALID_MGF1_MD}, +- #else +- {"INVALID_MGF1_MD", 57, 167}, +- #endif +- #ifdef PROV_R_INVALID_MODE +- {"INVALID_MODE", ERR_LIB_PROV, PROV_R_INVALID_MODE}, +- #else +- {"INVALID_MODE", 57, 125}, +- #endif +- #ifdef PROV_R_INVALID_OUTPUT_LENGTH +- {"INVALID_OUTPUT_LENGTH", ERR_LIB_PROV, PROV_R_INVALID_OUTPUT_LENGTH}, +- #else +- {"INVALID_OUTPUT_LENGTH", 57, 217}, +- #endif +- #ifdef PROV_R_INVALID_PADDING_MODE +- {"INVALID_PADDING_MODE", ERR_LIB_PROV, PROV_R_INVALID_PADDING_MODE}, +- #else +- {"INVALID_PADDING_MODE", 57, 168}, +- #endif +- #ifdef PROV_R_INVALID_PUBINFO +- {"INVALID_PUBINFO", ERR_LIB_PROV, PROV_R_INVALID_PUBINFO}, +- #else +- {"INVALID_PUBINFO", 57, 198}, +- #endif +- #ifdef PROV_R_INVALID_SALT_LENGTH +- {"INVALID_SALT_LENGTH", ERR_LIB_PROV, PROV_R_INVALID_SALT_LENGTH}, +- #else +- {"INVALID_SALT_LENGTH", 57, 112}, +- #endif +- #ifdef PROV_R_INVALID_SEED_LENGTH +- {"INVALID_SEED_LENGTH", ERR_LIB_PROV, PROV_R_INVALID_SEED_LENGTH}, +- #else +- {"INVALID_SEED_LENGTH", 57, 154}, +- #endif +- #ifdef PROV_R_INVALID_SIGNATURE_SIZE +- {"INVALID_SIGNATURE_SIZE", ERR_LIB_PROV, PROV_R_INVALID_SIGNATURE_SIZE}, +- #else +- {"INVALID_SIGNATURE_SIZE", 57, 179}, +- #endif +- #ifdef PROV_R_INVALID_STATE +- {"INVALID_STATE", ERR_LIB_PROV, PROV_R_INVALID_STATE}, +- #else +- {"INVALID_STATE", 57, 212}, +- #endif +- #ifdef PROV_R_INVALID_TAG +- {"INVALID_TAG", ERR_LIB_PROV, PROV_R_INVALID_TAG}, +- #else +- {"INVALID_TAG", 57, 110}, +- #endif +- #ifdef PROV_R_INVALID_TAG_LENGTH +- {"INVALID_TAG_LENGTH", ERR_LIB_PROV, PROV_R_INVALID_TAG_LENGTH}, +- #else +- {"INVALID_TAG_LENGTH", 57, 118}, +- #endif +- #ifdef PROV_R_INVALID_UKM_LENGTH +- {"INVALID_UKM_LENGTH", ERR_LIB_PROV, PROV_R_INVALID_UKM_LENGTH}, +- #else +- {"INVALID_UKM_LENGTH", 57, 200}, +- #endif +- #ifdef PROV_R_INVALID_X931_DIGEST +- {"INVALID_X931_DIGEST", ERR_LIB_PROV, PROV_R_INVALID_X931_DIGEST}, +- #else +- {"INVALID_X931_DIGEST", 57, 170}, +- #endif +- #ifdef PROV_R_IN_ERROR_STATE +- {"IN_ERROR_STATE", ERR_LIB_PROV, PROV_R_IN_ERROR_STATE}, +- #else +- {"IN_ERROR_STATE", 57, 192}, +- #endif +- #ifdef PROV_R_KEY_SETUP_FAILED +- {"KEY_SETUP_FAILED", ERR_LIB_PROV, PROV_R_KEY_SETUP_FAILED}, +- #else +- {"KEY_SETUP_FAILED", 57, 101}, +- #endif +- #ifdef PROV_R_KEY_SIZE_TOO_SMALL +- {"KEY_SIZE_TOO_SMALL", ERR_LIB_PROV, PROV_R_KEY_SIZE_TOO_SMALL}, +- #else +- {"KEY_SIZE_TOO_SMALL", 57, 171}, +- #endif +- #ifdef PROV_R_LENGTH_TOO_LARGE +- {"LENGTH_TOO_LARGE", ERR_LIB_PROV, PROV_R_LENGTH_TOO_LARGE}, +- #else +- {"LENGTH_TOO_LARGE", 57, 202}, +- #endif +- #ifdef PROV_R_MISMATCHING_DOMAIN_PARAMETERS +- {"MISMATCHING_DOMAIN_PARAMETERS", ERR_LIB_PROV, PROV_R_MISMATCHING_DOMAIN_PARAMETERS}, +- #else +- {"MISMATCHING_DOMAIN_PARAMETERS", 57, 203}, +- #endif +- #ifdef PROV_R_MISSING_CEK_ALG +- {"MISSING_CEK_ALG", ERR_LIB_PROV, PROV_R_MISSING_CEK_ALG}, +- #else +- {"MISSING_CEK_ALG", 57, 144}, +- #endif +- #ifdef PROV_R_MISSING_CIPHER +- {"MISSING_CIPHER", ERR_LIB_PROV, PROV_R_MISSING_CIPHER}, +- #else +- {"MISSING_CIPHER", 57, 155}, +- #endif +- #ifdef PROV_R_MISSING_CONFIG_DATA +- {"MISSING_CONFIG_DATA", ERR_LIB_PROV, PROV_R_MISSING_CONFIG_DATA}, +- #else +- {"MISSING_CONFIG_DATA", 57, 213}, +- #endif +- #ifdef PROV_R_MISSING_CONSTANT +- {"MISSING_CONSTANT", ERR_LIB_PROV, PROV_R_MISSING_CONSTANT}, +- #else +- {"MISSING_CONSTANT", 57, 156}, +- #endif +- #ifdef PROV_R_MISSING_KEY +- {"MISSING_KEY", ERR_LIB_PROV, PROV_R_MISSING_KEY}, +- #else +- {"MISSING_KEY", 57, 128}, +- #endif +- #ifdef PROV_R_MISSING_MAC +- {"MISSING_MAC", ERR_LIB_PROV, PROV_R_MISSING_MAC}, +- #else +- {"MISSING_MAC", 57, 150}, +- #endif +- #ifdef PROV_R_MISSING_MESSAGE_DIGEST +- {"MISSING_MESSAGE_DIGEST", ERR_LIB_PROV, PROV_R_MISSING_MESSAGE_DIGEST}, +- #else +- {"MISSING_MESSAGE_DIGEST", 57, 129}, +- #endif +- #ifdef PROV_R_MISSING_OID +- {"MISSING_OID", ERR_LIB_PROV, PROV_R_MISSING_OID}, +- #else +- {"MISSING_OID", 57, 209}, +- #endif +- #ifdef PROV_R_MISSING_PASS +- {"MISSING_PASS", ERR_LIB_PROV, PROV_R_MISSING_PASS}, +- #else +- {"MISSING_PASS", 57, 130}, +- #endif +- #ifdef PROV_R_MISSING_SALT +- {"MISSING_SALT", ERR_LIB_PROV, PROV_R_MISSING_SALT}, +- #else +- {"MISSING_SALT", 57, 131}, +- #endif +- #ifdef PROV_R_MISSING_SECRET +- {"MISSING_SECRET", ERR_LIB_PROV, PROV_R_MISSING_SECRET}, +- #else +- {"MISSING_SECRET", 57, 132}, +- #endif +- #ifdef PROV_R_MISSING_SEED +- {"MISSING_SEED", ERR_LIB_PROV, PROV_R_MISSING_SEED}, +- #else +- {"MISSING_SEED", 57, 140}, +- #endif +- #ifdef PROV_R_MISSING_SESSION_ID +- {"MISSING_SESSION_ID", ERR_LIB_PROV, PROV_R_MISSING_SESSION_ID}, +- #else +- {"MISSING_SESSION_ID", 57, 133}, +- #endif +- #ifdef PROV_R_MISSING_TYPE +- {"MISSING_TYPE", ERR_LIB_PROV, PROV_R_MISSING_TYPE}, +- #else +- {"MISSING_TYPE", 57, 134}, +- #endif +- #ifdef PROV_R_MISSING_XCGHASH +- {"MISSING_XCGHASH", ERR_LIB_PROV, PROV_R_MISSING_XCGHASH}, +- #else +- {"MISSING_XCGHASH", 57, 135}, +- #endif +- #ifdef PROV_R_MODULE_INTEGRITY_FAILURE +- {"MODULE_INTEGRITY_FAILURE", ERR_LIB_PROV, PROV_R_MODULE_INTEGRITY_FAILURE}, +- #else +- {"MODULE_INTEGRITY_FAILURE", 57, 214}, +- #endif +- #ifdef PROV_R_NOT_A_PRIVATE_KEY +- {"NOT_A_PRIVATE_KEY", ERR_LIB_PROV, PROV_R_NOT_A_PRIVATE_KEY}, +- #else +- {"NOT_A_PRIVATE_KEY", 57, 221}, +- #endif +- #ifdef PROV_R_NOT_A_PUBLIC_KEY +- {"NOT_A_PUBLIC_KEY", ERR_LIB_PROV, PROV_R_NOT_A_PUBLIC_KEY}, +- #else +- {"NOT_A_PUBLIC_KEY", 57, 220}, +- #endif +- #ifdef PROV_R_NOT_INSTANTIATED +- {"NOT_INSTANTIATED", ERR_LIB_PROV, PROV_R_NOT_INSTANTIATED}, +- #else +- {"NOT_INSTANTIATED", 57, 193}, +- #endif +- #ifdef PROV_R_NOT_PARAMETERS +- {"NOT_PARAMETERS", ERR_LIB_PROV, PROV_R_NOT_PARAMETERS}, +- #else +- {"NOT_PARAMETERS", 57, 226}, +- #endif +- #ifdef PROV_R_NOT_SUPPORTED +- {"NOT_SUPPORTED", ERR_LIB_PROV, PROV_R_NOT_SUPPORTED}, +- #else +- {"NOT_SUPPORTED", 57, 136}, +- #endif +- #ifdef PROV_R_NOT_XOF_OR_INVALID_LENGTH +- {"NOT_XOF_OR_INVALID_LENGTH", ERR_LIB_PROV, PROV_R_NOT_XOF_OR_INVALID_LENGTH}, +- #else +- {"NOT_XOF_OR_INVALID_LENGTH", 57, 113}, +- #endif +- #ifdef PROV_R_NO_KEY_SET +- {"NO_KEY_SET", ERR_LIB_PROV, PROV_R_NO_KEY_SET}, +- #else +- {"NO_KEY_SET", 57, 114}, +- #endif +- #ifdef PROV_R_NO_PARAMETERS_SET +- {"NO_PARAMETERS_SET", ERR_LIB_PROV, PROV_R_NO_PARAMETERS_SET}, +- #else +- {"NO_PARAMETERS_SET", 57, 177}, +- #endif +- #ifdef PROV_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE +- {"OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE", ERR_LIB_PROV, PROV_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE}, +- #else +- {"OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE", 57, 178}, +- #endif +- #ifdef PROV_R_OUTPUT_BUFFER_TOO_SMALL +- {"OUTPUT_BUFFER_TOO_SMALL", ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL}, +- #else +- {"OUTPUT_BUFFER_TOO_SMALL", 57, 106}, +- #endif +- #ifdef PROV_R_PARENT_CANNOT_GENERATE_RANDOM_NUMBERS +- {"PARENT_CANNOT_GENERATE_RANDOM_NUMBERS", ERR_LIB_PROV, PROV_R_PARENT_CANNOT_GENERATE_RANDOM_NUMBERS}, +- #else +- {"PARENT_CANNOT_GENERATE_RANDOM_NUMBERS", 57, 228}, +- #endif +- #ifdef PROV_R_PARENT_CANNOT_SUPPLY_ENTROPY_SEED +- {"PARENT_CANNOT_SUPPLY_ENTROPY_SEED", ERR_LIB_PROV, PROV_R_PARENT_CANNOT_SUPPLY_ENTROPY_SEED}, +- #else +- {"PARENT_CANNOT_SUPPLY_ENTROPY_SEED", 57, 187}, +- #endif +- #ifdef PROV_R_PARENT_LOCKING_NOT_ENABLED +- {"PARENT_LOCKING_NOT_ENABLED", ERR_LIB_PROV, PROV_R_PARENT_LOCKING_NOT_ENABLED}, +- #else +- {"PARENT_LOCKING_NOT_ENABLED", 57, 182}, +- #endif +- #ifdef PROV_R_PARENT_STRENGTH_TOO_WEAK +- {"PARENT_STRENGTH_TOO_WEAK", ERR_LIB_PROV, PROV_R_PARENT_STRENGTH_TOO_WEAK}, +- #else +- {"PARENT_STRENGTH_TOO_WEAK", 57, 194}, +- #endif +- #ifdef PROV_R_PATH_MUST_BE_ABSOLUTE +- {"PATH_MUST_BE_ABSOLUTE", ERR_LIB_PROV, PROV_R_PATH_MUST_BE_ABSOLUTE}, +- #else +- {"PATH_MUST_BE_ABSOLUTE", 57, 219}, +- #endif +- #ifdef PROV_R_PERSONALISATION_STRING_TOO_LONG +- {"PERSONALISATION_STRING_TOO_LONG", ERR_LIB_PROV, PROV_R_PERSONALISATION_STRING_TOO_LONG}, +- #else +- {"PERSONALISATION_STRING_TOO_LONG", 57, 195}, +- #endif +- #ifdef PROV_R_PSS_SALTLEN_TOO_SMALL +- {"PSS_SALTLEN_TOO_SMALL", ERR_LIB_PROV, PROV_R_PSS_SALTLEN_TOO_SMALL}, +- #else +- {"PSS_SALTLEN_TOO_SMALL", 57, 172}, +- #endif +- #ifdef PROV_R_REQUEST_TOO_LARGE_FOR_DRBG +- {"REQUEST_TOO_LARGE_FOR_DRBG", ERR_LIB_PROV, PROV_R_REQUEST_TOO_LARGE_FOR_DRBG}, +- #else +- {"REQUEST_TOO_LARGE_FOR_DRBG", 57, 196}, +- #endif +- #ifdef PROV_R_REQUIRE_CTR_MODE_CIPHER +- {"REQUIRE_CTR_MODE_CIPHER", ERR_LIB_PROV, PROV_R_REQUIRE_CTR_MODE_CIPHER}, +- #else +- {"REQUIRE_CTR_MODE_CIPHER", 57, 206}, +- #endif +- #ifdef PROV_R_RESEED_ERROR +- {"RESEED_ERROR", ERR_LIB_PROV, PROV_R_RESEED_ERROR}, +- #else +- {"RESEED_ERROR", 57, 197}, +- #endif +- #ifdef PROV_R_SEARCH_ONLY_SUPPORTED_FOR_DIRECTORIES +- {"SEARCH_ONLY_SUPPORTED_FOR_DIRECTORIES", ERR_LIB_PROV, PROV_R_SEARCH_ONLY_SUPPORTED_FOR_DIRECTORIES}, +- #else +- {"SEARCH_ONLY_SUPPORTED_FOR_DIRECTORIES", 57, 222}, +- #endif +- #ifdef PROV_R_SEED_SOURCES_MUST_NOT_HAVE_A_PARENT +- {"SEED_SOURCES_MUST_NOT_HAVE_A_PARENT", ERR_LIB_PROV, PROV_R_SEED_SOURCES_MUST_NOT_HAVE_A_PARENT}, +- #else +- {"SEED_SOURCES_MUST_NOT_HAVE_A_PARENT", 57, 229}, +- #endif +- #ifdef PROV_R_SELF_TEST_KAT_FAILURE +- {"SELF_TEST_KAT_FAILURE", ERR_LIB_PROV, PROV_R_SELF_TEST_KAT_FAILURE}, +- #else +- {"SELF_TEST_KAT_FAILURE", 57, 215}, +- #endif +- #ifdef PROV_R_SELF_TEST_POST_FAILURE +- {"SELF_TEST_POST_FAILURE", ERR_LIB_PROV, PROV_R_SELF_TEST_POST_FAILURE}, +- #else +- {"SELF_TEST_POST_FAILURE", 57, 216}, +- #endif +- #ifdef PROV_R_TAG_NOT_NEEDED +- {"TAG_NOT_NEEDED", ERR_LIB_PROV, PROV_R_TAG_NOT_NEEDED}, +- #else +- {"TAG_NOT_NEEDED", 57, 120}, +- #endif +- #ifdef PROV_R_TAG_NOT_SET +- {"TAG_NOT_SET", ERR_LIB_PROV, PROV_R_TAG_NOT_SET}, +- #else +- {"TAG_NOT_SET", 57, 119}, +- #endif +- #ifdef PROV_R_TOO_MANY_RECORDS +- {"TOO_MANY_RECORDS", ERR_LIB_PROV, PROV_R_TOO_MANY_RECORDS}, +- #else +- {"TOO_MANY_RECORDS", 57, 126}, +- #endif +- #ifdef PROV_R_UNABLE_TO_FIND_CIPHERS +- {"UNABLE_TO_FIND_CIPHERS", ERR_LIB_PROV, PROV_R_UNABLE_TO_FIND_CIPHERS}, +- #else +- {"UNABLE_TO_FIND_CIPHERS", 57, 207}, +- #endif +- #ifdef PROV_R_UNABLE_TO_GET_PARENT_STRENGTH +- {"UNABLE_TO_GET_PARENT_STRENGTH", ERR_LIB_PROV, PROV_R_UNABLE_TO_GET_PARENT_STRENGTH}, +- #else +- {"UNABLE_TO_GET_PARENT_STRENGTH", 57, 199}, +- #endif +- #ifdef PROV_R_UNABLE_TO_GET_PASSPHRASE +- {"UNABLE_TO_GET_PASSPHRASE", ERR_LIB_PROV, PROV_R_UNABLE_TO_GET_PASSPHRASE}, +- #else +- {"UNABLE_TO_GET_PASSPHRASE", 57, 159}, +- #endif +- #ifdef PROV_R_UNABLE_TO_INITIALISE_CIPHERS +- {"UNABLE_TO_INITIALISE_CIPHERS", ERR_LIB_PROV, PROV_R_UNABLE_TO_INITIALISE_CIPHERS}, +- #else +- {"UNABLE_TO_INITIALISE_CIPHERS", 57, 208}, +- #endif +- #ifdef PROV_R_UNABLE_TO_LOAD_SHA256 +- {"UNABLE_TO_LOAD_SHA256", ERR_LIB_PROV, PROV_R_UNABLE_TO_LOAD_SHA256}, +- #else +- {"UNABLE_TO_LOAD_SHA256", 57, 147}, +- #endif +- #ifdef PROV_R_UNABLE_TO_LOCK_PARENT +- {"UNABLE_TO_LOCK_PARENT", ERR_LIB_PROV, PROV_R_UNABLE_TO_LOCK_PARENT}, +- #else +- {"UNABLE_TO_LOCK_PARENT", 57, 201}, +- #endif +- #ifdef PROV_R_UNABLE_TO_RESEED +- {"UNABLE_TO_RESEED", ERR_LIB_PROV, PROV_R_UNABLE_TO_RESEED}, +- #else +- {"UNABLE_TO_RESEED", 57, 204}, +- #endif +- #ifdef PROV_R_UNSUPPORTED_CEK_ALG +- {"UNSUPPORTED_CEK_ALG", ERR_LIB_PROV, PROV_R_UNSUPPORTED_CEK_ALG}, +- #else +- {"UNSUPPORTED_CEK_ALG", 57, 145}, +- #endif +- #ifdef PROV_R_UNSUPPORTED_KEY_SIZE +- {"UNSUPPORTED_KEY_SIZE", ERR_LIB_PROV, PROV_R_UNSUPPORTED_KEY_SIZE}, +- #else +- {"UNSUPPORTED_KEY_SIZE", 57, 153}, +- #endif +- #ifdef PROV_R_UNSUPPORTED_MAC_TYPE +- {"UNSUPPORTED_MAC_TYPE", ERR_LIB_PROV, PROV_R_UNSUPPORTED_MAC_TYPE}, +- #else +- {"UNSUPPORTED_MAC_TYPE", 57, 137}, +- #endif +- #ifdef PROV_R_UNSUPPORTED_NUMBER_OF_ROUNDS +- {"UNSUPPORTED_NUMBER_OF_ROUNDS", ERR_LIB_PROV, PROV_R_UNSUPPORTED_NUMBER_OF_ROUNDS}, +- #else +- {"UNSUPPORTED_NUMBER_OF_ROUNDS", 57, 152}, +- #endif +- #ifdef PROV_R_URI_AUTHORITY_UNSUPPORTED +- {"URI_AUTHORITY_UNSUPPORTED", ERR_LIB_PROV, PROV_R_URI_AUTHORITY_UNSUPPORTED}, +- #else +- {"URI_AUTHORITY_UNSUPPORTED", 57, 223}, +- #endif +- #ifdef PROV_R_VALUE_ERROR +- {"VALUE_ERROR", ERR_LIB_PROV, PROV_R_VALUE_ERROR}, +- #else +- {"VALUE_ERROR", 57, 138}, +- #endif +- #ifdef PROV_R_WRONG_FINAL_BLOCK_LENGTH +- {"WRONG_FINAL_BLOCK_LENGTH", ERR_LIB_PROV, PROV_R_WRONG_FINAL_BLOCK_LENGTH}, +- #else +- {"WRONG_FINAL_BLOCK_LENGTH", 57, 107}, +- #endif +- #ifdef PROV_R_WRONG_OUTPUT_BUFFER_SIZE +- {"WRONG_OUTPUT_BUFFER_SIZE", ERR_LIB_PROV, PROV_R_WRONG_OUTPUT_BUFFER_SIZE}, +- #else +- {"WRONG_OUTPUT_BUFFER_SIZE", 57, 139}, +- #endif +- #ifdef PROV_R_XOF_DIGESTS_NOT_ALLOWED +- {"XOF_DIGESTS_NOT_ALLOWED", ERR_LIB_PROV, PROV_R_XOF_DIGESTS_NOT_ALLOWED}, +- #else +- {"XOF_DIGESTS_NOT_ALLOWED", 57, 183}, +- #endif +- #ifdef PROV_R_XTS_DATA_UNIT_IS_TOO_LARGE +- {"XTS_DATA_UNIT_IS_TOO_LARGE", ERR_LIB_PROV, PROV_R_XTS_DATA_UNIT_IS_TOO_LARGE}, +- #else +- {"XTS_DATA_UNIT_IS_TOO_LARGE", 57, 148}, +- #endif +- #ifdef PROV_R_XTS_DUPLICATED_KEYS +- {"XTS_DUPLICATED_KEYS", ERR_LIB_PROV, PROV_R_XTS_DUPLICATED_KEYS}, +- #else +- {"XTS_DUPLICATED_KEYS", 57, 149}, +- #endif +- #ifdef RAND_R_ADDITIONAL_INPUT_TOO_LONG +- {"ADDITIONAL_INPUT_TOO_LONG", ERR_LIB_RAND, RAND_R_ADDITIONAL_INPUT_TOO_LONG}, +- #else +- {"ADDITIONAL_INPUT_TOO_LONG", 36, 102}, +- #endif +- #ifdef RAND_R_ALREADY_INSTANTIATED +- {"ALREADY_INSTANTIATED", ERR_LIB_RAND, RAND_R_ALREADY_INSTANTIATED}, +- #else +- {"ALREADY_INSTANTIATED", 36, 103}, +- #endif +- #ifdef RAND_R_ARGUMENT_OUT_OF_RANGE +- {"ARGUMENT_OUT_OF_RANGE", ERR_LIB_RAND, RAND_R_ARGUMENT_OUT_OF_RANGE}, +- #else +- {"ARGUMENT_OUT_OF_RANGE", 36, 105}, +- #endif +- #ifdef RAND_R_CANNOT_OPEN_FILE +- {"CANNOT_OPEN_FILE", ERR_LIB_RAND, RAND_R_CANNOT_OPEN_FILE}, +- #else +- {"CANNOT_OPEN_FILE", 36, 121}, +- #endif +- #ifdef RAND_R_DRBG_ALREADY_INITIALIZED +- {"DRBG_ALREADY_INITIALIZED", ERR_LIB_RAND, RAND_R_DRBG_ALREADY_INITIALIZED}, +- #else +- {"DRBG_ALREADY_INITIALIZED", 36, 129}, +- #endif +- #ifdef RAND_R_DRBG_NOT_INITIALISED +- {"DRBG_NOT_INITIALISED", ERR_LIB_RAND, RAND_R_DRBG_NOT_INITIALISED}, +- #else +- {"DRBG_NOT_INITIALISED", 36, 104}, +- #endif +- #ifdef RAND_R_ENTROPY_INPUT_TOO_LONG +- {"ENTROPY_INPUT_TOO_LONG", ERR_LIB_RAND, RAND_R_ENTROPY_INPUT_TOO_LONG}, +- #else +- {"ENTROPY_INPUT_TOO_LONG", 36, 106}, +- #endif +- #ifdef RAND_R_ENTROPY_OUT_OF_RANGE +- {"ENTROPY_OUT_OF_RANGE", ERR_LIB_RAND, RAND_R_ENTROPY_OUT_OF_RANGE}, +- #else +- {"ENTROPY_OUT_OF_RANGE", 36, 124}, +- #endif +- #ifdef RAND_R_ERROR_ENTROPY_POOL_WAS_IGNORED +- {"ERROR_ENTROPY_POOL_WAS_IGNORED", ERR_LIB_RAND, RAND_R_ERROR_ENTROPY_POOL_WAS_IGNORED}, +- #else +- {"ERROR_ENTROPY_POOL_WAS_IGNORED", 36, 127}, +- #endif +- #ifdef RAND_R_ERROR_INITIALISING_DRBG +- {"ERROR_INITIALISING_DRBG", ERR_LIB_RAND, RAND_R_ERROR_INITIALISING_DRBG}, +- #else +- {"ERROR_INITIALISING_DRBG", 36, 107}, +- #endif +- #ifdef RAND_R_ERROR_INSTANTIATING_DRBG +- {"ERROR_INSTANTIATING_DRBG", ERR_LIB_RAND, RAND_R_ERROR_INSTANTIATING_DRBG}, +- #else +- {"ERROR_INSTANTIATING_DRBG", 36, 108}, +- #endif +- #ifdef RAND_R_ERROR_RETRIEVING_ADDITIONAL_INPUT +- {"ERROR_RETRIEVING_ADDITIONAL_INPUT", ERR_LIB_RAND, RAND_R_ERROR_RETRIEVING_ADDITIONAL_INPUT}, +- #else +- {"ERROR_RETRIEVING_ADDITIONAL_INPUT", 36, 109}, +- #endif +- #ifdef RAND_R_ERROR_RETRIEVING_ENTROPY +- {"ERROR_RETRIEVING_ENTROPY", ERR_LIB_RAND, RAND_R_ERROR_RETRIEVING_ENTROPY}, +- #else +- {"ERROR_RETRIEVING_ENTROPY", 36, 110}, +- #endif +- #ifdef RAND_R_ERROR_RETRIEVING_NONCE +- {"ERROR_RETRIEVING_NONCE", ERR_LIB_RAND, RAND_R_ERROR_RETRIEVING_NONCE}, +- #else +- {"ERROR_RETRIEVING_NONCE", 36, 111}, +- #endif +- #ifdef RAND_R_FAILED_TO_CREATE_LOCK +- {"FAILED_TO_CREATE_LOCK", ERR_LIB_RAND, RAND_R_FAILED_TO_CREATE_LOCK}, +- #else +- {"FAILED_TO_CREATE_LOCK", 36, 126}, +- #endif +- #ifdef RAND_R_FUNC_NOT_IMPLEMENTED +- {"FUNC_NOT_IMPLEMENTED", ERR_LIB_RAND, RAND_R_FUNC_NOT_IMPLEMENTED}, +- #else +- {"FUNC_NOT_IMPLEMENTED", 36, 101}, +- #endif +- #ifdef RAND_R_FWRITE_ERROR +- {"FWRITE_ERROR", ERR_LIB_RAND, RAND_R_FWRITE_ERROR}, +- #else +- {"FWRITE_ERROR", 36, 123}, +- #endif +- #ifdef RAND_R_GENERATE_ERROR +- {"GENERATE_ERROR", ERR_LIB_RAND, RAND_R_GENERATE_ERROR}, +- #else +- {"GENERATE_ERROR", 36, 112}, +- #endif +- #ifdef RAND_R_INSUFFICIENT_DRBG_STRENGTH +- {"INSUFFICIENT_DRBG_STRENGTH", ERR_LIB_RAND, RAND_R_INSUFFICIENT_DRBG_STRENGTH}, +- #else +- {"INSUFFICIENT_DRBG_STRENGTH", 36, 139}, +- #endif +- #ifdef RAND_R_INTERNAL_ERROR +- {"INTERNAL_ERROR", ERR_LIB_RAND, RAND_R_INTERNAL_ERROR}, +- #else +- {"INTERNAL_ERROR", 36, 113}, +- #endif +- #ifdef RAND_R_IN_ERROR_STATE +- {"IN_ERROR_STATE", ERR_LIB_RAND, RAND_R_IN_ERROR_STATE}, +- #else +- {"IN_ERROR_STATE", 36, 114}, +- #endif +- #ifdef RAND_R_NOT_A_REGULAR_FILE +- {"NOT_A_REGULAR_FILE", ERR_LIB_RAND, RAND_R_NOT_A_REGULAR_FILE}, +- #else +- {"NOT_A_REGULAR_FILE", 36, 122}, +- #endif +- #ifdef RAND_R_NOT_INSTANTIATED +- {"NOT_INSTANTIATED", ERR_LIB_RAND, RAND_R_NOT_INSTANTIATED}, +- #else +- {"NOT_INSTANTIATED", 36, 115}, +- #endif +- #ifdef RAND_R_NO_DRBG_IMPLEMENTATION_SELECTED +- {"NO_DRBG_IMPLEMENTATION_SELECTED", ERR_LIB_RAND, RAND_R_NO_DRBG_IMPLEMENTATION_SELECTED}, +- #else +- {"NO_DRBG_IMPLEMENTATION_SELECTED", 36, 128}, +- #endif +- #ifdef RAND_R_PARENT_LOCKING_NOT_ENABLED +- {"PARENT_LOCKING_NOT_ENABLED", ERR_LIB_RAND, RAND_R_PARENT_LOCKING_NOT_ENABLED}, +- #else +- {"PARENT_LOCKING_NOT_ENABLED", 36, 130}, +- #endif +- #ifdef RAND_R_PARENT_STRENGTH_TOO_WEAK +- {"PARENT_STRENGTH_TOO_WEAK", ERR_LIB_RAND, RAND_R_PARENT_STRENGTH_TOO_WEAK}, +- #else +- {"PARENT_STRENGTH_TOO_WEAK", 36, 131}, +- #endif +- #ifdef RAND_R_PERSONALISATION_STRING_TOO_LONG +- {"PERSONALISATION_STRING_TOO_LONG", ERR_LIB_RAND, RAND_R_PERSONALISATION_STRING_TOO_LONG}, +- #else +- {"PERSONALISATION_STRING_TOO_LONG", 36, 116}, +- #endif +- #ifdef RAND_R_PREDICTION_RESISTANCE_NOT_SUPPORTED +- {"PREDICTION_RESISTANCE_NOT_SUPPORTED", ERR_LIB_RAND, RAND_R_PREDICTION_RESISTANCE_NOT_SUPPORTED}, +- #else +- {"PREDICTION_RESISTANCE_NOT_SUPPORTED", 36, 133}, +- #endif +- #ifdef RAND_R_PRNG_NOT_SEEDED +- {"PRNG_NOT_SEEDED", ERR_LIB_RAND, RAND_R_PRNG_NOT_SEEDED}, +- #else +- {"PRNG_NOT_SEEDED", 36, 100}, +- #endif +- #ifdef RAND_R_RANDOM_POOL_OVERFLOW +- {"RANDOM_POOL_OVERFLOW", ERR_LIB_RAND, RAND_R_RANDOM_POOL_OVERFLOW}, +- #else +- {"RANDOM_POOL_OVERFLOW", 36, 125}, +- #endif +- #ifdef RAND_R_RANDOM_POOL_UNDERFLOW +- {"RANDOM_POOL_UNDERFLOW", ERR_LIB_RAND, RAND_R_RANDOM_POOL_UNDERFLOW}, +- #else +- {"RANDOM_POOL_UNDERFLOW", 36, 134}, +- #endif +- #ifdef RAND_R_REQUEST_TOO_LARGE_FOR_DRBG +- {"REQUEST_TOO_LARGE_FOR_DRBG", ERR_LIB_RAND, RAND_R_REQUEST_TOO_LARGE_FOR_DRBG}, +- #else +- {"REQUEST_TOO_LARGE_FOR_DRBG", 36, 117}, +- #endif +- #ifdef RAND_R_RESEED_ERROR +- {"RESEED_ERROR", ERR_LIB_RAND, RAND_R_RESEED_ERROR}, +- #else +- {"RESEED_ERROR", 36, 118}, +- #endif +- #ifdef RAND_R_SELFTEST_FAILURE +- {"SELFTEST_FAILURE", ERR_LIB_RAND, RAND_R_SELFTEST_FAILURE}, +- #else +- {"SELFTEST_FAILURE", 36, 119}, +- #endif +- #ifdef RAND_R_TOO_LITTLE_NONCE_REQUESTED +- {"TOO_LITTLE_NONCE_REQUESTED", ERR_LIB_RAND, RAND_R_TOO_LITTLE_NONCE_REQUESTED}, +- #else +- {"TOO_LITTLE_NONCE_REQUESTED", 36, 135}, +- #endif +- #ifdef RAND_R_TOO_MUCH_NONCE_REQUESTED +- {"TOO_MUCH_NONCE_REQUESTED", ERR_LIB_RAND, RAND_R_TOO_MUCH_NONCE_REQUESTED}, +- #else +- {"TOO_MUCH_NONCE_REQUESTED", 36, 136}, +- #endif +- #ifdef RAND_R_UNABLE_TO_CREATE_DRBG +- {"UNABLE_TO_CREATE_DRBG", ERR_LIB_RAND, RAND_R_UNABLE_TO_CREATE_DRBG}, +- #else +- {"UNABLE_TO_CREATE_DRBG", 36, 143}, +- #endif +- #ifdef RAND_R_UNABLE_TO_FETCH_DRBG +- {"UNABLE_TO_FETCH_DRBG", ERR_LIB_RAND, RAND_R_UNABLE_TO_FETCH_DRBG}, +- #else +- {"UNABLE_TO_FETCH_DRBG", 36, 144}, +- #endif +- #ifdef RAND_R_UNABLE_TO_GET_PARENT_RESEED_PROP_COUNTER +- {"UNABLE_TO_GET_PARENT_RESEED_PROP_COUNTER", ERR_LIB_RAND, RAND_R_UNABLE_TO_GET_PARENT_RESEED_PROP_COUNTER}, +- #else +- {"UNABLE_TO_GET_PARENT_RESEED_PROP_COUNTER", 36, 141}, +- #endif +- #ifdef RAND_R_UNABLE_TO_GET_PARENT_STRENGTH +- {"UNABLE_TO_GET_PARENT_STRENGTH", ERR_LIB_RAND, RAND_R_UNABLE_TO_GET_PARENT_STRENGTH}, +- #else +- {"UNABLE_TO_GET_PARENT_STRENGTH", 36, 138}, +- #endif +- #ifdef RAND_R_UNABLE_TO_LOCK_PARENT +- {"UNABLE_TO_LOCK_PARENT", ERR_LIB_RAND, RAND_R_UNABLE_TO_LOCK_PARENT}, +- #else +- {"UNABLE_TO_LOCK_PARENT", 36, 140}, +- #endif +- #ifdef RAND_R_UNSUPPORTED_DRBG_FLAGS +- {"UNSUPPORTED_DRBG_FLAGS", ERR_LIB_RAND, RAND_R_UNSUPPORTED_DRBG_FLAGS}, +- #else +- {"UNSUPPORTED_DRBG_FLAGS", 36, 132}, +- #endif +- #ifdef RAND_R_UNSUPPORTED_DRBG_TYPE +- {"UNSUPPORTED_DRBG_TYPE", ERR_LIB_RAND, RAND_R_UNSUPPORTED_DRBG_TYPE}, +- #else +- {"UNSUPPORTED_DRBG_TYPE", 36, 120}, +- #endif +- #ifdef RSA_R_ALGORITHM_MISMATCH +- {"ALGORITHM_MISMATCH", ERR_LIB_RSA, RSA_R_ALGORITHM_MISMATCH}, +- #else +- {"ALGORITHM_MISMATCH", 4, 100}, +- #endif +- #ifdef RSA_R_BAD_E_VALUE +- {"BAD_E_VALUE", ERR_LIB_RSA, RSA_R_BAD_E_VALUE}, +- #else +- {"BAD_E_VALUE", 4, 101}, +- #endif +- #ifdef RSA_R_BAD_FIXED_HEADER_DECRYPT +- {"BAD_FIXED_HEADER_DECRYPT", ERR_LIB_RSA, RSA_R_BAD_FIXED_HEADER_DECRYPT}, +- #else +- {"BAD_FIXED_HEADER_DECRYPT", 4, 102}, +- #endif +- #ifdef RSA_R_BAD_PAD_BYTE_COUNT +- {"BAD_PAD_BYTE_COUNT", ERR_LIB_RSA, RSA_R_BAD_PAD_BYTE_COUNT}, +- #else +- {"BAD_PAD_BYTE_COUNT", 4, 103}, +- #endif +- #ifdef RSA_R_BAD_SIGNATURE +- {"BAD_SIGNATURE", ERR_LIB_RSA, RSA_R_BAD_SIGNATURE}, +- #else +- {"BAD_SIGNATURE", 4, 104}, +- #endif +- #ifdef RSA_R_BLOCK_TYPE_IS_NOT_01 +- {"BLOCK_TYPE_IS_NOT_01", ERR_LIB_RSA, RSA_R_BLOCK_TYPE_IS_NOT_01}, +- #else +- {"BLOCK_TYPE_IS_NOT_01", 4, 106}, +- #endif +- #ifdef RSA_R_BLOCK_TYPE_IS_NOT_02 +- {"BLOCK_TYPE_IS_NOT_02", ERR_LIB_RSA, RSA_R_BLOCK_TYPE_IS_NOT_02}, +- #else +- {"BLOCK_TYPE_IS_NOT_02", 4, 107}, +- #endif +- #ifdef RSA_R_DATA_GREATER_THAN_MOD_LEN +- {"DATA_GREATER_THAN_MOD_LEN", ERR_LIB_RSA, RSA_R_DATA_GREATER_THAN_MOD_LEN}, +- #else +- {"DATA_GREATER_THAN_MOD_LEN", 4, 108}, +- #endif +- #ifdef RSA_R_DATA_TOO_LARGE +- {"DATA_TOO_LARGE", ERR_LIB_RSA, RSA_R_DATA_TOO_LARGE}, +- #else +- {"DATA_TOO_LARGE", 4, 109}, +- #endif +- #ifdef RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE +- {"DATA_TOO_LARGE_FOR_KEY_SIZE", ERR_LIB_RSA, RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE}, +- #else +- {"DATA_TOO_LARGE_FOR_KEY_SIZE", 4, 110}, +- #endif +- #ifdef RSA_R_DATA_TOO_LARGE_FOR_MODULUS +- {"DATA_TOO_LARGE_FOR_MODULUS", ERR_LIB_RSA, RSA_R_DATA_TOO_LARGE_FOR_MODULUS}, +- #else +- {"DATA_TOO_LARGE_FOR_MODULUS", 4, 132}, +- #endif +- #ifdef RSA_R_DATA_TOO_SMALL +- {"DATA_TOO_SMALL", ERR_LIB_RSA, RSA_R_DATA_TOO_SMALL}, +- #else +- {"DATA_TOO_SMALL", 4, 111}, +- #endif +- #ifdef RSA_R_DATA_TOO_SMALL_FOR_KEY_SIZE +- {"DATA_TOO_SMALL_FOR_KEY_SIZE", ERR_LIB_RSA, RSA_R_DATA_TOO_SMALL_FOR_KEY_SIZE}, +- #else +- {"DATA_TOO_SMALL_FOR_KEY_SIZE", 4, 122}, +- #endif +- #ifdef RSA_R_DIGEST_DOES_NOT_MATCH +- {"DIGEST_DOES_NOT_MATCH", ERR_LIB_RSA, RSA_R_DIGEST_DOES_NOT_MATCH}, +- #else +- {"DIGEST_DOES_NOT_MATCH", 4, 158}, +- #endif +- #ifdef RSA_R_DIGEST_NOT_ALLOWED +- {"DIGEST_NOT_ALLOWED", ERR_LIB_RSA, RSA_R_DIGEST_NOT_ALLOWED}, +- #else +- {"DIGEST_NOT_ALLOWED", 4, 145}, +- #endif +- #ifdef RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY +- {"DIGEST_TOO_BIG_FOR_RSA_KEY", ERR_LIB_RSA, RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY}, +- #else +- {"DIGEST_TOO_BIG_FOR_RSA_KEY", 4, 112}, +- #endif +- #ifdef RSA_R_DMP1_NOT_CONGRUENT_TO_D +- {"DMP1_NOT_CONGRUENT_TO_D", ERR_LIB_RSA, RSA_R_DMP1_NOT_CONGRUENT_TO_D}, +- #else +- {"DMP1_NOT_CONGRUENT_TO_D", 4, 124}, +- #endif +- #ifdef RSA_R_DMQ1_NOT_CONGRUENT_TO_D +- {"DMQ1_NOT_CONGRUENT_TO_D", ERR_LIB_RSA, RSA_R_DMQ1_NOT_CONGRUENT_TO_D}, +- #else +- {"DMQ1_NOT_CONGRUENT_TO_D", 4, 125}, +- #endif +- #ifdef RSA_R_D_E_NOT_CONGRUENT_TO_1 +- {"D_E_NOT_CONGRUENT_TO_1", ERR_LIB_RSA, RSA_R_D_E_NOT_CONGRUENT_TO_1}, +- #else +- {"D_E_NOT_CONGRUENT_TO_1", 4, 123}, +- #endif +- #ifdef RSA_R_FIRST_OCTET_INVALID +- {"FIRST_OCTET_INVALID", ERR_LIB_RSA, RSA_R_FIRST_OCTET_INVALID}, +- #else +- {"FIRST_OCTET_INVALID", 4, 133}, +- #endif +- #ifdef RSA_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE +- {"ILLEGAL_OR_UNSUPPORTED_PADDING_MODE", ERR_LIB_RSA, RSA_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE}, +- #else +- {"ILLEGAL_OR_UNSUPPORTED_PADDING_MODE", 4, 144}, +- #endif +- #ifdef RSA_R_INVALID_DIGEST +- {"INVALID_DIGEST", ERR_LIB_RSA, RSA_R_INVALID_DIGEST}, +- #else +- {"INVALID_DIGEST", 4, 157}, +- #endif +- #ifdef RSA_R_INVALID_DIGEST_LENGTH +- {"INVALID_DIGEST_LENGTH", ERR_LIB_RSA, RSA_R_INVALID_DIGEST_LENGTH}, +- #else +- {"INVALID_DIGEST_LENGTH", 4, 143}, +- #endif +- #ifdef RSA_R_INVALID_HEADER +- {"INVALID_HEADER", ERR_LIB_RSA, RSA_R_INVALID_HEADER}, +- #else +- {"INVALID_HEADER", 4, 137}, +- #endif +- #ifdef RSA_R_INVALID_KEYPAIR +- {"INVALID_KEYPAIR", ERR_LIB_RSA, RSA_R_INVALID_KEYPAIR}, +- #else +- {"INVALID_KEYPAIR", 4, 171}, +- #endif +- #ifdef RSA_R_INVALID_KEY_LENGTH +- {"INVALID_KEY_LENGTH", ERR_LIB_RSA, RSA_R_INVALID_KEY_LENGTH}, +- #else +- {"INVALID_KEY_LENGTH", 4, 173}, +- #endif +- #ifdef RSA_R_INVALID_LABEL +- {"INVALID_LABEL", ERR_LIB_RSA, RSA_R_INVALID_LABEL}, +- #else +- {"INVALID_LABEL", 4, 160}, +- #endif +- #ifdef RSA_R_INVALID_LENGTH +- {"INVALID_LENGTH", ERR_LIB_RSA, RSA_R_INVALID_LENGTH}, +- #else +- {"INVALID_LENGTH", 4, 181}, +- #endif +- #ifdef RSA_R_INVALID_MESSAGE_LENGTH +- {"INVALID_MESSAGE_LENGTH", ERR_LIB_RSA, RSA_R_INVALID_MESSAGE_LENGTH}, +- #else +- {"INVALID_MESSAGE_LENGTH", 4, 131}, +- #endif +- #ifdef RSA_R_INVALID_MGF1_MD +- {"INVALID_MGF1_MD", ERR_LIB_RSA, RSA_R_INVALID_MGF1_MD}, +- #else +- {"INVALID_MGF1_MD", 4, 156}, +- #endif +- #ifdef RSA_R_INVALID_MODULUS +- {"INVALID_MODULUS", ERR_LIB_RSA, RSA_R_INVALID_MODULUS}, +- #else +- {"INVALID_MODULUS", 4, 174}, +- #endif +- #ifdef RSA_R_INVALID_MULTI_PRIME_KEY +- {"INVALID_MULTI_PRIME_KEY", ERR_LIB_RSA, RSA_R_INVALID_MULTI_PRIME_KEY}, +- #else +- {"INVALID_MULTI_PRIME_KEY", 4, 167}, +- #endif +- #ifdef RSA_R_INVALID_OAEP_PARAMETERS +- {"INVALID_OAEP_PARAMETERS", ERR_LIB_RSA, RSA_R_INVALID_OAEP_PARAMETERS}, +- #else +- {"INVALID_OAEP_PARAMETERS", 4, 161}, +- #endif +- #ifdef RSA_R_INVALID_PADDING +- {"INVALID_PADDING", ERR_LIB_RSA, RSA_R_INVALID_PADDING}, +- #else +- {"INVALID_PADDING", 4, 138}, +- #endif +- #ifdef RSA_R_INVALID_PADDING_MODE +- {"INVALID_PADDING_MODE", ERR_LIB_RSA, RSA_R_INVALID_PADDING_MODE}, +- #else +- {"INVALID_PADDING_MODE", 4, 141}, +- #endif +- #ifdef RSA_R_INVALID_PSS_PARAMETERS +- {"INVALID_PSS_PARAMETERS", ERR_LIB_RSA, RSA_R_INVALID_PSS_PARAMETERS}, +- #else +- {"INVALID_PSS_PARAMETERS", 4, 149}, +- #endif +- #ifdef RSA_R_INVALID_PSS_SALTLEN +- {"INVALID_PSS_SALTLEN", ERR_LIB_RSA, RSA_R_INVALID_PSS_SALTLEN}, +- #else +- {"INVALID_PSS_SALTLEN", 4, 146}, +- #endif +- #ifdef RSA_R_INVALID_REQUEST +- {"INVALID_REQUEST", ERR_LIB_RSA, RSA_R_INVALID_REQUEST}, +- #else +- {"INVALID_REQUEST", 4, 175}, +- #endif +- #ifdef RSA_R_INVALID_SALT_LENGTH +- {"INVALID_SALT_LENGTH", ERR_LIB_RSA, RSA_R_INVALID_SALT_LENGTH}, +- #else +- {"INVALID_SALT_LENGTH", 4, 150}, +- #endif +- #ifdef RSA_R_INVALID_STRENGTH +- {"INVALID_STRENGTH", ERR_LIB_RSA, RSA_R_INVALID_STRENGTH}, +- #else +- {"INVALID_STRENGTH", 4, 176}, +- #endif +- #ifdef RSA_R_INVALID_TRAILER +- {"INVALID_TRAILER", ERR_LIB_RSA, RSA_R_INVALID_TRAILER}, +- #else +- {"INVALID_TRAILER", 4, 139}, +- #endif +- #ifdef RSA_R_INVALID_X931_DIGEST +- {"INVALID_X931_DIGEST", ERR_LIB_RSA, RSA_R_INVALID_X931_DIGEST}, +- #else +- {"INVALID_X931_DIGEST", 4, 142}, +- #endif +- #ifdef RSA_R_IQMP_NOT_INVERSE_OF_Q +- {"IQMP_NOT_INVERSE_OF_Q", ERR_LIB_RSA, RSA_R_IQMP_NOT_INVERSE_OF_Q}, +- #else +- {"IQMP_NOT_INVERSE_OF_Q", 4, 126}, +- #endif +- #ifdef RSA_R_KEY_PRIME_NUM_INVALID +- {"KEY_PRIME_NUM_INVALID", ERR_LIB_RSA, RSA_R_KEY_PRIME_NUM_INVALID}, +- #else +- {"KEY_PRIME_NUM_INVALID", 4, 165}, +- #endif +- #ifdef RSA_R_KEY_SIZE_TOO_SMALL +- {"KEY_SIZE_TOO_SMALL", ERR_LIB_RSA, RSA_R_KEY_SIZE_TOO_SMALL}, +- #else +- {"KEY_SIZE_TOO_SMALL", 4, 120}, +- #endif +- #ifdef RSA_R_LAST_OCTET_INVALID +- {"LAST_OCTET_INVALID", ERR_LIB_RSA, RSA_R_LAST_OCTET_INVALID}, +- #else +- {"LAST_OCTET_INVALID", 4, 134}, +- #endif +- #ifdef RSA_R_MGF1_DIGEST_NOT_ALLOWED +- {"MGF1_DIGEST_NOT_ALLOWED", ERR_LIB_RSA, RSA_R_MGF1_DIGEST_NOT_ALLOWED}, +- #else +- {"MGF1_DIGEST_NOT_ALLOWED", 4, 152}, +- #endif +- #ifdef RSA_R_MISSING_PRIVATE_KEY +- {"MISSING_PRIVATE_KEY", ERR_LIB_RSA, RSA_R_MISSING_PRIVATE_KEY}, +- #else +- {"MISSING_PRIVATE_KEY", 4, 179}, +- #endif +- #ifdef RSA_R_MODULUS_TOO_LARGE +- {"MODULUS_TOO_LARGE", ERR_LIB_RSA, RSA_R_MODULUS_TOO_LARGE}, +- #else +- {"MODULUS_TOO_LARGE", 4, 105}, +- #endif +- #ifdef RSA_R_MP_COEFFICIENT_NOT_INVERSE_OF_R +- {"MP_COEFFICIENT_NOT_INVERSE_OF_R", ERR_LIB_RSA, RSA_R_MP_COEFFICIENT_NOT_INVERSE_OF_R}, +- #else +- {"MP_COEFFICIENT_NOT_INVERSE_OF_R", 4, 168}, +- #endif +- #ifdef RSA_R_MP_EXPONENT_NOT_CONGRUENT_TO_D +- {"MP_EXPONENT_NOT_CONGRUENT_TO_D", ERR_LIB_RSA, RSA_R_MP_EXPONENT_NOT_CONGRUENT_TO_D}, +- #else +- {"MP_EXPONENT_NOT_CONGRUENT_TO_D", 4, 169}, +- #endif +- #ifdef RSA_R_MP_R_NOT_PRIME +- {"MP_R_NOT_PRIME", ERR_LIB_RSA, RSA_R_MP_R_NOT_PRIME}, +- #else +- {"MP_R_NOT_PRIME", 4, 170}, +- #endif +- #ifdef RSA_R_NO_PUBLIC_EXPONENT +- {"NO_PUBLIC_EXPONENT", ERR_LIB_RSA, RSA_R_NO_PUBLIC_EXPONENT}, +- #else +- {"NO_PUBLIC_EXPONENT", 4, 140}, +- #endif +- #ifdef RSA_R_NULL_BEFORE_BLOCK_MISSING +- {"NULL_BEFORE_BLOCK_MISSING", ERR_LIB_RSA, RSA_R_NULL_BEFORE_BLOCK_MISSING}, +- #else +- {"NULL_BEFORE_BLOCK_MISSING", 4, 113}, +- #endif +- #ifdef RSA_R_N_DOES_NOT_EQUAL_PRODUCT_OF_PRIMES +- {"N_DOES_NOT_EQUAL_PRODUCT_OF_PRIMES", ERR_LIB_RSA, RSA_R_N_DOES_NOT_EQUAL_PRODUCT_OF_PRIMES}, +- #else +- {"N_DOES_NOT_EQUAL_PRODUCT_OF_PRIMES", 4, 172}, +- #endif +- #ifdef RSA_R_N_DOES_NOT_EQUAL_P_Q +- {"N_DOES_NOT_EQUAL_P_Q", ERR_LIB_RSA, RSA_R_N_DOES_NOT_EQUAL_P_Q}, +- #else +- {"N_DOES_NOT_EQUAL_P_Q", 4, 127}, +- #endif +- #ifdef RSA_R_OAEP_DECODING_ERROR +- {"OAEP_DECODING_ERROR", ERR_LIB_RSA, RSA_R_OAEP_DECODING_ERROR}, +- #else +- {"OAEP_DECODING_ERROR", 4, 121}, +- #endif +- #ifdef RSA_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE +- {"OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE", ERR_LIB_RSA, RSA_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE}, +- #else +- {"OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE", 4, 148}, +- #endif +- #ifdef RSA_R_PADDING_CHECK_FAILED +- {"PADDING_CHECK_FAILED", ERR_LIB_RSA, RSA_R_PADDING_CHECK_FAILED}, +- #else +- {"PADDING_CHECK_FAILED", 4, 114}, +- #endif +- #ifdef RSA_R_PAIRWISE_TEST_FAILURE +- {"PAIRWISE_TEST_FAILURE", ERR_LIB_RSA, RSA_R_PAIRWISE_TEST_FAILURE}, +- #else +- {"PAIRWISE_TEST_FAILURE", 4, 177}, +- #endif +- #ifdef RSA_R_PKCS_DECODING_ERROR +- {"PKCS_DECODING_ERROR", ERR_LIB_RSA, RSA_R_PKCS_DECODING_ERROR}, +- #else +- {"PKCS_DECODING_ERROR", 4, 159}, +- #endif +- #ifdef RSA_R_PSS_SALTLEN_TOO_SMALL +- {"PSS_SALTLEN_TOO_SMALL", ERR_LIB_RSA, RSA_R_PSS_SALTLEN_TOO_SMALL}, +- #else +- {"PSS_SALTLEN_TOO_SMALL", 4, 164}, +- #endif +- #ifdef RSA_R_PUB_EXPONENT_OUT_OF_RANGE +- {"PUB_EXPONENT_OUT_OF_RANGE", ERR_LIB_RSA, RSA_R_PUB_EXPONENT_OUT_OF_RANGE}, +- #else +- {"PUB_EXPONENT_OUT_OF_RANGE", 4, 178}, +- #endif +- #ifdef RSA_R_P_NOT_PRIME +- {"P_NOT_PRIME", ERR_LIB_RSA, RSA_R_P_NOT_PRIME}, +- #else +- {"P_NOT_PRIME", 4, 128}, +- #endif +- #ifdef RSA_R_Q_NOT_PRIME +- {"Q_NOT_PRIME", ERR_LIB_RSA, RSA_R_Q_NOT_PRIME}, +- #else +- {"Q_NOT_PRIME", 4, 129}, +- #endif +- #ifdef RSA_R_RANDOMNESS_SOURCE_STRENGTH_INSUFFICIENT +- {"RANDOMNESS_SOURCE_STRENGTH_INSUFFICIENT", ERR_LIB_RSA, RSA_R_RANDOMNESS_SOURCE_STRENGTH_INSUFFICIENT}, +- #else +- {"RANDOMNESS_SOURCE_STRENGTH_INSUFFICIENT", 4, 180}, +- #endif +- #ifdef RSA_R_RSA_OPERATIONS_NOT_SUPPORTED +- {"RSA_OPERATIONS_NOT_SUPPORTED", ERR_LIB_RSA, RSA_R_RSA_OPERATIONS_NOT_SUPPORTED}, +- #else +- {"RSA_OPERATIONS_NOT_SUPPORTED", 4, 130}, +- #endif +- #ifdef RSA_R_SLEN_CHECK_FAILED +- {"SLEN_CHECK_FAILED", ERR_LIB_RSA, RSA_R_SLEN_CHECK_FAILED}, +- #else +- {"SLEN_CHECK_FAILED", 4, 136}, +- #endif +- #ifdef RSA_R_SLEN_RECOVERY_FAILED +- {"SLEN_RECOVERY_FAILED", ERR_LIB_RSA, RSA_R_SLEN_RECOVERY_FAILED}, +- #else +- {"SLEN_RECOVERY_FAILED", 4, 135}, +- #endif +- #ifdef RSA_R_SSLV3_ROLLBACK_ATTACK +- {"SSLV3_ROLLBACK_ATTACK", ERR_LIB_RSA, RSA_R_SSLV3_ROLLBACK_ATTACK}, +- #else +- {"SSLV3_ROLLBACK_ATTACK", 4, 115}, +- #endif +- #ifdef RSA_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD +- {"THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD", ERR_LIB_RSA, RSA_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD}, +- #else +- {"THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD", 4, 116}, +- #endif +- #ifdef RSA_R_UNKNOWN_ALGORITHM_TYPE +- {"UNKNOWN_ALGORITHM_TYPE", ERR_LIB_RSA, RSA_R_UNKNOWN_ALGORITHM_TYPE}, +- #else +- {"UNKNOWN_ALGORITHM_TYPE", 4, 117}, +- #endif +- #ifdef RSA_R_UNKNOWN_DIGEST +- {"UNKNOWN_DIGEST", ERR_LIB_RSA, RSA_R_UNKNOWN_DIGEST}, +- #else +- {"UNKNOWN_DIGEST", 4, 166}, +- #endif +- #ifdef RSA_R_UNKNOWN_MASK_DIGEST +- {"UNKNOWN_MASK_DIGEST", ERR_LIB_RSA, RSA_R_UNKNOWN_MASK_DIGEST}, +- #else +- {"UNKNOWN_MASK_DIGEST", 4, 151}, +- #endif +- #ifdef RSA_R_UNKNOWN_PADDING_TYPE +- {"UNKNOWN_PADDING_TYPE", ERR_LIB_RSA, RSA_R_UNKNOWN_PADDING_TYPE}, +- #else +- {"UNKNOWN_PADDING_TYPE", 4, 118}, +- #endif +- #ifdef RSA_R_UNSUPPORTED_ENCRYPTION_TYPE +- {"UNSUPPORTED_ENCRYPTION_TYPE", ERR_LIB_RSA, RSA_R_UNSUPPORTED_ENCRYPTION_TYPE}, +- #else +- {"UNSUPPORTED_ENCRYPTION_TYPE", 4, 162}, +- #endif +- #ifdef RSA_R_UNSUPPORTED_LABEL_SOURCE +- {"UNSUPPORTED_LABEL_SOURCE", ERR_LIB_RSA, RSA_R_UNSUPPORTED_LABEL_SOURCE}, +- #else +- {"UNSUPPORTED_LABEL_SOURCE", 4, 163}, +- #endif +- #ifdef RSA_R_UNSUPPORTED_MASK_ALGORITHM +- {"UNSUPPORTED_MASK_ALGORITHM", ERR_LIB_RSA, RSA_R_UNSUPPORTED_MASK_ALGORITHM}, +- #else +- {"UNSUPPORTED_MASK_ALGORITHM", 4, 153}, +- #endif +- #ifdef RSA_R_UNSUPPORTED_MASK_PARAMETER +- {"UNSUPPORTED_MASK_PARAMETER", ERR_LIB_RSA, RSA_R_UNSUPPORTED_MASK_PARAMETER}, +- #else +- {"UNSUPPORTED_MASK_PARAMETER", 4, 154}, +- #endif +- #ifdef RSA_R_UNSUPPORTED_SIGNATURE_TYPE +- {"UNSUPPORTED_SIGNATURE_TYPE", ERR_LIB_RSA, RSA_R_UNSUPPORTED_SIGNATURE_TYPE}, +- #else +- {"UNSUPPORTED_SIGNATURE_TYPE", 4, 155}, +- #endif +- #ifdef RSA_R_VALUE_MISSING +- {"VALUE_MISSING", ERR_LIB_RSA, RSA_R_VALUE_MISSING}, +- #else +- {"VALUE_MISSING", 4, 147}, +- #endif +- #ifdef RSA_R_WRONG_SIGNATURE_LENGTH +- {"WRONG_SIGNATURE_LENGTH", ERR_LIB_RSA, RSA_R_WRONG_SIGNATURE_LENGTH}, +- #else +- {"WRONG_SIGNATURE_LENGTH", 4, 119}, +- #endif +- #ifdef SM2_R_ASN1_ERROR +- {"ASN1_ERROR", ERR_LIB_SM2, SM2_R_ASN1_ERROR}, +- #else +- {"ASN1_ERROR", 53, 100}, +- #endif +- #ifdef SM2_R_BAD_SIGNATURE +- {"BAD_SIGNATURE", ERR_LIB_SM2, SM2_R_BAD_SIGNATURE}, +- #else +- {"BAD_SIGNATURE", 53, 101}, +- #endif +- #ifdef SM2_R_BUFFER_TOO_SMALL +- {"BUFFER_TOO_SMALL", ERR_LIB_SM2, SM2_R_BUFFER_TOO_SMALL}, +- #else +- {"BUFFER_TOO_SMALL", 53, 107}, +- #endif +- #ifdef SM2_R_DIST_ID_TOO_LARGE +- {"DIST_ID_TOO_LARGE", ERR_LIB_SM2, SM2_R_DIST_ID_TOO_LARGE}, +- #else +- {"DIST_ID_TOO_LARGE", 53, 110}, +- #endif +- #ifdef SM2_R_ID_NOT_SET +- {"ID_NOT_SET", ERR_LIB_SM2, SM2_R_ID_NOT_SET}, +- #else +- {"ID_NOT_SET", 53, 112}, +- #endif +- #ifdef SM2_R_ID_TOO_LARGE +- {"ID_TOO_LARGE", ERR_LIB_SM2, SM2_R_ID_TOO_LARGE}, +- #else +- {"ID_TOO_LARGE", 53, 111}, +- #endif +- #ifdef SM2_R_INVALID_CURVE +- {"INVALID_CURVE", ERR_LIB_SM2, SM2_R_INVALID_CURVE}, +- #else +- {"INVALID_CURVE", 53, 108}, +- #endif +- #ifdef SM2_R_INVALID_DIGEST +- {"INVALID_DIGEST", ERR_LIB_SM2, SM2_R_INVALID_DIGEST}, +- #else +- {"INVALID_DIGEST", 53, 102}, +- #endif +- #ifdef SM2_R_INVALID_DIGEST_TYPE +- {"INVALID_DIGEST_TYPE", ERR_LIB_SM2, SM2_R_INVALID_DIGEST_TYPE}, +- #else +- {"INVALID_DIGEST_TYPE", 53, 103}, +- #endif +- #ifdef SM2_R_INVALID_ENCODING +- {"INVALID_ENCODING", ERR_LIB_SM2, SM2_R_INVALID_ENCODING}, +- #else +- {"INVALID_ENCODING", 53, 104}, +- #endif +- #ifdef SM2_R_INVALID_FIELD +- {"INVALID_FIELD", ERR_LIB_SM2, SM2_R_INVALID_FIELD}, +- #else +- {"INVALID_FIELD", 53, 105}, +- #endif +- #ifdef SM2_R_INVALID_PRIVATE_KEY +- {"INVALID_PRIVATE_KEY", ERR_LIB_SM2, SM2_R_INVALID_PRIVATE_KEY}, +- #else +- {"INVALID_PRIVATE_KEY", 53, 113}, +- #endif +- #ifdef SM2_R_NO_PARAMETERS_SET +- {"NO_PARAMETERS_SET", ERR_LIB_SM2, SM2_R_NO_PARAMETERS_SET}, +- #else +- {"NO_PARAMETERS_SET", 53, 109}, +- #endif +- #ifdef SM2_R_USER_ID_TOO_LARGE +- {"USER_ID_TOO_LARGE", ERR_LIB_SM2, SM2_R_USER_ID_TOO_LARGE}, +- #else +- {"USER_ID_TOO_LARGE", 53, 106}, +- #endif +- #ifdef SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY +- {"APPLICATION_DATA_AFTER_CLOSE_NOTIFY", ERR_LIB_SSL, SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY}, +- #else +- {"APPLICATION_DATA_AFTER_CLOSE_NOTIFY", 20, 291}, +- #endif +- #ifdef SSL_R_APP_DATA_IN_HANDSHAKE +- {"APP_DATA_IN_HANDSHAKE", ERR_LIB_SSL, SSL_R_APP_DATA_IN_HANDSHAKE}, +- #else +- {"APP_DATA_IN_HANDSHAKE", 20, 100}, +- #endif +- #ifdef SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT +- {"ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT", ERR_LIB_SSL, SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT}, +- #else +- {"ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT", 20, 272}, +- #endif +- #ifdef SSL_R_AT_LEAST_TLS_1_2_NEEDED_IN_SUITEB_MODE +- {"AT_LEAST_TLS_1_2_NEEDED_IN_SUITEB_MODE", ERR_LIB_SSL, SSL_R_AT_LEAST_TLS_1_2_NEEDED_IN_SUITEB_MODE}, +- #else +- {"AT_LEAST_TLS_1_2_NEEDED_IN_SUITEB_MODE", 20, 158}, +- #endif +- #ifdef SSL_R_BAD_CHANGE_CIPHER_SPEC +- {"BAD_CHANGE_CIPHER_SPEC", ERR_LIB_SSL, SSL_R_BAD_CHANGE_CIPHER_SPEC}, +- #else +- {"BAD_CHANGE_CIPHER_SPEC", 20, 103}, +- #endif +- #ifdef SSL_R_BAD_CIPHER +- {"BAD_CIPHER", ERR_LIB_SSL, SSL_R_BAD_CIPHER}, +- #else +- {"BAD_CIPHER", 20, 186}, +- #endif +- #ifdef SSL_R_BAD_DATA +- {"BAD_DATA", ERR_LIB_SSL, SSL_R_BAD_DATA}, +- #else +- {"BAD_DATA", 20, 390}, +- #endif +- #ifdef SSL_R_BAD_DATA_RETURNED_BY_CALLBACK +- {"BAD_DATA_RETURNED_BY_CALLBACK", ERR_LIB_SSL, SSL_R_BAD_DATA_RETURNED_BY_CALLBACK}, +- #else +- {"BAD_DATA_RETURNED_BY_CALLBACK", 20, 106}, +- #endif +- #ifdef SSL_R_BAD_DECOMPRESSION +- {"BAD_DECOMPRESSION", ERR_LIB_SSL, SSL_R_BAD_DECOMPRESSION}, +- #else +- {"BAD_DECOMPRESSION", 20, 107}, +- #endif +- #ifdef SSL_R_BAD_DH_VALUE +- {"BAD_DH_VALUE", ERR_LIB_SSL, SSL_R_BAD_DH_VALUE}, +- #else +- {"BAD_DH_VALUE", 20, 102}, +- #endif +- #ifdef SSL_R_BAD_DIGEST_LENGTH +- {"BAD_DIGEST_LENGTH", ERR_LIB_SSL, SSL_R_BAD_DIGEST_LENGTH}, +- #else +- {"BAD_DIGEST_LENGTH", 20, 111}, +- #endif +- #ifdef SSL_R_BAD_EARLY_DATA +- {"BAD_EARLY_DATA", ERR_LIB_SSL, SSL_R_BAD_EARLY_DATA}, +- #else +- {"BAD_EARLY_DATA", 20, 233}, +- #endif +- #ifdef SSL_R_BAD_ECC_CERT +- {"BAD_ECC_CERT", ERR_LIB_SSL, SSL_R_BAD_ECC_CERT}, +- #else +- {"BAD_ECC_CERT", 20, 304}, +- #endif +- #ifdef SSL_R_BAD_ECPOINT +- {"BAD_ECPOINT", ERR_LIB_SSL, SSL_R_BAD_ECPOINT}, +- #else +- {"BAD_ECPOINT", 20, 306}, +- #endif +- #ifdef SSL_R_BAD_EXTENSION +- {"BAD_EXTENSION", ERR_LIB_SSL, SSL_R_BAD_EXTENSION}, +- #else +- {"BAD_EXTENSION", 20, 110}, +- #endif +- #ifdef SSL_R_BAD_HANDSHAKE_LENGTH +- {"BAD_HANDSHAKE_LENGTH", ERR_LIB_SSL, SSL_R_BAD_HANDSHAKE_LENGTH}, +- #else +- {"BAD_HANDSHAKE_LENGTH", 20, 332}, +- #endif +- #ifdef SSL_R_BAD_HANDSHAKE_STATE +- {"BAD_HANDSHAKE_STATE", ERR_LIB_SSL, SSL_R_BAD_HANDSHAKE_STATE}, +- #else +- {"BAD_HANDSHAKE_STATE", 20, 236}, +- #endif +- #ifdef SSL_R_BAD_HELLO_REQUEST +- {"BAD_HELLO_REQUEST", ERR_LIB_SSL, SSL_R_BAD_HELLO_REQUEST}, +- #else +- {"BAD_HELLO_REQUEST", 20, 105}, +- #endif +- #ifdef SSL_R_BAD_HRR_VERSION +- {"BAD_HRR_VERSION", ERR_LIB_SSL, SSL_R_BAD_HRR_VERSION}, +- #else +- {"BAD_HRR_VERSION", 20, 263}, +- #endif +- #ifdef SSL_R_BAD_KEY_SHARE +- {"BAD_KEY_SHARE", ERR_LIB_SSL, SSL_R_BAD_KEY_SHARE}, +- #else +- {"BAD_KEY_SHARE", 20, 108}, +- #endif +- #ifdef SSL_R_BAD_KEY_UPDATE +- {"BAD_KEY_UPDATE", ERR_LIB_SSL, SSL_R_BAD_KEY_UPDATE}, +- #else +- {"BAD_KEY_UPDATE", 20, 122}, +- #endif +- #ifdef SSL_R_BAD_LEGACY_VERSION +- {"BAD_LEGACY_VERSION", ERR_LIB_SSL, SSL_R_BAD_LEGACY_VERSION}, +- #else +- {"BAD_LEGACY_VERSION", 20, 292}, +- #endif +- #ifdef SSL_R_BAD_LENGTH +- {"BAD_LENGTH", ERR_LIB_SSL, SSL_R_BAD_LENGTH}, +- #else +- {"BAD_LENGTH", 20, 271}, +- #endif +- #ifdef SSL_R_BAD_PACKET +- {"BAD_PACKET", ERR_LIB_SSL, SSL_R_BAD_PACKET}, +- #else +- {"BAD_PACKET", 20, 240}, +- #endif +- #ifdef SSL_R_BAD_PACKET_LENGTH +- {"BAD_PACKET_LENGTH", ERR_LIB_SSL, SSL_R_BAD_PACKET_LENGTH}, +- #else +- {"BAD_PACKET_LENGTH", 20, 115}, +- #endif +- #ifdef SSL_R_BAD_PROTOCOL_VERSION_NUMBER +- {"BAD_PROTOCOL_VERSION_NUMBER", ERR_LIB_SSL, SSL_R_BAD_PROTOCOL_VERSION_NUMBER}, +- #else +- {"BAD_PROTOCOL_VERSION_NUMBER", 20, 116}, +- #endif +- #ifdef SSL_R_BAD_PSK +- {"BAD_PSK", ERR_LIB_SSL, SSL_R_BAD_PSK}, +- #else +- {"BAD_PSK", 20, 219}, +- #endif +- #ifdef SSL_R_BAD_PSK_IDENTITY +- {"BAD_PSK_IDENTITY", ERR_LIB_SSL, SSL_R_BAD_PSK_IDENTITY}, +- #else +- {"BAD_PSK_IDENTITY", 20, 114}, +- #endif +- #ifdef SSL_R_BAD_RECORD_TYPE +- {"BAD_RECORD_TYPE", ERR_LIB_SSL, SSL_R_BAD_RECORD_TYPE}, +- #else +- {"BAD_RECORD_TYPE", 20, 443}, +- #endif +- #ifdef SSL_R_BAD_RSA_ENCRYPT +- {"BAD_RSA_ENCRYPT", ERR_LIB_SSL, SSL_R_BAD_RSA_ENCRYPT}, +- #else +- {"BAD_RSA_ENCRYPT", 20, 119}, +- #endif +- #ifdef SSL_R_BAD_SIGNATURE +- {"BAD_SIGNATURE", ERR_LIB_SSL, SSL_R_BAD_SIGNATURE}, +- #else +- {"BAD_SIGNATURE", 20, 123}, +- #endif +- #ifdef SSL_R_BAD_SRP_A_LENGTH +- {"BAD_SRP_A_LENGTH", ERR_LIB_SSL, SSL_R_BAD_SRP_A_LENGTH}, +- #else +- {"BAD_SRP_A_LENGTH", 20, 347}, +- #endif +- #ifdef SSL_R_BAD_SRP_PARAMETERS +- {"BAD_SRP_PARAMETERS", ERR_LIB_SSL, SSL_R_BAD_SRP_PARAMETERS}, +- #else +- {"BAD_SRP_PARAMETERS", 20, 371}, +- #endif +- #ifdef SSL_R_BAD_SRTP_MKI_VALUE +- {"BAD_SRTP_MKI_VALUE", ERR_LIB_SSL, SSL_R_BAD_SRTP_MKI_VALUE}, +- #else +- {"BAD_SRTP_MKI_VALUE", 20, 352}, +- #endif +- #ifdef SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST +- {"BAD_SRTP_PROTECTION_PROFILE_LIST", ERR_LIB_SSL, SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST}, +- #else +- {"BAD_SRTP_PROTECTION_PROFILE_LIST", 20, 353}, +- #endif +- #ifdef SSL_R_BAD_SSL_FILETYPE +- {"BAD_SSL_FILETYPE", ERR_LIB_SSL, SSL_R_BAD_SSL_FILETYPE}, +- #else +- {"BAD_SSL_FILETYPE", 20, 124}, +- #endif +- #ifdef SSL_R_BAD_VALUE +- {"BAD_VALUE", ERR_LIB_SSL, SSL_R_BAD_VALUE}, +- #else +- {"BAD_VALUE", 20, 384}, +- #endif +- #ifdef SSL_R_BAD_WRITE_RETRY +- {"BAD_WRITE_RETRY", ERR_LIB_SSL, SSL_R_BAD_WRITE_RETRY}, +- #else +- {"BAD_WRITE_RETRY", 20, 127}, +- #endif +- #ifdef SSL_R_BINDER_DOES_NOT_VERIFY +- {"BINDER_DOES_NOT_VERIFY", ERR_LIB_SSL, SSL_R_BINDER_DOES_NOT_VERIFY}, +- #else +- {"BINDER_DOES_NOT_VERIFY", 20, 253}, +- #endif +- #ifdef SSL_R_BIO_NOT_SET +- {"BIO_NOT_SET", ERR_LIB_SSL, SSL_R_BIO_NOT_SET}, +- #else +- {"BIO_NOT_SET", 20, 128}, +- #endif +- #ifdef SSL_R_BLOCK_CIPHER_PAD_IS_WRONG +- {"BLOCK_CIPHER_PAD_IS_WRONG", ERR_LIB_SSL, SSL_R_BLOCK_CIPHER_PAD_IS_WRONG}, +- #else +- {"BLOCK_CIPHER_PAD_IS_WRONG", 20, 129}, +- #endif +- #ifdef SSL_R_BN_LIB +- {"BN_LIB", ERR_LIB_SSL, SSL_R_BN_LIB}, +- #else +- {"BN_LIB", 20, 130}, +- #endif +- #ifdef SSL_R_CALLBACK_FAILED +- {"CALLBACK_FAILED", ERR_LIB_SSL, SSL_R_CALLBACK_FAILED}, +- #else +- {"CALLBACK_FAILED", 20, 234}, +- #endif +- #ifdef SSL_R_CANNOT_CHANGE_CIPHER +- {"CANNOT_CHANGE_CIPHER", ERR_LIB_SSL, SSL_R_CANNOT_CHANGE_CIPHER}, +- #else +- {"CANNOT_CHANGE_CIPHER", 20, 109}, +- #endif +- #ifdef SSL_R_CANNOT_GET_GROUP_NAME +- {"CANNOT_GET_GROUP_NAME", ERR_LIB_SSL, SSL_R_CANNOT_GET_GROUP_NAME}, +- #else +- {"CANNOT_GET_GROUP_NAME", 20, 299}, +- #endif +- #ifdef SSL_R_CA_DN_LENGTH_MISMATCH +- {"CA_DN_LENGTH_MISMATCH", ERR_LIB_SSL, SSL_R_CA_DN_LENGTH_MISMATCH}, +- #else +- {"CA_DN_LENGTH_MISMATCH", 20, 131}, +- #endif +- #ifdef SSL_R_CA_KEY_TOO_SMALL +- {"CA_KEY_TOO_SMALL", ERR_LIB_SSL, SSL_R_CA_KEY_TOO_SMALL}, +- #else +- {"CA_KEY_TOO_SMALL", 20, 397}, +- #endif +- #ifdef SSL_R_CA_MD_TOO_WEAK +- {"CA_MD_TOO_WEAK", ERR_LIB_SSL, SSL_R_CA_MD_TOO_WEAK}, +- #else +- {"CA_MD_TOO_WEAK", 20, 398}, +- #endif +- #ifdef SSL_R_CCS_RECEIVED_EARLY +- {"CCS_RECEIVED_EARLY", ERR_LIB_SSL, SSL_R_CCS_RECEIVED_EARLY}, +- #else +- {"CCS_RECEIVED_EARLY", 20, 133}, +- #endif +- #ifdef SSL_R_CERTIFICATE_VERIFY_FAILED +- {"CERTIFICATE_VERIFY_FAILED", ERR_LIB_SSL, SSL_R_CERTIFICATE_VERIFY_FAILED}, +- #else +- {"CERTIFICATE_VERIFY_FAILED", 20, 134}, +- #endif +- #ifdef SSL_R_CERT_CB_ERROR +- {"CERT_CB_ERROR", ERR_LIB_SSL, SSL_R_CERT_CB_ERROR}, +- #else +- {"CERT_CB_ERROR", 20, 377}, +- #endif +- #ifdef SSL_R_CERT_LENGTH_MISMATCH +- {"CERT_LENGTH_MISMATCH", ERR_LIB_SSL, SSL_R_CERT_LENGTH_MISMATCH}, +- #else +- {"CERT_LENGTH_MISMATCH", 20, 135}, +- #endif +- #ifdef SSL_R_CIPHERSUITE_DIGEST_HAS_CHANGED +- {"CIPHERSUITE_DIGEST_HAS_CHANGED", ERR_LIB_SSL, SSL_R_CIPHERSUITE_DIGEST_HAS_CHANGED}, +- #else +- {"CIPHERSUITE_DIGEST_HAS_CHANGED", 20, 218}, +- #endif +- #ifdef SSL_R_CIPHER_CODE_WRONG_LENGTH +- {"CIPHER_CODE_WRONG_LENGTH", ERR_LIB_SSL, SSL_R_CIPHER_CODE_WRONG_LENGTH}, +- #else +- {"CIPHER_CODE_WRONG_LENGTH", 20, 137}, +- #endif +- #ifdef SSL_R_CLIENTHELLO_TLSEXT +- {"CLIENTHELLO_TLSEXT", ERR_LIB_SSL, SSL_R_CLIENTHELLO_TLSEXT}, +- #else +- {"CLIENTHELLO_TLSEXT", 20, 226}, +- #endif +- #ifdef SSL_R_COMPRESSED_LENGTH_TOO_LONG +- {"COMPRESSED_LENGTH_TOO_LONG", ERR_LIB_SSL, SSL_R_COMPRESSED_LENGTH_TOO_LONG}, +- #else +- {"COMPRESSED_LENGTH_TOO_LONG", 20, 140}, +- #endif +- #ifdef SSL_R_COMPRESSION_DISABLED +- {"COMPRESSION_DISABLED", ERR_LIB_SSL, SSL_R_COMPRESSION_DISABLED}, +- #else +- {"COMPRESSION_DISABLED", 20, 343}, +- #endif +- #ifdef SSL_R_COMPRESSION_FAILURE +- {"COMPRESSION_FAILURE", ERR_LIB_SSL, SSL_R_COMPRESSION_FAILURE}, +- #else +- {"COMPRESSION_FAILURE", 20, 141}, +- #endif +- #ifdef SSL_R_COMPRESSION_ID_NOT_WITHIN_PRIVATE_RANGE +- {"COMPRESSION_ID_NOT_WITHIN_PRIVATE_RANGE", ERR_LIB_SSL, SSL_R_COMPRESSION_ID_NOT_WITHIN_PRIVATE_RANGE}, +- #else +- {"COMPRESSION_ID_NOT_WITHIN_PRIVATE_RANGE", 20, 307}, +- #endif +- #ifdef SSL_R_COMPRESSION_LIBRARY_ERROR +- {"COMPRESSION_LIBRARY_ERROR", ERR_LIB_SSL, SSL_R_COMPRESSION_LIBRARY_ERROR}, +- #else +- {"COMPRESSION_LIBRARY_ERROR", 20, 142}, +- #endif +- #ifdef SSL_R_CONNECTION_TYPE_NOT_SET +- {"CONNECTION_TYPE_NOT_SET", ERR_LIB_SSL, SSL_R_CONNECTION_TYPE_NOT_SET}, +- #else +- {"CONNECTION_TYPE_NOT_SET", 20, 144}, +- #endif +- #ifdef SSL_R_CONTEXT_NOT_DANE_ENABLED +- {"CONTEXT_NOT_DANE_ENABLED", ERR_LIB_SSL, SSL_R_CONTEXT_NOT_DANE_ENABLED}, +- #else +- {"CONTEXT_NOT_DANE_ENABLED", 20, 167}, +- #endif +- #ifdef SSL_R_COOKIE_GEN_CALLBACK_FAILURE +- {"COOKIE_GEN_CALLBACK_FAILURE", ERR_LIB_SSL, SSL_R_COOKIE_GEN_CALLBACK_FAILURE}, +- #else +- {"COOKIE_GEN_CALLBACK_FAILURE", 20, 400}, +- #endif +- #ifdef SSL_R_COOKIE_MISMATCH +- {"COOKIE_MISMATCH", ERR_LIB_SSL, SSL_R_COOKIE_MISMATCH}, +- #else +- {"COOKIE_MISMATCH", 20, 308}, +- #endif +- #ifdef SSL_R_COPY_PARAMETERS_FAILED +- {"COPY_PARAMETERS_FAILED", ERR_LIB_SSL, SSL_R_COPY_PARAMETERS_FAILED}, +- #else +- {"COPY_PARAMETERS_FAILED", 20, 296}, +- #endif +- #ifdef SSL_R_CUSTOM_EXT_HANDLER_ALREADY_INSTALLED +- {"CUSTOM_EXT_HANDLER_ALREADY_INSTALLED", ERR_LIB_SSL, SSL_R_CUSTOM_EXT_HANDLER_ALREADY_INSTALLED}, +- #else +- {"CUSTOM_EXT_HANDLER_ALREADY_INSTALLED", 20, 206}, +- #endif +- #ifdef SSL_R_DANE_ALREADY_ENABLED +- {"DANE_ALREADY_ENABLED", ERR_LIB_SSL, SSL_R_DANE_ALREADY_ENABLED}, +- #else +- {"DANE_ALREADY_ENABLED", 20, 172}, +- #endif +- #ifdef SSL_R_DANE_CANNOT_OVERRIDE_MTYPE_FULL +- {"DANE_CANNOT_OVERRIDE_MTYPE_FULL", ERR_LIB_SSL, SSL_R_DANE_CANNOT_OVERRIDE_MTYPE_FULL}, +- #else +- {"DANE_CANNOT_OVERRIDE_MTYPE_FULL", 20, 173}, +- #endif +- #ifdef SSL_R_DANE_NOT_ENABLED +- {"DANE_NOT_ENABLED", ERR_LIB_SSL, SSL_R_DANE_NOT_ENABLED}, +- #else +- {"DANE_NOT_ENABLED", 20, 175}, +- #endif +- #ifdef SSL_R_DANE_TLSA_BAD_CERTIFICATE +- {"DANE_TLSA_BAD_CERTIFICATE", ERR_LIB_SSL, SSL_R_DANE_TLSA_BAD_CERTIFICATE}, +- #else +- {"DANE_TLSA_BAD_CERTIFICATE", 20, 180}, +- #endif +- #ifdef SSL_R_DANE_TLSA_BAD_CERTIFICATE_USAGE +- {"DANE_TLSA_BAD_CERTIFICATE_USAGE", ERR_LIB_SSL, SSL_R_DANE_TLSA_BAD_CERTIFICATE_USAGE}, +- #else +- {"DANE_TLSA_BAD_CERTIFICATE_USAGE", 20, 184}, +- #endif +- #ifdef SSL_R_DANE_TLSA_BAD_DATA_LENGTH +- {"DANE_TLSA_BAD_DATA_LENGTH", ERR_LIB_SSL, SSL_R_DANE_TLSA_BAD_DATA_LENGTH}, +- #else +- {"DANE_TLSA_BAD_DATA_LENGTH", 20, 189}, +- #endif +- #ifdef SSL_R_DANE_TLSA_BAD_DIGEST_LENGTH +- {"DANE_TLSA_BAD_DIGEST_LENGTH", ERR_LIB_SSL, SSL_R_DANE_TLSA_BAD_DIGEST_LENGTH}, +- #else +- {"DANE_TLSA_BAD_DIGEST_LENGTH", 20, 192}, +- #endif +- #ifdef SSL_R_DANE_TLSA_BAD_MATCHING_TYPE +- {"DANE_TLSA_BAD_MATCHING_TYPE", ERR_LIB_SSL, SSL_R_DANE_TLSA_BAD_MATCHING_TYPE}, +- #else +- {"DANE_TLSA_BAD_MATCHING_TYPE", 20, 200}, +- #endif +- #ifdef SSL_R_DANE_TLSA_BAD_PUBLIC_KEY +- {"DANE_TLSA_BAD_PUBLIC_KEY", ERR_LIB_SSL, SSL_R_DANE_TLSA_BAD_PUBLIC_KEY}, +- #else +- {"DANE_TLSA_BAD_PUBLIC_KEY", 20, 201}, +- #endif +- #ifdef SSL_R_DANE_TLSA_BAD_SELECTOR +- {"DANE_TLSA_BAD_SELECTOR", ERR_LIB_SSL, SSL_R_DANE_TLSA_BAD_SELECTOR}, +- #else +- {"DANE_TLSA_BAD_SELECTOR", 20, 202}, +- #endif +- #ifdef SSL_R_DANE_TLSA_NULL_DATA +- {"DANE_TLSA_NULL_DATA", ERR_LIB_SSL, SSL_R_DANE_TLSA_NULL_DATA}, +- #else +- {"DANE_TLSA_NULL_DATA", 20, 203}, +- #endif +- #ifdef SSL_R_DATA_BETWEEN_CCS_AND_FINISHED +- {"DATA_BETWEEN_CCS_AND_FINISHED", ERR_LIB_SSL, SSL_R_DATA_BETWEEN_CCS_AND_FINISHED}, +- #else +- {"DATA_BETWEEN_CCS_AND_FINISHED", 20, 145}, +- #endif +- #ifdef SSL_R_DATA_LENGTH_TOO_LONG +- {"DATA_LENGTH_TOO_LONG", ERR_LIB_SSL, SSL_R_DATA_LENGTH_TOO_LONG}, +- #else +- {"DATA_LENGTH_TOO_LONG", 20, 146}, +- #endif +- #ifdef SSL_R_DECRYPTION_FAILED +- {"DECRYPTION_FAILED", ERR_LIB_SSL, SSL_R_DECRYPTION_FAILED}, +- #else +- {"DECRYPTION_FAILED", 20, 147}, +- #endif +- #ifdef SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC +- {"DECRYPTION_FAILED_OR_BAD_RECORD_MAC", ERR_LIB_SSL, SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC}, +- #else +- {"DECRYPTION_FAILED_OR_BAD_RECORD_MAC", 20, 281}, +- #endif +- #ifdef SSL_R_DH_KEY_TOO_SMALL +- {"DH_KEY_TOO_SMALL", ERR_LIB_SSL, SSL_R_DH_KEY_TOO_SMALL}, +- #else +- {"DH_KEY_TOO_SMALL", 20, 394}, +- #endif +- #ifdef SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG +- {"DH_PUBLIC_VALUE_LENGTH_IS_WRONG", ERR_LIB_SSL, SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG}, +- #else +- {"DH_PUBLIC_VALUE_LENGTH_IS_WRONG", 20, 148}, +- #endif +- #ifdef SSL_R_DIGEST_CHECK_FAILED +- {"DIGEST_CHECK_FAILED", ERR_LIB_SSL, SSL_R_DIGEST_CHECK_FAILED}, +- #else +- {"DIGEST_CHECK_FAILED", 20, 149}, +- #endif +- #ifdef SSL_R_DTLS_MESSAGE_TOO_BIG +- {"DTLS_MESSAGE_TOO_BIG", ERR_LIB_SSL, SSL_R_DTLS_MESSAGE_TOO_BIG}, +- #else +- {"DTLS_MESSAGE_TOO_BIG", 20, 334}, +- #endif +- #ifdef SSL_R_DUPLICATE_COMPRESSION_ID +- {"DUPLICATE_COMPRESSION_ID", ERR_LIB_SSL, SSL_R_DUPLICATE_COMPRESSION_ID}, +- #else +- {"DUPLICATE_COMPRESSION_ID", 20, 309}, +- #endif +- #ifdef SSL_R_ECC_CERT_NOT_FOR_SIGNING +- {"ECC_CERT_NOT_FOR_SIGNING", ERR_LIB_SSL, SSL_R_ECC_CERT_NOT_FOR_SIGNING}, +- #else +- {"ECC_CERT_NOT_FOR_SIGNING", 20, 318}, +- #endif +- #ifdef SSL_R_ECDH_REQUIRED_FOR_SUITEB_MODE +- {"ECDH_REQUIRED_FOR_SUITEB_MODE", ERR_LIB_SSL, SSL_R_ECDH_REQUIRED_FOR_SUITEB_MODE}, +- #else +- {"ECDH_REQUIRED_FOR_SUITEB_MODE", 20, 374}, +- #endif +- #ifdef SSL_R_EE_KEY_TOO_SMALL +- {"EE_KEY_TOO_SMALL", ERR_LIB_SSL, SSL_R_EE_KEY_TOO_SMALL}, +- #else +- {"EE_KEY_TOO_SMALL", 20, 399}, +- #endif +- #ifdef SSL_R_EMPTY_SRTP_PROTECTION_PROFILE_LIST +- {"EMPTY_SRTP_PROTECTION_PROFILE_LIST", ERR_LIB_SSL, SSL_R_EMPTY_SRTP_PROTECTION_PROFILE_LIST}, +- #else +- {"EMPTY_SRTP_PROTECTION_PROFILE_LIST", 20, 354}, +- #endif +- #ifdef SSL_R_ENCRYPTED_LENGTH_TOO_LONG +- {"ENCRYPTED_LENGTH_TOO_LONG", ERR_LIB_SSL, SSL_R_ENCRYPTED_LENGTH_TOO_LONG}, +- #else +- {"ENCRYPTED_LENGTH_TOO_LONG", 20, 150}, +- #endif +- #ifdef SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST +- {"ERROR_IN_RECEIVED_CIPHER_LIST", ERR_LIB_SSL, SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST}, +- #else +- {"ERROR_IN_RECEIVED_CIPHER_LIST", 20, 151}, +- #endif +- #ifdef SSL_R_ERROR_SETTING_TLSA_BASE_DOMAIN +- {"ERROR_SETTING_TLSA_BASE_DOMAIN", ERR_LIB_SSL, SSL_R_ERROR_SETTING_TLSA_BASE_DOMAIN}, +- #else +- {"ERROR_SETTING_TLSA_BASE_DOMAIN", 20, 204}, +- #endif +- #ifdef SSL_R_EXCEEDS_MAX_FRAGMENT_SIZE +- {"EXCEEDS_MAX_FRAGMENT_SIZE", ERR_LIB_SSL, SSL_R_EXCEEDS_MAX_FRAGMENT_SIZE}, +- #else +- {"EXCEEDS_MAX_FRAGMENT_SIZE", 20, 194}, +- #endif +- #ifdef SSL_R_EXCESSIVE_MESSAGE_SIZE +- {"EXCESSIVE_MESSAGE_SIZE", ERR_LIB_SSL, SSL_R_EXCESSIVE_MESSAGE_SIZE}, +- #else +- {"EXCESSIVE_MESSAGE_SIZE", 20, 152}, +- #endif +- #ifdef SSL_R_EXTENSION_NOT_RECEIVED +- {"EXTENSION_NOT_RECEIVED", ERR_LIB_SSL, SSL_R_EXTENSION_NOT_RECEIVED}, +- #else +- {"EXTENSION_NOT_RECEIVED", 20, 279}, +- #endif +- #ifdef SSL_R_EXTRA_DATA_IN_MESSAGE +- {"EXTRA_DATA_IN_MESSAGE", ERR_LIB_SSL, SSL_R_EXTRA_DATA_IN_MESSAGE}, +- #else +- {"EXTRA_DATA_IN_MESSAGE", 20, 153}, +- #endif +- #ifdef SSL_R_EXT_LENGTH_MISMATCH +- {"EXT_LENGTH_MISMATCH", ERR_LIB_SSL, SSL_R_EXT_LENGTH_MISMATCH}, +- #else +- {"EXT_LENGTH_MISMATCH", 20, 163}, +- #endif +- #ifdef SSL_R_FAILED_TO_INIT_ASYNC +- {"FAILED_TO_INIT_ASYNC", ERR_LIB_SSL, SSL_R_FAILED_TO_INIT_ASYNC}, +- #else +- {"FAILED_TO_INIT_ASYNC", 20, 405}, +- #endif +- #ifdef SSL_R_FRAGMENTED_CLIENT_HELLO +- {"FRAGMENTED_CLIENT_HELLO", ERR_LIB_SSL, SSL_R_FRAGMENTED_CLIENT_HELLO}, +- #else +- {"FRAGMENTED_CLIENT_HELLO", 20, 401}, +- #endif +- #ifdef SSL_R_GOT_A_FIN_BEFORE_A_CCS +- {"GOT_A_FIN_BEFORE_A_CCS", ERR_LIB_SSL, SSL_R_GOT_A_FIN_BEFORE_A_CCS}, +- #else +- {"GOT_A_FIN_BEFORE_A_CCS", 20, 154}, +- #endif +- #ifdef SSL_R_HTTPS_PROXY_REQUEST +- {"HTTPS_PROXY_REQUEST", ERR_LIB_SSL, SSL_R_HTTPS_PROXY_REQUEST}, +- #else +- {"HTTPS_PROXY_REQUEST", 20, 155}, +- #endif +- #ifdef SSL_R_HTTP_REQUEST +- {"HTTP_REQUEST", ERR_LIB_SSL, SSL_R_HTTP_REQUEST}, +- #else +- {"HTTP_REQUEST", 20, 156}, +- #endif +- #ifdef SSL_R_ILLEGAL_POINT_COMPRESSION +- {"ILLEGAL_POINT_COMPRESSION", ERR_LIB_SSL, SSL_R_ILLEGAL_POINT_COMPRESSION}, +- #else +- {"ILLEGAL_POINT_COMPRESSION", 20, 162}, +- #endif +- #ifdef SSL_R_ILLEGAL_SUITEB_DIGEST +- {"ILLEGAL_SUITEB_DIGEST", ERR_LIB_SSL, SSL_R_ILLEGAL_SUITEB_DIGEST}, +- #else +- {"ILLEGAL_SUITEB_DIGEST", 20, 380}, +- #endif +- #ifdef SSL_R_INAPPROPRIATE_FALLBACK +- {"INAPPROPRIATE_FALLBACK", ERR_LIB_SSL, SSL_R_INAPPROPRIATE_FALLBACK}, +- #else +- {"INAPPROPRIATE_FALLBACK", 20, 373}, +- #endif +- #ifdef SSL_R_INCONSISTENT_COMPRESSION +- {"INCONSISTENT_COMPRESSION", ERR_LIB_SSL, SSL_R_INCONSISTENT_COMPRESSION}, +- #else +- {"INCONSISTENT_COMPRESSION", 20, 340}, +- #endif +- #ifdef SSL_R_INCONSISTENT_EARLY_DATA_ALPN +- {"INCONSISTENT_EARLY_DATA_ALPN", ERR_LIB_SSL, SSL_R_INCONSISTENT_EARLY_DATA_ALPN}, +- #else +- {"INCONSISTENT_EARLY_DATA_ALPN", 20, 222}, +- #endif +- #ifdef SSL_R_INCONSISTENT_EARLY_DATA_SNI +- {"INCONSISTENT_EARLY_DATA_SNI", ERR_LIB_SSL, SSL_R_INCONSISTENT_EARLY_DATA_SNI}, +- #else +- {"INCONSISTENT_EARLY_DATA_SNI", 20, 231}, +- #endif +- #ifdef SSL_R_INCONSISTENT_EXTMS +- {"INCONSISTENT_EXTMS", ERR_LIB_SSL, SSL_R_INCONSISTENT_EXTMS}, +- #else +- {"INCONSISTENT_EXTMS", 20, 104}, +- #endif +- #ifdef SSL_R_INSUFFICIENT_SECURITY +- {"INSUFFICIENT_SECURITY", ERR_LIB_SSL, SSL_R_INSUFFICIENT_SECURITY}, +- #else +- {"INSUFFICIENT_SECURITY", 20, 241}, +- #endif +- #ifdef SSL_R_INVALID_ALERT +- {"INVALID_ALERT", ERR_LIB_SSL, SSL_R_INVALID_ALERT}, +- #else +- {"INVALID_ALERT", 20, 205}, +- #endif +- #ifdef SSL_R_INVALID_CCS_MESSAGE +- {"INVALID_CCS_MESSAGE", ERR_LIB_SSL, SSL_R_INVALID_CCS_MESSAGE}, +- #else +- {"INVALID_CCS_MESSAGE", 20, 260}, +- #endif +- #ifdef SSL_R_INVALID_CERTIFICATE_OR_ALG +- {"INVALID_CERTIFICATE_OR_ALG", ERR_LIB_SSL, SSL_R_INVALID_CERTIFICATE_OR_ALG}, +- #else +- {"INVALID_CERTIFICATE_OR_ALG", 20, 238}, +- #endif +- #ifdef SSL_R_INVALID_COMMAND +- {"INVALID_COMMAND", ERR_LIB_SSL, SSL_R_INVALID_COMMAND}, +- #else +- {"INVALID_COMMAND", 20, 280}, +- #endif +- #ifdef SSL_R_INVALID_COMPRESSION_ALGORITHM +- {"INVALID_COMPRESSION_ALGORITHM", ERR_LIB_SSL, SSL_R_INVALID_COMPRESSION_ALGORITHM}, +- #else +- {"INVALID_COMPRESSION_ALGORITHM", 20, 341}, +- #endif +- #ifdef SSL_R_INVALID_CONFIG +- {"INVALID_CONFIG", ERR_LIB_SSL, SSL_R_INVALID_CONFIG}, +- #else +- {"INVALID_CONFIG", 20, 283}, +- #endif +- #ifdef SSL_R_INVALID_CONFIGURATION_NAME +- {"INVALID_CONFIGURATION_NAME", ERR_LIB_SSL, SSL_R_INVALID_CONFIGURATION_NAME}, +- #else +- {"INVALID_CONFIGURATION_NAME", 20, 113}, +- #endif +- #ifdef SSL_R_INVALID_CONTEXT +- {"INVALID_CONTEXT", ERR_LIB_SSL, SSL_R_INVALID_CONTEXT}, +- #else +- {"INVALID_CONTEXT", 20, 282}, +- #endif +- #ifdef SSL_R_INVALID_CT_VALIDATION_TYPE +- {"INVALID_CT_VALIDATION_TYPE", ERR_LIB_SSL, SSL_R_INVALID_CT_VALIDATION_TYPE}, +- #else +- {"INVALID_CT_VALIDATION_TYPE", 20, 212}, +- #endif +- #ifdef SSL_R_INVALID_KEY_UPDATE_TYPE +- {"INVALID_KEY_UPDATE_TYPE", ERR_LIB_SSL, SSL_R_INVALID_KEY_UPDATE_TYPE}, +- #else +- {"INVALID_KEY_UPDATE_TYPE", 20, 120}, +- #endif +- #ifdef SSL_R_INVALID_MAX_EARLY_DATA +- {"INVALID_MAX_EARLY_DATA", ERR_LIB_SSL, SSL_R_INVALID_MAX_EARLY_DATA}, +- #else +- {"INVALID_MAX_EARLY_DATA", 20, 174}, +- #endif +- #ifdef SSL_R_INVALID_NULL_CMD_NAME +- {"INVALID_NULL_CMD_NAME", ERR_LIB_SSL, SSL_R_INVALID_NULL_CMD_NAME}, +- #else +- {"INVALID_NULL_CMD_NAME", 20, 385}, +- #endif +- #ifdef SSL_R_INVALID_SEQUENCE_NUMBER +- {"INVALID_SEQUENCE_NUMBER", ERR_LIB_SSL, SSL_R_INVALID_SEQUENCE_NUMBER}, +- #else +- {"INVALID_SEQUENCE_NUMBER", 20, 402}, +- #endif +- #ifdef SSL_R_INVALID_SERVERINFO_DATA +- {"INVALID_SERVERINFO_DATA", ERR_LIB_SSL, SSL_R_INVALID_SERVERINFO_DATA}, +- #else +- {"INVALID_SERVERINFO_DATA", 20, 388}, +- #endif +- #ifdef SSL_R_INVALID_SESSION_ID +- {"INVALID_SESSION_ID", ERR_LIB_SSL, SSL_R_INVALID_SESSION_ID}, +- #else +- {"INVALID_SESSION_ID", 20, 999}, +- #endif +- #ifdef SSL_R_INVALID_SRP_USERNAME +- {"INVALID_SRP_USERNAME", ERR_LIB_SSL, SSL_R_INVALID_SRP_USERNAME}, +- #else +- {"INVALID_SRP_USERNAME", 20, 357}, +- #endif +- #ifdef SSL_R_INVALID_STATUS_RESPONSE +- {"INVALID_STATUS_RESPONSE", ERR_LIB_SSL, SSL_R_INVALID_STATUS_RESPONSE}, +- #else +- {"INVALID_STATUS_RESPONSE", 20, 328}, +- #endif +- #ifdef SSL_R_INVALID_TICKET_KEYS_LENGTH +- {"INVALID_TICKET_KEYS_LENGTH", ERR_LIB_SSL, SSL_R_INVALID_TICKET_KEYS_LENGTH}, +- #else +- {"INVALID_TICKET_KEYS_LENGTH", 20, 325}, +- #endif +- #ifdef SSL_R_LEGACY_SIGALG_DISALLOWED_OR_UNSUPPORTED +- {"LEGACY_SIGALG_DISALLOWED_OR_UNSUPPORTED", ERR_LIB_SSL, SSL_R_LEGACY_SIGALG_DISALLOWED_OR_UNSUPPORTED}, +- #else +- {"LEGACY_SIGALG_DISALLOWED_OR_UNSUPPORTED", 20, 333}, +- #endif +- #ifdef SSL_R_LENGTH_MISMATCH +- {"LENGTH_MISMATCH", ERR_LIB_SSL, SSL_R_LENGTH_MISMATCH}, +- #else +- {"LENGTH_MISMATCH", 20, 159}, +- #endif +- #ifdef SSL_R_LENGTH_TOO_LONG +- {"LENGTH_TOO_LONG", ERR_LIB_SSL, SSL_R_LENGTH_TOO_LONG}, +- #else +- {"LENGTH_TOO_LONG", 20, 404}, +- #endif +- #ifdef SSL_R_LENGTH_TOO_SHORT +- {"LENGTH_TOO_SHORT", ERR_LIB_SSL, SSL_R_LENGTH_TOO_SHORT}, +- #else +- {"LENGTH_TOO_SHORT", 20, 160}, +- #endif +- #ifdef SSL_R_LIBRARY_BUG +- {"LIBRARY_BUG", ERR_LIB_SSL, SSL_R_LIBRARY_BUG}, +- #else +- {"LIBRARY_BUG", 20, 274}, +- #endif +- #ifdef SSL_R_LIBRARY_HAS_NO_CIPHERS +- {"LIBRARY_HAS_NO_CIPHERS", ERR_LIB_SSL, SSL_R_LIBRARY_HAS_NO_CIPHERS}, +- #else +- {"LIBRARY_HAS_NO_CIPHERS", 20, 161}, +- #endif +- #ifdef SSL_R_MISSING_DSA_SIGNING_CERT +- {"MISSING_DSA_SIGNING_CERT", ERR_LIB_SSL, SSL_R_MISSING_DSA_SIGNING_CERT}, +- #else +- {"MISSING_DSA_SIGNING_CERT", 20, 165}, +- #endif +- #ifdef SSL_R_MISSING_ECDSA_SIGNING_CERT +- {"MISSING_ECDSA_SIGNING_CERT", ERR_LIB_SSL, SSL_R_MISSING_ECDSA_SIGNING_CERT}, +- #else +- {"MISSING_ECDSA_SIGNING_CERT", 20, 381}, +- #endif +- #ifdef SSL_R_MISSING_FATAL +- {"MISSING_FATAL", ERR_LIB_SSL, SSL_R_MISSING_FATAL}, +- #else +- {"MISSING_FATAL", 20, 256}, +- #endif +- #ifdef SSL_R_MISSING_PARAMETERS +- {"MISSING_PARAMETERS", ERR_LIB_SSL, SSL_R_MISSING_PARAMETERS}, +- #else +- {"MISSING_PARAMETERS", 20, 290}, +- #endif +- #ifdef SSL_R_MISSING_PSK_KEX_MODES_EXTENSION +- {"MISSING_PSK_KEX_MODES_EXTENSION", ERR_LIB_SSL, SSL_R_MISSING_PSK_KEX_MODES_EXTENSION}, +- #else +- {"MISSING_PSK_KEX_MODES_EXTENSION", 20, 310}, +- #endif +- #ifdef SSL_R_MISSING_RSA_CERTIFICATE +- {"MISSING_RSA_CERTIFICATE", ERR_LIB_SSL, SSL_R_MISSING_RSA_CERTIFICATE}, +- #else +- {"MISSING_RSA_CERTIFICATE", 20, 168}, +- #endif +- #ifdef SSL_R_MISSING_RSA_ENCRYPTING_CERT +- {"MISSING_RSA_ENCRYPTING_CERT", ERR_LIB_SSL, SSL_R_MISSING_RSA_ENCRYPTING_CERT}, +- #else +- {"MISSING_RSA_ENCRYPTING_CERT", 20, 169}, +- #endif +- #ifdef SSL_R_MISSING_RSA_SIGNING_CERT +- {"MISSING_RSA_SIGNING_CERT", ERR_LIB_SSL, SSL_R_MISSING_RSA_SIGNING_CERT}, +- #else +- {"MISSING_RSA_SIGNING_CERT", 20, 170}, +- #endif +- #ifdef SSL_R_MISSING_SIGALGS_EXTENSION +- {"MISSING_SIGALGS_EXTENSION", ERR_LIB_SSL, SSL_R_MISSING_SIGALGS_EXTENSION}, +- #else +- {"MISSING_SIGALGS_EXTENSION", 20, 112}, +- #endif +- #ifdef SSL_R_MISSING_SIGNING_CERT +- {"MISSING_SIGNING_CERT", ERR_LIB_SSL, SSL_R_MISSING_SIGNING_CERT}, +- #else +- {"MISSING_SIGNING_CERT", 20, 221}, +- #endif +- #ifdef SSL_R_MISSING_SRP_PARAM +- {"MISSING_SRP_PARAM", ERR_LIB_SSL, SSL_R_MISSING_SRP_PARAM}, +- #else +- {"MISSING_SRP_PARAM", 20, 358}, +- #endif +- #ifdef SSL_R_MISSING_SUPPORTED_GROUPS_EXTENSION +- {"MISSING_SUPPORTED_GROUPS_EXTENSION", ERR_LIB_SSL, SSL_R_MISSING_SUPPORTED_GROUPS_EXTENSION}, +- #else +- {"MISSING_SUPPORTED_GROUPS_EXTENSION", 20, 209}, +- #endif +- #ifdef SSL_R_MISSING_TMP_DH_KEY +- {"MISSING_TMP_DH_KEY", ERR_LIB_SSL, SSL_R_MISSING_TMP_DH_KEY}, +- #else +- {"MISSING_TMP_DH_KEY", 20, 171}, +- #endif +- #ifdef SSL_R_MISSING_TMP_ECDH_KEY +- {"MISSING_TMP_ECDH_KEY", ERR_LIB_SSL, SSL_R_MISSING_TMP_ECDH_KEY}, +- #else +- {"MISSING_TMP_ECDH_KEY", 20, 311}, +- #endif +- #ifdef SSL_R_MIXED_HANDSHAKE_AND_NON_HANDSHAKE_DATA +- {"MIXED_HANDSHAKE_AND_NON_HANDSHAKE_DATA", ERR_LIB_SSL, SSL_R_MIXED_HANDSHAKE_AND_NON_HANDSHAKE_DATA}, +- #else +- {"MIXED_HANDSHAKE_AND_NON_HANDSHAKE_DATA", 20, 293}, +- #endif +- #ifdef SSL_R_NOT_ON_RECORD_BOUNDARY +- {"NOT_ON_RECORD_BOUNDARY", ERR_LIB_SSL, SSL_R_NOT_ON_RECORD_BOUNDARY}, +- #else +- {"NOT_ON_RECORD_BOUNDARY", 20, 182}, +- #endif +- #ifdef SSL_R_NOT_REPLACING_CERTIFICATE +- {"NOT_REPLACING_CERTIFICATE", ERR_LIB_SSL, SSL_R_NOT_REPLACING_CERTIFICATE}, +- #else +- {"NOT_REPLACING_CERTIFICATE", 20, 289}, +- #endif +- #ifdef SSL_R_NOT_SERVER +- {"NOT_SERVER", ERR_LIB_SSL, SSL_R_NOT_SERVER}, +- #else +- {"NOT_SERVER", 20, 284}, +- #endif +- #ifdef SSL_R_NO_APPLICATION_PROTOCOL +- {"NO_APPLICATION_PROTOCOL", ERR_LIB_SSL, SSL_R_NO_APPLICATION_PROTOCOL}, +- #else +- {"NO_APPLICATION_PROTOCOL", 20, 235}, +- #endif +- #ifdef SSL_R_NO_CERTIFICATES_RETURNED +- {"NO_CERTIFICATES_RETURNED", ERR_LIB_SSL, SSL_R_NO_CERTIFICATES_RETURNED}, +- #else +- {"NO_CERTIFICATES_RETURNED", 20, 176}, +- #endif +- #ifdef SSL_R_NO_CERTIFICATE_ASSIGNED +- {"NO_CERTIFICATE_ASSIGNED", ERR_LIB_SSL, SSL_R_NO_CERTIFICATE_ASSIGNED}, +- #else +- {"NO_CERTIFICATE_ASSIGNED", 20, 177}, +- #endif +- #ifdef SSL_R_NO_CERTIFICATE_SET +- {"NO_CERTIFICATE_SET", ERR_LIB_SSL, SSL_R_NO_CERTIFICATE_SET}, +- #else +- {"NO_CERTIFICATE_SET", 20, 179}, +- #endif +- #ifdef SSL_R_NO_CHANGE_FOLLOWING_HRR +- {"NO_CHANGE_FOLLOWING_HRR", ERR_LIB_SSL, SSL_R_NO_CHANGE_FOLLOWING_HRR}, +- #else +- {"NO_CHANGE_FOLLOWING_HRR", 20, 214}, +- #endif +- #ifdef SSL_R_NO_CIPHERS_AVAILABLE +- {"NO_CIPHERS_AVAILABLE", ERR_LIB_SSL, SSL_R_NO_CIPHERS_AVAILABLE}, +- #else +- {"NO_CIPHERS_AVAILABLE", 20, 181}, +- #endif +- #ifdef SSL_R_NO_CIPHERS_SPECIFIED +- {"NO_CIPHERS_SPECIFIED", ERR_LIB_SSL, SSL_R_NO_CIPHERS_SPECIFIED}, +- #else +- {"NO_CIPHERS_SPECIFIED", 20, 183}, +- #endif +- #ifdef SSL_R_NO_CIPHER_MATCH +- {"NO_CIPHER_MATCH", ERR_LIB_SSL, SSL_R_NO_CIPHER_MATCH}, +- #else +- {"NO_CIPHER_MATCH", 20, 185}, +- #endif +- #ifdef SSL_R_NO_CLIENT_CERT_METHOD +- {"NO_CLIENT_CERT_METHOD", ERR_LIB_SSL, SSL_R_NO_CLIENT_CERT_METHOD}, +- #else +- {"NO_CLIENT_CERT_METHOD", 20, 331}, +- #endif +- #ifdef SSL_R_NO_COMPRESSION_SPECIFIED +- {"NO_COMPRESSION_SPECIFIED", ERR_LIB_SSL, SSL_R_NO_COMPRESSION_SPECIFIED}, +- #else +- {"NO_COMPRESSION_SPECIFIED", 20, 187}, +- #endif +- #ifdef SSL_R_NO_COOKIE_CALLBACK_SET +- {"NO_COOKIE_CALLBACK_SET", ERR_LIB_SSL, SSL_R_NO_COOKIE_CALLBACK_SET}, +- #else +- {"NO_COOKIE_CALLBACK_SET", 20, 287}, +- #endif +- #ifdef SSL_R_NO_GOST_CERTIFICATE_SENT_BY_PEER +- {"NO_GOST_CERTIFICATE_SENT_BY_PEER", ERR_LIB_SSL, SSL_R_NO_GOST_CERTIFICATE_SENT_BY_PEER}, +- #else +- {"NO_GOST_CERTIFICATE_SENT_BY_PEER", 20, 330}, +- #endif +- #ifdef SSL_R_NO_METHOD_SPECIFIED +- {"NO_METHOD_SPECIFIED", ERR_LIB_SSL, SSL_R_NO_METHOD_SPECIFIED}, +- #else +- {"NO_METHOD_SPECIFIED", 20, 188}, +- #endif +- #ifdef SSL_R_NO_PEM_EXTENSIONS +- {"NO_PEM_EXTENSIONS", ERR_LIB_SSL, SSL_R_NO_PEM_EXTENSIONS}, +- #else +- {"NO_PEM_EXTENSIONS", 20, 389}, +- #endif +- #ifdef SSL_R_NO_PRIVATE_KEY_ASSIGNED +- {"NO_PRIVATE_KEY_ASSIGNED", ERR_LIB_SSL, SSL_R_NO_PRIVATE_KEY_ASSIGNED}, +- #else +- {"NO_PRIVATE_KEY_ASSIGNED", 20, 190}, +- #endif +- #ifdef SSL_R_NO_PROTOCOLS_AVAILABLE +- {"NO_PROTOCOLS_AVAILABLE", ERR_LIB_SSL, SSL_R_NO_PROTOCOLS_AVAILABLE}, +- #else +- {"NO_PROTOCOLS_AVAILABLE", 20, 191}, +- #endif +- #ifdef SSL_R_NO_RENEGOTIATION +- {"NO_RENEGOTIATION", ERR_LIB_SSL, SSL_R_NO_RENEGOTIATION}, +- #else +- {"NO_RENEGOTIATION", 20, 339}, +- #endif +- #ifdef SSL_R_NO_REQUIRED_DIGEST +- {"NO_REQUIRED_DIGEST", ERR_LIB_SSL, SSL_R_NO_REQUIRED_DIGEST}, +- #else +- {"NO_REQUIRED_DIGEST", 20, 324}, +- #endif +- #ifdef SSL_R_NO_SHARED_CIPHER +- {"NO_SHARED_CIPHER", ERR_LIB_SSL, SSL_R_NO_SHARED_CIPHER}, +- #else +- {"NO_SHARED_CIPHER", 20, 193}, +- #endif +- #ifdef SSL_R_NO_SHARED_GROUPS +- {"NO_SHARED_GROUPS", ERR_LIB_SSL, SSL_R_NO_SHARED_GROUPS}, +- #else +- {"NO_SHARED_GROUPS", 20, 410}, +- #endif +- #ifdef SSL_R_NO_SHARED_SIGNATURE_ALGORITHMS +- {"NO_SHARED_SIGNATURE_ALGORITHMS", ERR_LIB_SSL, SSL_R_NO_SHARED_SIGNATURE_ALGORITHMS}, +- #else +- {"NO_SHARED_SIGNATURE_ALGORITHMS", 20, 376}, +- #endif +- #ifdef SSL_R_NO_SRTP_PROFILES +- {"NO_SRTP_PROFILES", ERR_LIB_SSL, SSL_R_NO_SRTP_PROFILES}, +- #else +- {"NO_SRTP_PROFILES", 20, 359}, +- #endif +- #ifdef SSL_R_NO_SUITABLE_DIGEST_ALGORITHM +- {"NO_SUITABLE_DIGEST_ALGORITHM", ERR_LIB_SSL, SSL_R_NO_SUITABLE_DIGEST_ALGORITHM}, +- #else +- {"NO_SUITABLE_DIGEST_ALGORITHM", 20, 297}, +- #endif +- #ifdef SSL_R_NO_SUITABLE_GROUPS +- {"NO_SUITABLE_GROUPS", ERR_LIB_SSL, SSL_R_NO_SUITABLE_GROUPS}, +- #else +- {"NO_SUITABLE_GROUPS", 20, 295}, +- #endif +- #ifdef SSL_R_NO_SUITABLE_KEY_SHARE +- {"NO_SUITABLE_KEY_SHARE", ERR_LIB_SSL, SSL_R_NO_SUITABLE_KEY_SHARE}, +- #else +- {"NO_SUITABLE_KEY_SHARE", 20, 101}, +- #endif +- #ifdef SSL_R_NO_SUITABLE_SIGNATURE_ALGORITHM +- {"NO_SUITABLE_SIGNATURE_ALGORITHM", ERR_LIB_SSL, SSL_R_NO_SUITABLE_SIGNATURE_ALGORITHM}, +- #else +- {"NO_SUITABLE_SIGNATURE_ALGORITHM", 20, 118}, +- #endif +- #ifdef SSL_R_NO_VALID_SCTS +- {"NO_VALID_SCTS", ERR_LIB_SSL, SSL_R_NO_VALID_SCTS}, +- #else +- {"NO_VALID_SCTS", 20, 216}, +- #endif +- #ifdef SSL_R_NO_VERIFY_COOKIE_CALLBACK +- {"NO_VERIFY_COOKIE_CALLBACK", ERR_LIB_SSL, SSL_R_NO_VERIFY_COOKIE_CALLBACK}, +- #else +- {"NO_VERIFY_COOKIE_CALLBACK", 20, 403}, +- #endif +- #ifdef SSL_R_NULL_SSL_CTX +- {"NULL_SSL_CTX", ERR_LIB_SSL, SSL_R_NULL_SSL_CTX}, +- #else +- {"NULL_SSL_CTX", 20, 195}, +- #endif +- #ifdef SSL_R_NULL_SSL_METHOD_PASSED +- {"NULL_SSL_METHOD_PASSED", ERR_LIB_SSL, SSL_R_NULL_SSL_METHOD_PASSED}, +- #else +- {"NULL_SSL_METHOD_PASSED", 20, 196}, +- #endif +- #ifdef SSL_R_OCSP_CALLBACK_FAILURE +- {"OCSP_CALLBACK_FAILURE", ERR_LIB_SSL, SSL_R_OCSP_CALLBACK_FAILURE}, +- #else +- {"OCSP_CALLBACK_FAILURE", 20, 305}, +- #endif +- #ifdef SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED +- {"OLD_SESSION_CIPHER_NOT_RETURNED", ERR_LIB_SSL, SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED}, +- #else +- {"OLD_SESSION_CIPHER_NOT_RETURNED", 20, 197}, +- #endif +- #ifdef SSL_R_OLD_SESSION_COMPRESSION_ALGORITHM_NOT_RETURNED +- {"OLD_SESSION_COMPRESSION_ALGORITHM_NOT_RETURNED", ERR_LIB_SSL, SSL_R_OLD_SESSION_COMPRESSION_ALGORITHM_NOT_RETURNED}, +- #else +- {"OLD_SESSION_COMPRESSION_ALGORITHM_NOT_RETURNED", 20, 344}, +- #endif +- #ifdef SSL_R_OVERFLOW_ERROR +- {"OVERFLOW_ERROR", ERR_LIB_SSL, SSL_R_OVERFLOW_ERROR}, +- #else +- {"OVERFLOW_ERROR", 20, 237}, +- #endif +- #ifdef SSL_R_PACKET_LENGTH_TOO_LONG +- {"PACKET_LENGTH_TOO_LONG", ERR_LIB_SSL, SSL_R_PACKET_LENGTH_TOO_LONG}, +- #else +- {"PACKET_LENGTH_TOO_LONG", 20, 198}, +- #endif +- #ifdef SSL_R_PARSE_TLSEXT +- {"PARSE_TLSEXT", ERR_LIB_SSL, SSL_R_PARSE_TLSEXT}, +- #else +- {"PARSE_TLSEXT", 20, 227}, +- #endif +- #ifdef SSL_R_PATH_TOO_LONG +- {"PATH_TOO_LONG", ERR_LIB_SSL, SSL_R_PATH_TOO_LONG}, +- #else +- {"PATH_TOO_LONG", 20, 270}, +- #endif +- #ifdef SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE +- {"PEER_DID_NOT_RETURN_A_CERTIFICATE", ERR_LIB_SSL, SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE}, +- #else +- {"PEER_DID_NOT_RETURN_A_CERTIFICATE", 20, 199}, +- #endif +- #ifdef SSL_R_PEM_NAME_BAD_PREFIX +- {"PEM_NAME_BAD_PREFIX", ERR_LIB_SSL, SSL_R_PEM_NAME_BAD_PREFIX}, +- #else +- {"PEM_NAME_BAD_PREFIX", 20, 391}, +- #endif +- #ifdef SSL_R_PEM_NAME_TOO_SHORT +- {"PEM_NAME_TOO_SHORT", ERR_LIB_SSL, SSL_R_PEM_NAME_TOO_SHORT}, +- #else +- {"PEM_NAME_TOO_SHORT", 20, 392}, +- #endif +- #ifdef SSL_R_PIPELINE_FAILURE +- {"PIPELINE_FAILURE", ERR_LIB_SSL, SSL_R_PIPELINE_FAILURE}, +- #else +- {"PIPELINE_FAILURE", 20, 406}, +- #endif +- #ifdef SSL_R_POST_HANDSHAKE_AUTH_ENCODING_ERR +- {"POST_HANDSHAKE_AUTH_ENCODING_ERR", ERR_LIB_SSL, SSL_R_POST_HANDSHAKE_AUTH_ENCODING_ERR}, +- #else +- {"POST_HANDSHAKE_AUTH_ENCODING_ERR", 20, 278}, +- #endif +- #ifdef SSL_R_PRIVATE_KEY_MISMATCH +- {"PRIVATE_KEY_MISMATCH", ERR_LIB_SSL, SSL_R_PRIVATE_KEY_MISMATCH}, +- #else +- {"PRIVATE_KEY_MISMATCH", 20, 288}, +- #endif +- #ifdef SSL_R_PROTOCOL_IS_SHUTDOWN +- {"PROTOCOL_IS_SHUTDOWN", ERR_LIB_SSL, SSL_R_PROTOCOL_IS_SHUTDOWN}, +- #else +- {"PROTOCOL_IS_SHUTDOWN", 20, 207}, +- #endif +- #ifdef SSL_R_PSK_IDENTITY_NOT_FOUND +- {"PSK_IDENTITY_NOT_FOUND", ERR_LIB_SSL, SSL_R_PSK_IDENTITY_NOT_FOUND}, +- #else +- {"PSK_IDENTITY_NOT_FOUND", 20, 223}, +- #endif +- #ifdef SSL_R_PSK_NO_CLIENT_CB +- {"PSK_NO_CLIENT_CB", ERR_LIB_SSL, SSL_R_PSK_NO_CLIENT_CB}, +- #else +- {"PSK_NO_CLIENT_CB", 20, 224}, +- #endif +- #ifdef SSL_R_PSK_NO_SERVER_CB +- {"PSK_NO_SERVER_CB", ERR_LIB_SSL, SSL_R_PSK_NO_SERVER_CB}, +- #else +- {"PSK_NO_SERVER_CB", 20, 225}, +- #endif +- #ifdef SSL_R_READ_BIO_NOT_SET +- {"READ_BIO_NOT_SET", ERR_LIB_SSL, SSL_R_READ_BIO_NOT_SET}, +- #else +- {"READ_BIO_NOT_SET", 20, 211}, +- #endif +- #ifdef SSL_R_READ_TIMEOUT_EXPIRED +- {"READ_TIMEOUT_EXPIRED", ERR_LIB_SSL, SSL_R_READ_TIMEOUT_EXPIRED}, +- #else +- {"READ_TIMEOUT_EXPIRED", 20, 312}, +- #endif +- #ifdef SSL_R_RECORD_LENGTH_MISMATCH +- {"RECORD_LENGTH_MISMATCH", ERR_LIB_SSL, SSL_R_RECORD_LENGTH_MISMATCH}, +- #else +- {"RECORD_LENGTH_MISMATCH", 20, 213}, +- #endif +- #ifdef SSL_R_RECORD_TOO_SMALL +- {"RECORD_TOO_SMALL", ERR_LIB_SSL, SSL_R_RECORD_TOO_SMALL}, +- #else +- {"RECORD_TOO_SMALL", 20, 298}, +- #endif +- #ifdef SSL_R_RENEGOTIATE_EXT_TOO_LONG +- {"RENEGOTIATE_EXT_TOO_LONG", ERR_LIB_SSL, SSL_R_RENEGOTIATE_EXT_TOO_LONG}, +- #else +- {"RENEGOTIATE_EXT_TOO_LONG", 20, 335}, +- #endif +- #ifdef SSL_R_RENEGOTIATION_ENCODING_ERR +- {"RENEGOTIATION_ENCODING_ERR", ERR_LIB_SSL, SSL_R_RENEGOTIATION_ENCODING_ERR}, +- #else +- {"RENEGOTIATION_ENCODING_ERR", 20, 336}, +- #endif +- #ifdef SSL_R_RENEGOTIATION_MISMATCH +- {"RENEGOTIATION_MISMATCH", ERR_LIB_SSL, SSL_R_RENEGOTIATION_MISMATCH}, +- #else +- {"RENEGOTIATION_MISMATCH", 20, 337}, +- #endif +- #ifdef SSL_R_REQUEST_PENDING +- {"REQUEST_PENDING", ERR_LIB_SSL, SSL_R_REQUEST_PENDING}, +- #else +- {"REQUEST_PENDING", 20, 285}, +- #endif +- #ifdef SSL_R_REQUEST_SENT +- {"REQUEST_SENT", ERR_LIB_SSL, SSL_R_REQUEST_SENT}, +- #else +- {"REQUEST_SENT", 20, 286}, +- #endif +- #ifdef SSL_R_REQUIRED_CIPHER_MISSING +- {"REQUIRED_CIPHER_MISSING", ERR_LIB_SSL, SSL_R_REQUIRED_CIPHER_MISSING}, +- #else +- {"REQUIRED_CIPHER_MISSING", 20, 215}, +- #endif +- #ifdef SSL_R_REQUIRED_COMPRESSION_ALGORITHM_MISSING +- {"REQUIRED_COMPRESSION_ALGORITHM_MISSING", ERR_LIB_SSL, SSL_R_REQUIRED_COMPRESSION_ALGORITHM_MISSING}, +- #else +- {"REQUIRED_COMPRESSION_ALGORITHM_MISSING", 20, 342}, +- #endif +- #ifdef SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING +- {"SCSV_RECEIVED_WHEN_RENEGOTIATING", ERR_LIB_SSL, SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING}, +- #else +- {"SCSV_RECEIVED_WHEN_RENEGOTIATING", 20, 345}, +- #endif +- #ifdef SSL_R_SCT_VERIFICATION_FAILED +- {"SCT_VERIFICATION_FAILED", ERR_LIB_SSL, SSL_R_SCT_VERIFICATION_FAILED}, +- #else +- {"SCT_VERIFICATION_FAILED", 20, 208}, +- #endif +- #ifdef SSL_R_SERVERHELLO_TLSEXT +- {"SERVERHELLO_TLSEXT", ERR_LIB_SSL, SSL_R_SERVERHELLO_TLSEXT}, +- #else +- {"SERVERHELLO_TLSEXT", 20, 275}, +- #endif +- #ifdef SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED +- {"SESSION_ID_CONTEXT_UNINITIALIZED", ERR_LIB_SSL, SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED}, +- #else +- {"SESSION_ID_CONTEXT_UNINITIALIZED", 20, 277}, +- #endif +- #ifdef SSL_R_SHUTDOWN_WHILE_IN_INIT +- {"SHUTDOWN_WHILE_IN_INIT", ERR_LIB_SSL, SSL_R_SHUTDOWN_WHILE_IN_INIT}, +- #else +- {"SHUTDOWN_WHILE_IN_INIT", 20, 407}, +- #endif +- #ifdef SSL_R_SIGNATURE_ALGORITHMS_ERROR +- {"SIGNATURE_ALGORITHMS_ERROR", ERR_LIB_SSL, SSL_R_SIGNATURE_ALGORITHMS_ERROR}, +- #else +- {"SIGNATURE_ALGORITHMS_ERROR", 20, 360}, +- #endif +- #ifdef SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE +- {"SIGNATURE_FOR_NON_SIGNING_CERTIFICATE", ERR_LIB_SSL, SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE}, +- #else +- {"SIGNATURE_FOR_NON_SIGNING_CERTIFICATE", 20, 220}, +- #endif +- #ifdef SSL_R_SRP_A_CALC +- {"SRP_A_CALC", ERR_LIB_SSL, SSL_R_SRP_A_CALC}, +- #else +- {"SRP_A_CALC", 20, 361}, +- #endif +- #ifdef SSL_R_SRTP_COULD_NOT_ALLOCATE_PROFILES +- {"SRTP_COULD_NOT_ALLOCATE_PROFILES", ERR_LIB_SSL, SSL_R_SRTP_COULD_NOT_ALLOCATE_PROFILES}, +- #else +- {"SRTP_COULD_NOT_ALLOCATE_PROFILES", 20, 362}, +- #endif +- #ifdef SSL_R_SRTP_PROTECTION_PROFILE_LIST_TOO_LONG +- {"SRTP_PROTECTION_PROFILE_LIST_TOO_LONG", ERR_LIB_SSL, SSL_R_SRTP_PROTECTION_PROFILE_LIST_TOO_LONG}, +- #else +- {"SRTP_PROTECTION_PROFILE_LIST_TOO_LONG", 20, 363}, +- #endif +- #ifdef SSL_R_SRTP_UNKNOWN_PROTECTION_PROFILE +- {"SRTP_UNKNOWN_PROTECTION_PROFILE", ERR_LIB_SSL, SSL_R_SRTP_UNKNOWN_PROTECTION_PROFILE}, +- #else +- {"SRTP_UNKNOWN_PROTECTION_PROFILE", 20, 364}, +- #endif +- #ifdef SSL_R_SSL3_EXT_INVALID_MAX_FRAGMENT_LENGTH +- {"SSL3_EXT_INVALID_MAX_FRAGMENT_LENGTH", ERR_LIB_SSL, SSL_R_SSL3_EXT_INVALID_MAX_FRAGMENT_LENGTH}, +- #else +- {"SSL3_EXT_INVALID_MAX_FRAGMENT_LENGTH", 20, 232}, +- #endif +- #ifdef SSL_R_SSL3_EXT_INVALID_SERVERNAME +- {"SSL3_EXT_INVALID_SERVERNAME", ERR_LIB_SSL, SSL_R_SSL3_EXT_INVALID_SERVERNAME}, +- #else +- {"SSL3_EXT_INVALID_SERVERNAME", 20, 319}, +- #endif +- #ifdef SSL_R_SSL3_EXT_INVALID_SERVERNAME_TYPE +- {"SSL3_EXT_INVALID_SERVERNAME_TYPE", ERR_LIB_SSL, SSL_R_SSL3_EXT_INVALID_SERVERNAME_TYPE}, +- #else +- {"SSL3_EXT_INVALID_SERVERNAME_TYPE", 20, 320}, +- #endif +- #ifdef SSL_R_SSL3_SESSION_ID_TOO_LONG +- {"SSL3_SESSION_ID_TOO_LONG", ERR_LIB_SSL, SSL_R_SSL3_SESSION_ID_TOO_LONG}, +- #else +- {"SSL3_SESSION_ID_TOO_LONG", 20, 300}, +- #endif +- #ifdef SSL_R_SSLV3_ALERT_BAD_CERTIFICATE +- {"SSLV3_ALERT_BAD_CERTIFICATE", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_BAD_CERTIFICATE}, +- #else +- {"SSLV3_ALERT_BAD_CERTIFICATE", 20, 1042}, +- #endif +- #ifdef SSL_R_SSLV3_ALERT_BAD_RECORD_MAC +- {"SSLV3_ALERT_BAD_RECORD_MAC", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_BAD_RECORD_MAC}, +- #else +- {"SSLV3_ALERT_BAD_RECORD_MAC", 20, 1020}, +- #endif +- #ifdef SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED +- {"SSLV3_ALERT_CERTIFICATE_EXPIRED", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED}, +- #else +- {"SSLV3_ALERT_CERTIFICATE_EXPIRED", 20, 1045}, +- #endif +- #ifdef SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED +- {"SSLV3_ALERT_CERTIFICATE_REVOKED", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED}, +- #else +- {"SSLV3_ALERT_CERTIFICATE_REVOKED", 20, 1044}, +- #endif +- #ifdef SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN +- {"SSLV3_ALERT_CERTIFICATE_UNKNOWN", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN}, +- #else +- {"SSLV3_ALERT_CERTIFICATE_UNKNOWN", 20, 1046}, +- #endif +- #ifdef SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE +- {"SSLV3_ALERT_DECOMPRESSION_FAILURE", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE}, +- #else +- {"SSLV3_ALERT_DECOMPRESSION_FAILURE", 20, 1030}, +- #endif +- #ifdef SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE +- {"SSLV3_ALERT_HANDSHAKE_FAILURE", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE}, +- #else +- {"SSLV3_ALERT_HANDSHAKE_FAILURE", 20, 1040}, +- #endif +- #ifdef SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER +- {"SSLV3_ALERT_ILLEGAL_PARAMETER", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER}, +- #else +- {"SSLV3_ALERT_ILLEGAL_PARAMETER", 20, 1047}, +- #endif +- #ifdef SSL_R_SSLV3_ALERT_NO_CERTIFICATE +- {"SSLV3_ALERT_NO_CERTIFICATE", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_NO_CERTIFICATE}, +- #else +- {"SSLV3_ALERT_NO_CERTIFICATE", 20, 1041}, +- #endif +- #ifdef SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE +- {"SSLV3_ALERT_UNEXPECTED_MESSAGE", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE}, +- #else +- {"SSLV3_ALERT_UNEXPECTED_MESSAGE", 20, 1010}, +- #endif +- #ifdef SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE +- {"SSLV3_ALERT_UNSUPPORTED_CERTIFICATE", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE}, +- #else +- {"SSLV3_ALERT_UNSUPPORTED_CERTIFICATE", 20, 1043}, +- #endif +- #ifdef SSL_R_SSL_COMMAND_SECTION_EMPTY +- {"SSL_COMMAND_SECTION_EMPTY", ERR_LIB_SSL, SSL_R_SSL_COMMAND_SECTION_EMPTY}, +- #else +- {"SSL_COMMAND_SECTION_EMPTY", 20, 117}, +- #endif +- #ifdef SSL_R_SSL_COMMAND_SECTION_NOT_FOUND +- {"SSL_COMMAND_SECTION_NOT_FOUND", ERR_LIB_SSL, SSL_R_SSL_COMMAND_SECTION_NOT_FOUND}, +- #else +- {"SSL_COMMAND_SECTION_NOT_FOUND", 20, 125}, +- #endif +- #ifdef SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION +- {"SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION", ERR_LIB_SSL, SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION}, +- #else +- {"SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION", 20, 228}, +- #endif +- #ifdef SSL_R_SSL_HANDSHAKE_FAILURE +- {"SSL_HANDSHAKE_FAILURE", ERR_LIB_SSL, SSL_R_SSL_HANDSHAKE_FAILURE}, +- #else +- {"SSL_HANDSHAKE_FAILURE", 20, 229}, +- #endif +- #ifdef SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS +- {"SSL_LIBRARY_HAS_NO_CIPHERS", ERR_LIB_SSL, SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS}, +- #else +- {"SSL_LIBRARY_HAS_NO_CIPHERS", 20, 230}, +- #endif +- #ifdef SSL_R_SSL_NEGATIVE_LENGTH +- {"SSL_NEGATIVE_LENGTH", ERR_LIB_SSL, SSL_R_SSL_NEGATIVE_LENGTH}, +- #else +- {"SSL_NEGATIVE_LENGTH", 20, 372}, +- #endif +- #ifdef SSL_R_SSL_SECTION_EMPTY +- {"SSL_SECTION_EMPTY", ERR_LIB_SSL, SSL_R_SSL_SECTION_EMPTY}, +- #else +- {"SSL_SECTION_EMPTY", 20, 126}, +- #endif +- #ifdef SSL_R_SSL_SECTION_NOT_FOUND +- {"SSL_SECTION_NOT_FOUND", ERR_LIB_SSL, SSL_R_SSL_SECTION_NOT_FOUND}, +- #else +- {"SSL_SECTION_NOT_FOUND", 20, 136}, +- #endif +- #ifdef SSL_R_SSL_SESSION_ID_CALLBACK_FAILED +- {"SSL_SESSION_ID_CALLBACK_FAILED", ERR_LIB_SSL, SSL_R_SSL_SESSION_ID_CALLBACK_FAILED}, +- #else +- {"SSL_SESSION_ID_CALLBACK_FAILED", 20, 301}, +- #endif +- #ifdef SSL_R_SSL_SESSION_ID_CONFLICT +- {"SSL_SESSION_ID_CONFLICT", ERR_LIB_SSL, SSL_R_SSL_SESSION_ID_CONFLICT}, +- #else +- {"SSL_SESSION_ID_CONFLICT", 20, 302}, +- #endif +- #ifdef SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG +- {"SSL_SESSION_ID_CONTEXT_TOO_LONG", ERR_LIB_SSL, SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG}, +- #else +- {"SSL_SESSION_ID_CONTEXT_TOO_LONG", 20, 273}, +- #endif +- #ifdef SSL_R_SSL_SESSION_ID_HAS_BAD_LENGTH +- {"SSL_SESSION_ID_HAS_BAD_LENGTH", ERR_LIB_SSL, SSL_R_SSL_SESSION_ID_HAS_BAD_LENGTH}, +- #else +- {"SSL_SESSION_ID_HAS_BAD_LENGTH", 20, 303}, +- #endif +- #ifdef SSL_R_SSL_SESSION_ID_TOO_LONG +- {"SSL_SESSION_ID_TOO_LONG", ERR_LIB_SSL, SSL_R_SSL_SESSION_ID_TOO_LONG}, +- #else +- {"SSL_SESSION_ID_TOO_LONG", 20, 408}, +- #endif +- #ifdef SSL_R_SSL_SESSION_VERSION_MISMATCH +- {"SSL_SESSION_VERSION_MISMATCH", ERR_LIB_SSL, SSL_R_SSL_SESSION_VERSION_MISMATCH}, +- #else +- {"SSL_SESSION_VERSION_MISMATCH", 20, 210}, +- #endif +- #ifdef SSL_R_STILL_IN_INIT +- {"STILL_IN_INIT", ERR_LIB_SSL, SSL_R_STILL_IN_INIT}, +- #else +- {"STILL_IN_INIT", 20, 121}, +- #endif +- #ifdef SSL_R_TLSV13_ALERT_CERTIFICATE_REQUIRED +- {"TLSV13_ALERT_CERTIFICATE_REQUIRED", ERR_LIB_SSL, SSL_R_TLSV13_ALERT_CERTIFICATE_REQUIRED}, +- #else +- {"TLSV13_ALERT_CERTIFICATE_REQUIRED", 20, 1116}, +- #endif +- #ifdef SSL_R_TLSV13_ALERT_MISSING_EXTENSION +- {"TLSV13_ALERT_MISSING_EXTENSION", ERR_LIB_SSL, SSL_R_TLSV13_ALERT_MISSING_EXTENSION}, +- #else +- {"TLSV13_ALERT_MISSING_EXTENSION", 20, 1109}, +- #endif +- #ifdef SSL_R_TLSV1_ALERT_ACCESS_DENIED +- {"TLSV1_ALERT_ACCESS_DENIED", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_ACCESS_DENIED}, +- #else +- {"TLSV1_ALERT_ACCESS_DENIED", 20, 1049}, +- #endif +- #ifdef SSL_R_TLSV1_ALERT_DECODE_ERROR +- {"TLSV1_ALERT_DECODE_ERROR", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_DECODE_ERROR}, +- #else +- {"TLSV1_ALERT_DECODE_ERROR", 20, 1050}, +- #endif +- #ifdef SSL_R_TLSV1_ALERT_DECRYPTION_FAILED +- {"TLSV1_ALERT_DECRYPTION_FAILED", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_DECRYPTION_FAILED}, +- #else +- {"TLSV1_ALERT_DECRYPTION_FAILED", 20, 1021}, +- #endif +- #ifdef SSL_R_TLSV1_ALERT_DECRYPT_ERROR +- {"TLSV1_ALERT_DECRYPT_ERROR", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_DECRYPT_ERROR}, +- #else +- {"TLSV1_ALERT_DECRYPT_ERROR", 20, 1051}, +- #endif +- #ifdef SSL_R_TLSV1_ALERT_EXPORT_RESTRICTION +- {"TLSV1_ALERT_EXPORT_RESTRICTION", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_EXPORT_RESTRICTION}, +- #else +- {"TLSV1_ALERT_EXPORT_RESTRICTION", 20, 1060}, +- #endif +- #ifdef SSL_R_TLSV1_ALERT_INAPPROPRIATE_FALLBACK +- {"TLSV1_ALERT_INAPPROPRIATE_FALLBACK", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_INAPPROPRIATE_FALLBACK}, +- #else +- {"TLSV1_ALERT_INAPPROPRIATE_FALLBACK", 20, 1086}, +- #endif +- #ifdef SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY +- {"TLSV1_ALERT_INSUFFICIENT_SECURITY", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY}, +- #else +- {"TLSV1_ALERT_INSUFFICIENT_SECURITY", 20, 1071}, +- #endif +- #ifdef SSL_R_TLSV1_ALERT_INTERNAL_ERROR +- {"TLSV1_ALERT_INTERNAL_ERROR", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_INTERNAL_ERROR}, +- #else +- {"TLSV1_ALERT_INTERNAL_ERROR", 20, 1080}, +- #endif +- #ifdef SSL_R_TLSV1_ALERT_NO_RENEGOTIATION +- {"TLSV1_ALERT_NO_RENEGOTIATION", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_NO_RENEGOTIATION}, +- #else +- {"TLSV1_ALERT_NO_RENEGOTIATION", 20, 1100}, +- #endif +- #ifdef SSL_R_TLSV1_ALERT_PROTOCOL_VERSION +- {"TLSV1_ALERT_PROTOCOL_VERSION", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_PROTOCOL_VERSION}, +- #else +- {"TLSV1_ALERT_PROTOCOL_VERSION", 20, 1070}, +- #endif +- #ifdef SSL_R_TLSV1_ALERT_RECORD_OVERFLOW +- {"TLSV1_ALERT_RECORD_OVERFLOW", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_RECORD_OVERFLOW}, +- #else +- {"TLSV1_ALERT_RECORD_OVERFLOW", 20, 1022}, +- #endif +- #ifdef SSL_R_TLSV1_ALERT_UNKNOWN_CA +- {"TLSV1_ALERT_UNKNOWN_CA", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_UNKNOWN_CA}, +- #else +- {"TLSV1_ALERT_UNKNOWN_CA", 20, 1048}, +- #endif +- #ifdef SSL_R_TLSV1_ALERT_USER_CANCELLED +- {"TLSV1_ALERT_USER_CANCELLED", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_USER_CANCELLED}, +- #else +- {"TLSV1_ALERT_USER_CANCELLED", 20, 1090}, +- #endif +- #ifdef SSL_R_TLSV1_BAD_CERTIFICATE_HASH_VALUE +- {"TLSV1_BAD_CERTIFICATE_HASH_VALUE", ERR_LIB_SSL, SSL_R_TLSV1_BAD_CERTIFICATE_HASH_VALUE}, +- #else +- {"TLSV1_BAD_CERTIFICATE_HASH_VALUE", 20, 1114}, +- #endif +- #ifdef SSL_R_TLSV1_BAD_CERTIFICATE_STATUS_RESPONSE +- {"TLSV1_BAD_CERTIFICATE_STATUS_RESPONSE", ERR_LIB_SSL, SSL_R_TLSV1_BAD_CERTIFICATE_STATUS_RESPONSE}, +- #else +- {"TLSV1_BAD_CERTIFICATE_STATUS_RESPONSE", 20, 1113}, +- #endif +- #ifdef SSL_R_TLSV1_CERTIFICATE_UNOBTAINABLE +- {"TLSV1_CERTIFICATE_UNOBTAINABLE", ERR_LIB_SSL, SSL_R_TLSV1_CERTIFICATE_UNOBTAINABLE}, +- #else +- {"TLSV1_CERTIFICATE_UNOBTAINABLE", 20, 1111}, +- #endif +- #ifdef SSL_R_TLSV1_UNRECOGNIZED_NAME +- {"TLSV1_UNRECOGNIZED_NAME", ERR_LIB_SSL, SSL_R_TLSV1_UNRECOGNIZED_NAME}, +- #else +- {"TLSV1_UNRECOGNIZED_NAME", 20, 1112}, +- #endif +- #ifdef SSL_R_TLSV1_UNSUPPORTED_EXTENSION +- {"TLSV1_UNSUPPORTED_EXTENSION", ERR_LIB_SSL, SSL_R_TLSV1_UNSUPPORTED_EXTENSION}, +- #else +- {"TLSV1_UNSUPPORTED_EXTENSION", 20, 1110}, +- #endif +- #ifdef SSL_R_TLS_ILLEGAL_EXPORTER_LABEL +- {"TLS_ILLEGAL_EXPORTER_LABEL", ERR_LIB_SSL, SSL_R_TLS_ILLEGAL_EXPORTER_LABEL}, +- #else +- {"TLS_ILLEGAL_EXPORTER_LABEL", 20, 367}, +- #endif +- #ifdef SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST +- {"TLS_INVALID_ECPOINTFORMAT_LIST", ERR_LIB_SSL, SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST}, +- #else +- {"TLS_INVALID_ECPOINTFORMAT_LIST", 20, 157}, +- #endif +- #ifdef SSL_R_TOO_MANY_KEY_UPDATES +- {"TOO_MANY_KEY_UPDATES", ERR_LIB_SSL, SSL_R_TOO_MANY_KEY_UPDATES}, +- #else +- {"TOO_MANY_KEY_UPDATES", 20, 132}, +- #endif +- #ifdef SSL_R_TOO_MANY_WARN_ALERTS +- {"TOO_MANY_WARN_ALERTS", ERR_LIB_SSL, SSL_R_TOO_MANY_WARN_ALERTS}, +- #else +- {"TOO_MANY_WARN_ALERTS", 20, 409}, +- #endif +- #ifdef SSL_R_TOO_MUCH_EARLY_DATA +- {"TOO_MUCH_EARLY_DATA", ERR_LIB_SSL, SSL_R_TOO_MUCH_EARLY_DATA}, +- #else +- {"TOO_MUCH_EARLY_DATA", 20, 164}, +- #endif +- #ifdef SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS +- {"UNABLE_TO_FIND_ECDH_PARAMETERS", ERR_LIB_SSL, SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS}, +- #else +- {"UNABLE_TO_FIND_ECDH_PARAMETERS", 20, 314}, +- #endif +- #ifdef SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS +- {"UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS", ERR_LIB_SSL, SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS}, +- #else +- {"UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS", 20, 239}, +- #endif +- #ifdef SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES +- {"UNABLE_TO_LOAD_SSL3_MD5_ROUTINES", ERR_LIB_SSL, SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES}, +- #else +- {"UNABLE_TO_LOAD_SSL3_MD5_ROUTINES", 20, 242}, +- #endif +- #ifdef SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES +- {"UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES", ERR_LIB_SSL, SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES}, +- #else +- {"UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES", 20, 243}, +- #endif +- #ifdef SSL_R_UNEXPECTED_CCS_MESSAGE +- {"UNEXPECTED_CCS_MESSAGE", ERR_LIB_SSL, SSL_R_UNEXPECTED_CCS_MESSAGE}, +- #else +- {"UNEXPECTED_CCS_MESSAGE", 20, 262}, +- #endif +- #ifdef SSL_R_UNEXPECTED_END_OF_EARLY_DATA +- {"UNEXPECTED_END_OF_EARLY_DATA", ERR_LIB_SSL, SSL_R_UNEXPECTED_END_OF_EARLY_DATA}, +- #else +- {"UNEXPECTED_END_OF_EARLY_DATA", 20, 178}, +- #endif +- #ifdef SSL_R_UNEXPECTED_EOF_WHILE_READING +- {"UNEXPECTED_EOF_WHILE_READING", ERR_LIB_SSL, SSL_R_UNEXPECTED_EOF_WHILE_READING}, +- #else +- {"UNEXPECTED_EOF_WHILE_READING", 20, 294}, +- #endif +- #ifdef SSL_R_UNEXPECTED_MESSAGE +- {"UNEXPECTED_MESSAGE", ERR_LIB_SSL, SSL_R_UNEXPECTED_MESSAGE}, +- #else +- {"UNEXPECTED_MESSAGE", 20, 244}, +- #endif +- #ifdef SSL_R_UNEXPECTED_RECORD +- {"UNEXPECTED_RECORD", ERR_LIB_SSL, SSL_R_UNEXPECTED_RECORD}, +- #else +- {"UNEXPECTED_RECORD", 20, 245}, +- #endif +- #ifdef SSL_R_UNINITIALIZED +- {"UNINITIALIZED", ERR_LIB_SSL, SSL_R_UNINITIALIZED}, +- #else +- {"UNINITIALIZED", 20, 276}, +- #endif +- #ifdef SSL_R_UNKNOWN_ALERT_TYPE +- {"UNKNOWN_ALERT_TYPE", ERR_LIB_SSL, SSL_R_UNKNOWN_ALERT_TYPE}, +- #else +- {"UNKNOWN_ALERT_TYPE", 20, 246}, +- #endif +- #ifdef SSL_R_UNKNOWN_CERTIFICATE_TYPE +- {"UNKNOWN_CERTIFICATE_TYPE", ERR_LIB_SSL, SSL_R_UNKNOWN_CERTIFICATE_TYPE}, +- #else +- {"UNKNOWN_CERTIFICATE_TYPE", 20, 247}, +- #endif +- #ifdef SSL_R_UNKNOWN_CIPHER_RETURNED +- {"UNKNOWN_CIPHER_RETURNED", ERR_LIB_SSL, SSL_R_UNKNOWN_CIPHER_RETURNED}, +- #else +- {"UNKNOWN_CIPHER_RETURNED", 20, 248}, +- #endif +- #ifdef SSL_R_UNKNOWN_CIPHER_TYPE +- {"UNKNOWN_CIPHER_TYPE", ERR_LIB_SSL, SSL_R_UNKNOWN_CIPHER_TYPE}, +- #else +- {"UNKNOWN_CIPHER_TYPE", 20, 249}, +- #endif +- #ifdef SSL_R_UNKNOWN_CMD_NAME +- {"UNKNOWN_CMD_NAME", ERR_LIB_SSL, SSL_R_UNKNOWN_CMD_NAME}, +- #else +- {"UNKNOWN_CMD_NAME", 20, 386}, +- #endif +- #ifdef SSL_R_UNKNOWN_COMMAND +- {"UNKNOWN_COMMAND", ERR_LIB_SSL, SSL_R_UNKNOWN_COMMAND}, +- #else +- {"UNKNOWN_COMMAND", 20, 139}, +- #endif +- #ifdef SSL_R_UNKNOWN_DIGEST +- {"UNKNOWN_DIGEST", ERR_LIB_SSL, SSL_R_UNKNOWN_DIGEST}, +- #else +- {"UNKNOWN_DIGEST", 20, 368}, +- #endif +- #ifdef SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE +- {"UNKNOWN_KEY_EXCHANGE_TYPE", ERR_LIB_SSL, SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE}, +- #else +- {"UNKNOWN_KEY_EXCHANGE_TYPE", 20, 250}, +- #endif +- #ifdef SSL_R_UNKNOWN_PKEY_TYPE +- {"UNKNOWN_PKEY_TYPE", ERR_LIB_SSL, SSL_R_UNKNOWN_PKEY_TYPE}, +- #else +- {"UNKNOWN_PKEY_TYPE", 20, 251}, +- #endif +- #ifdef SSL_R_UNKNOWN_PROTOCOL +- {"UNKNOWN_PROTOCOL", ERR_LIB_SSL, SSL_R_UNKNOWN_PROTOCOL}, +- #else +- {"UNKNOWN_PROTOCOL", 20, 252}, +- #endif +- #ifdef SSL_R_UNKNOWN_SSL_VERSION +- {"UNKNOWN_SSL_VERSION", ERR_LIB_SSL, SSL_R_UNKNOWN_SSL_VERSION}, +- #else +- {"UNKNOWN_SSL_VERSION", 20, 254}, +- #endif +- #ifdef SSL_R_UNKNOWN_STATE +- {"UNKNOWN_STATE", ERR_LIB_SSL, SSL_R_UNKNOWN_STATE}, +- #else +- {"UNKNOWN_STATE", 20, 255}, +- #endif +- #ifdef SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED +- {"UNSAFE_LEGACY_RENEGOTIATION_DISABLED", ERR_LIB_SSL, SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED}, +- #else +- {"UNSAFE_LEGACY_RENEGOTIATION_DISABLED", 20, 338}, +- #endif +- #ifdef SSL_R_UNSOLICITED_EXTENSION +- {"UNSOLICITED_EXTENSION", ERR_LIB_SSL, SSL_R_UNSOLICITED_EXTENSION}, +- #else +- {"UNSOLICITED_EXTENSION", 20, 217}, +- #endif +- #ifdef SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM +- {"UNSUPPORTED_COMPRESSION_ALGORITHM", ERR_LIB_SSL, SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM}, +- #else +- {"UNSUPPORTED_COMPRESSION_ALGORITHM", 20, 257}, +- #endif +- #ifdef SSL_R_UNSUPPORTED_ELLIPTIC_CURVE +- {"UNSUPPORTED_ELLIPTIC_CURVE", ERR_LIB_SSL, SSL_R_UNSUPPORTED_ELLIPTIC_CURVE}, +- #else +- {"UNSUPPORTED_ELLIPTIC_CURVE", 20, 315}, +- #endif +- #ifdef SSL_R_UNSUPPORTED_PROTOCOL +- {"UNSUPPORTED_PROTOCOL", ERR_LIB_SSL, SSL_R_UNSUPPORTED_PROTOCOL}, +- #else +- {"UNSUPPORTED_PROTOCOL", 20, 258}, +- #endif +- #ifdef SSL_R_UNSUPPORTED_SSL_VERSION +- {"UNSUPPORTED_SSL_VERSION", ERR_LIB_SSL, SSL_R_UNSUPPORTED_SSL_VERSION}, +- #else +- {"UNSUPPORTED_SSL_VERSION", 20, 259}, +- #endif +- #ifdef SSL_R_UNSUPPORTED_STATUS_TYPE +- {"UNSUPPORTED_STATUS_TYPE", ERR_LIB_SSL, SSL_R_UNSUPPORTED_STATUS_TYPE}, +- #else +- {"UNSUPPORTED_STATUS_TYPE", 20, 329}, +- #endif +- #ifdef SSL_R_USE_SRTP_NOT_NEGOTIATED +- {"USE_SRTP_NOT_NEGOTIATED", ERR_LIB_SSL, SSL_R_USE_SRTP_NOT_NEGOTIATED}, +- #else +- {"USE_SRTP_NOT_NEGOTIATED", 20, 369}, +- #endif +- #ifdef SSL_R_VERSION_TOO_HIGH +- {"VERSION_TOO_HIGH", ERR_LIB_SSL, SSL_R_VERSION_TOO_HIGH}, +- #else +- {"VERSION_TOO_HIGH", 20, 166}, +- #endif +- #ifdef SSL_R_VERSION_TOO_LOW +- {"VERSION_TOO_LOW", ERR_LIB_SSL, SSL_R_VERSION_TOO_LOW}, +- #else +- {"VERSION_TOO_LOW", 20, 396}, +- #endif +- #ifdef SSL_R_WRONG_CERTIFICATE_TYPE +- {"WRONG_CERTIFICATE_TYPE", ERR_LIB_SSL, SSL_R_WRONG_CERTIFICATE_TYPE}, +- #else +- {"WRONG_CERTIFICATE_TYPE", 20, 383}, +- #endif +- #ifdef SSL_R_WRONG_CIPHER_RETURNED +- {"WRONG_CIPHER_RETURNED", ERR_LIB_SSL, SSL_R_WRONG_CIPHER_RETURNED}, +- #else +- {"WRONG_CIPHER_RETURNED", 20, 261}, +- #endif +- #ifdef SSL_R_WRONG_CURVE +- {"WRONG_CURVE", ERR_LIB_SSL, SSL_R_WRONG_CURVE}, +- #else +- {"WRONG_CURVE", 20, 378}, +- #endif +- #ifdef SSL_R_WRONG_SIGNATURE_LENGTH +- {"WRONG_SIGNATURE_LENGTH", ERR_LIB_SSL, SSL_R_WRONG_SIGNATURE_LENGTH}, +- #else +- {"WRONG_SIGNATURE_LENGTH", 20, 264}, +- #endif +- #ifdef SSL_R_WRONG_SIGNATURE_SIZE +- {"WRONG_SIGNATURE_SIZE", ERR_LIB_SSL, SSL_R_WRONG_SIGNATURE_SIZE}, +- #else +- {"WRONG_SIGNATURE_SIZE", 20, 265}, +- #endif +- #ifdef SSL_R_WRONG_SIGNATURE_TYPE +- {"WRONG_SIGNATURE_TYPE", ERR_LIB_SSL, SSL_R_WRONG_SIGNATURE_TYPE}, +- #else +- {"WRONG_SIGNATURE_TYPE", 20, 370}, +- #endif +- #ifdef SSL_R_WRONG_SSL_VERSION +- {"WRONG_SSL_VERSION", ERR_LIB_SSL, SSL_R_WRONG_SSL_VERSION}, +- #else +- {"WRONG_SSL_VERSION", 20, 266}, +- #endif +- #ifdef SSL_R_WRONG_VERSION_NUMBER +- {"WRONG_VERSION_NUMBER", ERR_LIB_SSL, SSL_R_WRONG_VERSION_NUMBER}, +- #else +- {"WRONG_VERSION_NUMBER", 20, 267}, +- #endif +- #ifdef SSL_R_X509_LIB +- {"X509_LIB", ERR_LIB_SSL, SSL_R_X509_LIB}, +- #else +- {"X509_LIB", 20, 268}, +- #endif +- #ifdef SSL_R_X509_VERIFICATION_SETUP_PROBLEMS +- {"X509_VERIFICATION_SETUP_PROBLEMS", ERR_LIB_SSL, SSL_R_X509_VERIFICATION_SETUP_PROBLEMS}, +- #else +- {"X509_VERIFICATION_SETUP_PROBLEMS", 20, 269}, +- #endif +- #ifdef TS_R_BAD_PKCS7_TYPE +- {"BAD_PKCS7_TYPE", ERR_LIB_TS, TS_R_BAD_PKCS7_TYPE}, +- #else +- {"BAD_PKCS7_TYPE", 47, 132}, +- #endif +- #ifdef TS_R_BAD_TYPE +- {"BAD_TYPE", ERR_LIB_TS, TS_R_BAD_TYPE}, +- #else +- {"BAD_TYPE", 47, 133}, +- #endif +- #ifdef TS_R_CANNOT_LOAD_CERT +- {"CANNOT_LOAD_CERT", ERR_LIB_TS, TS_R_CANNOT_LOAD_CERT}, +- #else +- {"CANNOT_LOAD_CERT", 47, 137}, +- #endif +- #ifdef TS_R_CANNOT_LOAD_KEY +- {"CANNOT_LOAD_KEY", ERR_LIB_TS, TS_R_CANNOT_LOAD_KEY}, +- #else +- {"CANNOT_LOAD_KEY", 47, 138}, +- #endif +- #ifdef TS_R_CERTIFICATE_VERIFY_ERROR +- {"CERTIFICATE_VERIFY_ERROR", ERR_LIB_TS, TS_R_CERTIFICATE_VERIFY_ERROR}, +- #else +- {"CERTIFICATE_VERIFY_ERROR", 47, 100}, +- #endif +- #ifdef TS_R_COULD_NOT_SET_ENGINE +- {"COULD_NOT_SET_ENGINE", ERR_LIB_TS, TS_R_COULD_NOT_SET_ENGINE}, +- #else +- {"COULD_NOT_SET_ENGINE", 47, 127}, +- #endif +- #ifdef TS_R_COULD_NOT_SET_TIME +- {"COULD_NOT_SET_TIME", ERR_LIB_TS, TS_R_COULD_NOT_SET_TIME}, +- #else +- {"COULD_NOT_SET_TIME", 47, 115}, +- #endif +- #ifdef TS_R_DETACHED_CONTENT +- {"DETACHED_CONTENT", ERR_LIB_TS, TS_R_DETACHED_CONTENT}, +- #else +- {"DETACHED_CONTENT", 47, 134}, +- #endif +- #ifdef TS_R_ESS_ADD_SIGNING_CERT_ERROR +- {"ESS_ADD_SIGNING_CERT_ERROR", ERR_LIB_TS, TS_R_ESS_ADD_SIGNING_CERT_ERROR}, +- #else +- {"ESS_ADD_SIGNING_CERT_ERROR", 47, 116}, +- #endif +- #ifdef TS_R_ESS_ADD_SIGNING_CERT_V2_ERROR +- {"ESS_ADD_SIGNING_CERT_V2_ERROR", ERR_LIB_TS, TS_R_ESS_ADD_SIGNING_CERT_V2_ERROR}, +- #else +- {"ESS_ADD_SIGNING_CERT_V2_ERROR", 47, 139}, +- #endif +- #ifdef TS_R_ESS_SIGNING_CERTIFICATE_ERROR +- {"ESS_SIGNING_CERTIFICATE_ERROR", ERR_LIB_TS, TS_R_ESS_SIGNING_CERTIFICATE_ERROR}, +- #else +- {"ESS_SIGNING_CERTIFICATE_ERROR", 47, 101}, +- #endif +- #ifdef TS_R_INVALID_NULL_POINTER +- {"INVALID_NULL_POINTER", ERR_LIB_TS, TS_R_INVALID_NULL_POINTER}, +- #else +- {"INVALID_NULL_POINTER", 47, 102}, +- #endif +- #ifdef TS_R_INVALID_SIGNER_CERTIFICATE_PURPOSE +- {"INVALID_SIGNER_CERTIFICATE_PURPOSE", ERR_LIB_TS, TS_R_INVALID_SIGNER_CERTIFICATE_PURPOSE}, +- #else +- {"INVALID_SIGNER_CERTIFICATE_PURPOSE", 47, 117}, +- #endif +- #ifdef TS_R_MESSAGE_IMPRINT_MISMATCH +- {"MESSAGE_IMPRINT_MISMATCH", ERR_LIB_TS, TS_R_MESSAGE_IMPRINT_MISMATCH}, +- #else +- {"MESSAGE_IMPRINT_MISMATCH", 47, 103}, +- #endif +- #ifdef TS_R_NONCE_MISMATCH +- {"NONCE_MISMATCH", ERR_LIB_TS, TS_R_NONCE_MISMATCH}, +- #else +- {"NONCE_MISMATCH", 47, 104}, +- #endif +- #ifdef TS_R_NONCE_NOT_RETURNED +- {"NONCE_NOT_RETURNED", ERR_LIB_TS, TS_R_NONCE_NOT_RETURNED}, +- #else +- {"NONCE_NOT_RETURNED", 47, 105}, +- #endif +- #ifdef TS_R_NO_CONTENT +- {"NO_CONTENT", ERR_LIB_TS, TS_R_NO_CONTENT}, +- #else +- {"NO_CONTENT", 47, 106}, +- #endif +- #ifdef TS_R_NO_TIME_STAMP_TOKEN +- {"NO_TIME_STAMP_TOKEN", ERR_LIB_TS, TS_R_NO_TIME_STAMP_TOKEN}, +- #else +- {"NO_TIME_STAMP_TOKEN", 47, 107}, +- #endif +- #ifdef TS_R_PKCS7_ADD_SIGNATURE_ERROR +- {"PKCS7_ADD_SIGNATURE_ERROR", ERR_LIB_TS, TS_R_PKCS7_ADD_SIGNATURE_ERROR}, +- #else +- {"PKCS7_ADD_SIGNATURE_ERROR", 47, 118}, +- #endif +- #ifdef TS_R_PKCS7_ADD_SIGNED_ATTR_ERROR +- {"PKCS7_ADD_SIGNED_ATTR_ERROR", ERR_LIB_TS, TS_R_PKCS7_ADD_SIGNED_ATTR_ERROR}, +- #else +- {"PKCS7_ADD_SIGNED_ATTR_ERROR", 47, 119}, +- #endif +- #ifdef TS_R_PKCS7_TO_TS_TST_INFO_FAILED +- {"PKCS7_TO_TS_TST_INFO_FAILED", ERR_LIB_TS, TS_R_PKCS7_TO_TS_TST_INFO_FAILED}, +- #else +- {"PKCS7_TO_TS_TST_INFO_FAILED", 47, 129}, +- #endif +- #ifdef TS_R_POLICY_MISMATCH +- {"POLICY_MISMATCH", ERR_LIB_TS, TS_R_POLICY_MISMATCH}, +- #else +- {"POLICY_MISMATCH", 47, 108}, +- #endif +- #ifdef TS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE +- {"PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE", ERR_LIB_TS, TS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE}, +- #else +- {"PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE", 47, 120}, +- #endif +- #ifdef TS_R_RESPONSE_SETUP_ERROR +- {"RESPONSE_SETUP_ERROR", ERR_LIB_TS, TS_R_RESPONSE_SETUP_ERROR}, +- #else +- {"RESPONSE_SETUP_ERROR", 47, 121}, +- #endif +- #ifdef TS_R_SIGNATURE_FAILURE +- {"SIGNATURE_FAILURE", ERR_LIB_TS, TS_R_SIGNATURE_FAILURE}, +- #else +- {"SIGNATURE_FAILURE", 47, 109}, +- #endif +- #ifdef TS_R_THERE_MUST_BE_ONE_SIGNER +- {"THERE_MUST_BE_ONE_SIGNER", ERR_LIB_TS, TS_R_THERE_MUST_BE_ONE_SIGNER}, +- #else +- {"THERE_MUST_BE_ONE_SIGNER", 47, 110}, +- #endif +- #ifdef TS_R_TIME_SYSCALL_ERROR +- {"TIME_SYSCALL_ERROR", ERR_LIB_TS, TS_R_TIME_SYSCALL_ERROR}, +- #else +- {"TIME_SYSCALL_ERROR", 47, 122}, +- #endif +- #ifdef TS_R_TOKEN_NOT_PRESENT +- {"TOKEN_NOT_PRESENT", ERR_LIB_TS, TS_R_TOKEN_NOT_PRESENT}, +- #else +- {"TOKEN_NOT_PRESENT", 47, 130}, +- #endif +- #ifdef TS_R_TOKEN_PRESENT +- {"TOKEN_PRESENT", ERR_LIB_TS, TS_R_TOKEN_PRESENT}, +- #else +- {"TOKEN_PRESENT", 47, 131}, +- #endif +- #ifdef TS_R_TSA_NAME_MISMATCH +- {"TSA_NAME_MISMATCH", ERR_LIB_TS, TS_R_TSA_NAME_MISMATCH}, +- #else +- {"TSA_NAME_MISMATCH", 47, 111}, +- #endif +- #ifdef TS_R_TSA_UNTRUSTED +- {"TSA_UNTRUSTED", ERR_LIB_TS, TS_R_TSA_UNTRUSTED}, +- #else +- {"TSA_UNTRUSTED", 47, 112}, +- #endif +- #ifdef TS_R_TST_INFO_SETUP_ERROR +- {"TST_INFO_SETUP_ERROR", ERR_LIB_TS, TS_R_TST_INFO_SETUP_ERROR}, +- #else +- {"TST_INFO_SETUP_ERROR", 47, 123}, +- #endif +- #ifdef TS_R_TS_DATASIGN +- {"TS_DATASIGN", ERR_LIB_TS, TS_R_TS_DATASIGN}, +- #else +- {"TS_DATASIGN", 47, 124}, +- #endif +- #ifdef TS_R_UNACCEPTABLE_POLICY +- {"UNACCEPTABLE_POLICY", ERR_LIB_TS, TS_R_UNACCEPTABLE_POLICY}, +- #else +- {"UNACCEPTABLE_POLICY", 47, 125}, +- #endif +- #ifdef TS_R_UNSUPPORTED_MD_ALGORITHM +- {"UNSUPPORTED_MD_ALGORITHM", ERR_LIB_TS, TS_R_UNSUPPORTED_MD_ALGORITHM}, +- #else +- {"UNSUPPORTED_MD_ALGORITHM", 47, 126}, +- #endif +- #ifdef TS_R_UNSUPPORTED_VERSION +- {"UNSUPPORTED_VERSION", ERR_LIB_TS, TS_R_UNSUPPORTED_VERSION}, +- #else +- {"UNSUPPORTED_VERSION", 47, 113}, +- #endif +- #ifdef TS_R_VAR_BAD_VALUE +- {"VAR_BAD_VALUE", ERR_LIB_TS, TS_R_VAR_BAD_VALUE}, +- #else +- {"VAR_BAD_VALUE", 47, 135}, +- #endif +- #ifdef TS_R_VAR_LOOKUP_FAILURE +- {"VAR_LOOKUP_FAILURE", ERR_LIB_TS, TS_R_VAR_LOOKUP_FAILURE}, +- #else +- {"VAR_LOOKUP_FAILURE", 47, 136}, +- #endif +- #ifdef TS_R_WRONG_CONTENT_TYPE +- {"WRONG_CONTENT_TYPE", ERR_LIB_TS, TS_R_WRONG_CONTENT_TYPE}, +- #else +- {"WRONG_CONTENT_TYPE", 47, 114}, +- #endif +- #ifdef UI_R_COMMON_OK_AND_CANCEL_CHARACTERS +- {"COMMON_OK_AND_CANCEL_CHARACTERS", ERR_LIB_UI, UI_R_COMMON_OK_AND_CANCEL_CHARACTERS}, +- #else +- {"COMMON_OK_AND_CANCEL_CHARACTERS", 40, 104}, +- #endif +- #ifdef UI_R_INDEX_TOO_LARGE +- {"INDEX_TOO_LARGE", ERR_LIB_UI, UI_R_INDEX_TOO_LARGE}, +- #else +- {"INDEX_TOO_LARGE", 40, 102}, +- #endif +- #ifdef UI_R_INDEX_TOO_SMALL +- {"INDEX_TOO_SMALL", ERR_LIB_UI, UI_R_INDEX_TOO_SMALL}, +- #else +- {"INDEX_TOO_SMALL", 40, 103}, +- #endif +- #ifdef UI_R_NO_RESULT_BUFFER +- {"NO_RESULT_BUFFER", ERR_LIB_UI, UI_R_NO_RESULT_BUFFER}, +- #else +- {"NO_RESULT_BUFFER", 40, 105}, +- #endif +- #ifdef UI_R_PROCESSING_ERROR +- {"PROCESSING_ERROR", ERR_LIB_UI, UI_R_PROCESSING_ERROR}, +- #else +- {"PROCESSING_ERROR", 40, 107}, +- #endif +- #ifdef UI_R_RESULT_TOO_LARGE +- {"RESULT_TOO_LARGE", ERR_LIB_UI, UI_R_RESULT_TOO_LARGE}, +- #else +- {"RESULT_TOO_LARGE", 40, 100}, +- #endif +- #ifdef UI_R_RESULT_TOO_SMALL +- {"RESULT_TOO_SMALL", ERR_LIB_UI, UI_R_RESULT_TOO_SMALL}, +- #else +- {"RESULT_TOO_SMALL", 40, 101}, +- #endif +- #ifdef UI_R_SYSASSIGN_ERROR +- {"SYSASSIGN_ERROR", ERR_LIB_UI, UI_R_SYSASSIGN_ERROR}, +- #else +- {"SYSASSIGN_ERROR", 40, 109}, +- #endif +- #ifdef UI_R_SYSDASSGN_ERROR +- {"SYSDASSGN_ERROR", ERR_LIB_UI, UI_R_SYSDASSGN_ERROR}, +- #else +- {"SYSDASSGN_ERROR", 40, 110}, +- #endif +- #ifdef UI_R_SYSQIOW_ERROR +- {"SYSQIOW_ERROR", ERR_LIB_UI, UI_R_SYSQIOW_ERROR}, +- #else +- {"SYSQIOW_ERROR", 40, 111}, +- #endif +- #ifdef UI_R_UNKNOWN_CONTROL_COMMAND +- {"UNKNOWN_CONTROL_COMMAND", ERR_LIB_UI, UI_R_UNKNOWN_CONTROL_COMMAND}, +- #else +- {"UNKNOWN_CONTROL_COMMAND", 40, 106}, +- #endif +- #ifdef UI_R_UNKNOWN_TTYGET_ERRNO_VALUE +- {"UNKNOWN_TTYGET_ERRNO_VALUE", ERR_LIB_UI, UI_R_UNKNOWN_TTYGET_ERRNO_VALUE}, +- #else +- {"UNKNOWN_TTYGET_ERRNO_VALUE", 40, 108}, +- #endif +- #ifdef UI_R_USER_DATA_DUPLICATION_UNSUPPORTED +- {"USER_DATA_DUPLICATION_UNSUPPORTED", ERR_LIB_UI, UI_R_USER_DATA_DUPLICATION_UNSUPPORTED}, +- #else +- {"USER_DATA_DUPLICATION_UNSUPPORTED", 40, 112}, +- #endif +- #ifdef X509V3_R_BAD_IP_ADDRESS +- {"BAD_IP_ADDRESS", ERR_LIB_X509V3, X509V3_R_BAD_IP_ADDRESS}, +- #else +- {"BAD_IP_ADDRESS", 34, 118}, +- #endif +- #ifdef X509V3_R_BAD_OBJECT +- {"BAD_OBJECT", ERR_LIB_X509V3, X509V3_R_BAD_OBJECT}, +- #else +- {"BAD_OBJECT", 34, 119}, +- #endif +- #ifdef X509V3_R_BN_DEC2BN_ERROR +- {"BN_DEC2BN_ERROR", ERR_LIB_X509V3, X509V3_R_BN_DEC2BN_ERROR}, +- #else +- {"BN_DEC2BN_ERROR", 34, 100}, +- #endif +- #ifdef X509V3_R_BN_TO_ASN1_INTEGER_ERROR +- {"BN_TO_ASN1_INTEGER_ERROR", ERR_LIB_X509V3, X509V3_R_BN_TO_ASN1_INTEGER_ERROR}, +- #else +- {"BN_TO_ASN1_INTEGER_ERROR", 34, 101}, +- #endif +- #ifdef X509V3_R_DIRNAME_ERROR +- {"DIRNAME_ERROR", ERR_LIB_X509V3, X509V3_R_DIRNAME_ERROR}, +- #else +- {"DIRNAME_ERROR", 34, 149}, +- #endif +- #ifdef X509V3_R_DISTPOINT_ALREADY_SET +- {"DISTPOINT_ALREADY_SET", ERR_LIB_X509V3, X509V3_R_DISTPOINT_ALREADY_SET}, +- #else +- {"DISTPOINT_ALREADY_SET", 34, 160}, +- #endif +- #ifdef X509V3_R_DUPLICATE_ZONE_ID +- {"DUPLICATE_ZONE_ID", ERR_LIB_X509V3, X509V3_R_DUPLICATE_ZONE_ID}, +- #else +- {"DUPLICATE_ZONE_ID", 34, 133}, +- #endif +- #ifdef X509V3_R_EMPTY_KEY_USAGE +- {"EMPTY_KEY_USAGE", ERR_LIB_X509V3, X509V3_R_EMPTY_KEY_USAGE}, +- #else +- {"EMPTY_KEY_USAGE", 34, 169}, +- #endif +- #ifdef X509V3_R_ERROR_CONVERTING_ZONE +- {"ERROR_CONVERTING_ZONE", ERR_LIB_X509V3, X509V3_R_ERROR_CONVERTING_ZONE}, +- #else +- {"ERROR_CONVERTING_ZONE", 34, 131}, +- #endif +- #ifdef X509V3_R_ERROR_CREATING_EXTENSION +- {"ERROR_CREATING_EXTENSION", ERR_LIB_X509V3, X509V3_R_ERROR_CREATING_EXTENSION}, +- #else +- {"ERROR_CREATING_EXTENSION", 34, 144}, +- #endif +- #ifdef X509V3_R_ERROR_IN_EXTENSION +- {"ERROR_IN_EXTENSION", ERR_LIB_X509V3, X509V3_R_ERROR_IN_EXTENSION}, +- #else +- {"ERROR_IN_EXTENSION", 34, 128}, +- #endif +- #ifdef X509V3_R_EXPECTED_A_SECTION_NAME +- {"EXPECTED_A_SECTION_NAME", ERR_LIB_X509V3, X509V3_R_EXPECTED_A_SECTION_NAME}, +- #else +- {"EXPECTED_A_SECTION_NAME", 34, 137}, +- #endif +- #ifdef X509V3_R_EXTENSION_EXISTS +- {"EXTENSION_EXISTS", ERR_LIB_X509V3, X509V3_R_EXTENSION_EXISTS}, +- #else +- {"EXTENSION_EXISTS", 34, 145}, +- #endif +- #ifdef X509V3_R_EXTENSION_NAME_ERROR +- {"EXTENSION_NAME_ERROR", ERR_LIB_X509V3, X509V3_R_EXTENSION_NAME_ERROR}, +- #else +- {"EXTENSION_NAME_ERROR", 34, 115}, +- #endif +- #ifdef X509V3_R_EXTENSION_NOT_FOUND +- {"EXTENSION_NOT_FOUND", ERR_LIB_X509V3, X509V3_R_EXTENSION_NOT_FOUND}, +- #else +- {"EXTENSION_NOT_FOUND", 34, 102}, +- #endif +- #ifdef X509V3_R_EXTENSION_SETTING_NOT_SUPPORTED +- {"EXTENSION_SETTING_NOT_SUPPORTED", ERR_LIB_X509V3, X509V3_R_EXTENSION_SETTING_NOT_SUPPORTED}, +- #else +- {"EXTENSION_SETTING_NOT_SUPPORTED", 34, 103}, +- #endif +- #ifdef X509V3_R_EXTENSION_VALUE_ERROR +- {"EXTENSION_VALUE_ERROR", ERR_LIB_X509V3, X509V3_R_EXTENSION_VALUE_ERROR}, +- #else +- {"EXTENSION_VALUE_ERROR", 34, 116}, +- #endif +- #ifdef X509V3_R_ILLEGAL_EMPTY_EXTENSION +- {"ILLEGAL_EMPTY_EXTENSION", ERR_LIB_X509V3, X509V3_R_ILLEGAL_EMPTY_EXTENSION}, +- #else +- {"ILLEGAL_EMPTY_EXTENSION", 34, 151}, +- #endif +- #ifdef X509V3_R_INCORRECT_POLICY_SYNTAX_TAG +- {"INCORRECT_POLICY_SYNTAX_TAG", ERR_LIB_X509V3, X509V3_R_INCORRECT_POLICY_SYNTAX_TAG}, +- #else +- {"INCORRECT_POLICY_SYNTAX_TAG", 34, 152}, +- #endif +- #ifdef X509V3_R_INVALID_ASNUMBER +- {"INVALID_ASNUMBER", ERR_LIB_X509V3, X509V3_R_INVALID_ASNUMBER}, +- #else +- {"INVALID_ASNUMBER", 34, 162}, +- #endif +- #ifdef X509V3_R_INVALID_ASRANGE +- {"INVALID_ASRANGE", ERR_LIB_X509V3, X509V3_R_INVALID_ASRANGE}, +- #else +- {"INVALID_ASRANGE", 34, 163}, +- #endif +- #ifdef X509V3_R_INVALID_BOOLEAN_STRING +- {"INVALID_BOOLEAN_STRING", ERR_LIB_X509V3, X509V3_R_INVALID_BOOLEAN_STRING}, +- #else +- {"INVALID_BOOLEAN_STRING", 34, 104}, +- #endif +- #ifdef X509V3_R_INVALID_CERTIFICATE +- {"INVALID_CERTIFICATE", ERR_LIB_X509V3, X509V3_R_INVALID_CERTIFICATE}, +- #else +- {"INVALID_CERTIFICATE", 34, 158}, +- #endif +- #ifdef X509V3_R_INVALID_EMPTY_NAME +- {"INVALID_EMPTY_NAME", ERR_LIB_X509V3, X509V3_R_INVALID_EMPTY_NAME}, +- #else +- {"INVALID_EMPTY_NAME", 34, 108}, +- #endif +- #ifdef X509V3_R_INVALID_EXTENSION_STRING +- {"INVALID_EXTENSION_STRING", ERR_LIB_X509V3, X509V3_R_INVALID_EXTENSION_STRING}, +- #else +- {"INVALID_EXTENSION_STRING", 34, 105}, +- #endif +- #ifdef X509V3_R_INVALID_INHERITANCE +- {"INVALID_INHERITANCE", ERR_LIB_X509V3, X509V3_R_INVALID_INHERITANCE}, +- #else +- {"INVALID_INHERITANCE", 34, 165}, +- #endif +- #ifdef X509V3_R_INVALID_IPADDRESS +- {"INVALID_IPADDRESS", ERR_LIB_X509V3, X509V3_R_INVALID_IPADDRESS}, +- #else +- {"INVALID_IPADDRESS", 34, 166}, +- #endif +- #ifdef X509V3_R_INVALID_MULTIPLE_RDNS +- {"INVALID_MULTIPLE_RDNS", ERR_LIB_X509V3, X509V3_R_INVALID_MULTIPLE_RDNS}, +- #else +- {"INVALID_MULTIPLE_RDNS", 34, 161}, +- #endif +- #ifdef X509V3_R_INVALID_NAME +- {"INVALID_NAME", ERR_LIB_X509V3, X509V3_R_INVALID_NAME}, +- #else +- {"INVALID_NAME", 34, 106}, +- #endif +- #ifdef X509V3_R_INVALID_NULL_ARGUMENT +- {"INVALID_NULL_ARGUMENT", ERR_LIB_X509V3, X509V3_R_INVALID_NULL_ARGUMENT}, +- #else +- {"INVALID_NULL_ARGUMENT", 34, 107}, +- #endif +- #ifdef X509V3_R_INVALID_NULL_VALUE +- {"INVALID_NULL_VALUE", ERR_LIB_X509V3, X509V3_R_INVALID_NULL_VALUE}, +- #else +- {"INVALID_NULL_VALUE", 34, 109}, +- #endif +- #ifdef X509V3_R_INVALID_NUMBER +- {"INVALID_NUMBER", ERR_LIB_X509V3, X509V3_R_INVALID_NUMBER}, +- #else +- {"INVALID_NUMBER", 34, 140}, +- #endif +- #ifdef X509V3_R_INVALID_NUMBERS +- {"INVALID_NUMBERS", ERR_LIB_X509V3, X509V3_R_INVALID_NUMBERS}, +- #else +- {"INVALID_NUMBERS", 34, 141}, +- #endif +- #ifdef X509V3_R_INVALID_OBJECT_IDENTIFIER +- {"INVALID_OBJECT_IDENTIFIER", ERR_LIB_X509V3, X509V3_R_INVALID_OBJECT_IDENTIFIER}, +- #else +- {"INVALID_OBJECT_IDENTIFIER", 34, 110}, +- #endif +- #ifdef X509V3_R_INVALID_OPTION +- {"INVALID_OPTION", ERR_LIB_X509V3, X509V3_R_INVALID_OPTION}, +- #else +- {"INVALID_OPTION", 34, 138}, +- #endif +- #ifdef X509V3_R_INVALID_POLICY_IDENTIFIER +- {"INVALID_POLICY_IDENTIFIER", ERR_LIB_X509V3, X509V3_R_INVALID_POLICY_IDENTIFIER}, +- #else +- {"INVALID_POLICY_IDENTIFIER", 34, 134}, +- #endif +- #ifdef X509V3_R_INVALID_PROXY_POLICY_SETTING +- {"INVALID_PROXY_POLICY_SETTING", ERR_LIB_X509V3, X509V3_R_INVALID_PROXY_POLICY_SETTING}, +- #else +- {"INVALID_PROXY_POLICY_SETTING", 34, 153}, +- #endif +- #ifdef X509V3_R_INVALID_PURPOSE +- {"INVALID_PURPOSE", ERR_LIB_X509V3, X509V3_R_INVALID_PURPOSE}, +- #else +- {"INVALID_PURPOSE", 34, 146}, +- #endif +- #ifdef X509V3_R_INVALID_SAFI +- {"INVALID_SAFI", ERR_LIB_X509V3, X509V3_R_INVALID_SAFI}, +- #else +- {"INVALID_SAFI", 34, 164}, +- #endif +- #ifdef X509V3_R_INVALID_SECTION +- {"INVALID_SECTION", ERR_LIB_X509V3, X509V3_R_INVALID_SECTION}, +- #else +- {"INVALID_SECTION", 34, 135}, +- #endif +- #ifdef X509V3_R_INVALID_SYNTAX +- {"INVALID_SYNTAX", ERR_LIB_X509V3, X509V3_R_INVALID_SYNTAX}, +- #else +- {"INVALID_SYNTAX", 34, 143}, +- #endif +- #ifdef X509V3_R_ISSUER_DECODE_ERROR +- {"ISSUER_DECODE_ERROR", ERR_LIB_X509V3, X509V3_R_ISSUER_DECODE_ERROR}, +- #else +- {"ISSUER_DECODE_ERROR", 34, 126}, +- #endif +- #ifdef X509V3_R_MISSING_VALUE +- {"MISSING_VALUE", ERR_LIB_X509V3, X509V3_R_MISSING_VALUE}, +- #else +- {"MISSING_VALUE", 34, 124}, +- #endif +- #ifdef X509V3_R_NEED_ORGANIZATION_AND_NUMBERS +- {"NEED_ORGANIZATION_AND_NUMBERS", ERR_LIB_X509V3, X509V3_R_NEED_ORGANIZATION_AND_NUMBERS}, +- #else +- {"NEED_ORGANIZATION_AND_NUMBERS", 34, 142}, +- #endif +- #ifdef X509V3_R_NEGATIVE_PATHLEN +- {"NEGATIVE_PATHLEN", ERR_LIB_X509V3, X509V3_R_NEGATIVE_PATHLEN}, +- #else +- {"NEGATIVE_PATHLEN", 34, 168}, +- #endif +- #ifdef X509V3_R_NO_CONFIG_DATABASE +- {"NO_CONFIG_DATABASE", ERR_LIB_X509V3, X509V3_R_NO_CONFIG_DATABASE}, +- #else +- {"NO_CONFIG_DATABASE", 34, 136}, +- #endif +- #ifdef X509V3_R_NO_ISSUER_CERTIFICATE +- {"NO_ISSUER_CERTIFICATE", ERR_LIB_X509V3, X509V3_R_NO_ISSUER_CERTIFICATE}, +- #else +- {"NO_ISSUER_CERTIFICATE", 34, 121}, +- #endif +- #ifdef X509V3_R_NO_ISSUER_DETAILS +- {"NO_ISSUER_DETAILS", ERR_LIB_X509V3, X509V3_R_NO_ISSUER_DETAILS}, +- #else +- {"NO_ISSUER_DETAILS", 34, 127}, +- #endif +- #ifdef X509V3_R_NO_POLICY_IDENTIFIER +- {"NO_POLICY_IDENTIFIER", ERR_LIB_X509V3, X509V3_R_NO_POLICY_IDENTIFIER}, +- #else +- {"NO_POLICY_IDENTIFIER", 34, 139}, +- #endif +- #ifdef X509V3_R_NO_PROXY_CERT_POLICY_LANGUAGE_DEFINED +- {"NO_PROXY_CERT_POLICY_LANGUAGE_DEFINED", ERR_LIB_X509V3, X509V3_R_NO_PROXY_CERT_POLICY_LANGUAGE_DEFINED}, +- #else +- {"NO_PROXY_CERT_POLICY_LANGUAGE_DEFINED", 34, 154}, +- #endif +- #ifdef X509V3_R_NO_PUBLIC_KEY +- {"NO_PUBLIC_KEY", ERR_LIB_X509V3, X509V3_R_NO_PUBLIC_KEY}, +- #else +- {"NO_PUBLIC_KEY", 34, 114}, +- #endif +- #ifdef X509V3_R_NO_SUBJECT_DETAILS +- {"NO_SUBJECT_DETAILS", ERR_LIB_X509V3, X509V3_R_NO_SUBJECT_DETAILS}, +- #else +- {"NO_SUBJECT_DETAILS", 34, 125}, +- #endif +- #ifdef X509V3_R_OPERATION_NOT_DEFINED +- {"OPERATION_NOT_DEFINED", ERR_LIB_X509V3, X509V3_R_OPERATION_NOT_DEFINED}, +- #else +- {"OPERATION_NOT_DEFINED", 34, 148}, +- #endif +- #ifdef X509V3_R_OTHERNAME_ERROR +- {"OTHERNAME_ERROR", ERR_LIB_X509V3, X509V3_R_OTHERNAME_ERROR}, +- #else +- {"OTHERNAME_ERROR", 34, 147}, +- #endif +- #ifdef X509V3_R_POLICY_LANGUAGE_ALREADY_DEFINED +- {"POLICY_LANGUAGE_ALREADY_DEFINED", ERR_LIB_X509V3, X509V3_R_POLICY_LANGUAGE_ALREADY_DEFINED}, +- #else +- {"POLICY_LANGUAGE_ALREADY_DEFINED", 34, 155}, +- #endif +- #ifdef X509V3_R_POLICY_PATH_LENGTH +- {"POLICY_PATH_LENGTH", ERR_LIB_X509V3, X509V3_R_POLICY_PATH_LENGTH}, +- #else +- {"POLICY_PATH_LENGTH", 34, 156}, +- #endif +- #ifdef X509V3_R_POLICY_PATH_LENGTH_ALREADY_DEFINED +- {"POLICY_PATH_LENGTH_ALREADY_DEFINED", ERR_LIB_X509V3, X509V3_R_POLICY_PATH_LENGTH_ALREADY_DEFINED}, +- #else +- {"POLICY_PATH_LENGTH_ALREADY_DEFINED", 34, 157}, +- #endif +- #ifdef X509V3_R_POLICY_WHEN_PROXY_LANGUAGE_REQUIRES_NO_POLICY +- {"POLICY_WHEN_PROXY_LANGUAGE_REQUIRES_NO_POLICY", ERR_LIB_X509V3, X509V3_R_POLICY_WHEN_PROXY_LANGUAGE_REQUIRES_NO_POLICY}, +- #else +- {"POLICY_WHEN_PROXY_LANGUAGE_REQUIRES_NO_POLICY", 34, 159}, +- #endif +- #ifdef X509V3_R_SECTION_NOT_FOUND +- {"SECTION_NOT_FOUND", ERR_LIB_X509V3, X509V3_R_SECTION_NOT_FOUND}, +- #else +- {"SECTION_NOT_FOUND", 34, 150}, +- #endif +- #ifdef X509V3_R_UNABLE_TO_GET_ISSUER_DETAILS +- {"UNABLE_TO_GET_ISSUER_DETAILS", ERR_LIB_X509V3, X509V3_R_UNABLE_TO_GET_ISSUER_DETAILS}, +- #else +- {"UNABLE_TO_GET_ISSUER_DETAILS", 34, 122}, +- #endif +- #ifdef X509V3_R_UNABLE_TO_GET_ISSUER_KEYID +- {"UNABLE_TO_GET_ISSUER_KEYID", ERR_LIB_X509V3, X509V3_R_UNABLE_TO_GET_ISSUER_KEYID}, +- #else +- {"UNABLE_TO_GET_ISSUER_KEYID", 34, 123}, +- #endif +- #ifdef X509V3_R_UNKNOWN_BIT_STRING_ARGUMENT +- {"UNKNOWN_BIT_STRING_ARGUMENT", ERR_LIB_X509V3, X509V3_R_UNKNOWN_BIT_STRING_ARGUMENT}, +- #else +- {"UNKNOWN_BIT_STRING_ARGUMENT", 34, 111}, +- #endif +- #ifdef X509V3_R_UNKNOWN_EXTENSION +- {"UNKNOWN_EXTENSION", ERR_LIB_X509V3, X509V3_R_UNKNOWN_EXTENSION}, +- #else +- {"UNKNOWN_EXTENSION", 34, 129}, +- #endif +- #ifdef X509V3_R_UNKNOWN_EXTENSION_NAME +- {"UNKNOWN_EXTENSION_NAME", ERR_LIB_X509V3, X509V3_R_UNKNOWN_EXTENSION_NAME}, +- #else +- {"UNKNOWN_EXTENSION_NAME", 34, 130}, +- #endif +- #ifdef X509V3_R_UNKNOWN_OPTION +- {"UNKNOWN_OPTION", ERR_LIB_X509V3, X509V3_R_UNKNOWN_OPTION}, +- #else +- {"UNKNOWN_OPTION", 34, 120}, +- #endif +- #ifdef X509V3_R_UNSUPPORTED_OPTION +- {"UNSUPPORTED_OPTION", ERR_LIB_X509V3, X509V3_R_UNSUPPORTED_OPTION}, +- #else +- {"UNSUPPORTED_OPTION", 34, 117}, +- #endif +- #ifdef X509V3_R_UNSUPPORTED_TYPE +- {"UNSUPPORTED_TYPE", ERR_LIB_X509V3, X509V3_R_UNSUPPORTED_TYPE}, +- #else +- {"UNSUPPORTED_TYPE", 34, 167}, +- #endif +- #ifdef X509V3_R_USER_TOO_LONG +- {"USER_TOO_LONG", ERR_LIB_X509V3, X509V3_R_USER_TOO_LONG}, +- #else +- {"USER_TOO_LONG", 34, 132}, +- #endif +- #ifdef X509_R_AKID_MISMATCH +- {"AKID_MISMATCH", ERR_LIB_X509, X509_R_AKID_MISMATCH}, +- #else +- {"AKID_MISMATCH", 11, 110}, +- #endif +- #ifdef X509_R_BAD_SELECTOR +- {"BAD_SELECTOR", ERR_LIB_X509, X509_R_BAD_SELECTOR}, +- #else +- {"BAD_SELECTOR", 11, 133}, +- #endif +- #ifdef X509_R_BAD_X509_FILETYPE +- {"BAD_X509_FILETYPE", ERR_LIB_X509, X509_R_BAD_X509_FILETYPE}, +- #else +- {"BAD_X509_FILETYPE", 11, 100}, +- #endif +- #ifdef X509_R_BASE64_DECODE_ERROR +- {"BASE64_DECODE_ERROR", ERR_LIB_X509, X509_R_BASE64_DECODE_ERROR}, +- #else +- {"BASE64_DECODE_ERROR", 11, 118}, +- #endif +- #ifdef X509_R_CANT_CHECK_DH_KEY +- {"CANT_CHECK_DH_KEY", ERR_LIB_X509, X509_R_CANT_CHECK_DH_KEY}, +- #else +- {"CANT_CHECK_DH_KEY", 11, 114}, +- #endif +- #ifdef X509_R_CERTIFICATE_VERIFICATION_FAILED +- {"CERTIFICATE_VERIFICATION_FAILED", ERR_LIB_X509, X509_R_CERTIFICATE_VERIFICATION_FAILED}, +- #else +- {"CERTIFICATE_VERIFICATION_FAILED", 11, 139}, +- #endif +- #ifdef X509_R_CERT_ALREADY_IN_HASH_TABLE +- {"CERT_ALREADY_IN_HASH_TABLE", ERR_LIB_X509, X509_R_CERT_ALREADY_IN_HASH_TABLE}, +- #else +- {"CERT_ALREADY_IN_HASH_TABLE", 11, 101}, +- #endif +- #ifdef X509_R_CRL_ALREADY_DELTA +- {"CRL_ALREADY_DELTA", ERR_LIB_X509, X509_R_CRL_ALREADY_DELTA}, +- #else +- {"CRL_ALREADY_DELTA", 11, 127}, +- #endif +- #ifdef X509_R_CRL_VERIFY_FAILURE +- {"CRL_VERIFY_FAILURE", ERR_LIB_X509, X509_R_CRL_VERIFY_FAILURE}, +- #else +- {"CRL_VERIFY_FAILURE", 11, 131}, +- #endif +- #ifdef X509_R_ERROR_GETTING_MD_BY_NID +- {"ERROR_GETTING_MD_BY_NID", ERR_LIB_X509, X509_R_ERROR_GETTING_MD_BY_NID}, +- #else +- {"ERROR_GETTING_MD_BY_NID", 11, 141}, +- #endif +- #ifdef X509_R_ERROR_USING_SIGINF_SET +- {"ERROR_USING_SIGINF_SET", ERR_LIB_X509, X509_R_ERROR_USING_SIGINF_SET}, +- #else +- {"ERROR_USING_SIGINF_SET", 11, 142}, +- #endif +- #ifdef X509_R_IDP_MISMATCH +- {"IDP_MISMATCH", ERR_LIB_X509, X509_R_IDP_MISMATCH}, +- #else +- {"IDP_MISMATCH", 11, 128}, +- #endif +- #ifdef X509_R_INVALID_ATTRIBUTES +- {"INVALID_ATTRIBUTES", ERR_LIB_X509, X509_R_INVALID_ATTRIBUTES}, +- #else +- {"INVALID_ATTRIBUTES", 11, 138}, +- #endif +- #ifdef X509_R_INVALID_DIRECTORY +- {"INVALID_DIRECTORY", ERR_LIB_X509, X509_R_INVALID_DIRECTORY}, +- #else +- {"INVALID_DIRECTORY", 11, 113}, +- #endif +- #ifdef X509_R_INVALID_DISTPOINT +- {"INVALID_DISTPOINT", ERR_LIB_X509, X509_R_INVALID_DISTPOINT}, +- #else +- {"INVALID_DISTPOINT", 11, 143}, +- #endif +- #ifdef X509_R_INVALID_FIELD_NAME +- {"INVALID_FIELD_NAME", ERR_LIB_X509, X509_R_INVALID_FIELD_NAME}, +- #else +- {"INVALID_FIELD_NAME", 11, 119}, +- #endif +- #ifdef X509_R_INVALID_TRUST +- {"INVALID_TRUST", ERR_LIB_X509, X509_R_INVALID_TRUST}, +- #else +- {"INVALID_TRUST", 11, 123}, +- #endif +- #ifdef X509_R_ISSUER_MISMATCH +- {"ISSUER_MISMATCH", ERR_LIB_X509, X509_R_ISSUER_MISMATCH}, +- #else +- {"ISSUER_MISMATCH", 11, 129}, +- #endif +- #ifdef X509_R_KEY_TYPE_MISMATCH +- {"KEY_TYPE_MISMATCH", ERR_LIB_X509, X509_R_KEY_TYPE_MISMATCH}, +- #else +- {"KEY_TYPE_MISMATCH", 11, 115}, +- #endif +- #ifdef X509_R_KEY_VALUES_MISMATCH +- {"KEY_VALUES_MISMATCH", ERR_LIB_X509, X509_R_KEY_VALUES_MISMATCH}, +- #else +- {"KEY_VALUES_MISMATCH", 11, 116}, +- #endif +- #ifdef X509_R_LOADING_CERT_DIR +- {"LOADING_CERT_DIR", ERR_LIB_X509, X509_R_LOADING_CERT_DIR}, +- #else +- {"LOADING_CERT_DIR", 11, 103}, +- #endif +- #ifdef X509_R_LOADING_DEFAULTS +- {"LOADING_DEFAULTS", ERR_LIB_X509, X509_R_LOADING_DEFAULTS}, +- #else +- {"LOADING_DEFAULTS", 11, 104}, +- #endif +- #ifdef X509_R_METHOD_NOT_SUPPORTED +- {"METHOD_NOT_SUPPORTED", ERR_LIB_X509, X509_R_METHOD_NOT_SUPPORTED}, +- #else +- {"METHOD_NOT_SUPPORTED", 11, 124}, +- #endif +- #ifdef X509_R_NAME_TOO_LONG +- {"NAME_TOO_LONG", ERR_LIB_X509, X509_R_NAME_TOO_LONG}, +- #else +- {"NAME_TOO_LONG", 11, 134}, +- #endif +- #ifdef X509_R_NEWER_CRL_NOT_NEWER +- {"NEWER_CRL_NOT_NEWER", ERR_LIB_X509, X509_R_NEWER_CRL_NOT_NEWER}, +- #else +- {"NEWER_CRL_NOT_NEWER", 11, 132}, +- #endif +- #ifdef X509_R_NO_CERTIFICATE_FOUND +- {"NO_CERTIFICATE_FOUND", ERR_LIB_X509, X509_R_NO_CERTIFICATE_FOUND}, +- #else +- {"NO_CERTIFICATE_FOUND", 11, 135}, +- #endif +- #ifdef X509_R_NO_CERTIFICATE_OR_CRL_FOUND +- {"NO_CERTIFICATE_OR_CRL_FOUND", ERR_LIB_X509, X509_R_NO_CERTIFICATE_OR_CRL_FOUND}, +- #else +- {"NO_CERTIFICATE_OR_CRL_FOUND", 11, 136}, +- #endif +- #ifdef X509_R_NO_CERT_SET_FOR_US_TO_VERIFY +- {"NO_CERT_SET_FOR_US_TO_VERIFY", ERR_LIB_X509, X509_R_NO_CERT_SET_FOR_US_TO_VERIFY}, +- #else +- {"NO_CERT_SET_FOR_US_TO_VERIFY", 11, 105}, +- #endif +- #ifdef X509_R_NO_CRL_FOUND +- {"NO_CRL_FOUND", ERR_LIB_X509, X509_R_NO_CRL_FOUND}, +- #else +- {"NO_CRL_FOUND", 11, 137}, +- #endif +- #ifdef X509_R_NO_CRL_NUMBER +- {"NO_CRL_NUMBER", ERR_LIB_X509, X509_R_NO_CRL_NUMBER}, +- #else +- {"NO_CRL_NUMBER", 11, 130}, +- #endif +- #ifdef X509_R_PUBLIC_KEY_DECODE_ERROR +- {"PUBLIC_KEY_DECODE_ERROR", ERR_LIB_X509, X509_R_PUBLIC_KEY_DECODE_ERROR}, +- #else +- {"PUBLIC_KEY_DECODE_ERROR", 11, 125}, +- #endif +- #ifdef X509_R_PUBLIC_KEY_ENCODE_ERROR +- {"PUBLIC_KEY_ENCODE_ERROR", ERR_LIB_X509, X509_R_PUBLIC_KEY_ENCODE_ERROR}, +- #else +- {"PUBLIC_KEY_ENCODE_ERROR", 11, 126}, +- #endif +- #ifdef X509_R_SHOULD_RETRY +- {"SHOULD_RETRY", ERR_LIB_X509, X509_R_SHOULD_RETRY}, +- #else +- {"SHOULD_RETRY", 11, 106}, +- #endif +- #ifdef X509_R_UNABLE_TO_FIND_PARAMETERS_IN_CHAIN +- {"UNABLE_TO_FIND_PARAMETERS_IN_CHAIN", ERR_LIB_X509, X509_R_UNABLE_TO_FIND_PARAMETERS_IN_CHAIN}, +- #else +- {"UNABLE_TO_FIND_PARAMETERS_IN_CHAIN", 11, 107}, +- #endif +- #ifdef X509_R_UNABLE_TO_GET_CERTS_PUBLIC_KEY +- {"UNABLE_TO_GET_CERTS_PUBLIC_KEY", ERR_LIB_X509, X509_R_UNABLE_TO_GET_CERTS_PUBLIC_KEY}, +- #else +- {"UNABLE_TO_GET_CERTS_PUBLIC_KEY", 11, 108}, +- #endif +- #ifdef X509_R_UNKNOWN_KEY_TYPE +- {"UNKNOWN_KEY_TYPE", ERR_LIB_X509, X509_R_UNKNOWN_KEY_TYPE}, +- #else +- {"UNKNOWN_KEY_TYPE", 11, 117}, +- #endif +- #ifdef X509_R_UNKNOWN_NID +- {"UNKNOWN_NID", ERR_LIB_X509, X509_R_UNKNOWN_NID}, +- #else +- {"UNKNOWN_NID", 11, 109}, +- #endif +- #ifdef X509_R_UNKNOWN_PURPOSE_ID +- {"UNKNOWN_PURPOSE_ID", ERR_LIB_X509, X509_R_UNKNOWN_PURPOSE_ID}, +- #else +- {"UNKNOWN_PURPOSE_ID", 11, 121}, +- #endif +- #ifdef X509_R_UNKNOWN_SIGID_ALGS +- {"UNKNOWN_SIGID_ALGS", ERR_LIB_X509, X509_R_UNKNOWN_SIGID_ALGS}, +- #else +- {"UNKNOWN_SIGID_ALGS", 11, 144}, +- #endif +- #ifdef X509_R_UNKNOWN_TRUST_ID +- {"UNKNOWN_TRUST_ID", ERR_LIB_X509, X509_R_UNKNOWN_TRUST_ID}, +- #else +- {"UNKNOWN_TRUST_ID", 11, 120}, +- #endif +- #ifdef X509_R_UNSUPPORTED_ALGORITHM +- {"UNSUPPORTED_ALGORITHM", ERR_LIB_X509, X509_R_UNSUPPORTED_ALGORITHM}, +- #else +- {"UNSUPPORTED_ALGORITHM", 11, 111}, +- #endif +- #ifdef X509_R_WRONG_LOOKUP_TYPE +- {"WRONG_LOOKUP_TYPE", ERR_LIB_X509, X509_R_WRONG_LOOKUP_TYPE}, +- #else +- {"WRONG_LOOKUP_TYPE", 11, 112}, +- #endif +- #ifdef X509_R_WRONG_TYPE +- {"WRONG_TYPE", ERR_LIB_X509, X509_R_WRONG_TYPE}, +- #else +- {"WRONG_TYPE", 11, 122}, +- #endif +- { NULL } +-}; +- +--- /dev/null ++++ b/Modules/_ssl_data_34.h +@@ -0,0 +1,9277 @@ ++/* File generated by Tools/ssl/make_ssl_data.py */ ++/* Generated on 2024-11-27T12:35:52.276767+00:00 */ ++/* Generated from Git commit openssl-3.4.0-0-g98acb6b028 */ ++static struct py_ssl_library_code library_codes[] = { ++#ifdef ERR_LIB_ASN1 ++ {"ASN1", ERR_LIB_ASN1}, ++#endif ++#ifdef ERR_LIB_ASYNC ++ {"ASYNC", ERR_LIB_ASYNC}, ++#endif ++#ifdef ERR_LIB_BIO ++ {"BIO", ERR_LIB_BIO}, ++#endif ++#ifdef ERR_LIB_BN ++ {"BN", ERR_LIB_BN}, ++#endif ++#ifdef ERR_LIB_BUF ++ {"BUF", ERR_LIB_BUF}, ++#endif ++#ifdef ERR_LIB_CMP ++ {"CMP", ERR_LIB_CMP}, ++#endif ++#ifdef ERR_LIB_CMS ++ {"CMS", ERR_LIB_CMS}, ++#endif ++#ifdef ERR_LIB_COMP ++ {"COMP", ERR_LIB_COMP}, ++#endif ++#ifdef ERR_LIB_CONF ++ {"CONF", ERR_LIB_CONF}, ++#endif ++#ifdef ERR_LIB_CRMF ++ {"CRMF", ERR_LIB_CRMF}, ++#endif ++#ifdef ERR_LIB_CRYPTO ++ {"CRYPTO", ERR_LIB_CRYPTO}, ++#endif ++#ifdef ERR_LIB_CT ++ {"CT", ERR_LIB_CT}, ++#endif ++#ifdef ERR_LIB_DH ++ {"DH", ERR_LIB_DH}, ++#endif ++#ifdef ERR_LIB_DSA ++ {"DSA", ERR_LIB_DSA}, ++#endif ++#ifdef ERR_LIB_DSO ++ {"DSO", ERR_LIB_DSO}, ++#endif ++#ifdef ERR_LIB_EC ++ {"EC", ERR_LIB_EC}, ++#endif ++#ifdef ERR_LIB_ECDH ++ {"ECDH", ERR_LIB_ECDH}, ++#endif ++#ifdef ERR_LIB_ECDSA ++ {"ECDSA", ERR_LIB_ECDSA}, ++#endif ++#ifdef ERR_LIB_ENGINE ++ {"ENGINE", ERR_LIB_ENGINE}, ++#endif ++#ifdef ERR_LIB_ESS ++ {"ESS", ERR_LIB_ESS}, ++#endif ++#ifdef ERR_LIB_EVP ++ {"EVP", ERR_LIB_EVP}, ++#endif ++#ifdef ERR_LIB_FIPS ++ {"FIPS", ERR_LIB_FIPS}, ++#endif ++#ifdef ERR_LIB_HMAC ++ {"HMAC", ERR_LIB_HMAC}, ++#endif ++#ifdef ERR_LIB_HTTP ++ {"HTTP", ERR_LIB_HTTP}, ++#endif ++#ifdef ERR_LIB_JPAKE ++ {"JPAKE", ERR_LIB_JPAKE}, ++#endif ++#ifdef ERR_LIB_KDF ++ {"KDF", ERR_LIB_KDF}, ++#endif ++#ifdef ERR_LIB_MASK ++ {"MASK", ERR_LIB_MASK}, ++#endif ++#ifdef ERR_LIB_METH ++ {"METH", ERR_LIB_METH}, ++#endif ++#ifdef ERR_LIB_NONE ++ {"NONE", ERR_LIB_NONE}, ++#endif ++#ifdef ERR_LIB_OBJ ++ {"OBJ", ERR_LIB_OBJ}, ++#endif ++#ifdef ERR_LIB_OCSP ++ {"OCSP", ERR_LIB_OCSP}, ++#endif ++#ifdef ERR_LIB_OFFSET ++ {"OFFSET", ERR_LIB_OFFSET}, ++#endif ++#ifdef ERR_LIB_OSSL_DECODER ++ {"OSSL_DECODER", ERR_LIB_OSSL_DECODER}, ++#endif ++#ifdef ERR_LIB_OSSL_ENCODER ++ {"OSSL_ENCODER", ERR_LIB_OSSL_ENCODER}, ++#endif ++#ifdef ERR_LIB_OSSL_STORE ++ {"OSSL_STORE", ERR_LIB_OSSL_STORE}, ++#endif ++#ifdef ERR_LIB_PEM ++ {"PEM", ERR_LIB_PEM}, ++#endif ++#ifdef ERR_LIB_PKCS12 ++ {"PKCS12", ERR_LIB_PKCS12}, ++#endif ++#ifdef ERR_LIB_PKCS7 ++ {"PKCS7", ERR_LIB_PKCS7}, ++#endif ++#ifdef ERR_LIB_PROP ++ {"PROP", ERR_LIB_PROP}, ++#endif ++#ifdef ERR_LIB_PROV ++ {"PROV", ERR_LIB_PROV}, ++#endif ++#ifdef ERR_LIB_PROXY ++ {"PROXY", ERR_LIB_PROXY}, ++#endif ++#ifdef ERR_LIB_RAND ++ {"RAND", ERR_LIB_RAND}, ++#endif ++#ifdef ERR_LIB_RSA ++ {"RSA", ERR_LIB_RSA}, ++#endif ++#ifdef ERR_LIB_RSAREF ++ {"RSAREF", ERR_LIB_RSAREF}, ++#endif ++#ifdef ERR_LIB_SM2 ++ {"SM2", ERR_LIB_SM2}, ++#endif ++#ifdef ERR_LIB_SSL ++ {"SSL", ERR_LIB_SSL}, ++#endif ++#ifdef ERR_LIB_SSL2 ++ {"SSL2", ERR_LIB_SSL2}, ++#endif ++#ifdef ERR_LIB_SSL23 ++ {"SSL23", ERR_LIB_SSL23}, ++#endif ++#ifdef ERR_LIB_SSL3 ++ {"SSL3", ERR_LIB_SSL3}, ++#endif ++#ifdef ERR_LIB_SYS ++ {"SYS", ERR_LIB_SYS}, ++#endif ++#ifdef ERR_LIB_TS ++ {"TS", ERR_LIB_TS}, ++#endif ++#ifdef ERR_LIB_UI ++ {"UI", ERR_LIB_UI}, ++#endif ++#ifdef ERR_LIB_USER ++ {"USER", ERR_LIB_USER}, ++#endif ++#ifdef ERR_LIB_X509 ++ {"X509", ERR_LIB_X509}, ++#endif ++#ifdef ERR_LIB_X509V3 ++ {"X509V3", ERR_LIB_X509V3}, ++#endif ++ { NULL } ++}; ++ ++ ++static struct py_ssl_error_code error_codes[] = { ++ #ifdef ASN1_R_ADDING_OBJECT ++ {"ADDING_OBJECT", ERR_LIB_ASN1, ASN1_R_ADDING_OBJECT}, ++ #else ++ {"ADDING_OBJECT", 13, 171}, ++ #endif ++ #ifdef ASN1_R_ASN1_PARSE_ERROR ++ {"ASN1_PARSE_ERROR", ERR_LIB_ASN1, ASN1_R_ASN1_PARSE_ERROR}, ++ #else ++ {"ASN1_PARSE_ERROR", 13, 203}, ++ #endif ++ #ifdef ASN1_R_ASN1_SIG_PARSE_ERROR ++ {"ASN1_SIG_PARSE_ERROR", ERR_LIB_ASN1, ASN1_R_ASN1_SIG_PARSE_ERROR}, ++ #else ++ {"ASN1_SIG_PARSE_ERROR", 13, 204}, ++ #endif ++ #ifdef ASN1_R_AUX_ERROR ++ {"AUX_ERROR", ERR_LIB_ASN1, ASN1_R_AUX_ERROR}, ++ #else ++ {"AUX_ERROR", 13, 100}, ++ #endif ++ #ifdef ASN1_R_BAD_OBJECT_HEADER ++ {"BAD_OBJECT_HEADER", ERR_LIB_ASN1, ASN1_R_BAD_OBJECT_HEADER}, ++ #else ++ {"BAD_OBJECT_HEADER", 13, 102}, ++ #endif ++ #ifdef ASN1_R_BAD_TEMPLATE ++ {"BAD_TEMPLATE", ERR_LIB_ASN1, ASN1_R_BAD_TEMPLATE}, ++ #else ++ {"BAD_TEMPLATE", 13, 230}, ++ #endif ++ #ifdef ASN1_R_BMPSTRING_IS_WRONG_LENGTH ++ {"BMPSTRING_IS_WRONG_LENGTH", ERR_LIB_ASN1, ASN1_R_BMPSTRING_IS_WRONG_LENGTH}, ++ #else ++ {"BMPSTRING_IS_WRONG_LENGTH", 13, 214}, ++ #endif ++ #ifdef ASN1_R_BN_LIB ++ {"BN_LIB", ERR_LIB_ASN1, ASN1_R_BN_LIB}, ++ #else ++ {"BN_LIB", 13, 105}, ++ #endif ++ #ifdef ASN1_R_BOOLEAN_IS_WRONG_LENGTH ++ {"BOOLEAN_IS_WRONG_LENGTH", ERR_LIB_ASN1, ASN1_R_BOOLEAN_IS_WRONG_LENGTH}, ++ #else ++ {"BOOLEAN_IS_WRONG_LENGTH", 13, 106}, ++ #endif ++ #ifdef ASN1_R_BUFFER_TOO_SMALL ++ {"BUFFER_TOO_SMALL", ERR_LIB_ASN1, ASN1_R_BUFFER_TOO_SMALL}, ++ #else ++ {"BUFFER_TOO_SMALL", 13, 107}, ++ #endif ++ #ifdef ASN1_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER ++ {"CIPHER_HAS_NO_OBJECT_IDENTIFIER", ERR_LIB_ASN1, ASN1_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER}, ++ #else ++ {"CIPHER_HAS_NO_OBJECT_IDENTIFIER", 13, 108}, ++ #endif ++ #ifdef ASN1_R_CONTEXT_NOT_INITIALISED ++ {"CONTEXT_NOT_INITIALISED", ERR_LIB_ASN1, ASN1_R_CONTEXT_NOT_INITIALISED}, ++ #else ++ {"CONTEXT_NOT_INITIALISED", 13, 217}, ++ #endif ++ #ifdef ASN1_R_DATA_IS_WRONG ++ {"DATA_IS_WRONG", ERR_LIB_ASN1, ASN1_R_DATA_IS_WRONG}, ++ #else ++ {"DATA_IS_WRONG", 13, 109}, ++ #endif ++ #ifdef ASN1_R_DECODE_ERROR ++ {"DECODE_ERROR", ERR_LIB_ASN1, ASN1_R_DECODE_ERROR}, ++ #else ++ {"DECODE_ERROR", 13, 110}, ++ #endif ++ #ifdef ASN1_R_DEPTH_EXCEEDED ++ {"DEPTH_EXCEEDED", ERR_LIB_ASN1, ASN1_R_DEPTH_EXCEEDED}, ++ #else ++ {"DEPTH_EXCEEDED", 13, 174}, ++ #endif ++ #ifdef ASN1_R_DIGEST_AND_KEY_TYPE_NOT_SUPPORTED ++ {"DIGEST_AND_KEY_TYPE_NOT_SUPPORTED", ERR_LIB_ASN1, ASN1_R_DIGEST_AND_KEY_TYPE_NOT_SUPPORTED}, ++ #else ++ {"DIGEST_AND_KEY_TYPE_NOT_SUPPORTED", 13, 198}, ++ #endif ++ #ifdef ASN1_R_ENCODE_ERROR ++ {"ENCODE_ERROR", ERR_LIB_ASN1, ASN1_R_ENCODE_ERROR}, ++ #else ++ {"ENCODE_ERROR", 13, 112}, ++ #endif ++ #ifdef ASN1_R_ERROR_GETTING_TIME ++ {"ERROR_GETTING_TIME", ERR_LIB_ASN1, ASN1_R_ERROR_GETTING_TIME}, ++ #else ++ {"ERROR_GETTING_TIME", 13, 173}, ++ #endif ++ #ifdef ASN1_R_ERROR_LOADING_SECTION ++ {"ERROR_LOADING_SECTION", ERR_LIB_ASN1, ASN1_R_ERROR_LOADING_SECTION}, ++ #else ++ {"ERROR_LOADING_SECTION", 13, 172}, ++ #endif ++ #ifdef ASN1_R_ERROR_SETTING_CIPHER_PARAMS ++ {"ERROR_SETTING_CIPHER_PARAMS", ERR_LIB_ASN1, ASN1_R_ERROR_SETTING_CIPHER_PARAMS}, ++ #else ++ {"ERROR_SETTING_CIPHER_PARAMS", 13, 114}, ++ #endif ++ #ifdef ASN1_R_EXPECTING_AN_INTEGER ++ {"EXPECTING_AN_INTEGER", ERR_LIB_ASN1, ASN1_R_EXPECTING_AN_INTEGER}, ++ #else ++ {"EXPECTING_AN_INTEGER", 13, 115}, ++ #endif ++ #ifdef ASN1_R_EXPECTING_AN_OBJECT ++ {"EXPECTING_AN_OBJECT", ERR_LIB_ASN1, ASN1_R_EXPECTING_AN_OBJECT}, ++ #else ++ {"EXPECTING_AN_OBJECT", 13, 116}, ++ #endif ++ #ifdef ASN1_R_EXPLICIT_LENGTH_MISMATCH ++ {"EXPLICIT_LENGTH_MISMATCH", ERR_LIB_ASN1, ASN1_R_EXPLICIT_LENGTH_MISMATCH}, ++ #else ++ {"EXPLICIT_LENGTH_MISMATCH", 13, 119}, ++ #endif ++ #ifdef ASN1_R_EXPLICIT_TAG_NOT_CONSTRUCTED ++ {"EXPLICIT_TAG_NOT_CONSTRUCTED", ERR_LIB_ASN1, ASN1_R_EXPLICIT_TAG_NOT_CONSTRUCTED}, ++ #else ++ {"EXPLICIT_TAG_NOT_CONSTRUCTED", 13, 120}, ++ #endif ++ #ifdef ASN1_R_FIELD_MISSING ++ {"FIELD_MISSING", ERR_LIB_ASN1, ASN1_R_FIELD_MISSING}, ++ #else ++ {"FIELD_MISSING", 13, 121}, ++ #endif ++ #ifdef ASN1_R_FIRST_NUM_TOO_LARGE ++ {"FIRST_NUM_TOO_LARGE", ERR_LIB_ASN1, ASN1_R_FIRST_NUM_TOO_LARGE}, ++ #else ++ {"FIRST_NUM_TOO_LARGE", 13, 122}, ++ #endif ++ #ifdef ASN1_R_GENERALIZEDTIME_IS_TOO_SHORT ++ {"GENERALIZEDTIME_IS_TOO_SHORT", ERR_LIB_ASN1, ASN1_R_GENERALIZEDTIME_IS_TOO_SHORT}, ++ #else ++ {"GENERALIZEDTIME_IS_TOO_SHORT", 13, 232}, ++ #endif ++ #ifdef ASN1_R_HEADER_TOO_LONG ++ {"HEADER_TOO_LONG", ERR_LIB_ASN1, ASN1_R_HEADER_TOO_LONG}, ++ #else ++ {"HEADER_TOO_LONG", 13, 123}, ++ #endif ++ #ifdef ASN1_R_ILLEGAL_BITSTRING_FORMAT ++ {"ILLEGAL_BITSTRING_FORMAT", ERR_LIB_ASN1, ASN1_R_ILLEGAL_BITSTRING_FORMAT}, ++ #else ++ {"ILLEGAL_BITSTRING_FORMAT", 13, 175}, ++ #endif ++ #ifdef ASN1_R_ILLEGAL_BOOLEAN ++ {"ILLEGAL_BOOLEAN", ERR_LIB_ASN1, ASN1_R_ILLEGAL_BOOLEAN}, ++ #else ++ {"ILLEGAL_BOOLEAN", 13, 176}, ++ #endif ++ #ifdef ASN1_R_ILLEGAL_CHARACTERS ++ {"ILLEGAL_CHARACTERS", ERR_LIB_ASN1, ASN1_R_ILLEGAL_CHARACTERS}, ++ #else ++ {"ILLEGAL_CHARACTERS", 13, 124}, ++ #endif ++ #ifdef ASN1_R_ILLEGAL_FORMAT ++ {"ILLEGAL_FORMAT", ERR_LIB_ASN1, ASN1_R_ILLEGAL_FORMAT}, ++ #else ++ {"ILLEGAL_FORMAT", 13, 177}, ++ #endif ++ #ifdef ASN1_R_ILLEGAL_HEX ++ {"ILLEGAL_HEX", ERR_LIB_ASN1, ASN1_R_ILLEGAL_HEX}, ++ #else ++ {"ILLEGAL_HEX", 13, 178}, ++ #endif ++ #ifdef ASN1_R_ILLEGAL_IMPLICIT_TAG ++ {"ILLEGAL_IMPLICIT_TAG", ERR_LIB_ASN1, ASN1_R_ILLEGAL_IMPLICIT_TAG}, ++ #else ++ {"ILLEGAL_IMPLICIT_TAG", 13, 179}, ++ #endif ++ #ifdef ASN1_R_ILLEGAL_INTEGER ++ {"ILLEGAL_INTEGER", ERR_LIB_ASN1, ASN1_R_ILLEGAL_INTEGER}, ++ #else ++ {"ILLEGAL_INTEGER", 13, 180}, ++ #endif ++ #ifdef ASN1_R_ILLEGAL_NEGATIVE_VALUE ++ {"ILLEGAL_NEGATIVE_VALUE", ERR_LIB_ASN1, ASN1_R_ILLEGAL_NEGATIVE_VALUE}, ++ #else ++ {"ILLEGAL_NEGATIVE_VALUE", 13, 226}, ++ #endif ++ #ifdef ASN1_R_ILLEGAL_NESTED_TAGGING ++ {"ILLEGAL_NESTED_TAGGING", ERR_LIB_ASN1, ASN1_R_ILLEGAL_NESTED_TAGGING}, ++ #else ++ {"ILLEGAL_NESTED_TAGGING", 13, 181}, ++ #endif ++ #ifdef ASN1_R_ILLEGAL_NULL ++ {"ILLEGAL_NULL", ERR_LIB_ASN1, ASN1_R_ILLEGAL_NULL}, ++ #else ++ {"ILLEGAL_NULL", 13, 125}, ++ #endif ++ #ifdef ASN1_R_ILLEGAL_NULL_VALUE ++ {"ILLEGAL_NULL_VALUE", ERR_LIB_ASN1, ASN1_R_ILLEGAL_NULL_VALUE}, ++ #else ++ {"ILLEGAL_NULL_VALUE", 13, 182}, ++ #endif ++ #ifdef ASN1_R_ILLEGAL_OBJECT ++ {"ILLEGAL_OBJECT", ERR_LIB_ASN1, ASN1_R_ILLEGAL_OBJECT}, ++ #else ++ {"ILLEGAL_OBJECT", 13, 183}, ++ #endif ++ #ifdef ASN1_R_ILLEGAL_OPTIONAL_ANY ++ {"ILLEGAL_OPTIONAL_ANY", ERR_LIB_ASN1, ASN1_R_ILLEGAL_OPTIONAL_ANY}, ++ #else ++ {"ILLEGAL_OPTIONAL_ANY", 13, 126}, ++ #endif ++ #ifdef ASN1_R_ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE ++ {"ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE", ERR_LIB_ASN1, ASN1_R_ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE}, ++ #else ++ {"ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE", 13, 170}, ++ #endif ++ #ifdef ASN1_R_ILLEGAL_PADDING ++ {"ILLEGAL_PADDING", ERR_LIB_ASN1, ASN1_R_ILLEGAL_PADDING}, ++ #else ++ {"ILLEGAL_PADDING", 13, 221}, ++ #endif ++ #ifdef ASN1_R_ILLEGAL_TAGGED_ANY ++ {"ILLEGAL_TAGGED_ANY", ERR_LIB_ASN1, ASN1_R_ILLEGAL_TAGGED_ANY}, ++ #else ++ {"ILLEGAL_TAGGED_ANY", 13, 127}, ++ #endif ++ #ifdef ASN1_R_ILLEGAL_TIME_VALUE ++ {"ILLEGAL_TIME_VALUE", ERR_LIB_ASN1, ASN1_R_ILLEGAL_TIME_VALUE}, ++ #else ++ {"ILLEGAL_TIME_VALUE", 13, 184}, ++ #endif ++ #ifdef ASN1_R_ILLEGAL_ZERO_CONTENT ++ {"ILLEGAL_ZERO_CONTENT", ERR_LIB_ASN1, ASN1_R_ILLEGAL_ZERO_CONTENT}, ++ #else ++ {"ILLEGAL_ZERO_CONTENT", 13, 222}, ++ #endif ++ #ifdef ASN1_R_INTEGER_NOT_ASCII_FORMAT ++ {"INTEGER_NOT_ASCII_FORMAT", ERR_LIB_ASN1, ASN1_R_INTEGER_NOT_ASCII_FORMAT}, ++ #else ++ {"INTEGER_NOT_ASCII_FORMAT", 13, 185}, ++ #endif ++ #ifdef ASN1_R_INTEGER_TOO_LARGE_FOR_LONG ++ {"INTEGER_TOO_LARGE_FOR_LONG", ERR_LIB_ASN1, ASN1_R_INTEGER_TOO_LARGE_FOR_LONG}, ++ #else ++ {"INTEGER_TOO_LARGE_FOR_LONG", 13, 128}, ++ #endif ++ #ifdef ASN1_R_INVALID_BIT_STRING_BITS_LEFT ++ {"INVALID_BIT_STRING_BITS_LEFT", ERR_LIB_ASN1, ASN1_R_INVALID_BIT_STRING_BITS_LEFT}, ++ #else ++ {"INVALID_BIT_STRING_BITS_LEFT", 13, 220}, ++ #endif ++ #ifdef ASN1_R_INVALID_BMPSTRING_LENGTH ++ {"INVALID_BMPSTRING_LENGTH", ERR_LIB_ASN1, ASN1_R_INVALID_BMPSTRING_LENGTH}, ++ #else ++ {"INVALID_BMPSTRING_LENGTH", 13, 129}, ++ #endif ++ #ifdef ASN1_R_INVALID_DIGIT ++ {"INVALID_DIGIT", ERR_LIB_ASN1, ASN1_R_INVALID_DIGIT}, ++ #else ++ {"INVALID_DIGIT", 13, 130}, ++ #endif ++ #ifdef ASN1_R_INVALID_MIME_TYPE ++ {"INVALID_MIME_TYPE", ERR_LIB_ASN1, ASN1_R_INVALID_MIME_TYPE}, ++ #else ++ {"INVALID_MIME_TYPE", 13, 205}, ++ #endif ++ #ifdef ASN1_R_INVALID_MODIFIER ++ {"INVALID_MODIFIER", ERR_LIB_ASN1, ASN1_R_INVALID_MODIFIER}, ++ #else ++ {"INVALID_MODIFIER", 13, 186}, ++ #endif ++ #ifdef ASN1_R_INVALID_NUMBER ++ {"INVALID_NUMBER", ERR_LIB_ASN1, ASN1_R_INVALID_NUMBER}, ++ #else ++ {"INVALID_NUMBER", 13, 187}, ++ #endif ++ #ifdef ASN1_R_INVALID_OBJECT_ENCODING ++ {"INVALID_OBJECT_ENCODING", ERR_LIB_ASN1, ASN1_R_INVALID_OBJECT_ENCODING}, ++ #else ++ {"INVALID_OBJECT_ENCODING", 13, 216}, ++ #endif ++ #ifdef ASN1_R_INVALID_SCRYPT_PARAMETERS ++ {"INVALID_SCRYPT_PARAMETERS", ERR_LIB_ASN1, ASN1_R_INVALID_SCRYPT_PARAMETERS}, ++ #else ++ {"INVALID_SCRYPT_PARAMETERS", 13, 227}, ++ #endif ++ #ifdef ASN1_R_INVALID_SEPARATOR ++ {"INVALID_SEPARATOR", ERR_LIB_ASN1, ASN1_R_INVALID_SEPARATOR}, ++ #else ++ {"INVALID_SEPARATOR", 13, 131}, ++ #endif ++ #ifdef ASN1_R_INVALID_STRING_TABLE_VALUE ++ {"INVALID_STRING_TABLE_VALUE", ERR_LIB_ASN1, ASN1_R_INVALID_STRING_TABLE_VALUE}, ++ #else ++ {"INVALID_STRING_TABLE_VALUE", 13, 218}, ++ #endif ++ #ifdef ASN1_R_INVALID_UNIVERSALSTRING_LENGTH ++ {"INVALID_UNIVERSALSTRING_LENGTH", ERR_LIB_ASN1, ASN1_R_INVALID_UNIVERSALSTRING_LENGTH}, ++ #else ++ {"INVALID_UNIVERSALSTRING_LENGTH", 13, 133}, ++ #endif ++ #ifdef ASN1_R_INVALID_UTF8STRING ++ {"INVALID_UTF8STRING", ERR_LIB_ASN1, ASN1_R_INVALID_UTF8STRING}, ++ #else ++ {"INVALID_UTF8STRING", 13, 134}, ++ #endif ++ #ifdef ASN1_R_INVALID_VALUE ++ {"INVALID_VALUE", ERR_LIB_ASN1, ASN1_R_INVALID_VALUE}, ++ #else ++ {"INVALID_VALUE", 13, 219}, ++ #endif ++ #ifdef ASN1_R_LENGTH_TOO_LONG ++ {"LENGTH_TOO_LONG", ERR_LIB_ASN1, ASN1_R_LENGTH_TOO_LONG}, ++ #else ++ {"LENGTH_TOO_LONG", 13, 231}, ++ #endif ++ #ifdef ASN1_R_LIST_ERROR ++ {"LIST_ERROR", ERR_LIB_ASN1, ASN1_R_LIST_ERROR}, ++ #else ++ {"LIST_ERROR", 13, 188}, ++ #endif ++ #ifdef ASN1_R_MIME_NO_CONTENT_TYPE ++ {"MIME_NO_CONTENT_TYPE", ERR_LIB_ASN1, ASN1_R_MIME_NO_CONTENT_TYPE}, ++ #else ++ {"MIME_NO_CONTENT_TYPE", 13, 206}, ++ #endif ++ #ifdef ASN1_R_MIME_PARSE_ERROR ++ {"MIME_PARSE_ERROR", ERR_LIB_ASN1, ASN1_R_MIME_PARSE_ERROR}, ++ #else ++ {"MIME_PARSE_ERROR", 13, 207}, ++ #endif ++ #ifdef ASN1_R_MIME_SIG_PARSE_ERROR ++ {"MIME_SIG_PARSE_ERROR", ERR_LIB_ASN1, ASN1_R_MIME_SIG_PARSE_ERROR}, ++ #else ++ {"MIME_SIG_PARSE_ERROR", 13, 208}, ++ #endif ++ #ifdef ASN1_R_MISSING_EOC ++ {"MISSING_EOC", ERR_LIB_ASN1, ASN1_R_MISSING_EOC}, ++ #else ++ {"MISSING_EOC", 13, 137}, ++ #endif ++ #ifdef ASN1_R_MISSING_SECOND_NUMBER ++ {"MISSING_SECOND_NUMBER", ERR_LIB_ASN1, ASN1_R_MISSING_SECOND_NUMBER}, ++ #else ++ {"MISSING_SECOND_NUMBER", 13, 138}, ++ #endif ++ #ifdef ASN1_R_MISSING_VALUE ++ {"MISSING_VALUE", ERR_LIB_ASN1, ASN1_R_MISSING_VALUE}, ++ #else ++ {"MISSING_VALUE", 13, 189}, ++ #endif ++ #ifdef ASN1_R_MSTRING_NOT_UNIVERSAL ++ {"MSTRING_NOT_UNIVERSAL", ERR_LIB_ASN1, ASN1_R_MSTRING_NOT_UNIVERSAL}, ++ #else ++ {"MSTRING_NOT_UNIVERSAL", 13, 139}, ++ #endif ++ #ifdef ASN1_R_MSTRING_WRONG_TAG ++ {"MSTRING_WRONG_TAG", ERR_LIB_ASN1, ASN1_R_MSTRING_WRONG_TAG}, ++ #else ++ {"MSTRING_WRONG_TAG", 13, 140}, ++ #endif ++ #ifdef ASN1_R_NESTED_ASN1_STRING ++ {"NESTED_ASN1_STRING", ERR_LIB_ASN1, ASN1_R_NESTED_ASN1_STRING}, ++ #else ++ {"NESTED_ASN1_STRING", 13, 197}, ++ #endif ++ #ifdef ASN1_R_NESTED_TOO_DEEP ++ {"NESTED_TOO_DEEP", ERR_LIB_ASN1, ASN1_R_NESTED_TOO_DEEP}, ++ #else ++ {"NESTED_TOO_DEEP", 13, 201}, ++ #endif ++ #ifdef ASN1_R_NON_HEX_CHARACTERS ++ {"NON_HEX_CHARACTERS", ERR_LIB_ASN1, ASN1_R_NON_HEX_CHARACTERS}, ++ #else ++ {"NON_HEX_CHARACTERS", 13, 141}, ++ #endif ++ #ifdef ASN1_R_NOT_ASCII_FORMAT ++ {"NOT_ASCII_FORMAT", ERR_LIB_ASN1, ASN1_R_NOT_ASCII_FORMAT}, ++ #else ++ {"NOT_ASCII_FORMAT", 13, 190}, ++ #endif ++ #ifdef ASN1_R_NOT_ENOUGH_DATA ++ {"NOT_ENOUGH_DATA", ERR_LIB_ASN1, ASN1_R_NOT_ENOUGH_DATA}, ++ #else ++ {"NOT_ENOUGH_DATA", 13, 142}, ++ #endif ++ #ifdef ASN1_R_NO_CONTENT_TYPE ++ {"NO_CONTENT_TYPE", ERR_LIB_ASN1, ASN1_R_NO_CONTENT_TYPE}, ++ #else ++ {"NO_CONTENT_TYPE", 13, 209}, ++ #endif ++ #ifdef ASN1_R_NO_MATCHING_CHOICE_TYPE ++ {"NO_MATCHING_CHOICE_TYPE", ERR_LIB_ASN1, ASN1_R_NO_MATCHING_CHOICE_TYPE}, ++ #else ++ {"NO_MATCHING_CHOICE_TYPE", 13, 143}, ++ #endif ++ #ifdef ASN1_R_NO_MULTIPART_BODY_FAILURE ++ {"NO_MULTIPART_BODY_FAILURE", ERR_LIB_ASN1, ASN1_R_NO_MULTIPART_BODY_FAILURE}, ++ #else ++ {"NO_MULTIPART_BODY_FAILURE", 13, 210}, ++ #endif ++ #ifdef ASN1_R_NO_MULTIPART_BOUNDARY ++ {"NO_MULTIPART_BOUNDARY", ERR_LIB_ASN1, ASN1_R_NO_MULTIPART_BOUNDARY}, ++ #else ++ {"NO_MULTIPART_BOUNDARY", 13, 211}, ++ #endif ++ #ifdef ASN1_R_NO_SIG_CONTENT_TYPE ++ {"NO_SIG_CONTENT_TYPE", ERR_LIB_ASN1, ASN1_R_NO_SIG_CONTENT_TYPE}, ++ #else ++ {"NO_SIG_CONTENT_TYPE", 13, 212}, ++ #endif ++ #ifdef ASN1_R_NULL_IS_WRONG_LENGTH ++ {"NULL_IS_WRONG_LENGTH", ERR_LIB_ASN1, ASN1_R_NULL_IS_WRONG_LENGTH}, ++ #else ++ {"NULL_IS_WRONG_LENGTH", 13, 144}, ++ #endif ++ #ifdef ASN1_R_OBJECT_NOT_ASCII_FORMAT ++ {"OBJECT_NOT_ASCII_FORMAT", ERR_LIB_ASN1, ASN1_R_OBJECT_NOT_ASCII_FORMAT}, ++ #else ++ {"OBJECT_NOT_ASCII_FORMAT", 13, 191}, ++ #endif ++ #ifdef ASN1_R_ODD_NUMBER_OF_CHARS ++ {"ODD_NUMBER_OF_CHARS", ERR_LIB_ASN1, ASN1_R_ODD_NUMBER_OF_CHARS}, ++ #else ++ {"ODD_NUMBER_OF_CHARS", 13, 145}, ++ #endif ++ #ifdef ASN1_R_SECOND_NUMBER_TOO_LARGE ++ {"SECOND_NUMBER_TOO_LARGE", ERR_LIB_ASN1, ASN1_R_SECOND_NUMBER_TOO_LARGE}, ++ #else ++ {"SECOND_NUMBER_TOO_LARGE", 13, 147}, ++ #endif ++ #ifdef ASN1_R_SEQUENCE_LENGTH_MISMATCH ++ {"SEQUENCE_LENGTH_MISMATCH", ERR_LIB_ASN1, ASN1_R_SEQUENCE_LENGTH_MISMATCH}, ++ #else ++ {"SEQUENCE_LENGTH_MISMATCH", 13, 148}, ++ #endif ++ #ifdef ASN1_R_SEQUENCE_NOT_CONSTRUCTED ++ {"SEQUENCE_NOT_CONSTRUCTED", ERR_LIB_ASN1, ASN1_R_SEQUENCE_NOT_CONSTRUCTED}, ++ #else ++ {"SEQUENCE_NOT_CONSTRUCTED", 13, 149}, ++ #endif ++ #ifdef ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG ++ {"SEQUENCE_OR_SET_NEEDS_CONFIG", ERR_LIB_ASN1, ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG}, ++ #else ++ {"SEQUENCE_OR_SET_NEEDS_CONFIG", 13, 192}, ++ #endif ++ #ifdef ASN1_R_SHORT_LINE ++ {"SHORT_LINE", ERR_LIB_ASN1, ASN1_R_SHORT_LINE}, ++ #else ++ {"SHORT_LINE", 13, 150}, ++ #endif ++ #ifdef ASN1_R_SIG_INVALID_MIME_TYPE ++ {"SIG_INVALID_MIME_TYPE", ERR_LIB_ASN1, ASN1_R_SIG_INVALID_MIME_TYPE}, ++ #else ++ {"SIG_INVALID_MIME_TYPE", 13, 213}, ++ #endif ++ #ifdef ASN1_R_STREAMING_NOT_SUPPORTED ++ {"STREAMING_NOT_SUPPORTED", ERR_LIB_ASN1, ASN1_R_STREAMING_NOT_SUPPORTED}, ++ #else ++ {"STREAMING_NOT_SUPPORTED", 13, 202}, ++ #endif ++ #ifdef ASN1_R_STRING_TOO_LONG ++ {"STRING_TOO_LONG", ERR_LIB_ASN1, ASN1_R_STRING_TOO_LONG}, ++ #else ++ {"STRING_TOO_LONG", 13, 151}, ++ #endif ++ #ifdef ASN1_R_STRING_TOO_SHORT ++ {"STRING_TOO_SHORT", ERR_LIB_ASN1, ASN1_R_STRING_TOO_SHORT}, ++ #else ++ {"STRING_TOO_SHORT", 13, 152}, ++ #endif ++ #ifdef ASN1_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD ++ {"THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD", ERR_LIB_ASN1, ASN1_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD}, ++ #else ++ {"THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD", 13, 154}, ++ #endif ++ #ifdef ASN1_R_TIME_NOT_ASCII_FORMAT ++ {"TIME_NOT_ASCII_FORMAT", ERR_LIB_ASN1, ASN1_R_TIME_NOT_ASCII_FORMAT}, ++ #else ++ {"TIME_NOT_ASCII_FORMAT", 13, 193}, ++ #endif ++ #ifdef ASN1_R_TOO_LARGE ++ {"TOO_LARGE", ERR_LIB_ASN1, ASN1_R_TOO_LARGE}, ++ #else ++ {"TOO_LARGE", 13, 223}, ++ #endif ++ #ifdef ASN1_R_TOO_LONG ++ {"TOO_LONG", ERR_LIB_ASN1, ASN1_R_TOO_LONG}, ++ #else ++ {"TOO_LONG", 13, 155}, ++ #endif ++ #ifdef ASN1_R_TOO_SMALL ++ {"TOO_SMALL", ERR_LIB_ASN1, ASN1_R_TOO_SMALL}, ++ #else ++ {"TOO_SMALL", 13, 224}, ++ #endif ++ #ifdef ASN1_R_TYPE_NOT_CONSTRUCTED ++ {"TYPE_NOT_CONSTRUCTED", ERR_LIB_ASN1, ASN1_R_TYPE_NOT_CONSTRUCTED}, ++ #else ++ {"TYPE_NOT_CONSTRUCTED", 13, 156}, ++ #endif ++ #ifdef ASN1_R_TYPE_NOT_PRIMITIVE ++ {"TYPE_NOT_PRIMITIVE", ERR_LIB_ASN1, ASN1_R_TYPE_NOT_PRIMITIVE}, ++ #else ++ {"TYPE_NOT_PRIMITIVE", 13, 195}, ++ #endif ++ #ifdef ASN1_R_UNEXPECTED_EOC ++ {"UNEXPECTED_EOC", ERR_LIB_ASN1, ASN1_R_UNEXPECTED_EOC}, ++ #else ++ {"UNEXPECTED_EOC", 13, 159}, ++ #endif ++ #ifdef ASN1_R_UNIVERSALSTRING_IS_WRONG_LENGTH ++ {"UNIVERSALSTRING_IS_WRONG_LENGTH", ERR_LIB_ASN1, ASN1_R_UNIVERSALSTRING_IS_WRONG_LENGTH}, ++ #else ++ {"UNIVERSALSTRING_IS_WRONG_LENGTH", 13, 215}, ++ #endif ++ #ifdef ASN1_R_UNKNOWN_DIGEST ++ {"UNKNOWN_DIGEST", ERR_LIB_ASN1, ASN1_R_UNKNOWN_DIGEST}, ++ #else ++ {"UNKNOWN_DIGEST", 13, 229}, ++ #endif ++ #ifdef ASN1_R_UNKNOWN_FORMAT ++ {"UNKNOWN_FORMAT", ERR_LIB_ASN1, ASN1_R_UNKNOWN_FORMAT}, ++ #else ++ {"UNKNOWN_FORMAT", 13, 160}, ++ #endif ++ #ifdef ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM ++ {"UNKNOWN_MESSAGE_DIGEST_ALGORITHM", ERR_LIB_ASN1, ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM}, ++ #else ++ {"UNKNOWN_MESSAGE_DIGEST_ALGORITHM", 13, 161}, ++ #endif ++ #ifdef ASN1_R_UNKNOWN_OBJECT_TYPE ++ {"UNKNOWN_OBJECT_TYPE", ERR_LIB_ASN1, ASN1_R_UNKNOWN_OBJECT_TYPE}, ++ #else ++ {"UNKNOWN_OBJECT_TYPE", 13, 162}, ++ #endif ++ #ifdef ASN1_R_UNKNOWN_PUBLIC_KEY_TYPE ++ {"UNKNOWN_PUBLIC_KEY_TYPE", ERR_LIB_ASN1, ASN1_R_UNKNOWN_PUBLIC_KEY_TYPE}, ++ #else ++ {"UNKNOWN_PUBLIC_KEY_TYPE", 13, 163}, ++ #endif ++ #ifdef ASN1_R_UNKNOWN_SIGNATURE_ALGORITHM ++ {"UNKNOWN_SIGNATURE_ALGORITHM", ERR_LIB_ASN1, ASN1_R_UNKNOWN_SIGNATURE_ALGORITHM}, ++ #else ++ {"UNKNOWN_SIGNATURE_ALGORITHM", 13, 199}, ++ #endif ++ #ifdef ASN1_R_UNKNOWN_TAG ++ {"UNKNOWN_TAG", ERR_LIB_ASN1, ASN1_R_UNKNOWN_TAG}, ++ #else ++ {"UNKNOWN_TAG", 13, 194}, ++ #endif ++ #ifdef ASN1_R_UNSUPPORTED_ANY_DEFINED_BY_TYPE ++ {"UNSUPPORTED_ANY_DEFINED_BY_TYPE", ERR_LIB_ASN1, ASN1_R_UNSUPPORTED_ANY_DEFINED_BY_TYPE}, ++ #else ++ {"UNSUPPORTED_ANY_DEFINED_BY_TYPE", 13, 164}, ++ #endif ++ #ifdef ASN1_R_UNSUPPORTED_CIPHER ++ {"UNSUPPORTED_CIPHER", ERR_LIB_ASN1, ASN1_R_UNSUPPORTED_CIPHER}, ++ #else ++ {"UNSUPPORTED_CIPHER", 13, 228}, ++ #endif ++ #ifdef ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE ++ {"UNSUPPORTED_PUBLIC_KEY_TYPE", ERR_LIB_ASN1, ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE}, ++ #else ++ {"UNSUPPORTED_PUBLIC_KEY_TYPE", 13, 167}, ++ #endif ++ #ifdef ASN1_R_UNSUPPORTED_TYPE ++ {"UNSUPPORTED_TYPE", ERR_LIB_ASN1, ASN1_R_UNSUPPORTED_TYPE}, ++ #else ++ {"UNSUPPORTED_TYPE", 13, 196}, ++ #endif ++ #ifdef ASN1_R_UTCTIME_IS_TOO_SHORT ++ {"UTCTIME_IS_TOO_SHORT", ERR_LIB_ASN1, ASN1_R_UTCTIME_IS_TOO_SHORT}, ++ #else ++ {"UTCTIME_IS_TOO_SHORT", 13, 233}, ++ #endif ++ #ifdef ASN1_R_WRONG_INTEGER_TYPE ++ {"WRONG_INTEGER_TYPE", ERR_LIB_ASN1, ASN1_R_WRONG_INTEGER_TYPE}, ++ #else ++ {"WRONG_INTEGER_TYPE", 13, 225}, ++ #endif ++ #ifdef ASN1_R_WRONG_PUBLIC_KEY_TYPE ++ {"WRONG_PUBLIC_KEY_TYPE", ERR_LIB_ASN1, ASN1_R_WRONG_PUBLIC_KEY_TYPE}, ++ #else ++ {"WRONG_PUBLIC_KEY_TYPE", 13, 200}, ++ #endif ++ #ifdef ASN1_R_WRONG_TAG ++ {"WRONG_TAG", ERR_LIB_ASN1, ASN1_R_WRONG_TAG}, ++ #else ++ {"WRONG_TAG", 13, 168}, ++ #endif ++ #ifdef ASYNC_R_FAILED_TO_SET_POOL ++ {"FAILED_TO_SET_POOL", ERR_LIB_ASYNC, ASYNC_R_FAILED_TO_SET_POOL}, ++ #else ++ {"FAILED_TO_SET_POOL", 51, 101}, ++ #endif ++ #ifdef ASYNC_R_FAILED_TO_SWAP_CONTEXT ++ {"FAILED_TO_SWAP_CONTEXT", ERR_LIB_ASYNC, ASYNC_R_FAILED_TO_SWAP_CONTEXT}, ++ #else ++ {"FAILED_TO_SWAP_CONTEXT", 51, 102}, ++ #endif ++ #ifdef ASYNC_R_INIT_FAILED ++ {"INIT_FAILED", ERR_LIB_ASYNC, ASYNC_R_INIT_FAILED}, ++ #else ++ {"INIT_FAILED", 51, 105}, ++ #endif ++ #ifdef ASYNC_R_INVALID_POOL_SIZE ++ {"INVALID_POOL_SIZE", ERR_LIB_ASYNC, ASYNC_R_INVALID_POOL_SIZE}, ++ #else ++ {"INVALID_POOL_SIZE", 51, 103}, ++ #endif ++ #ifdef BIO_R_ACCEPT_ERROR ++ {"ACCEPT_ERROR", ERR_LIB_BIO, BIO_R_ACCEPT_ERROR}, ++ #else ++ {"ACCEPT_ERROR", 32, 100}, ++ #endif ++ #ifdef BIO_R_ADDRINFO_ADDR_IS_NOT_AF_INET ++ {"ADDRINFO_ADDR_IS_NOT_AF_INET", ERR_LIB_BIO, BIO_R_ADDRINFO_ADDR_IS_NOT_AF_INET}, ++ #else ++ {"ADDRINFO_ADDR_IS_NOT_AF_INET", 32, 141}, ++ #endif ++ #ifdef BIO_R_AMBIGUOUS_HOST_OR_SERVICE ++ {"AMBIGUOUS_HOST_OR_SERVICE", ERR_LIB_BIO, BIO_R_AMBIGUOUS_HOST_OR_SERVICE}, ++ #else ++ {"AMBIGUOUS_HOST_OR_SERVICE", 32, 129}, ++ #endif ++ #ifdef BIO_R_BAD_FOPEN_MODE ++ {"BAD_FOPEN_MODE", ERR_LIB_BIO, BIO_R_BAD_FOPEN_MODE}, ++ #else ++ {"BAD_FOPEN_MODE", 32, 101}, ++ #endif ++ #ifdef BIO_R_BROKEN_PIPE ++ {"BROKEN_PIPE", ERR_LIB_BIO, BIO_R_BROKEN_PIPE}, ++ #else ++ {"BROKEN_PIPE", 32, 124}, ++ #endif ++ #ifdef BIO_R_CONNECT_ERROR ++ {"CONNECT_ERROR", ERR_LIB_BIO, BIO_R_CONNECT_ERROR}, ++ #else ++ {"CONNECT_ERROR", 32, 103}, ++ #endif ++ #ifdef BIO_R_CONNECT_TIMEOUT ++ {"CONNECT_TIMEOUT", ERR_LIB_BIO, BIO_R_CONNECT_TIMEOUT}, ++ #else ++ {"CONNECT_TIMEOUT", 32, 147}, ++ #endif ++ #ifdef BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET ++ {"GETHOSTBYNAME_ADDR_IS_NOT_AF_INET", ERR_LIB_BIO, BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET}, ++ #else ++ {"GETHOSTBYNAME_ADDR_IS_NOT_AF_INET", 32, 107}, ++ #endif ++ #ifdef BIO_R_GETSOCKNAME_ERROR ++ {"GETSOCKNAME_ERROR", ERR_LIB_BIO, BIO_R_GETSOCKNAME_ERROR}, ++ #else ++ {"GETSOCKNAME_ERROR", 32, 132}, ++ #endif ++ #ifdef BIO_R_GETSOCKNAME_TRUNCATED_ADDRESS ++ {"GETSOCKNAME_TRUNCATED_ADDRESS", ERR_LIB_BIO, BIO_R_GETSOCKNAME_TRUNCATED_ADDRESS}, ++ #else ++ {"GETSOCKNAME_TRUNCATED_ADDRESS", 32, 133}, ++ #endif ++ #ifdef BIO_R_GETTING_SOCKTYPE ++ {"GETTING_SOCKTYPE", ERR_LIB_BIO, BIO_R_GETTING_SOCKTYPE}, ++ #else ++ {"GETTING_SOCKTYPE", 32, 134}, ++ #endif ++ #ifdef BIO_R_INVALID_ARGUMENT ++ {"INVALID_ARGUMENT", ERR_LIB_BIO, BIO_R_INVALID_ARGUMENT}, ++ #else ++ {"INVALID_ARGUMENT", 32, 125}, ++ #endif ++ #ifdef BIO_R_INVALID_SOCKET ++ {"INVALID_SOCKET", ERR_LIB_BIO, BIO_R_INVALID_SOCKET}, ++ #else ++ {"INVALID_SOCKET", 32, 135}, ++ #endif ++ #ifdef BIO_R_IN_USE ++ {"IN_USE", ERR_LIB_BIO, BIO_R_IN_USE}, ++ #else ++ {"IN_USE", 32, 123}, ++ #endif ++ #ifdef BIO_R_LENGTH_TOO_LONG ++ {"LENGTH_TOO_LONG", ERR_LIB_BIO, BIO_R_LENGTH_TOO_LONG}, ++ #else ++ {"LENGTH_TOO_LONG", 32, 102}, ++ #endif ++ #ifdef BIO_R_LISTEN_V6_ONLY ++ {"LISTEN_V6_ONLY", ERR_LIB_BIO, BIO_R_LISTEN_V6_ONLY}, ++ #else ++ {"LISTEN_V6_ONLY", 32, 136}, ++ #endif ++ #ifdef BIO_R_LOCAL_ADDR_NOT_AVAILABLE ++ {"LOCAL_ADDR_NOT_AVAILABLE", ERR_LIB_BIO, BIO_R_LOCAL_ADDR_NOT_AVAILABLE}, ++ #else ++ {"LOCAL_ADDR_NOT_AVAILABLE", 32, 111}, ++ #endif ++ #ifdef BIO_R_LOOKUP_RETURNED_NOTHING ++ {"LOOKUP_RETURNED_NOTHING", ERR_LIB_BIO, BIO_R_LOOKUP_RETURNED_NOTHING}, ++ #else ++ {"LOOKUP_RETURNED_NOTHING", 32, 142}, ++ #endif ++ #ifdef BIO_R_MALFORMED_HOST_OR_SERVICE ++ {"MALFORMED_HOST_OR_SERVICE", ERR_LIB_BIO, BIO_R_MALFORMED_HOST_OR_SERVICE}, ++ #else ++ {"MALFORMED_HOST_OR_SERVICE", 32, 130}, ++ #endif ++ #ifdef BIO_R_NBIO_CONNECT_ERROR ++ {"NBIO_CONNECT_ERROR", ERR_LIB_BIO, BIO_R_NBIO_CONNECT_ERROR}, ++ #else ++ {"NBIO_CONNECT_ERROR", 32, 110}, ++ #endif ++ #ifdef BIO_R_NON_FATAL ++ {"NON_FATAL", ERR_LIB_BIO, BIO_R_NON_FATAL}, ++ #else ++ {"NON_FATAL", 32, 112}, ++ #endif ++ #ifdef BIO_R_NO_ACCEPT_ADDR_OR_SERVICE_SPECIFIED ++ {"NO_ACCEPT_ADDR_OR_SERVICE_SPECIFIED", ERR_LIB_BIO, BIO_R_NO_ACCEPT_ADDR_OR_SERVICE_SPECIFIED}, ++ #else ++ {"NO_ACCEPT_ADDR_OR_SERVICE_SPECIFIED", 32, 143}, ++ #endif ++ #ifdef BIO_R_NO_HOSTNAME_OR_SERVICE_SPECIFIED ++ {"NO_HOSTNAME_OR_SERVICE_SPECIFIED", ERR_LIB_BIO, BIO_R_NO_HOSTNAME_OR_SERVICE_SPECIFIED}, ++ #else ++ {"NO_HOSTNAME_OR_SERVICE_SPECIFIED", 32, 144}, ++ #endif ++ #ifdef BIO_R_NO_PORT_DEFINED ++ {"NO_PORT_DEFINED", ERR_LIB_BIO, BIO_R_NO_PORT_DEFINED}, ++ #else ++ {"NO_PORT_DEFINED", 32, 113}, ++ #endif ++ #ifdef BIO_R_NO_SUCH_FILE ++ {"NO_SUCH_FILE", ERR_LIB_BIO, BIO_R_NO_SUCH_FILE}, ++ #else ++ {"NO_SUCH_FILE", 32, 128}, ++ #endif ++ #ifdef BIO_R_PEER_ADDR_NOT_AVAILABLE ++ {"PEER_ADDR_NOT_AVAILABLE", ERR_LIB_BIO, BIO_R_PEER_ADDR_NOT_AVAILABLE}, ++ #else ++ {"PEER_ADDR_NOT_AVAILABLE", 32, 114}, ++ #endif ++ #ifdef BIO_R_PORT_MISMATCH ++ {"PORT_MISMATCH", ERR_LIB_BIO, BIO_R_PORT_MISMATCH}, ++ #else ++ {"PORT_MISMATCH", 32, 150}, ++ #endif ++ #ifdef BIO_R_TFO_DISABLED ++ {"TFO_DISABLED", ERR_LIB_BIO, BIO_R_TFO_DISABLED}, ++ #else ++ {"TFO_DISABLED", 32, 106}, ++ #endif ++ #ifdef BIO_R_TFO_NO_KERNEL_SUPPORT ++ {"TFO_NO_KERNEL_SUPPORT", ERR_LIB_BIO, BIO_R_TFO_NO_KERNEL_SUPPORT}, ++ #else ++ {"TFO_NO_KERNEL_SUPPORT", 32, 108}, ++ #endif ++ #ifdef BIO_R_TRANSFER_ERROR ++ {"TRANSFER_ERROR", ERR_LIB_BIO, BIO_R_TRANSFER_ERROR}, ++ #else ++ {"TRANSFER_ERROR", 32, 104}, ++ #endif ++ #ifdef BIO_R_TRANSFER_TIMEOUT ++ {"TRANSFER_TIMEOUT", ERR_LIB_BIO, BIO_R_TRANSFER_TIMEOUT}, ++ #else ++ {"TRANSFER_TIMEOUT", 32, 105}, ++ #endif ++ #ifdef BIO_R_UNABLE_TO_BIND_SOCKET ++ {"UNABLE_TO_BIND_SOCKET", ERR_LIB_BIO, BIO_R_UNABLE_TO_BIND_SOCKET}, ++ #else ++ {"UNABLE_TO_BIND_SOCKET", 32, 117}, ++ #endif ++ #ifdef BIO_R_UNABLE_TO_CREATE_SOCKET ++ {"UNABLE_TO_CREATE_SOCKET", ERR_LIB_BIO, BIO_R_UNABLE_TO_CREATE_SOCKET}, ++ #else ++ {"UNABLE_TO_CREATE_SOCKET", 32, 118}, ++ #endif ++ #ifdef BIO_R_UNABLE_TO_KEEPALIVE ++ {"UNABLE_TO_KEEPALIVE", ERR_LIB_BIO, BIO_R_UNABLE_TO_KEEPALIVE}, ++ #else ++ {"UNABLE_TO_KEEPALIVE", 32, 137}, ++ #endif ++ #ifdef BIO_R_UNABLE_TO_LISTEN_SOCKET ++ {"UNABLE_TO_LISTEN_SOCKET", ERR_LIB_BIO, BIO_R_UNABLE_TO_LISTEN_SOCKET}, ++ #else ++ {"UNABLE_TO_LISTEN_SOCKET", 32, 119}, ++ #endif ++ #ifdef BIO_R_UNABLE_TO_NODELAY ++ {"UNABLE_TO_NODELAY", ERR_LIB_BIO, BIO_R_UNABLE_TO_NODELAY}, ++ #else ++ {"UNABLE_TO_NODELAY", 32, 138}, ++ #endif ++ #ifdef BIO_R_UNABLE_TO_REUSEADDR ++ {"UNABLE_TO_REUSEADDR", ERR_LIB_BIO, BIO_R_UNABLE_TO_REUSEADDR}, ++ #else ++ {"UNABLE_TO_REUSEADDR", 32, 139}, ++ #endif ++ #ifdef BIO_R_UNABLE_TO_TFO ++ {"UNABLE_TO_TFO", ERR_LIB_BIO, BIO_R_UNABLE_TO_TFO}, ++ #else ++ {"UNABLE_TO_TFO", 32, 109}, ++ #endif ++ #ifdef BIO_R_UNAVAILABLE_IP_FAMILY ++ {"UNAVAILABLE_IP_FAMILY", ERR_LIB_BIO, BIO_R_UNAVAILABLE_IP_FAMILY}, ++ #else ++ {"UNAVAILABLE_IP_FAMILY", 32, 145}, ++ #endif ++ #ifdef BIO_R_UNINITIALIZED ++ {"UNINITIALIZED", ERR_LIB_BIO, BIO_R_UNINITIALIZED}, ++ #else ++ {"UNINITIALIZED", 32, 120}, ++ #endif ++ #ifdef BIO_R_UNKNOWN_INFO_TYPE ++ {"UNKNOWN_INFO_TYPE", ERR_LIB_BIO, BIO_R_UNKNOWN_INFO_TYPE}, ++ #else ++ {"UNKNOWN_INFO_TYPE", 32, 140}, ++ #endif ++ #ifdef BIO_R_UNSUPPORTED_IP_FAMILY ++ {"UNSUPPORTED_IP_FAMILY", ERR_LIB_BIO, BIO_R_UNSUPPORTED_IP_FAMILY}, ++ #else ++ {"UNSUPPORTED_IP_FAMILY", 32, 146}, ++ #endif ++ #ifdef BIO_R_UNSUPPORTED_METHOD ++ {"UNSUPPORTED_METHOD", ERR_LIB_BIO, BIO_R_UNSUPPORTED_METHOD}, ++ #else ++ {"UNSUPPORTED_METHOD", 32, 121}, ++ #endif ++ #ifdef BIO_R_UNSUPPORTED_PROTOCOL_FAMILY ++ {"UNSUPPORTED_PROTOCOL_FAMILY", ERR_LIB_BIO, BIO_R_UNSUPPORTED_PROTOCOL_FAMILY}, ++ #else ++ {"UNSUPPORTED_PROTOCOL_FAMILY", 32, 131}, ++ #endif ++ #ifdef BIO_R_WRITE_TO_READ_ONLY_BIO ++ {"WRITE_TO_READ_ONLY_BIO", ERR_LIB_BIO, BIO_R_WRITE_TO_READ_ONLY_BIO}, ++ #else ++ {"WRITE_TO_READ_ONLY_BIO", 32, 126}, ++ #endif ++ #ifdef BIO_R_WSASTARTUP ++ {"WSASTARTUP", ERR_LIB_BIO, BIO_R_WSASTARTUP}, ++ #else ++ {"WSASTARTUP", 32, 122}, ++ #endif ++ #ifdef BN_R_ARG2_LT_ARG3 ++ {"ARG2_LT_ARG3", ERR_LIB_BN, BN_R_ARG2_LT_ARG3}, ++ #else ++ {"ARG2_LT_ARG3", 3, 100}, ++ #endif ++ #ifdef BN_R_BAD_RECIPROCAL ++ {"BAD_RECIPROCAL", ERR_LIB_BN, BN_R_BAD_RECIPROCAL}, ++ #else ++ {"BAD_RECIPROCAL", 3, 101}, ++ #endif ++ #ifdef BN_R_BIGNUM_TOO_LONG ++ {"BIGNUM_TOO_LONG", ERR_LIB_BN, BN_R_BIGNUM_TOO_LONG}, ++ #else ++ {"BIGNUM_TOO_LONG", 3, 114}, ++ #endif ++ #ifdef BN_R_BITS_TOO_SMALL ++ {"BITS_TOO_SMALL", ERR_LIB_BN, BN_R_BITS_TOO_SMALL}, ++ #else ++ {"BITS_TOO_SMALL", 3, 118}, ++ #endif ++ #ifdef BN_R_CALLED_WITH_EVEN_MODULUS ++ {"CALLED_WITH_EVEN_MODULUS", ERR_LIB_BN, BN_R_CALLED_WITH_EVEN_MODULUS}, ++ #else ++ {"CALLED_WITH_EVEN_MODULUS", 3, 102}, ++ #endif ++ #ifdef BN_R_DIV_BY_ZERO ++ {"DIV_BY_ZERO", ERR_LIB_BN, BN_R_DIV_BY_ZERO}, ++ #else ++ {"DIV_BY_ZERO", 3, 103}, ++ #endif ++ #ifdef BN_R_ENCODING_ERROR ++ {"ENCODING_ERROR", ERR_LIB_BN, BN_R_ENCODING_ERROR}, ++ #else ++ {"ENCODING_ERROR", 3, 104}, ++ #endif ++ #ifdef BN_R_EXPAND_ON_STATIC_BIGNUM_DATA ++ {"EXPAND_ON_STATIC_BIGNUM_DATA", ERR_LIB_BN, BN_R_EXPAND_ON_STATIC_BIGNUM_DATA}, ++ #else ++ {"EXPAND_ON_STATIC_BIGNUM_DATA", 3, 105}, ++ #endif ++ #ifdef BN_R_INPUT_NOT_REDUCED ++ {"INPUT_NOT_REDUCED", ERR_LIB_BN, BN_R_INPUT_NOT_REDUCED}, ++ #else ++ {"INPUT_NOT_REDUCED", 3, 110}, ++ #endif ++ #ifdef BN_R_INVALID_LENGTH ++ {"INVALID_LENGTH", ERR_LIB_BN, BN_R_INVALID_LENGTH}, ++ #else ++ {"INVALID_LENGTH", 3, 106}, ++ #endif ++ #ifdef BN_R_INVALID_RANGE ++ {"INVALID_RANGE", ERR_LIB_BN, BN_R_INVALID_RANGE}, ++ #else ++ {"INVALID_RANGE", 3, 115}, ++ #endif ++ #ifdef BN_R_INVALID_SHIFT ++ {"INVALID_SHIFT", ERR_LIB_BN, BN_R_INVALID_SHIFT}, ++ #else ++ {"INVALID_SHIFT", 3, 119}, ++ #endif ++ #ifdef BN_R_NOT_A_SQUARE ++ {"NOT_A_SQUARE", ERR_LIB_BN, BN_R_NOT_A_SQUARE}, ++ #else ++ {"NOT_A_SQUARE", 3, 111}, ++ #endif ++ #ifdef BN_R_NOT_INITIALIZED ++ {"NOT_INITIALIZED", ERR_LIB_BN, BN_R_NOT_INITIALIZED}, ++ #else ++ {"NOT_INITIALIZED", 3, 107}, ++ #endif ++ #ifdef BN_R_NO_INVERSE ++ {"NO_INVERSE", ERR_LIB_BN, BN_R_NO_INVERSE}, ++ #else ++ {"NO_INVERSE", 3, 108}, ++ #endif ++ #ifdef BN_R_NO_PRIME_CANDIDATE ++ {"NO_PRIME_CANDIDATE", ERR_LIB_BN, BN_R_NO_PRIME_CANDIDATE}, ++ #else ++ {"NO_PRIME_CANDIDATE", 3, 121}, ++ #endif ++ #ifdef BN_R_NO_SOLUTION ++ {"NO_SOLUTION", ERR_LIB_BN, BN_R_NO_SOLUTION}, ++ #else ++ {"NO_SOLUTION", 3, 116}, ++ #endif ++ #ifdef BN_R_NO_SUITABLE_DIGEST ++ {"NO_SUITABLE_DIGEST", ERR_LIB_BN, BN_R_NO_SUITABLE_DIGEST}, ++ #else ++ {"NO_SUITABLE_DIGEST", 3, 120}, ++ #endif ++ #ifdef BN_R_PRIVATE_KEY_TOO_LARGE ++ {"PRIVATE_KEY_TOO_LARGE", ERR_LIB_BN, BN_R_PRIVATE_KEY_TOO_LARGE}, ++ #else ++ {"PRIVATE_KEY_TOO_LARGE", 3, 117}, ++ #endif ++ #ifdef BN_R_P_IS_NOT_PRIME ++ {"P_IS_NOT_PRIME", ERR_LIB_BN, BN_R_P_IS_NOT_PRIME}, ++ #else ++ {"P_IS_NOT_PRIME", 3, 112}, ++ #endif ++ #ifdef BN_R_TOO_MANY_ITERATIONS ++ {"TOO_MANY_ITERATIONS", ERR_LIB_BN, BN_R_TOO_MANY_ITERATIONS}, ++ #else ++ {"TOO_MANY_ITERATIONS", 3, 113}, ++ #endif ++ #ifdef BN_R_TOO_MANY_TEMPORARY_VARIABLES ++ {"TOO_MANY_TEMPORARY_VARIABLES", ERR_LIB_BN, BN_R_TOO_MANY_TEMPORARY_VARIABLES}, ++ #else ++ {"TOO_MANY_TEMPORARY_VARIABLES", 3, 109}, ++ #endif ++ #ifdef CMP_R_ALGORITHM_NOT_SUPPORTED ++ {"ALGORITHM_NOT_SUPPORTED", ERR_LIB_CMP, CMP_R_ALGORITHM_NOT_SUPPORTED}, ++ #else ++ {"ALGORITHM_NOT_SUPPORTED", 58, 139}, ++ #endif ++ #ifdef CMP_R_BAD_CHECKAFTER_IN_POLLREP ++ {"BAD_CHECKAFTER_IN_POLLREP", ERR_LIB_CMP, CMP_R_BAD_CHECKAFTER_IN_POLLREP}, ++ #else ++ {"BAD_CHECKAFTER_IN_POLLREP", 58, 167}, ++ #endif ++ #ifdef CMP_R_BAD_REQUEST_ID ++ {"BAD_REQUEST_ID", ERR_LIB_CMP, CMP_R_BAD_REQUEST_ID}, ++ #else ++ {"BAD_REQUEST_ID", 58, 108}, ++ #endif ++ #ifdef CMP_R_CERTHASH_UNMATCHED ++ {"CERTHASH_UNMATCHED", ERR_LIB_CMP, CMP_R_CERTHASH_UNMATCHED}, ++ #else ++ {"CERTHASH_UNMATCHED", 58, 156}, ++ #endif ++ #ifdef CMP_R_CERTID_NOT_FOUND ++ {"CERTID_NOT_FOUND", ERR_LIB_CMP, CMP_R_CERTID_NOT_FOUND}, ++ #else ++ {"CERTID_NOT_FOUND", 58, 109}, ++ #endif ++ #ifdef CMP_R_CERTIFICATE_NOT_ACCEPTED ++ {"CERTIFICATE_NOT_ACCEPTED", ERR_LIB_CMP, CMP_R_CERTIFICATE_NOT_ACCEPTED}, ++ #else ++ {"CERTIFICATE_NOT_ACCEPTED", 58, 169}, ++ #endif ++ #ifdef CMP_R_CERTIFICATE_NOT_FOUND ++ {"CERTIFICATE_NOT_FOUND", ERR_LIB_CMP, CMP_R_CERTIFICATE_NOT_FOUND}, ++ #else ++ {"CERTIFICATE_NOT_FOUND", 58, 112}, ++ #endif ++ #ifdef CMP_R_CERTREQMSG_NOT_FOUND ++ {"CERTREQMSG_NOT_FOUND", ERR_LIB_CMP, CMP_R_CERTREQMSG_NOT_FOUND}, ++ #else ++ {"CERTREQMSG_NOT_FOUND", 58, 157}, ++ #endif ++ #ifdef CMP_R_CERTRESPONSE_NOT_FOUND ++ {"CERTRESPONSE_NOT_FOUND", ERR_LIB_CMP, CMP_R_CERTRESPONSE_NOT_FOUND}, ++ #else ++ {"CERTRESPONSE_NOT_FOUND", 58, 113}, ++ #endif ++ #ifdef CMP_R_CERT_AND_KEY_DO_NOT_MATCH ++ {"CERT_AND_KEY_DO_NOT_MATCH", ERR_LIB_CMP, CMP_R_CERT_AND_KEY_DO_NOT_MATCH}, ++ #else ++ {"CERT_AND_KEY_DO_NOT_MATCH", 58, 114}, ++ #endif ++ #ifdef CMP_R_CHECKAFTER_OUT_OF_RANGE ++ {"CHECKAFTER_OUT_OF_RANGE", ERR_LIB_CMP, CMP_R_CHECKAFTER_OUT_OF_RANGE}, ++ #else ++ {"CHECKAFTER_OUT_OF_RANGE", 58, 181}, ++ #endif ++ #ifdef CMP_R_ENCOUNTERED_KEYUPDATEWARNING ++ {"ENCOUNTERED_KEYUPDATEWARNING", ERR_LIB_CMP, CMP_R_ENCOUNTERED_KEYUPDATEWARNING}, ++ #else ++ {"ENCOUNTERED_KEYUPDATEWARNING", 58, 176}, ++ #endif ++ #ifdef CMP_R_ENCOUNTERED_WAITING ++ {"ENCOUNTERED_WAITING", ERR_LIB_CMP, CMP_R_ENCOUNTERED_WAITING}, ++ #else ++ {"ENCOUNTERED_WAITING", 58, 162}, ++ #endif ++ #ifdef CMP_R_ERROR_CALCULATING_PROTECTION ++ {"ERROR_CALCULATING_PROTECTION", ERR_LIB_CMP, CMP_R_ERROR_CALCULATING_PROTECTION}, ++ #else ++ {"ERROR_CALCULATING_PROTECTION", 58, 115}, ++ #endif ++ #ifdef CMP_R_ERROR_CREATING_CERTCONF ++ {"ERROR_CREATING_CERTCONF", ERR_LIB_CMP, CMP_R_ERROR_CREATING_CERTCONF}, ++ #else ++ {"ERROR_CREATING_CERTCONF", 58, 116}, ++ #endif ++ #ifdef CMP_R_ERROR_CREATING_CERTREP ++ {"ERROR_CREATING_CERTREP", ERR_LIB_CMP, CMP_R_ERROR_CREATING_CERTREP}, ++ #else ++ {"ERROR_CREATING_CERTREP", 58, 117}, ++ #endif ++ #ifdef CMP_R_ERROR_CREATING_CERTREQ ++ {"ERROR_CREATING_CERTREQ", ERR_LIB_CMP, CMP_R_ERROR_CREATING_CERTREQ}, ++ #else ++ {"ERROR_CREATING_CERTREQ", 58, 163}, ++ #endif ++ #ifdef CMP_R_ERROR_CREATING_ERROR ++ {"ERROR_CREATING_ERROR", ERR_LIB_CMP, CMP_R_ERROR_CREATING_ERROR}, ++ #else ++ {"ERROR_CREATING_ERROR", 58, 118}, ++ #endif ++ #ifdef CMP_R_ERROR_CREATING_GENM ++ {"ERROR_CREATING_GENM", ERR_LIB_CMP, CMP_R_ERROR_CREATING_GENM}, ++ #else ++ {"ERROR_CREATING_GENM", 58, 119}, ++ #endif ++ #ifdef CMP_R_ERROR_CREATING_GENP ++ {"ERROR_CREATING_GENP", ERR_LIB_CMP, CMP_R_ERROR_CREATING_GENP}, ++ #else ++ {"ERROR_CREATING_GENP", 58, 120}, ++ #endif ++ #ifdef CMP_R_ERROR_CREATING_PKICONF ++ {"ERROR_CREATING_PKICONF", ERR_LIB_CMP, CMP_R_ERROR_CREATING_PKICONF}, ++ #else ++ {"ERROR_CREATING_PKICONF", 58, 122}, ++ #endif ++ #ifdef CMP_R_ERROR_CREATING_POLLREP ++ {"ERROR_CREATING_POLLREP", ERR_LIB_CMP, CMP_R_ERROR_CREATING_POLLREP}, ++ #else ++ {"ERROR_CREATING_POLLREP", 58, 123}, ++ #endif ++ #ifdef CMP_R_ERROR_CREATING_POLLREQ ++ {"ERROR_CREATING_POLLREQ", ERR_LIB_CMP, CMP_R_ERROR_CREATING_POLLREQ}, ++ #else ++ {"ERROR_CREATING_POLLREQ", 58, 124}, ++ #endif ++ #ifdef CMP_R_ERROR_CREATING_RP ++ {"ERROR_CREATING_RP", ERR_LIB_CMP, CMP_R_ERROR_CREATING_RP}, ++ #else ++ {"ERROR_CREATING_RP", 58, 125}, ++ #endif ++ #ifdef CMP_R_ERROR_CREATING_RR ++ {"ERROR_CREATING_RR", ERR_LIB_CMP, CMP_R_ERROR_CREATING_RR}, ++ #else ++ {"ERROR_CREATING_RR", 58, 126}, ++ #endif ++ #ifdef CMP_R_ERROR_PARSING_PKISTATUS ++ {"ERROR_PARSING_PKISTATUS", ERR_LIB_CMP, CMP_R_ERROR_PARSING_PKISTATUS}, ++ #else ++ {"ERROR_PARSING_PKISTATUS", 58, 107}, ++ #endif ++ #ifdef CMP_R_ERROR_PROCESSING_MESSAGE ++ {"ERROR_PROCESSING_MESSAGE", ERR_LIB_CMP, CMP_R_ERROR_PROCESSING_MESSAGE}, ++ #else ++ {"ERROR_PROCESSING_MESSAGE", 58, 158}, ++ #endif ++ #ifdef CMP_R_ERROR_PROTECTING_MESSAGE ++ {"ERROR_PROTECTING_MESSAGE", ERR_LIB_CMP, CMP_R_ERROR_PROTECTING_MESSAGE}, ++ #else ++ {"ERROR_PROTECTING_MESSAGE", 58, 127}, ++ #endif ++ #ifdef CMP_R_ERROR_SETTING_CERTHASH ++ {"ERROR_SETTING_CERTHASH", ERR_LIB_CMP, CMP_R_ERROR_SETTING_CERTHASH}, ++ #else ++ {"ERROR_SETTING_CERTHASH", 58, 128}, ++ #endif ++ #ifdef CMP_R_ERROR_UNEXPECTED_CERTCONF ++ {"ERROR_UNEXPECTED_CERTCONF", ERR_LIB_CMP, CMP_R_ERROR_UNEXPECTED_CERTCONF}, ++ #else ++ {"ERROR_UNEXPECTED_CERTCONF", 58, 160}, ++ #endif ++ #ifdef CMP_R_ERROR_VALIDATING_PROTECTION ++ {"ERROR_VALIDATING_PROTECTION", ERR_LIB_CMP, CMP_R_ERROR_VALIDATING_PROTECTION}, ++ #else ++ {"ERROR_VALIDATING_PROTECTION", 58, 140}, ++ #endif ++ #ifdef CMP_R_ERROR_VALIDATING_SIGNATURE ++ {"ERROR_VALIDATING_SIGNATURE", ERR_LIB_CMP, CMP_R_ERROR_VALIDATING_SIGNATURE}, ++ #else ++ {"ERROR_VALIDATING_SIGNATURE", 58, 171}, ++ #endif ++ #ifdef CMP_R_EXPECTED_POLLREQ ++ {"EXPECTED_POLLREQ", ERR_LIB_CMP, CMP_R_EXPECTED_POLLREQ}, ++ #else ++ {"EXPECTED_POLLREQ", 58, 104}, ++ #endif ++ #ifdef CMP_R_FAILED_BUILDING_OWN_CHAIN ++ {"FAILED_BUILDING_OWN_CHAIN", ERR_LIB_CMP, CMP_R_FAILED_BUILDING_OWN_CHAIN}, ++ #else ++ {"FAILED_BUILDING_OWN_CHAIN", 58, 164}, ++ #endif ++ #ifdef CMP_R_FAILED_EXTRACTING_PUBKEY ++ {"FAILED_EXTRACTING_PUBKEY", ERR_LIB_CMP, CMP_R_FAILED_EXTRACTING_PUBKEY}, ++ #else ++ {"FAILED_EXTRACTING_PUBKEY", 58, 141}, ++ #endif ++ #ifdef CMP_R_FAILURE_OBTAINING_RANDOM ++ {"FAILURE_OBTAINING_RANDOM", ERR_LIB_CMP, CMP_R_FAILURE_OBTAINING_RANDOM}, ++ #else ++ {"FAILURE_OBTAINING_RANDOM", 58, 110}, ++ #endif ++ #ifdef CMP_R_FAIL_INFO_OUT_OF_RANGE ++ {"FAIL_INFO_OUT_OF_RANGE", ERR_LIB_CMP, CMP_R_FAIL_INFO_OUT_OF_RANGE}, ++ #else ++ {"FAIL_INFO_OUT_OF_RANGE", 58, 129}, ++ #endif ++ #ifdef CMP_R_GENERATE_CERTREQTEMPLATE ++ {"GENERATE_CERTREQTEMPLATE", ERR_LIB_CMP, CMP_R_GENERATE_CERTREQTEMPLATE}, ++ #else ++ {"GENERATE_CERTREQTEMPLATE", 58, 197}, ++ #endif ++ #ifdef CMP_R_GENERATE_CRLSTATUS ++ {"GENERATE_CRLSTATUS", ERR_LIB_CMP, CMP_R_GENERATE_CRLSTATUS}, ++ #else ++ {"GENERATE_CRLSTATUS", 58, 198}, ++ #endif ++ #ifdef CMP_R_GETTING_GENP ++ {"GETTING_GENP", ERR_LIB_CMP, CMP_R_GETTING_GENP}, ++ #else ++ {"GETTING_GENP", 58, 192}, ++ #endif ++ #ifdef CMP_R_GET_ITAV ++ {"GET_ITAV", ERR_LIB_CMP, CMP_R_GET_ITAV}, ++ #else ++ {"GET_ITAV", 58, 199}, ++ #endif ++ #ifdef CMP_R_INVALID_ARGS ++ {"INVALID_ARGS", ERR_LIB_CMP, CMP_R_INVALID_ARGS}, ++ #else ++ {"INVALID_ARGS", 58, 100}, ++ #endif ++ #ifdef CMP_R_INVALID_GENP ++ {"INVALID_GENP", ERR_LIB_CMP, CMP_R_INVALID_GENP}, ++ #else ++ {"INVALID_GENP", 58, 193}, ++ #endif ++ #ifdef CMP_R_INVALID_KEYSPEC ++ {"INVALID_KEYSPEC", ERR_LIB_CMP, CMP_R_INVALID_KEYSPEC}, ++ #else ++ {"INVALID_KEYSPEC", 58, 202}, ++ #endif ++ #ifdef CMP_R_INVALID_OPTION ++ {"INVALID_OPTION", ERR_LIB_CMP, CMP_R_INVALID_OPTION}, ++ #else ++ {"INVALID_OPTION", 58, 174}, ++ #endif ++ #ifdef CMP_R_INVALID_ROOTCAKEYUPDATE ++ {"INVALID_ROOTCAKEYUPDATE", ERR_LIB_CMP, CMP_R_INVALID_ROOTCAKEYUPDATE}, ++ #else ++ {"INVALID_ROOTCAKEYUPDATE", 58, 195}, ++ #endif ++ #ifdef CMP_R_MISSING_CERTID ++ {"MISSING_CERTID", ERR_LIB_CMP, CMP_R_MISSING_CERTID}, ++ #else ++ {"MISSING_CERTID", 58, 165}, ++ #endif ++ #ifdef CMP_R_MISSING_KEY_INPUT_FOR_CREATING_PROTECTION ++ {"MISSING_KEY_INPUT_FOR_CREATING_PROTECTION", ERR_LIB_CMP, CMP_R_MISSING_KEY_INPUT_FOR_CREATING_PROTECTION}, ++ #else ++ {"MISSING_KEY_INPUT_FOR_CREATING_PROTECTION", 58, 130}, ++ #endif ++ #ifdef CMP_R_MISSING_KEY_USAGE_DIGITALSIGNATURE ++ {"MISSING_KEY_USAGE_DIGITALSIGNATURE", ERR_LIB_CMP, CMP_R_MISSING_KEY_USAGE_DIGITALSIGNATURE}, ++ #else ++ {"MISSING_KEY_USAGE_DIGITALSIGNATURE", 58, 142}, ++ #endif ++ #ifdef CMP_R_MISSING_P10CSR ++ {"MISSING_P10CSR", ERR_LIB_CMP, CMP_R_MISSING_P10CSR}, ++ #else ++ {"MISSING_P10CSR", 58, 121}, ++ #endif ++ #ifdef CMP_R_MISSING_PBM_SECRET ++ {"MISSING_PBM_SECRET", ERR_LIB_CMP, CMP_R_MISSING_PBM_SECRET}, ++ #else ++ {"MISSING_PBM_SECRET", 58, 166}, ++ #endif ++ #ifdef CMP_R_MISSING_PRIVATE_KEY ++ {"MISSING_PRIVATE_KEY", ERR_LIB_CMP, CMP_R_MISSING_PRIVATE_KEY}, ++ #else ++ {"MISSING_PRIVATE_KEY", 58, 131}, ++ #endif ++ #ifdef CMP_R_MISSING_PRIVATE_KEY_FOR_POPO ++ {"MISSING_PRIVATE_KEY_FOR_POPO", ERR_LIB_CMP, CMP_R_MISSING_PRIVATE_KEY_FOR_POPO}, ++ #else ++ {"MISSING_PRIVATE_KEY_FOR_POPO", 58, 190}, ++ #endif ++ #ifdef CMP_R_MISSING_PROTECTION ++ {"MISSING_PROTECTION", ERR_LIB_CMP, CMP_R_MISSING_PROTECTION}, ++ #else ++ {"MISSING_PROTECTION", 58, 143}, ++ #endif ++ #ifdef CMP_R_MISSING_PUBLIC_KEY ++ {"MISSING_PUBLIC_KEY", ERR_LIB_CMP, CMP_R_MISSING_PUBLIC_KEY}, ++ #else ++ {"MISSING_PUBLIC_KEY", 58, 183}, ++ #endif ++ #ifdef CMP_R_MISSING_REFERENCE_CERT ++ {"MISSING_REFERENCE_CERT", ERR_LIB_CMP, CMP_R_MISSING_REFERENCE_CERT}, ++ #else ++ {"MISSING_REFERENCE_CERT", 58, 168}, ++ #endif ++ #ifdef CMP_R_MISSING_SECRET ++ {"MISSING_SECRET", ERR_LIB_CMP, CMP_R_MISSING_SECRET}, ++ #else ++ {"MISSING_SECRET", 58, 178}, ++ #endif ++ #ifdef CMP_R_MISSING_SENDER_IDENTIFICATION ++ {"MISSING_SENDER_IDENTIFICATION", ERR_LIB_CMP, CMP_R_MISSING_SENDER_IDENTIFICATION}, ++ #else ++ {"MISSING_SENDER_IDENTIFICATION", 58, 111}, ++ #endif ++ #ifdef CMP_R_MISSING_TRUST_ANCHOR ++ {"MISSING_TRUST_ANCHOR", ERR_LIB_CMP, CMP_R_MISSING_TRUST_ANCHOR}, ++ #else ++ {"MISSING_TRUST_ANCHOR", 58, 179}, ++ #endif ++ #ifdef CMP_R_MISSING_TRUST_STORE ++ {"MISSING_TRUST_STORE", ERR_LIB_CMP, CMP_R_MISSING_TRUST_STORE}, ++ #else ++ {"MISSING_TRUST_STORE", 58, 144}, ++ #endif ++ #ifdef CMP_R_MULTIPLE_REQUESTS_NOT_SUPPORTED ++ {"MULTIPLE_REQUESTS_NOT_SUPPORTED", ERR_LIB_CMP, CMP_R_MULTIPLE_REQUESTS_NOT_SUPPORTED}, ++ #else ++ {"MULTIPLE_REQUESTS_NOT_SUPPORTED", 58, 161}, ++ #endif ++ #ifdef CMP_R_MULTIPLE_RESPONSES_NOT_SUPPORTED ++ {"MULTIPLE_RESPONSES_NOT_SUPPORTED", ERR_LIB_CMP, CMP_R_MULTIPLE_RESPONSES_NOT_SUPPORTED}, ++ #else ++ {"MULTIPLE_RESPONSES_NOT_SUPPORTED", 58, 170}, ++ #endif ++ #ifdef CMP_R_MULTIPLE_SAN_SOURCES ++ {"MULTIPLE_SAN_SOURCES", ERR_LIB_CMP, CMP_R_MULTIPLE_SAN_SOURCES}, ++ #else ++ {"MULTIPLE_SAN_SOURCES", 58, 102}, ++ #endif ++ #ifdef CMP_R_NO_STDIO ++ {"NO_STDIO", ERR_LIB_CMP, CMP_R_NO_STDIO}, ++ #else ++ {"NO_STDIO", 58, 194}, ++ #endif ++ #ifdef CMP_R_NO_SUITABLE_SENDER_CERT ++ {"NO_SUITABLE_SENDER_CERT", ERR_LIB_CMP, CMP_R_NO_SUITABLE_SENDER_CERT}, ++ #else ++ {"NO_SUITABLE_SENDER_CERT", 58, 145}, ++ #endif ++ #ifdef CMP_R_NULL_ARGUMENT ++ {"NULL_ARGUMENT", ERR_LIB_CMP, CMP_R_NULL_ARGUMENT}, ++ #else ++ {"NULL_ARGUMENT", 58, 103}, ++ #endif ++ #ifdef CMP_R_PKIBODY_ERROR ++ {"PKIBODY_ERROR", ERR_LIB_CMP, CMP_R_PKIBODY_ERROR}, ++ #else ++ {"PKIBODY_ERROR", 58, 146}, ++ #endif ++ #ifdef CMP_R_PKISTATUSINFO_NOT_FOUND ++ {"PKISTATUSINFO_NOT_FOUND", ERR_LIB_CMP, CMP_R_PKISTATUSINFO_NOT_FOUND}, ++ #else ++ {"PKISTATUSINFO_NOT_FOUND", 58, 132}, ++ #endif ++ #ifdef CMP_R_POLLING_FAILED ++ {"POLLING_FAILED", ERR_LIB_CMP, CMP_R_POLLING_FAILED}, ++ #else ++ {"POLLING_FAILED", 58, 172}, ++ #endif ++ #ifdef CMP_R_POTENTIALLY_INVALID_CERTIFICATE ++ {"POTENTIALLY_INVALID_CERTIFICATE", ERR_LIB_CMP, CMP_R_POTENTIALLY_INVALID_CERTIFICATE}, ++ #else ++ {"POTENTIALLY_INVALID_CERTIFICATE", 58, 147}, ++ #endif ++ #ifdef CMP_R_RECEIVED_ERROR ++ {"RECEIVED_ERROR", ERR_LIB_CMP, CMP_R_RECEIVED_ERROR}, ++ #else ++ {"RECEIVED_ERROR", 58, 180}, ++ #endif ++ #ifdef CMP_R_RECIPNONCE_UNMATCHED ++ {"RECIPNONCE_UNMATCHED", ERR_LIB_CMP, CMP_R_RECIPNONCE_UNMATCHED}, ++ #else ++ {"RECIPNONCE_UNMATCHED", 58, 148}, ++ #endif ++ #ifdef CMP_R_REQUEST_NOT_ACCEPTED ++ {"REQUEST_NOT_ACCEPTED", ERR_LIB_CMP, CMP_R_REQUEST_NOT_ACCEPTED}, ++ #else ++ {"REQUEST_NOT_ACCEPTED", 58, 149}, ++ #endif ++ #ifdef CMP_R_REQUEST_REJECTED_BY_SERVER ++ {"REQUEST_REJECTED_BY_SERVER", ERR_LIB_CMP, CMP_R_REQUEST_REJECTED_BY_SERVER}, ++ #else ++ {"REQUEST_REJECTED_BY_SERVER", 58, 182}, ++ #endif ++ #ifdef CMP_R_SENDER_GENERALNAME_TYPE_NOT_SUPPORTED ++ {"SENDER_GENERALNAME_TYPE_NOT_SUPPORTED", ERR_LIB_CMP, CMP_R_SENDER_GENERALNAME_TYPE_NOT_SUPPORTED}, ++ #else ++ {"SENDER_GENERALNAME_TYPE_NOT_SUPPORTED", 58, 150}, ++ #endif ++ #ifdef CMP_R_SRVCERT_DOES_NOT_VALIDATE_MSG ++ {"SRVCERT_DOES_NOT_VALIDATE_MSG", ERR_LIB_CMP, CMP_R_SRVCERT_DOES_NOT_VALIDATE_MSG}, ++ #else ++ {"SRVCERT_DOES_NOT_VALIDATE_MSG", 58, 151}, ++ #endif ++ #ifdef CMP_R_TOTAL_TIMEOUT ++ {"TOTAL_TIMEOUT", ERR_LIB_CMP, CMP_R_TOTAL_TIMEOUT}, ++ #else ++ {"TOTAL_TIMEOUT", 58, 184}, ++ #endif ++ #ifdef CMP_R_TRANSACTIONID_UNMATCHED ++ {"TRANSACTIONID_UNMATCHED", ERR_LIB_CMP, CMP_R_TRANSACTIONID_UNMATCHED}, ++ #else ++ {"TRANSACTIONID_UNMATCHED", 58, 152}, ++ #endif ++ #ifdef CMP_R_TRANSFER_ERROR ++ {"TRANSFER_ERROR", ERR_LIB_CMP, CMP_R_TRANSFER_ERROR}, ++ #else ++ {"TRANSFER_ERROR", 58, 159}, ++ #endif ++ #ifdef CMP_R_UNCLEAN_CTX ++ {"UNCLEAN_CTX", ERR_LIB_CMP, CMP_R_UNCLEAN_CTX}, ++ #else ++ {"UNCLEAN_CTX", 58, 191}, ++ #endif ++ #ifdef CMP_R_UNEXPECTED_CERTPROFILE ++ {"UNEXPECTED_CERTPROFILE", ERR_LIB_CMP, CMP_R_UNEXPECTED_CERTPROFILE}, ++ #else ++ {"UNEXPECTED_CERTPROFILE", 58, 196}, ++ #endif ++ #ifdef CMP_R_UNEXPECTED_CRLSTATUSLIST ++ {"UNEXPECTED_CRLSTATUSLIST", ERR_LIB_CMP, CMP_R_UNEXPECTED_CRLSTATUSLIST}, ++ #else ++ {"UNEXPECTED_CRLSTATUSLIST", 58, 201}, ++ #endif ++ #ifdef CMP_R_UNEXPECTED_PKIBODY ++ {"UNEXPECTED_PKIBODY", ERR_LIB_CMP, CMP_R_UNEXPECTED_PKIBODY}, ++ #else ++ {"UNEXPECTED_PKIBODY", 58, 133}, ++ #endif ++ #ifdef CMP_R_UNEXPECTED_PKISTATUS ++ {"UNEXPECTED_PKISTATUS", ERR_LIB_CMP, CMP_R_UNEXPECTED_PKISTATUS}, ++ #else ++ {"UNEXPECTED_PKISTATUS", 58, 185}, ++ #endif ++ #ifdef CMP_R_UNEXPECTED_POLLREQ ++ {"UNEXPECTED_POLLREQ", ERR_LIB_CMP, CMP_R_UNEXPECTED_POLLREQ}, ++ #else ++ {"UNEXPECTED_POLLREQ", 58, 105}, ++ #endif ++ #ifdef CMP_R_UNEXPECTED_PVNO ++ {"UNEXPECTED_PVNO", ERR_LIB_CMP, CMP_R_UNEXPECTED_PVNO}, ++ #else ++ {"UNEXPECTED_PVNO", 58, 153}, ++ #endif ++ #ifdef CMP_R_UNEXPECTED_SENDER ++ {"UNEXPECTED_SENDER", ERR_LIB_CMP, CMP_R_UNEXPECTED_SENDER}, ++ #else ++ {"UNEXPECTED_SENDER", 58, 106}, ++ #endif ++ #ifdef CMP_R_UNKNOWN_ALGORITHM_ID ++ {"UNKNOWN_ALGORITHM_ID", ERR_LIB_CMP, CMP_R_UNKNOWN_ALGORITHM_ID}, ++ #else ++ {"UNKNOWN_ALGORITHM_ID", 58, 134}, ++ #endif ++ #ifdef CMP_R_UNKNOWN_CERT_TYPE ++ {"UNKNOWN_CERT_TYPE", ERR_LIB_CMP, CMP_R_UNKNOWN_CERT_TYPE}, ++ #else ++ {"UNKNOWN_CERT_TYPE", 58, 135}, ++ #endif ++ #ifdef CMP_R_UNKNOWN_CRL_ISSUER ++ {"UNKNOWN_CRL_ISSUER", ERR_LIB_CMP, CMP_R_UNKNOWN_CRL_ISSUER}, ++ #else ++ {"UNKNOWN_CRL_ISSUER", 58, 200}, ++ #endif ++ #ifdef CMP_R_UNKNOWN_PKISTATUS ++ {"UNKNOWN_PKISTATUS", ERR_LIB_CMP, CMP_R_UNKNOWN_PKISTATUS}, ++ #else ++ {"UNKNOWN_PKISTATUS", 58, 186}, ++ #endif ++ #ifdef CMP_R_UNSUPPORTED_ALGORITHM ++ {"UNSUPPORTED_ALGORITHM", ERR_LIB_CMP, CMP_R_UNSUPPORTED_ALGORITHM}, ++ #else ++ {"UNSUPPORTED_ALGORITHM", 58, 136}, ++ #endif ++ #ifdef CMP_R_UNSUPPORTED_KEY_TYPE ++ {"UNSUPPORTED_KEY_TYPE", ERR_LIB_CMP, CMP_R_UNSUPPORTED_KEY_TYPE}, ++ #else ++ {"UNSUPPORTED_KEY_TYPE", 58, 137}, ++ #endif ++ #ifdef CMP_R_UNSUPPORTED_PKIBODY ++ {"UNSUPPORTED_PKIBODY", ERR_LIB_CMP, CMP_R_UNSUPPORTED_PKIBODY}, ++ #else ++ {"UNSUPPORTED_PKIBODY", 58, 101}, ++ #endif ++ #ifdef CMP_R_UNSUPPORTED_PROTECTION_ALG_DHBASEDMAC ++ {"UNSUPPORTED_PROTECTION_ALG_DHBASEDMAC", ERR_LIB_CMP, CMP_R_UNSUPPORTED_PROTECTION_ALG_DHBASEDMAC}, ++ #else ++ {"UNSUPPORTED_PROTECTION_ALG_DHBASEDMAC", 58, 154}, ++ #endif ++ #ifdef CMP_R_VALUE_TOO_LARGE ++ {"VALUE_TOO_LARGE", ERR_LIB_CMP, CMP_R_VALUE_TOO_LARGE}, ++ #else ++ {"VALUE_TOO_LARGE", 58, 175}, ++ #endif ++ #ifdef CMP_R_VALUE_TOO_SMALL ++ {"VALUE_TOO_SMALL", ERR_LIB_CMP, CMP_R_VALUE_TOO_SMALL}, ++ #else ++ {"VALUE_TOO_SMALL", 58, 177}, ++ #endif ++ #ifdef CMP_R_WRONG_ALGORITHM_OID ++ {"WRONG_ALGORITHM_OID", ERR_LIB_CMP, CMP_R_WRONG_ALGORITHM_OID}, ++ #else ++ {"WRONG_ALGORITHM_OID", 58, 138}, ++ #endif ++ #ifdef CMP_R_WRONG_CERTID ++ {"WRONG_CERTID", ERR_LIB_CMP, CMP_R_WRONG_CERTID}, ++ #else ++ {"WRONG_CERTID", 58, 189}, ++ #endif ++ #ifdef CMP_R_WRONG_CERTID_IN_RP ++ {"WRONG_CERTID_IN_RP", ERR_LIB_CMP, CMP_R_WRONG_CERTID_IN_RP}, ++ #else ++ {"WRONG_CERTID_IN_RP", 58, 187}, ++ #endif ++ #ifdef CMP_R_WRONG_PBM_VALUE ++ {"WRONG_PBM_VALUE", ERR_LIB_CMP, CMP_R_WRONG_PBM_VALUE}, ++ #else ++ {"WRONG_PBM_VALUE", 58, 155}, ++ #endif ++ #ifdef CMP_R_WRONG_RP_COMPONENT_COUNT ++ {"WRONG_RP_COMPONENT_COUNT", ERR_LIB_CMP, CMP_R_WRONG_RP_COMPONENT_COUNT}, ++ #else ++ {"WRONG_RP_COMPONENT_COUNT", 58, 188}, ++ #endif ++ #ifdef CMP_R_WRONG_SERIAL_IN_RP ++ {"WRONG_SERIAL_IN_RP", ERR_LIB_CMP, CMP_R_WRONG_SERIAL_IN_RP}, ++ #else ++ {"WRONG_SERIAL_IN_RP", 58, 173}, ++ #endif ++ #ifdef CMS_R_ADD_SIGNER_ERROR ++ {"ADD_SIGNER_ERROR", ERR_LIB_CMS, CMS_R_ADD_SIGNER_ERROR}, ++ #else ++ {"ADD_SIGNER_ERROR", 46, 99}, ++ #endif ++ #ifdef CMS_R_ATTRIBUTE_ERROR ++ {"ATTRIBUTE_ERROR", ERR_LIB_CMS, CMS_R_ATTRIBUTE_ERROR}, ++ #else ++ {"ATTRIBUTE_ERROR", 46, 161}, ++ #endif ++ #ifdef CMS_R_CERTIFICATE_ALREADY_PRESENT ++ {"CERTIFICATE_ALREADY_PRESENT", ERR_LIB_CMS, CMS_R_CERTIFICATE_ALREADY_PRESENT}, ++ #else ++ {"CERTIFICATE_ALREADY_PRESENT", 46, 175}, ++ #endif ++ #ifdef CMS_R_CERTIFICATE_HAS_NO_KEYID ++ {"CERTIFICATE_HAS_NO_KEYID", ERR_LIB_CMS, CMS_R_CERTIFICATE_HAS_NO_KEYID}, ++ #else ++ {"CERTIFICATE_HAS_NO_KEYID", 46, 160}, ++ #endif ++ #ifdef CMS_R_CERTIFICATE_VERIFY_ERROR ++ {"CERTIFICATE_VERIFY_ERROR", ERR_LIB_CMS, CMS_R_CERTIFICATE_VERIFY_ERROR}, ++ #else ++ {"CERTIFICATE_VERIFY_ERROR", 46, 100}, ++ #endif ++ #ifdef CMS_R_CIPHER_AEAD_SET_TAG_ERROR ++ {"CIPHER_AEAD_SET_TAG_ERROR", ERR_LIB_CMS, CMS_R_CIPHER_AEAD_SET_TAG_ERROR}, ++ #else ++ {"CIPHER_AEAD_SET_TAG_ERROR", 46, 184}, ++ #endif ++ #ifdef CMS_R_CIPHER_GET_TAG ++ {"CIPHER_GET_TAG", ERR_LIB_CMS, CMS_R_CIPHER_GET_TAG}, ++ #else ++ {"CIPHER_GET_TAG", 46, 185}, ++ #endif ++ #ifdef CMS_R_CIPHER_INITIALISATION_ERROR ++ {"CIPHER_INITIALISATION_ERROR", ERR_LIB_CMS, CMS_R_CIPHER_INITIALISATION_ERROR}, ++ #else ++ {"CIPHER_INITIALISATION_ERROR", 46, 101}, ++ #endif ++ #ifdef CMS_R_CIPHER_PARAMETER_INITIALISATION_ERROR ++ {"CIPHER_PARAMETER_INITIALISATION_ERROR", ERR_LIB_CMS, CMS_R_CIPHER_PARAMETER_INITIALISATION_ERROR}, ++ #else ++ {"CIPHER_PARAMETER_INITIALISATION_ERROR", 46, 102}, ++ #endif ++ #ifdef CMS_R_CMS_DATAFINAL_ERROR ++ {"CMS_DATAFINAL_ERROR", ERR_LIB_CMS, CMS_R_CMS_DATAFINAL_ERROR}, ++ #else ++ {"CMS_DATAFINAL_ERROR", 46, 103}, ++ #endif ++ #ifdef CMS_R_CMS_LIB ++ {"CMS_LIB", ERR_LIB_CMS, CMS_R_CMS_LIB}, ++ #else ++ {"CMS_LIB", 46, 104}, ++ #endif ++ #ifdef CMS_R_CONTENTIDENTIFIER_MISMATCH ++ {"CONTENTIDENTIFIER_MISMATCH", ERR_LIB_CMS, CMS_R_CONTENTIDENTIFIER_MISMATCH}, ++ #else ++ {"CONTENTIDENTIFIER_MISMATCH", 46, 170}, ++ #endif ++ #ifdef CMS_R_CONTENT_NOT_FOUND ++ {"CONTENT_NOT_FOUND", ERR_LIB_CMS, CMS_R_CONTENT_NOT_FOUND}, ++ #else ++ {"CONTENT_NOT_FOUND", 46, 105}, ++ #endif ++ #ifdef CMS_R_CONTENT_TYPE_MISMATCH ++ {"CONTENT_TYPE_MISMATCH", ERR_LIB_CMS, CMS_R_CONTENT_TYPE_MISMATCH}, ++ #else ++ {"CONTENT_TYPE_MISMATCH", 46, 171}, ++ #endif ++ #ifdef CMS_R_CONTENT_TYPE_NOT_COMPRESSED_DATA ++ {"CONTENT_TYPE_NOT_COMPRESSED_DATA", ERR_LIB_CMS, CMS_R_CONTENT_TYPE_NOT_COMPRESSED_DATA}, ++ #else ++ {"CONTENT_TYPE_NOT_COMPRESSED_DATA", 46, 106}, ++ #endif ++ #ifdef CMS_R_CONTENT_TYPE_NOT_ENVELOPED_DATA ++ {"CONTENT_TYPE_NOT_ENVELOPED_DATA", ERR_LIB_CMS, CMS_R_CONTENT_TYPE_NOT_ENVELOPED_DATA}, ++ #else ++ {"CONTENT_TYPE_NOT_ENVELOPED_DATA", 46, 107}, ++ #endif ++ #ifdef CMS_R_CONTENT_TYPE_NOT_SIGNED_DATA ++ {"CONTENT_TYPE_NOT_SIGNED_DATA", ERR_LIB_CMS, CMS_R_CONTENT_TYPE_NOT_SIGNED_DATA}, ++ #else ++ {"CONTENT_TYPE_NOT_SIGNED_DATA", 46, 108}, ++ #endif ++ #ifdef CMS_R_CONTENT_VERIFY_ERROR ++ {"CONTENT_VERIFY_ERROR", ERR_LIB_CMS, CMS_R_CONTENT_VERIFY_ERROR}, ++ #else ++ {"CONTENT_VERIFY_ERROR", 46, 109}, ++ #endif ++ #ifdef CMS_R_CTRL_ERROR ++ {"CTRL_ERROR", ERR_LIB_CMS, CMS_R_CTRL_ERROR}, ++ #else ++ {"CTRL_ERROR", 46, 110}, ++ #endif ++ #ifdef CMS_R_CTRL_FAILURE ++ {"CTRL_FAILURE", ERR_LIB_CMS, CMS_R_CTRL_FAILURE}, ++ #else ++ {"CTRL_FAILURE", 46, 111}, ++ #endif ++ #ifdef CMS_R_DECODE_ERROR ++ {"DECODE_ERROR", ERR_LIB_CMS, CMS_R_DECODE_ERROR}, ++ #else ++ {"DECODE_ERROR", 46, 187}, ++ #endif ++ #ifdef CMS_R_DECRYPT_ERROR ++ {"DECRYPT_ERROR", ERR_LIB_CMS, CMS_R_DECRYPT_ERROR}, ++ #else ++ {"DECRYPT_ERROR", 46, 112}, ++ #endif ++ #ifdef CMS_R_ERROR_GETTING_PUBLIC_KEY ++ {"ERROR_GETTING_PUBLIC_KEY", ERR_LIB_CMS, CMS_R_ERROR_GETTING_PUBLIC_KEY}, ++ #else ++ {"ERROR_GETTING_PUBLIC_KEY", 46, 113}, ++ #endif ++ #ifdef CMS_R_ERROR_READING_MESSAGEDIGEST_ATTRIBUTE ++ {"ERROR_READING_MESSAGEDIGEST_ATTRIBUTE", ERR_LIB_CMS, CMS_R_ERROR_READING_MESSAGEDIGEST_ATTRIBUTE}, ++ #else ++ {"ERROR_READING_MESSAGEDIGEST_ATTRIBUTE", 46, 114}, ++ #endif ++ #ifdef CMS_R_ERROR_SETTING_KEY ++ {"ERROR_SETTING_KEY", ERR_LIB_CMS, CMS_R_ERROR_SETTING_KEY}, ++ #else ++ {"ERROR_SETTING_KEY", 46, 115}, ++ #endif ++ #ifdef CMS_R_ERROR_SETTING_RECIPIENTINFO ++ {"ERROR_SETTING_RECIPIENTINFO", ERR_LIB_CMS, CMS_R_ERROR_SETTING_RECIPIENTINFO}, ++ #else ++ {"ERROR_SETTING_RECIPIENTINFO", 46, 116}, ++ #endif ++ #ifdef CMS_R_ESS_SIGNING_CERTID_MISMATCH_ERROR ++ {"ESS_SIGNING_CERTID_MISMATCH_ERROR", ERR_LIB_CMS, CMS_R_ESS_SIGNING_CERTID_MISMATCH_ERROR}, ++ #else ++ {"ESS_SIGNING_CERTID_MISMATCH_ERROR", 46, 183}, ++ #endif ++ #ifdef CMS_R_INVALID_ENCRYPTED_KEY_LENGTH ++ {"INVALID_ENCRYPTED_KEY_LENGTH", ERR_LIB_CMS, CMS_R_INVALID_ENCRYPTED_KEY_LENGTH}, ++ #else ++ {"INVALID_ENCRYPTED_KEY_LENGTH", 46, 117}, ++ #endif ++ #ifdef CMS_R_INVALID_KEY_ENCRYPTION_PARAMETER ++ {"INVALID_KEY_ENCRYPTION_PARAMETER", ERR_LIB_CMS, CMS_R_INVALID_KEY_ENCRYPTION_PARAMETER}, ++ #else ++ {"INVALID_KEY_ENCRYPTION_PARAMETER", 46, 176}, ++ #endif ++ #ifdef CMS_R_INVALID_KEY_LENGTH ++ {"INVALID_KEY_LENGTH", ERR_LIB_CMS, CMS_R_INVALID_KEY_LENGTH}, ++ #else ++ {"INVALID_KEY_LENGTH", 46, 118}, ++ #endif ++ #ifdef CMS_R_INVALID_LABEL ++ {"INVALID_LABEL", ERR_LIB_CMS, CMS_R_INVALID_LABEL}, ++ #else ++ {"INVALID_LABEL", 46, 190}, ++ #endif ++ #ifdef CMS_R_INVALID_OAEP_PARAMETERS ++ {"INVALID_OAEP_PARAMETERS", ERR_LIB_CMS, CMS_R_INVALID_OAEP_PARAMETERS}, ++ #else ++ {"INVALID_OAEP_PARAMETERS", 46, 191}, ++ #endif ++ #ifdef CMS_R_KDF_PARAMETER_ERROR ++ {"KDF_PARAMETER_ERROR", ERR_LIB_CMS, CMS_R_KDF_PARAMETER_ERROR}, ++ #else ++ {"KDF_PARAMETER_ERROR", 46, 186}, ++ #endif ++ #ifdef CMS_R_MD_BIO_INIT_ERROR ++ {"MD_BIO_INIT_ERROR", ERR_LIB_CMS, CMS_R_MD_BIO_INIT_ERROR}, ++ #else ++ {"MD_BIO_INIT_ERROR", 46, 119}, ++ #endif ++ #ifdef CMS_R_MESSAGEDIGEST_ATTRIBUTE_WRONG_LENGTH ++ {"MESSAGEDIGEST_ATTRIBUTE_WRONG_LENGTH", ERR_LIB_CMS, CMS_R_MESSAGEDIGEST_ATTRIBUTE_WRONG_LENGTH}, ++ #else ++ {"MESSAGEDIGEST_ATTRIBUTE_WRONG_LENGTH", 46, 120}, ++ #endif ++ #ifdef CMS_R_MESSAGEDIGEST_WRONG_LENGTH ++ {"MESSAGEDIGEST_WRONG_LENGTH", ERR_LIB_CMS, CMS_R_MESSAGEDIGEST_WRONG_LENGTH}, ++ #else ++ {"MESSAGEDIGEST_WRONG_LENGTH", 46, 121}, ++ #endif ++ #ifdef CMS_R_MSGSIGDIGEST_ERROR ++ {"MSGSIGDIGEST_ERROR", ERR_LIB_CMS, CMS_R_MSGSIGDIGEST_ERROR}, ++ #else ++ {"MSGSIGDIGEST_ERROR", 46, 172}, ++ #endif ++ #ifdef CMS_R_MSGSIGDIGEST_VERIFICATION_FAILURE ++ {"MSGSIGDIGEST_VERIFICATION_FAILURE", ERR_LIB_CMS, CMS_R_MSGSIGDIGEST_VERIFICATION_FAILURE}, ++ #else ++ {"MSGSIGDIGEST_VERIFICATION_FAILURE", 46, 162}, ++ #endif ++ #ifdef CMS_R_MSGSIGDIGEST_WRONG_LENGTH ++ {"MSGSIGDIGEST_WRONG_LENGTH", ERR_LIB_CMS, CMS_R_MSGSIGDIGEST_WRONG_LENGTH}, ++ #else ++ {"MSGSIGDIGEST_WRONG_LENGTH", 46, 163}, ++ #endif ++ #ifdef CMS_R_NEED_ONE_SIGNER ++ {"NEED_ONE_SIGNER", ERR_LIB_CMS, CMS_R_NEED_ONE_SIGNER}, ++ #else ++ {"NEED_ONE_SIGNER", 46, 164}, ++ #endif ++ #ifdef CMS_R_NOT_A_SIGNED_RECEIPT ++ {"NOT_A_SIGNED_RECEIPT", ERR_LIB_CMS, CMS_R_NOT_A_SIGNED_RECEIPT}, ++ #else ++ {"NOT_A_SIGNED_RECEIPT", 46, 165}, ++ #endif ++ #ifdef CMS_R_NOT_ENCRYPTED_DATA ++ {"NOT_ENCRYPTED_DATA", ERR_LIB_CMS, CMS_R_NOT_ENCRYPTED_DATA}, ++ #else ++ {"NOT_ENCRYPTED_DATA", 46, 122}, ++ #endif ++ #ifdef CMS_R_NOT_KEK ++ {"NOT_KEK", ERR_LIB_CMS, CMS_R_NOT_KEK}, ++ #else ++ {"NOT_KEK", 46, 123}, ++ #endif ++ #ifdef CMS_R_NOT_KEY_AGREEMENT ++ {"NOT_KEY_AGREEMENT", ERR_LIB_CMS, CMS_R_NOT_KEY_AGREEMENT}, ++ #else ++ {"NOT_KEY_AGREEMENT", 46, 181}, ++ #endif ++ #ifdef CMS_R_NOT_KEY_TRANSPORT ++ {"NOT_KEY_TRANSPORT", ERR_LIB_CMS, CMS_R_NOT_KEY_TRANSPORT}, ++ #else ++ {"NOT_KEY_TRANSPORT", 46, 124}, ++ #endif ++ #ifdef CMS_R_NOT_PWRI ++ {"NOT_PWRI", ERR_LIB_CMS, CMS_R_NOT_PWRI}, ++ #else ++ {"NOT_PWRI", 46, 177}, ++ #endif ++ #ifdef CMS_R_NOT_SUPPORTED_FOR_THIS_KEY_TYPE ++ {"NOT_SUPPORTED_FOR_THIS_KEY_TYPE", ERR_LIB_CMS, CMS_R_NOT_SUPPORTED_FOR_THIS_KEY_TYPE}, ++ #else ++ {"NOT_SUPPORTED_FOR_THIS_KEY_TYPE", 46, 125}, ++ #endif ++ #ifdef CMS_R_NO_CIPHER ++ {"NO_CIPHER", ERR_LIB_CMS, CMS_R_NO_CIPHER}, ++ #else ++ {"NO_CIPHER", 46, 126}, ++ #endif ++ #ifdef CMS_R_NO_CONTENT ++ {"NO_CONTENT", ERR_LIB_CMS, CMS_R_NO_CONTENT}, ++ #else ++ {"NO_CONTENT", 46, 127}, ++ #endif ++ #ifdef CMS_R_NO_CONTENT_TYPE ++ {"NO_CONTENT_TYPE", ERR_LIB_CMS, CMS_R_NO_CONTENT_TYPE}, ++ #else ++ {"NO_CONTENT_TYPE", 46, 173}, ++ #endif ++ #ifdef CMS_R_NO_DEFAULT_DIGEST ++ {"NO_DEFAULT_DIGEST", ERR_LIB_CMS, CMS_R_NO_DEFAULT_DIGEST}, ++ #else ++ {"NO_DEFAULT_DIGEST", 46, 128}, ++ #endif ++ #ifdef CMS_R_NO_DIGEST_SET ++ {"NO_DIGEST_SET", ERR_LIB_CMS, CMS_R_NO_DIGEST_SET}, ++ #else ++ {"NO_DIGEST_SET", 46, 129}, ++ #endif ++ #ifdef CMS_R_NO_KEY ++ {"NO_KEY", ERR_LIB_CMS, CMS_R_NO_KEY}, ++ #else ++ {"NO_KEY", 46, 130}, ++ #endif ++ #ifdef CMS_R_NO_KEY_OR_CERT ++ {"NO_KEY_OR_CERT", ERR_LIB_CMS, CMS_R_NO_KEY_OR_CERT}, ++ #else ++ {"NO_KEY_OR_CERT", 46, 174}, ++ #endif ++ #ifdef CMS_R_NO_MATCHING_DIGEST ++ {"NO_MATCHING_DIGEST", ERR_LIB_CMS, CMS_R_NO_MATCHING_DIGEST}, ++ #else ++ {"NO_MATCHING_DIGEST", 46, 131}, ++ #endif ++ #ifdef CMS_R_NO_MATCHING_RECIPIENT ++ {"NO_MATCHING_RECIPIENT", ERR_LIB_CMS, CMS_R_NO_MATCHING_RECIPIENT}, ++ #else ++ {"NO_MATCHING_RECIPIENT", 46, 132}, ++ #endif ++ #ifdef CMS_R_NO_MATCHING_SIGNATURE ++ {"NO_MATCHING_SIGNATURE", ERR_LIB_CMS, CMS_R_NO_MATCHING_SIGNATURE}, ++ #else ++ {"NO_MATCHING_SIGNATURE", 46, 166}, ++ #endif ++ #ifdef CMS_R_NO_MSGSIGDIGEST ++ {"NO_MSGSIGDIGEST", ERR_LIB_CMS, CMS_R_NO_MSGSIGDIGEST}, ++ #else ++ {"NO_MSGSIGDIGEST", 46, 167}, ++ #endif ++ #ifdef CMS_R_NO_PASSWORD ++ {"NO_PASSWORD", ERR_LIB_CMS, CMS_R_NO_PASSWORD}, ++ #else ++ {"NO_PASSWORD", 46, 178}, ++ #endif ++ #ifdef CMS_R_NO_PRIVATE_KEY ++ {"NO_PRIVATE_KEY", ERR_LIB_CMS, CMS_R_NO_PRIVATE_KEY}, ++ #else ++ {"NO_PRIVATE_KEY", 46, 133}, ++ #endif ++ #ifdef CMS_R_NO_PUBLIC_KEY ++ {"NO_PUBLIC_KEY", ERR_LIB_CMS, CMS_R_NO_PUBLIC_KEY}, ++ #else ++ {"NO_PUBLIC_KEY", 46, 134}, ++ #endif ++ #ifdef CMS_R_NO_RECEIPT_REQUEST ++ {"NO_RECEIPT_REQUEST", ERR_LIB_CMS, CMS_R_NO_RECEIPT_REQUEST}, ++ #else ++ {"NO_RECEIPT_REQUEST", 46, 168}, ++ #endif ++ #ifdef CMS_R_NO_SIGNERS ++ {"NO_SIGNERS", ERR_LIB_CMS, CMS_R_NO_SIGNERS}, ++ #else ++ {"NO_SIGNERS", 46, 135}, ++ #endif ++ #ifdef CMS_R_OPERATION_UNSUPPORTED ++ {"OPERATION_UNSUPPORTED", ERR_LIB_CMS, CMS_R_OPERATION_UNSUPPORTED}, ++ #else ++ {"OPERATION_UNSUPPORTED", 46, 182}, ++ #endif ++ #ifdef CMS_R_PEER_KEY_ERROR ++ {"PEER_KEY_ERROR", ERR_LIB_CMS, CMS_R_PEER_KEY_ERROR}, ++ #else ++ {"PEER_KEY_ERROR", 46, 188}, ++ #endif ++ #ifdef CMS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE ++ {"PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE", ERR_LIB_CMS, CMS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE}, ++ #else ++ {"PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE", 46, 136}, ++ #endif ++ #ifdef CMS_R_RECEIPT_DECODE_ERROR ++ {"RECEIPT_DECODE_ERROR", ERR_LIB_CMS, CMS_R_RECEIPT_DECODE_ERROR}, ++ #else ++ {"RECEIPT_DECODE_ERROR", 46, 169}, ++ #endif ++ #ifdef CMS_R_RECIPIENT_ERROR ++ {"RECIPIENT_ERROR", ERR_LIB_CMS, CMS_R_RECIPIENT_ERROR}, ++ #else ++ {"RECIPIENT_ERROR", 46, 137}, ++ #endif ++ #ifdef CMS_R_SHARED_INFO_ERROR ++ {"SHARED_INFO_ERROR", ERR_LIB_CMS, CMS_R_SHARED_INFO_ERROR}, ++ #else ++ {"SHARED_INFO_ERROR", 46, 189}, ++ #endif ++ #ifdef CMS_R_SIGNER_CERTIFICATE_NOT_FOUND ++ {"SIGNER_CERTIFICATE_NOT_FOUND", ERR_LIB_CMS, CMS_R_SIGNER_CERTIFICATE_NOT_FOUND}, ++ #else ++ {"SIGNER_CERTIFICATE_NOT_FOUND", 46, 138}, ++ #endif ++ #ifdef CMS_R_SIGNFINAL_ERROR ++ {"SIGNFINAL_ERROR", ERR_LIB_CMS, CMS_R_SIGNFINAL_ERROR}, ++ #else ++ {"SIGNFINAL_ERROR", 46, 139}, ++ #endif ++ #ifdef CMS_R_SMIME_TEXT_ERROR ++ {"SMIME_TEXT_ERROR", ERR_LIB_CMS, CMS_R_SMIME_TEXT_ERROR}, ++ #else ++ {"SMIME_TEXT_ERROR", 46, 140}, ++ #endif ++ #ifdef CMS_R_STORE_INIT_ERROR ++ {"STORE_INIT_ERROR", ERR_LIB_CMS, CMS_R_STORE_INIT_ERROR}, ++ #else ++ {"STORE_INIT_ERROR", 46, 141}, ++ #endif ++ #ifdef CMS_R_TYPE_NOT_COMPRESSED_DATA ++ {"TYPE_NOT_COMPRESSED_DATA", ERR_LIB_CMS, CMS_R_TYPE_NOT_COMPRESSED_DATA}, ++ #else ++ {"TYPE_NOT_COMPRESSED_DATA", 46, 142}, ++ #endif ++ #ifdef CMS_R_TYPE_NOT_DATA ++ {"TYPE_NOT_DATA", ERR_LIB_CMS, CMS_R_TYPE_NOT_DATA}, ++ #else ++ {"TYPE_NOT_DATA", 46, 143}, ++ #endif ++ #ifdef CMS_R_TYPE_NOT_DIGESTED_DATA ++ {"TYPE_NOT_DIGESTED_DATA", ERR_LIB_CMS, CMS_R_TYPE_NOT_DIGESTED_DATA}, ++ #else ++ {"TYPE_NOT_DIGESTED_DATA", 46, 144}, ++ #endif ++ #ifdef CMS_R_TYPE_NOT_ENCRYPTED_DATA ++ {"TYPE_NOT_ENCRYPTED_DATA", ERR_LIB_CMS, CMS_R_TYPE_NOT_ENCRYPTED_DATA}, ++ #else ++ {"TYPE_NOT_ENCRYPTED_DATA", 46, 145}, ++ #endif ++ #ifdef CMS_R_TYPE_NOT_ENVELOPED_DATA ++ {"TYPE_NOT_ENVELOPED_DATA", ERR_LIB_CMS, CMS_R_TYPE_NOT_ENVELOPED_DATA}, ++ #else ++ {"TYPE_NOT_ENVELOPED_DATA", 46, 146}, ++ #endif ++ #ifdef CMS_R_UNABLE_TO_FINALIZE_CONTEXT ++ {"UNABLE_TO_FINALIZE_CONTEXT", ERR_LIB_CMS, CMS_R_UNABLE_TO_FINALIZE_CONTEXT}, ++ #else ++ {"UNABLE_TO_FINALIZE_CONTEXT", 46, 147}, ++ #endif ++ #ifdef CMS_R_UNKNOWN_CIPHER ++ {"UNKNOWN_CIPHER", ERR_LIB_CMS, CMS_R_UNKNOWN_CIPHER}, ++ #else ++ {"UNKNOWN_CIPHER", 46, 148}, ++ #endif ++ #ifdef CMS_R_UNKNOWN_DIGEST_ALGORITHM ++ {"UNKNOWN_DIGEST_ALGORITHM", ERR_LIB_CMS, CMS_R_UNKNOWN_DIGEST_ALGORITHM}, ++ #else ++ {"UNKNOWN_DIGEST_ALGORITHM", 46, 149}, ++ #endif ++ #ifdef CMS_R_UNKNOWN_ID ++ {"UNKNOWN_ID", ERR_LIB_CMS, CMS_R_UNKNOWN_ID}, ++ #else ++ {"UNKNOWN_ID", 46, 150}, ++ #endif ++ #ifdef CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM ++ {"UNSUPPORTED_COMPRESSION_ALGORITHM", ERR_LIB_CMS, CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM}, ++ #else ++ {"UNSUPPORTED_COMPRESSION_ALGORITHM", 46, 151}, ++ #endif ++ #ifdef CMS_R_UNSUPPORTED_CONTENT_ENCRYPTION_ALGORITHM ++ {"UNSUPPORTED_CONTENT_ENCRYPTION_ALGORITHM", ERR_LIB_CMS, CMS_R_UNSUPPORTED_CONTENT_ENCRYPTION_ALGORITHM}, ++ #else ++ {"UNSUPPORTED_CONTENT_ENCRYPTION_ALGORITHM", 46, 194}, ++ #endif ++ #ifdef CMS_R_UNSUPPORTED_CONTENT_TYPE ++ {"UNSUPPORTED_CONTENT_TYPE", ERR_LIB_CMS, CMS_R_UNSUPPORTED_CONTENT_TYPE}, ++ #else ++ {"UNSUPPORTED_CONTENT_TYPE", 46, 152}, ++ #endif ++ #ifdef CMS_R_UNSUPPORTED_ENCRYPTION_TYPE ++ {"UNSUPPORTED_ENCRYPTION_TYPE", ERR_LIB_CMS, CMS_R_UNSUPPORTED_ENCRYPTION_TYPE}, ++ #else ++ {"UNSUPPORTED_ENCRYPTION_TYPE", 46, 192}, ++ #endif ++ #ifdef CMS_R_UNSUPPORTED_KEK_ALGORITHM ++ {"UNSUPPORTED_KEK_ALGORITHM", ERR_LIB_CMS, CMS_R_UNSUPPORTED_KEK_ALGORITHM}, ++ #else ++ {"UNSUPPORTED_KEK_ALGORITHM", 46, 153}, ++ #endif ++ #ifdef CMS_R_UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM ++ {"UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM", ERR_LIB_CMS, CMS_R_UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM}, ++ #else ++ {"UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM", 46, 179}, ++ #endif ++ #ifdef CMS_R_UNSUPPORTED_LABEL_SOURCE ++ {"UNSUPPORTED_LABEL_SOURCE", ERR_LIB_CMS, CMS_R_UNSUPPORTED_LABEL_SOURCE}, ++ #else ++ {"UNSUPPORTED_LABEL_SOURCE", 46, 193}, ++ #endif ++ #ifdef CMS_R_UNSUPPORTED_RECIPIENTINFO_TYPE ++ {"UNSUPPORTED_RECIPIENTINFO_TYPE", ERR_LIB_CMS, CMS_R_UNSUPPORTED_RECIPIENTINFO_TYPE}, ++ #else ++ {"UNSUPPORTED_RECIPIENTINFO_TYPE", 46, 155}, ++ #endif ++ #ifdef CMS_R_UNSUPPORTED_RECIPIENT_TYPE ++ {"UNSUPPORTED_RECIPIENT_TYPE", ERR_LIB_CMS, CMS_R_UNSUPPORTED_RECIPIENT_TYPE}, ++ #else ++ {"UNSUPPORTED_RECIPIENT_TYPE", 46, 154}, ++ #endif ++ #ifdef CMS_R_UNSUPPORTED_SIGNATURE_ALGORITHM ++ {"UNSUPPORTED_SIGNATURE_ALGORITHM", ERR_LIB_CMS, CMS_R_UNSUPPORTED_SIGNATURE_ALGORITHM}, ++ #else ++ {"UNSUPPORTED_SIGNATURE_ALGORITHM", 46, 195}, ++ #endif ++ #ifdef CMS_R_UNSUPPORTED_TYPE ++ {"UNSUPPORTED_TYPE", ERR_LIB_CMS, CMS_R_UNSUPPORTED_TYPE}, ++ #else ++ {"UNSUPPORTED_TYPE", 46, 156}, ++ #endif ++ #ifdef CMS_R_UNWRAP_ERROR ++ {"UNWRAP_ERROR", ERR_LIB_CMS, CMS_R_UNWRAP_ERROR}, ++ #else ++ {"UNWRAP_ERROR", 46, 157}, ++ #endif ++ #ifdef CMS_R_UNWRAP_FAILURE ++ {"UNWRAP_FAILURE", ERR_LIB_CMS, CMS_R_UNWRAP_FAILURE}, ++ #else ++ {"UNWRAP_FAILURE", 46, 180}, ++ #endif ++ #ifdef CMS_R_VERIFICATION_FAILURE ++ {"VERIFICATION_FAILURE", ERR_LIB_CMS, CMS_R_VERIFICATION_FAILURE}, ++ #else ++ {"VERIFICATION_FAILURE", 46, 158}, ++ #endif ++ #ifdef CMS_R_WRAP_ERROR ++ {"WRAP_ERROR", ERR_LIB_CMS, CMS_R_WRAP_ERROR}, ++ #else ++ {"WRAP_ERROR", 46, 159}, ++ #endif ++ #ifdef COMP_R_BROTLI_DECODE_ERROR ++ {"BROTLI_DECODE_ERROR", ERR_LIB_COMP, COMP_R_BROTLI_DECODE_ERROR}, ++ #else ++ {"BROTLI_DECODE_ERROR", 41, 102}, ++ #endif ++ #ifdef COMP_R_BROTLI_DEFLATE_ERROR ++ {"BROTLI_DEFLATE_ERROR", ERR_LIB_COMP, COMP_R_BROTLI_DEFLATE_ERROR}, ++ #else ++ {"BROTLI_DEFLATE_ERROR", 41, 103}, ++ #endif ++ #ifdef COMP_R_BROTLI_ENCODE_ERROR ++ {"BROTLI_ENCODE_ERROR", ERR_LIB_COMP, COMP_R_BROTLI_ENCODE_ERROR}, ++ #else ++ {"BROTLI_ENCODE_ERROR", 41, 106}, ++ #endif ++ #ifdef COMP_R_BROTLI_INFLATE_ERROR ++ {"BROTLI_INFLATE_ERROR", ERR_LIB_COMP, COMP_R_BROTLI_INFLATE_ERROR}, ++ #else ++ {"BROTLI_INFLATE_ERROR", 41, 104}, ++ #endif ++ #ifdef COMP_R_BROTLI_NOT_SUPPORTED ++ {"BROTLI_NOT_SUPPORTED", ERR_LIB_COMP, COMP_R_BROTLI_NOT_SUPPORTED}, ++ #else ++ {"BROTLI_NOT_SUPPORTED", 41, 105}, ++ #endif ++ #ifdef COMP_R_ZLIB_DEFLATE_ERROR ++ {"ZLIB_DEFLATE_ERROR", ERR_LIB_COMP, COMP_R_ZLIB_DEFLATE_ERROR}, ++ #else ++ {"ZLIB_DEFLATE_ERROR", 41, 99}, ++ #endif ++ #ifdef COMP_R_ZLIB_INFLATE_ERROR ++ {"ZLIB_INFLATE_ERROR", ERR_LIB_COMP, COMP_R_ZLIB_INFLATE_ERROR}, ++ #else ++ {"ZLIB_INFLATE_ERROR", 41, 100}, ++ #endif ++ #ifdef COMP_R_ZLIB_NOT_SUPPORTED ++ {"ZLIB_NOT_SUPPORTED", ERR_LIB_COMP, COMP_R_ZLIB_NOT_SUPPORTED}, ++ #else ++ {"ZLIB_NOT_SUPPORTED", 41, 101}, ++ #endif ++ #ifdef COMP_R_ZSTD_COMPRESS_ERROR ++ {"ZSTD_COMPRESS_ERROR", ERR_LIB_COMP, COMP_R_ZSTD_COMPRESS_ERROR}, ++ #else ++ {"ZSTD_COMPRESS_ERROR", 41, 107}, ++ #endif ++ #ifdef COMP_R_ZSTD_DECODE_ERROR ++ {"ZSTD_DECODE_ERROR", ERR_LIB_COMP, COMP_R_ZSTD_DECODE_ERROR}, ++ #else ++ {"ZSTD_DECODE_ERROR", 41, 108}, ++ #endif ++ #ifdef COMP_R_ZSTD_DECOMPRESS_ERROR ++ {"ZSTD_DECOMPRESS_ERROR", ERR_LIB_COMP, COMP_R_ZSTD_DECOMPRESS_ERROR}, ++ #else ++ {"ZSTD_DECOMPRESS_ERROR", 41, 109}, ++ #endif ++ #ifdef COMP_R_ZSTD_NOT_SUPPORTED ++ {"ZSTD_NOT_SUPPORTED", ERR_LIB_COMP, COMP_R_ZSTD_NOT_SUPPORTED}, ++ #else ++ {"ZSTD_NOT_SUPPORTED", 41, 110}, ++ #endif ++ #ifdef CONF_R_ERROR_LOADING_DSO ++ {"ERROR_LOADING_DSO", ERR_LIB_CONF, CONF_R_ERROR_LOADING_DSO}, ++ #else ++ {"ERROR_LOADING_DSO", 14, 110}, ++ #endif ++ #ifdef CONF_R_INVALID_PRAGMA ++ {"INVALID_PRAGMA", ERR_LIB_CONF, CONF_R_INVALID_PRAGMA}, ++ #else ++ {"INVALID_PRAGMA", 14, 122}, ++ #endif ++ #ifdef CONF_R_LIST_CANNOT_BE_NULL ++ {"LIST_CANNOT_BE_NULL", ERR_LIB_CONF, CONF_R_LIST_CANNOT_BE_NULL}, ++ #else ++ {"LIST_CANNOT_BE_NULL", 14, 115}, ++ #endif ++ #ifdef CONF_R_MANDATORY_BRACES_IN_VARIABLE_EXPANSION ++ {"MANDATORY_BRACES_IN_VARIABLE_EXPANSION", ERR_LIB_CONF, CONF_R_MANDATORY_BRACES_IN_VARIABLE_EXPANSION}, ++ #else ++ {"MANDATORY_BRACES_IN_VARIABLE_EXPANSION", 14, 123}, ++ #endif ++ #ifdef CONF_R_MISSING_CLOSE_SQUARE_BRACKET ++ {"MISSING_CLOSE_SQUARE_BRACKET", ERR_LIB_CONF, CONF_R_MISSING_CLOSE_SQUARE_BRACKET}, ++ #else ++ {"MISSING_CLOSE_SQUARE_BRACKET", 14, 100}, ++ #endif ++ #ifdef CONF_R_MISSING_EQUAL_SIGN ++ {"MISSING_EQUAL_SIGN", ERR_LIB_CONF, CONF_R_MISSING_EQUAL_SIGN}, ++ #else ++ {"MISSING_EQUAL_SIGN", 14, 101}, ++ #endif ++ #ifdef CONF_R_MISSING_INIT_FUNCTION ++ {"MISSING_INIT_FUNCTION", ERR_LIB_CONF, CONF_R_MISSING_INIT_FUNCTION}, ++ #else ++ {"MISSING_INIT_FUNCTION", 14, 112}, ++ #endif ++ #ifdef CONF_R_MODULE_INITIALIZATION_ERROR ++ {"MODULE_INITIALIZATION_ERROR", ERR_LIB_CONF, CONF_R_MODULE_INITIALIZATION_ERROR}, ++ #else ++ {"MODULE_INITIALIZATION_ERROR", 14, 109}, ++ #endif ++ #ifdef CONF_R_NO_CLOSE_BRACE ++ {"NO_CLOSE_BRACE", ERR_LIB_CONF, CONF_R_NO_CLOSE_BRACE}, ++ #else ++ {"NO_CLOSE_BRACE", 14, 102}, ++ #endif ++ #ifdef CONF_R_NO_CONF ++ {"NO_CONF", ERR_LIB_CONF, CONF_R_NO_CONF}, ++ #else ++ {"NO_CONF", 14, 105}, ++ #endif ++ #ifdef CONF_R_NO_CONF_OR_ENVIRONMENT_VARIABLE ++ {"NO_CONF_OR_ENVIRONMENT_VARIABLE", ERR_LIB_CONF, CONF_R_NO_CONF_OR_ENVIRONMENT_VARIABLE}, ++ #else ++ {"NO_CONF_OR_ENVIRONMENT_VARIABLE", 14, 106}, ++ #endif ++ #ifdef CONF_R_NO_SECTION ++ {"NO_SECTION", ERR_LIB_CONF, CONF_R_NO_SECTION}, ++ #else ++ {"NO_SECTION", 14, 107}, ++ #endif ++ #ifdef CONF_R_NO_SUCH_FILE ++ {"NO_SUCH_FILE", ERR_LIB_CONF, CONF_R_NO_SUCH_FILE}, ++ #else ++ {"NO_SUCH_FILE", 14, 114}, ++ #endif ++ #ifdef CONF_R_NO_VALUE ++ {"NO_VALUE", ERR_LIB_CONF, CONF_R_NO_VALUE}, ++ #else ++ {"NO_VALUE", 14, 108}, ++ #endif ++ #ifdef CONF_R_NUMBER_TOO_LARGE ++ {"NUMBER_TOO_LARGE", ERR_LIB_CONF, CONF_R_NUMBER_TOO_LARGE}, ++ #else ++ {"NUMBER_TOO_LARGE", 14, 121}, ++ #endif ++ #ifdef CONF_R_OPENSSL_CONF_REFERENCES_MISSING_SECTION ++ {"OPENSSL_CONF_REFERENCES_MISSING_SECTION", ERR_LIB_CONF, CONF_R_OPENSSL_CONF_REFERENCES_MISSING_SECTION}, ++ #else ++ {"OPENSSL_CONF_REFERENCES_MISSING_SECTION", 14, 124}, ++ #endif ++ #ifdef CONF_R_RECURSIVE_DIRECTORY_INCLUDE ++ {"RECURSIVE_DIRECTORY_INCLUDE", ERR_LIB_CONF, CONF_R_RECURSIVE_DIRECTORY_INCLUDE}, ++ #else ++ {"RECURSIVE_DIRECTORY_INCLUDE", 14, 111}, ++ #endif ++ #ifdef CONF_R_RECURSIVE_SECTION_REFERENCE ++ {"RECURSIVE_SECTION_REFERENCE", ERR_LIB_CONF, CONF_R_RECURSIVE_SECTION_REFERENCE}, ++ #else ++ {"RECURSIVE_SECTION_REFERENCE", 14, 126}, ++ #endif ++ #ifdef CONF_R_RELATIVE_PATH ++ {"RELATIVE_PATH", ERR_LIB_CONF, CONF_R_RELATIVE_PATH}, ++ #else ++ {"RELATIVE_PATH", 14, 125}, ++ #endif ++ #ifdef CONF_R_SSL_COMMAND_SECTION_EMPTY ++ {"SSL_COMMAND_SECTION_EMPTY", ERR_LIB_CONF, CONF_R_SSL_COMMAND_SECTION_EMPTY}, ++ #else ++ {"SSL_COMMAND_SECTION_EMPTY", 14, 117}, ++ #endif ++ #ifdef CONF_R_SSL_COMMAND_SECTION_NOT_FOUND ++ {"SSL_COMMAND_SECTION_NOT_FOUND", ERR_LIB_CONF, CONF_R_SSL_COMMAND_SECTION_NOT_FOUND}, ++ #else ++ {"SSL_COMMAND_SECTION_NOT_FOUND", 14, 118}, ++ #endif ++ #ifdef CONF_R_SSL_SECTION_EMPTY ++ {"SSL_SECTION_EMPTY", ERR_LIB_CONF, CONF_R_SSL_SECTION_EMPTY}, ++ #else ++ {"SSL_SECTION_EMPTY", 14, 119}, ++ #endif ++ #ifdef CONF_R_SSL_SECTION_NOT_FOUND ++ {"SSL_SECTION_NOT_FOUND", ERR_LIB_CONF, CONF_R_SSL_SECTION_NOT_FOUND}, ++ #else ++ {"SSL_SECTION_NOT_FOUND", 14, 120}, ++ #endif ++ #ifdef CONF_R_UNABLE_TO_CREATE_NEW_SECTION ++ {"UNABLE_TO_CREATE_NEW_SECTION", ERR_LIB_CONF, CONF_R_UNABLE_TO_CREATE_NEW_SECTION}, ++ #else ++ {"UNABLE_TO_CREATE_NEW_SECTION", 14, 103}, ++ #endif ++ #ifdef CONF_R_UNKNOWN_MODULE_NAME ++ {"UNKNOWN_MODULE_NAME", ERR_LIB_CONF, CONF_R_UNKNOWN_MODULE_NAME}, ++ #else ++ {"UNKNOWN_MODULE_NAME", 14, 113}, ++ #endif ++ #ifdef CONF_R_VARIABLE_EXPANSION_TOO_LONG ++ {"VARIABLE_EXPANSION_TOO_LONG", ERR_LIB_CONF, CONF_R_VARIABLE_EXPANSION_TOO_LONG}, ++ #else ++ {"VARIABLE_EXPANSION_TOO_LONG", 14, 116}, ++ #endif ++ #ifdef CONF_R_VARIABLE_HAS_NO_VALUE ++ {"VARIABLE_HAS_NO_VALUE", ERR_LIB_CONF, CONF_R_VARIABLE_HAS_NO_VALUE}, ++ #else ++ {"VARIABLE_HAS_NO_VALUE", 14, 104}, ++ #endif ++ #ifdef CRMF_R_BAD_PBM_ITERATIONCOUNT ++ {"BAD_PBM_ITERATIONCOUNT", ERR_LIB_CRMF, CRMF_R_BAD_PBM_ITERATIONCOUNT}, ++ #else ++ {"BAD_PBM_ITERATIONCOUNT", 56, 100}, ++ #endif ++ #ifdef CRMF_R_CRMFERROR ++ {"CRMFERROR", ERR_LIB_CRMF, CRMF_R_CRMFERROR}, ++ #else ++ {"CRMFERROR", 56, 102}, ++ #endif ++ #ifdef CRMF_R_ERROR ++ {"ERROR", ERR_LIB_CRMF, CRMF_R_ERROR}, ++ #else ++ {"ERROR", 56, 103}, ++ #endif ++ #ifdef CRMF_R_ERROR_DECODING_CERTIFICATE ++ {"ERROR_DECODING_CERTIFICATE", ERR_LIB_CRMF, CRMF_R_ERROR_DECODING_CERTIFICATE}, ++ #else ++ {"ERROR_DECODING_CERTIFICATE", 56, 104}, ++ #endif ++ #ifdef CRMF_R_ERROR_DECRYPTING_CERTIFICATE ++ {"ERROR_DECRYPTING_CERTIFICATE", ERR_LIB_CRMF, CRMF_R_ERROR_DECRYPTING_CERTIFICATE}, ++ #else ++ {"ERROR_DECRYPTING_CERTIFICATE", 56, 105}, ++ #endif ++ #ifdef CRMF_R_ERROR_DECRYPTING_SYMMETRIC_KEY ++ {"ERROR_DECRYPTING_SYMMETRIC_KEY", ERR_LIB_CRMF, CRMF_R_ERROR_DECRYPTING_SYMMETRIC_KEY}, ++ #else ++ {"ERROR_DECRYPTING_SYMMETRIC_KEY", 56, 106}, ++ #endif ++ #ifdef CRMF_R_FAILURE_OBTAINING_RANDOM ++ {"FAILURE_OBTAINING_RANDOM", ERR_LIB_CRMF, CRMF_R_FAILURE_OBTAINING_RANDOM}, ++ #else ++ {"FAILURE_OBTAINING_RANDOM", 56, 107}, ++ #endif ++ #ifdef CRMF_R_ITERATIONCOUNT_BELOW_100 ++ {"ITERATIONCOUNT_BELOW_100", ERR_LIB_CRMF, CRMF_R_ITERATIONCOUNT_BELOW_100}, ++ #else ++ {"ITERATIONCOUNT_BELOW_100", 56, 108}, ++ #endif ++ #ifdef CRMF_R_MALFORMED_IV ++ {"MALFORMED_IV", ERR_LIB_CRMF, CRMF_R_MALFORMED_IV}, ++ #else ++ {"MALFORMED_IV", 56, 101}, ++ #endif ++ #ifdef CRMF_R_NULL_ARGUMENT ++ {"NULL_ARGUMENT", ERR_LIB_CRMF, CRMF_R_NULL_ARGUMENT}, ++ #else ++ {"NULL_ARGUMENT", 56, 109}, ++ #endif ++ #ifdef CRMF_R_POPOSKINPUT_NOT_SUPPORTED ++ {"POPOSKINPUT_NOT_SUPPORTED", ERR_LIB_CRMF, CRMF_R_POPOSKINPUT_NOT_SUPPORTED}, ++ #else ++ {"POPOSKINPUT_NOT_SUPPORTED", 56, 113}, ++ #endif ++ #ifdef CRMF_R_POPO_INCONSISTENT_PUBLIC_KEY ++ {"POPO_INCONSISTENT_PUBLIC_KEY", ERR_LIB_CRMF, CRMF_R_POPO_INCONSISTENT_PUBLIC_KEY}, ++ #else ++ {"POPO_INCONSISTENT_PUBLIC_KEY", 56, 117}, ++ #endif ++ #ifdef CRMF_R_POPO_MISSING ++ {"POPO_MISSING", ERR_LIB_CRMF, CRMF_R_POPO_MISSING}, ++ #else ++ {"POPO_MISSING", 56, 121}, ++ #endif ++ #ifdef CRMF_R_POPO_MISSING_PUBLIC_KEY ++ {"POPO_MISSING_PUBLIC_KEY", ERR_LIB_CRMF, CRMF_R_POPO_MISSING_PUBLIC_KEY}, ++ #else ++ {"POPO_MISSING_PUBLIC_KEY", 56, 118}, ++ #endif ++ #ifdef CRMF_R_POPO_MISSING_SUBJECT ++ {"POPO_MISSING_SUBJECT", ERR_LIB_CRMF, CRMF_R_POPO_MISSING_SUBJECT}, ++ #else ++ {"POPO_MISSING_SUBJECT", 56, 119}, ++ #endif ++ #ifdef CRMF_R_POPO_RAVERIFIED_NOT_ACCEPTED ++ {"POPO_RAVERIFIED_NOT_ACCEPTED", ERR_LIB_CRMF, CRMF_R_POPO_RAVERIFIED_NOT_ACCEPTED}, ++ #else ++ {"POPO_RAVERIFIED_NOT_ACCEPTED", 56, 120}, ++ #endif ++ #ifdef CRMF_R_SETTING_MAC_ALGOR_FAILURE ++ {"SETTING_MAC_ALGOR_FAILURE", ERR_LIB_CRMF, CRMF_R_SETTING_MAC_ALGOR_FAILURE}, ++ #else ++ {"SETTING_MAC_ALGOR_FAILURE", 56, 110}, ++ #endif ++ #ifdef CRMF_R_SETTING_OWF_ALGOR_FAILURE ++ {"SETTING_OWF_ALGOR_FAILURE", ERR_LIB_CRMF, CRMF_R_SETTING_OWF_ALGOR_FAILURE}, ++ #else ++ {"SETTING_OWF_ALGOR_FAILURE", 56, 111}, ++ #endif ++ #ifdef CRMF_R_UNSUPPORTED_ALGORITHM ++ {"UNSUPPORTED_ALGORITHM", ERR_LIB_CRMF, CRMF_R_UNSUPPORTED_ALGORITHM}, ++ #else ++ {"UNSUPPORTED_ALGORITHM", 56, 112}, ++ #endif ++ #ifdef CRMF_R_UNSUPPORTED_CIPHER ++ {"UNSUPPORTED_CIPHER", ERR_LIB_CRMF, CRMF_R_UNSUPPORTED_CIPHER}, ++ #else ++ {"UNSUPPORTED_CIPHER", 56, 114}, ++ #endif ++ #ifdef CRMF_R_UNSUPPORTED_METHOD_FOR_CREATING_POPO ++ {"UNSUPPORTED_METHOD_FOR_CREATING_POPO", ERR_LIB_CRMF, CRMF_R_UNSUPPORTED_METHOD_FOR_CREATING_POPO}, ++ #else ++ {"UNSUPPORTED_METHOD_FOR_CREATING_POPO", 56, 115}, ++ #endif ++ #ifdef CRMF_R_UNSUPPORTED_POPO_METHOD ++ {"UNSUPPORTED_POPO_METHOD", ERR_LIB_CRMF, CRMF_R_UNSUPPORTED_POPO_METHOD}, ++ #else ++ {"UNSUPPORTED_POPO_METHOD", 56, 116}, ++ #endif ++ #ifdef CRYPTO_R_BAD_ALGORITHM_NAME ++ {"BAD_ALGORITHM_NAME", ERR_LIB_CRYPTO, CRYPTO_R_BAD_ALGORITHM_NAME}, ++ #else ++ {"BAD_ALGORITHM_NAME", 15, 117}, ++ #endif ++ #ifdef CRYPTO_R_CONFLICTING_NAMES ++ {"CONFLICTING_NAMES", ERR_LIB_CRYPTO, CRYPTO_R_CONFLICTING_NAMES}, ++ #else ++ {"CONFLICTING_NAMES", 15, 118}, ++ #endif ++ #ifdef CRYPTO_R_HEX_STRING_TOO_SHORT ++ {"HEX_STRING_TOO_SHORT", ERR_LIB_CRYPTO, CRYPTO_R_HEX_STRING_TOO_SHORT}, ++ #else ++ {"HEX_STRING_TOO_SHORT", 15, 121}, ++ #endif ++ #ifdef CRYPTO_R_ILLEGAL_HEX_DIGIT ++ {"ILLEGAL_HEX_DIGIT", ERR_LIB_CRYPTO, CRYPTO_R_ILLEGAL_HEX_DIGIT}, ++ #else ++ {"ILLEGAL_HEX_DIGIT", 15, 102}, ++ #endif ++ #ifdef CRYPTO_R_INSUFFICIENT_DATA_SPACE ++ {"INSUFFICIENT_DATA_SPACE", ERR_LIB_CRYPTO, CRYPTO_R_INSUFFICIENT_DATA_SPACE}, ++ #else ++ {"INSUFFICIENT_DATA_SPACE", 15, 106}, ++ #endif ++ #ifdef CRYPTO_R_INSUFFICIENT_PARAM_SIZE ++ {"INSUFFICIENT_PARAM_SIZE", ERR_LIB_CRYPTO, CRYPTO_R_INSUFFICIENT_PARAM_SIZE}, ++ #else ++ {"INSUFFICIENT_PARAM_SIZE", 15, 107}, ++ #endif ++ #ifdef CRYPTO_R_INSUFFICIENT_SECURE_DATA_SPACE ++ {"INSUFFICIENT_SECURE_DATA_SPACE", ERR_LIB_CRYPTO, CRYPTO_R_INSUFFICIENT_SECURE_DATA_SPACE}, ++ #else ++ {"INSUFFICIENT_SECURE_DATA_SPACE", 15, 108}, ++ #endif ++ #ifdef CRYPTO_R_INTEGER_OVERFLOW ++ {"INTEGER_OVERFLOW", ERR_LIB_CRYPTO, CRYPTO_R_INTEGER_OVERFLOW}, ++ #else ++ {"INTEGER_OVERFLOW", 15, 127}, ++ #endif ++ #ifdef CRYPTO_R_INVALID_NEGATIVE_VALUE ++ {"INVALID_NEGATIVE_VALUE", ERR_LIB_CRYPTO, CRYPTO_R_INVALID_NEGATIVE_VALUE}, ++ #else ++ {"INVALID_NEGATIVE_VALUE", 15, 122}, ++ #endif ++ #ifdef CRYPTO_R_INVALID_NULL_ARGUMENT ++ {"INVALID_NULL_ARGUMENT", ERR_LIB_CRYPTO, CRYPTO_R_INVALID_NULL_ARGUMENT}, ++ #else ++ {"INVALID_NULL_ARGUMENT", 15, 109}, ++ #endif ++ #ifdef CRYPTO_R_INVALID_OSSL_PARAM_TYPE ++ {"INVALID_OSSL_PARAM_TYPE", ERR_LIB_CRYPTO, CRYPTO_R_INVALID_OSSL_PARAM_TYPE}, ++ #else ++ {"INVALID_OSSL_PARAM_TYPE", 15, 110}, ++ #endif ++ #ifdef CRYPTO_R_NO_PARAMS_TO_MERGE ++ {"NO_PARAMS_TO_MERGE", ERR_LIB_CRYPTO, CRYPTO_R_NO_PARAMS_TO_MERGE}, ++ #else ++ {"NO_PARAMS_TO_MERGE", 15, 131}, ++ #endif ++ #ifdef CRYPTO_R_NO_SPACE_FOR_TERMINATING_NULL ++ {"NO_SPACE_FOR_TERMINATING_NULL", ERR_LIB_CRYPTO, CRYPTO_R_NO_SPACE_FOR_TERMINATING_NULL}, ++ #else ++ {"NO_SPACE_FOR_TERMINATING_NULL", 15, 128}, ++ #endif ++ #ifdef CRYPTO_R_ODD_NUMBER_OF_DIGITS ++ {"ODD_NUMBER_OF_DIGITS", ERR_LIB_CRYPTO, CRYPTO_R_ODD_NUMBER_OF_DIGITS}, ++ #else ++ {"ODD_NUMBER_OF_DIGITS", 15, 103}, ++ #endif ++ #ifdef CRYPTO_R_PARAM_CANNOT_BE_REPRESENTED_EXACTLY ++ {"PARAM_CANNOT_BE_REPRESENTED_EXACTLY", ERR_LIB_CRYPTO, CRYPTO_R_PARAM_CANNOT_BE_REPRESENTED_EXACTLY}, ++ #else ++ {"PARAM_CANNOT_BE_REPRESENTED_EXACTLY", 15, 123}, ++ #endif ++ #ifdef CRYPTO_R_PARAM_NOT_INTEGER_TYPE ++ {"PARAM_NOT_INTEGER_TYPE", ERR_LIB_CRYPTO, CRYPTO_R_PARAM_NOT_INTEGER_TYPE}, ++ #else ++ {"PARAM_NOT_INTEGER_TYPE", 15, 124}, ++ #endif ++ #ifdef CRYPTO_R_PARAM_OF_INCOMPATIBLE_TYPE ++ {"PARAM_OF_INCOMPATIBLE_TYPE", ERR_LIB_CRYPTO, CRYPTO_R_PARAM_OF_INCOMPATIBLE_TYPE}, ++ #else ++ {"PARAM_OF_INCOMPATIBLE_TYPE", 15, 129}, ++ #endif ++ #ifdef CRYPTO_R_PARAM_UNSIGNED_INTEGER_NEGATIVE_VALUE_UNSUPPORTED ++ {"PARAM_UNSIGNED_INTEGER_NEGATIVE_VALUE_UNSUPPORTED", ERR_LIB_CRYPTO, CRYPTO_R_PARAM_UNSIGNED_INTEGER_NEGATIVE_VALUE_UNSUPPORTED}, ++ #else ++ {"PARAM_UNSIGNED_INTEGER_NEGATIVE_VALUE_UNSUPPORTED", 15, 125}, ++ #endif ++ #ifdef CRYPTO_R_PARAM_UNSUPPORTED_FLOATING_POINT_FORMAT ++ {"PARAM_UNSUPPORTED_FLOATING_POINT_FORMAT", ERR_LIB_CRYPTO, CRYPTO_R_PARAM_UNSUPPORTED_FLOATING_POINT_FORMAT}, ++ #else ++ {"PARAM_UNSUPPORTED_FLOATING_POINT_FORMAT", 15, 130}, ++ #endif ++ #ifdef CRYPTO_R_PARAM_VALUE_TOO_LARGE_FOR_DESTINATION ++ {"PARAM_VALUE_TOO_LARGE_FOR_DESTINATION", ERR_LIB_CRYPTO, CRYPTO_R_PARAM_VALUE_TOO_LARGE_FOR_DESTINATION}, ++ #else ++ {"PARAM_VALUE_TOO_LARGE_FOR_DESTINATION", 15, 126}, ++ #endif ++ #ifdef CRYPTO_R_PROVIDER_ALREADY_EXISTS ++ {"PROVIDER_ALREADY_EXISTS", ERR_LIB_CRYPTO, CRYPTO_R_PROVIDER_ALREADY_EXISTS}, ++ #else ++ {"PROVIDER_ALREADY_EXISTS", 15, 104}, ++ #endif ++ #ifdef CRYPTO_R_PROVIDER_SECTION_ERROR ++ {"PROVIDER_SECTION_ERROR", ERR_LIB_CRYPTO, CRYPTO_R_PROVIDER_SECTION_ERROR}, ++ #else ++ {"PROVIDER_SECTION_ERROR", 15, 105}, ++ #endif ++ #ifdef CRYPTO_R_RANDOM_SECTION_ERROR ++ {"RANDOM_SECTION_ERROR", ERR_LIB_CRYPTO, CRYPTO_R_RANDOM_SECTION_ERROR}, ++ #else ++ {"RANDOM_SECTION_ERROR", 15, 119}, ++ #endif ++ #ifdef CRYPTO_R_SECURE_MALLOC_FAILURE ++ {"SECURE_MALLOC_FAILURE", ERR_LIB_CRYPTO, CRYPTO_R_SECURE_MALLOC_FAILURE}, ++ #else ++ {"SECURE_MALLOC_FAILURE", 15, 111}, ++ #endif ++ #ifdef CRYPTO_R_STRING_TOO_LONG ++ {"STRING_TOO_LONG", ERR_LIB_CRYPTO, CRYPTO_R_STRING_TOO_LONG}, ++ #else ++ {"STRING_TOO_LONG", 15, 112}, ++ #endif ++ #ifdef CRYPTO_R_TOO_MANY_BYTES ++ {"TOO_MANY_BYTES", ERR_LIB_CRYPTO, CRYPTO_R_TOO_MANY_BYTES}, ++ #else ++ {"TOO_MANY_BYTES", 15, 113}, ++ #endif ++ #ifdef CRYPTO_R_TOO_MANY_NAMES ++ {"TOO_MANY_NAMES", ERR_LIB_CRYPTO, CRYPTO_R_TOO_MANY_NAMES}, ++ #else ++ {"TOO_MANY_NAMES", 15, 132}, ++ #endif ++ #ifdef CRYPTO_R_TOO_MANY_RECORDS ++ {"TOO_MANY_RECORDS", ERR_LIB_CRYPTO, CRYPTO_R_TOO_MANY_RECORDS}, ++ #else ++ {"TOO_MANY_RECORDS", 15, 114}, ++ #endif ++ #ifdef CRYPTO_R_TOO_SMALL_BUFFER ++ {"TOO_SMALL_BUFFER", ERR_LIB_CRYPTO, CRYPTO_R_TOO_SMALL_BUFFER}, ++ #else ++ {"TOO_SMALL_BUFFER", 15, 116}, ++ #endif ++ #ifdef CRYPTO_R_UNKNOWN_NAME_IN_RANDOM_SECTION ++ {"UNKNOWN_NAME_IN_RANDOM_SECTION", ERR_LIB_CRYPTO, CRYPTO_R_UNKNOWN_NAME_IN_RANDOM_SECTION}, ++ #else ++ {"UNKNOWN_NAME_IN_RANDOM_SECTION", 15, 120}, ++ #endif ++ #ifdef CRYPTO_R_ZERO_LENGTH_NUMBER ++ {"ZERO_LENGTH_NUMBER", ERR_LIB_CRYPTO, CRYPTO_R_ZERO_LENGTH_NUMBER}, ++ #else ++ {"ZERO_LENGTH_NUMBER", 15, 115}, ++ #endif ++ #ifdef CT_R_BASE64_DECODE_ERROR ++ {"BASE64_DECODE_ERROR", ERR_LIB_CT, CT_R_BASE64_DECODE_ERROR}, ++ #else ++ {"BASE64_DECODE_ERROR", 50, 108}, ++ #endif ++ #ifdef CT_R_INVALID_LOG_ID_LENGTH ++ {"INVALID_LOG_ID_LENGTH", ERR_LIB_CT, CT_R_INVALID_LOG_ID_LENGTH}, ++ #else ++ {"INVALID_LOG_ID_LENGTH", 50, 100}, ++ #endif ++ #ifdef CT_R_LOG_CONF_INVALID ++ {"LOG_CONF_INVALID", ERR_LIB_CT, CT_R_LOG_CONF_INVALID}, ++ #else ++ {"LOG_CONF_INVALID", 50, 109}, ++ #endif ++ #ifdef CT_R_LOG_CONF_INVALID_KEY ++ {"LOG_CONF_INVALID_KEY", ERR_LIB_CT, CT_R_LOG_CONF_INVALID_KEY}, ++ #else ++ {"LOG_CONF_INVALID_KEY", 50, 110}, ++ #endif ++ #ifdef CT_R_LOG_CONF_MISSING_DESCRIPTION ++ {"LOG_CONF_MISSING_DESCRIPTION", ERR_LIB_CT, CT_R_LOG_CONF_MISSING_DESCRIPTION}, ++ #else ++ {"LOG_CONF_MISSING_DESCRIPTION", 50, 111}, ++ #endif ++ #ifdef CT_R_LOG_CONF_MISSING_KEY ++ {"LOG_CONF_MISSING_KEY", ERR_LIB_CT, CT_R_LOG_CONF_MISSING_KEY}, ++ #else ++ {"LOG_CONF_MISSING_KEY", 50, 112}, ++ #endif ++ #ifdef CT_R_LOG_KEY_INVALID ++ {"LOG_KEY_INVALID", ERR_LIB_CT, CT_R_LOG_KEY_INVALID}, ++ #else ++ {"LOG_KEY_INVALID", 50, 113}, ++ #endif ++ #ifdef CT_R_SCT_FUTURE_TIMESTAMP ++ {"SCT_FUTURE_TIMESTAMP", ERR_LIB_CT, CT_R_SCT_FUTURE_TIMESTAMP}, ++ #else ++ {"SCT_FUTURE_TIMESTAMP", 50, 116}, ++ #endif ++ #ifdef CT_R_SCT_INVALID ++ {"SCT_INVALID", ERR_LIB_CT, CT_R_SCT_INVALID}, ++ #else ++ {"SCT_INVALID", 50, 104}, ++ #endif ++ #ifdef CT_R_SCT_INVALID_SIGNATURE ++ {"SCT_INVALID_SIGNATURE", ERR_LIB_CT, CT_R_SCT_INVALID_SIGNATURE}, ++ #else ++ {"SCT_INVALID_SIGNATURE", 50, 107}, ++ #endif ++ #ifdef CT_R_SCT_LIST_INVALID ++ {"SCT_LIST_INVALID", ERR_LIB_CT, CT_R_SCT_LIST_INVALID}, ++ #else ++ {"SCT_LIST_INVALID", 50, 105}, ++ #endif ++ #ifdef CT_R_SCT_LOG_ID_MISMATCH ++ {"SCT_LOG_ID_MISMATCH", ERR_LIB_CT, CT_R_SCT_LOG_ID_MISMATCH}, ++ #else ++ {"SCT_LOG_ID_MISMATCH", 50, 114}, ++ #endif ++ #ifdef CT_R_SCT_NOT_SET ++ {"SCT_NOT_SET", ERR_LIB_CT, CT_R_SCT_NOT_SET}, ++ #else ++ {"SCT_NOT_SET", 50, 106}, ++ #endif ++ #ifdef CT_R_SCT_UNSUPPORTED_VERSION ++ {"SCT_UNSUPPORTED_VERSION", ERR_LIB_CT, CT_R_SCT_UNSUPPORTED_VERSION}, ++ #else ++ {"SCT_UNSUPPORTED_VERSION", 50, 115}, ++ #endif ++ #ifdef CT_R_UNRECOGNIZED_SIGNATURE_NID ++ {"UNRECOGNIZED_SIGNATURE_NID", ERR_LIB_CT, CT_R_UNRECOGNIZED_SIGNATURE_NID}, ++ #else ++ {"UNRECOGNIZED_SIGNATURE_NID", 50, 101}, ++ #endif ++ #ifdef CT_R_UNSUPPORTED_ENTRY_TYPE ++ {"UNSUPPORTED_ENTRY_TYPE", ERR_LIB_CT, CT_R_UNSUPPORTED_ENTRY_TYPE}, ++ #else ++ {"UNSUPPORTED_ENTRY_TYPE", 50, 102}, ++ #endif ++ #ifdef CT_R_UNSUPPORTED_VERSION ++ {"UNSUPPORTED_VERSION", ERR_LIB_CT, CT_R_UNSUPPORTED_VERSION}, ++ #else ++ {"UNSUPPORTED_VERSION", 50, 103}, ++ #endif ++ #ifdef DH_R_BAD_FFC_PARAMETERS ++ {"BAD_FFC_PARAMETERS", ERR_LIB_DH, DH_R_BAD_FFC_PARAMETERS}, ++ #else ++ {"BAD_FFC_PARAMETERS", 5, 127}, ++ #endif ++ #ifdef DH_R_BAD_GENERATOR ++ {"BAD_GENERATOR", ERR_LIB_DH, DH_R_BAD_GENERATOR}, ++ #else ++ {"BAD_GENERATOR", 5, 101}, ++ #endif ++ #ifdef DH_R_BN_DECODE_ERROR ++ {"BN_DECODE_ERROR", ERR_LIB_DH, DH_R_BN_DECODE_ERROR}, ++ #else ++ {"BN_DECODE_ERROR", 5, 109}, ++ #endif ++ #ifdef DH_R_BN_ERROR ++ {"BN_ERROR", ERR_LIB_DH, DH_R_BN_ERROR}, ++ #else ++ {"BN_ERROR", 5, 106}, ++ #endif ++ #ifdef DH_R_CHECK_INVALID_J_VALUE ++ {"CHECK_INVALID_J_VALUE", ERR_LIB_DH, DH_R_CHECK_INVALID_J_VALUE}, ++ #else ++ {"CHECK_INVALID_J_VALUE", 5, 115}, ++ #endif ++ #ifdef DH_R_CHECK_INVALID_Q_VALUE ++ {"CHECK_INVALID_Q_VALUE", ERR_LIB_DH, DH_R_CHECK_INVALID_Q_VALUE}, ++ #else ++ {"CHECK_INVALID_Q_VALUE", 5, 116}, ++ #endif ++ #ifdef DH_R_CHECK_PUBKEY_INVALID ++ {"CHECK_PUBKEY_INVALID", ERR_LIB_DH, DH_R_CHECK_PUBKEY_INVALID}, ++ #else ++ {"CHECK_PUBKEY_INVALID", 5, 122}, ++ #endif ++ #ifdef DH_R_CHECK_PUBKEY_TOO_LARGE ++ {"CHECK_PUBKEY_TOO_LARGE", ERR_LIB_DH, DH_R_CHECK_PUBKEY_TOO_LARGE}, ++ #else ++ {"CHECK_PUBKEY_TOO_LARGE", 5, 123}, ++ #endif ++ #ifdef DH_R_CHECK_PUBKEY_TOO_SMALL ++ {"CHECK_PUBKEY_TOO_SMALL", ERR_LIB_DH, DH_R_CHECK_PUBKEY_TOO_SMALL}, ++ #else ++ {"CHECK_PUBKEY_TOO_SMALL", 5, 124}, ++ #endif ++ #ifdef DH_R_CHECK_P_NOT_PRIME ++ {"CHECK_P_NOT_PRIME", ERR_LIB_DH, DH_R_CHECK_P_NOT_PRIME}, ++ #else ++ {"CHECK_P_NOT_PRIME", 5, 117}, ++ #endif ++ #ifdef DH_R_CHECK_P_NOT_SAFE_PRIME ++ {"CHECK_P_NOT_SAFE_PRIME", ERR_LIB_DH, DH_R_CHECK_P_NOT_SAFE_PRIME}, ++ #else ++ {"CHECK_P_NOT_SAFE_PRIME", 5, 118}, ++ #endif ++ #ifdef DH_R_CHECK_Q_NOT_PRIME ++ {"CHECK_Q_NOT_PRIME", ERR_LIB_DH, DH_R_CHECK_Q_NOT_PRIME}, ++ #else ++ {"CHECK_Q_NOT_PRIME", 5, 119}, ++ #endif ++ #ifdef DH_R_DECODE_ERROR ++ {"DECODE_ERROR", ERR_LIB_DH, DH_R_DECODE_ERROR}, ++ #else ++ {"DECODE_ERROR", 5, 104}, ++ #endif ++ #ifdef DH_R_INVALID_PARAMETER_NAME ++ {"INVALID_PARAMETER_NAME", ERR_LIB_DH, DH_R_INVALID_PARAMETER_NAME}, ++ #else ++ {"INVALID_PARAMETER_NAME", 5, 110}, ++ #endif ++ #ifdef DH_R_INVALID_PARAMETER_NID ++ {"INVALID_PARAMETER_NID", ERR_LIB_DH, DH_R_INVALID_PARAMETER_NID}, ++ #else ++ {"INVALID_PARAMETER_NID", 5, 114}, ++ #endif ++ #ifdef DH_R_INVALID_PUBKEY ++ {"INVALID_PUBKEY", ERR_LIB_DH, DH_R_INVALID_PUBKEY}, ++ #else ++ {"INVALID_PUBKEY", 5, 102}, ++ #endif ++ #ifdef DH_R_INVALID_SECRET ++ {"INVALID_SECRET", ERR_LIB_DH, DH_R_INVALID_SECRET}, ++ #else ++ {"INVALID_SECRET", 5, 128}, ++ #endif ++ #ifdef DH_R_INVALID_SIZE ++ {"INVALID_SIZE", ERR_LIB_DH, DH_R_INVALID_SIZE}, ++ #else ++ {"INVALID_SIZE", 5, 129}, ++ #endif ++ #ifdef DH_R_KDF_PARAMETER_ERROR ++ {"KDF_PARAMETER_ERROR", ERR_LIB_DH, DH_R_KDF_PARAMETER_ERROR}, ++ #else ++ {"KDF_PARAMETER_ERROR", 5, 112}, ++ #endif ++ #ifdef DH_R_KEYS_NOT_SET ++ {"KEYS_NOT_SET", ERR_LIB_DH, DH_R_KEYS_NOT_SET}, ++ #else ++ {"KEYS_NOT_SET", 5, 108}, ++ #endif ++ #ifdef DH_R_MISSING_PUBKEY ++ {"MISSING_PUBKEY", ERR_LIB_DH, DH_R_MISSING_PUBKEY}, ++ #else ++ {"MISSING_PUBKEY", 5, 125}, ++ #endif ++ #ifdef DH_R_MODULUS_TOO_LARGE ++ {"MODULUS_TOO_LARGE", ERR_LIB_DH, DH_R_MODULUS_TOO_LARGE}, ++ #else ++ {"MODULUS_TOO_LARGE", 5, 103}, ++ #endif ++ #ifdef DH_R_MODULUS_TOO_SMALL ++ {"MODULUS_TOO_SMALL", ERR_LIB_DH, DH_R_MODULUS_TOO_SMALL}, ++ #else ++ {"MODULUS_TOO_SMALL", 5, 126}, ++ #endif ++ #ifdef DH_R_NOT_SUITABLE_GENERATOR ++ {"NOT_SUITABLE_GENERATOR", ERR_LIB_DH, DH_R_NOT_SUITABLE_GENERATOR}, ++ #else ++ {"NOT_SUITABLE_GENERATOR", 5, 120}, ++ #endif ++ #ifdef DH_R_NO_PARAMETERS_SET ++ {"NO_PARAMETERS_SET", ERR_LIB_DH, DH_R_NO_PARAMETERS_SET}, ++ #else ++ {"NO_PARAMETERS_SET", 5, 107}, ++ #endif ++ #ifdef DH_R_NO_PRIVATE_VALUE ++ {"NO_PRIVATE_VALUE", ERR_LIB_DH, DH_R_NO_PRIVATE_VALUE}, ++ #else ++ {"NO_PRIVATE_VALUE", 5, 100}, ++ #endif ++ #ifdef DH_R_PARAMETER_ENCODING_ERROR ++ {"PARAMETER_ENCODING_ERROR", ERR_LIB_DH, DH_R_PARAMETER_ENCODING_ERROR}, ++ #else ++ {"PARAMETER_ENCODING_ERROR", 5, 105}, ++ #endif ++ #ifdef DH_R_PEER_KEY_ERROR ++ {"PEER_KEY_ERROR", ERR_LIB_DH, DH_R_PEER_KEY_ERROR}, ++ #else ++ {"PEER_KEY_ERROR", 5, 111}, ++ #endif ++ #ifdef DH_R_Q_TOO_LARGE ++ {"Q_TOO_LARGE", ERR_LIB_DH, DH_R_Q_TOO_LARGE}, ++ #else ++ {"Q_TOO_LARGE", 5, 130}, ++ #endif ++ #ifdef DH_R_SHARED_INFO_ERROR ++ {"SHARED_INFO_ERROR", ERR_LIB_DH, DH_R_SHARED_INFO_ERROR}, ++ #else ++ {"SHARED_INFO_ERROR", 5, 113}, ++ #endif ++ #ifdef DH_R_UNABLE_TO_CHECK_GENERATOR ++ {"UNABLE_TO_CHECK_GENERATOR", ERR_LIB_DH, DH_R_UNABLE_TO_CHECK_GENERATOR}, ++ #else ++ {"UNABLE_TO_CHECK_GENERATOR", 5, 121}, ++ #endif ++ #ifdef DSA_R_BAD_FFC_PARAMETERS ++ {"BAD_FFC_PARAMETERS", ERR_LIB_DSA, DSA_R_BAD_FFC_PARAMETERS}, ++ #else ++ {"BAD_FFC_PARAMETERS", 10, 114}, ++ #endif ++ #ifdef DSA_R_BAD_Q_VALUE ++ {"BAD_Q_VALUE", ERR_LIB_DSA, DSA_R_BAD_Q_VALUE}, ++ #else ++ {"BAD_Q_VALUE", 10, 102}, ++ #endif ++ #ifdef DSA_R_BN_DECODE_ERROR ++ {"BN_DECODE_ERROR", ERR_LIB_DSA, DSA_R_BN_DECODE_ERROR}, ++ #else ++ {"BN_DECODE_ERROR", 10, 108}, ++ #endif ++ #ifdef DSA_R_BN_ERROR ++ {"BN_ERROR", ERR_LIB_DSA, DSA_R_BN_ERROR}, ++ #else ++ {"BN_ERROR", 10, 109}, ++ #endif ++ #ifdef DSA_R_DECODE_ERROR ++ {"DECODE_ERROR", ERR_LIB_DSA, DSA_R_DECODE_ERROR}, ++ #else ++ {"DECODE_ERROR", 10, 104}, ++ #endif ++ #ifdef DSA_R_INVALID_DIGEST_TYPE ++ {"INVALID_DIGEST_TYPE", ERR_LIB_DSA, DSA_R_INVALID_DIGEST_TYPE}, ++ #else ++ {"INVALID_DIGEST_TYPE", 10, 106}, ++ #endif ++ #ifdef DSA_R_INVALID_PARAMETERS ++ {"INVALID_PARAMETERS", ERR_LIB_DSA, DSA_R_INVALID_PARAMETERS}, ++ #else ++ {"INVALID_PARAMETERS", 10, 112}, ++ #endif ++ #ifdef DSA_R_MISSING_PARAMETERS ++ {"MISSING_PARAMETERS", ERR_LIB_DSA, DSA_R_MISSING_PARAMETERS}, ++ #else ++ {"MISSING_PARAMETERS", 10, 101}, ++ #endif ++ #ifdef DSA_R_MISSING_PRIVATE_KEY ++ {"MISSING_PRIVATE_KEY", ERR_LIB_DSA, DSA_R_MISSING_PRIVATE_KEY}, ++ #else ++ {"MISSING_PRIVATE_KEY", 10, 111}, ++ #endif ++ #ifdef DSA_R_MODULUS_TOO_LARGE ++ {"MODULUS_TOO_LARGE", ERR_LIB_DSA, DSA_R_MODULUS_TOO_LARGE}, ++ #else ++ {"MODULUS_TOO_LARGE", 10, 103}, ++ #endif ++ #ifdef DSA_R_NO_PARAMETERS_SET ++ {"NO_PARAMETERS_SET", ERR_LIB_DSA, DSA_R_NO_PARAMETERS_SET}, ++ #else ++ {"NO_PARAMETERS_SET", 10, 107}, ++ #endif ++ #ifdef DSA_R_PARAMETER_ENCODING_ERROR ++ {"PARAMETER_ENCODING_ERROR", ERR_LIB_DSA, DSA_R_PARAMETER_ENCODING_ERROR}, ++ #else ++ {"PARAMETER_ENCODING_ERROR", 10, 105}, ++ #endif ++ #ifdef DSA_R_P_NOT_PRIME ++ {"P_NOT_PRIME", ERR_LIB_DSA, DSA_R_P_NOT_PRIME}, ++ #else ++ {"P_NOT_PRIME", 10, 115}, ++ #endif ++ #ifdef DSA_R_Q_NOT_PRIME ++ {"Q_NOT_PRIME", ERR_LIB_DSA, DSA_R_Q_NOT_PRIME}, ++ #else ++ {"Q_NOT_PRIME", 10, 113}, ++ #endif ++ #ifdef DSA_R_SEED_LEN_SMALL ++ {"SEED_LEN_SMALL", ERR_LIB_DSA, DSA_R_SEED_LEN_SMALL}, ++ #else ++ {"SEED_LEN_SMALL", 10, 110}, ++ #endif ++ #ifdef DSA_R_TOO_MANY_RETRIES ++ {"TOO_MANY_RETRIES", ERR_LIB_DSA, DSA_R_TOO_MANY_RETRIES}, ++ #else ++ {"TOO_MANY_RETRIES", 10, 116}, ++ #endif ++ #ifdef DSO_R_CTRL_FAILED ++ {"CTRL_FAILED", ERR_LIB_DSO, DSO_R_CTRL_FAILED}, ++ #else ++ {"CTRL_FAILED", 37, 100}, ++ #endif ++ #ifdef DSO_R_DSO_ALREADY_LOADED ++ {"DSO_ALREADY_LOADED", ERR_LIB_DSO, DSO_R_DSO_ALREADY_LOADED}, ++ #else ++ {"DSO_ALREADY_LOADED", 37, 110}, ++ #endif ++ #ifdef DSO_R_EMPTY_FILE_STRUCTURE ++ {"EMPTY_FILE_STRUCTURE", ERR_LIB_DSO, DSO_R_EMPTY_FILE_STRUCTURE}, ++ #else ++ {"EMPTY_FILE_STRUCTURE", 37, 113}, ++ #endif ++ #ifdef DSO_R_FAILURE ++ {"FAILURE", ERR_LIB_DSO, DSO_R_FAILURE}, ++ #else ++ {"FAILURE", 37, 114}, ++ #endif ++ #ifdef DSO_R_FILENAME_TOO_BIG ++ {"FILENAME_TOO_BIG", ERR_LIB_DSO, DSO_R_FILENAME_TOO_BIG}, ++ #else ++ {"FILENAME_TOO_BIG", 37, 101}, ++ #endif ++ #ifdef DSO_R_FINISH_FAILED ++ {"FINISH_FAILED", ERR_LIB_DSO, DSO_R_FINISH_FAILED}, ++ #else ++ {"FINISH_FAILED", 37, 102}, ++ #endif ++ #ifdef DSO_R_INCORRECT_FILE_SYNTAX ++ {"INCORRECT_FILE_SYNTAX", ERR_LIB_DSO, DSO_R_INCORRECT_FILE_SYNTAX}, ++ #else ++ {"INCORRECT_FILE_SYNTAX", 37, 115}, ++ #endif ++ #ifdef DSO_R_LOAD_FAILED ++ {"LOAD_FAILED", ERR_LIB_DSO, DSO_R_LOAD_FAILED}, ++ #else ++ {"LOAD_FAILED", 37, 103}, ++ #endif ++ #ifdef DSO_R_NAME_TRANSLATION_FAILED ++ {"NAME_TRANSLATION_FAILED", ERR_LIB_DSO, DSO_R_NAME_TRANSLATION_FAILED}, ++ #else ++ {"NAME_TRANSLATION_FAILED", 37, 109}, ++ #endif ++ #ifdef DSO_R_NO_FILENAME ++ {"NO_FILENAME", ERR_LIB_DSO, DSO_R_NO_FILENAME}, ++ #else ++ {"NO_FILENAME", 37, 111}, ++ #endif ++ #ifdef DSO_R_NULL_HANDLE ++ {"NULL_HANDLE", ERR_LIB_DSO, DSO_R_NULL_HANDLE}, ++ #else ++ {"NULL_HANDLE", 37, 104}, ++ #endif ++ #ifdef DSO_R_SET_FILENAME_FAILED ++ {"SET_FILENAME_FAILED", ERR_LIB_DSO, DSO_R_SET_FILENAME_FAILED}, ++ #else ++ {"SET_FILENAME_FAILED", 37, 112}, ++ #endif ++ #ifdef DSO_R_STACK_ERROR ++ {"STACK_ERROR", ERR_LIB_DSO, DSO_R_STACK_ERROR}, ++ #else ++ {"STACK_ERROR", 37, 105}, ++ #endif ++ #ifdef DSO_R_SYM_FAILURE ++ {"SYM_FAILURE", ERR_LIB_DSO, DSO_R_SYM_FAILURE}, ++ #else ++ {"SYM_FAILURE", 37, 106}, ++ #endif ++ #ifdef DSO_R_UNLOAD_FAILED ++ {"UNLOAD_FAILED", ERR_LIB_DSO, DSO_R_UNLOAD_FAILED}, ++ #else ++ {"UNLOAD_FAILED", 37, 107}, ++ #endif ++ #ifdef DSO_R_UNSUPPORTED ++ {"UNSUPPORTED", ERR_LIB_DSO, DSO_R_UNSUPPORTED}, ++ #else ++ {"UNSUPPORTED", 37, 108}, ++ #endif ++ #ifdef EC_R_ASN1_ERROR ++ {"ASN1_ERROR", ERR_LIB_EC, EC_R_ASN1_ERROR}, ++ #else ++ {"ASN1_ERROR", 16, 115}, ++ #endif ++ #ifdef EC_R_BAD_SIGNATURE ++ {"BAD_SIGNATURE", ERR_LIB_EC, EC_R_BAD_SIGNATURE}, ++ #else ++ {"BAD_SIGNATURE", 16, 156}, ++ #endif ++ #ifdef EC_R_BIGNUM_OUT_OF_RANGE ++ {"BIGNUM_OUT_OF_RANGE", ERR_LIB_EC, EC_R_BIGNUM_OUT_OF_RANGE}, ++ #else ++ {"BIGNUM_OUT_OF_RANGE", 16, 144}, ++ #endif ++ #ifdef EC_R_BUFFER_TOO_SMALL ++ {"BUFFER_TOO_SMALL", ERR_LIB_EC, EC_R_BUFFER_TOO_SMALL}, ++ #else ++ {"BUFFER_TOO_SMALL", 16, 100}, ++ #endif ++ #ifdef EC_R_CANNOT_INVERT ++ {"CANNOT_INVERT", ERR_LIB_EC, EC_R_CANNOT_INVERT}, ++ #else ++ {"CANNOT_INVERT", 16, 165}, ++ #endif ++ #ifdef EC_R_COORDINATES_OUT_OF_RANGE ++ {"COORDINATES_OUT_OF_RANGE", ERR_LIB_EC, EC_R_COORDINATES_OUT_OF_RANGE}, ++ #else ++ {"COORDINATES_OUT_OF_RANGE", 16, 146}, ++ #endif ++ #ifdef EC_R_CURVE_DOES_NOT_SUPPORT_ECDH ++ {"CURVE_DOES_NOT_SUPPORT_ECDH", ERR_LIB_EC, EC_R_CURVE_DOES_NOT_SUPPORT_ECDH}, ++ #else ++ {"CURVE_DOES_NOT_SUPPORT_ECDH", 16, 160}, ++ #endif ++ #ifdef EC_R_CURVE_DOES_NOT_SUPPORT_ECDSA ++ {"CURVE_DOES_NOT_SUPPORT_ECDSA", ERR_LIB_EC, EC_R_CURVE_DOES_NOT_SUPPORT_ECDSA}, ++ #else ++ {"CURVE_DOES_NOT_SUPPORT_ECDSA", 16, 170}, ++ #endif ++ #ifdef EC_R_CURVE_DOES_NOT_SUPPORT_SIGNING ++ {"CURVE_DOES_NOT_SUPPORT_SIGNING", ERR_LIB_EC, EC_R_CURVE_DOES_NOT_SUPPORT_SIGNING}, ++ #else ++ {"CURVE_DOES_NOT_SUPPORT_SIGNING", 16, 159}, ++ #endif ++ #ifdef EC_R_DECODE_ERROR ++ {"DECODE_ERROR", ERR_LIB_EC, EC_R_DECODE_ERROR}, ++ #else ++ {"DECODE_ERROR", 16, 142}, ++ #endif ++ #ifdef EC_R_DISCRIMINANT_IS_ZERO ++ {"DISCRIMINANT_IS_ZERO", ERR_LIB_EC, EC_R_DISCRIMINANT_IS_ZERO}, ++ #else ++ {"DISCRIMINANT_IS_ZERO", 16, 118}, ++ #endif ++ #ifdef EC_R_EC_GROUP_NEW_BY_NAME_FAILURE ++ {"EC_GROUP_NEW_BY_NAME_FAILURE", ERR_LIB_EC, EC_R_EC_GROUP_NEW_BY_NAME_FAILURE}, ++ #else ++ {"EC_GROUP_NEW_BY_NAME_FAILURE", 16, 119}, ++ #endif ++ #ifdef EC_R_EXPLICIT_PARAMS_NOT_SUPPORTED ++ {"EXPLICIT_PARAMS_NOT_SUPPORTED", ERR_LIB_EC, EC_R_EXPLICIT_PARAMS_NOT_SUPPORTED}, ++ #else ++ {"EXPLICIT_PARAMS_NOT_SUPPORTED", 16, 127}, ++ #endif ++ #ifdef EC_R_FAILED_MAKING_PUBLIC_KEY ++ {"FAILED_MAKING_PUBLIC_KEY", ERR_LIB_EC, EC_R_FAILED_MAKING_PUBLIC_KEY}, ++ #else ++ {"FAILED_MAKING_PUBLIC_KEY", 16, 166}, ++ #endif ++ #ifdef EC_R_FIELD_TOO_LARGE ++ {"FIELD_TOO_LARGE", ERR_LIB_EC, EC_R_FIELD_TOO_LARGE}, ++ #else ++ {"FIELD_TOO_LARGE", 16, 143}, ++ #endif ++ #ifdef EC_R_GF2M_NOT_SUPPORTED ++ {"GF2M_NOT_SUPPORTED", ERR_LIB_EC, EC_R_GF2M_NOT_SUPPORTED}, ++ #else ++ {"GF2M_NOT_SUPPORTED", 16, 147}, ++ #endif ++ #ifdef EC_R_GROUP2PKPARAMETERS_FAILURE ++ {"GROUP2PKPARAMETERS_FAILURE", ERR_LIB_EC, EC_R_GROUP2PKPARAMETERS_FAILURE}, ++ #else ++ {"GROUP2PKPARAMETERS_FAILURE", 16, 120}, ++ #endif ++ #ifdef EC_R_I2D_ECPKPARAMETERS_FAILURE ++ {"I2D_ECPKPARAMETERS_FAILURE", ERR_LIB_EC, EC_R_I2D_ECPKPARAMETERS_FAILURE}, ++ #else ++ {"I2D_ECPKPARAMETERS_FAILURE", 16, 121}, ++ #endif ++ #ifdef EC_R_INCOMPATIBLE_OBJECTS ++ {"INCOMPATIBLE_OBJECTS", ERR_LIB_EC, EC_R_INCOMPATIBLE_OBJECTS}, ++ #else ++ {"INCOMPATIBLE_OBJECTS", 16, 101}, ++ #endif ++ #ifdef EC_R_INVALID_A ++ {"INVALID_A", ERR_LIB_EC, EC_R_INVALID_A}, ++ #else ++ {"INVALID_A", 16, 168}, ++ #endif ++ #ifdef EC_R_INVALID_ARGUMENT ++ {"INVALID_ARGUMENT", ERR_LIB_EC, EC_R_INVALID_ARGUMENT}, ++ #else ++ {"INVALID_ARGUMENT", 16, 112}, ++ #endif ++ #ifdef EC_R_INVALID_B ++ {"INVALID_B", ERR_LIB_EC, EC_R_INVALID_B}, ++ #else ++ {"INVALID_B", 16, 169}, ++ #endif ++ #ifdef EC_R_INVALID_COFACTOR ++ {"INVALID_COFACTOR", ERR_LIB_EC, EC_R_INVALID_COFACTOR}, ++ #else ++ {"INVALID_COFACTOR", 16, 171}, ++ #endif ++ #ifdef EC_R_INVALID_COMPRESSED_POINT ++ {"INVALID_COMPRESSED_POINT", ERR_LIB_EC, EC_R_INVALID_COMPRESSED_POINT}, ++ #else ++ {"INVALID_COMPRESSED_POINT", 16, 110}, ++ #endif ++ #ifdef EC_R_INVALID_COMPRESSION_BIT ++ {"INVALID_COMPRESSION_BIT", ERR_LIB_EC, EC_R_INVALID_COMPRESSION_BIT}, ++ #else ++ {"INVALID_COMPRESSION_BIT", 16, 109}, ++ #endif ++ #ifdef EC_R_INVALID_CURVE ++ {"INVALID_CURVE", ERR_LIB_EC, EC_R_INVALID_CURVE}, ++ #else ++ {"INVALID_CURVE", 16, 141}, ++ #endif ++ #ifdef EC_R_INVALID_DIGEST ++ {"INVALID_DIGEST", ERR_LIB_EC, EC_R_INVALID_DIGEST}, ++ #else ++ {"INVALID_DIGEST", 16, 151}, ++ #endif ++ #ifdef EC_R_INVALID_DIGEST_TYPE ++ {"INVALID_DIGEST_TYPE", ERR_LIB_EC, EC_R_INVALID_DIGEST_TYPE}, ++ #else ++ {"INVALID_DIGEST_TYPE", 16, 138}, ++ #endif ++ #ifdef EC_R_INVALID_ENCODING ++ {"INVALID_ENCODING", ERR_LIB_EC, EC_R_INVALID_ENCODING}, ++ #else ++ {"INVALID_ENCODING", 16, 102}, ++ #endif ++ #ifdef EC_R_INVALID_FIELD ++ {"INVALID_FIELD", ERR_LIB_EC, EC_R_INVALID_FIELD}, ++ #else ++ {"INVALID_FIELD", 16, 103}, ++ #endif ++ #ifdef EC_R_INVALID_FORM ++ {"INVALID_FORM", ERR_LIB_EC, EC_R_INVALID_FORM}, ++ #else ++ {"INVALID_FORM", 16, 104}, ++ #endif ++ #ifdef EC_R_INVALID_GENERATOR ++ {"INVALID_GENERATOR", ERR_LIB_EC, EC_R_INVALID_GENERATOR}, ++ #else ++ {"INVALID_GENERATOR", 16, 173}, ++ #endif ++ #ifdef EC_R_INVALID_GROUP_ORDER ++ {"INVALID_GROUP_ORDER", ERR_LIB_EC, EC_R_INVALID_GROUP_ORDER}, ++ #else ++ {"INVALID_GROUP_ORDER", 16, 122}, ++ #endif ++ #ifdef EC_R_INVALID_KEY ++ {"INVALID_KEY", ERR_LIB_EC, EC_R_INVALID_KEY}, ++ #else ++ {"INVALID_KEY", 16, 116}, ++ #endif ++ #ifdef EC_R_INVALID_LENGTH ++ {"INVALID_LENGTH", ERR_LIB_EC, EC_R_INVALID_LENGTH}, ++ #else ++ {"INVALID_LENGTH", 16, 117}, ++ #endif ++ #ifdef EC_R_INVALID_NAMED_GROUP_CONVERSION ++ {"INVALID_NAMED_GROUP_CONVERSION", ERR_LIB_EC, EC_R_INVALID_NAMED_GROUP_CONVERSION}, ++ #else ++ {"INVALID_NAMED_GROUP_CONVERSION", 16, 174}, ++ #endif ++ #ifdef EC_R_INVALID_OUTPUT_LENGTH ++ {"INVALID_OUTPUT_LENGTH", ERR_LIB_EC, EC_R_INVALID_OUTPUT_LENGTH}, ++ #else ++ {"INVALID_OUTPUT_LENGTH", 16, 161}, ++ #endif ++ #ifdef EC_R_INVALID_P ++ {"INVALID_P", ERR_LIB_EC, EC_R_INVALID_P}, ++ #else ++ {"INVALID_P", 16, 172}, ++ #endif ++ #ifdef EC_R_INVALID_PEER_KEY ++ {"INVALID_PEER_KEY", ERR_LIB_EC, EC_R_INVALID_PEER_KEY}, ++ #else ++ {"INVALID_PEER_KEY", 16, 133}, ++ #endif ++ #ifdef EC_R_INVALID_PENTANOMIAL_BASIS ++ {"INVALID_PENTANOMIAL_BASIS", ERR_LIB_EC, EC_R_INVALID_PENTANOMIAL_BASIS}, ++ #else ++ {"INVALID_PENTANOMIAL_BASIS", 16, 132}, ++ #endif ++ #ifdef EC_R_INVALID_PRIVATE_KEY ++ {"INVALID_PRIVATE_KEY", ERR_LIB_EC, EC_R_INVALID_PRIVATE_KEY}, ++ #else ++ {"INVALID_PRIVATE_KEY", 16, 123}, ++ #endif ++ #ifdef EC_R_INVALID_SEED ++ {"INVALID_SEED", ERR_LIB_EC, EC_R_INVALID_SEED}, ++ #else ++ {"INVALID_SEED", 16, 175}, ++ #endif ++ #ifdef EC_R_INVALID_TRINOMIAL_BASIS ++ {"INVALID_TRINOMIAL_BASIS", ERR_LIB_EC, EC_R_INVALID_TRINOMIAL_BASIS}, ++ #else ++ {"INVALID_TRINOMIAL_BASIS", 16, 137}, ++ #endif ++ #ifdef EC_R_KDF_PARAMETER_ERROR ++ {"KDF_PARAMETER_ERROR", ERR_LIB_EC, EC_R_KDF_PARAMETER_ERROR}, ++ #else ++ {"KDF_PARAMETER_ERROR", 16, 148}, ++ #endif ++ #ifdef EC_R_KEYS_NOT_SET ++ {"KEYS_NOT_SET", ERR_LIB_EC, EC_R_KEYS_NOT_SET}, ++ #else ++ {"KEYS_NOT_SET", 16, 140}, ++ #endif ++ #ifdef EC_R_LADDER_POST_FAILURE ++ {"LADDER_POST_FAILURE", ERR_LIB_EC, EC_R_LADDER_POST_FAILURE}, ++ #else ++ {"LADDER_POST_FAILURE", 16, 136}, ++ #endif ++ #ifdef EC_R_LADDER_PRE_FAILURE ++ {"LADDER_PRE_FAILURE", ERR_LIB_EC, EC_R_LADDER_PRE_FAILURE}, ++ #else ++ {"LADDER_PRE_FAILURE", 16, 153}, ++ #endif ++ #ifdef EC_R_LADDER_STEP_FAILURE ++ {"LADDER_STEP_FAILURE", ERR_LIB_EC, EC_R_LADDER_STEP_FAILURE}, ++ #else ++ {"LADDER_STEP_FAILURE", 16, 162}, ++ #endif ++ #ifdef EC_R_MISSING_OID ++ {"MISSING_OID", ERR_LIB_EC, EC_R_MISSING_OID}, ++ #else ++ {"MISSING_OID", 16, 167}, ++ #endif ++ #ifdef EC_R_MISSING_PARAMETERS ++ {"MISSING_PARAMETERS", ERR_LIB_EC, EC_R_MISSING_PARAMETERS}, ++ #else ++ {"MISSING_PARAMETERS", 16, 124}, ++ #endif ++ #ifdef EC_R_MISSING_PRIVATE_KEY ++ {"MISSING_PRIVATE_KEY", ERR_LIB_EC, EC_R_MISSING_PRIVATE_KEY}, ++ #else ++ {"MISSING_PRIVATE_KEY", 16, 125}, ++ #endif ++ #ifdef EC_R_NEED_NEW_SETUP_VALUES ++ {"NEED_NEW_SETUP_VALUES", ERR_LIB_EC, EC_R_NEED_NEW_SETUP_VALUES}, ++ #else ++ {"NEED_NEW_SETUP_VALUES", 16, 157}, ++ #endif ++ #ifdef EC_R_NOT_A_NIST_PRIME ++ {"NOT_A_NIST_PRIME", ERR_LIB_EC, EC_R_NOT_A_NIST_PRIME}, ++ #else ++ {"NOT_A_NIST_PRIME", 16, 135}, ++ #endif ++ #ifdef EC_R_NOT_IMPLEMENTED ++ {"NOT_IMPLEMENTED", ERR_LIB_EC, EC_R_NOT_IMPLEMENTED}, ++ #else ++ {"NOT_IMPLEMENTED", 16, 126}, ++ #endif ++ #ifdef EC_R_NOT_INITIALIZED ++ {"NOT_INITIALIZED", ERR_LIB_EC, EC_R_NOT_INITIALIZED}, ++ #else ++ {"NOT_INITIALIZED", 16, 111}, ++ #endif ++ #ifdef EC_R_NO_PARAMETERS_SET ++ {"NO_PARAMETERS_SET", ERR_LIB_EC, EC_R_NO_PARAMETERS_SET}, ++ #else ++ {"NO_PARAMETERS_SET", 16, 139}, ++ #endif ++ #ifdef EC_R_NO_PRIVATE_VALUE ++ {"NO_PRIVATE_VALUE", ERR_LIB_EC, EC_R_NO_PRIVATE_VALUE}, ++ #else ++ {"NO_PRIVATE_VALUE", 16, 154}, ++ #endif ++ #ifdef EC_R_OPERATION_NOT_SUPPORTED ++ {"OPERATION_NOT_SUPPORTED", ERR_LIB_EC, EC_R_OPERATION_NOT_SUPPORTED}, ++ #else ++ {"OPERATION_NOT_SUPPORTED", 16, 152}, ++ #endif ++ #ifdef EC_R_PASSED_NULL_PARAMETER ++ {"PASSED_NULL_PARAMETER", ERR_LIB_EC, EC_R_PASSED_NULL_PARAMETER}, ++ #else ++ {"PASSED_NULL_PARAMETER", 16, 134}, ++ #endif ++ #ifdef EC_R_PEER_KEY_ERROR ++ {"PEER_KEY_ERROR", ERR_LIB_EC, EC_R_PEER_KEY_ERROR}, ++ #else ++ {"PEER_KEY_ERROR", 16, 149}, ++ #endif ++ #ifdef EC_R_POINT_ARITHMETIC_FAILURE ++ {"POINT_ARITHMETIC_FAILURE", ERR_LIB_EC, EC_R_POINT_ARITHMETIC_FAILURE}, ++ #else ++ {"POINT_ARITHMETIC_FAILURE", 16, 155}, ++ #endif ++ #ifdef EC_R_POINT_AT_INFINITY ++ {"POINT_AT_INFINITY", ERR_LIB_EC, EC_R_POINT_AT_INFINITY}, ++ #else ++ {"POINT_AT_INFINITY", 16, 106}, ++ #endif ++ #ifdef EC_R_POINT_COORDINATES_BLIND_FAILURE ++ {"POINT_COORDINATES_BLIND_FAILURE", ERR_LIB_EC, EC_R_POINT_COORDINATES_BLIND_FAILURE}, ++ #else ++ {"POINT_COORDINATES_BLIND_FAILURE", 16, 163}, ++ #endif ++ #ifdef EC_R_POINT_IS_NOT_ON_CURVE ++ {"POINT_IS_NOT_ON_CURVE", ERR_LIB_EC, EC_R_POINT_IS_NOT_ON_CURVE}, ++ #else ++ {"POINT_IS_NOT_ON_CURVE", 16, 107}, ++ #endif ++ #ifdef EC_R_RANDOM_NUMBER_GENERATION_FAILED ++ {"RANDOM_NUMBER_GENERATION_FAILED", ERR_LIB_EC, EC_R_RANDOM_NUMBER_GENERATION_FAILED}, ++ #else ++ {"RANDOM_NUMBER_GENERATION_FAILED", 16, 158}, ++ #endif ++ #ifdef EC_R_SHARED_INFO_ERROR ++ {"SHARED_INFO_ERROR", ERR_LIB_EC, EC_R_SHARED_INFO_ERROR}, ++ #else ++ {"SHARED_INFO_ERROR", 16, 150}, ++ #endif ++ #ifdef EC_R_SLOT_FULL ++ {"SLOT_FULL", ERR_LIB_EC, EC_R_SLOT_FULL}, ++ #else ++ {"SLOT_FULL", 16, 108}, ++ #endif ++ #ifdef EC_R_TOO_MANY_RETRIES ++ {"TOO_MANY_RETRIES", ERR_LIB_EC, EC_R_TOO_MANY_RETRIES}, ++ #else ++ {"TOO_MANY_RETRIES", 16, 176}, ++ #endif ++ #ifdef EC_R_UNDEFINED_GENERATOR ++ {"UNDEFINED_GENERATOR", ERR_LIB_EC, EC_R_UNDEFINED_GENERATOR}, ++ #else ++ {"UNDEFINED_GENERATOR", 16, 113}, ++ #endif ++ #ifdef EC_R_UNDEFINED_ORDER ++ {"UNDEFINED_ORDER", ERR_LIB_EC, EC_R_UNDEFINED_ORDER}, ++ #else ++ {"UNDEFINED_ORDER", 16, 128}, ++ #endif ++ #ifdef EC_R_UNKNOWN_COFACTOR ++ {"UNKNOWN_COFACTOR", ERR_LIB_EC, EC_R_UNKNOWN_COFACTOR}, ++ #else ++ {"UNKNOWN_COFACTOR", 16, 164}, ++ #endif ++ #ifdef EC_R_UNKNOWN_GROUP ++ {"UNKNOWN_GROUP", ERR_LIB_EC, EC_R_UNKNOWN_GROUP}, ++ #else ++ {"UNKNOWN_GROUP", 16, 129}, ++ #endif ++ #ifdef EC_R_UNKNOWN_ORDER ++ {"UNKNOWN_ORDER", ERR_LIB_EC, EC_R_UNKNOWN_ORDER}, ++ #else ++ {"UNKNOWN_ORDER", 16, 114}, ++ #endif ++ #ifdef EC_R_UNSUPPORTED_FIELD ++ {"UNSUPPORTED_FIELD", ERR_LIB_EC, EC_R_UNSUPPORTED_FIELD}, ++ #else ++ {"UNSUPPORTED_FIELD", 16, 131}, ++ #endif ++ #ifdef EC_R_WRONG_CURVE_PARAMETERS ++ {"WRONG_CURVE_PARAMETERS", ERR_LIB_EC, EC_R_WRONG_CURVE_PARAMETERS}, ++ #else ++ {"WRONG_CURVE_PARAMETERS", 16, 145}, ++ #endif ++ #ifdef EC_R_WRONG_ORDER ++ {"WRONG_ORDER", ERR_LIB_EC, EC_R_WRONG_ORDER}, ++ #else ++ {"WRONG_ORDER", 16, 130}, ++ #endif ++ #ifdef ENGINE_R_ALREADY_LOADED ++ {"ALREADY_LOADED", ERR_LIB_ENGINE, ENGINE_R_ALREADY_LOADED}, ++ #else ++ {"ALREADY_LOADED", 38, 100}, ++ #endif ++ #ifdef ENGINE_R_ARGUMENT_IS_NOT_A_NUMBER ++ {"ARGUMENT_IS_NOT_A_NUMBER", ERR_LIB_ENGINE, ENGINE_R_ARGUMENT_IS_NOT_A_NUMBER}, ++ #else ++ {"ARGUMENT_IS_NOT_A_NUMBER", 38, 133}, ++ #endif ++ #ifdef ENGINE_R_CMD_NOT_EXECUTABLE ++ {"CMD_NOT_EXECUTABLE", ERR_LIB_ENGINE, ENGINE_R_CMD_NOT_EXECUTABLE}, ++ #else ++ {"CMD_NOT_EXECUTABLE", 38, 134}, ++ #endif ++ #ifdef ENGINE_R_COMMAND_TAKES_INPUT ++ {"COMMAND_TAKES_INPUT", ERR_LIB_ENGINE, ENGINE_R_COMMAND_TAKES_INPUT}, ++ #else ++ {"COMMAND_TAKES_INPUT", 38, 135}, ++ #endif ++ #ifdef ENGINE_R_COMMAND_TAKES_NO_INPUT ++ {"COMMAND_TAKES_NO_INPUT", ERR_LIB_ENGINE, ENGINE_R_COMMAND_TAKES_NO_INPUT}, ++ #else ++ {"COMMAND_TAKES_NO_INPUT", 38, 136}, ++ #endif ++ #ifdef ENGINE_R_CONFLICTING_ENGINE_ID ++ {"CONFLICTING_ENGINE_ID", ERR_LIB_ENGINE, ENGINE_R_CONFLICTING_ENGINE_ID}, ++ #else ++ {"CONFLICTING_ENGINE_ID", 38, 103}, ++ #endif ++ #ifdef ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED ++ {"CTRL_COMMAND_NOT_IMPLEMENTED", ERR_LIB_ENGINE, ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED}, ++ #else ++ {"CTRL_COMMAND_NOT_IMPLEMENTED", 38, 119}, ++ #endif ++ #ifdef ENGINE_R_DSO_FAILURE ++ {"DSO_FAILURE", ERR_LIB_ENGINE, ENGINE_R_DSO_FAILURE}, ++ #else ++ {"DSO_FAILURE", 38, 104}, ++ #endif ++ #ifdef ENGINE_R_DSO_NOT_FOUND ++ {"DSO_NOT_FOUND", ERR_LIB_ENGINE, ENGINE_R_DSO_NOT_FOUND}, ++ #else ++ {"DSO_NOT_FOUND", 38, 132}, ++ #endif ++ #ifdef ENGINE_R_ENGINES_SECTION_ERROR ++ {"ENGINES_SECTION_ERROR", ERR_LIB_ENGINE, ENGINE_R_ENGINES_SECTION_ERROR}, ++ #else ++ {"ENGINES_SECTION_ERROR", 38, 148}, ++ #endif ++ #ifdef ENGINE_R_ENGINE_CONFIGURATION_ERROR ++ {"ENGINE_CONFIGURATION_ERROR", ERR_LIB_ENGINE, ENGINE_R_ENGINE_CONFIGURATION_ERROR}, ++ #else ++ {"ENGINE_CONFIGURATION_ERROR", 38, 102}, ++ #endif ++ #ifdef ENGINE_R_ENGINE_IS_NOT_IN_LIST ++ {"ENGINE_IS_NOT_IN_LIST", ERR_LIB_ENGINE, ENGINE_R_ENGINE_IS_NOT_IN_LIST}, ++ #else ++ {"ENGINE_IS_NOT_IN_LIST", 38, 105}, ++ #endif ++ #ifdef ENGINE_R_ENGINE_SECTION_ERROR ++ {"ENGINE_SECTION_ERROR", ERR_LIB_ENGINE, ENGINE_R_ENGINE_SECTION_ERROR}, ++ #else ++ {"ENGINE_SECTION_ERROR", 38, 149}, ++ #endif ++ #ifdef ENGINE_R_FAILED_LOADING_PRIVATE_KEY ++ {"FAILED_LOADING_PRIVATE_KEY", ERR_LIB_ENGINE, ENGINE_R_FAILED_LOADING_PRIVATE_KEY}, ++ #else ++ {"FAILED_LOADING_PRIVATE_KEY", 38, 128}, ++ #endif ++ #ifdef ENGINE_R_FAILED_LOADING_PUBLIC_KEY ++ {"FAILED_LOADING_PUBLIC_KEY", ERR_LIB_ENGINE, ENGINE_R_FAILED_LOADING_PUBLIC_KEY}, ++ #else ++ {"FAILED_LOADING_PUBLIC_KEY", 38, 129}, ++ #endif ++ #ifdef ENGINE_R_FINISH_FAILED ++ {"FINISH_FAILED", ERR_LIB_ENGINE, ENGINE_R_FINISH_FAILED}, ++ #else ++ {"FINISH_FAILED", 38, 106}, ++ #endif ++ #ifdef ENGINE_R_ID_OR_NAME_MISSING ++ {"ID_OR_NAME_MISSING", ERR_LIB_ENGINE, ENGINE_R_ID_OR_NAME_MISSING}, ++ #else ++ {"ID_OR_NAME_MISSING", 38, 108}, ++ #endif ++ #ifdef ENGINE_R_INIT_FAILED ++ {"INIT_FAILED", ERR_LIB_ENGINE, ENGINE_R_INIT_FAILED}, ++ #else ++ {"INIT_FAILED", 38, 109}, ++ #endif ++ #ifdef ENGINE_R_INTERNAL_LIST_ERROR ++ {"INTERNAL_LIST_ERROR", ERR_LIB_ENGINE, ENGINE_R_INTERNAL_LIST_ERROR}, ++ #else ++ {"INTERNAL_LIST_ERROR", 38, 110}, ++ #endif ++ #ifdef ENGINE_R_INVALID_ARGUMENT ++ {"INVALID_ARGUMENT", ERR_LIB_ENGINE, ENGINE_R_INVALID_ARGUMENT}, ++ #else ++ {"INVALID_ARGUMENT", 38, 143}, ++ #endif ++ #ifdef ENGINE_R_INVALID_CMD_NAME ++ {"INVALID_CMD_NAME", ERR_LIB_ENGINE, ENGINE_R_INVALID_CMD_NAME}, ++ #else ++ {"INVALID_CMD_NAME", 38, 137}, ++ #endif ++ #ifdef ENGINE_R_INVALID_CMD_NUMBER ++ {"INVALID_CMD_NUMBER", ERR_LIB_ENGINE, ENGINE_R_INVALID_CMD_NUMBER}, ++ #else ++ {"INVALID_CMD_NUMBER", 38, 138}, ++ #endif ++ #ifdef ENGINE_R_INVALID_INIT_VALUE ++ {"INVALID_INIT_VALUE", ERR_LIB_ENGINE, ENGINE_R_INVALID_INIT_VALUE}, ++ #else ++ {"INVALID_INIT_VALUE", 38, 151}, ++ #endif ++ #ifdef ENGINE_R_INVALID_STRING ++ {"INVALID_STRING", ERR_LIB_ENGINE, ENGINE_R_INVALID_STRING}, ++ #else ++ {"INVALID_STRING", 38, 150}, ++ #endif ++ #ifdef ENGINE_R_NOT_INITIALISED ++ {"NOT_INITIALISED", ERR_LIB_ENGINE, ENGINE_R_NOT_INITIALISED}, ++ #else ++ {"NOT_INITIALISED", 38, 117}, ++ #endif ++ #ifdef ENGINE_R_NOT_LOADED ++ {"NOT_LOADED", ERR_LIB_ENGINE, ENGINE_R_NOT_LOADED}, ++ #else ++ {"NOT_LOADED", 38, 112}, ++ #endif ++ #ifdef ENGINE_R_NO_CONTROL_FUNCTION ++ {"NO_CONTROL_FUNCTION", ERR_LIB_ENGINE, ENGINE_R_NO_CONTROL_FUNCTION}, ++ #else ++ {"NO_CONTROL_FUNCTION", 38, 120}, ++ #endif ++ #ifdef ENGINE_R_NO_INDEX ++ {"NO_INDEX", ERR_LIB_ENGINE, ENGINE_R_NO_INDEX}, ++ #else ++ {"NO_INDEX", 38, 144}, ++ #endif ++ #ifdef ENGINE_R_NO_LOAD_FUNCTION ++ {"NO_LOAD_FUNCTION", ERR_LIB_ENGINE, ENGINE_R_NO_LOAD_FUNCTION}, ++ #else ++ {"NO_LOAD_FUNCTION", 38, 125}, ++ #endif ++ #ifdef ENGINE_R_NO_REFERENCE ++ {"NO_REFERENCE", ERR_LIB_ENGINE, ENGINE_R_NO_REFERENCE}, ++ #else ++ {"NO_REFERENCE", 38, 130}, ++ #endif ++ #ifdef ENGINE_R_NO_SUCH_ENGINE ++ {"NO_SUCH_ENGINE", ERR_LIB_ENGINE, ENGINE_R_NO_SUCH_ENGINE}, ++ #else ++ {"NO_SUCH_ENGINE", 38, 116}, ++ #endif ++ #ifdef ENGINE_R_UNIMPLEMENTED_CIPHER ++ {"UNIMPLEMENTED_CIPHER", ERR_LIB_ENGINE, ENGINE_R_UNIMPLEMENTED_CIPHER}, ++ #else ++ {"UNIMPLEMENTED_CIPHER", 38, 146}, ++ #endif ++ #ifdef ENGINE_R_UNIMPLEMENTED_DIGEST ++ {"UNIMPLEMENTED_DIGEST", ERR_LIB_ENGINE, ENGINE_R_UNIMPLEMENTED_DIGEST}, ++ #else ++ {"UNIMPLEMENTED_DIGEST", 38, 147}, ++ #endif ++ #ifdef ENGINE_R_UNIMPLEMENTED_PUBLIC_KEY_METHOD ++ {"UNIMPLEMENTED_PUBLIC_KEY_METHOD", ERR_LIB_ENGINE, ENGINE_R_UNIMPLEMENTED_PUBLIC_KEY_METHOD}, ++ #else ++ {"UNIMPLEMENTED_PUBLIC_KEY_METHOD", 38, 101}, ++ #endif ++ #ifdef ENGINE_R_VERSION_INCOMPATIBILITY ++ {"VERSION_INCOMPATIBILITY", ERR_LIB_ENGINE, ENGINE_R_VERSION_INCOMPATIBILITY}, ++ #else ++ {"VERSION_INCOMPATIBILITY", 38, 145}, ++ #endif ++ #ifdef ESS_R_EMPTY_ESS_CERT_ID_LIST ++ {"EMPTY_ESS_CERT_ID_LIST", ERR_LIB_ESS, ESS_R_EMPTY_ESS_CERT_ID_LIST}, ++ #else ++ {"EMPTY_ESS_CERT_ID_LIST", 54, 107}, ++ #endif ++ #ifdef ESS_R_ESS_CERT_DIGEST_ERROR ++ {"ESS_CERT_DIGEST_ERROR", ERR_LIB_ESS, ESS_R_ESS_CERT_DIGEST_ERROR}, ++ #else ++ {"ESS_CERT_DIGEST_ERROR", 54, 103}, ++ #endif ++ #ifdef ESS_R_ESS_CERT_ID_NOT_FOUND ++ {"ESS_CERT_ID_NOT_FOUND", ERR_LIB_ESS, ESS_R_ESS_CERT_ID_NOT_FOUND}, ++ #else ++ {"ESS_CERT_ID_NOT_FOUND", 54, 104}, ++ #endif ++ #ifdef ESS_R_ESS_CERT_ID_WRONG_ORDER ++ {"ESS_CERT_ID_WRONG_ORDER", ERR_LIB_ESS, ESS_R_ESS_CERT_ID_WRONG_ORDER}, ++ #else ++ {"ESS_CERT_ID_WRONG_ORDER", 54, 105}, ++ #endif ++ #ifdef ESS_R_ESS_DIGEST_ALG_UNKNOWN ++ {"ESS_DIGEST_ALG_UNKNOWN", ERR_LIB_ESS, ESS_R_ESS_DIGEST_ALG_UNKNOWN}, ++ #else ++ {"ESS_DIGEST_ALG_UNKNOWN", 54, 106}, ++ #endif ++ #ifdef ESS_R_ESS_SIGNING_CERTIFICATE_ERROR ++ {"ESS_SIGNING_CERTIFICATE_ERROR", ERR_LIB_ESS, ESS_R_ESS_SIGNING_CERTIFICATE_ERROR}, ++ #else ++ {"ESS_SIGNING_CERTIFICATE_ERROR", 54, 102}, ++ #endif ++ #ifdef ESS_R_ESS_SIGNING_CERT_ADD_ERROR ++ {"ESS_SIGNING_CERT_ADD_ERROR", ERR_LIB_ESS, ESS_R_ESS_SIGNING_CERT_ADD_ERROR}, ++ #else ++ {"ESS_SIGNING_CERT_ADD_ERROR", 54, 100}, ++ #endif ++ #ifdef ESS_R_ESS_SIGNING_CERT_V2_ADD_ERROR ++ {"ESS_SIGNING_CERT_V2_ADD_ERROR", ERR_LIB_ESS, ESS_R_ESS_SIGNING_CERT_V2_ADD_ERROR}, ++ #else ++ {"ESS_SIGNING_CERT_V2_ADD_ERROR", 54, 101}, ++ #endif ++ #ifdef ESS_R_MISSING_SIGNING_CERTIFICATE_ATTRIBUTE ++ {"MISSING_SIGNING_CERTIFICATE_ATTRIBUTE", ERR_LIB_ESS, ESS_R_MISSING_SIGNING_CERTIFICATE_ATTRIBUTE}, ++ #else ++ {"MISSING_SIGNING_CERTIFICATE_ATTRIBUTE", 54, 108}, ++ #endif ++ #ifdef EVP_R_AES_KEY_SETUP_FAILED ++ {"AES_KEY_SETUP_FAILED", ERR_LIB_EVP, EVP_R_AES_KEY_SETUP_FAILED}, ++ #else ++ {"AES_KEY_SETUP_FAILED", 6, 143}, ++ #endif ++ #ifdef EVP_R_ARIA_KEY_SETUP_FAILED ++ {"ARIA_KEY_SETUP_FAILED", ERR_LIB_EVP, EVP_R_ARIA_KEY_SETUP_FAILED}, ++ #else ++ {"ARIA_KEY_SETUP_FAILED", 6, 176}, ++ #endif ++ #ifdef EVP_R_BAD_ALGORITHM_NAME ++ {"BAD_ALGORITHM_NAME", ERR_LIB_EVP, EVP_R_BAD_ALGORITHM_NAME}, ++ #else ++ {"BAD_ALGORITHM_NAME", 6, 200}, ++ #endif ++ #ifdef EVP_R_BAD_DECRYPT ++ {"BAD_DECRYPT", ERR_LIB_EVP, EVP_R_BAD_DECRYPT}, ++ #else ++ {"BAD_DECRYPT", 6, 100}, ++ #endif ++ #ifdef EVP_R_BAD_KEY_LENGTH ++ {"BAD_KEY_LENGTH", ERR_LIB_EVP, EVP_R_BAD_KEY_LENGTH}, ++ #else ++ {"BAD_KEY_LENGTH", 6, 195}, ++ #endif ++ #ifdef EVP_R_BUFFER_TOO_SMALL ++ {"BUFFER_TOO_SMALL", ERR_LIB_EVP, EVP_R_BUFFER_TOO_SMALL}, ++ #else ++ {"BUFFER_TOO_SMALL", 6, 155}, ++ #endif ++ #ifdef EVP_R_CACHE_CONSTANTS_FAILED ++ {"CACHE_CONSTANTS_FAILED", ERR_LIB_EVP, EVP_R_CACHE_CONSTANTS_FAILED}, ++ #else ++ {"CACHE_CONSTANTS_FAILED", 6, 225}, ++ #endif ++ #ifdef EVP_R_CAMELLIA_KEY_SETUP_FAILED ++ {"CAMELLIA_KEY_SETUP_FAILED", ERR_LIB_EVP, EVP_R_CAMELLIA_KEY_SETUP_FAILED}, ++ #else ++ {"CAMELLIA_KEY_SETUP_FAILED", 6, 157}, ++ #endif ++ #ifdef EVP_R_CANNOT_GET_PARAMETERS ++ {"CANNOT_GET_PARAMETERS", ERR_LIB_EVP, EVP_R_CANNOT_GET_PARAMETERS}, ++ #else ++ {"CANNOT_GET_PARAMETERS", 6, 197}, ++ #endif ++ #ifdef EVP_R_CANNOT_SET_PARAMETERS ++ {"CANNOT_SET_PARAMETERS", ERR_LIB_EVP, EVP_R_CANNOT_SET_PARAMETERS}, ++ #else ++ {"CANNOT_SET_PARAMETERS", 6, 198}, ++ #endif ++ #ifdef EVP_R_CIPHER_NOT_GCM_MODE ++ {"CIPHER_NOT_GCM_MODE", ERR_LIB_EVP, EVP_R_CIPHER_NOT_GCM_MODE}, ++ #else ++ {"CIPHER_NOT_GCM_MODE", 6, 184}, ++ #endif ++ #ifdef EVP_R_CIPHER_PARAMETER_ERROR ++ {"CIPHER_PARAMETER_ERROR", ERR_LIB_EVP, EVP_R_CIPHER_PARAMETER_ERROR}, ++ #else ++ {"CIPHER_PARAMETER_ERROR", 6, 122}, ++ #endif ++ #ifdef EVP_R_COMMAND_NOT_SUPPORTED ++ {"COMMAND_NOT_SUPPORTED", ERR_LIB_EVP, EVP_R_COMMAND_NOT_SUPPORTED}, ++ #else ++ {"COMMAND_NOT_SUPPORTED", 6, 147}, ++ #endif ++ #ifdef EVP_R_CONFLICTING_ALGORITHM_NAME ++ {"CONFLICTING_ALGORITHM_NAME", ERR_LIB_EVP, EVP_R_CONFLICTING_ALGORITHM_NAME}, ++ #else ++ {"CONFLICTING_ALGORITHM_NAME", 6, 201}, ++ #endif ++ #ifdef EVP_R_COPY_ERROR ++ {"COPY_ERROR", ERR_LIB_EVP, EVP_R_COPY_ERROR}, ++ #else ++ {"COPY_ERROR", 6, 173}, ++ #endif ++ #ifdef EVP_R_CTRL_NOT_IMPLEMENTED ++ {"CTRL_NOT_IMPLEMENTED", ERR_LIB_EVP, EVP_R_CTRL_NOT_IMPLEMENTED}, ++ #else ++ {"CTRL_NOT_IMPLEMENTED", 6, 132}, ++ #endif ++ #ifdef EVP_R_CTRL_OPERATION_NOT_IMPLEMENTED ++ {"CTRL_OPERATION_NOT_IMPLEMENTED", ERR_LIB_EVP, EVP_R_CTRL_OPERATION_NOT_IMPLEMENTED}, ++ #else ++ {"CTRL_OPERATION_NOT_IMPLEMENTED", 6, 133}, ++ #endif ++ #ifdef EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH ++ {"DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH", ERR_LIB_EVP, EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH}, ++ #else ++ {"DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH", 6, 138}, ++ #endif ++ #ifdef EVP_R_DECODE_ERROR ++ {"DECODE_ERROR", ERR_LIB_EVP, EVP_R_DECODE_ERROR}, ++ #else ++ {"DECODE_ERROR", 6, 114}, ++ #endif ++ #ifdef EVP_R_DEFAULT_QUERY_PARSE_ERROR ++ {"DEFAULT_QUERY_PARSE_ERROR", ERR_LIB_EVP, EVP_R_DEFAULT_QUERY_PARSE_ERROR}, ++ #else ++ {"DEFAULT_QUERY_PARSE_ERROR", 6, 210}, ++ #endif ++ #ifdef EVP_R_DIFFERENT_KEY_TYPES ++ {"DIFFERENT_KEY_TYPES", ERR_LIB_EVP, EVP_R_DIFFERENT_KEY_TYPES}, ++ #else ++ {"DIFFERENT_KEY_TYPES", 6, 101}, ++ #endif ++ #ifdef EVP_R_DIFFERENT_PARAMETERS ++ {"DIFFERENT_PARAMETERS", ERR_LIB_EVP, EVP_R_DIFFERENT_PARAMETERS}, ++ #else ++ {"DIFFERENT_PARAMETERS", 6, 153}, ++ #endif ++ #ifdef EVP_R_ERROR_LOADING_SECTION ++ {"ERROR_LOADING_SECTION", ERR_LIB_EVP, EVP_R_ERROR_LOADING_SECTION}, ++ #else ++ {"ERROR_LOADING_SECTION", 6, 165}, ++ #endif ++ #ifdef EVP_R_EXPECTING_AN_HMAC_KEY ++ {"EXPECTING_AN_HMAC_KEY", ERR_LIB_EVP, EVP_R_EXPECTING_AN_HMAC_KEY}, ++ #else ++ {"EXPECTING_AN_HMAC_KEY", 6, 174}, ++ #endif ++ #ifdef EVP_R_EXPECTING_AN_RSA_KEY ++ {"EXPECTING_AN_RSA_KEY", ERR_LIB_EVP, EVP_R_EXPECTING_AN_RSA_KEY}, ++ #else ++ {"EXPECTING_AN_RSA_KEY", 6, 127}, ++ #endif ++ #ifdef EVP_R_EXPECTING_A_DH_KEY ++ {"EXPECTING_A_DH_KEY", ERR_LIB_EVP, EVP_R_EXPECTING_A_DH_KEY}, ++ #else ++ {"EXPECTING_A_DH_KEY", 6, 128}, ++ #endif ++ #ifdef EVP_R_EXPECTING_A_DSA_KEY ++ {"EXPECTING_A_DSA_KEY", ERR_LIB_EVP, EVP_R_EXPECTING_A_DSA_KEY}, ++ #else ++ {"EXPECTING_A_DSA_KEY", 6, 129}, ++ #endif ++ #ifdef EVP_R_EXPECTING_A_ECX_KEY ++ {"EXPECTING_A_ECX_KEY", ERR_LIB_EVP, EVP_R_EXPECTING_A_ECX_KEY}, ++ #else ++ {"EXPECTING_A_ECX_KEY", 6, 219}, ++ #endif ++ #ifdef EVP_R_EXPECTING_A_EC_KEY ++ {"EXPECTING_A_EC_KEY", ERR_LIB_EVP, EVP_R_EXPECTING_A_EC_KEY}, ++ #else ++ {"EXPECTING_A_EC_KEY", 6, 142}, ++ #endif ++ #ifdef EVP_R_EXPECTING_A_POLY1305_KEY ++ {"EXPECTING_A_POLY1305_KEY", ERR_LIB_EVP, EVP_R_EXPECTING_A_POLY1305_KEY}, ++ #else ++ {"EXPECTING_A_POLY1305_KEY", 6, 164}, ++ #endif ++ #ifdef EVP_R_EXPECTING_A_SIPHASH_KEY ++ {"EXPECTING_A_SIPHASH_KEY", ERR_LIB_EVP, EVP_R_EXPECTING_A_SIPHASH_KEY}, ++ #else ++ {"EXPECTING_A_SIPHASH_KEY", 6, 175}, ++ #endif ++ #ifdef EVP_R_FINAL_ERROR ++ {"FINAL_ERROR", ERR_LIB_EVP, EVP_R_FINAL_ERROR}, ++ #else ++ {"FINAL_ERROR", 6, 188}, ++ #endif ++ #ifdef EVP_R_GENERATE_ERROR ++ {"GENERATE_ERROR", ERR_LIB_EVP, EVP_R_GENERATE_ERROR}, ++ #else ++ {"GENERATE_ERROR", 6, 214}, ++ #endif ++ #ifdef EVP_R_GETTING_ALGORITHMIDENTIFIER_NOT_SUPPORTED ++ {"GETTING_ALGORITHMIDENTIFIER_NOT_SUPPORTED", ERR_LIB_EVP, EVP_R_GETTING_ALGORITHMIDENTIFIER_NOT_SUPPORTED}, ++ #else ++ {"GETTING_ALGORITHMIDENTIFIER_NOT_SUPPORTED", 6, 229}, ++ #endif ++ #ifdef EVP_R_GET_RAW_KEY_FAILED ++ {"GET_RAW_KEY_FAILED", ERR_LIB_EVP, EVP_R_GET_RAW_KEY_FAILED}, ++ #else ++ {"GET_RAW_KEY_FAILED", 6, 182}, ++ #endif ++ #ifdef EVP_R_ILLEGAL_SCRYPT_PARAMETERS ++ {"ILLEGAL_SCRYPT_PARAMETERS", ERR_LIB_EVP, EVP_R_ILLEGAL_SCRYPT_PARAMETERS}, ++ #else ++ {"ILLEGAL_SCRYPT_PARAMETERS", 6, 171}, ++ #endif ++ #ifdef EVP_R_INACCESSIBLE_DOMAIN_PARAMETERS ++ {"INACCESSIBLE_DOMAIN_PARAMETERS", ERR_LIB_EVP, EVP_R_INACCESSIBLE_DOMAIN_PARAMETERS}, ++ #else ++ {"INACCESSIBLE_DOMAIN_PARAMETERS", 6, 204}, ++ #endif ++ #ifdef EVP_R_INACCESSIBLE_KEY ++ {"INACCESSIBLE_KEY", ERR_LIB_EVP, EVP_R_INACCESSIBLE_KEY}, ++ #else ++ {"INACCESSIBLE_KEY", 6, 203}, ++ #endif ++ #ifdef EVP_R_INITIALIZATION_ERROR ++ {"INITIALIZATION_ERROR", ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR}, ++ #else ++ {"INITIALIZATION_ERROR", 6, 134}, ++ #endif ++ #ifdef EVP_R_INPUT_NOT_INITIALIZED ++ {"INPUT_NOT_INITIALIZED", ERR_LIB_EVP, EVP_R_INPUT_NOT_INITIALIZED}, ++ #else ++ {"INPUT_NOT_INITIALIZED", 6, 111}, ++ #endif ++ #ifdef EVP_R_INVALID_CUSTOM_LENGTH ++ {"INVALID_CUSTOM_LENGTH", ERR_LIB_EVP, EVP_R_INVALID_CUSTOM_LENGTH}, ++ #else ++ {"INVALID_CUSTOM_LENGTH", 6, 185}, ++ #endif ++ #ifdef EVP_R_INVALID_DIGEST ++ {"INVALID_DIGEST", ERR_LIB_EVP, EVP_R_INVALID_DIGEST}, ++ #else ++ {"INVALID_DIGEST", 6, 152}, ++ #endif ++ #ifdef EVP_R_INVALID_IV_LENGTH ++ {"INVALID_IV_LENGTH", ERR_LIB_EVP, EVP_R_INVALID_IV_LENGTH}, ++ #else ++ {"INVALID_IV_LENGTH", 6, 194}, ++ #endif ++ #ifdef EVP_R_INVALID_KEY ++ {"INVALID_KEY", ERR_LIB_EVP, EVP_R_INVALID_KEY}, ++ #else ++ {"INVALID_KEY", 6, 163}, ++ #endif ++ #ifdef EVP_R_INVALID_KEY_LENGTH ++ {"INVALID_KEY_LENGTH", ERR_LIB_EVP, EVP_R_INVALID_KEY_LENGTH}, ++ #else ++ {"INVALID_KEY_LENGTH", 6, 130}, ++ #endif ++ #ifdef EVP_R_INVALID_LENGTH ++ {"INVALID_LENGTH", ERR_LIB_EVP, EVP_R_INVALID_LENGTH}, ++ #else ++ {"INVALID_LENGTH", 6, 221}, ++ #endif ++ #ifdef EVP_R_INVALID_NULL_ALGORITHM ++ {"INVALID_NULL_ALGORITHM", ERR_LIB_EVP, EVP_R_INVALID_NULL_ALGORITHM}, ++ #else ++ {"INVALID_NULL_ALGORITHM", 6, 218}, ++ #endif ++ #ifdef EVP_R_INVALID_OPERATION ++ {"INVALID_OPERATION", ERR_LIB_EVP, EVP_R_INVALID_OPERATION}, ++ #else ++ {"INVALID_OPERATION", 6, 148}, ++ #endif ++ #ifdef EVP_R_INVALID_PROVIDER_FUNCTIONS ++ {"INVALID_PROVIDER_FUNCTIONS", ERR_LIB_EVP, EVP_R_INVALID_PROVIDER_FUNCTIONS}, ++ #else ++ {"INVALID_PROVIDER_FUNCTIONS", 6, 193}, ++ #endif ++ #ifdef EVP_R_INVALID_SALT_LENGTH ++ {"INVALID_SALT_LENGTH", ERR_LIB_EVP, EVP_R_INVALID_SALT_LENGTH}, ++ #else ++ {"INVALID_SALT_LENGTH", 6, 186}, ++ #endif ++ #ifdef EVP_R_INVALID_SECRET_LENGTH ++ {"INVALID_SECRET_LENGTH", ERR_LIB_EVP, EVP_R_INVALID_SECRET_LENGTH}, ++ #else ++ {"INVALID_SECRET_LENGTH", 6, 223}, ++ #endif ++ #ifdef EVP_R_INVALID_SEED_LENGTH ++ {"INVALID_SEED_LENGTH", ERR_LIB_EVP, EVP_R_INVALID_SEED_LENGTH}, ++ #else ++ {"INVALID_SEED_LENGTH", 6, 220}, ++ #endif ++ #ifdef EVP_R_INVALID_VALUE ++ {"INVALID_VALUE", ERR_LIB_EVP, EVP_R_INVALID_VALUE}, ++ #else ++ {"INVALID_VALUE", 6, 222}, ++ #endif ++ #ifdef EVP_R_KEYMGMT_EXPORT_FAILURE ++ {"KEYMGMT_EXPORT_FAILURE", ERR_LIB_EVP, EVP_R_KEYMGMT_EXPORT_FAILURE}, ++ #else ++ {"KEYMGMT_EXPORT_FAILURE", 6, 205}, ++ #endif ++ #ifdef EVP_R_KEY_SETUP_FAILED ++ {"KEY_SETUP_FAILED", ERR_LIB_EVP, EVP_R_KEY_SETUP_FAILED}, ++ #else ++ {"KEY_SETUP_FAILED", 6, 180}, ++ #endif ++ #ifdef EVP_R_LOCKING_NOT_SUPPORTED ++ {"LOCKING_NOT_SUPPORTED", ERR_LIB_EVP, EVP_R_LOCKING_NOT_SUPPORTED}, ++ #else ++ {"LOCKING_NOT_SUPPORTED", 6, 213}, ++ #endif ++ #ifdef EVP_R_MEMORY_LIMIT_EXCEEDED ++ {"MEMORY_LIMIT_EXCEEDED", ERR_LIB_EVP, EVP_R_MEMORY_LIMIT_EXCEEDED}, ++ #else ++ {"MEMORY_LIMIT_EXCEEDED", 6, 172}, ++ #endif ++ #ifdef EVP_R_MESSAGE_DIGEST_IS_NULL ++ {"MESSAGE_DIGEST_IS_NULL", ERR_LIB_EVP, EVP_R_MESSAGE_DIGEST_IS_NULL}, ++ #else ++ {"MESSAGE_DIGEST_IS_NULL", 6, 159}, ++ #endif ++ #ifdef EVP_R_METHOD_NOT_SUPPORTED ++ {"METHOD_NOT_SUPPORTED", ERR_LIB_EVP, EVP_R_METHOD_NOT_SUPPORTED}, ++ #else ++ {"METHOD_NOT_SUPPORTED", 6, 144}, ++ #endif ++ #ifdef EVP_R_MISSING_PARAMETERS ++ {"MISSING_PARAMETERS", ERR_LIB_EVP, EVP_R_MISSING_PARAMETERS}, ++ #else ++ {"MISSING_PARAMETERS", 6, 103}, ++ #endif ++ #ifdef EVP_R_NOT_ABLE_TO_COPY_CTX ++ {"NOT_ABLE_TO_COPY_CTX", ERR_LIB_EVP, EVP_R_NOT_ABLE_TO_COPY_CTX}, ++ #else ++ {"NOT_ABLE_TO_COPY_CTX", 6, 190}, ++ #endif ++ #ifdef EVP_R_NOT_XOF_OR_INVALID_LENGTH ++ {"NOT_XOF_OR_INVALID_LENGTH", ERR_LIB_EVP, EVP_R_NOT_XOF_OR_INVALID_LENGTH}, ++ #else ++ {"NOT_XOF_OR_INVALID_LENGTH", 6, 178}, ++ #endif ++ #ifdef EVP_R_NO_CIPHER_SET ++ {"NO_CIPHER_SET", ERR_LIB_EVP, EVP_R_NO_CIPHER_SET}, ++ #else ++ {"NO_CIPHER_SET", 6, 131}, ++ #endif ++ #ifdef EVP_R_NO_DEFAULT_DIGEST ++ {"NO_DEFAULT_DIGEST", ERR_LIB_EVP, EVP_R_NO_DEFAULT_DIGEST}, ++ #else ++ {"NO_DEFAULT_DIGEST", 6, 158}, ++ #endif ++ #ifdef EVP_R_NO_DIGEST_SET ++ {"NO_DIGEST_SET", ERR_LIB_EVP, EVP_R_NO_DIGEST_SET}, ++ #else ++ {"NO_DIGEST_SET", 6, 139}, ++ #endif ++ #ifdef EVP_R_NO_IMPORT_FUNCTION ++ {"NO_IMPORT_FUNCTION", ERR_LIB_EVP, EVP_R_NO_IMPORT_FUNCTION}, ++ #else ++ {"NO_IMPORT_FUNCTION", 6, 206}, ++ #endif ++ #ifdef EVP_R_NO_KEYMGMT_AVAILABLE ++ {"NO_KEYMGMT_AVAILABLE", ERR_LIB_EVP, EVP_R_NO_KEYMGMT_AVAILABLE}, ++ #else ++ {"NO_KEYMGMT_AVAILABLE", 6, 199}, ++ #endif ++ #ifdef EVP_R_NO_KEYMGMT_PRESENT ++ {"NO_KEYMGMT_PRESENT", ERR_LIB_EVP, EVP_R_NO_KEYMGMT_PRESENT}, ++ #else ++ {"NO_KEYMGMT_PRESENT", 6, 196}, ++ #endif ++ #ifdef EVP_R_NO_KEY_SET ++ {"NO_KEY_SET", ERR_LIB_EVP, EVP_R_NO_KEY_SET}, ++ #else ++ {"NO_KEY_SET", 6, 154}, ++ #endif ++ #ifdef EVP_R_NO_OPERATION_SET ++ {"NO_OPERATION_SET", ERR_LIB_EVP, EVP_R_NO_OPERATION_SET}, ++ #else ++ {"NO_OPERATION_SET", 6, 149}, ++ #endif ++ #ifdef EVP_R_NULL_MAC_PKEY_CTX ++ {"NULL_MAC_PKEY_CTX", ERR_LIB_EVP, EVP_R_NULL_MAC_PKEY_CTX}, ++ #else ++ {"NULL_MAC_PKEY_CTX", 6, 208}, ++ #endif ++ #ifdef EVP_R_ONLY_ONESHOT_SUPPORTED ++ {"ONLY_ONESHOT_SUPPORTED", ERR_LIB_EVP, EVP_R_ONLY_ONESHOT_SUPPORTED}, ++ #else ++ {"ONLY_ONESHOT_SUPPORTED", 6, 177}, ++ #endif ++ #ifdef EVP_R_OPERATION_NOT_INITIALIZED ++ {"OPERATION_NOT_INITIALIZED", ERR_LIB_EVP, EVP_R_OPERATION_NOT_INITIALIZED}, ++ #else ++ {"OPERATION_NOT_INITIALIZED", 6, 151}, ++ #endif ++ #ifdef EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE ++ {"OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE", ERR_LIB_EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE}, ++ #else ++ {"OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE", 6, 150}, ++ #endif ++ #ifdef EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_SIGNATURE_TYPE ++ {"OPERATION_NOT_SUPPORTED_FOR_THIS_SIGNATURE_TYPE", ERR_LIB_EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_SIGNATURE_TYPE}, ++ #else ++ {"OPERATION_NOT_SUPPORTED_FOR_THIS_SIGNATURE_TYPE", 6, 226}, ++ #endif ++ #ifdef EVP_R_OUTPUT_WOULD_OVERFLOW ++ {"OUTPUT_WOULD_OVERFLOW", ERR_LIB_EVP, EVP_R_OUTPUT_WOULD_OVERFLOW}, ++ #else ++ {"OUTPUT_WOULD_OVERFLOW", 6, 202}, ++ #endif ++ #ifdef EVP_R_PARAMETER_TOO_LARGE ++ {"PARAMETER_TOO_LARGE", ERR_LIB_EVP, EVP_R_PARAMETER_TOO_LARGE}, ++ #else ++ {"PARAMETER_TOO_LARGE", 6, 187}, ++ #endif ++ #ifdef EVP_R_PARTIALLY_OVERLAPPING ++ {"PARTIALLY_OVERLAPPING", ERR_LIB_EVP, EVP_R_PARTIALLY_OVERLAPPING}, ++ #else ++ {"PARTIALLY_OVERLAPPING", 6, 162}, ++ #endif ++ #ifdef EVP_R_PBKDF2_ERROR ++ {"PBKDF2_ERROR", ERR_LIB_EVP, EVP_R_PBKDF2_ERROR}, ++ #else ++ {"PBKDF2_ERROR", 6, 181}, ++ #endif ++ #ifdef EVP_R_PKEY_APPLICATION_ASN1_METHOD_ALREADY_REGISTERED ++ {"PKEY_APPLICATION_ASN1_METHOD_ALREADY_REGISTERED", ERR_LIB_EVP, EVP_R_PKEY_APPLICATION_ASN1_METHOD_ALREADY_REGISTERED}, ++ #else ++ {"PKEY_APPLICATION_ASN1_METHOD_ALREADY_REGISTERED", 6, 179}, ++ #endif ++ #ifdef EVP_R_PRIVATE_KEY_DECODE_ERROR ++ {"PRIVATE_KEY_DECODE_ERROR", ERR_LIB_EVP, EVP_R_PRIVATE_KEY_DECODE_ERROR}, ++ #else ++ {"PRIVATE_KEY_DECODE_ERROR", 6, 145}, ++ #endif ++ #ifdef EVP_R_PRIVATE_KEY_ENCODE_ERROR ++ {"PRIVATE_KEY_ENCODE_ERROR", ERR_LIB_EVP, EVP_R_PRIVATE_KEY_ENCODE_ERROR}, ++ #else ++ {"PRIVATE_KEY_ENCODE_ERROR", 6, 146}, ++ #endif ++ #ifdef EVP_R_PUBLIC_KEY_NOT_RSA ++ {"PUBLIC_KEY_NOT_RSA", ERR_LIB_EVP, EVP_R_PUBLIC_KEY_NOT_RSA}, ++ #else ++ {"PUBLIC_KEY_NOT_RSA", 6, 106}, ++ #endif ++ #ifdef EVP_R_SETTING_XOF_FAILED ++ {"SETTING_XOF_FAILED", ERR_LIB_EVP, EVP_R_SETTING_XOF_FAILED}, ++ #else ++ {"SETTING_XOF_FAILED", 6, 227}, ++ #endif ++ #ifdef EVP_R_SET_DEFAULT_PROPERTY_FAILURE ++ {"SET_DEFAULT_PROPERTY_FAILURE", ERR_LIB_EVP, EVP_R_SET_DEFAULT_PROPERTY_FAILURE}, ++ #else ++ {"SET_DEFAULT_PROPERTY_FAILURE", 6, 209}, ++ #endif ++ #ifdef EVP_R_SIGNATURE_TYPE_AND_KEY_TYPE_INCOMPATIBLE ++ {"SIGNATURE_TYPE_AND_KEY_TYPE_INCOMPATIBLE", ERR_LIB_EVP, EVP_R_SIGNATURE_TYPE_AND_KEY_TYPE_INCOMPATIBLE}, ++ #else ++ {"SIGNATURE_TYPE_AND_KEY_TYPE_INCOMPATIBLE", 6, 228}, ++ #endif ++ #ifdef EVP_R_TOO_MANY_RECORDS ++ {"TOO_MANY_RECORDS", ERR_LIB_EVP, EVP_R_TOO_MANY_RECORDS}, ++ #else ++ {"TOO_MANY_RECORDS", 6, 183}, ++ #endif ++ #ifdef EVP_R_UNABLE_TO_ENABLE_LOCKING ++ {"UNABLE_TO_ENABLE_LOCKING", ERR_LIB_EVP, EVP_R_UNABLE_TO_ENABLE_LOCKING}, ++ #else ++ {"UNABLE_TO_ENABLE_LOCKING", 6, 212}, ++ #endif ++ #ifdef EVP_R_UNABLE_TO_GET_MAXIMUM_REQUEST_SIZE ++ {"UNABLE_TO_GET_MAXIMUM_REQUEST_SIZE", ERR_LIB_EVP, EVP_R_UNABLE_TO_GET_MAXIMUM_REQUEST_SIZE}, ++ #else ++ {"UNABLE_TO_GET_MAXIMUM_REQUEST_SIZE", 6, 215}, ++ #endif ++ #ifdef EVP_R_UNABLE_TO_GET_RANDOM_STRENGTH ++ {"UNABLE_TO_GET_RANDOM_STRENGTH", ERR_LIB_EVP, EVP_R_UNABLE_TO_GET_RANDOM_STRENGTH}, ++ #else ++ {"UNABLE_TO_GET_RANDOM_STRENGTH", 6, 216}, ++ #endif ++ #ifdef EVP_R_UNABLE_TO_LOCK_CONTEXT ++ {"UNABLE_TO_LOCK_CONTEXT", ERR_LIB_EVP, EVP_R_UNABLE_TO_LOCK_CONTEXT}, ++ #else ++ {"UNABLE_TO_LOCK_CONTEXT", 6, 211}, ++ #endif ++ #ifdef EVP_R_UNABLE_TO_SET_CALLBACKS ++ {"UNABLE_TO_SET_CALLBACKS", ERR_LIB_EVP, EVP_R_UNABLE_TO_SET_CALLBACKS}, ++ #else ++ {"UNABLE_TO_SET_CALLBACKS", 6, 217}, ++ #endif ++ #ifdef EVP_R_UNKNOWN_BITS ++ {"UNKNOWN_BITS", ERR_LIB_EVP, EVP_R_UNKNOWN_BITS}, ++ #else ++ {"UNKNOWN_BITS", 6, 166}, ++ #endif ++ #ifdef EVP_R_UNKNOWN_CIPHER ++ {"UNKNOWN_CIPHER", ERR_LIB_EVP, EVP_R_UNKNOWN_CIPHER}, ++ #else ++ {"UNKNOWN_CIPHER", 6, 160}, ++ #endif ++ #ifdef EVP_R_UNKNOWN_DIGEST ++ {"UNKNOWN_DIGEST", ERR_LIB_EVP, EVP_R_UNKNOWN_DIGEST}, ++ #else ++ {"UNKNOWN_DIGEST", 6, 161}, ++ #endif ++ #ifdef EVP_R_UNKNOWN_KEY_TYPE ++ {"UNKNOWN_KEY_TYPE", ERR_LIB_EVP, EVP_R_UNKNOWN_KEY_TYPE}, ++ #else ++ {"UNKNOWN_KEY_TYPE", 6, 207}, ++ #endif ++ #ifdef EVP_R_UNKNOWN_MAX_SIZE ++ {"UNKNOWN_MAX_SIZE", ERR_LIB_EVP, EVP_R_UNKNOWN_MAX_SIZE}, ++ #else ++ {"UNKNOWN_MAX_SIZE", 6, 167}, ++ #endif ++ #ifdef EVP_R_UNKNOWN_OPTION ++ {"UNKNOWN_OPTION", ERR_LIB_EVP, EVP_R_UNKNOWN_OPTION}, ++ #else ++ {"UNKNOWN_OPTION", 6, 169}, ++ #endif ++ #ifdef EVP_R_UNKNOWN_PBE_ALGORITHM ++ {"UNKNOWN_PBE_ALGORITHM", ERR_LIB_EVP, EVP_R_UNKNOWN_PBE_ALGORITHM}, ++ #else ++ {"UNKNOWN_PBE_ALGORITHM", 6, 121}, ++ #endif ++ #ifdef EVP_R_UNKNOWN_SECURITY_BITS ++ {"UNKNOWN_SECURITY_BITS", ERR_LIB_EVP, EVP_R_UNKNOWN_SECURITY_BITS}, ++ #else ++ {"UNKNOWN_SECURITY_BITS", 6, 168}, ++ #endif ++ #ifdef EVP_R_UNSUPPORTED_ALGORITHM ++ {"UNSUPPORTED_ALGORITHM", ERR_LIB_EVP, EVP_R_UNSUPPORTED_ALGORITHM}, ++ #else ++ {"UNSUPPORTED_ALGORITHM", 6, 156}, ++ #endif ++ #ifdef EVP_R_UNSUPPORTED_CIPHER ++ {"UNSUPPORTED_CIPHER", ERR_LIB_EVP, EVP_R_UNSUPPORTED_CIPHER}, ++ #else ++ {"UNSUPPORTED_CIPHER", 6, 107}, ++ #endif ++ #ifdef EVP_R_UNSUPPORTED_KEYLENGTH ++ {"UNSUPPORTED_KEYLENGTH", ERR_LIB_EVP, EVP_R_UNSUPPORTED_KEYLENGTH}, ++ #else ++ {"UNSUPPORTED_KEYLENGTH", 6, 123}, ++ #endif ++ #ifdef EVP_R_UNSUPPORTED_KEY_DERIVATION_FUNCTION ++ {"UNSUPPORTED_KEY_DERIVATION_FUNCTION", ERR_LIB_EVP, EVP_R_UNSUPPORTED_KEY_DERIVATION_FUNCTION}, ++ #else ++ {"UNSUPPORTED_KEY_DERIVATION_FUNCTION", 6, 124}, ++ #endif ++ #ifdef EVP_R_UNSUPPORTED_KEY_SIZE ++ {"UNSUPPORTED_KEY_SIZE", ERR_LIB_EVP, EVP_R_UNSUPPORTED_KEY_SIZE}, ++ #else ++ {"UNSUPPORTED_KEY_SIZE", 6, 108}, ++ #endif ++ #ifdef EVP_R_UNSUPPORTED_KEY_TYPE ++ {"UNSUPPORTED_KEY_TYPE", ERR_LIB_EVP, EVP_R_UNSUPPORTED_KEY_TYPE}, ++ #else ++ {"UNSUPPORTED_KEY_TYPE", 6, 224}, ++ #endif ++ #ifdef EVP_R_UNSUPPORTED_NUMBER_OF_ROUNDS ++ {"UNSUPPORTED_NUMBER_OF_ROUNDS", ERR_LIB_EVP, EVP_R_UNSUPPORTED_NUMBER_OF_ROUNDS}, ++ #else ++ {"UNSUPPORTED_NUMBER_OF_ROUNDS", 6, 135}, ++ #endif ++ #ifdef EVP_R_UNSUPPORTED_PRF ++ {"UNSUPPORTED_PRF", ERR_LIB_EVP, EVP_R_UNSUPPORTED_PRF}, ++ #else ++ {"UNSUPPORTED_PRF", 6, 125}, ++ #endif ++ #ifdef EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM ++ {"UNSUPPORTED_PRIVATE_KEY_ALGORITHM", ERR_LIB_EVP, EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM}, ++ #else ++ {"UNSUPPORTED_PRIVATE_KEY_ALGORITHM", 6, 118}, ++ #endif ++ #ifdef EVP_R_UNSUPPORTED_SALT_TYPE ++ {"UNSUPPORTED_SALT_TYPE", ERR_LIB_EVP, EVP_R_UNSUPPORTED_SALT_TYPE}, ++ #else ++ {"UNSUPPORTED_SALT_TYPE", 6, 126}, ++ #endif ++ #ifdef EVP_R_UPDATE_ERROR ++ {"UPDATE_ERROR", ERR_LIB_EVP, EVP_R_UPDATE_ERROR}, ++ #else ++ {"UPDATE_ERROR", 6, 189}, ++ #endif ++ #ifdef EVP_R_WRAP_MODE_NOT_ALLOWED ++ {"WRAP_MODE_NOT_ALLOWED", ERR_LIB_EVP, EVP_R_WRAP_MODE_NOT_ALLOWED}, ++ #else ++ {"WRAP_MODE_NOT_ALLOWED", 6, 170}, ++ #endif ++ #ifdef EVP_R_WRONG_FINAL_BLOCK_LENGTH ++ {"WRONG_FINAL_BLOCK_LENGTH", ERR_LIB_EVP, EVP_R_WRONG_FINAL_BLOCK_LENGTH}, ++ #else ++ {"WRONG_FINAL_BLOCK_LENGTH", 6, 109}, ++ #endif ++ #ifdef EVP_R_XTS_DATA_UNIT_IS_TOO_LARGE ++ {"XTS_DATA_UNIT_IS_TOO_LARGE", ERR_LIB_EVP, EVP_R_XTS_DATA_UNIT_IS_TOO_LARGE}, ++ #else ++ {"XTS_DATA_UNIT_IS_TOO_LARGE", 6, 191}, ++ #endif ++ #ifdef EVP_R_XTS_DUPLICATED_KEYS ++ {"XTS_DUPLICATED_KEYS", ERR_LIB_EVP, EVP_R_XTS_DUPLICATED_KEYS}, ++ #else ++ {"XTS_DUPLICATED_KEYS", 6, 192}, ++ #endif ++ #ifdef HTTP_R_ASN1_LEN_EXCEEDS_MAX_RESP_LEN ++ {"ASN1_LEN_EXCEEDS_MAX_RESP_LEN", ERR_LIB_HTTP, HTTP_R_ASN1_LEN_EXCEEDS_MAX_RESP_LEN}, ++ #else ++ {"ASN1_LEN_EXCEEDS_MAX_RESP_LEN", 61, 108}, ++ #endif ++ #ifdef HTTP_R_CONNECT_FAILURE ++ {"CONNECT_FAILURE", ERR_LIB_HTTP, HTTP_R_CONNECT_FAILURE}, ++ #else ++ {"CONNECT_FAILURE", 61, 100}, ++ #endif ++ #ifdef HTTP_R_ERROR_PARSING_ASN1_LENGTH ++ {"ERROR_PARSING_ASN1_LENGTH", ERR_LIB_HTTP, HTTP_R_ERROR_PARSING_ASN1_LENGTH}, ++ #else ++ {"ERROR_PARSING_ASN1_LENGTH", 61, 109}, ++ #endif ++ #ifdef HTTP_R_ERROR_PARSING_CONTENT_LENGTH ++ {"ERROR_PARSING_CONTENT_LENGTH", ERR_LIB_HTTP, HTTP_R_ERROR_PARSING_CONTENT_LENGTH}, ++ #else ++ {"ERROR_PARSING_CONTENT_LENGTH", 61, 119}, ++ #endif ++ #ifdef HTTP_R_ERROR_PARSING_URL ++ {"ERROR_PARSING_URL", ERR_LIB_HTTP, HTTP_R_ERROR_PARSING_URL}, ++ #else ++ {"ERROR_PARSING_URL", 61, 101}, ++ #endif ++ #ifdef HTTP_R_ERROR_RECEIVING ++ {"ERROR_RECEIVING", ERR_LIB_HTTP, HTTP_R_ERROR_RECEIVING}, ++ #else ++ {"ERROR_RECEIVING", 61, 103}, ++ #endif ++ #ifdef HTTP_R_ERROR_SENDING ++ {"ERROR_SENDING", ERR_LIB_HTTP, HTTP_R_ERROR_SENDING}, ++ #else ++ {"ERROR_SENDING", 61, 102}, ++ #endif ++ #ifdef HTTP_R_FAILED_READING_DATA ++ {"FAILED_READING_DATA", ERR_LIB_HTTP, HTTP_R_FAILED_READING_DATA}, ++ #else ++ {"FAILED_READING_DATA", 61, 128}, ++ #endif ++ #ifdef HTTP_R_HEADER_PARSE_ERROR ++ {"HEADER_PARSE_ERROR", ERR_LIB_HTTP, HTTP_R_HEADER_PARSE_ERROR}, ++ #else ++ {"HEADER_PARSE_ERROR", 61, 126}, ++ #endif ++ #ifdef HTTP_R_INCONSISTENT_CONTENT_LENGTH ++ {"INCONSISTENT_CONTENT_LENGTH", ERR_LIB_HTTP, HTTP_R_INCONSISTENT_CONTENT_LENGTH}, ++ #else ++ {"INCONSISTENT_CONTENT_LENGTH", 61, 120}, ++ #endif ++ #ifdef HTTP_R_INVALID_PORT_NUMBER ++ {"INVALID_PORT_NUMBER", ERR_LIB_HTTP, HTTP_R_INVALID_PORT_NUMBER}, ++ #else ++ {"INVALID_PORT_NUMBER", 61, 123}, ++ #endif ++ #ifdef HTTP_R_INVALID_URL_PATH ++ {"INVALID_URL_PATH", ERR_LIB_HTTP, HTTP_R_INVALID_URL_PATH}, ++ #else ++ {"INVALID_URL_PATH", 61, 125}, ++ #endif ++ #ifdef HTTP_R_INVALID_URL_SCHEME ++ {"INVALID_URL_SCHEME", ERR_LIB_HTTP, HTTP_R_INVALID_URL_SCHEME}, ++ #else ++ {"INVALID_URL_SCHEME", 61, 124}, ++ #endif ++ #ifdef HTTP_R_MAX_RESP_LEN_EXCEEDED ++ {"MAX_RESP_LEN_EXCEEDED", ERR_LIB_HTTP, HTTP_R_MAX_RESP_LEN_EXCEEDED}, ++ #else ++ {"MAX_RESP_LEN_EXCEEDED", 61, 117}, ++ #endif ++ #ifdef HTTP_R_MISSING_ASN1_ENCODING ++ {"MISSING_ASN1_ENCODING", ERR_LIB_HTTP, HTTP_R_MISSING_ASN1_ENCODING}, ++ #else ++ {"MISSING_ASN1_ENCODING", 61, 110}, ++ #endif ++ #ifdef HTTP_R_MISSING_CONTENT_TYPE ++ {"MISSING_CONTENT_TYPE", ERR_LIB_HTTP, HTTP_R_MISSING_CONTENT_TYPE}, ++ #else ++ {"MISSING_CONTENT_TYPE", 61, 121}, ++ #endif ++ #ifdef HTTP_R_MISSING_REDIRECT_LOCATION ++ {"MISSING_REDIRECT_LOCATION", ERR_LIB_HTTP, HTTP_R_MISSING_REDIRECT_LOCATION}, ++ #else ++ {"MISSING_REDIRECT_LOCATION", 61, 111}, ++ #endif ++ #ifdef HTTP_R_RECEIVED_ERROR ++ {"RECEIVED_ERROR", ERR_LIB_HTTP, HTTP_R_RECEIVED_ERROR}, ++ #else ++ {"RECEIVED_ERROR", 61, 105}, ++ #endif ++ #ifdef HTTP_R_RECEIVED_WRONG_HTTP_VERSION ++ {"RECEIVED_WRONG_HTTP_VERSION", ERR_LIB_HTTP, HTTP_R_RECEIVED_WRONG_HTTP_VERSION}, ++ #else ++ {"RECEIVED_WRONG_HTTP_VERSION", 61, 106}, ++ #endif ++ #ifdef HTTP_R_REDIRECTION_FROM_HTTPS_TO_HTTP ++ {"REDIRECTION_FROM_HTTPS_TO_HTTP", ERR_LIB_HTTP, HTTP_R_REDIRECTION_FROM_HTTPS_TO_HTTP}, ++ #else ++ {"REDIRECTION_FROM_HTTPS_TO_HTTP", 61, 112}, ++ #endif ++ #ifdef HTTP_R_REDIRECTION_NOT_ENABLED ++ {"REDIRECTION_NOT_ENABLED", ERR_LIB_HTTP, HTTP_R_REDIRECTION_NOT_ENABLED}, ++ #else ++ {"REDIRECTION_NOT_ENABLED", 61, 116}, ++ #endif ++ #ifdef HTTP_R_RESPONSE_LINE_TOO_LONG ++ {"RESPONSE_LINE_TOO_LONG", ERR_LIB_HTTP, HTTP_R_RESPONSE_LINE_TOO_LONG}, ++ #else ++ {"RESPONSE_LINE_TOO_LONG", 61, 113}, ++ #endif ++ #ifdef HTTP_R_RESPONSE_PARSE_ERROR ++ {"RESPONSE_PARSE_ERROR", ERR_LIB_HTTP, HTTP_R_RESPONSE_PARSE_ERROR}, ++ #else ++ {"RESPONSE_PARSE_ERROR", 61, 104}, ++ #endif ++ #ifdef HTTP_R_RESPONSE_TOO_MANY_HDRLINES ++ {"RESPONSE_TOO_MANY_HDRLINES", ERR_LIB_HTTP, HTTP_R_RESPONSE_TOO_MANY_HDRLINES}, ++ #else ++ {"RESPONSE_TOO_MANY_HDRLINES", 61, 130}, ++ #endif ++ #ifdef HTTP_R_RETRY_TIMEOUT ++ {"RETRY_TIMEOUT", ERR_LIB_HTTP, HTTP_R_RETRY_TIMEOUT}, ++ #else ++ {"RETRY_TIMEOUT", 61, 129}, ++ #endif ++ #ifdef HTTP_R_SERVER_CANCELED_CONNECTION ++ {"SERVER_CANCELED_CONNECTION", ERR_LIB_HTTP, HTTP_R_SERVER_CANCELED_CONNECTION}, ++ #else ++ {"SERVER_CANCELED_CONNECTION", 61, 127}, ++ #endif ++ #ifdef HTTP_R_SOCK_NOT_SUPPORTED ++ {"SOCK_NOT_SUPPORTED", ERR_LIB_HTTP, HTTP_R_SOCK_NOT_SUPPORTED}, ++ #else ++ {"SOCK_NOT_SUPPORTED", 61, 122}, ++ #endif ++ #ifdef HTTP_R_STATUS_CODE_UNSUPPORTED ++ {"STATUS_CODE_UNSUPPORTED", ERR_LIB_HTTP, HTTP_R_STATUS_CODE_UNSUPPORTED}, ++ #else ++ {"STATUS_CODE_UNSUPPORTED", 61, 114}, ++ #endif ++ #ifdef HTTP_R_TLS_NOT_ENABLED ++ {"TLS_NOT_ENABLED", ERR_LIB_HTTP, HTTP_R_TLS_NOT_ENABLED}, ++ #else ++ {"TLS_NOT_ENABLED", 61, 107}, ++ #endif ++ #ifdef HTTP_R_TOO_MANY_REDIRECTIONS ++ {"TOO_MANY_REDIRECTIONS", ERR_LIB_HTTP, HTTP_R_TOO_MANY_REDIRECTIONS}, ++ #else ++ {"TOO_MANY_REDIRECTIONS", 61, 115}, ++ #endif ++ #ifdef HTTP_R_UNEXPECTED_CONTENT_TYPE ++ {"UNEXPECTED_CONTENT_TYPE", ERR_LIB_HTTP, HTTP_R_UNEXPECTED_CONTENT_TYPE}, ++ #else ++ {"UNEXPECTED_CONTENT_TYPE", 61, 118}, ++ #endif ++ #ifdef OBJ_R_OID_EXISTS ++ {"OID_EXISTS", ERR_LIB_OBJ, OBJ_R_OID_EXISTS}, ++ #else ++ {"OID_EXISTS", 8, 102}, ++ #endif ++ #ifdef OBJ_R_UNKNOWN_NID ++ {"UNKNOWN_NID", ERR_LIB_OBJ, OBJ_R_UNKNOWN_NID}, ++ #else ++ {"UNKNOWN_NID", 8, 101}, ++ #endif ++ #ifdef OBJ_R_UNKNOWN_OBJECT_NAME ++ {"UNKNOWN_OBJECT_NAME", ERR_LIB_OBJ, OBJ_R_UNKNOWN_OBJECT_NAME}, ++ #else ++ {"UNKNOWN_OBJECT_NAME", 8, 103}, ++ #endif ++ #ifdef OCSP_R_CERTIFICATE_VERIFY_ERROR ++ {"CERTIFICATE_VERIFY_ERROR", ERR_LIB_OCSP, OCSP_R_CERTIFICATE_VERIFY_ERROR}, ++ #else ++ {"CERTIFICATE_VERIFY_ERROR", 39, 101}, ++ #endif ++ #ifdef OCSP_R_DIGEST_ERR ++ {"DIGEST_ERR", ERR_LIB_OCSP, OCSP_R_DIGEST_ERR}, ++ #else ++ {"DIGEST_ERR", 39, 102}, ++ #endif ++ #ifdef OCSP_R_DIGEST_NAME_ERR ++ {"DIGEST_NAME_ERR", ERR_LIB_OCSP, OCSP_R_DIGEST_NAME_ERR}, ++ #else ++ {"DIGEST_NAME_ERR", 39, 106}, ++ #endif ++ #ifdef OCSP_R_DIGEST_SIZE_ERR ++ {"DIGEST_SIZE_ERR", ERR_LIB_OCSP, OCSP_R_DIGEST_SIZE_ERR}, ++ #else ++ {"DIGEST_SIZE_ERR", 39, 107}, ++ #endif ++ #ifdef OCSP_R_ERROR_IN_NEXTUPDATE_FIELD ++ {"ERROR_IN_NEXTUPDATE_FIELD", ERR_LIB_OCSP, OCSP_R_ERROR_IN_NEXTUPDATE_FIELD}, ++ #else ++ {"ERROR_IN_NEXTUPDATE_FIELD", 39, 122}, ++ #endif ++ #ifdef OCSP_R_ERROR_IN_THISUPDATE_FIELD ++ {"ERROR_IN_THISUPDATE_FIELD", ERR_LIB_OCSP, OCSP_R_ERROR_IN_THISUPDATE_FIELD}, ++ #else ++ {"ERROR_IN_THISUPDATE_FIELD", 39, 123}, ++ #endif ++ #ifdef OCSP_R_MISSING_OCSPSIGNING_USAGE ++ {"MISSING_OCSPSIGNING_USAGE", ERR_LIB_OCSP, OCSP_R_MISSING_OCSPSIGNING_USAGE}, ++ #else ++ {"MISSING_OCSPSIGNING_USAGE", 39, 103}, ++ #endif ++ #ifdef OCSP_R_NEXTUPDATE_BEFORE_THISUPDATE ++ {"NEXTUPDATE_BEFORE_THISUPDATE", ERR_LIB_OCSP, OCSP_R_NEXTUPDATE_BEFORE_THISUPDATE}, ++ #else ++ {"NEXTUPDATE_BEFORE_THISUPDATE", 39, 124}, ++ #endif ++ #ifdef OCSP_R_NOT_BASIC_RESPONSE ++ {"NOT_BASIC_RESPONSE", ERR_LIB_OCSP, OCSP_R_NOT_BASIC_RESPONSE}, ++ #else ++ {"NOT_BASIC_RESPONSE", 39, 104}, ++ #endif ++ #ifdef OCSP_R_NO_CERTIFICATES_IN_CHAIN ++ {"NO_CERTIFICATES_IN_CHAIN", ERR_LIB_OCSP, OCSP_R_NO_CERTIFICATES_IN_CHAIN}, ++ #else ++ {"NO_CERTIFICATES_IN_CHAIN", 39, 105}, ++ #endif ++ #ifdef OCSP_R_NO_RESPONSE_DATA ++ {"NO_RESPONSE_DATA", ERR_LIB_OCSP, OCSP_R_NO_RESPONSE_DATA}, ++ #else ++ {"NO_RESPONSE_DATA", 39, 108}, ++ #endif ++ #ifdef OCSP_R_NO_REVOKED_TIME ++ {"NO_REVOKED_TIME", ERR_LIB_OCSP, OCSP_R_NO_REVOKED_TIME}, ++ #else ++ {"NO_REVOKED_TIME", 39, 109}, ++ #endif ++ #ifdef OCSP_R_NO_SIGNER_KEY ++ {"NO_SIGNER_KEY", ERR_LIB_OCSP, OCSP_R_NO_SIGNER_KEY}, ++ #else ++ {"NO_SIGNER_KEY", 39, 130}, ++ #endif ++ #ifdef OCSP_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE ++ {"PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE", ERR_LIB_OCSP, OCSP_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE}, ++ #else ++ {"PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE", 39, 110}, ++ #endif ++ #ifdef OCSP_R_REQUEST_NOT_SIGNED ++ {"REQUEST_NOT_SIGNED", ERR_LIB_OCSP, OCSP_R_REQUEST_NOT_SIGNED}, ++ #else ++ {"REQUEST_NOT_SIGNED", 39, 128}, ++ #endif ++ #ifdef OCSP_R_RESPONSE_CONTAINS_NO_REVOCATION_DATA ++ {"RESPONSE_CONTAINS_NO_REVOCATION_DATA", ERR_LIB_OCSP, OCSP_R_RESPONSE_CONTAINS_NO_REVOCATION_DATA}, ++ #else ++ {"RESPONSE_CONTAINS_NO_REVOCATION_DATA", 39, 111}, ++ #endif ++ #ifdef OCSP_R_ROOT_CA_NOT_TRUSTED ++ {"ROOT_CA_NOT_TRUSTED", ERR_LIB_OCSP, OCSP_R_ROOT_CA_NOT_TRUSTED}, ++ #else ++ {"ROOT_CA_NOT_TRUSTED", 39, 112}, ++ #endif ++ #ifdef OCSP_R_SIGNATURE_FAILURE ++ {"SIGNATURE_FAILURE", ERR_LIB_OCSP, OCSP_R_SIGNATURE_FAILURE}, ++ #else ++ {"SIGNATURE_FAILURE", 39, 117}, ++ #endif ++ #ifdef OCSP_R_SIGNER_CERTIFICATE_NOT_FOUND ++ {"SIGNER_CERTIFICATE_NOT_FOUND", ERR_LIB_OCSP, OCSP_R_SIGNER_CERTIFICATE_NOT_FOUND}, ++ #else ++ {"SIGNER_CERTIFICATE_NOT_FOUND", 39, 118}, ++ #endif ++ #ifdef OCSP_R_STATUS_EXPIRED ++ {"STATUS_EXPIRED", ERR_LIB_OCSP, OCSP_R_STATUS_EXPIRED}, ++ #else ++ {"STATUS_EXPIRED", 39, 125}, ++ #endif ++ #ifdef OCSP_R_STATUS_NOT_YET_VALID ++ {"STATUS_NOT_YET_VALID", ERR_LIB_OCSP, OCSP_R_STATUS_NOT_YET_VALID}, ++ #else ++ {"STATUS_NOT_YET_VALID", 39, 126}, ++ #endif ++ #ifdef OCSP_R_STATUS_TOO_OLD ++ {"STATUS_TOO_OLD", ERR_LIB_OCSP, OCSP_R_STATUS_TOO_OLD}, ++ #else ++ {"STATUS_TOO_OLD", 39, 127}, ++ #endif ++ #ifdef OCSP_R_UNKNOWN_MESSAGE_DIGEST ++ {"UNKNOWN_MESSAGE_DIGEST", ERR_LIB_OCSP, OCSP_R_UNKNOWN_MESSAGE_DIGEST}, ++ #else ++ {"UNKNOWN_MESSAGE_DIGEST", 39, 119}, ++ #endif ++ #ifdef OCSP_R_UNKNOWN_NID ++ {"UNKNOWN_NID", ERR_LIB_OCSP, OCSP_R_UNKNOWN_NID}, ++ #else ++ {"UNKNOWN_NID", 39, 120}, ++ #endif ++ #ifdef OCSP_R_UNSUPPORTED_REQUESTORNAME_TYPE ++ {"UNSUPPORTED_REQUESTORNAME_TYPE", ERR_LIB_OCSP, OCSP_R_UNSUPPORTED_REQUESTORNAME_TYPE}, ++ #else ++ {"UNSUPPORTED_REQUESTORNAME_TYPE", 39, 129}, ++ #endif ++ #ifdef OSSL_DECODER_R_COULD_NOT_DECODE_OBJECT ++ {"COULD_NOT_DECODE_OBJECT", ERR_LIB_OSSL_DECODER, OSSL_DECODER_R_COULD_NOT_DECODE_OBJECT}, ++ #else ++ {"COULD_NOT_DECODE_OBJECT", 60, 101}, ++ #endif ++ #ifdef OSSL_DECODER_R_DECODER_NOT_FOUND ++ {"DECODER_NOT_FOUND", ERR_LIB_OSSL_DECODER, OSSL_DECODER_R_DECODER_NOT_FOUND}, ++ #else ++ {"DECODER_NOT_FOUND", 60, 102}, ++ #endif ++ #ifdef OSSL_DECODER_R_MISSING_GET_PARAMS ++ {"MISSING_GET_PARAMS", ERR_LIB_OSSL_DECODER, OSSL_DECODER_R_MISSING_GET_PARAMS}, ++ #else ++ {"MISSING_GET_PARAMS", 60, 100}, ++ #endif ++ #ifdef OSSL_ENCODER_R_ENCODER_NOT_FOUND ++ {"ENCODER_NOT_FOUND", ERR_LIB_OSSL_ENCODER, OSSL_ENCODER_R_ENCODER_NOT_FOUND}, ++ #else ++ {"ENCODER_NOT_FOUND", 59, 101}, ++ #endif ++ #ifdef OSSL_ENCODER_R_INCORRECT_PROPERTY_QUERY ++ {"INCORRECT_PROPERTY_QUERY", ERR_LIB_OSSL_ENCODER, OSSL_ENCODER_R_INCORRECT_PROPERTY_QUERY}, ++ #else ++ {"INCORRECT_PROPERTY_QUERY", 59, 100}, ++ #endif ++ #ifdef OSSL_ENCODER_R_MISSING_GET_PARAMS ++ {"MISSING_GET_PARAMS", ERR_LIB_OSSL_ENCODER, OSSL_ENCODER_R_MISSING_GET_PARAMS}, ++ #else ++ {"MISSING_GET_PARAMS", 59, 102}, ++ #endif ++ #ifdef OSSL_STORE_R_AMBIGUOUS_CONTENT_TYPE ++ {"AMBIGUOUS_CONTENT_TYPE", ERR_LIB_OSSL_STORE, OSSL_STORE_R_AMBIGUOUS_CONTENT_TYPE}, ++ #else ++ {"AMBIGUOUS_CONTENT_TYPE", 44, 107}, ++ #endif ++ #ifdef OSSL_STORE_R_BAD_PASSWORD_READ ++ {"BAD_PASSWORD_READ", ERR_LIB_OSSL_STORE, OSSL_STORE_R_BAD_PASSWORD_READ}, ++ #else ++ {"BAD_PASSWORD_READ", 44, 115}, ++ #endif ++ #ifdef OSSL_STORE_R_ERROR_VERIFYING_PKCS12_MAC ++ {"ERROR_VERIFYING_PKCS12_MAC", ERR_LIB_OSSL_STORE, OSSL_STORE_R_ERROR_VERIFYING_PKCS12_MAC}, ++ #else ++ {"ERROR_VERIFYING_PKCS12_MAC", 44, 113}, ++ #endif ++ #ifdef OSSL_STORE_R_FINGERPRINT_SIZE_DOES_NOT_MATCH_DIGEST ++ {"FINGERPRINT_SIZE_DOES_NOT_MATCH_DIGEST", ERR_LIB_OSSL_STORE, OSSL_STORE_R_FINGERPRINT_SIZE_DOES_NOT_MATCH_DIGEST}, ++ #else ++ {"FINGERPRINT_SIZE_DOES_NOT_MATCH_DIGEST", 44, 121}, ++ #endif ++ #ifdef OSSL_STORE_R_INVALID_SCHEME ++ {"INVALID_SCHEME", ERR_LIB_OSSL_STORE, OSSL_STORE_R_INVALID_SCHEME}, ++ #else ++ {"INVALID_SCHEME", 44, 106}, ++ #endif ++ #ifdef OSSL_STORE_R_IS_NOT_A ++ {"IS_NOT_A", ERR_LIB_OSSL_STORE, OSSL_STORE_R_IS_NOT_A}, ++ #else ++ {"IS_NOT_A", 44, 112}, ++ #endif ++ #ifdef OSSL_STORE_R_LOADER_INCOMPLETE ++ {"LOADER_INCOMPLETE", ERR_LIB_OSSL_STORE, OSSL_STORE_R_LOADER_INCOMPLETE}, ++ #else ++ {"LOADER_INCOMPLETE", 44, 116}, ++ #endif ++ #ifdef OSSL_STORE_R_LOADING_STARTED ++ {"LOADING_STARTED", ERR_LIB_OSSL_STORE, OSSL_STORE_R_LOADING_STARTED}, ++ #else ++ {"LOADING_STARTED", 44, 117}, ++ #endif ++ #ifdef OSSL_STORE_R_NOT_A_CERTIFICATE ++ {"NOT_A_CERTIFICATE", ERR_LIB_OSSL_STORE, OSSL_STORE_R_NOT_A_CERTIFICATE}, ++ #else ++ {"NOT_A_CERTIFICATE", 44, 100}, ++ #endif ++ #ifdef OSSL_STORE_R_NOT_A_CRL ++ {"NOT_A_CRL", ERR_LIB_OSSL_STORE, OSSL_STORE_R_NOT_A_CRL}, ++ #else ++ {"NOT_A_CRL", 44, 101}, ++ #endif ++ #ifdef OSSL_STORE_R_NOT_A_NAME ++ {"NOT_A_NAME", ERR_LIB_OSSL_STORE, OSSL_STORE_R_NOT_A_NAME}, ++ #else ++ {"NOT_A_NAME", 44, 103}, ++ #endif ++ #ifdef OSSL_STORE_R_NOT_A_PRIVATE_KEY ++ {"NOT_A_PRIVATE_KEY", ERR_LIB_OSSL_STORE, OSSL_STORE_R_NOT_A_PRIVATE_KEY}, ++ #else ++ {"NOT_A_PRIVATE_KEY", 44, 102}, ++ #endif ++ #ifdef OSSL_STORE_R_NOT_A_PUBLIC_KEY ++ {"NOT_A_PUBLIC_KEY", ERR_LIB_OSSL_STORE, OSSL_STORE_R_NOT_A_PUBLIC_KEY}, ++ #else ++ {"NOT_A_PUBLIC_KEY", 44, 122}, ++ #endif ++ #ifdef OSSL_STORE_R_NOT_PARAMETERS ++ {"NOT_PARAMETERS", ERR_LIB_OSSL_STORE, OSSL_STORE_R_NOT_PARAMETERS}, ++ #else ++ {"NOT_PARAMETERS", 44, 104}, ++ #endif ++ #ifdef OSSL_STORE_R_NO_LOADERS_FOUND ++ {"NO_LOADERS_FOUND", ERR_LIB_OSSL_STORE, OSSL_STORE_R_NO_LOADERS_FOUND}, ++ #else ++ {"NO_LOADERS_FOUND", 44, 123}, ++ #endif ++ #ifdef OSSL_STORE_R_PASSPHRASE_CALLBACK_ERROR ++ {"PASSPHRASE_CALLBACK_ERROR", ERR_LIB_OSSL_STORE, OSSL_STORE_R_PASSPHRASE_CALLBACK_ERROR}, ++ #else ++ {"PASSPHRASE_CALLBACK_ERROR", 44, 114}, ++ #endif ++ #ifdef OSSL_STORE_R_PATH_MUST_BE_ABSOLUTE ++ {"PATH_MUST_BE_ABSOLUTE", ERR_LIB_OSSL_STORE, OSSL_STORE_R_PATH_MUST_BE_ABSOLUTE}, ++ #else ++ {"PATH_MUST_BE_ABSOLUTE", 44, 108}, ++ #endif ++ #ifdef OSSL_STORE_R_SEARCH_ONLY_SUPPORTED_FOR_DIRECTORIES ++ {"SEARCH_ONLY_SUPPORTED_FOR_DIRECTORIES", ERR_LIB_OSSL_STORE, OSSL_STORE_R_SEARCH_ONLY_SUPPORTED_FOR_DIRECTORIES}, ++ #else ++ {"SEARCH_ONLY_SUPPORTED_FOR_DIRECTORIES", 44, 119}, ++ #endif ++ #ifdef OSSL_STORE_R_UI_PROCESS_INTERRUPTED_OR_CANCELLED ++ {"UI_PROCESS_INTERRUPTED_OR_CANCELLED", ERR_LIB_OSSL_STORE, OSSL_STORE_R_UI_PROCESS_INTERRUPTED_OR_CANCELLED}, ++ #else ++ {"UI_PROCESS_INTERRUPTED_OR_CANCELLED", 44, 109}, ++ #endif ++ #ifdef OSSL_STORE_R_UNREGISTERED_SCHEME ++ {"UNREGISTERED_SCHEME", ERR_LIB_OSSL_STORE, OSSL_STORE_R_UNREGISTERED_SCHEME}, ++ #else ++ {"UNREGISTERED_SCHEME", 44, 105}, ++ #endif ++ #ifdef OSSL_STORE_R_UNSUPPORTED_CONTENT_TYPE ++ {"UNSUPPORTED_CONTENT_TYPE", ERR_LIB_OSSL_STORE, OSSL_STORE_R_UNSUPPORTED_CONTENT_TYPE}, ++ #else ++ {"UNSUPPORTED_CONTENT_TYPE", 44, 110}, ++ #endif ++ #ifdef OSSL_STORE_R_UNSUPPORTED_OPERATION ++ {"UNSUPPORTED_OPERATION", ERR_LIB_OSSL_STORE, OSSL_STORE_R_UNSUPPORTED_OPERATION}, ++ #else ++ {"UNSUPPORTED_OPERATION", 44, 118}, ++ #endif ++ #ifdef OSSL_STORE_R_UNSUPPORTED_SEARCH_TYPE ++ {"UNSUPPORTED_SEARCH_TYPE", ERR_LIB_OSSL_STORE, OSSL_STORE_R_UNSUPPORTED_SEARCH_TYPE}, ++ #else ++ {"UNSUPPORTED_SEARCH_TYPE", 44, 120}, ++ #endif ++ #ifdef OSSL_STORE_R_URI_AUTHORITY_UNSUPPORTED ++ {"URI_AUTHORITY_UNSUPPORTED", ERR_LIB_OSSL_STORE, OSSL_STORE_R_URI_AUTHORITY_UNSUPPORTED}, ++ #else ++ {"URI_AUTHORITY_UNSUPPORTED", 44, 111}, ++ #endif ++ #ifdef PEM_R_BAD_BASE64_DECODE ++ {"BAD_BASE64_DECODE", ERR_LIB_PEM, PEM_R_BAD_BASE64_DECODE}, ++ #else ++ {"BAD_BASE64_DECODE", 9, 100}, ++ #endif ++ #ifdef PEM_R_BAD_DECRYPT ++ {"BAD_DECRYPT", ERR_LIB_PEM, PEM_R_BAD_DECRYPT}, ++ #else ++ {"BAD_DECRYPT", 9, 101}, ++ #endif ++ #ifdef PEM_R_BAD_END_LINE ++ {"BAD_END_LINE", ERR_LIB_PEM, PEM_R_BAD_END_LINE}, ++ #else ++ {"BAD_END_LINE", 9, 102}, ++ #endif ++ #ifdef PEM_R_BAD_IV_CHARS ++ {"BAD_IV_CHARS", ERR_LIB_PEM, PEM_R_BAD_IV_CHARS}, ++ #else ++ {"BAD_IV_CHARS", 9, 103}, ++ #endif ++ #ifdef PEM_R_BAD_MAGIC_NUMBER ++ {"BAD_MAGIC_NUMBER", ERR_LIB_PEM, PEM_R_BAD_MAGIC_NUMBER}, ++ #else ++ {"BAD_MAGIC_NUMBER", 9, 116}, ++ #endif ++ #ifdef PEM_R_BAD_PASSWORD_READ ++ {"BAD_PASSWORD_READ", ERR_LIB_PEM, PEM_R_BAD_PASSWORD_READ}, ++ #else ++ {"BAD_PASSWORD_READ", 9, 104}, ++ #endif ++ #ifdef PEM_R_BAD_VERSION_NUMBER ++ {"BAD_VERSION_NUMBER", ERR_LIB_PEM, PEM_R_BAD_VERSION_NUMBER}, ++ #else ++ {"BAD_VERSION_NUMBER", 9, 117}, ++ #endif ++ #ifdef PEM_R_BIO_WRITE_FAILURE ++ {"BIO_WRITE_FAILURE", ERR_LIB_PEM, PEM_R_BIO_WRITE_FAILURE}, ++ #else ++ {"BIO_WRITE_FAILURE", 9, 118}, ++ #endif ++ #ifdef PEM_R_CIPHER_IS_NULL ++ {"CIPHER_IS_NULL", ERR_LIB_PEM, PEM_R_CIPHER_IS_NULL}, ++ #else ++ {"CIPHER_IS_NULL", 9, 127}, ++ #endif ++ #ifdef PEM_R_ERROR_CONVERTING_PRIVATE_KEY ++ {"ERROR_CONVERTING_PRIVATE_KEY", ERR_LIB_PEM, PEM_R_ERROR_CONVERTING_PRIVATE_KEY}, ++ #else ++ {"ERROR_CONVERTING_PRIVATE_KEY", 9, 115}, ++ #endif ++ #ifdef PEM_R_EXPECTING_DSS_KEY_BLOB ++ {"EXPECTING_DSS_KEY_BLOB", ERR_LIB_PEM, PEM_R_EXPECTING_DSS_KEY_BLOB}, ++ #else ++ {"EXPECTING_DSS_KEY_BLOB", 9, 131}, ++ #endif ++ #ifdef PEM_R_EXPECTING_PRIVATE_KEY_BLOB ++ {"EXPECTING_PRIVATE_KEY_BLOB", ERR_LIB_PEM, PEM_R_EXPECTING_PRIVATE_KEY_BLOB}, ++ #else ++ {"EXPECTING_PRIVATE_KEY_BLOB", 9, 119}, ++ #endif ++ #ifdef PEM_R_EXPECTING_PUBLIC_KEY_BLOB ++ {"EXPECTING_PUBLIC_KEY_BLOB", ERR_LIB_PEM, PEM_R_EXPECTING_PUBLIC_KEY_BLOB}, ++ #else ++ {"EXPECTING_PUBLIC_KEY_BLOB", 9, 120}, ++ #endif ++ #ifdef PEM_R_EXPECTING_RSA_KEY_BLOB ++ {"EXPECTING_RSA_KEY_BLOB", ERR_LIB_PEM, PEM_R_EXPECTING_RSA_KEY_BLOB}, ++ #else ++ {"EXPECTING_RSA_KEY_BLOB", 9, 132}, ++ #endif ++ #ifdef PEM_R_HEADER_TOO_LONG ++ {"HEADER_TOO_LONG", ERR_LIB_PEM, PEM_R_HEADER_TOO_LONG}, ++ #else ++ {"HEADER_TOO_LONG", 9, 128}, ++ #endif ++ #ifdef PEM_R_INCONSISTENT_HEADER ++ {"INCONSISTENT_HEADER", ERR_LIB_PEM, PEM_R_INCONSISTENT_HEADER}, ++ #else ++ {"INCONSISTENT_HEADER", 9, 121}, ++ #endif ++ #ifdef PEM_R_KEYBLOB_HEADER_PARSE_ERROR ++ {"KEYBLOB_HEADER_PARSE_ERROR", ERR_LIB_PEM, PEM_R_KEYBLOB_HEADER_PARSE_ERROR}, ++ #else ++ {"KEYBLOB_HEADER_PARSE_ERROR", 9, 122}, ++ #endif ++ #ifdef PEM_R_KEYBLOB_TOO_SHORT ++ {"KEYBLOB_TOO_SHORT", ERR_LIB_PEM, PEM_R_KEYBLOB_TOO_SHORT}, ++ #else ++ {"KEYBLOB_TOO_SHORT", 9, 123}, ++ #endif ++ #ifdef PEM_R_MISSING_DEK_IV ++ {"MISSING_DEK_IV", ERR_LIB_PEM, PEM_R_MISSING_DEK_IV}, ++ #else ++ {"MISSING_DEK_IV", 9, 129}, ++ #endif ++ #ifdef PEM_R_NOT_DEK_INFO ++ {"NOT_DEK_INFO", ERR_LIB_PEM, PEM_R_NOT_DEK_INFO}, ++ #else ++ {"NOT_DEK_INFO", 9, 105}, ++ #endif ++ #ifdef PEM_R_NOT_ENCRYPTED ++ {"NOT_ENCRYPTED", ERR_LIB_PEM, PEM_R_NOT_ENCRYPTED}, ++ #else ++ {"NOT_ENCRYPTED", 9, 106}, ++ #endif ++ #ifdef PEM_R_NOT_PROC_TYPE ++ {"NOT_PROC_TYPE", ERR_LIB_PEM, PEM_R_NOT_PROC_TYPE}, ++ #else ++ {"NOT_PROC_TYPE", 9, 107}, ++ #endif ++ #ifdef PEM_R_NO_START_LINE ++ {"NO_START_LINE", ERR_LIB_PEM, PEM_R_NO_START_LINE}, ++ #else ++ {"NO_START_LINE", 9, 108}, ++ #endif ++ #ifdef PEM_R_PROBLEMS_GETTING_PASSWORD ++ {"PROBLEMS_GETTING_PASSWORD", ERR_LIB_PEM, PEM_R_PROBLEMS_GETTING_PASSWORD}, ++ #else ++ {"PROBLEMS_GETTING_PASSWORD", 9, 109}, ++ #endif ++ #ifdef PEM_R_PVK_DATA_TOO_SHORT ++ {"PVK_DATA_TOO_SHORT", ERR_LIB_PEM, PEM_R_PVK_DATA_TOO_SHORT}, ++ #else ++ {"PVK_DATA_TOO_SHORT", 9, 124}, ++ #endif ++ #ifdef PEM_R_PVK_TOO_SHORT ++ {"PVK_TOO_SHORT", ERR_LIB_PEM, PEM_R_PVK_TOO_SHORT}, ++ #else ++ {"PVK_TOO_SHORT", 9, 125}, ++ #endif ++ #ifdef PEM_R_READ_KEY ++ {"READ_KEY", ERR_LIB_PEM, PEM_R_READ_KEY}, ++ #else ++ {"READ_KEY", 9, 111}, ++ #endif ++ #ifdef PEM_R_SHORT_HEADER ++ {"SHORT_HEADER", ERR_LIB_PEM, PEM_R_SHORT_HEADER}, ++ #else ++ {"SHORT_HEADER", 9, 112}, ++ #endif ++ #ifdef PEM_R_UNEXPECTED_DEK_IV ++ {"UNEXPECTED_DEK_IV", ERR_LIB_PEM, PEM_R_UNEXPECTED_DEK_IV}, ++ #else ++ {"UNEXPECTED_DEK_IV", 9, 130}, ++ #endif ++ #ifdef PEM_R_UNSUPPORTED_CIPHER ++ {"UNSUPPORTED_CIPHER", ERR_LIB_PEM, PEM_R_UNSUPPORTED_CIPHER}, ++ #else ++ {"UNSUPPORTED_CIPHER", 9, 113}, ++ #endif ++ #ifdef PEM_R_UNSUPPORTED_ENCRYPTION ++ {"UNSUPPORTED_ENCRYPTION", ERR_LIB_PEM, PEM_R_UNSUPPORTED_ENCRYPTION}, ++ #else ++ {"UNSUPPORTED_ENCRYPTION", 9, 114}, ++ #endif ++ #ifdef PEM_R_UNSUPPORTED_KEY_COMPONENTS ++ {"UNSUPPORTED_KEY_COMPONENTS", ERR_LIB_PEM, PEM_R_UNSUPPORTED_KEY_COMPONENTS}, ++ #else ++ {"UNSUPPORTED_KEY_COMPONENTS", 9, 126}, ++ #endif ++ #ifdef PEM_R_UNSUPPORTED_PUBLIC_KEY_TYPE ++ {"UNSUPPORTED_PUBLIC_KEY_TYPE", ERR_LIB_PEM, PEM_R_UNSUPPORTED_PUBLIC_KEY_TYPE}, ++ #else ++ {"UNSUPPORTED_PUBLIC_KEY_TYPE", 9, 110}, ++ #endif ++ #ifdef PKCS12_R_CALLBACK_FAILED ++ {"CALLBACK_FAILED", ERR_LIB_PKCS12, PKCS12_R_CALLBACK_FAILED}, ++ #else ++ {"CALLBACK_FAILED", 35, 115}, ++ #endif ++ #ifdef PKCS12_R_CANT_PACK_STRUCTURE ++ {"CANT_PACK_STRUCTURE", ERR_LIB_PKCS12, PKCS12_R_CANT_PACK_STRUCTURE}, ++ #else ++ {"CANT_PACK_STRUCTURE", 35, 100}, ++ #endif ++ #ifdef PKCS12_R_CONTENT_TYPE_NOT_DATA ++ {"CONTENT_TYPE_NOT_DATA", ERR_LIB_PKCS12, PKCS12_R_CONTENT_TYPE_NOT_DATA}, ++ #else ++ {"CONTENT_TYPE_NOT_DATA", 35, 121}, ++ #endif ++ #ifdef PKCS12_R_DECODE_ERROR ++ {"DECODE_ERROR", ERR_LIB_PKCS12, PKCS12_R_DECODE_ERROR}, ++ #else ++ {"DECODE_ERROR", 35, 101}, ++ #endif ++ #ifdef PKCS12_R_ENCODE_ERROR ++ {"ENCODE_ERROR", ERR_LIB_PKCS12, PKCS12_R_ENCODE_ERROR}, ++ #else ++ {"ENCODE_ERROR", 35, 102}, ++ #endif ++ #ifdef PKCS12_R_ENCRYPT_ERROR ++ {"ENCRYPT_ERROR", ERR_LIB_PKCS12, PKCS12_R_ENCRYPT_ERROR}, ++ #else ++ {"ENCRYPT_ERROR", 35, 103}, ++ #endif ++ #ifdef PKCS12_R_ERROR_SETTING_ENCRYPTED_DATA_TYPE ++ {"ERROR_SETTING_ENCRYPTED_DATA_TYPE", ERR_LIB_PKCS12, PKCS12_R_ERROR_SETTING_ENCRYPTED_DATA_TYPE}, ++ #else ++ {"ERROR_SETTING_ENCRYPTED_DATA_TYPE", 35, 120}, ++ #endif ++ #ifdef PKCS12_R_INVALID_NULL_ARGUMENT ++ {"INVALID_NULL_ARGUMENT", ERR_LIB_PKCS12, PKCS12_R_INVALID_NULL_ARGUMENT}, ++ #else ++ {"INVALID_NULL_ARGUMENT", 35, 104}, ++ #endif ++ #ifdef PKCS12_R_INVALID_NULL_PKCS12_POINTER ++ {"INVALID_NULL_PKCS12_POINTER", ERR_LIB_PKCS12, PKCS12_R_INVALID_NULL_PKCS12_POINTER}, ++ #else ++ {"INVALID_NULL_PKCS12_POINTER", 35, 105}, ++ #endif ++ #ifdef PKCS12_R_INVALID_TYPE ++ {"INVALID_TYPE", ERR_LIB_PKCS12, PKCS12_R_INVALID_TYPE}, ++ #else ++ {"INVALID_TYPE", 35, 112}, ++ #endif ++ #ifdef PKCS12_R_IV_GEN_ERROR ++ {"IV_GEN_ERROR", ERR_LIB_PKCS12, PKCS12_R_IV_GEN_ERROR}, ++ #else ++ {"IV_GEN_ERROR", 35, 106}, ++ #endif ++ #ifdef PKCS12_R_KEY_GEN_ERROR ++ {"KEY_GEN_ERROR", ERR_LIB_PKCS12, PKCS12_R_KEY_GEN_ERROR}, ++ #else ++ {"KEY_GEN_ERROR", 35, 107}, ++ #endif ++ #ifdef PKCS12_R_MAC_ABSENT ++ {"MAC_ABSENT", ERR_LIB_PKCS12, PKCS12_R_MAC_ABSENT}, ++ #else ++ {"MAC_ABSENT", 35, 108}, ++ #endif ++ #ifdef PKCS12_R_MAC_GENERATION_ERROR ++ {"MAC_GENERATION_ERROR", ERR_LIB_PKCS12, PKCS12_R_MAC_GENERATION_ERROR}, ++ #else ++ {"MAC_GENERATION_ERROR", 35, 109}, ++ #endif ++ #ifdef PKCS12_R_MAC_SETUP_ERROR ++ {"MAC_SETUP_ERROR", ERR_LIB_PKCS12, PKCS12_R_MAC_SETUP_ERROR}, ++ #else ++ {"MAC_SETUP_ERROR", 35, 110}, ++ #endif ++ #ifdef PKCS12_R_MAC_STRING_SET_ERROR ++ {"MAC_STRING_SET_ERROR", ERR_LIB_PKCS12, PKCS12_R_MAC_STRING_SET_ERROR}, ++ #else ++ {"MAC_STRING_SET_ERROR", 35, 111}, ++ #endif ++ #ifdef PKCS12_R_MAC_VERIFY_FAILURE ++ {"MAC_VERIFY_FAILURE", ERR_LIB_PKCS12, PKCS12_R_MAC_VERIFY_FAILURE}, ++ #else ++ {"MAC_VERIFY_FAILURE", 35, 113}, ++ #endif ++ #ifdef PKCS12_R_PARSE_ERROR ++ {"PARSE_ERROR", ERR_LIB_PKCS12, PKCS12_R_PARSE_ERROR}, ++ #else ++ {"PARSE_ERROR", 35, 114}, ++ #endif ++ #ifdef PKCS12_R_PKCS12_CIPHERFINAL_ERROR ++ {"PKCS12_CIPHERFINAL_ERROR", ERR_LIB_PKCS12, PKCS12_R_PKCS12_CIPHERFINAL_ERROR}, ++ #else ++ {"PKCS12_CIPHERFINAL_ERROR", 35, 116}, ++ #endif ++ #ifdef PKCS12_R_UNKNOWN_DIGEST_ALGORITHM ++ {"UNKNOWN_DIGEST_ALGORITHM", ERR_LIB_PKCS12, PKCS12_R_UNKNOWN_DIGEST_ALGORITHM}, ++ #else ++ {"UNKNOWN_DIGEST_ALGORITHM", 35, 118}, ++ #endif ++ #ifdef PKCS12_R_UNSUPPORTED_PKCS12_MODE ++ {"UNSUPPORTED_PKCS12_MODE", ERR_LIB_PKCS12, PKCS12_R_UNSUPPORTED_PKCS12_MODE}, ++ #else ++ {"UNSUPPORTED_PKCS12_MODE", 35, 119}, ++ #endif ++ #ifdef PKCS7_R_CERTIFICATE_VERIFY_ERROR ++ {"CERTIFICATE_VERIFY_ERROR", ERR_LIB_PKCS7, PKCS7_R_CERTIFICATE_VERIFY_ERROR}, ++ #else ++ {"CERTIFICATE_VERIFY_ERROR", 33, 117}, ++ #endif ++ #ifdef PKCS7_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER ++ {"CIPHER_HAS_NO_OBJECT_IDENTIFIER", ERR_LIB_PKCS7, PKCS7_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER}, ++ #else ++ {"CIPHER_HAS_NO_OBJECT_IDENTIFIER", 33, 144}, ++ #endif ++ #ifdef PKCS7_R_CIPHER_NOT_INITIALIZED ++ {"CIPHER_NOT_INITIALIZED", ERR_LIB_PKCS7, PKCS7_R_CIPHER_NOT_INITIALIZED}, ++ #else ++ {"CIPHER_NOT_INITIALIZED", 33, 116}, ++ #endif ++ #ifdef PKCS7_R_CONTENT_AND_DATA_PRESENT ++ {"CONTENT_AND_DATA_PRESENT", ERR_LIB_PKCS7, PKCS7_R_CONTENT_AND_DATA_PRESENT}, ++ #else ++ {"CONTENT_AND_DATA_PRESENT", 33, 118}, ++ #endif ++ #ifdef PKCS7_R_CTRL_ERROR ++ {"CTRL_ERROR", ERR_LIB_PKCS7, PKCS7_R_CTRL_ERROR}, ++ #else ++ {"CTRL_ERROR", 33, 152}, ++ #endif ++ #ifdef PKCS7_R_DECRYPT_ERROR ++ {"DECRYPT_ERROR", ERR_LIB_PKCS7, PKCS7_R_DECRYPT_ERROR}, ++ #else ++ {"DECRYPT_ERROR", 33, 119}, ++ #endif ++ #ifdef PKCS7_R_DIGEST_FAILURE ++ {"DIGEST_FAILURE", ERR_LIB_PKCS7, PKCS7_R_DIGEST_FAILURE}, ++ #else ++ {"DIGEST_FAILURE", 33, 101}, ++ #endif ++ #ifdef PKCS7_R_ENCRYPTION_CTRL_FAILURE ++ {"ENCRYPTION_CTRL_FAILURE", ERR_LIB_PKCS7, PKCS7_R_ENCRYPTION_CTRL_FAILURE}, ++ #else ++ {"ENCRYPTION_CTRL_FAILURE", 33, 149}, ++ #endif ++ #ifdef PKCS7_R_ENCRYPTION_NOT_SUPPORTED_FOR_THIS_KEY_TYPE ++ {"ENCRYPTION_NOT_SUPPORTED_FOR_THIS_KEY_TYPE", ERR_LIB_PKCS7, PKCS7_R_ENCRYPTION_NOT_SUPPORTED_FOR_THIS_KEY_TYPE}, ++ #else ++ {"ENCRYPTION_NOT_SUPPORTED_FOR_THIS_KEY_TYPE", 33, 150}, ++ #endif ++ #ifdef PKCS7_R_ERROR_ADDING_RECIPIENT ++ {"ERROR_ADDING_RECIPIENT", ERR_LIB_PKCS7, PKCS7_R_ERROR_ADDING_RECIPIENT}, ++ #else ++ {"ERROR_ADDING_RECIPIENT", 33, 120}, ++ #endif ++ #ifdef PKCS7_R_ERROR_SETTING_CIPHER ++ {"ERROR_SETTING_CIPHER", ERR_LIB_PKCS7, PKCS7_R_ERROR_SETTING_CIPHER}, ++ #else ++ {"ERROR_SETTING_CIPHER", 33, 121}, ++ #endif ++ #ifdef PKCS7_R_INVALID_NULL_POINTER ++ {"INVALID_NULL_POINTER", ERR_LIB_PKCS7, PKCS7_R_INVALID_NULL_POINTER}, ++ #else ++ {"INVALID_NULL_POINTER", 33, 143}, ++ #endif ++ #ifdef PKCS7_R_INVALID_SIGNED_DATA_TYPE ++ {"INVALID_SIGNED_DATA_TYPE", ERR_LIB_PKCS7, PKCS7_R_INVALID_SIGNED_DATA_TYPE}, ++ #else ++ {"INVALID_SIGNED_DATA_TYPE", 33, 155}, ++ #endif ++ #ifdef PKCS7_R_NO_CONTENT ++ {"NO_CONTENT", ERR_LIB_PKCS7, PKCS7_R_NO_CONTENT}, ++ #else ++ {"NO_CONTENT", 33, 122}, ++ #endif ++ #ifdef PKCS7_R_NO_DEFAULT_DIGEST ++ {"NO_DEFAULT_DIGEST", ERR_LIB_PKCS7, PKCS7_R_NO_DEFAULT_DIGEST}, ++ #else ++ {"NO_DEFAULT_DIGEST", 33, 151}, ++ #endif ++ #ifdef PKCS7_R_NO_MATCHING_DIGEST_TYPE_FOUND ++ {"NO_MATCHING_DIGEST_TYPE_FOUND", ERR_LIB_PKCS7, PKCS7_R_NO_MATCHING_DIGEST_TYPE_FOUND}, ++ #else ++ {"NO_MATCHING_DIGEST_TYPE_FOUND", 33, 154}, ++ #endif ++ #ifdef PKCS7_R_NO_RECIPIENT_MATCHES_CERTIFICATE ++ {"NO_RECIPIENT_MATCHES_CERTIFICATE", ERR_LIB_PKCS7, PKCS7_R_NO_RECIPIENT_MATCHES_CERTIFICATE}, ++ #else ++ {"NO_RECIPIENT_MATCHES_CERTIFICATE", 33, 115}, ++ #endif ++ #ifdef PKCS7_R_NO_SIGNATURES_ON_DATA ++ {"NO_SIGNATURES_ON_DATA", ERR_LIB_PKCS7, PKCS7_R_NO_SIGNATURES_ON_DATA}, ++ #else ++ {"NO_SIGNATURES_ON_DATA", 33, 123}, ++ #endif ++ #ifdef PKCS7_R_NO_SIGNERS ++ {"NO_SIGNERS", ERR_LIB_PKCS7, PKCS7_R_NO_SIGNERS}, ++ #else ++ {"NO_SIGNERS", 33, 142}, ++ #endif ++ #ifdef PKCS7_R_OPERATION_NOT_SUPPORTED_ON_THIS_TYPE ++ {"OPERATION_NOT_SUPPORTED_ON_THIS_TYPE", ERR_LIB_PKCS7, PKCS7_R_OPERATION_NOT_SUPPORTED_ON_THIS_TYPE}, ++ #else ++ {"OPERATION_NOT_SUPPORTED_ON_THIS_TYPE", 33, 104}, ++ #endif ++ #ifdef PKCS7_R_PKCS7_ADD_SIGNATURE_ERROR ++ {"PKCS7_ADD_SIGNATURE_ERROR", ERR_LIB_PKCS7, PKCS7_R_PKCS7_ADD_SIGNATURE_ERROR}, ++ #else ++ {"PKCS7_ADD_SIGNATURE_ERROR", 33, 124}, ++ #endif ++ #ifdef PKCS7_R_PKCS7_ADD_SIGNER_ERROR ++ {"PKCS7_ADD_SIGNER_ERROR", ERR_LIB_PKCS7, PKCS7_R_PKCS7_ADD_SIGNER_ERROR}, ++ #else ++ {"PKCS7_ADD_SIGNER_ERROR", 33, 153}, ++ #endif ++ #ifdef PKCS7_R_PKCS7_DATASIGN ++ {"PKCS7_DATASIGN", ERR_LIB_PKCS7, PKCS7_R_PKCS7_DATASIGN}, ++ #else ++ {"PKCS7_DATASIGN", 33, 145}, ++ #endif ++ #ifdef PKCS7_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE ++ {"PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE", ERR_LIB_PKCS7, PKCS7_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE}, ++ #else ++ {"PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE", 33, 127}, ++ #endif ++ #ifdef PKCS7_R_SIGNATURE_FAILURE ++ {"SIGNATURE_FAILURE", ERR_LIB_PKCS7, PKCS7_R_SIGNATURE_FAILURE}, ++ #else ++ {"SIGNATURE_FAILURE", 33, 105}, ++ #endif ++ #ifdef PKCS7_R_SIGNER_CERTIFICATE_NOT_FOUND ++ {"SIGNER_CERTIFICATE_NOT_FOUND", ERR_LIB_PKCS7, PKCS7_R_SIGNER_CERTIFICATE_NOT_FOUND}, ++ #else ++ {"SIGNER_CERTIFICATE_NOT_FOUND", 33, 128}, ++ #endif ++ #ifdef PKCS7_R_SIGNING_CTRL_FAILURE ++ {"SIGNING_CTRL_FAILURE", ERR_LIB_PKCS7, PKCS7_R_SIGNING_CTRL_FAILURE}, ++ #else ++ {"SIGNING_CTRL_FAILURE", 33, 147}, ++ #endif ++ #ifdef PKCS7_R_SIGNING_NOT_SUPPORTED_FOR_THIS_KEY_TYPE ++ {"SIGNING_NOT_SUPPORTED_FOR_THIS_KEY_TYPE", ERR_LIB_PKCS7, PKCS7_R_SIGNING_NOT_SUPPORTED_FOR_THIS_KEY_TYPE}, ++ #else ++ {"SIGNING_NOT_SUPPORTED_FOR_THIS_KEY_TYPE", 33, 148}, ++ #endif ++ #ifdef PKCS7_R_SMIME_TEXT_ERROR ++ {"SMIME_TEXT_ERROR", ERR_LIB_PKCS7, PKCS7_R_SMIME_TEXT_ERROR}, ++ #else ++ {"SMIME_TEXT_ERROR", 33, 129}, ++ #endif ++ #ifdef PKCS7_R_UNABLE_TO_FIND_CERTIFICATE ++ {"UNABLE_TO_FIND_CERTIFICATE", ERR_LIB_PKCS7, PKCS7_R_UNABLE_TO_FIND_CERTIFICATE}, ++ #else ++ {"UNABLE_TO_FIND_CERTIFICATE", 33, 106}, ++ #endif ++ #ifdef PKCS7_R_UNABLE_TO_FIND_MEM_BIO ++ {"UNABLE_TO_FIND_MEM_BIO", ERR_LIB_PKCS7, PKCS7_R_UNABLE_TO_FIND_MEM_BIO}, ++ #else ++ {"UNABLE_TO_FIND_MEM_BIO", 33, 107}, ++ #endif ++ #ifdef PKCS7_R_UNABLE_TO_FIND_MESSAGE_DIGEST ++ {"UNABLE_TO_FIND_MESSAGE_DIGEST", ERR_LIB_PKCS7, PKCS7_R_UNABLE_TO_FIND_MESSAGE_DIGEST}, ++ #else ++ {"UNABLE_TO_FIND_MESSAGE_DIGEST", 33, 108}, ++ #endif ++ #ifdef PKCS7_R_UNKNOWN_DIGEST_TYPE ++ {"UNKNOWN_DIGEST_TYPE", ERR_LIB_PKCS7, PKCS7_R_UNKNOWN_DIGEST_TYPE}, ++ #else ++ {"UNKNOWN_DIGEST_TYPE", 33, 109}, ++ #endif ++ #ifdef PKCS7_R_UNKNOWN_OPERATION ++ {"UNKNOWN_OPERATION", ERR_LIB_PKCS7, PKCS7_R_UNKNOWN_OPERATION}, ++ #else ++ {"UNKNOWN_OPERATION", 33, 110}, ++ #endif ++ #ifdef PKCS7_R_UNSUPPORTED_CIPHER_TYPE ++ {"UNSUPPORTED_CIPHER_TYPE", ERR_LIB_PKCS7, PKCS7_R_UNSUPPORTED_CIPHER_TYPE}, ++ #else ++ {"UNSUPPORTED_CIPHER_TYPE", 33, 111}, ++ #endif ++ #ifdef PKCS7_R_UNSUPPORTED_CONTENT_TYPE ++ {"UNSUPPORTED_CONTENT_TYPE", ERR_LIB_PKCS7, PKCS7_R_UNSUPPORTED_CONTENT_TYPE}, ++ #else ++ {"UNSUPPORTED_CONTENT_TYPE", 33, 112}, ++ #endif ++ #ifdef PKCS7_R_WRONG_CONTENT_TYPE ++ {"WRONG_CONTENT_TYPE", ERR_LIB_PKCS7, PKCS7_R_WRONG_CONTENT_TYPE}, ++ #else ++ {"WRONG_CONTENT_TYPE", 33, 113}, ++ #endif ++ #ifdef PKCS7_R_WRONG_PKCS7_TYPE ++ {"WRONG_PKCS7_TYPE", ERR_LIB_PKCS7, PKCS7_R_WRONG_PKCS7_TYPE}, ++ #else ++ {"WRONG_PKCS7_TYPE", 33, 114}, ++ #endif ++ #ifdef PROP_R_NAME_TOO_LONG ++ {"NAME_TOO_LONG", ERR_LIB_PROP, PROP_R_NAME_TOO_LONG}, ++ #else ++ {"NAME_TOO_LONG", 55, 100}, ++ #endif ++ #ifdef PROP_R_NOT_AN_ASCII_CHARACTER ++ {"NOT_AN_ASCII_CHARACTER", ERR_LIB_PROP, PROP_R_NOT_AN_ASCII_CHARACTER}, ++ #else ++ {"NOT_AN_ASCII_CHARACTER", 55, 101}, ++ #endif ++ #ifdef PROP_R_NOT_AN_HEXADECIMAL_DIGIT ++ {"NOT_AN_HEXADECIMAL_DIGIT", ERR_LIB_PROP, PROP_R_NOT_AN_HEXADECIMAL_DIGIT}, ++ #else ++ {"NOT_AN_HEXADECIMAL_DIGIT", 55, 102}, ++ #endif ++ #ifdef PROP_R_NOT_AN_IDENTIFIER ++ {"NOT_AN_IDENTIFIER", ERR_LIB_PROP, PROP_R_NOT_AN_IDENTIFIER}, ++ #else ++ {"NOT_AN_IDENTIFIER", 55, 103}, ++ #endif ++ #ifdef PROP_R_NOT_AN_OCTAL_DIGIT ++ {"NOT_AN_OCTAL_DIGIT", ERR_LIB_PROP, PROP_R_NOT_AN_OCTAL_DIGIT}, ++ #else ++ {"NOT_AN_OCTAL_DIGIT", 55, 104}, ++ #endif ++ #ifdef PROP_R_NOT_A_DECIMAL_DIGIT ++ {"NOT_A_DECIMAL_DIGIT", ERR_LIB_PROP, PROP_R_NOT_A_DECIMAL_DIGIT}, ++ #else ++ {"NOT_A_DECIMAL_DIGIT", 55, 105}, ++ #endif ++ #ifdef PROP_R_NO_MATCHING_STRING_DELIMITER ++ {"NO_MATCHING_STRING_DELIMITER", ERR_LIB_PROP, PROP_R_NO_MATCHING_STRING_DELIMITER}, ++ #else ++ {"NO_MATCHING_STRING_DELIMITER", 55, 106}, ++ #endif ++ #ifdef PROP_R_NO_VALUE ++ {"NO_VALUE", ERR_LIB_PROP, PROP_R_NO_VALUE}, ++ #else ++ {"NO_VALUE", 55, 107}, ++ #endif ++ #ifdef PROP_R_PARSE_FAILED ++ {"PARSE_FAILED", ERR_LIB_PROP, PROP_R_PARSE_FAILED}, ++ #else ++ {"PARSE_FAILED", 55, 108}, ++ #endif ++ #ifdef PROP_R_STRING_TOO_LONG ++ {"STRING_TOO_LONG", ERR_LIB_PROP, PROP_R_STRING_TOO_LONG}, ++ #else ++ {"STRING_TOO_LONG", 55, 109}, ++ #endif ++ #ifdef PROP_R_TRAILING_CHARACTERS ++ {"TRAILING_CHARACTERS", ERR_LIB_PROP, PROP_R_TRAILING_CHARACTERS}, ++ #else ++ {"TRAILING_CHARACTERS", 55, 110}, ++ #endif ++ #ifdef PROV_R_ADDITIONAL_INPUT_TOO_LONG ++ {"ADDITIONAL_INPUT_TOO_LONG", ERR_LIB_PROV, PROV_R_ADDITIONAL_INPUT_TOO_LONG}, ++ #else ++ {"ADDITIONAL_INPUT_TOO_LONG", 57, 184}, ++ #endif ++ #ifdef PROV_R_ALGORITHM_MISMATCH ++ {"ALGORITHM_MISMATCH", ERR_LIB_PROV, PROV_R_ALGORITHM_MISMATCH}, ++ #else ++ {"ALGORITHM_MISMATCH", 57, 173}, ++ #endif ++ #ifdef PROV_R_ALREADY_INSTANTIATED ++ {"ALREADY_INSTANTIATED", ERR_LIB_PROV, PROV_R_ALREADY_INSTANTIATED}, ++ #else ++ {"ALREADY_INSTANTIATED", 57, 185}, ++ #endif ++ #ifdef PROV_R_BAD_DECRYPT ++ {"BAD_DECRYPT", ERR_LIB_PROV, PROV_R_BAD_DECRYPT}, ++ #else ++ {"BAD_DECRYPT", 57, 100}, ++ #endif ++ #ifdef PROV_R_BAD_ENCODING ++ {"BAD_ENCODING", ERR_LIB_PROV, PROV_R_BAD_ENCODING}, ++ #else ++ {"BAD_ENCODING", 57, 141}, ++ #endif ++ #ifdef PROV_R_BAD_LENGTH ++ {"BAD_LENGTH", ERR_LIB_PROV, PROV_R_BAD_LENGTH}, ++ #else ++ {"BAD_LENGTH", 57, 142}, ++ #endif ++ #ifdef PROV_R_BAD_TLS_CLIENT_VERSION ++ {"BAD_TLS_CLIENT_VERSION", ERR_LIB_PROV, PROV_R_BAD_TLS_CLIENT_VERSION}, ++ #else ++ {"BAD_TLS_CLIENT_VERSION", 57, 161}, ++ #endif ++ #ifdef PROV_R_BN_ERROR ++ {"BN_ERROR", ERR_LIB_PROV, PROV_R_BN_ERROR}, ++ #else ++ {"BN_ERROR", 57, 160}, ++ #endif ++ #ifdef PROV_R_CIPHER_OPERATION_FAILED ++ {"CIPHER_OPERATION_FAILED", ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED}, ++ #else ++ {"CIPHER_OPERATION_FAILED", 57, 102}, ++ #endif ++ #ifdef PROV_R_COFACTOR_REQUIRED ++ {"COFACTOR_REQUIRED", ERR_LIB_PROV, PROV_R_COFACTOR_REQUIRED}, ++ #else ++ {"COFACTOR_REQUIRED", 57, 236}, ++ #endif ++ #ifdef PROV_R_DERIVATION_FUNCTION_INIT_FAILED ++ {"DERIVATION_FUNCTION_INIT_FAILED", ERR_LIB_PROV, PROV_R_DERIVATION_FUNCTION_INIT_FAILED}, ++ #else ++ {"DERIVATION_FUNCTION_INIT_FAILED", 57, 205}, ++ #endif ++ #ifdef PROV_R_DIGEST_NOT_ALLOWED ++ {"DIGEST_NOT_ALLOWED", ERR_LIB_PROV, PROV_R_DIGEST_NOT_ALLOWED}, ++ #else ++ {"DIGEST_NOT_ALLOWED", 57, 174}, ++ #endif ++ #ifdef PROV_R_EMS_NOT_ENABLED ++ {"EMS_NOT_ENABLED", ERR_LIB_PROV, PROV_R_EMS_NOT_ENABLED}, ++ #else ++ {"EMS_NOT_ENABLED", 57, 233}, ++ #endif ++ #ifdef PROV_R_ENTROPY_SOURCE_FAILED_CONTINUOUS_TESTS ++ {"ENTROPY_SOURCE_FAILED_CONTINUOUS_TESTS", ERR_LIB_PROV, PROV_R_ENTROPY_SOURCE_FAILED_CONTINUOUS_TESTS}, ++ #else ++ {"ENTROPY_SOURCE_FAILED_CONTINUOUS_TESTS", 57, 244}, ++ #endif ++ #ifdef PROV_R_ENTROPY_SOURCE_STRENGTH_TOO_WEAK ++ {"ENTROPY_SOURCE_STRENGTH_TOO_WEAK", ERR_LIB_PROV, PROV_R_ENTROPY_SOURCE_STRENGTH_TOO_WEAK}, ++ #else ++ {"ENTROPY_SOURCE_STRENGTH_TOO_WEAK", 57, 186}, ++ #endif ++ #ifdef PROV_R_ERROR_INSTANTIATING_DRBG ++ {"ERROR_INSTANTIATING_DRBG", ERR_LIB_PROV, PROV_R_ERROR_INSTANTIATING_DRBG}, ++ #else ++ {"ERROR_INSTANTIATING_DRBG", 57, 188}, ++ #endif ++ #ifdef PROV_R_ERROR_RETRIEVING_ENTROPY ++ {"ERROR_RETRIEVING_ENTROPY", ERR_LIB_PROV, PROV_R_ERROR_RETRIEVING_ENTROPY}, ++ #else ++ {"ERROR_RETRIEVING_ENTROPY", 57, 189}, ++ #endif ++ #ifdef PROV_R_ERROR_RETRIEVING_NONCE ++ {"ERROR_RETRIEVING_NONCE", ERR_LIB_PROV, PROV_R_ERROR_RETRIEVING_NONCE}, ++ #else ++ {"ERROR_RETRIEVING_NONCE", 57, 190}, ++ #endif ++ #ifdef PROV_R_FAILED_DURING_DERIVATION ++ {"FAILED_DURING_DERIVATION", ERR_LIB_PROV, PROV_R_FAILED_DURING_DERIVATION}, ++ #else ++ {"FAILED_DURING_DERIVATION", 57, 164}, ++ #endif ++ #ifdef PROV_R_FAILED_TO_CREATE_LOCK ++ {"FAILED_TO_CREATE_LOCK", ERR_LIB_PROV, PROV_R_FAILED_TO_CREATE_LOCK}, ++ #else ++ {"FAILED_TO_CREATE_LOCK", 57, 180}, ++ #endif ++ #ifdef PROV_R_FAILED_TO_DECRYPT ++ {"FAILED_TO_DECRYPT", ERR_LIB_PROV, PROV_R_FAILED_TO_DECRYPT}, ++ #else ++ {"FAILED_TO_DECRYPT", 57, 162}, ++ #endif ++ #ifdef PROV_R_FAILED_TO_GENERATE_KEY ++ {"FAILED_TO_GENERATE_KEY", ERR_LIB_PROV, PROV_R_FAILED_TO_GENERATE_KEY}, ++ #else ++ {"FAILED_TO_GENERATE_KEY", 57, 121}, ++ #endif ++ #ifdef PROV_R_FAILED_TO_GET_PARAMETER ++ {"FAILED_TO_GET_PARAMETER", ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER}, ++ #else ++ {"FAILED_TO_GET_PARAMETER", 57, 103}, ++ #endif ++ #ifdef PROV_R_FAILED_TO_SET_PARAMETER ++ {"FAILED_TO_SET_PARAMETER", ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER}, ++ #else ++ {"FAILED_TO_SET_PARAMETER", 57, 104}, ++ #endif ++ #ifdef PROV_R_FAILED_TO_SIGN ++ {"FAILED_TO_SIGN", ERR_LIB_PROV, PROV_R_FAILED_TO_SIGN}, ++ #else ++ {"FAILED_TO_SIGN", 57, 175}, ++ #endif ++ #ifdef PROV_R_FINAL_CALL_OUT_OF_ORDER ++ {"FINAL_CALL_OUT_OF_ORDER", ERR_LIB_PROV, PROV_R_FINAL_CALL_OUT_OF_ORDER}, ++ #else ++ {"FINAL_CALL_OUT_OF_ORDER", 57, 237}, ++ #endif ++ #ifdef PROV_R_FIPS_MODULE_CONDITIONAL_ERROR ++ {"FIPS_MODULE_CONDITIONAL_ERROR", ERR_LIB_PROV, PROV_R_FIPS_MODULE_CONDITIONAL_ERROR}, ++ #else ++ {"FIPS_MODULE_CONDITIONAL_ERROR", 57, 227}, ++ #endif ++ #ifdef PROV_R_FIPS_MODULE_ENTERING_ERROR_STATE ++ {"FIPS_MODULE_ENTERING_ERROR_STATE", ERR_LIB_PROV, PROV_R_FIPS_MODULE_ENTERING_ERROR_STATE}, ++ #else ++ {"FIPS_MODULE_ENTERING_ERROR_STATE", 57, 224}, ++ #endif ++ #ifdef PROV_R_FIPS_MODULE_IN_ERROR_STATE ++ {"FIPS_MODULE_IN_ERROR_STATE", ERR_LIB_PROV, PROV_R_FIPS_MODULE_IN_ERROR_STATE}, ++ #else ++ {"FIPS_MODULE_IN_ERROR_STATE", 57, 225}, ++ #endif ++ #ifdef PROV_R_GENERATE_ERROR ++ {"GENERATE_ERROR", ERR_LIB_PROV, PROV_R_GENERATE_ERROR}, ++ #else ++ {"GENERATE_ERROR", 57, 191}, ++ #endif ++ #ifdef PROV_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE ++ {"ILLEGAL_OR_UNSUPPORTED_PADDING_MODE", ERR_LIB_PROV, PROV_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE}, ++ #else ++ {"ILLEGAL_OR_UNSUPPORTED_PADDING_MODE", 57, 165}, ++ #endif ++ #ifdef PROV_R_INDICATOR_INTEGRITY_FAILURE ++ {"INDICATOR_INTEGRITY_FAILURE", ERR_LIB_PROV, PROV_R_INDICATOR_INTEGRITY_FAILURE}, ++ #else ++ {"INDICATOR_INTEGRITY_FAILURE", 57, 210}, ++ #endif ++ #ifdef PROV_R_INIT_CALL_OUT_OF_ORDER ++ {"INIT_CALL_OUT_OF_ORDER", ERR_LIB_PROV, PROV_R_INIT_CALL_OUT_OF_ORDER}, ++ #else ++ {"INIT_CALL_OUT_OF_ORDER", 57, 238}, ++ #endif ++ #ifdef PROV_R_INSUFFICIENT_DRBG_STRENGTH ++ {"INSUFFICIENT_DRBG_STRENGTH", ERR_LIB_PROV, PROV_R_INSUFFICIENT_DRBG_STRENGTH}, ++ #else ++ {"INSUFFICIENT_DRBG_STRENGTH", 57, 181}, ++ #endif ++ #ifdef PROV_R_INVALID_AAD ++ {"INVALID_AAD", ERR_LIB_PROV, PROV_R_INVALID_AAD}, ++ #else ++ {"INVALID_AAD", 57, 108}, ++ #endif ++ #ifdef PROV_R_INVALID_AEAD ++ {"INVALID_AEAD", ERR_LIB_PROV, PROV_R_INVALID_AEAD}, ++ #else ++ {"INVALID_AEAD", 57, 231}, ++ #endif ++ #ifdef PROV_R_INVALID_CONFIG_DATA ++ {"INVALID_CONFIG_DATA", ERR_LIB_PROV, PROV_R_INVALID_CONFIG_DATA}, ++ #else ++ {"INVALID_CONFIG_DATA", 57, 211}, ++ #endif ++ #ifdef PROV_R_INVALID_CONSTANT_LENGTH ++ {"INVALID_CONSTANT_LENGTH", ERR_LIB_PROV, PROV_R_INVALID_CONSTANT_LENGTH}, ++ #else ++ {"INVALID_CONSTANT_LENGTH", 57, 157}, ++ #endif ++ #ifdef PROV_R_INVALID_CURVE ++ {"INVALID_CURVE", ERR_LIB_PROV, PROV_R_INVALID_CURVE}, ++ #else ++ {"INVALID_CURVE", 57, 176}, ++ #endif ++ #ifdef PROV_R_INVALID_CUSTOM_LENGTH ++ {"INVALID_CUSTOM_LENGTH", ERR_LIB_PROV, PROV_R_INVALID_CUSTOM_LENGTH}, ++ #else ++ {"INVALID_CUSTOM_LENGTH", 57, 111}, ++ #endif ++ #ifdef PROV_R_INVALID_DATA ++ {"INVALID_DATA", ERR_LIB_PROV, PROV_R_INVALID_DATA}, ++ #else ++ {"INVALID_DATA", 57, 115}, ++ #endif ++ #ifdef PROV_R_INVALID_DIGEST ++ {"INVALID_DIGEST", ERR_LIB_PROV, PROV_R_INVALID_DIGEST}, ++ #else ++ {"INVALID_DIGEST", 57, 122}, ++ #endif ++ #ifdef PROV_R_INVALID_DIGEST_LENGTH ++ {"INVALID_DIGEST_LENGTH", ERR_LIB_PROV, PROV_R_INVALID_DIGEST_LENGTH}, ++ #else ++ {"INVALID_DIGEST_LENGTH", 57, 166}, ++ #endif ++ #ifdef PROV_R_INVALID_DIGEST_SIZE ++ {"INVALID_DIGEST_SIZE", ERR_LIB_PROV, PROV_R_INVALID_DIGEST_SIZE}, ++ #else ++ {"INVALID_DIGEST_SIZE", 57, 218}, ++ #endif ++ #ifdef PROV_R_INVALID_EDDSA_INSTANCE_FOR_ATTEMPTED_OPERATION ++ {"INVALID_EDDSA_INSTANCE_FOR_ATTEMPTED_OPERATION", ERR_LIB_PROV, PROV_R_INVALID_EDDSA_INSTANCE_FOR_ATTEMPTED_OPERATION}, ++ #else ++ {"INVALID_EDDSA_INSTANCE_FOR_ATTEMPTED_OPERATION", 57, 243}, ++ #endif ++ #ifdef PROV_R_INVALID_INPUT_LENGTH ++ {"INVALID_INPUT_LENGTH", ERR_LIB_PROV, PROV_R_INVALID_INPUT_LENGTH}, ++ #else ++ {"INVALID_INPUT_LENGTH", 57, 230}, ++ #endif ++ #ifdef PROV_R_INVALID_ITERATION_COUNT ++ {"INVALID_ITERATION_COUNT", ERR_LIB_PROV, PROV_R_INVALID_ITERATION_COUNT}, ++ #else ++ {"INVALID_ITERATION_COUNT", 57, 123}, ++ #endif ++ #ifdef PROV_R_INVALID_IV_LENGTH ++ {"INVALID_IV_LENGTH", ERR_LIB_PROV, PROV_R_INVALID_IV_LENGTH}, ++ #else ++ {"INVALID_IV_LENGTH", 57, 109}, ++ #endif ++ #ifdef PROV_R_INVALID_KDF ++ {"INVALID_KDF", ERR_LIB_PROV, PROV_R_INVALID_KDF}, ++ #else ++ {"INVALID_KDF", 57, 232}, ++ #endif ++ #ifdef PROV_R_INVALID_KEY ++ {"INVALID_KEY", ERR_LIB_PROV, PROV_R_INVALID_KEY}, ++ #else ++ {"INVALID_KEY", 57, 158}, ++ #endif ++ #ifdef PROV_R_INVALID_KEY_LENGTH ++ {"INVALID_KEY_LENGTH", ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH}, ++ #else ++ {"INVALID_KEY_LENGTH", 57, 105}, ++ #endif ++ #ifdef PROV_R_INVALID_MAC ++ {"INVALID_MAC", ERR_LIB_PROV, PROV_R_INVALID_MAC}, ++ #else ++ {"INVALID_MAC", 57, 151}, ++ #endif ++ #ifdef PROV_R_INVALID_MEMORY_SIZE ++ {"INVALID_MEMORY_SIZE", ERR_LIB_PROV, PROV_R_INVALID_MEMORY_SIZE}, ++ #else ++ {"INVALID_MEMORY_SIZE", 57, 235}, ++ #endif ++ #ifdef PROV_R_INVALID_MGF1_MD ++ {"INVALID_MGF1_MD", ERR_LIB_PROV, PROV_R_INVALID_MGF1_MD}, ++ #else ++ {"INVALID_MGF1_MD", 57, 167}, ++ #endif ++ #ifdef PROV_R_INVALID_MODE ++ {"INVALID_MODE", ERR_LIB_PROV, PROV_R_INVALID_MODE}, ++ #else ++ {"INVALID_MODE", 57, 125}, ++ #endif ++ #ifdef PROV_R_INVALID_OUTPUT_LENGTH ++ {"INVALID_OUTPUT_LENGTH", ERR_LIB_PROV, PROV_R_INVALID_OUTPUT_LENGTH}, ++ #else ++ {"INVALID_OUTPUT_LENGTH", 57, 217}, ++ #endif ++ #ifdef PROV_R_INVALID_PADDING_MODE ++ {"INVALID_PADDING_MODE", ERR_LIB_PROV, PROV_R_INVALID_PADDING_MODE}, ++ #else ++ {"INVALID_PADDING_MODE", 57, 168}, ++ #endif ++ #ifdef PROV_R_INVALID_PREHASHED_DIGEST_LENGTH ++ {"INVALID_PREHASHED_DIGEST_LENGTH", ERR_LIB_PROV, PROV_R_INVALID_PREHASHED_DIGEST_LENGTH}, ++ #else ++ {"INVALID_PREHASHED_DIGEST_LENGTH", 57, 241}, ++ #endif ++ #ifdef PROV_R_INVALID_PUBINFO ++ {"INVALID_PUBINFO", ERR_LIB_PROV, PROV_R_INVALID_PUBINFO}, ++ #else ++ {"INVALID_PUBINFO", 57, 198}, ++ #endif ++ #ifdef PROV_R_INVALID_SALT_LENGTH ++ {"INVALID_SALT_LENGTH", ERR_LIB_PROV, PROV_R_INVALID_SALT_LENGTH}, ++ #else ++ {"INVALID_SALT_LENGTH", 57, 112}, ++ #endif ++ #ifdef PROV_R_INVALID_SEED_LENGTH ++ {"INVALID_SEED_LENGTH", ERR_LIB_PROV, PROV_R_INVALID_SEED_LENGTH}, ++ #else ++ {"INVALID_SEED_LENGTH", 57, 154}, ++ #endif ++ #ifdef PROV_R_INVALID_SIGNATURE_SIZE ++ {"INVALID_SIGNATURE_SIZE", ERR_LIB_PROV, PROV_R_INVALID_SIGNATURE_SIZE}, ++ #else ++ {"INVALID_SIGNATURE_SIZE", 57, 179}, ++ #endif ++ #ifdef PROV_R_INVALID_STATE ++ {"INVALID_STATE", ERR_LIB_PROV, PROV_R_INVALID_STATE}, ++ #else ++ {"INVALID_STATE", 57, 212}, ++ #endif ++ #ifdef PROV_R_INVALID_TAG ++ {"INVALID_TAG", ERR_LIB_PROV, PROV_R_INVALID_TAG}, ++ #else ++ {"INVALID_TAG", 57, 110}, ++ #endif ++ #ifdef PROV_R_INVALID_TAG_LENGTH ++ {"INVALID_TAG_LENGTH", ERR_LIB_PROV, PROV_R_INVALID_TAG_LENGTH}, ++ #else ++ {"INVALID_TAG_LENGTH", 57, 118}, ++ #endif ++ #ifdef PROV_R_INVALID_THREAD_POOL_SIZE ++ {"INVALID_THREAD_POOL_SIZE", ERR_LIB_PROV, PROV_R_INVALID_THREAD_POOL_SIZE}, ++ #else ++ {"INVALID_THREAD_POOL_SIZE", 57, 234}, ++ #endif ++ #ifdef PROV_R_INVALID_UKM_LENGTH ++ {"INVALID_UKM_LENGTH", ERR_LIB_PROV, PROV_R_INVALID_UKM_LENGTH}, ++ #else ++ {"INVALID_UKM_LENGTH", 57, 200}, ++ #endif ++ #ifdef PROV_R_INVALID_X931_DIGEST ++ {"INVALID_X931_DIGEST", ERR_LIB_PROV, PROV_R_INVALID_X931_DIGEST}, ++ #else ++ {"INVALID_X931_DIGEST", 57, 170}, ++ #endif ++ #ifdef PROV_R_IN_ERROR_STATE ++ {"IN_ERROR_STATE", ERR_LIB_PROV, PROV_R_IN_ERROR_STATE}, ++ #else ++ {"IN_ERROR_STATE", 57, 192}, ++ #endif ++ #ifdef PROV_R_KEY_SETUP_FAILED ++ {"KEY_SETUP_FAILED", ERR_LIB_PROV, PROV_R_KEY_SETUP_FAILED}, ++ #else ++ {"KEY_SETUP_FAILED", 57, 101}, ++ #endif ++ #ifdef PROV_R_KEY_SIZE_TOO_SMALL ++ {"KEY_SIZE_TOO_SMALL", ERR_LIB_PROV, PROV_R_KEY_SIZE_TOO_SMALL}, ++ #else ++ {"KEY_SIZE_TOO_SMALL", 57, 171}, ++ #endif ++ #ifdef PROV_R_LENGTH_TOO_LARGE ++ {"LENGTH_TOO_LARGE", ERR_LIB_PROV, PROV_R_LENGTH_TOO_LARGE}, ++ #else ++ {"LENGTH_TOO_LARGE", 57, 202}, ++ #endif ++ #ifdef PROV_R_MISMATCHING_DOMAIN_PARAMETERS ++ {"MISMATCHING_DOMAIN_PARAMETERS", ERR_LIB_PROV, PROV_R_MISMATCHING_DOMAIN_PARAMETERS}, ++ #else ++ {"MISMATCHING_DOMAIN_PARAMETERS", 57, 203}, ++ #endif ++ #ifdef PROV_R_MISSING_CEK_ALG ++ {"MISSING_CEK_ALG", ERR_LIB_PROV, PROV_R_MISSING_CEK_ALG}, ++ #else ++ {"MISSING_CEK_ALG", 57, 144}, ++ #endif ++ #ifdef PROV_R_MISSING_CIPHER ++ {"MISSING_CIPHER", ERR_LIB_PROV, PROV_R_MISSING_CIPHER}, ++ #else ++ {"MISSING_CIPHER", 57, 155}, ++ #endif ++ #ifdef PROV_R_MISSING_CONFIG_DATA ++ {"MISSING_CONFIG_DATA", ERR_LIB_PROV, PROV_R_MISSING_CONFIG_DATA}, ++ #else ++ {"MISSING_CONFIG_DATA", 57, 213}, ++ #endif ++ #ifdef PROV_R_MISSING_CONSTANT ++ {"MISSING_CONSTANT", ERR_LIB_PROV, PROV_R_MISSING_CONSTANT}, ++ #else ++ {"MISSING_CONSTANT", 57, 156}, ++ #endif ++ #ifdef PROV_R_MISSING_KEY ++ {"MISSING_KEY", ERR_LIB_PROV, PROV_R_MISSING_KEY}, ++ #else ++ {"MISSING_KEY", 57, 128}, ++ #endif ++ #ifdef PROV_R_MISSING_MAC ++ {"MISSING_MAC", ERR_LIB_PROV, PROV_R_MISSING_MAC}, ++ #else ++ {"MISSING_MAC", 57, 150}, ++ #endif ++ #ifdef PROV_R_MISSING_MESSAGE_DIGEST ++ {"MISSING_MESSAGE_DIGEST", ERR_LIB_PROV, PROV_R_MISSING_MESSAGE_DIGEST}, ++ #else ++ {"MISSING_MESSAGE_DIGEST", 57, 129}, ++ #endif ++ #ifdef PROV_R_MISSING_OID ++ {"MISSING_OID", ERR_LIB_PROV, PROV_R_MISSING_OID}, ++ #else ++ {"MISSING_OID", 57, 209}, ++ #endif ++ #ifdef PROV_R_MISSING_PASS ++ {"MISSING_PASS", ERR_LIB_PROV, PROV_R_MISSING_PASS}, ++ #else ++ {"MISSING_PASS", 57, 130}, ++ #endif ++ #ifdef PROV_R_MISSING_SALT ++ {"MISSING_SALT", ERR_LIB_PROV, PROV_R_MISSING_SALT}, ++ #else ++ {"MISSING_SALT", 57, 131}, ++ #endif ++ #ifdef PROV_R_MISSING_SECRET ++ {"MISSING_SECRET", ERR_LIB_PROV, PROV_R_MISSING_SECRET}, ++ #else ++ {"MISSING_SECRET", 57, 132}, ++ #endif ++ #ifdef PROV_R_MISSING_SEED ++ {"MISSING_SEED", ERR_LIB_PROV, PROV_R_MISSING_SEED}, ++ #else ++ {"MISSING_SEED", 57, 140}, ++ #endif ++ #ifdef PROV_R_MISSING_SESSION_ID ++ {"MISSING_SESSION_ID", ERR_LIB_PROV, PROV_R_MISSING_SESSION_ID}, ++ #else ++ {"MISSING_SESSION_ID", 57, 133}, ++ #endif ++ #ifdef PROV_R_MISSING_TYPE ++ {"MISSING_TYPE", ERR_LIB_PROV, PROV_R_MISSING_TYPE}, ++ #else ++ {"MISSING_TYPE", 57, 134}, ++ #endif ++ #ifdef PROV_R_MISSING_XCGHASH ++ {"MISSING_XCGHASH", ERR_LIB_PROV, PROV_R_MISSING_XCGHASH}, ++ #else ++ {"MISSING_XCGHASH", 57, 135}, ++ #endif ++ #ifdef PROV_R_MODULE_INTEGRITY_FAILURE ++ {"MODULE_INTEGRITY_FAILURE", ERR_LIB_PROV, PROV_R_MODULE_INTEGRITY_FAILURE}, ++ #else ++ {"MODULE_INTEGRITY_FAILURE", 57, 214}, ++ #endif ++ #ifdef PROV_R_NOT_A_PRIVATE_KEY ++ {"NOT_A_PRIVATE_KEY", ERR_LIB_PROV, PROV_R_NOT_A_PRIVATE_KEY}, ++ #else ++ {"NOT_A_PRIVATE_KEY", 57, 221}, ++ #endif ++ #ifdef PROV_R_NOT_A_PUBLIC_KEY ++ {"NOT_A_PUBLIC_KEY", ERR_LIB_PROV, PROV_R_NOT_A_PUBLIC_KEY}, ++ #else ++ {"NOT_A_PUBLIC_KEY", 57, 220}, ++ #endif ++ #ifdef PROV_R_NOT_INSTANTIATED ++ {"NOT_INSTANTIATED", ERR_LIB_PROV, PROV_R_NOT_INSTANTIATED}, ++ #else ++ {"NOT_INSTANTIATED", 57, 193}, ++ #endif ++ #ifdef PROV_R_NOT_PARAMETERS ++ {"NOT_PARAMETERS", ERR_LIB_PROV, PROV_R_NOT_PARAMETERS}, ++ #else ++ {"NOT_PARAMETERS", 57, 226}, ++ #endif ++ #ifdef PROV_R_NOT_SUPPORTED ++ {"NOT_SUPPORTED", ERR_LIB_PROV, PROV_R_NOT_SUPPORTED}, ++ #else ++ {"NOT_SUPPORTED", 57, 136}, ++ #endif ++ #ifdef PROV_R_NOT_XOF_OR_INVALID_LENGTH ++ {"NOT_XOF_OR_INVALID_LENGTH", ERR_LIB_PROV, PROV_R_NOT_XOF_OR_INVALID_LENGTH}, ++ #else ++ {"NOT_XOF_OR_INVALID_LENGTH", 57, 113}, ++ #endif ++ #ifdef PROV_R_NO_INSTANCE_ALLOWED ++ {"NO_INSTANCE_ALLOWED", ERR_LIB_PROV, PROV_R_NO_INSTANCE_ALLOWED}, ++ #else ++ {"NO_INSTANCE_ALLOWED", 57, 242}, ++ #endif ++ #ifdef PROV_R_NO_KEY_SET ++ {"NO_KEY_SET", ERR_LIB_PROV, PROV_R_NO_KEY_SET}, ++ #else ++ {"NO_KEY_SET", 57, 114}, ++ #endif ++ #ifdef PROV_R_NO_PARAMETERS_SET ++ {"NO_PARAMETERS_SET", ERR_LIB_PROV, PROV_R_NO_PARAMETERS_SET}, ++ #else ++ {"NO_PARAMETERS_SET", 57, 177}, ++ #endif ++ #ifdef PROV_R_ONESHOT_CALL_OUT_OF_ORDER ++ {"ONESHOT_CALL_OUT_OF_ORDER", ERR_LIB_PROV, PROV_R_ONESHOT_CALL_OUT_OF_ORDER}, ++ #else ++ {"ONESHOT_CALL_OUT_OF_ORDER", 57, 239}, ++ #endif ++ #ifdef PROV_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE ++ {"OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE", ERR_LIB_PROV, PROV_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE}, ++ #else ++ {"OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE", 57, 178}, ++ #endif ++ #ifdef PROV_R_OUTPUT_BUFFER_TOO_SMALL ++ {"OUTPUT_BUFFER_TOO_SMALL", ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL}, ++ #else ++ {"OUTPUT_BUFFER_TOO_SMALL", 57, 106}, ++ #endif ++ #ifdef PROV_R_PARENT_CANNOT_GENERATE_RANDOM_NUMBERS ++ {"PARENT_CANNOT_GENERATE_RANDOM_NUMBERS", ERR_LIB_PROV, PROV_R_PARENT_CANNOT_GENERATE_RANDOM_NUMBERS}, ++ #else ++ {"PARENT_CANNOT_GENERATE_RANDOM_NUMBERS", 57, 228}, ++ #endif ++ #ifdef PROV_R_PARENT_CANNOT_SUPPLY_ENTROPY_SEED ++ {"PARENT_CANNOT_SUPPLY_ENTROPY_SEED", ERR_LIB_PROV, PROV_R_PARENT_CANNOT_SUPPLY_ENTROPY_SEED}, ++ #else ++ {"PARENT_CANNOT_SUPPLY_ENTROPY_SEED", 57, 187}, ++ #endif ++ #ifdef PROV_R_PARENT_LOCKING_NOT_ENABLED ++ {"PARENT_LOCKING_NOT_ENABLED", ERR_LIB_PROV, PROV_R_PARENT_LOCKING_NOT_ENABLED}, ++ #else ++ {"PARENT_LOCKING_NOT_ENABLED", 57, 182}, ++ #endif ++ #ifdef PROV_R_PARENT_STRENGTH_TOO_WEAK ++ {"PARENT_STRENGTH_TOO_WEAK", ERR_LIB_PROV, PROV_R_PARENT_STRENGTH_TOO_WEAK}, ++ #else ++ {"PARENT_STRENGTH_TOO_WEAK", 57, 194}, ++ #endif ++ #ifdef PROV_R_PATH_MUST_BE_ABSOLUTE ++ {"PATH_MUST_BE_ABSOLUTE", ERR_LIB_PROV, PROV_R_PATH_MUST_BE_ABSOLUTE}, ++ #else ++ {"PATH_MUST_BE_ABSOLUTE", 57, 219}, ++ #endif ++ #ifdef PROV_R_PERSONALISATION_STRING_TOO_LONG ++ {"PERSONALISATION_STRING_TOO_LONG", ERR_LIB_PROV, PROV_R_PERSONALISATION_STRING_TOO_LONG}, ++ #else ++ {"PERSONALISATION_STRING_TOO_LONG", 57, 195}, ++ #endif ++ #ifdef PROV_R_PSS_SALTLEN_TOO_SMALL ++ {"PSS_SALTLEN_TOO_SMALL", ERR_LIB_PROV, PROV_R_PSS_SALTLEN_TOO_SMALL}, ++ #else ++ {"PSS_SALTLEN_TOO_SMALL", 57, 172}, ++ #endif ++ #ifdef PROV_R_REQUEST_TOO_LARGE_FOR_DRBG ++ {"REQUEST_TOO_LARGE_FOR_DRBG", ERR_LIB_PROV, PROV_R_REQUEST_TOO_LARGE_FOR_DRBG}, ++ #else ++ {"REQUEST_TOO_LARGE_FOR_DRBG", 57, 196}, ++ #endif ++ #ifdef PROV_R_REQUIRE_CTR_MODE_CIPHER ++ {"REQUIRE_CTR_MODE_CIPHER", ERR_LIB_PROV, PROV_R_REQUIRE_CTR_MODE_CIPHER}, ++ #else ++ {"REQUIRE_CTR_MODE_CIPHER", 57, 206}, ++ #endif ++ #ifdef PROV_R_RESEED_ERROR ++ {"RESEED_ERROR", ERR_LIB_PROV, PROV_R_RESEED_ERROR}, ++ #else ++ {"RESEED_ERROR", 57, 197}, ++ #endif ++ #ifdef PROV_R_SEARCH_ONLY_SUPPORTED_FOR_DIRECTORIES ++ {"SEARCH_ONLY_SUPPORTED_FOR_DIRECTORIES", ERR_LIB_PROV, PROV_R_SEARCH_ONLY_SUPPORTED_FOR_DIRECTORIES}, ++ #else ++ {"SEARCH_ONLY_SUPPORTED_FOR_DIRECTORIES", 57, 222}, ++ #endif ++ #ifdef PROV_R_SEED_SOURCES_MUST_NOT_HAVE_A_PARENT ++ {"SEED_SOURCES_MUST_NOT_HAVE_A_PARENT", ERR_LIB_PROV, PROV_R_SEED_SOURCES_MUST_NOT_HAVE_A_PARENT}, ++ #else ++ {"SEED_SOURCES_MUST_NOT_HAVE_A_PARENT", 57, 229}, ++ #endif ++ #ifdef PROV_R_SELF_TEST_KAT_FAILURE ++ {"SELF_TEST_KAT_FAILURE", ERR_LIB_PROV, PROV_R_SELF_TEST_KAT_FAILURE}, ++ #else ++ {"SELF_TEST_KAT_FAILURE", 57, 215}, ++ #endif ++ #ifdef PROV_R_SELF_TEST_POST_FAILURE ++ {"SELF_TEST_POST_FAILURE", ERR_LIB_PROV, PROV_R_SELF_TEST_POST_FAILURE}, ++ #else ++ {"SELF_TEST_POST_FAILURE", 57, 216}, ++ #endif ++ #ifdef PROV_R_TAG_NOT_NEEDED ++ {"TAG_NOT_NEEDED", ERR_LIB_PROV, PROV_R_TAG_NOT_NEEDED}, ++ #else ++ {"TAG_NOT_NEEDED", 57, 120}, ++ #endif ++ #ifdef PROV_R_TAG_NOT_SET ++ {"TAG_NOT_SET", ERR_LIB_PROV, PROV_R_TAG_NOT_SET}, ++ #else ++ {"TAG_NOT_SET", 57, 119}, ++ #endif ++ #ifdef PROV_R_TOO_MANY_RECORDS ++ {"TOO_MANY_RECORDS", ERR_LIB_PROV, PROV_R_TOO_MANY_RECORDS}, ++ #else ++ {"TOO_MANY_RECORDS", 57, 126}, ++ #endif ++ #ifdef PROV_R_UNABLE_TO_FIND_CIPHERS ++ {"UNABLE_TO_FIND_CIPHERS", ERR_LIB_PROV, PROV_R_UNABLE_TO_FIND_CIPHERS}, ++ #else ++ {"UNABLE_TO_FIND_CIPHERS", 57, 207}, ++ #endif ++ #ifdef PROV_R_UNABLE_TO_GET_PARENT_STRENGTH ++ {"UNABLE_TO_GET_PARENT_STRENGTH", ERR_LIB_PROV, PROV_R_UNABLE_TO_GET_PARENT_STRENGTH}, ++ #else ++ {"UNABLE_TO_GET_PARENT_STRENGTH", 57, 199}, ++ #endif ++ #ifdef PROV_R_UNABLE_TO_GET_PASSPHRASE ++ {"UNABLE_TO_GET_PASSPHRASE", ERR_LIB_PROV, PROV_R_UNABLE_TO_GET_PASSPHRASE}, ++ #else ++ {"UNABLE_TO_GET_PASSPHRASE", 57, 159}, ++ #endif ++ #ifdef PROV_R_UNABLE_TO_INITIALISE_CIPHERS ++ {"UNABLE_TO_INITIALISE_CIPHERS", ERR_LIB_PROV, PROV_R_UNABLE_TO_INITIALISE_CIPHERS}, ++ #else ++ {"UNABLE_TO_INITIALISE_CIPHERS", 57, 208}, ++ #endif ++ #ifdef PROV_R_UNABLE_TO_LOAD_SHA256 ++ {"UNABLE_TO_LOAD_SHA256", ERR_LIB_PROV, PROV_R_UNABLE_TO_LOAD_SHA256}, ++ #else ++ {"UNABLE_TO_LOAD_SHA256", 57, 147}, ++ #endif ++ #ifdef PROV_R_UNABLE_TO_LOCK_PARENT ++ {"UNABLE_TO_LOCK_PARENT", ERR_LIB_PROV, PROV_R_UNABLE_TO_LOCK_PARENT}, ++ #else ++ {"UNABLE_TO_LOCK_PARENT", 57, 201}, ++ #endif ++ #ifdef PROV_R_UNABLE_TO_RESEED ++ {"UNABLE_TO_RESEED", ERR_LIB_PROV, PROV_R_UNABLE_TO_RESEED}, ++ #else ++ {"UNABLE_TO_RESEED", 57, 204}, ++ #endif ++ #ifdef PROV_R_UNSUPPORTED_CEK_ALG ++ {"UNSUPPORTED_CEK_ALG", ERR_LIB_PROV, PROV_R_UNSUPPORTED_CEK_ALG}, ++ #else ++ {"UNSUPPORTED_CEK_ALG", 57, 145}, ++ #endif ++ #ifdef PROV_R_UNSUPPORTED_KEY_SIZE ++ {"UNSUPPORTED_KEY_SIZE", ERR_LIB_PROV, PROV_R_UNSUPPORTED_KEY_SIZE}, ++ #else ++ {"UNSUPPORTED_KEY_SIZE", 57, 153}, ++ #endif ++ #ifdef PROV_R_UNSUPPORTED_MAC_TYPE ++ {"UNSUPPORTED_MAC_TYPE", ERR_LIB_PROV, PROV_R_UNSUPPORTED_MAC_TYPE}, ++ #else ++ {"UNSUPPORTED_MAC_TYPE", 57, 137}, ++ #endif ++ #ifdef PROV_R_UNSUPPORTED_NUMBER_OF_ROUNDS ++ {"UNSUPPORTED_NUMBER_OF_ROUNDS", ERR_LIB_PROV, PROV_R_UNSUPPORTED_NUMBER_OF_ROUNDS}, ++ #else ++ {"UNSUPPORTED_NUMBER_OF_ROUNDS", 57, 152}, ++ #endif ++ #ifdef PROV_R_UPDATE_CALL_OUT_OF_ORDER ++ {"UPDATE_CALL_OUT_OF_ORDER", ERR_LIB_PROV, PROV_R_UPDATE_CALL_OUT_OF_ORDER}, ++ #else ++ {"UPDATE_CALL_OUT_OF_ORDER", 57, 240}, ++ #endif ++ #ifdef PROV_R_URI_AUTHORITY_UNSUPPORTED ++ {"URI_AUTHORITY_UNSUPPORTED", ERR_LIB_PROV, PROV_R_URI_AUTHORITY_UNSUPPORTED}, ++ #else ++ {"URI_AUTHORITY_UNSUPPORTED", 57, 223}, ++ #endif ++ #ifdef PROV_R_VALUE_ERROR ++ {"VALUE_ERROR", ERR_LIB_PROV, PROV_R_VALUE_ERROR}, ++ #else ++ {"VALUE_ERROR", 57, 138}, ++ #endif ++ #ifdef PROV_R_WRONG_FINAL_BLOCK_LENGTH ++ {"WRONG_FINAL_BLOCK_LENGTH", ERR_LIB_PROV, PROV_R_WRONG_FINAL_BLOCK_LENGTH}, ++ #else ++ {"WRONG_FINAL_BLOCK_LENGTH", 57, 107}, ++ #endif ++ #ifdef PROV_R_WRONG_OUTPUT_BUFFER_SIZE ++ {"WRONG_OUTPUT_BUFFER_SIZE", ERR_LIB_PROV, PROV_R_WRONG_OUTPUT_BUFFER_SIZE}, ++ #else ++ {"WRONG_OUTPUT_BUFFER_SIZE", 57, 139}, ++ #endif ++ #ifdef PROV_R_XOF_DIGESTS_NOT_ALLOWED ++ {"XOF_DIGESTS_NOT_ALLOWED", ERR_LIB_PROV, PROV_R_XOF_DIGESTS_NOT_ALLOWED}, ++ #else ++ {"XOF_DIGESTS_NOT_ALLOWED", 57, 183}, ++ #endif ++ #ifdef PROV_R_XTS_DATA_UNIT_IS_TOO_LARGE ++ {"XTS_DATA_UNIT_IS_TOO_LARGE", ERR_LIB_PROV, PROV_R_XTS_DATA_UNIT_IS_TOO_LARGE}, ++ #else ++ {"XTS_DATA_UNIT_IS_TOO_LARGE", 57, 148}, ++ #endif ++ #ifdef PROV_R_XTS_DUPLICATED_KEYS ++ {"XTS_DUPLICATED_KEYS", ERR_LIB_PROV, PROV_R_XTS_DUPLICATED_KEYS}, ++ #else ++ {"XTS_DUPLICATED_KEYS", 57, 149}, ++ #endif ++ #ifdef RAND_R_ADDITIONAL_INPUT_TOO_LONG ++ {"ADDITIONAL_INPUT_TOO_LONG", ERR_LIB_RAND, RAND_R_ADDITIONAL_INPUT_TOO_LONG}, ++ #else ++ {"ADDITIONAL_INPUT_TOO_LONG", 36, 102}, ++ #endif ++ #ifdef RAND_R_ALREADY_INSTANTIATED ++ {"ALREADY_INSTANTIATED", ERR_LIB_RAND, RAND_R_ALREADY_INSTANTIATED}, ++ #else ++ {"ALREADY_INSTANTIATED", 36, 103}, ++ #endif ++ #ifdef RAND_R_ARGUMENT_OUT_OF_RANGE ++ {"ARGUMENT_OUT_OF_RANGE", ERR_LIB_RAND, RAND_R_ARGUMENT_OUT_OF_RANGE}, ++ #else ++ {"ARGUMENT_OUT_OF_RANGE", 36, 105}, ++ #endif ++ #ifdef RAND_R_CANNOT_OPEN_FILE ++ {"CANNOT_OPEN_FILE", ERR_LIB_RAND, RAND_R_CANNOT_OPEN_FILE}, ++ #else ++ {"CANNOT_OPEN_FILE", 36, 121}, ++ #endif ++ #ifdef RAND_R_DRBG_ALREADY_INITIALIZED ++ {"DRBG_ALREADY_INITIALIZED", ERR_LIB_RAND, RAND_R_DRBG_ALREADY_INITIALIZED}, ++ #else ++ {"DRBG_ALREADY_INITIALIZED", 36, 129}, ++ #endif ++ #ifdef RAND_R_DRBG_NOT_INITIALISED ++ {"DRBG_NOT_INITIALISED", ERR_LIB_RAND, RAND_R_DRBG_NOT_INITIALISED}, ++ #else ++ {"DRBG_NOT_INITIALISED", 36, 104}, ++ #endif ++ #ifdef RAND_R_ENTROPY_INPUT_TOO_LONG ++ {"ENTROPY_INPUT_TOO_LONG", ERR_LIB_RAND, RAND_R_ENTROPY_INPUT_TOO_LONG}, ++ #else ++ {"ENTROPY_INPUT_TOO_LONG", 36, 106}, ++ #endif ++ #ifdef RAND_R_ENTROPY_OUT_OF_RANGE ++ {"ENTROPY_OUT_OF_RANGE", ERR_LIB_RAND, RAND_R_ENTROPY_OUT_OF_RANGE}, ++ #else ++ {"ENTROPY_OUT_OF_RANGE", 36, 124}, ++ #endif ++ #ifdef RAND_R_ERROR_ENTROPY_POOL_WAS_IGNORED ++ {"ERROR_ENTROPY_POOL_WAS_IGNORED", ERR_LIB_RAND, RAND_R_ERROR_ENTROPY_POOL_WAS_IGNORED}, ++ #else ++ {"ERROR_ENTROPY_POOL_WAS_IGNORED", 36, 127}, ++ #endif ++ #ifdef RAND_R_ERROR_INITIALISING_DRBG ++ {"ERROR_INITIALISING_DRBG", ERR_LIB_RAND, RAND_R_ERROR_INITIALISING_DRBG}, ++ #else ++ {"ERROR_INITIALISING_DRBG", 36, 107}, ++ #endif ++ #ifdef RAND_R_ERROR_INSTANTIATING_DRBG ++ {"ERROR_INSTANTIATING_DRBG", ERR_LIB_RAND, RAND_R_ERROR_INSTANTIATING_DRBG}, ++ #else ++ {"ERROR_INSTANTIATING_DRBG", 36, 108}, ++ #endif ++ #ifdef RAND_R_ERROR_RETRIEVING_ADDITIONAL_INPUT ++ {"ERROR_RETRIEVING_ADDITIONAL_INPUT", ERR_LIB_RAND, RAND_R_ERROR_RETRIEVING_ADDITIONAL_INPUT}, ++ #else ++ {"ERROR_RETRIEVING_ADDITIONAL_INPUT", 36, 109}, ++ #endif ++ #ifdef RAND_R_ERROR_RETRIEVING_ENTROPY ++ {"ERROR_RETRIEVING_ENTROPY", ERR_LIB_RAND, RAND_R_ERROR_RETRIEVING_ENTROPY}, ++ #else ++ {"ERROR_RETRIEVING_ENTROPY", 36, 110}, ++ #endif ++ #ifdef RAND_R_ERROR_RETRIEVING_NONCE ++ {"ERROR_RETRIEVING_NONCE", ERR_LIB_RAND, RAND_R_ERROR_RETRIEVING_NONCE}, ++ #else ++ {"ERROR_RETRIEVING_NONCE", 36, 111}, ++ #endif ++ #ifdef RAND_R_FAILED_TO_CREATE_LOCK ++ {"FAILED_TO_CREATE_LOCK", ERR_LIB_RAND, RAND_R_FAILED_TO_CREATE_LOCK}, ++ #else ++ {"FAILED_TO_CREATE_LOCK", 36, 126}, ++ #endif ++ #ifdef RAND_R_FUNC_NOT_IMPLEMENTED ++ {"FUNC_NOT_IMPLEMENTED", ERR_LIB_RAND, RAND_R_FUNC_NOT_IMPLEMENTED}, ++ #else ++ {"FUNC_NOT_IMPLEMENTED", 36, 101}, ++ #endif ++ #ifdef RAND_R_FWRITE_ERROR ++ {"FWRITE_ERROR", ERR_LIB_RAND, RAND_R_FWRITE_ERROR}, ++ #else ++ {"FWRITE_ERROR", 36, 123}, ++ #endif ++ #ifdef RAND_R_GENERATE_ERROR ++ {"GENERATE_ERROR", ERR_LIB_RAND, RAND_R_GENERATE_ERROR}, ++ #else ++ {"GENERATE_ERROR", 36, 112}, ++ #endif ++ #ifdef RAND_R_INSUFFICIENT_DRBG_STRENGTH ++ {"INSUFFICIENT_DRBG_STRENGTH", ERR_LIB_RAND, RAND_R_INSUFFICIENT_DRBG_STRENGTH}, ++ #else ++ {"INSUFFICIENT_DRBG_STRENGTH", 36, 139}, ++ #endif ++ #ifdef RAND_R_INTERNAL_ERROR ++ {"INTERNAL_ERROR", ERR_LIB_RAND, RAND_R_INTERNAL_ERROR}, ++ #else ++ {"INTERNAL_ERROR", 36, 113}, ++ #endif ++ #ifdef RAND_R_INVALID_PROPERTY_QUERY ++ {"INVALID_PROPERTY_QUERY", ERR_LIB_RAND, RAND_R_INVALID_PROPERTY_QUERY}, ++ #else ++ {"INVALID_PROPERTY_QUERY", 36, 137}, ++ #endif ++ #ifdef RAND_R_IN_ERROR_STATE ++ {"IN_ERROR_STATE", ERR_LIB_RAND, RAND_R_IN_ERROR_STATE}, ++ #else ++ {"IN_ERROR_STATE", 36, 114}, ++ #endif ++ #ifdef RAND_R_NOT_A_REGULAR_FILE ++ {"NOT_A_REGULAR_FILE", ERR_LIB_RAND, RAND_R_NOT_A_REGULAR_FILE}, ++ #else ++ {"NOT_A_REGULAR_FILE", 36, 122}, ++ #endif ++ #ifdef RAND_R_NOT_INSTANTIATED ++ {"NOT_INSTANTIATED", ERR_LIB_RAND, RAND_R_NOT_INSTANTIATED}, ++ #else ++ {"NOT_INSTANTIATED", 36, 115}, ++ #endif ++ #ifdef RAND_R_NO_DRBG_IMPLEMENTATION_SELECTED ++ {"NO_DRBG_IMPLEMENTATION_SELECTED", ERR_LIB_RAND, RAND_R_NO_DRBG_IMPLEMENTATION_SELECTED}, ++ #else ++ {"NO_DRBG_IMPLEMENTATION_SELECTED", 36, 128}, ++ #endif ++ #ifdef RAND_R_PARENT_LOCKING_NOT_ENABLED ++ {"PARENT_LOCKING_NOT_ENABLED", ERR_LIB_RAND, RAND_R_PARENT_LOCKING_NOT_ENABLED}, ++ #else ++ {"PARENT_LOCKING_NOT_ENABLED", 36, 130}, ++ #endif ++ #ifdef RAND_R_PARENT_STRENGTH_TOO_WEAK ++ {"PARENT_STRENGTH_TOO_WEAK", ERR_LIB_RAND, RAND_R_PARENT_STRENGTH_TOO_WEAK}, ++ #else ++ {"PARENT_STRENGTH_TOO_WEAK", 36, 131}, ++ #endif ++ #ifdef RAND_R_PERSONALISATION_STRING_TOO_LONG ++ {"PERSONALISATION_STRING_TOO_LONG", ERR_LIB_RAND, RAND_R_PERSONALISATION_STRING_TOO_LONG}, ++ #else ++ {"PERSONALISATION_STRING_TOO_LONG", 36, 116}, ++ #endif ++ #ifdef RAND_R_PREDICTION_RESISTANCE_NOT_SUPPORTED ++ {"PREDICTION_RESISTANCE_NOT_SUPPORTED", ERR_LIB_RAND, RAND_R_PREDICTION_RESISTANCE_NOT_SUPPORTED}, ++ #else ++ {"PREDICTION_RESISTANCE_NOT_SUPPORTED", 36, 133}, ++ #endif ++ #ifdef RAND_R_PRNG_NOT_SEEDED ++ {"PRNG_NOT_SEEDED", ERR_LIB_RAND, RAND_R_PRNG_NOT_SEEDED}, ++ #else ++ {"PRNG_NOT_SEEDED", 36, 100}, ++ #endif ++ #ifdef RAND_R_RANDOM_POOL_OVERFLOW ++ {"RANDOM_POOL_OVERFLOW", ERR_LIB_RAND, RAND_R_RANDOM_POOL_OVERFLOW}, ++ #else ++ {"RANDOM_POOL_OVERFLOW", 36, 125}, ++ #endif ++ #ifdef RAND_R_RANDOM_POOL_UNDERFLOW ++ {"RANDOM_POOL_UNDERFLOW", ERR_LIB_RAND, RAND_R_RANDOM_POOL_UNDERFLOW}, ++ #else ++ {"RANDOM_POOL_UNDERFLOW", 36, 134}, ++ #endif ++ #ifdef RAND_R_REQUEST_TOO_LARGE_FOR_DRBG ++ {"REQUEST_TOO_LARGE_FOR_DRBG", ERR_LIB_RAND, RAND_R_REQUEST_TOO_LARGE_FOR_DRBG}, ++ #else ++ {"REQUEST_TOO_LARGE_FOR_DRBG", 36, 117}, ++ #endif ++ #ifdef RAND_R_RESEED_ERROR ++ {"RESEED_ERROR", ERR_LIB_RAND, RAND_R_RESEED_ERROR}, ++ #else ++ {"RESEED_ERROR", 36, 118}, ++ #endif ++ #ifdef RAND_R_SELFTEST_FAILURE ++ {"SELFTEST_FAILURE", ERR_LIB_RAND, RAND_R_SELFTEST_FAILURE}, ++ #else ++ {"SELFTEST_FAILURE", 36, 119}, ++ #endif ++ #ifdef RAND_R_TOO_LITTLE_NONCE_REQUESTED ++ {"TOO_LITTLE_NONCE_REQUESTED", ERR_LIB_RAND, RAND_R_TOO_LITTLE_NONCE_REQUESTED}, ++ #else ++ {"TOO_LITTLE_NONCE_REQUESTED", 36, 135}, ++ #endif ++ #ifdef RAND_R_TOO_MUCH_NONCE_REQUESTED ++ {"TOO_MUCH_NONCE_REQUESTED", ERR_LIB_RAND, RAND_R_TOO_MUCH_NONCE_REQUESTED}, ++ #else ++ {"TOO_MUCH_NONCE_REQUESTED", 36, 136}, ++ #endif ++ #ifdef RAND_R_UNABLE_TO_CREATE_DRBG ++ {"UNABLE_TO_CREATE_DRBG", ERR_LIB_RAND, RAND_R_UNABLE_TO_CREATE_DRBG}, ++ #else ++ {"UNABLE_TO_CREATE_DRBG", 36, 143}, ++ #endif ++ #ifdef RAND_R_UNABLE_TO_FETCH_DRBG ++ {"UNABLE_TO_FETCH_DRBG", ERR_LIB_RAND, RAND_R_UNABLE_TO_FETCH_DRBG}, ++ #else ++ {"UNABLE_TO_FETCH_DRBG", 36, 144}, ++ #endif ++ #ifdef RAND_R_UNABLE_TO_GET_PARENT_RESEED_PROP_COUNTER ++ {"UNABLE_TO_GET_PARENT_RESEED_PROP_COUNTER", ERR_LIB_RAND, RAND_R_UNABLE_TO_GET_PARENT_RESEED_PROP_COUNTER}, ++ #else ++ {"UNABLE_TO_GET_PARENT_RESEED_PROP_COUNTER", 36, 141}, ++ #endif ++ #ifdef RAND_R_UNABLE_TO_GET_PARENT_STRENGTH ++ {"UNABLE_TO_GET_PARENT_STRENGTH", ERR_LIB_RAND, RAND_R_UNABLE_TO_GET_PARENT_STRENGTH}, ++ #else ++ {"UNABLE_TO_GET_PARENT_STRENGTH", 36, 138}, ++ #endif ++ #ifdef RAND_R_UNABLE_TO_LOCK_PARENT ++ {"UNABLE_TO_LOCK_PARENT", ERR_LIB_RAND, RAND_R_UNABLE_TO_LOCK_PARENT}, ++ #else ++ {"UNABLE_TO_LOCK_PARENT", 36, 140}, ++ #endif ++ #ifdef RAND_R_UNSUPPORTED_DRBG_FLAGS ++ {"UNSUPPORTED_DRBG_FLAGS", ERR_LIB_RAND, RAND_R_UNSUPPORTED_DRBG_FLAGS}, ++ #else ++ {"UNSUPPORTED_DRBG_FLAGS", 36, 132}, ++ #endif ++ #ifdef RAND_R_UNSUPPORTED_DRBG_TYPE ++ {"UNSUPPORTED_DRBG_TYPE", ERR_LIB_RAND, RAND_R_UNSUPPORTED_DRBG_TYPE}, ++ #else ++ {"UNSUPPORTED_DRBG_TYPE", 36, 120}, ++ #endif ++ #ifdef RSA_R_ALGORITHM_MISMATCH ++ {"ALGORITHM_MISMATCH", ERR_LIB_RSA, RSA_R_ALGORITHM_MISMATCH}, ++ #else ++ {"ALGORITHM_MISMATCH", 4, 100}, ++ #endif ++ #ifdef RSA_R_BAD_E_VALUE ++ {"BAD_E_VALUE", ERR_LIB_RSA, RSA_R_BAD_E_VALUE}, ++ #else ++ {"BAD_E_VALUE", 4, 101}, ++ #endif ++ #ifdef RSA_R_BAD_FIXED_HEADER_DECRYPT ++ {"BAD_FIXED_HEADER_DECRYPT", ERR_LIB_RSA, RSA_R_BAD_FIXED_HEADER_DECRYPT}, ++ #else ++ {"BAD_FIXED_HEADER_DECRYPT", 4, 102}, ++ #endif ++ #ifdef RSA_R_BAD_PAD_BYTE_COUNT ++ {"BAD_PAD_BYTE_COUNT", ERR_LIB_RSA, RSA_R_BAD_PAD_BYTE_COUNT}, ++ #else ++ {"BAD_PAD_BYTE_COUNT", 4, 103}, ++ #endif ++ #ifdef RSA_R_BAD_SIGNATURE ++ {"BAD_SIGNATURE", ERR_LIB_RSA, RSA_R_BAD_SIGNATURE}, ++ #else ++ {"BAD_SIGNATURE", 4, 104}, ++ #endif ++ #ifdef RSA_R_BLOCK_TYPE_IS_NOT_01 ++ {"BLOCK_TYPE_IS_NOT_01", ERR_LIB_RSA, RSA_R_BLOCK_TYPE_IS_NOT_01}, ++ #else ++ {"BLOCK_TYPE_IS_NOT_01", 4, 106}, ++ #endif ++ #ifdef RSA_R_BLOCK_TYPE_IS_NOT_02 ++ {"BLOCK_TYPE_IS_NOT_02", ERR_LIB_RSA, RSA_R_BLOCK_TYPE_IS_NOT_02}, ++ #else ++ {"BLOCK_TYPE_IS_NOT_02", 4, 107}, ++ #endif ++ #ifdef RSA_R_DATA_GREATER_THAN_MOD_LEN ++ {"DATA_GREATER_THAN_MOD_LEN", ERR_LIB_RSA, RSA_R_DATA_GREATER_THAN_MOD_LEN}, ++ #else ++ {"DATA_GREATER_THAN_MOD_LEN", 4, 108}, ++ #endif ++ #ifdef RSA_R_DATA_TOO_LARGE ++ {"DATA_TOO_LARGE", ERR_LIB_RSA, RSA_R_DATA_TOO_LARGE}, ++ #else ++ {"DATA_TOO_LARGE", 4, 109}, ++ #endif ++ #ifdef RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE ++ {"DATA_TOO_LARGE_FOR_KEY_SIZE", ERR_LIB_RSA, RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE}, ++ #else ++ {"DATA_TOO_LARGE_FOR_KEY_SIZE", 4, 110}, ++ #endif ++ #ifdef RSA_R_DATA_TOO_LARGE_FOR_MODULUS ++ {"DATA_TOO_LARGE_FOR_MODULUS", ERR_LIB_RSA, RSA_R_DATA_TOO_LARGE_FOR_MODULUS}, ++ #else ++ {"DATA_TOO_LARGE_FOR_MODULUS", 4, 132}, ++ #endif ++ #ifdef RSA_R_DATA_TOO_SMALL ++ {"DATA_TOO_SMALL", ERR_LIB_RSA, RSA_R_DATA_TOO_SMALL}, ++ #else ++ {"DATA_TOO_SMALL", 4, 111}, ++ #endif ++ #ifdef RSA_R_DATA_TOO_SMALL_FOR_KEY_SIZE ++ {"DATA_TOO_SMALL_FOR_KEY_SIZE", ERR_LIB_RSA, RSA_R_DATA_TOO_SMALL_FOR_KEY_SIZE}, ++ #else ++ {"DATA_TOO_SMALL_FOR_KEY_SIZE", 4, 122}, ++ #endif ++ #ifdef RSA_R_DIGEST_DOES_NOT_MATCH ++ {"DIGEST_DOES_NOT_MATCH", ERR_LIB_RSA, RSA_R_DIGEST_DOES_NOT_MATCH}, ++ #else ++ {"DIGEST_DOES_NOT_MATCH", 4, 158}, ++ #endif ++ #ifdef RSA_R_DIGEST_NOT_ALLOWED ++ {"DIGEST_NOT_ALLOWED", ERR_LIB_RSA, RSA_R_DIGEST_NOT_ALLOWED}, ++ #else ++ {"DIGEST_NOT_ALLOWED", 4, 145}, ++ #endif ++ #ifdef RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY ++ {"DIGEST_TOO_BIG_FOR_RSA_KEY", ERR_LIB_RSA, RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY}, ++ #else ++ {"DIGEST_TOO_BIG_FOR_RSA_KEY", 4, 112}, ++ #endif ++ #ifdef RSA_R_DMP1_NOT_CONGRUENT_TO_D ++ {"DMP1_NOT_CONGRUENT_TO_D", ERR_LIB_RSA, RSA_R_DMP1_NOT_CONGRUENT_TO_D}, ++ #else ++ {"DMP1_NOT_CONGRUENT_TO_D", 4, 124}, ++ #endif ++ #ifdef RSA_R_DMQ1_NOT_CONGRUENT_TO_D ++ {"DMQ1_NOT_CONGRUENT_TO_D", ERR_LIB_RSA, RSA_R_DMQ1_NOT_CONGRUENT_TO_D}, ++ #else ++ {"DMQ1_NOT_CONGRUENT_TO_D", 4, 125}, ++ #endif ++ #ifdef RSA_R_D_E_NOT_CONGRUENT_TO_1 ++ {"D_E_NOT_CONGRUENT_TO_1", ERR_LIB_RSA, RSA_R_D_E_NOT_CONGRUENT_TO_1}, ++ #else ++ {"D_E_NOT_CONGRUENT_TO_1", 4, 123}, ++ #endif ++ #ifdef RSA_R_FIRST_OCTET_INVALID ++ {"FIRST_OCTET_INVALID", ERR_LIB_RSA, RSA_R_FIRST_OCTET_INVALID}, ++ #else ++ {"FIRST_OCTET_INVALID", 4, 133}, ++ #endif ++ #ifdef RSA_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE ++ {"ILLEGAL_OR_UNSUPPORTED_PADDING_MODE", ERR_LIB_RSA, RSA_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE}, ++ #else ++ {"ILLEGAL_OR_UNSUPPORTED_PADDING_MODE", 4, 144}, ++ #endif ++ #ifdef RSA_R_INVALID_DIGEST ++ {"INVALID_DIGEST", ERR_LIB_RSA, RSA_R_INVALID_DIGEST}, ++ #else ++ {"INVALID_DIGEST", 4, 157}, ++ #endif ++ #ifdef RSA_R_INVALID_DIGEST_LENGTH ++ {"INVALID_DIGEST_LENGTH", ERR_LIB_RSA, RSA_R_INVALID_DIGEST_LENGTH}, ++ #else ++ {"INVALID_DIGEST_LENGTH", 4, 143}, ++ #endif ++ #ifdef RSA_R_INVALID_HEADER ++ {"INVALID_HEADER", ERR_LIB_RSA, RSA_R_INVALID_HEADER}, ++ #else ++ {"INVALID_HEADER", 4, 137}, ++ #endif ++ #ifdef RSA_R_INVALID_KEYPAIR ++ {"INVALID_KEYPAIR", ERR_LIB_RSA, RSA_R_INVALID_KEYPAIR}, ++ #else ++ {"INVALID_KEYPAIR", 4, 171}, ++ #endif ++ #ifdef RSA_R_INVALID_KEY_LENGTH ++ {"INVALID_KEY_LENGTH", ERR_LIB_RSA, RSA_R_INVALID_KEY_LENGTH}, ++ #else ++ {"INVALID_KEY_LENGTH", 4, 173}, ++ #endif ++ #ifdef RSA_R_INVALID_LABEL ++ {"INVALID_LABEL", ERR_LIB_RSA, RSA_R_INVALID_LABEL}, ++ #else ++ {"INVALID_LABEL", 4, 160}, ++ #endif ++ #ifdef RSA_R_INVALID_LENGTH ++ {"INVALID_LENGTH", ERR_LIB_RSA, RSA_R_INVALID_LENGTH}, ++ #else ++ {"INVALID_LENGTH", 4, 181}, ++ #endif ++ #ifdef RSA_R_INVALID_MESSAGE_LENGTH ++ {"INVALID_MESSAGE_LENGTH", ERR_LIB_RSA, RSA_R_INVALID_MESSAGE_LENGTH}, ++ #else ++ {"INVALID_MESSAGE_LENGTH", 4, 131}, ++ #endif ++ #ifdef RSA_R_INVALID_MGF1_MD ++ {"INVALID_MGF1_MD", ERR_LIB_RSA, RSA_R_INVALID_MGF1_MD}, ++ #else ++ {"INVALID_MGF1_MD", 4, 156}, ++ #endif ++ #ifdef RSA_R_INVALID_MODULUS ++ {"INVALID_MODULUS", ERR_LIB_RSA, RSA_R_INVALID_MODULUS}, ++ #else ++ {"INVALID_MODULUS", 4, 174}, ++ #endif ++ #ifdef RSA_R_INVALID_MULTI_PRIME_KEY ++ {"INVALID_MULTI_PRIME_KEY", ERR_LIB_RSA, RSA_R_INVALID_MULTI_PRIME_KEY}, ++ #else ++ {"INVALID_MULTI_PRIME_KEY", 4, 167}, ++ #endif ++ #ifdef RSA_R_INVALID_OAEP_PARAMETERS ++ {"INVALID_OAEP_PARAMETERS", ERR_LIB_RSA, RSA_R_INVALID_OAEP_PARAMETERS}, ++ #else ++ {"INVALID_OAEP_PARAMETERS", 4, 161}, ++ #endif ++ #ifdef RSA_R_INVALID_PADDING ++ {"INVALID_PADDING", ERR_LIB_RSA, RSA_R_INVALID_PADDING}, ++ #else ++ {"INVALID_PADDING", 4, 138}, ++ #endif ++ #ifdef RSA_R_INVALID_PADDING_MODE ++ {"INVALID_PADDING_MODE", ERR_LIB_RSA, RSA_R_INVALID_PADDING_MODE}, ++ #else ++ {"INVALID_PADDING_MODE", 4, 141}, ++ #endif ++ #ifdef RSA_R_INVALID_PSS_PARAMETERS ++ {"INVALID_PSS_PARAMETERS", ERR_LIB_RSA, RSA_R_INVALID_PSS_PARAMETERS}, ++ #else ++ {"INVALID_PSS_PARAMETERS", 4, 149}, ++ #endif ++ #ifdef RSA_R_INVALID_PSS_SALTLEN ++ {"INVALID_PSS_SALTLEN", ERR_LIB_RSA, RSA_R_INVALID_PSS_SALTLEN}, ++ #else ++ {"INVALID_PSS_SALTLEN", 4, 146}, ++ #endif ++ #ifdef RSA_R_INVALID_REQUEST ++ {"INVALID_REQUEST", ERR_LIB_RSA, RSA_R_INVALID_REQUEST}, ++ #else ++ {"INVALID_REQUEST", 4, 175}, ++ #endif ++ #ifdef RSA_R_INVALID_SALT_LENGTH ++ {"INVALID_SALT_LENGTH", ERR_LIB_RSA, RSA_R_INVALID_SALT_LENGTH}, ++ #else ++ {"INVALID_SALT_LENGTH", 4, 150}, ++ #endif ++ #ifdef RSA_R_INVALID_STRENGTH ++ {"INVALID_STRENGTH", ERR_LIB_RSA, RSA_R_INVALID_STRENGTH}, ++ #else ++ {"INVALID_STRENGTH", 4, 176}, ++ #endif ++ #ifdef RSA_R_INVALID_TRAILER ++ {"INVALID_TRAILER", ERR_LIB_RSA, RSA_R_INVALID_TRAILER}, ++ #else ++ {"INVALID_TRAILER", 4, 139}, ++ #endif ++ #ifdef RSA_R_INVALID_X931_DIGEST ++ {"INVALID_X931_DIGEST", ERR_LIB_RSA, RSA_R_INVALID_X931_DIGEST}, ++ #else ++ {"INVALID_X931_DIGEST", 4, 142}, ++ #endif ++ #ifdef RSA_R_IQMP_NOT_INVERSE_OF_Q ++ {"IQMP_NOT_INVERSE_OF_Q", ERR_LIB_RSA, RSA_R_IQMP_NOT_INVERSE_OF_Q}, ++ #else ++ {"IQMP_NOT_INVERSE_OF_Q", 4, 126}, ++ #endif ++ #ifdef RSA_R_KEY_PRIME_NUM_INVALID ++ {"KEY_PRIME_NUM_INVALID", ERR_LIB_RSA, RSA_R_KEY_PRIME_NUM_INVALID}, ++ #else ++ {"KEY_PRIME_NUM_INVALID", 4, 165}, ++ #endif ++ #ifdef RSA_R_KEY_SIZE_TOO_SMALL ++ {"KEY_SIZE_TOO_SMALL", ERR_LIB_RSA, RSA_R_KEY_SIZE_TOO_SMALL}, ++ #else ++ {"KEY_SIZE_TOO_SMALL", 4, 120}, ++ #endif ++ #ifdef RSA_R_LAST_OCTET_INVALID ++ {"LAST_OCTET_INVALID", ERR_LIB_RSA, RSA_R_LAST_OCTET_INVALID}, ++ #else ++ {"LAST_OCTET_INVALID", 4, 134}, ++ #endif ++ #ifdef RSA_R_MGF1_DIGEST_NOT_ALLOWED ++ {"MGF1_DIGEST_NOT_ALLOWED", ERR_LIB_RSA, RSA_R_MGF1_DIGEST_NOT_ALLOWED}, ++ #else ++ {"MGF1_DIGEST_NOT_ALLOWED", 4, 152}, ++ #endif ++ #ifdef RSA_R_MISSING_PRIVATE_KEY ++ {"MISSING_PRIVATE_KEY", ERR_LIB_RSA, RSA_R_MISSING_PRIVATE_KEY}, ++ #else ++ {"MISSING_PRIVATE_KEY", 4, 179}, ++ #endif ++ #ifdef RSA_R_MODULUS_TOO_LARGE ++ {"MODULUS_TOO_LARGE", ERR_LIB_RSA, RSA_R_MODULUS_TOO_LARGE}, ++ #else ++ {"MODULUS_TOO_LARGE", 4, 105}, ++ #endif ++ #ifdef RSA_R_MP_COEFFICIENT_NOT_INVERSE_OF_R ++ {"MP_COEFFICIENT_NOT_INVERSE_OF_R", ERR_LIB_RSA, RSA_R_MP_COEFFICIENT_NOT_INVERSE_OF_R}, ++ #else ++ {"MP_COEFFICIENT_NOT_INVERSE_OF_R", 4, 168}, ++ #endif ++ #ifdef RSA_R_MP_EXPONENT_NOT_CONGRUENT_TO_D ++ {"MP_EXPONENT_NOT_CONGRUENT_TO_D", ERR_LIB_RSA, RSA_R_MP_EXPONENT_NOT_CONGRUENT_TO_D}, ++ #else ++ {"MP_EXPONENT_NOT_CONGRUENT_TO_D", 4, 169}, ++ #endif ++ #ifdef RSA_R_MP_R_NOT_PRIME ++ {"MP_R_NOT_PRIME", ERR_LIB_RSA, RSA_R_MP_R_NOT_PRIME}, ++ #else ++ {"MP_R_NOT_PRIME", 4, 170}, ++ #endif ++ #ifdef RSA_R_NO_PUBLIC_EXPONENT ++ {"NO_PUBLIC_EXPONENT", ERR_LIB_RSA, RSA_R_NO_PUBLIC_EXPONENT}, ++ #else ++ {"NO_PUBLIC_EXPONENT", 4, 140}, ++ #endif ++ #ifdef RSA_R_NULL_BEFORE_BLOCK_MISSING ++ {"NULL_BEFORE_BLOCK_MISSING", ERR_LIB_RSA, RSA_R_NULL_BEFORE_BLOCK_MISSING}, ++ #else ++ {"NULL_BEFORE_BLOCK_MISSING", 4, 113}, ++ #endif ++ #ifdef RSA_R_N_DOES_NOT_EQUAL_PRODUCT_OF_PRIMES ++ {"N_DOES_NOT_EQUAL_PRODUCT_OF_PRIMES", ERR_LIB_RSA, RSA_R_N_DOES_NOT_EQUAL_PRODUCT_OF_PRIMES}, ++ #else ++ {"N_DOES_NOT_EQUAL_PRODUCT_OF_PRIMES", 4, 172}, ++ #endif ++ #ifdef RSA_R_N_DOES_NOT_EQUAL_P_Q ++ {"N_DOES_NOT_EQUAL_P_Q", ERR_LIB_RSA, RSA_R_N_DOES_NOT_EQUAL_P_Q}, ++ #else ++ {"N_DOES_NOT_EQUAL_P_Q", 4, 127}, ++ #endif ++ #ifdef RSA_R_OAEP_DECODING_ERROR ++ {"OAEP_DECODING_ERROR", ERR_LIB_RSA, RSA_R_OAEP_DECODING_ERROR}, ++ #else ++ {"OAEP_DECODING_ERROR", 4, 121}, ++ #endif ++ #ifdef RSA_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE ++ {"OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE", ERR_LIB_RSA, RSA_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE}, ++ #else ++ {"OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE", 4, 148}, ++ #endif ++ #ifdef RSA_R_PADDING_CHECK_FAILED ++ {"PADDING_CHECK_FAILED", ERR_LIB_RSA, RSA_R_PADDING_CHECK_FAILED}, ++ #else ++ {"PADDING_CHECK_FAILED", 4, 114}, ++ #endif ++ #ifdef RSA_R_PAIRWISE_TEST_FAILURE ++ {"PAIRWISE_TEST_FAILURE", ERR_LIB_RSA, RSA_R_PAIRWISE_TEST_FAILURE}, ++ #else ++ {"PAIRWISE_TEST_FAILURE", 4, 177}, ++ #endif ++ #ifdef RSA_R_PKCS_DECODING_ERROR ++ {"PKCS_DECODING_ERROR", ERR_LIB_RSA, RSA_R_PKCS_DECODING_ERROR}, ++ #else ++ {"PKCS_DECODING_ERROR", 4, 159}, ++ #endif ++ #ifdef RSA_R_PSS_SALTLEN_TOO_SMALL ++ {"PSS_SALTLEN_TOO_SMALL", ERR_LIB_RSA, RSA_R_PSS_SALTLEN_TOO_SMALL}, ++ #else ++ {"PSS_SALTLEN_TOO_SMALL", 4, 164}, ++ #endif ++ #ifdef RSA_R_PUB_EXPONENT_OUT_OF_RANGE ++ {"PUB_EXPONENT_OUT_OF_RANGE", ERR_LIB_RSA, RSA_R_PUB_EXPONENT_OUT_OF_RANGE}, ++ #else ++ {"PUB_EXPONENT_OUT_OF_RANGE", 4, 178}, ++ #endif ++ #ifdef RSA_R_P_NOT_PRIME ++ {"P_NOT_PRIME", ERR_LIB_RSA, RSA_R_P_NOT_PRIME}, ++ #else ++ {"P_NOT_PRIME", 4, 128}, ++ #endif ++ #ifdef RSA_R_Q_NOT_PRIME ++ {"Q_NOT_PRIME", ERR_LIB_RSA, RSA_R_Q_NOT_PRIME}, ++ #else ++ {"Q_NOT_PRIME", 4, 129}, ++ #endif ++ #ifdef RSA_R_RANDOMNESS_SOURCE_STRENGTH_INSUFFICIENT ++ {"RANDOMNESS_SOURCE_STRENGTH_INSUFFICIENT", ERR_LIB_RSA, RSA_R_RANDOMNESS_SOURCE_STRENGTH_INSUFFICIENT}, ++ #else ++ {"RANDOMNESS_SOURCE_STRENGTH_INSUFFICIENT", 4, 180}, ++ #endif ++ #ifdef RSA_R_RSA_OPERATIONS_NOT_SUPPORTED ++ {"RSA_OPERATIONS_NOT_SUPPORTED", ERR_LIB_RSA, RSA_R_RSA_OPERATIONS_NOT_SUPPORTED}, ++ #else ++ {"RSA_OPERATIONS_NOT_SUPPORTED", 4, 130}, ++ #endif ++ #ifdef RSA_R_SLEN_CHECK_FAILED ++ {"SLEN_CHECK_FAILED", ERR_LIB_RSA, RSA_R_SLEN_CHECK_FAILED}, ++ #else ++ {"SLEN_CHECK_FAILED", 4, 136}, ++ #endif ++ #ifdef RSA_R_SLEN_RECOVERY_FAILED ++ {"SLEN_RECOVERY_FAILED", ERR_LIB_RSA, RSA_R_SLEN_RECOVERY_FAILED}, ++ #else ++ {"SLEN_RECOVERY_FAILED", 4, 135}, ++ #endif ++ #ifdef RSA_R_SSLV3_ROLLBACK_ATTACK ++ {"SSLV3_ROLLBACK_ATTACK", ERR_LIB_RSA, RSA_R_SSLV3_ROLLBACK_ATTACK}, ++ #else ++ {"SSLV3_ROLLBACK_ATTACK", 4, 115}, ++ #endif ++ #ifdef RSA_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD ++ {"THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD", ERR_LIB_RSA, RSA_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD}, ++ #else ++ {"THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD", 4, 116}, ++ #endif ++ #ifdef RSA_R_UNKNOWN_ALGORITHM_TYPE ++ {"UNKNOWN_ALGORITHM_TYPE", ERR_LIB_RSA, RSA_R_UNKNOWN_ALGORITHM_TYPE}, ++ #else ++ {"UNKNOWN_ALGORITHM_TYPE", 4, 117}, ++ #endif ++ #ifdef RSA_R_UNKNOWN_DIGEST ++ {"UNKNOWN_DIGEST", ERR_LIB_RSA, RSA_R_UNKNOWN_DIGEST}, ++ #else ++ {"UNKNOWN_DIGEST", 4, 166}, ++ #endif ++ #ifdef RSA_R_UNKNOWN_MASK_DIGEST ++ {"UNKNOWN_MASK_DIGEST", ERR_LIB_RSA, RSA_R_UNKNOWN_MASK_DIGEST}, ++ #else ++ {"UNKNOWN_MASK_DIGEST", 4, 151}, ++ #endif ++ #ifdef RSA_R_UNKNOWN_PADDING_TYPE ++ {"UNKNOWN_PADDING_TYPE", ERR_LIB_RSA, RSA_R_UNKNOWN_PADDING_TYPE}, ++ #else ++ {"UNKNOWN_PADDING_TYPE", 4, 118}, ++ #endif ++ #ifdef RSA_R_UNSUPPORTED_ENCRYPTION_TYPE ++ {"UNSUPPORTED_ENCRYPTION_TYPE", ERR_LIB_RSA, RSA_R_UNSUPPORTED_ENCRYPTION_TYPE}, ++ #else ++ {"UNSUPPORTED_ENCRYPTION_TYPE", 4, 162}, ++ #endif ++ #ifdef RSA_R_UNSUPPORTED_LABEL_SOURCE ++ {"UNSUPPORTED_LABEL_SOURCE", ERR_LIB_RSA, RSA_R_UNSUPPORTED_LABEL_SOURCE}, ++ #else ++ {"UNSUPPORTED_LABEL_SOURCE", 4, 163}, ++ #endif ++ #ifdef RSA_R_UNSUPPORTED_MASK_ALGORITHM ++ {"UNSUPPORTED_MASK_ALGORITHM", ERR_LIB_RSA, RSA_R_UNSUPPORTED_MASK_ALGORITHM}, ++ #else ++ {"UNSUPPORTED_MASK_ALGORITHM", 4, 153}, ++ #endif ++ #ifdef RSA_R_UNSUPPORTED_MASK_PARAMETER ++ {"UNSUPPORTED_MASK_PARAMETER", ERR_LIB_RSA, RSA_R_UNSUPPORTED_MASK_PARAMETER}, ++ #else ++ {"UNSUPPORTED_MASK_PARAMETER", 4, 154}, ++ #endif ++ #ifdef RSA_R_UNSUPPORTED_SIGNATURE_TYPE ++ {"UNSUPPORTED_SIGNATURE_TYPE", ERR_LIB_RSA, RSA_R_UNSUPPORTED_SIGNATURE_TYPE}, ++ #else ++ {"UNSUPPORTED_SIGNATURE_TYPE", 4, 155}, ++ #endif ++ #ifdef RSA_R_VALUE_MISSING ++ {"VALUE_MISSING", ERR_LIB_RSA, RSA_R_VALUE_MISSING}, ++ #else ++ {"VALUE_MISSING", 4, 147}, ++ #endif ++ #ifdef RSA_R_WRONG_SIGNATURE_LENGTH ++ {"WRONG_SIGNATURE_LENGTH", ERR_LIB_RSA, RSA_R_WRONG_SIGNATURE_LENGTH}, ++ #else ++ {"WRONG_SIGNATURE_LENGTH", 4, 119}, ++ #endif ++ #ifdef SM2_R_ASN1_ERROR ++ {"ASN1_ERROR", ERR_LIB_SM2, SM2_R_ASN1_ERROR}, ++ #else ++ {"ASN1_ERROR", 53, 100}, ++ #endif ++ #ifdef SM2_R_BAD_SIGNATURE ++ {"BAD_SIGNATURE", ERR_LIB_SM2, SM2_R_BAD_SIGNATURE}, ++ #else ++ {"BAD_SIGNATURE", 53, 101}, ++ #endif ++ #ifdef SM2_R_BUFFER_TOO_SMALL ++ {"BUFFER_TOO_SMALL", ERR_LIB_SM2, SM2_R_BUFFER_TOO_SMALL}, ++ #else ++ {"BUFFER_TOO_SMALL", 53, 107}, ++ #endif ++ #ifdef SM2_R_DIST_ID_TOO_LARGE ++ {"DIST_ID_TOO_LARGE", ERR_LIB_SM2, SM2_R_DIST_ID_TOO_LARGE}, ++ #else ++ {"DIST_ID_TOO_LARGE", 53, 110}, ++ #endif ++ #ifdef SM2_R_ID_NOT_SET ++ {"ID_NOT_SET", ERR_LIB_SM2, SM2_R_ID_NOT_SET}, ++ #else ++ {"ID_NOT_SET", 53, 112}, ++ #endif ++ #ifdef SM2_R_ID_TOO_LARGE ++ {"ID_TOO_LARGE", ERR_LIB_SM2, SM2_R_ID_TOO_LARGE}, ++ #else ++ {"ID_TOO_LARGE", 53, 111}, ++ #endif ++ #ifdef SM2_R_INVALID_CURVE ++ {"INVALID_CURVE", ERR_LIB_SM2, SM2_R_INVALID_CURVE}, ++ #else ++ {"INVALID_CURVE", 53, 108}, ++ #endif ++ #ifdef SM2_R_INVALID_DIGEST ++ {"INVALID_DIGEST", ERR_LIB_SM2, SM2_R_INVALID_DIGEST}, ++ #else ++ {"INVALID_DIGEST", 53, 102}, ++ #endif ++ #ifdef SM2_R_INVALID_DIGEST_TYPE ++ {"INVALID_DIGEST_TYPE", ERR_LIB_SM2, SM2_R_INVALID_DIGEST_TYPE}, ++ #else ++ {"INVALID_DIGEST_TYPE", 53, 103}, ++ #endif ++ #ifdef SM2_R_INVALID_ENCODING ++ {"INVALID_ENCODING", ERR_LIB_SM2, SM2_R_INVALID_ENCODING}, ++ #else ++ {"INVALID_ENCODING", 53, 104}, ++ #endif ++ #ifdef SM2_R_INVALID_FIELD ++ {"INVALID_FIELD", ERR_LIB_SM2, SM2_R_INVALID_FIELD}, ++ #else ++ {"INVALID_FIELD", 53, 105}, ++ #endif ++ #ifdef SM2_R_INVALID_PRIVATE_KEY ++ {"INVALID_PRIVATE_KEY", ERR_LIB_SM2, SM2_R_INVALID_PRIVATE_KEY}, ++ #else ++ {"INVALID_PRIVATE_KEY", 53, 113}, ++ #endif ++ #ifdef SM2_R_NO_PARAMETERS_SET ++ {"NO_PARAMETERS_SET", ERR_LIB_SM2, SM2_R_NO_PARAMETERS_SET}, ++ #else ++ {"NO_PARAMETERS_SET", 53, 109}, ++ #endif ++ #ifdef SM2_R_USER_ID_TOO_LARGE ++ {"USER_ID_TOO_LARGE", ERR_LIB_SM2, SM2_R_USER_ID_TOO_LARGE}, ++ #else ++ {"USER_ID_TOO_LARGE", 53, 106}, ++ #endif ++ #ifdef SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY ++ {"APPLICATION_DATA_AFTER_CLOSE_NOTIFY", ERR_LIB_SSL, SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY}, ++ #else ++ {"APPLICATION_DATA_AFTER_CLOSE_NOTIFY", 20, 291}, ++ #endif ++ #ifdef SSL_R_APP_DATA_IN_HANDSHAKE ++ {"APP_DATA_IN_HANDSHAKE", ERR_LIB_SSL, SSL_R_APP_DATA_IN_HANDSHAKE}, ++ #else ++ {"APP_DATA_IN_HANDSHAKE", 20, 100}, ++ #endif ++ #ifdef SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT ++ {"ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT", ERR_LIB_SSL, SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT}, ++ #else ++ {"ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT", 20, 272}, ++ #endif ++ #ifdef SSL_R_AT_LEAST_TLS_1_2_NEEDED_IN_SUITEB_MODE ++ {"AT_LEAST_TLS_1_2_NEEDED_IN_SUITEB_MODE", ERR_LIB_SSL, SSL_R_AT_LEAST_TLS_1_2_NEEDED_IN_SUITEB_MODE}, ++ #else ++ {"AT_LEAST_TLS_1_2_NEEDED_IN_SUITEB_MODE", 20, 158}, ++ #endif ++ #ifdef SSL_R_BAD_CERTIFICATE ++ {"BAD_CERTIFICATE", ERR_LIB_SSL, SSL_R_BAD_CERTIFICATE}, ++ #else ++ {"BAD_CERTIFICATE", 20, 348}, ++ #endif ++ #ifdef SSL_R_BAD_CHANGE_CIPHER_SPEC ++ {"BAD_CHANGE_CIPHER_SPEC", ERR_LIB_SSL, SSL_R_BAD_CHANGE_CIPHER_SPEC}, ++ #else ++ {"BAD_CHANGE_CIPHER_SPEC", 20, 103}, ++ #endif ++ #ifdef SSL_R_BAD_CIPHER ++ {"BAD_CIPHER", ERR_LIB_SSL, SSL_R_BAD_CIPHER}, ++ #else ++ {"BAD_CIPHER", 20, 186}, ++ #endif ++ #ifdef SSL_R_BAD_COMPRESSION_ALGORITHM ++ {"BAD_COMPRESSION_ALGORITHM", ERR_LIB_SSL, SSL_R_BAD_COMPRESSION_ALGORITHM}, ++ #else ++ {"BAD_COMPRESSION_ALGORITHM", 20, 326}, ++ #endif ++ #ifdef SSL_R_BAD_DATA ++ {"BAD_DATA", ERR_LIB_SSL, SSL_R_BAD_DATA}, ++ #else ++ {"BAD_DATA", 20, 390}, ++ #endif ++ #ifdef SSL_R_BAD_DATA_RETURNED_BY_CALLBACK ++ {"BAD_DATA_RETURNED_BY_CALLBACK", ERR_LIB_SSL, SSL_R_BAD_DATA_RETURNED_BY_CALLBACK}, ++ #else ++ {"BAD_DATA_RETURNED_BY_CALLBACK", 20, 106}, ++ #endif ++ #ifdef SSL_R_BAD_DECOMPRESSION ++ {"BAD_DECOMPRESSION", ERR_LIB_SSL, SSL_R_BAD_DECOMPRESSION}, ++ #else ++ {"BAD_DECOMPRESSION", 20, 107}, ++ #endif ++ #ifdef SSL_R_BAD_DH_VALUE ++ {"BAD_DH_VALUE", ERR_LIB_SSL, SSL_R_BAD_DH_VALUE}, ++ #else ++ {"BAD_DH_VALUE", 20, 102}, ++ #endif ++ #ifdef SSL_R_BAD_DIGEST_LENGTH ++ {"BAD_DIGEST_LENGTH", ERR_LIB_SSL, SSL_R_BAD_DIGEST_LENGTH}, ++ #else ++ {"BAD_DIGEST_LENGTH", 20, 111}, ++ #endif ++ #ifdef SSL_R_BAD_EARLY_DATA ++ {"BAD_EARLY_DATA", ERR_LIB_SSL, SSL_R_BAD_EARLY_DATA}, ++ #else ++ {"BAD_EARLY_DATA", 20, 233}, ++ #endif ++ #ifdef SSL_R_BAD_ECC_CERT ++ {"BAD_ECC_CERT", ERR_LIB_SSL, SSL_R_BAD_ECC_CERT}, ++ #else ++ {"BAD_ECC_CERT", 20, 304}, ++ #endif ++ #ifdef SSL_R_BAD_ECPOINT ++ {"BAD_ECPOINT", ERR_LIB_SSL, SSL_R_BAD_ECPOINT}, ++ #else ++ {"BAD_ECPOINT", 20, 306}, ++ #endif ++ #ifdef SSL_R_BAD_EXTENSION ++ {"BAD_EXTENSION", ERR_LIB_SSL, SSL_R_BAD_EXTENSION}, ++ #else ++ {"BAD_EXTENSION", 20, 110}, ++ #endif ++ #ifdef SSL_R_BAD_HANDSHAKE_LENGTH ++ {"BAD_HANDSHAKE_LENGTH", ERR_LIB_SSL, SSL_R_BAD_HANDSHAKE_LENGTH}, ++ #else ++ {"BAD_HANDSHAKE_LENGTH", 20, 332}, ++ #endif ++ #ifdef SSL_R_BAD_HANDSHAKE_STATE ++ {"BAD_HANDSHAKE_STATE", ERR_LIB_SSL, SSL_R_BAD_HANDSHAKE_STATE}, ++ #else ++ {"BAD_HANDSHAKE_STATE", 20, 236}, ++ #endif ++ #ifdef SSL_R_BAD_HELLO_REQUEST ++ {"BAD_HELLO_REQUEST", ERR_LIB_SSL, SSL_R_BAD_HELLO_REQUEST}, ++ #else ++ {"BAD_HELLO_REQUEST", 20, 105}, ++ #endif ++ #ifdef SSL_R_BAD_HRR_VERSION ++ {"BAD_HRR_VERSION", ERR_LIB_SSL, SSL_R_BAD_HRR_VERSION}, ++ #else ++ {"BAD_HRR_VERSION", 20, 263}, ++ #endif ++ #ifdef SSL_R_BAD_KEY_SHARE ++ {"BAD_KEY_SHARE", ERR_LIB_SSL, SSL_R_BAD_KEY_SHARE}, ++ #else ++ {"BAD_KEY_SHARE", 20, 108}, ++ #endif ++ #ifdef SSL_R_BAD_KEY_UPDATE ++ {"BAD_KEY_UPDATE", ERR_LIB_SSL, SSL_R_BAD_KEY_UPDATE}, ++ #else ++ {"BAD_KEY_UPDATE", 20, 122}, ++ #endif ++ #ifdef SSL_R_BAD_LEGACY_VERSION ++ {"BAD_LEGACY_VERSION", ERR_LIB_SSL, SSL_R_BAD_LEGACY_VERSION}, ++ #else ++ {"BAD_LEGACY_VERSION", 20, 292}, ++ #endif ++ #ifdef SSL_R_BAD_LENGTH ++ {"BAD_LENGTH", ERR_LIB_SSL, SSL_R_BAD_LENGTH}, ++ #else ++ {"BAD_LENGTH", 20, 271}, ++ #endif ++ #ifdef SSL_R_BAD_PACKET ++ {"BAD_PACKET", ERR_LIB_SSL, SSL_R_BAD_PACKET}, ++ #else ++ {"BAD_PACKET", 20, 240}, ++ #endif ++ #ifdef SSL_R_BAD_PACKET_LENGTH ++ {"BAD_PACKET_LENGTH", ERR_LIB_SSL, SSL_R_BAD_PACKET_LENGTH}, ++ #else ++ {"BAD_PACKET_LENGTH", 20, 115}, ++ #endif ++ #ifdef SSL_R_BAD_PROTOCOL_VERSION_NUMBER ++ {"BAD_PROTOCOL_VERSION_NUMBER", ERR_LIB_SSL, SSL_R_BAD_PROTOCOL_VERSION_NUMBER}, ++ #else ++ {"BAD_PROTOCOL_VERSION_NUMBER", 20, 116}, ++ #endif ++ #ifdef SSL_R_BAD_PSK ++ {"BAD_PSK", ERR_LIB_SSL, SSL_R_BAD_PSK}, ++ #else ++ {"BAD_PSK", 20, 219}, ++ #endif ++ #ifdef SSL_R_BAD_PSK_IDENTITY ++ {"BAD_PSK_IDENTITY", ERR_LIB_SSL, SSL_R_BAD_PSK_IDENTITY}, ++ #else ++ {"BAD_PSK_IDENTITY", 20, 114}, ++ #endif ++ #ifdef SSL_R_BAD_RECORD_TYPE ++ {"BAD_RECORD_TYPE", ERR_LIB_SSL, SSL_R_BAD_RECORD_TYPE}, ++ #else ++ {"BAD_RECORD_TYPE", 20, 443}, ++ #endif ++ #ifdef SSL_R_BAD_RSA_ENCRYPT ++ {"BAD_RSA_ENCRYPT", ERR_LIB_SSL, SSL_R_BAD_RSA_ENCRYPT}, ++ #else ++ {"BAD_RSA_ENCRYPT", 20, 119}, ++ #endif ++ #ifdef SSL_R_BAD_SIGNATURE ++ {"BAD_SIGNATURE", ERR_LIB_SSL, SSL_R_BAD_SIGNATURE}, ++ #else ++ {"BAD_SIGNATURE", 20, 123}, ++ #endif ++ #ifdef SSL_R_BAD_SRP_A_LENGTH ++ {"BAD_SRP_A_LENGTH", ERR_LIB_SSL, SSL_R_BAD_SRP_A_LENGTH}, ++ #else ++ {"BAD_SRP_A_LENGTH", 20, 347}, ++ #endif ++ #ifdef SSL_R_BAD_SRP_PARAMETERS ++ {"BAD_SRP_PARAMETERS", ERR_LIB_SSL, SSL_R_BAD_SRP_PARAMETERS}, ++ #else ++ {"BAD_SRP_PARAMETERS", 20, 371}, ++ #endif ++ #ifdef SSL_R_BAD_SRTP_MKI_VALUE ++ {"BAD_SRTP_MKI_VALUE", ERR_LIB_SSL, SSL_R_BAD_SRTP_MKI_VALUE}, ++ #else ++ {"BAD_SRTP_MKI_VALUE", 20, 352}, ++ #endif ++ #ifdef SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST ++ {"BAD_SRTP_PROTECTION_PROFILE_LIST", ERR_LIB_SSL, SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST}, ++ #else ++ {"BAD_SRTP_PROTECTION_PROFILE_LIST", 20, 353}, ++ #endif ++ #ifdef SSL_R_BAD_SSL_FILETYPE ++ {"BAD_SSL_FILETYPE", ERR_LIB_SSL, SSL_R_BAD_SSL_FILETYPE}, ++ #else ++ {"BAD_SSL_FILETYPE", 20, 124}, ++ #endif ++ #ifdef SSL_R_BAD_VALUE ++ {"BAD_VALUE", ERR_LIB_SSL, SSL_R_BAD_VALUE}, ++ #else ++ {"BAD_VALUE", 20, 384}, ++ #endif ++ #ifdef SSL_R_BAD_WRITE_RETRY ++ {"BAD_WRITE_RETRY", ERR_LIB_SSL, SSL_R_BAD_WRITE_RETRY}, ++ #else ++ {"BAD_WRITE_RETRY", 20, 127}, ++ #endif ++ #ifdef SSL_R_BINDER_DOES_NOT_VERIFY ++ {"BINDER_DOES_NOT_VERIFY", ERR_LIB_SSL, SSL_R_BINDER_DOES_NOT_VERIFY}, ++ #else ++ {"BINDER_DOES_NOT_VERIFY", 20, 253}, ++ #endif ++ #ifdef SSL_R_BIO_NOT_SET ++ {"BIO_NOT_SET", ERR_LIB_SSL, SSL_R_BIO_NOT_SET}, ++ #else ++ {"BIO_NOT_SET", 20, 128}, ++ #endif ++ #ifdef SSL_R_BLOCK_CIPHER_PAD_IS_WRONG ++ {"BLOCK_CIPHER_PAD_IS_WRONG", ERR_LIB_SSL, SSL_R_BLOCK_CIPHER_PAD_IS_WRONG}, ++ #else ++ {"BLOCK_CIPHER_PAD_IS_WRONG", 20, 129}, ++ #endif ++ #ifdef SSL_R_BN_LIB ++ {"BN_LIB", ERR_LIB_SSL, SSL_R_BN_LIB}, ++ #else ++ {"BN_LIB", 20, 130}, ++ #endif ++ #ifdef SSL_R_CALLBACK_FAILED ++ {"CALLBACK_FAILED", ERR_LIB_SSL, SSL_R_CALLBACK_FAILED}, ++ #else ++ {"CALLBACK_FAILED", 20, 234}, ++ #endif ++ #ifdef SSL_R_CANNOT_CHANGE_CIPHER ++ {"CANNOT_CHANGE_CIPHER", ERR_LIB_SSL, SSL_R_CANNOT_CHANGE_CIPHER}, ++ #else ++ {"CANNOT_CHANGE_CIPHER", 20, 109}, ++ #endif ++ #ifdef SSL_R_CANNOT_GET_GROUP_NAME ++ {"CANNOT_GET_GROUP_NAME", ERR_LIB_SSL, SSL_R_CANNOT_GET_GROUP_NAME}, ++ #else ++ {"CANNOT_GET_GROUP_NAME", 20, 299}, ++ #endif ++ #ifdef SSL_R_CA_DN_LENGTH_MISMATCH ++ {"CA_DN_LENGTH_MISMATCH", ERR_LIB_SSL, SSL_R_CA_DN_LENGTH_MISMATCH}, ++ #else ++ {"CA_DN_LENGTH_MISMATCH", 20, 131}, ++ #endif ++ #ifdef SSL_R_CA_KEY_TOO_SMALL ++ {"CA_KEY_TOO_SMALL", ERR_LIB_SSL, SSL_R_CA_KEY_TOO_SMALL}, ++ #else ++ {"CA_KEY_TOO_SMALL", 20, 397}, ++ #endif ++ #ifdef SSL_R_CA_MD_TOO_WEAK ++ {"CA_MD_TOO_WEAK", ERR_LIB_SSL, SSL_R_CA_MD_TOO_WEAK}, ++ #else ++ {"CA_MD_TOO_WEAK", 20, 398}, ++ #endif ++ #ifdef SSL_R_CCS_RECEIVED_EARLY ++ {"CCS_RECEIVED_EARLY", ERR_LIB_SSL, SSL_R_CCS_RECEIVED_EARLY}, ++ #else ++ {"CCS_RECEIVED_EARLY", 20, 133}, ++ #endif ++ #ifdef SSL_R_CERTIFICATE_VERIFY_FAILED ++ {"CERTIFICATE_VERIFY_FAILED", ERR_LIB_SSL, SSL_R_CERTIFICATE_VERIFY_FAILED}, ++ #else ++ {"CERTIFICATE_VERIFY_FAILED", 20, 134}, ++ #endif ++ #ifdef SSL_R_CERT_CB_ERROR ++ {"CERT_CB_ERROR", ERR_LIB_SSL, SSL_R_CERT_CB_ERROR}, ++ #else ++ {"CERT_CB_ERROR", 20, 377}, ++ #endif ++ #ifdef SSL_R_CERT_LENGTH_MISMATCH ++ {"CERT_LENGTH_MISMATCH", ERR_LIB_SSL, SSL_R_CERT_LENGTH_MISMATCH}, ++ #else ++ {"CERT_LENGTH_MISMATCH", 20, 135}, ++ #endif ++ #ifdef SSL_R_CIPHERSUITE_DIGEST_HAS_CHANGED ++ {"CIPHERSUITE_DIGEST_HAS_CHANGED", ERR_LIB_SSL, SSL_R_CIPHERSUITE_DIGEST_HAS_CHANGED}, ++ #else ++ {"CIPHERSUITE_DIGEST_HAS_CHANGED", 20, 218}, ++ #endif ++ #ifdef SSL_R_CIPHER_CODE_WRONG_LENGTH ++ {"CIPHER_CODE_WRONG_LENGTH", ERR_LIB_SSL, SSL_R_CIPHER_CODE_WRONG_LENGTH}, ++ #else ++ {"CIPHER_CODE_WRONG_LENGTH", 20, 137}, ++ #endif ++ #ifdef SSL_R_CLIENTHELLO_TLSEXT ++ {"CLIENTHELLO_TLSEXT", ERR_LIB_SSL, SSL_R_CLIENTHELLO_TLSEXT}, ++ #else ++ {"CLIENTHELLO_TLSEXT", 20, 226}, ++ #endif ++ #ifdef SSL_R_COMPRESSED_LENGTH_TOO_LONG ++ {"COMPRESSED_LENGTH_TOO_LONG", ERR_LIB_SSL, SSL_R_COMPRESSED_LENGTH_TOO_LONG}, ++ #else ++ {"COMPRESSED_LENGTH_TOO_LONG", 20, 140}, ++ #endif ++ #ifdef SSL_R_COMPRESSION_DISABLED ++ {"COMPRESSION_DISABLED", ERR_LIB_SSL, SSL_R_COMPRESSION_DISABLED}, ++ #else ++ {"COMPRESSION_DISABLED", 20, 343}, ++ #endif ++ #ifdef SSL_R_COMPRESSION_FAILURE ++ {"COMPRESSION_FAILURE", ERR_LIB_SSL, SSL_R_COMPRESSION_FAILURE}, ++ #else ++ {"COMPRESSION_FAILURE", 20, 141}, ++ #endif ++ #ifdef SSL_R_COMPRESSION_ID_NOT_WITHIN_PRIVATE_RANGE ++ {"COMPRESSION_ID_NOT_WITHIN_PRIVATE_RANGE", ERR_LIB_SSL, SSL_R_COMPRESSION_ID_NOT_WITHIN_PRIVATE_RANGE}, ++ #else ++ {"COMPRESSION_ID_NOT_WITHIN_PRIVATE_RANGE", 20, 307}, ++ #endif ++ #ifdef SSL_R_COMPRESSION_LIBRARY_ERROR ++ {"COMPRESSION_LIBRARY_ERROR", ERR_LIB_SSL, SSL_R_COMPRESSION_LIBRARY_ERROR}, ++ #else ++ {"COMPRESSION_LIBRARY_ERROR", 20, 142}, ++ #endif ++ #ifdef SSL_R_CONNECTION_TYPE_NOT_SET ++ {"CONNECTION_TYPE_NOT_SET", ERR_LIB_SSL, SSL_R_CONNECTION_TYPE_NOT_SET}, ++ #else ++ {"CONNECTION_TYPE_NOT_SET", 20, 144}, ++ #endif ++ #ifdef SSL_R_CONN_USE_ONLY ++ {"CONN_USE_ONLY", ERR_LIB_SSL, SSL_R_CONN_USE_ONLY}, ++ #else ++ {"CONN_USE_ONLY", 20, 356}, ++ #endif ++ #ifdef SSL_R_CONTEXT_NOT_DANE_ENABLED ++ {"CONTEXT_NOT_DANE_ENABLED", ERR_LIB_SSL, SSL_R_CONTEXT_NOT_DANE_ENABLED}, ++ #else ++ {"CONTEXT_NOT_DANE_ENABLED", 20, 167}, ++ #endif ++ #ifdef SSL_R_COOKIE_GEN_CALLBACK_FAILURE ++ {"COOKIE_GEN_CALLBACK_FAILURE", ERR_LIB_SSL, SSL_R_COOKIE_GEN_CALLBACK_FAILURE}, ++ #else ++ {"COOKIE_GEN_CALLBACK_FAILURE", 20, 400}, ++ #endif ++ #ifdef SSL_R_COOKIE_MISMATCH ++ {"COOKIE_MISMATCH", ERR_LIB_SSL, SSL_R_COOKIE_MISMATCH}, ++ #else ++ {"COOKIE_MISMATCH", 20, 308}, ++ #endif ++ #ifdef SSL_R_COPY_PARAMETERS_FAILED ++ {"COPY_PARAMETERS_FAILED", ERR_LIB_SSL, SSL_R_COPY_PARAMETERS_FAILED}, ++ #else ++ {"COPY_PARAMETERS_FAILED", 20, 296}, ++ #endif ++ #ifdef SSL_R_CUSTOM_EXT_HANDLER_ALREADY_INSTALLED ++ {"CUSTOM_EXT_HANDLER_ALREADY_INSTALLED", ERR_LIB_SSL, SSL_R_CUSTOM_EXT_HANDLER_ALREADY_INSTALLED}, ++ #else ++ {"CUSTOM_EXT_HANDLER_ALREADY_INSTALLED", 20, 206}, ++ #endif ++ #ifdef SSL_R_DANE_ALREADY_ENABLED ++ {"DANE_ALREADY_ENABLED", ERR_LIB_SSL, SSL_R_DANE_ALREADY_ENABLED}, ++ #else ++ {"DANE_ALREADY_ENABLED", 20, 172}, ++ #endif ++ #ifdef SSL_R_DANE_CANNOT_OVERRIDE_MTYPE_FULL ++ {"DANE_CANNOT_OVERRIDE_MTYPE_FULL", ERR_LIB_SSL, SSL_R_DANE_CANNOT_OVERRIDE_MTYPE_FULL}, ++ #else ++ {"DANE_CANNOT_OVERRIDE_MTYPE_FULL", 20, 173}, ++ #endif ++ #ifdef SSL_R_DANE_NOT_ENABLED ++ {"DANE_NOT_ENABLED", ERR_LIB_SSL, SSL_R_DANE_NOT_ENABLED}, ++ #else ++ {"DANE_NOT_ENABLED", 20, 175}, ++ #endif ++ #ifdef SSL_R_DANE_TLSA_BAD_CERTIFICATE ++ {"DANE_TLSA_BAD_CERTIFICATE", ERR_LIB_SSL, SSL_R_DANE_TLSA_BAD_CERTIFICATE}, ++ #else ++ {"DANE_TLSA_BAD_CERTIFICATE", 20, 180}, ++ #endif ++ #ifdef SSL_R_DANE_TLSA_BAD_CERTIFICATE_USAGE ++ {"DANE_TLSA_BAD_CERTIFICATE_USAGE", ERR_LIB_SSL, SSL_R_DANE_TLSA_BAD_CERTIFICATE_USAGE}, ++ #else ++ {"DANE_TLSA_BAD_CERTIFICATE_USAGE", 20, 184}, ++ #endif ++ #ifdef SSL_R_DANE_TLSA_BAD_DATA_LENGTH ++ {"DANE_TLSA_BAD_DATA_LENGTH", ERR_LIB_SSL, SSL_R_DANE_TLSA_BAD_DATA_LENGTH}, ++ #else ++ {"DANE_TLSA_BAD_DATA_LENGTH", 20, 189}, ++ #endif ++ #ifdef SSL_R_DANE_TLSA_BAD_DIGEST_LENGTH ++ {"DANE_TLSA_BAD_DIGEST_LENGTH", ERR_LIB_SSL, SSL_R_DANE_TLSA_BAD_DIGEST_LENGTH}, ++ #else ++ {"DANE_TLSA_BAD_DIGEST_LENGTH", 20, 192}, ++ #endif ++ #ifdef SSL_R_DANE_TLSA_BAD_MATCHING_TYPE ++ {"DANE_TLSA_BAD_MATCHING_TYPE", ERR_LIB_SSL, SSL_R_DANE_TLSA_BAD_MATCHING_TYPE}, ++ #else ++ {"DANE_TLSA_BAD_MATCHING_TYPE", 20, 200}, ++ #endif ++ #ifdef SSL_R_DANE_TLSA_BAD_PUBLIC_KEY ++ {"DANE_TLSA_BAD_PUBLIC_KEY", ERR_LIB_SSL, SSL_R_DANE_TLSA_BAD_PUBLIC_KEY}, ++ #else ++ {"DANE_TLSA_BAD_PUBLIC_KEY", 20, 201}, ++ #endif ++ #ifdef SSL_R_DANE_TLSA_BAD_SELECTOR ++ {"DANE_TLSA_BAD_SELECTOR", ERR_LIB_SSL, SSL_R_DANE_TLSA_BAD_SELECTOR}, ++ #else ++ {"DANE_TLSA_BAD_SELECTOR", 20, 202}, ++ #endif ++ #ifdef SSL_R_DANE_TLSA_NULL_DATA ++ {"DANE_TLSA_NULL_DATA", ERR_LIB_SSL, SSL_R_DANE_TLSA_NULL_DATA}, ++ #else ++ {"DANE_TLSA_NULL_DATA", 20, 203}, ++ #endif ++ #ifdef SSL_R_DATA_BETWEEN_CCS_AND_FINISHED ++ {"DATA_BETWEEN_CCS_AND_FINISHED", ERR_LIB_SSL, SSL_R_DATA_BETWEEN_CCS_AND_FINISHED}, ++ #else ++ {"DATA_BETWEEN_CCS_AND_FINISHED", 20, 145}, ++ #endif ++ #ifdef SSL_R_DATA_LENGTH_TOO_LONG ++ {"DATA_LENGTH_TOO_LONG", ERR_LIB_SSL, SSL_R_DATA_LENGTH_TOO_LONG}, ++ #else ++ {"DATA_LENGTH_TOO_LONG", 20, 146}, ++ #endif ++ #ifdef SSL_R_DECRYPTION_FAILED ++ {"DECRYPTION_FAILED", ERR_LIB_SSL, SSL_R_DECRYPTION_FAILED}, ++ #else ++ {"DECRYPTION_FAILED", 20, 147}, ++ #endif ++ #ifdef SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC ++ {"DECRYPTION_FAILED_OR_BAD_RECORD_MAC", ERR_LIB_SSL, SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC}, ++ #else ++ {"DECRYPTION_FAILED_OR_BAD_RECORD_MAC", 20, 281}, ++ #endif ++ #ifdef SSL_R_DH_KEY_TOO_SMALL ++ {"DH_KEY_TOO_SMALL", ERR_LIB_SSL, SSL_R_DH_KEY_TOO_SMALL}, ++ #else ++ {"DH_KEY_TOO_SMALL", 20, 394}, ++ #endif ++ #ifdef SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG ++ {"DH_PUBLIC_VALUE_LENGTH_IS_WRONG", ERR_LIB_SSL, SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG}, ++ #else ++ {"DH_PUBLIC_VALUE_LENGTH_IS_WRONG", 20, 148}, ++ #endif ++ #ifdef SSL_R_DIGEST_CHECK_FAILED ++ {"DIGEST_CHECK_FAILED", ERR_LIB_SSL, SSL_R_DIGEST_CHECK_FAILED}, ++ #else ++ {"DIGEST_CHECK_FAILED", 20, 149}, ++ #endif ++ #ifdef SSL_R_DTLS_MESSAGE_TOO_BIG ++ {"DTLS_MESSAGE_TOO_BIG", ERR_LIB_SSL, SSL_R_DTLS_MESSAGE_TOO_BIG}, ++ #else ++ {"DTLS_MESSAGE_TOO_BIG", 20, 334}, ++ #endif ++ #ifdef SSL_R_DUPLICATE_COMPRESSION_ID ++ {"DUPLICATE_COMPRESSION_ID", ERR_LIB_SSL, SSL_R_DUPLICATE_COMPRESSION_ID}, ++ #else ++ {"DUPLICATE_COMPRESSION_ID", 20, 309}, ++ #endif ++ #ifdef SSL_R_ECC_CERT_NOT_FOR_SIGNING ++ {"ECC_CERT_NOT_FOR_SIGNING", ERR_LIB_SSL, SSL_R_ECC_CERT_NOT_FOR_SIGNING}, ++ #else ++ {"ECC_CERT_NOT_FOR_SIGNING", 20, 318}, ++ #endif ++ #ifdef SSL_R_ECDH_REQUIRED_FOR_SUITEB_MODE ++ {"ECDH_REQUIRED_FOR_SUITEB_MODE", ERR_LIB_SSL, SSL_R_ECDH_REQUIRED_FOR_SUITEB_MODE}, ++ #else ++ {"ECDH_REQUIRED_FOR_SUITEB_MODE", 20, 374}, ++ #endif ++ #ifdef SSL_R_EE_KEY_TOO_SMALL ++ {"EE_KEY_TOO_SMALL", ERR_LIB_SSL, SSL_R_EE_KEY_TOO_SMALL}, ++ #else ++ {"EE_KEY_TOO_SMALL", 20, 399}, ++ #endif ++ #ifdef SSL_R_EMPTY_RAW_PUBLIC_KEY ++ {"EMPTY_RAW_PUBLIC_KEY", ERR_LIB_SSL, SSL_R_EMPTY_RAW_PUBLIC_KEY}, ++ #else ++ {"EMPTY_RAW_PUBLIC_KEY", 20, 349}, ++ #endif ++ #ifdef SSL_R_EMPTY_SRTP_PROTECTION_PROFILE_LIST ++ {"EMPTY_SRTP_PROTECTION_PROFILE_LIST", ERR_LIB_SSL, SSL_R_EMPTY_SRTP_PROTECTION_PROFILE_LIST}, ++ #else ++ {"EMPTY_SRTP_PROTECTION_PROFILE_LIST", 20, 354}, ++ #endif ++ #ifdef SSL_R_ENCRYPTED_LENGTH_TOO_LONG ++ {"ENCRYPTED_LENGTH_TOO_LONG", ERR_LIB_SSL, SSL_R_ENCRYPTED_LENGTH_TOO_LONG}, ++ #else ++ {"ENCRYPTED_LENGTH_TOO_LONG", 20, 150}, ++ #endif ++ #ifdef SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST ++ {"ERROR_IN_RECEIVED_CIPHER_LIST", ERR_LIB_SSL, SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST}, ++ #else ++ {"ERROR_IN_RECEIVED_CIPHER_LIST", 20, 151}, ++ #endif ++ #ifdef SSL_R_ERROR_IN_SYSTEM_DEFAULT_CONFIG ++ {"ERROR_IN_SYSTEM_DEFAULT_CONFIG", ERR_LIB_SSL, SSL_R_ERROR_IN_SYSTEM_DEFAULT_CONFIG}, ++ #else ++ {"ERROR_IN_SYSTEM_DEFAULT_CONFIG", 20, 419}, ++ #endif ++ #ifdef SSL_R_ERROR_SETTING_TLSA_BASE_DOMAIN ++ {"ERROR_SETTING_TLSA_BASE_DOMAIN", ERR_LIB_SSL, SSL_R_ERROR_SETTING_TLSA_BASE_DOMAIN}, ++ #else ++ {"ERROR_SETTING_TLSA_BASE_DOMAIN", 20, 204}, ++ #endif ++ #ifdef SSL_R_EXCEEDS_MAX_FRAGMENT_SIZE ++ {"EXCEEDS_MAX_FRAGMENT_SIZE", ERR_LIB_SSL, SSL_R_EXCEEDS_MAX_FRAGMENT_SIZE}, ++ #else ++ {"EXCEEDS_MAX_FRAGMENT_SIZE", 20, 194}, ++ #endif ++ #ifdef SSL_R_EXCESSIVE_MESSAGE_SIZE ++ {"EXCESSIVE_MESSAGE_SIZE", ERR_LIB_SSL, SSL_R_EXCESSIVE_MESSAGE_SIZE}, ++ #else ++ {"EXCESSIVE_MESSAGE_SIZE", 20, 152}, ++ #endif ++ #ifdef SSL_R_EXTENSION_NOT_RECEIVED ++ {"EXTENSION_NOT_RECEIVED", ERR_LIB_SSL, SSL_R_EXTENSION_NOT_RECEIVED}, ++ #else ++ {"EXTENSION_NOT_RECEIVED", 20, 279}, ++ #endif ++ #ifdef SSL_R_EXTRA_DATA_IN_MESSAGE ++ {"EXTRA_DATA_IN_MESSAGE", ERR_LIB_SSL, SSL_R_EXTRA_DATA_IN_MESSAGE}, ++ #else ++ {"EXTRA_DATA_IN_MESSAGE", 20, 153}, ++ #endif ++ #ifdef SSL_R_EXT_LENGTH_MISMATCH ++ {"EXT_LENGTH_MISMATCH", ERR_LIB_SSL, SSL_R_EXT_LENGTH_MISMATCH}, ++ #else ++ {"EXT_LENGTH_MISMATCH", 20, 163}, ++ #endif ++ #ifdef SSL_R_FAILED_TO_GET_PARAMETER ++ {"FAILED_TO_GET_PARAMETER", ERR_LIB_SSL, SSL_R_FAILED_TO_GET_PARAMETER}, ++ #else ++ {"FAILED_TO_GET_PARAMETER", 20, 316}, ++ #endif ++ #ifdef SSL_R_FAILED_TO_INIT_ASYNC ++ {"FAILED_TO_INIT_ASYNC", ERR_LIB_SSL, SSL_R_FAILED_TO_INIT_ASYNC}, ++ #else ++ {"FAILED_TO_INIT_ASYNC", 20, 405}, ++ #endif ++ #ifdef SSL_R_FEATURE_NEGOTIATION_NOT_COMPLETE ++ {"FEATURE_NEGOTIATION_NOT_COMPLETE", ERR_LIB_SSL, SSL_R_FEATURE_NEGOTIATION_NOT_COMPLETE}, ++ #else ++ {"FEATURE_NEGOTIATION_NOT_COMPLETE", 20, 417}, ++ #endif ++ #ifdef SSL_R_FEATURE_NOT_RENEGOTIABLE ++ {"FEATURE_NOT_RENEGOTIABLE", ERR_LIB_SSL, SSL_R_FEATURE_NOT_RENEGOTIABLE}, ++ #else ++ {"FEATURE_NOT_RENEGOTIABLE", 20, 413}, ++ #endif ++ #ifdef SSL_R_FRAGMENTED_CLIENT_HELLO ++ {"FRAGMENTED_CLIENT_HELLO", ERR_LIB_SSL, SSL_R_FRAGMENTED_CLIENT_HELLO}, ++ #else ++ {"FRAGMENTED_CLIENT_HELLO", 20, 401}, ++ #endif ++ #ifdef SSL_R_GOT_A_FIN_BEFORE_A_CCS ++ {"GOT_A_FIN_BEFORE_A_CCS", ERR_LIB_SSL, SSL_R_GOT_A_FIN_BEFORE_A_CCS}, ++ #else ++ {"GOT_A_FIN_BEFORE_A_CCS", 20, 154}, ++ #endif ++ #ifdef SSL_R_HTTPS_PROXY_REQUEST ++ {"HTTPS_PROXY_REQUEST", ERR_LIB_SSL, SSL_R_HTTPS_PROXY_REQUEST}, ++ #else ++ {"HTTPS_PROXY_REQUEST", 20, 155}, ++ #endif ++ #ifdef SSL_R_HTTP_REQUEST ++ {"HTTP_REQUEST", ERR_LIB_SSL, SSL_R_HTTP_REQUEST}, ++ #else ++ {"HTTP_REQUEST", 20, 156}, ++ #endif ++ #ifdef SSL_R_ILLEGAL_POINT_COMPRESSION ++ {"ILLEGAL_POINT_COMPRESSION", ERR_LIB_SSL, SSL_R_ILLEGAL_POINT_COMPRESSION}, ++ #else ++ {"ILLEGAL_POINT_COMPRESSION", 20, 162}, ++ #endif ++ #ifdef SSL_R_ILLEGAL_SUITEB_DIGEST ++ {"ILLEGAL_SUITEB_DIGEST", ERR_LIB_SSL, SSL_R_ILLEGAL_SUITEB_DIGEST}, ++ #else ++ {"ILLEGAL_SUITEB_DIGEST", 20, 380}, ++ #endif ++ #ifdef SSL_R_INAPPROPRIATE_FALLBACK ++ {"INAPPROPRIATE_FALLBACK", ERR_LIB_SSL, SSL_R_INAPPROPRIATE_FALLBACK}, ++ #else ++ {"INAPPROPRIATE_FALLBACK", 20, 373}, ++ #endif ++ #ifdef SSL_R_INCONSISTENT_COMPRESSION ++ {"INCONSISTENT_COMPRESSION", ERR_LIB_SSL, SSL_R_INCONSISTENT_COMPRESSION}, ++ #else ++ {"INCONSISTENT_COMPRESSION", 20, 340}, ++ #endif ++ #ifdef SSL_R_INCONSISTENT_EARLY_DATA_ALPN ++ {"INCONSISTENT_EARLY_DATA_ALPN", ERR_LIB_SSL, SSL_R_INCONSISTENT_EARLY_DATA_ALPN}, ++ #else ++ {"INCONSISTENT_EARLY_DATA_ALPN", 20, 222}, ++ #endif ++ #ifdef SSL_R_INCONSISTENT_EARLY_DATA_SNI ++ {"INCONSISTENT_EARLY_DATA_SNI", ERR_LIB_SSL, SSL_R_INCONSISTENT_EARLY_DATA_SNI}, ++ #else ++ {"INCONSISTENT_EARLY_DATA_SNI", 20, 231}, ++ #endif ++ #ifdef SSL_R_INCONSISTENT_EXTMS ++ {"INCONSISTENT_EXTMS", ERR_LIB_SSL, SSL_R_INCONSISTENT_EXTMS}, ++ #else ++ {"INCONSISTENT_EXTMS", 20, 104}, ++ #endif ++ #ifdef SSL_R_INSUFFICIENT_SECURITY ++ {"INSUFFICIENT_SECURITY", ERR_LIB_SSL, SSL_R_INSUFFICIENT_SECURITY}, ++ #else ++ {"INSUFFICIENT_SECURITY", 20, 241}, ++ #endif ++ #ifdef SSL_R_INVALID_ALERT ++ {"INVALID_ALERT", ERR_LIB_SSL, SSL_R_INVALID_ALERT}, ++ #else ++ {"INVALID_ALERT", 20, 205}, ++ #endif ++ #ifdef SSL_R_INVALID_CCS_MESSAGE ++ {"INVALID_CCS_MESSAGE", ERR_LIB_SSL, SSL_R_INVALID_CCS_MESSAGE}, ++ #else ++ {"INVALID_CCS_MESSAGE", 20, 260}, ++ #endif ++ #ifdef SSL_R_INVALID_CERTIFICATE_OR_ALG ++ {"INVALID_CERTIFICATE_OR_ALG", ERR_LIB_SSL, SSL_R_INVALID_CERTIFICATE_OR_ALG}, ++ #else ++ {"INVALID_CERTIFICATE_OR_ALG", 20, 238}, ++ #endif ++ #ifdef SSL_R_INVALID_COMMAND ++ {"INVALID_COMMAND", ERR_LIB_SSL, SSL_R_INVALID_COMMAND}, ++ #else ++ {"INVALID_COMMAND", 20, 280}, ++ #endif ++ #ifdef SSL_R_INVALID_COMPRESSION_ALGORITHM ++ {"INVALID_COMPRESSION_ALGORITHM", ERR_LIB_SSL, SSL_R_INVALID_COMPRESSION_ALGORITHM}, ++ #else ++ {"INVALID_COMPRESSION_ALGORITHM", 20, 341}, ++ #endif ++ #ifdef SSL_R_INVALID_CONFIG ++ {"INVALID_CONFIG", ERR_LIB_SSL, SSL_R_INVALID_CONFIG}, ++ #else ++ {"INVALID_CONFIG", 20, 283}, ++ #endif ++ #ifdef SSL_R_INVALID_CONFIGURATION_NAME ++ {"INVALID_CONFIGURATION_NAME", ERR_LIB_SSL, SSL_R_INVALID_CONFIGURATION_NAME}, ++ #else ++ {"INVALID_CONFIGURATION_NAME", 20, 113}, ++ #endif ++ #ifdef SSL_R_INVALID_CONTEXT ++ {"INVALID_CONTEXT", ERR_LIB_SSL, SSL_R_INVALID_CONTEXT}, ++ #else ++ {"INVALID_CONTEXT", 20, 282}, ++ #endif ++ #ifdef SSL_R_INVALID_CT_VALIDATION_TYPE ++ {"INVALID_CT_VALIDATION_TYPE", ERR_LIB_SSL, SSL_R_INVALID_CT_VALIDATION_TYPE}, ++ #else ++ {"INVALID_CT_VALIDATION_TYPE", 20, 212}, ++ #endif ++ #ifdef SSL_R_INVALID_KEY_UPDATE_TYPE ++ {"INVALID_KEY_UPDATE_TYPE", ERR_LIB_SSL, SSL_R_INVALID_KEY_UPDATE_TYPE}, ++ #else ++ {"INVALID_KEY_UPDATE_TYPE", 20, 120}, ++ #endif ++ #ifdef SSL_R_INVALID_MAX_EARLY_DATA ++ {"INVALID_MAX_EARLY_DATA", ERR_LIB_SSL, SSL_R_INVALID_MAX_EARLY_DATA}, ++ #else ++ {"INVALID_MAX_EARLY_DATA", 20, 174}, ++ #endif ++ #ifdef SSL_R_INVALID_NULL_CMD_NAME ++ {"INVALID_NULL_CMD_NAME", ERR_LIB_SSL, SSL_R_INVALID_NULL_CMD_NAME}, ++ #else ++ {"INVALID_NULL_CMD_NAME", 20, 385}, ++ #endif ++ #ifdef SSL_R_INVALID_RAW_PUBLIC_KEY ++ {"INVALID_RAW_PUBLIC_KEY", ERR_LIB_SSL, SSL_R_INVALID_RAW_PUBLIC_KEY}, ++ #else ++ {"INVALID_RAW_PUBLIC_KEY", 20, 350}, ++ #endif ++ #ifdef SSL_R_INVALID_RECORD ++ {"INVALID_RECORD", ERR_LIB_SSL, SSL_R_INVALID_RECORD}, ++ #else ++ {"INVALID_RECORD", 20, 317}, ++ #endif ++ #ifdef SSL_R_INVALID_SEQUENCE_NUMBER ++ {"INVALID_SEQUENCE_NUMBER", ERR_LIB_SSL, SSL_R_INVALID_SEQUENCE_NUMBER}, ++ #else ++ {"INVALID_SEQUENCE_NUMBER", 20, 402}, ++ #endif ++ #ifdef SSL_R_INVALID_SERVERINFO_DATA ++ {"INVALID_SERVERINFO_DATA", ERR_LIB_SSL, SSL_R_INVALID_SERVERINFO_DATA}, ++ #else ++ {"INVALID_SERVERINFO_DATA", 20, 388}, ++ #endif ++ #ifdef SSL_R_INVALID_SESSION_ID ++ {"INVALID_SESSION_ID", ERR_LIB_SSL, SSL_R_INVALID_SESSION_ID}, ++ #else ++ {"INVALID_SESSION_ID", 20, 999}, ++ #endif ++ #ifdef SSL_R_INVALID_SRP_USERNAME ++ {"INVALID_SRP_USERNAME", ERR_LIB_SSL, SSL_R_INVALID_SRP_USERNAME}, ++ #else ++ {"INVALID_SRP_USERNAME", 20, 357}, ++ #endif ++ #ifdef SSL_R_INVALID_STATUS_RESPONSE ++ {"INVALID_STATUS_RESPONSE", ERR_LIB_SSL, SSL_R_INVALID_STATUS_RESPONSE}, ++ #else ++ {"INVALID_STATUS_RESPONSE", 20, 328}, ++ #endif ++ #ifdef SSL_R_INVALID_TICKET_KEYS_LENGTH ++ {"INVALID_TICKET_KEYS_LENGTH", ERR_LIB_SSL, SSL_R_INVALID_TICKET_KEYS_LENGTH}, ++ #else ++ {"INVALID_TICKET_KEYS_LENGTH", 20, 325}, ++ #endif ++ #ifdef SSL_R_LEGACY_SIGALG_DISALLOWED_OR_UNSUPPORTED ++ {"LEGACY_SIGALG_DISALLOWED_OR_UNSUPPORTED", ERR_LIB_SSL, SSL_R_LEGACY_SIGALG_DISALLOWED_OR_UNSUPPORTED}, ++ #else ++ {"LEGACY_SIGALG_DISALLOWED_OR_UNSUPPORTED", 20, 333}, ++ #endif ++ #ifdef SSL_R_LENGTH_MISMATCH ++ {"LENGTH_MISMATCH", ERR_LIB_SSL, SSL_R_LENGTH_MISMATCH}, ++ #else ++ {"LENGTH_MISMATCH", 20, 159}, ++ #endif ++ #ifdef SSL_R_LENGTH_TOO_LONG ++ {"LENGTH_TOO_LONG", ERR_LIB_SSL, SSL_R_LENGTH_TOO_LONG}, ++ #else ++ {"LENGTH_TOO_LONG", 20, 404}, ++ #endif ++ #ifdef SSL_R_LENGTH_TOO_SHORT ++ {"LENGTH_TOO_SHORT", ERR_LIB_SSL, SSL_R_LENGTH_TOO_SHORT}, ++ #else ++ {"LENGTH_TOO_SHORT", 20, 160}, ++ #endif ++ #ifdef SSL_R_LIBRARY_BUG ++ {"LIBRARY_BUG", ERR_LIB_SSL, SSL_R_LIBRARY_BUG}, ++ #else ++ {"LIBRARY_BUG", 20, 274}, ++ #endif ++ #ifdef SSL_R_LIBRARY_HAS_NO_CIPHERS ++ {"LIBRARY_HAS_NO_CIPHERS", ERR_LIB_SSL, SSL_R_LIBRARY_HAS_NO_CIPHERS}, ++ #else ++ {"LIBRARY_HAS_NO_CIPHERS", 20, 161}, ++ #endif ++ #ifdef SSL_R_MAXIMUM_ENCRYPTED_PKTS_REACHED ++ {"MAXIMUM_ENCRYPTED_PKTS_REACHED", ERR_LIB_SSL, SSL_R_MAXIMUM_ENCRYPTED_PKTS_REACHED}, ++ #else ++ {"MAXIMUM_ENCRYPTED_PKTS_REACHED", 20, 395}, ++ #endif ++ #ifdef SSL_R_MISSING_DSA_SIGNING_CERT ++ {"MISSING_DSA_SIGNING_CERT", ERR_LIB_SSL, SSL_R_MISSING_DSA_SIGNING_CERT}, ++ #else ++ {"MISSING_DSA_SIGNING_CERT", 20, 165}, ++ #endif ++ #ifdef SSL_R_MISSING_ECDSA_SIGNING_CERT ++ {"MISSING_ECDSA_SIGNING_CERT", ERR_LIB_SSL, SSL_R_MISSING_ECDSA_SIGNING_CERT}, ++ #else ++ {"MISSING_ECDSA_SIGNING_CERT", 20, 381}, ++ #endif ++ #ifdef SSL_R_MISSING_FATAL ++ {"MISSING_FATAL", ERR_LIB_SSL, SSL_R_MISSING_FATAL}, ++ #else ++ {"MISSING_FATAL", 20, 256}, ++ #endif ++ #ifdef SSL_R_MISSING_PARAMETERS ++ {"MISSING_PARAMETERS", ERR_LIB_SSL, SSL_R_MISSING_PARAMETERS}, ++ #else ++ {"MISSING_PARAMETERS", 20, 290}, ++ #endif ++ #ifdef SSL_R_MISSING_PSK_KEX_MODES_EXTENSION ++ {"MISSING_PSK_KEX_MODES_EXTENSION", ERR_LIB_SSL, SSL_R_MISSING_PSK_KEX_MODES_EXTENSION}, ++ #else ++ {"MISSING_PSK_KEX_MODES_EXTENSION", 20, 310}, ++ #endif ++ #ifdef SSL_R_MISSING_RSA_CERTIFICATE ++ {"MISSING_RSA_CERTIFICATE", ERR_LIB_SSL, SSL_R_MISSING_RSA_CERTIFICATE}, ++ #else ++ {"MISSING_RSA_CERTIFICATE", 20, 168}, ++ #endif ++ #ifdef SSL_R_MISSING_RSA_ENCRYPTING_CERT ++ {"MISSING_RSA_ENCRYPTING_CERT", ERR_LIB_SSL, SSL_R_MISSING_RSA_ENCRYPTING_CERT}, ++ #else ++ {"MISSING_RSA_ENCRYPTING_CERT", 20, 169}, ++ #endif ++ #ifdef SSL_R_MISSING_RSA_SIGNING_CERT ++ {"MISSING_RSA_SIGNING_CERT", ERR_LIB_SSL, SSL_R_MISSING_RSA_SIGNING_CERT}, ++ #else ++ {"MISSING_RSA_SIGNING_CERT", 20, 170}, ++ #endif ++ #ifdef SSL_R_MISSING_SIGALGS_EXTENSION ++ {"MISSING_SIGALGS_EXTENSION", ERR_LIB_SSL, SSL_R_MISSING_SIGALGS_EXTENSION}, ++ #else ++ {"MISSING_SIGALGS_EXTENSION", 20, 112}, ++ #endif ++ #ifdef SSL_R_MISSING_SIGNING_CERT ++ {"MISSING_SIGNING_CERT", ERR_LIB_SSL, SSL_R_MISSING_SIGNING_CERT}, ++ #else ++ {"MISSING_SIGNING_CERT", 20, 221}, ++ #endif ++ #ifdef SSL_R_MISSING_SRP_PARAM ++ {"MISSING_SRP_PARAM", ERR_LIB_SSL, SSL_R_MISSING_SRP_PARAM}, ++ #else ++ {"MISSING_SRP_PARAM", 20, 358}, ++ #endif ++ #ifdef SSL_R_MISSING_SUPPORTED_GROUPS_EXTENSION ++ {"MISSING_SUPPORTED_GROUPS_EXTENSION", ERR_LIB_SSL, SSL_R_MISSING_SUPPORTED_GROUPS_EXTENSION}, ++ #else ++ {"MISSING_SUPPORTED_GROUPS_EXTENSION", 20, 209}, ++ #endif ++ #ifdef SSL_R_MISSING_SUPPORTED_VERSIONS_EXTENSION ++ {"MISSING_SUPPORTED_VERSIONS_EXTENSION", ERR_LIB_SSL, SSL_R_MISSING_SUPPORTED_VERSIONS_EXTENSION}, ++ #else ++ {"MISSING_SUPPORTED_VERSIONS_EXTENSION", 20, 420}, ++ #endif ++ #ifdef SSL_R_MISSING_TMP_DH_KEY ++ {"MISSING_TMP_DH_KEY", ERR_LIB_SSL, SSL_R_MISSING_TMP_DH_KEY}, ++ #else ++ {"MISSING_TMP_DH_KEY", 20, 171}, ++ #endif ++ #ifdef SSL_R_MISSING_TMP_ECDH_KEY ++ {"MISSING_TMP_ECDH_KEY", ERR_LIB_SSL, SSL_R_MISSING_TMP_ECDH_KEY}, ++ #else ++ {"MISSING_TMP_ECDH_KEY", 20, 311}, ++ #endif ++ #ifdef SSL_R_MIXED_HANDSHAKE_AND_NON_HANDSHAKE_DATA ++ {"MIXED_HANDSHAKE_AND_NON_HANDSHAKE_DATA", ERR_LIB_SSL, SSL_R_MIXED_HANDSHAKE_AND_NON_HANDSHAKE_DATA}, ++ #else ++ {"MIXED_HANDSHAKE_AND_NON_HANDSHAKE_DATA", 20, 293}, ++ #endif ++ #ifdef SSL_R_NOT_ON_RECORD_BOUNDARY ++ {"NOT_ON_RECORD_BOUNDARY", ERR_LIB_SSL, SSL_R_NOT_ON_RECORD_BOUNDARY}, ++ #else ++ {"NOT_ON_RECORD_BOUNDARY", 20, 182}, ++ #endif ++ #ifdef SSL_R_NOT_REPLACING_CERTIFICATE ++ {"NOT_REPLACING_CERTIFICATE", ERR_LIB_SSL, SSL_R_NOT_REPLACING_CERTIFICATE}, ++ #else ++ {"NOT_REPLACING_CERTIFICATE", 20, 289}, ++ #endif ++ #ifdef SSL_R_NOT_SERVER ++ {"NOT_SERVER", ERR_LIB_SSL, SSL_R_NOT_SERVER}, ++ #else ++ {"NOT_SERVER", 20, 284}, ++ #endif ++ #ifdef SSL_R_NO_APPLICATION_PROTOCOL ++ {"NO_APPLICATION_PROTOCOL", ERR_LIB_SSL, SSL_R_NO_APPLICATION_PROTOCOL}, ++ #else ++ {"NO_APPLICATION_PROTOCOL", 20, 235}, ++ #endif ++ #ifdef SSL_R_NO_CERTIFICATES_RETURNED ++ {"NO_CERTIFICATES_RETURNED", ERR_LIB_SSL, SSL_R_NO_CERTIFICATES_RETURNED}, ++ #else ++ {"NO_CERTIFICATES_RETURNED", 20, 176}, ++ #endif ++ #ifdef SSL_R_NO_CERTIFICATE_ASSIGNED ++ {"NO_CERTIFICATE_ASSIGNED", ERR_LIB_SSL, SSL_R_NO_CERTIFICATE_ASSIGNED}, ++ #else ++ {"NO_CERTIFICATE_ASSIGNED", 20, 177}, ++ #endif ++ #ifdef SSL_R_NO_CERTIFICATE_SET ++ {"NO_CERTIFICATE_SET", ERR_LIB_SSL, SSL_R_NO_CERTIFICATE_SET}, ++ #else ++ {"NO_CERTIFICATE_SET", 20, 179}, ++ #endif ++ #ifdef SSL_R_NO_CHANGE_FOLLOWING_HRR ++ {"NO_CHANGE_FOLLOWING_HRR", ERR_LIB_SSL, SSL_R_NO_CHANGE_FOLLOWING_HRR}, ++ #else ++ {"NO_CHANGE_FOLLOWING_HRR", 20, 214}, ++ #endif ++ #ifdef SSL_R_NO_CIPHERS_AVAILABLE ++ {"NO_CIPHERS_AVAILABLE", ERR_LIB_SSL, SSL_R_NO_CIPHERS_AVAILABLE}, ++ #else ++ {"NO_CIPHERS_AVAILABLE", 20, 181}, ++ #endif ++ #ifdef SSL_R_NO_CIPHERS_SPECIFIED ++ {"NO_CIPHERS_SPECIFIED", ERR_LIB_SSL, SSL_R_NO_CIPHERS_SPECIFIED}, ++ #else ++ {"NO_CIPHERS_SPECIFIED", 20, 183}, ++ #endif ++ #ifdef SSL_R_NO_CIPHER_MATCH ++ {"NO_CIPHER_MATCH", ERR_LIB_SSL, SSL_R_NO_CIPHER_MATCH}, ++ #else ++ {"NO_CIPHER_MATCH", 20, 185}, ++ #endif ++ #ifdef SSL_R_NO_CLIENT_CERT_METHOD ++ {"NO_CLIENT_CERT_METHOD", ERR_LIB_SSL, SSL_R_NO_CLIENT_CERT_METHOD}, ++ #else ++ {"NO_CLIENT_CERT_METHOD", 20, 331}, ++ #endif ++ #ifdef SSL_R_NO_COMPRESSION_SPECIFIED ++ {"NO_COMPRESSION_SPECIFIED", ERR_LIB_SSL, SSL_R_NO_COMPRESSION_SPECIFIED}, ++ #else ++ {"NO_COMPRESSION_SPECIFIED", 20, 187}, ++ #endif ++ #ifdef SSL_R_NO_COOKIE_CALLBACK_SET ++ {"NO_COOKIE_CALLBACK_SET", ERR_LIB_SSL, SSL_R_NO_COOKIE_CALLBACK_SET}, ++ #else ++ {"NO_COOKIE_CALLBACK_SET", 20, 287}, ++ #endif ++ #ifdef SSL_R_NO_GOST_CERTIFICATE_SENT_BY_PEER ++ {"NO_GOST_CERTIFICATE_SENT_BY_PEER", ERR_LIB_SSL, SSL_R_NO_GOST_CERTIFICATE_SENT_BY_PEER}, ++ #else ++ {"NO_GOST_CERTIFICATE_SENT_BY_PEER", 20, 330}, ++ #endif ++ #ifdef SSL_R_NO_METHOD_SPECIFIED ++ {"NO_METHOD_SPECIFIED", ERR_LIB_SSL, SSL_R_NO_METHOD_SPECIFIED}, ++ #else ++ {"NO_METHOD_SPECIFIED", 20, 188}, ++ #endif ++ #ifdef SSL_R_NO_PEM_EXTENSIONS ++ {"NO_PEM_EXTENSIONS", ERR_LIB_SSL, SSL_R_NO_PEM_EXTENSIONS}, ++ #else ++ {"NO_PEM_EXTENSIONS", 20, 389}, ++ #endif ++ #ifdef SSL_R_NO_PRIVATE_KEY_ASSIGNED ++ {"NO_PRIVATE_KEY_ASSIGNED", ERR_LIB_SSL, SSL_R_NO_PRIVATE_KEY_ASSIGNED}, ++ #else ++ {"NO_PRIVATE_KEY_ASSIGNED", 20, 190}, ++ #endif ++ #ifdef SSL_R_NO_PROTOCOLS_AVAILABLE ++ {"NO_PROTOCOLS_AVAILABLE", ERR_LIB_SSL, SSL_R_NO_PROTOCOLS_AVAILABLE}, ++ #else ++ {"NO_PROTOCOLS_AVAILABLE", 20, 191}, ++ #endif ++ #ifdef SSL_R_NO_RENEGOTIATION ++ {"NO_RENEGOTIATION", ERR_LIB_SSL, SSL_R_NO_RENEGOTIATION}, ++ #else ++ {"NO_RENEGOTIATION", 20, 339}, ++ #endif ++ #ifdef SSL_R_NO_REQUIRED_DIGEST ++ {"NO_REQUIRED_DIGEST", ERR_LIB_SSL, SSL_R_NO_REQUIRED_DIGEST}, ++ #else ++ {"NO_REQUIRED_DIGEST", 20, 324}, ++ #endif ++ #ifdef SSL_R_NO_SHARED_CIPHER ++ {"NO_SHARED_CIPHER", ERR_LIB_SSL, SSL_R_NO_SHARED_CIPHER}, ++ #else ++ {"NO_SHARED_CIPHER", 20, 193}, ++ #endif ++ #ifdef SSL_R_NO_SHARED_GROUPS ++ {"NO_SHARED_GROUPS", ERR_LIB_SSL, SSL_R_NO_SHARED_GROUPS}, ++ #else ++ {"NO_SHARED_GROUPS", 20, 410}, ++ #endif ++ #ifdef SSL_R_NO_SHARED_SIGNATURE_ALGORITHMS ++ {"NO_SHARED_SIGNATURE_ALGORITHMS", ERR_LIB_SSL, SSL_R_NO_SHARED_SIGNATURE_ALGORITHMS}, ++ #else ++ {"NO_SHARED_SIGNATURE_ALGORITHMS", 20, 376}, ++ #endif ++ #ifdef SSL_R_NO_SRTP_PROFILES ++ {"NO_SRTP_PROFILES", ERR_LIB_SSL, SSL_R_NO_SRTP_PROFILES}, ++ #else ++ {"NO_SRTP_PROFILES", 20, 359}, ++ #endif ++ #ifdef SSL_R_NO_STREAM ++ {"NO_STREAM", ERR_LIB_SSL, SSL_R_NO_STREAM}, ++ #else ++ {"NO_STREAM", 20, 355}, ++ #endif ++ #ifdef SSL_R_NO_SUITABLE_DIGEST_ALGORITHM ++ {"NO_SUITABLE_DIGEST_ALGORITHM", ERR_LIB_SSL, SSL_R_NO_SUITABLE_DIGEST_ALGORITHM}, ++ #else ++ {"NO_SUITABLE_DIGEST_ALGORITHM", 20, 297}, ++ #endif ++ #ifdef SSL_R_NO_SUITABLE_GROUPS ++ {"NO_SUITABLE_GROUPS", ERR_LIB_SSL, SSL_R_NO_SUITABLE_GROUPS}, ++ #else ++ {"NO_SUITABLE_GROUPS", 20, 295}, ++ #endif ++ #ifdef SSL_R_NO_SUITABLE_KEY_SHARE ++ {"NO_SUITABLE_KEY_SHARE", ERR_LIB_SSL, SSL_R_NO_SUITABLE_KEY_SHARE}, ++ #else ++ {"NO_SUITABLE_KEY_SHARE", 20, 101}, ++ #endif ++ #ifdef SSL_R_NO_SUITABLE_RECORD_LAYER ++ {"NO_SUITABLE_RECORD_LAYER", ERR_LIB_SSL, SSL_R_NO_SUITABLE_RECORD_LAYER}, ++ #else ++ {"NO_SUITABLE_RECORD_LAYER", 20, 322}, ++ #endif ++ #ifdef SSL_R_NO_SUITABLE_SIGNATURE_ALGORITHM ++ {"NO_SUITABLE_SIGNATURE_ALGORITHM", ERR_LIB_SSL, SSL_R_NO_SUITABLE_SIGNATURE_ALGORITHM}, ++ #else ++ {"NO_SUITABLE_SIGNATURE_ALGORITHM", 20, 118}, ++ #endif ++ #ifdef SSL_R_NO_VALID_SCTS ++ {"NO_VALID_SCTS", ERR_LIB_SSL, SSL_R_NO_VALID_SCTS}, ++ #else ++ {"NO_VALID_SCTS", 20, 216}, ++ #endif ++ #ifdef SSL_R_NO_VERIFY_COOKIE_CALLBACK ++ {"NO_VERIFY_COOKIE_CALLBACK", ERR_LIB_SSL, SSL_R_NO_VERIFY_COOKIE_CALLBACK}, ++ #else ++ {"NO_VERIFY_COOKIE_CALLBACK", 20, 403}, ++ #endif ++ #ifdef SSL_R_NULL_SSL_CTX ++ {"NULL_SSL_CTX", ERR_LIB_SSL, SSL_R_NULL_SSL_CTX}, ++ #else ++ {"NULL_SSL_CTX", 20, 195}, ++ #endif ++ #ifdef SSL_R_NULL_SSL_METHOD_PASSED ++ {"NULL_SSL_METHOD_PASSED", ERR_LIB_SSL, SSL_R_NULL_SSL_METHOD_PASSED}, ++ #else ++ {"NULL_SSL_METHOD_PASSED", 20, 196}, ++ #endif ++ #ifdef SSL_R_OCSP_CALLBACK_FAILURE ++ {"OCSP_CALLBACK_FAILURE", ERR_LIB_SSL, SSL_R_OCSP_CALLBACK_FAILURE}, ++ #else ++ {"OCSP_CALLBACK_FAILURE", 20, 305}, ++ #endif ++ #ifdef SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED ++ {"OLD_SESSION_CIPHER_NOT_RETURNED", ERR_LIB_SSL, SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED}, ++ #else ++ {"OLD_SESSION_CIPHER_NOT_RETURNED", 20, 197}, ++ #endif ++ #ifdef SSL_R_OLD_SESSION_COMPRESSION_ALGORITHM_NOT_RETURNED ++ {"OLD_SESSION_COMPRESSION_ALGORITHM_NOT_RETURNED", ERR_LIB_SSL, SSL_R_OLD_SESSION_COMPRESSION_ALGORITHM_NOT_RETURNED}, ++ #else ++ {"OLD_SESSION_COMPRESSION_ALGORITHM_NOT_RETURNED", 20, 344}, ++ #endif ++ #ifdef SSL_R_OVERFLOW_ERROR ++ {"OVERFLOW_ERROR", ERR_LIB_SSL, SSL_R_OVERFLOW_ERROR}, ++ #else ++ {"OVERFLOW_ERROR", 20, 237}, ++ #endif ++ #ifdef SSL_R_PACKET_LENGTH_TOO_LONG ++ {"PACKET_LENGTH_TOO_LONG", ERR_LIB_SSL, SSL_R_PACKET_LENGTH_TOO_LONG}, ++ #else ++ {"PACKET_LENGTH_TOO_LONG", 20, 198}, ++ #endif ++ #ifdef SSL_R_PARSE_TLSEXT ++ {"PARSE_TLSEXT", ERR_LIB_SSL, SSL_R_PARSE_TLSEXT}, ++ #else ++ {"PARSE_TLSEXT", 20, 227}, ++ #endif ++ #ifdef SSL_R_PATH_TOO_LONG ++ {"PATH_TOO_LONG", ERR_LIB_SSL, SSL_R_PATH_TOO_LONG}, ++ #else ++ {"PATH_TOO_LONG", 20, 270}, ++ #endif ++ #ifdef SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE ++ {"PEER_DID_NOT_RETURN_A_CERTIFICATE", ERR_LIB_SSL, SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE}, ++ #else ++ {"PEER_DID_NOT_RETURN_A_CERTIFICATE", 20, 199}, ++ #endif ++ #ifdef SSL_R_PEM_NAME_BAD_PREFIX ++ {"PEM_NAME_BAD_PREFIX", ERR_LIB_SSL, SSL_R_PEM_NAME_BAD_PREFIX}, ++ #else ++ {"PEM_NAME_BAD_PREFIX", 20, 391}, ++ #endif ++ #ifdef SSL_R_PEM_NAME_TOO_SHORT ++ {"PEM_NAME_TOO_SHORT", ERR_LIB_SSL, SSL_R_PEM_NAME_TOO_SHORT}, ++ #else ++ {"PEM_NAME_TOO_SHORT", 20, 392}, ++ #endif ++ #ifdef SSL_R_PIPELINE_FAILURE ++ {"PIPELINE_FAILURE", ERR_LIB_SSL, SSL_R_PIPELINE_FAILURE}, ++ #else ++ {"PIPELINE_FAILURE", 20, 406}, ++ #endif ++ #ifdef SSL_R_POLL_REQUEST_NOT_SUPPORTED ++ {"POLL_REQUEST_NOT_SUPPORTED", ERR_LIB_SSL, SSL_R_POLL_REQUEST_NOT_SUPPORTED}, ++ #else ++ {"POLL_REQUEST_NOT_SUPPORTED", 20, 418}, ++ #endif ++ #ifdef SSL_R_POST_HANDSHAKE_AUTH_ENCODING_ERR ++ {"POST_HANDSHAKE_AUTH_ENCODING_ERR", ERR_LIB_SSL, SSL_R_POST_HANDSHAKE_AUTH_ENCODING_ERR}, ++ #else ++ {"POST_HANDSHAKE_AUTH_ENCODING_ERR", 20, 278}, ++ #endif ++ #ifdef SSL_R_PRIVATE_KEY_MISMATCH ++ {"PRIVATE_KEY_MISMATCH", ERR_LIB_SSL, SSL_R_PRIVATE_KEY_MISMATCH}, ++ #else ++ {"PRIVATE_KEY_MISMATCH", 20, 288}, ++ #endif ++ #ifdef SSL_R_PROTOCOL_IS_SHUTDOWN ++ {"PROTOCOL_IS_SHUTDOWN", ERR_LIB_SSL, SSL_R_PROTOCOL_IS_SHUTDOWN}, ++ #else ++ {"PROTOCOL_IS_SHUTDOWN", 20, 207}, ++ #endif ++ #ifdef SSL_R_PSK_IDENTITY_NOT_FOUND ++ {"PSK_IDENTITY_NOT_FOUND", ERR_LIB_SSL, SSL_R_PSK_IDENTITY_NOT_FOUND}, ++ #else ++ {"PSK_IDENTITY_NOT_FOUND", 20, 223}, ++ #endif ++ #ifdef SSL_R_PSK_NO_CLIENT_CB ++ {"PSK_NO_CLIENT_CB", ERR_LIB_SSL, SSL_R_PSK_NO_CLIENT_CB}, ++ #else ++ {"PSK_NO_CLIENT_CB", 20, 224}, ++ #endif ++ #ifdef SSL_R_PSK_NO_SERVER_CB ++ {"PSK_NO_SERVER_CB", ERR_LIB_SSL, SSL_R_PSK_NO_SERVER_CB}, ++ #else ++ {"PSK_NO_SERVER_CB", 20, 225}, ++ #endif ++ #ifdef SSL_R_QUIC_HANDSHAKE_LAYER_ERROR ++ {"QUIC_HANDSHAKE_LAYER_ERROR", ERR_LIB_SSL, SSL_R_QUIC_HANDSHAKE_LAYER_ERROR}, ++ #else ++ {"QUIC_HANDSHAKE_LAYER_ERROR", 20, 393}, ++ #endif ++ #ifdef SSL_R_QUIC_NETWORK_ERROR ++ {"QUIC_NETWORK_ERROR", ERR_LIB_SSL, SSL_R_QUIC_NETWORK_ERROR}, ++ #else ++ {"QUIC_NETWORK_ERROR", 20, 387}, ++ #endif ++ #ifdef SSL_R_QUIC_PROTOCOL_ERROR ++ {"QUIC_PROTOCOL_ERROR", ERR_LIB_SSL, SSL_R_QUIC_PROTOCOL_ERROR}, ++ #else ++ {"QUIC_PROTOCOL_ERROR", 20, 382}, ++ #endif ++ #ifdef SSL_R_READ_BIO_NOT_SET ++ {"READ_BIO_NOT_SET", ERR_LIB_SSL, SSL_R_READ_BIO_NOT_SET}, ++ #else ++ {"READ_BIO_NOT_SET", 20, 211}, ++ #endif ++ #ifdef SSL_R_READ_TIMEOUT_EXPIRED ++ {"READ_TIMEOUT_EXPIRED", ERR_LIB_SSL, SSL_R_READ_TIMEOUT_EXPIRED}, ++ #else ++ {"READ_TIMEOUT_EXPIRED", 20, 312}, ++ #endif ++ #ifdef SSL_R_RECORDS_NOT_RELEASED ++ {"RECORDS_NOT_RELEASED", ERR_LIB_SSL, SSL_R_RECORDS_NOT_RELEASED}, ++ #else ++ {"RECORDS_NOT_RELEASED", 20, 321}, ++ #endif ++ #ifdef SSL_R_RECORD_LAYER_FAILURE ++ {"RECORD_LAYER_FAILURE", ERR_LIB_SSL, SSL_R_RECORD_LAYER_FAILURE}, ++ #else ++ {"RECORD_LAYER_FAILURE", 20, 313}, ++ #endif ++ #ifdef SSL_R_RECORD_LENGTH_MISMATCH ++ {"RECORD_LENGTH_MISMATCH", ERR_LIB_SSL, SSL_R_RECORD_LENGTH_MISMATCH}, ++ #else ++ {"RECORD_LENGTH_MISMATCH", 20, 213}, ++ #endif ++ #ifdef SSL_R_RECORD_TOO_SMALL ++ {"RECORD_TOO_SMALL", ERR_LIB_SSL, SSL_R_RECORD_TOO_SMALL}, ++ #else ++ {"RECORD_TOO_SMALL", 20, 298}, ++ #endif ++ #ifdef SSL_R_REMOTE_PEER_ADDRESS_NOT_SET ++ {"REMOTE_PEER_ADDRESS_NOT_SET", ERR_LIB_SSL, SSL_R_REMOTE_PEER_ADDRESS_NOT_SET}, ++ #else ++ {"REMOTE_PEER_ADDRESS_NOT_SET", 20, 346}, ++ #endif ++ #ifdef SSL_R_RENEGOTIATE_EXT_TOO_LONG ++ {"RENEGOTIATE_EXT_TOO_LONG", ERR_LIB_SSL, SSL_R_RENEGOTIATE_EXT_TOO_LONG}, ++ #else ++ {"RENEGOTIATE_EXT_TOO_LONG", 20, 335}, ++ #endif ++ #ifdef SSL_R_RENEGOTIATION_ENCODING_ERR ++ {"RENEGOTIATION_ENCODING_ERR", ERR_LIB_SSL, SSL_R_RENEGOTIATION_ENCODING_ERR}, ++ #else ++ {"RENEGOTIATION_ENCODING_ERR", 20, 336}, ++ #endif ++ #ifdef SSL_R_RENEGOTIATION_MISMATCH ++ {"RENEGOTIATION_MISMATCH", ERR_LIB_SSL, SSL_R_RENEGOTIATION_MISMATCH}, ++ #else ++ {"RENEGOTIATION_MISMATCH", 20, 337}, ++ #endif ++ #ifdef SSL_R_REQUEST_PENDING ++ {"REQUEST_PENDING", ERR_LIB_SSL, SSL_R_REQUEST_PENDING}, ++ #else ++ {"REQUEST_PENDING", 20, 285}, ++ #endif ++ #ifdef SSL_R_REQUEST_SENT ++ {"REQUEST_SENT", ERR_LIB_SSL, SSL_R_REQUEST_SENT}, ++ #else ++ {"REQUEST_SENT", 20, 286}, ++ #endif ++ #ifdef SSL_R_REQUIRED_CIPHER_MISSING ++ {"REQUIRED_CIPHER_MISSING", ERR_LIB_SSL, SSL_R_REQUIRED_CIPHER_MISSING}, ++ #else ++ {"REQUIRED_CIPHER_MISSING", 20, 215}, ++ #endif ++ #ifdef SSL_R_REQUIRED_COMPRESSION_ALGORITHM_MISSING ++ {"REQUIRED_COMPRESSION_ALGORITHM_MISSING", ERR_LIB_SSL, SSL_R_REQUIRED_COMPRESSION_ALGORITHM_MISSING}, ++ #else ++ {"REQUIRED_COMPRESSION_ALGORITHM_MISSING", 20, 342}, ++ #endif ++ #ifdef SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING ++ {"SCSV_RECEIVED_WHEN_RENEGOTIATING", ERR_LIB_SSL, SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING}, ++ #else ++ {"SCSV_RECEIVED_WHEN_RENEGOTIATING", 20, 345}, ++ #endif ++ #ifdef SSL_R_SCT_VERIFICATION_FAILED ++ {"SCT_VERIFICATION_FAILED", ERR_LIB_SSL, SSL_R_SCT_VERIFICATION_FAILED}, ++ #else ++ {"SCT_VERIFICATION_FAILED", 20, 208}, ++ #endif ++ #ifdef SSL_R_SEQUENCE_CTR_WRAPPED ++ {"SEQUENCE_CTR_WRAPPED", ERR_LIB_SSL, SSL_R_SEQUENCE_CTR_WRAPPED}, ++ #else ++ {"SEQUENCE_CTR_WRAPPED", 20, 327}, ++ #endif ++ #ifdef SSL_R_SERVERHELLO_TLSEXT ++ {"SERVERHELLO_TLSEXT", ERR_LIB_SSL, SSL_R_SERVERHELLO_TLSEXT}, ++ #else ++ {"SERVERHELLO_TLSEXT", 20, 275}, ++ #endif ++ #ifdef SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED ++ {"SESSION_ID_CONTEXT_UNINITIALIZED", ERR_LIB_SSL, SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED}, ++ #else ++ {"SESSION_ID_CONTEXT_UNINITIALIZED", 20, 277}, ++ #endif ++ #ifdef SSL_R_SHUTDOWN_WHILE_IN_INIT ++ {"SHUTDOWN_WHILE_IN_INIT", ERR_LIB_SSL, SSL_R_SHUTDOWN_WHILE_IN_INIT}, ++ #else ++ {"SHUTDOWN_WHILE_IN_INIT", 20, 407}, ++ #endif ++ #ifdef SSL_R_SIGNATURE_ALGORITHMS_ERROR ++ {"SIGNATURE_ALGORITHMS_ERROR", ERR_LIB_SSL, SSL_R_SIGNATURE_ALGORITHMS_ERROR}, ++ #else ++ {"SIGNATURE_ALGORITHMS_ERROR", 20, 360}, ++ #endif ++ #ifdef SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE ++ {"SIGNATURE_FOR_NON_SIGNING_CERTIFICATE", ERR_LIB_SSL, SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE}, ++ #else ++ {"SIGNATURE_FOR_NON_SIGNING_CERTIFICATE", 20, 220}, ++ #endif ++ #ifdef SSL_R_SRP_A_CALC ++ {"SRP_A_CALC", ERR_LIB_SSL, SSL_R_SRP_A_CALC}, ++ #else ++ {"SRP_A_CALC", 20, 361}, ++ #endif ++ #ifdef SSL_R_SRTP_COULD_NOT_ALLOCATE_PROFILES ++ {"SRTP_COULD_NOT_ALLOCATE_PROFILES", ERR_LIB_SSL, SSL_R_SRTP_COULD_NOT_ALLOCATE_PROFILES}, ++ #else ++ {"SRTP_COULD_NOT_ALLOCATE_PROFILES", 20, 362}, ++ #endif ++ #ifdef SSL_R_SRTP_PROTECTION_PROFILE_LIST_TOO_LONG ++ {"SRTP_PROTECTION_PROFILE_LIST_TOO_LONG", ERR_LIB_SSL, SSL_R_SRTP_PROTECTION_PROFILE_LIST_TOO_LONG}, ++ #else ++ {"SRTP_PROTECTION_PROFILE_LIST_TOO_LONG", 20, 363}, ++ #endif ++ #ifdef SSL_R_SRTP_UNKNOWN_PROTECTION_PROFILE ++ {"SRTP_UNKNOWN_PROTECTION_PROFILE", ERR_LIB_SSL, SSL_R_SRTP_UNKNOWN_PROTECTION_PROFILE}, ++ #else ++ {"SRTP_UNKNOWN_PROTECTION_PROFILE", 20, 364}, ++ #endif ++ #ifdef SSL_R_SSL3_EXT_INVALID_MAX_FRAGMENT_LENGTH ++ {"SSL3_EXT_INVALID_MAX_FRAGMENT_LENGTH", ERR_LIB_SSL, SSL_R_SSL3_EXT_INVALID_MAX_FRAGMENT_LENGTH}, ++ #else ++ {"SSL3_EXT_INVALID_MAX_FRAGMENT_LENGTH", 20, 232}, ++ #endif ++ #ifdef SSL_R_SSL3_EXT_INVALID_SERVERNAME ++ {"SSL3_EXT_INVALID_SERVERNAME", ERR_LIB_SSL, SSL_R_SSL3_EXT_INVALID_SERVERNAME}, ++ #else ++ {"SSL3_EXT_INVALID_SERVERNAME", 20, 319}, ++ #endif ++ #ifdef SSL_R_SSL3_EXT_INVALID_SERVERNAME_TYPE ++ {"SSL3_EXT_INVALID_SERVERNAME_TYPE", ERR_LIB_SSL, SSL_R_SSL3_EXT_INVALID_SERVERNAME_TYPE}, ++ #else ++ {"SSL3_EXT_INVALID_SERVERNAME_TYPE", 20, 320}, ++ #endif ++ #ifdef SSL_R_SSL3_SESSION_ID_TOO_LONG ++ {"SSL3_SESSION_ID_TOO_LONG", ERR_LIB_SSL, SSL_R_SSL3_SESSION_ID_TOO_LONG}, ++ #else ++ {"SSL3_SESSION_ID_TOO_LONG", 20, 300}, ++ #endif ++ #ifdef SSL_R_SSLV3_ALERT_BAD_CERTIFICATE ++ {"SSLV3_ALERT_BAD_CERTIFICATE", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_BAD_CERTIFICATE}, ++ #else ++ {"SSLV3_ALERT_BAD_CERTIFICATE", 20, 1042}, ++ #endif ++ #ifdef SSL_R_SSLV3_ALERT_BAD_CERTIFICATE ++ {"SSLV3_ALERT_BAD_CERTIFICATE", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_BAD_CERTIFICATE}, ++ #else ++ {"SSLV3_ALERT_BAD_CERTIFICATE", 20, 1042}, ++ #endif ++ #ifdef SSL_R_SSLV3_ALERT_BAD_RECORD_MAC ++ {"SSLV3_ALERT_BAD_RECORD_MAC", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_BAD_RECORD_MAC}, ++ #else ++ {"SSLV3_ALERT_BAD_RECORD_MAC", 20, 1020}, ++ #endif ++ #ifdef SSL_R_SSLV3_ALERT_BAD_RECORD_MAC ++ {"SSLV3_ALERT_BAD_RECORD_MAC", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_BAD_RECORD_MAC}, ++ #else ++ {"SSLV3_ALERT_BAD_RECORD_MAC", 20, 1020}, ++ #endif ++ #ifdef SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED ++ {"SSLV3_ALERT_CERTIFICATE_EXPIRED", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED}, ++ #else ++ {"SSLV3_ALERT_CERTIFICATE_EXPIRED", 20, 1045}, ++ #endif ++ #ifdef SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED ++ {"SSLV3_ALERT_CERTIFICATE_EXPIRED", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED}, ++ #else ++ {"SSLV3_ALERT_CERTIFICATE_EXPIRED", 20, 1045}, ++ #endif ++ #ifdef SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED ++ {"SSLV3_ALERT_CERTIFICATE_REVOKED", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED}, ++ #else ++ {"SSLV3_ALERT_CERTIFICATE_REVOKED", 20, 1044}, ++ #endif ++ #ifdef SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED ++ {"SSLV3_ALERT_CERTIFICATE_REVOKED", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED}, ++ #else ++ {"SSLV3_ALERT_CERTIFICATE_REVOKED", 20, 1044}, ++ #endif ++ #ifdef SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN ++ {"SSLV3_ALERT_CERTIFICATE_UNKNOWN", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN}, ++ #else ++ {"SSLV3_ALERT_CERTIFICATE_UNKNOWN", 20, 1046}, ++ #endif ++ #ifdef SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN ++ {"SSLV3_ALERT_CERTIFICATE_UNKNOWN", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN}, ++ #else ++ {"SSLV3_ALERT_CERTIFICATE_UNKNOWN", 20, 1046}, ++ #endif ++ #ifdef SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE ++ {"SSLV3_ALERT_DECOMPRESSION_FAILURE", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE}, ++ #else ++ {"SSLV3_ALERT_DECOMPRESSION_FAILURE", 20, 1030}, ++ #endif ++ #ifdef SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE ++ {"SSLV3_ALERT_DECOMPRESSION_FAILURE", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE}, ++ #else ++ {"SSLV3_ALERT_DECOMPRESSION_FAILURE", 20, 1030}, ++ #endif ++ #ifdef SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE ++ {"SSLV3_ALERT_HANDSHAKE_FAILURE", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE}, ++ #else ++ {"SSLV3_ALERT_HANDSHAKE_FAILURE", 20, 1040}, ++ #endif ++ #ifdef SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE ++ {"SSLV3_ALERT_HANDSHAKE_FAILURE", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE}, ++ #else ++ {"SSLV3_ALERT_HANDSHAKE_FAILURE", 20, 1040}, ++ #endif ++ #ifdef SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER ++ {"SSLV3_ALERT_ILLEGAL_PARAMETER", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER}, ++ #else ++ {"SSLV3_ALERT_ILLEGAL_PARAMETER", 20, 1047}, ++ #endif ++ #ifdef SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER ++ {"SSLV3_ALERT_ILLEGAL_PARAMETER", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER}, ++ #else ++ {"SSLV3_ALERT_ILLEGAL_PARAMETER", 20, 1047}, ++ #endif ++ #ifdef SSL_R_SSLV3_ALERT_NO_CERTIFICATE ++ {"SSLV3_ALERT_NO_CERTIFICATE", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_NO_CERTIFICATE}, ++ #else ++ {"SSLV3_ALERT_NO_CERTIFICATE", 20, 1041}, ++ #endif ++ #ifdef SSL_R_SSLV3_ALERT_NO_CERTIFICATE ++ {"SSLV3_ALERT_NO_CERTIFICATE", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_NO_CERTIFICATE}, ++ #else ++ {"SSLV3_ALERT_NO_CERTIFICATE", 20, 1041}, ++ #endif ++ #ifdef SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE ++ {"SSLV3_ALERT_UNEXPECTED_MESSAGE", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE}, ++ #else ++ {"SSLV3_ALERT_UNEXPECTED_MESSAGE", 20, 1010}, ++ #endif ++ #ifdef SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE ++ {"SSLV3_ALERT_UNEXPECTED_MESSAGE", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE}, ++ #else ++ {"SSLV3_ALERT_UNEXPECTED_MESSAGE", 20, 1010}, ++ #endif ++ #ifdef SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE ++ {"SSLV3_ALERT_UNSUPPORTED_CERTIFICATE", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE}, ++ #else ++ {"SSLV3_ALERT_UNSUPPORTED_CERTIFICATE", 20, 1043}, ++ #endif ++ #ifdef SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE ++ {"SSLV3_ALERT_UNSUPPORTED_CERTIFICATE", ERR_LIB_SSL, SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE}, ++ #else ++ {"SSLV3_ALERT_UNSUPPORTED_CERTIFICATE", 20, 1043}, ++ #endif ++ #ifdef SSL_R_SSL_COMMAND_SECTION_EMPTY ++ {"SSL_COMMAND_SECTION_EMPTY", ERR_LIB_SSL, SSL_R_SSL_COMMAND_SECTION_EMPTY}, ++ #else ++ {"SSL_COMMAND_SECTION_EMPTY", 20, 117}, ++ #endif ++ #ifdef SSL_R_SSL_COMMAND_SECTION_NOT_FOUND ++ {"SSL_COMMAND_SECTION_NOT_FOUND", ERR_LIB_SSL, SSL_R_SSL_COMMAND_SECTION_NOT_FOUND}, ++ #else ++ {"SSL_COMMAND_SECTION_NOT_FOUND", 20, 125}, ++ #endif ++ #ifdef SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION ++ {"SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION", ERR_LIB_SSL, SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION}, ++ #else ++ {"SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION", 20, 228}, ++ #endif ++ #ifdef SSL_R_SSL_HANDSHAKE_FAILURE ++ {"SSL_HANDSHAKE_FAILURE", ERR_LIB_SSL, SSL_R_SSL_HANDSHAKE_FAILURE}, ++ #else ++ {"SSL_HANDSHAKE_FAILURE", 20, 229}, ++ #endif ++ #ifdef SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS ++ {"SSL_LIBRARY_HAS_NO_CIPHERS", ERR_LIB_SSL, SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS}, ++ #else ++ {"SSL_LIBRARY_HAS_NO_CIPHERS", 20, 230}, ++ #endif ++ #ifdef SSL_R_SSL_NEGATIVE_LENGTH ++ {"SSL_NEGATIVE_LENGTH", ERR_LIB_SSL, SSL_R_SSL_NEGATIVE_LENGTH}, ++ #else ++ {"SSL_NEGATIVE_LENGTH", 20, 372}, ++ #endif ++ #ifdef SSL_R_SSL_SECTION_EMPTY ++ {"SSL_SECTION_EMPTY", ERR_LIB_SSL, SSL_R_SSL_SECTION_EMPTY}, ++ #else ++ {"SSL_SECTION_EMPTY", 20, 126}, ++ #endif ++ #ifdef SSL_R_SSL_SECTION_NOT_FOUND ++ {"SSL_SECTION_NOT_FOUND", ERR_LIB_SSL, SSL_R_SSL_SECTION_NOT_FOUND}, ++ #else ++ {"SSL_SECTION_NOT_FOUND", 20, 136}, ++ #endif ++ #ifdef SSL_R_SSL_SESSION_ID_CALLBACK_FAILED ++ {"SSL_SESSION_ID_CALLBACK_FAILED", ERR_LIB_SSL, SSL_R_SSL_SESSION_ID_CALLBACK_FAILED}, ++ #else ++ {"SSL_SESSION_ID_CALLBACK_FAILED", 20, 301}, ++ #endif ++ #ifdef SSL_R_SSL_SESSION_ID_CONFLICT ++ {"SSL_SESSION_ID_CONFLICT", ERR_LIB_SSL, SSL_R_SSL_SESSION_ID_CONFLICT}, ++ #else ++ {"SSL_SESSION_ID_CONFLICT", 20, 302}, ++ #endif ++ #ifdef SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG ++ {"SSL_SESSION_ID_CONTEXT_TOO_LONG", ERR_LIB_SSL, SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG}, ++ #else ++ {"SSL_SESSION_ID_CONTEXT_TOO_LONG", 20, 273}, ++ #endif ++ #ifdef SSL_R_SSL_SESSION_ID_HAS_BAD_LENGTH ++ {"SSL_SESSION_ID_HAS_BAD_LENGTH", ERR_LIB_SSL, SSL_R_SSL_SESSION_ID_HAS_BAD_LENGTH}, ++ #else ++ {"SSL_SESSION_ID_HAS_BAD_LENGTH", 20, 303}, ++ #endif ++ #ifdef SSL_R_SSL_SESSION_ID_TOO_LONG ++ {"SSL_SESSION_ID_TOO_LONG", ERR_LIB_SSL, SSL_R_SSL_SESSION_ID_TOO_LONG}, ++ #else ++ {"SSL_SESSION_ID_TOO_LONG", 20, 408}, ++ #endif ++ #ifdef SSL_R_SSL_SESSION_VERSION_MISMATCH ++ {"SSL_SESSION_VERSION_MISMATCH", ERR_LIB_SSL, SSL_R_SSL_SESSION_VERSION_MISMATCH}, ++ #else ++ {"SSL_SESSION_VERSION_MISMATCH", 20, 210}, ++ #endif ++ #ifdef SSL_R_STILL_IN_INIT ++ {"STILL_IN_INIT", ERR_LIB_SSL, SSL_R_STILL_IN_INIT}, ++ #else ++ {"STILL_IN_INIT", 20, 121}, ++ #endif ++ #ifdef SSL_R_STREAM_COUNT_LIMITED ++ {"STREAM_COUNT_LIMITED", ERR_LIB_SSL, SSL_R_STREAM_COUNT_LIMITED}, ++ #else ++ {"STREAM_COUNT_LIMITED", 20, 411}, ++ #endif ++ #ifdef SSL_R_STREAM_FINISHED ++ {"STREAM_FINISHED", ERR_LIB_SSL, SSL_R_STREAM_FINISHED}, ++ #else ++ {"STREAM_FINISHED", 20, 365}, ++ #endif ++ #ifdef SSL_R_STREAM_RECV_ONLY ++ {"STREAM_RECV_ONLY", ERR_LIB_SSL, SSL_R_STREAM_RECV_ONLY}, ++ #else ++ {"STREAM_RECV_ONLY", 20, 366}, ++ #endif ++ #ifdef SSL_R_STREAM_RESET ++ {"STREAM_RESET", ERR_LIB_SSL, SSL_R_STREAM_RESET}, ++ #else ++ {"STREAM_RESET", 20, 375}, ++ #endif ++ #ifdef SSL_R_STREAM_SEND_ONLY ++ {"STREAM_SEND_ONLY", ERR_LIB_SSL, SSL_R_STREAM_SEND_ONLY}, ++ #else ++ {"STREAM_SEND_ONLY", 20, 379}, ++ #endif ++ #ifdef SSL_R_TLSV13_ALERT_CERTIFICATE_REQUIRED ++ {"TLSV13_ALERT_CERTIFICATE_REQUIRED", ERR_LIB_SSL, SSL_R_TLSV13_ALERT_CERTIFICATE_REQUIRED}, ++ #else ++ {"TLSV13_ALERT_CERTIFICATE_REQUIRED", 20, 1116}, ++ #endif ++ #ifdef SSL_R_TLSV13_ALERT_CERTIFICATE_REQUIRED ++ {"TLSV13_ALERT_CERTIFICATE_REQUIRED", ERR_LIB_SSL, SSL_R_TLSV13_ALERT_CERTIFICATE_REQUIRED}, ++ #else ++ {"TLSV13_ALERT_CERTIFICATE_REQUIRED", 20, 1116}, ++ #endif ++ #ifdef SSL_R_TLSV13_ALERT_MISSING_EXTENSION ++ {"TLSV13_ALERT_MISSING_EXTENSION", ERR_LIB_SSL, SSL_R_TLSV13_ALERT_MISSING_EXTENSION}, ++ #else ++ {"TLSV13_ALERT_MISSING_EXTENSION", 20, 1109}, ++ #endif ++ #ifdef SSL_R_TLSV13_ALERT_MISSING_EXTENSION ++ {"TLSV13_ALERT_MISSING_EXTENSION", ERR_LIB_SSL, SSL_R_TLSV13_ALERT_MISSING_EXTENSION}, ++ #else ++ {"TLSV13_ALERT_MISSING_EXTENSION", 20, 1109}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_ACCESS_DENIED ++ {"TLSV1_ALERT_ACCESS_DENIED", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_ACCESS_DENIED}, ++ #else ++ {"TLSV1_ALERT_ACCESS_DENIED", 20, 1049}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_ACCESS_DENIED ++ {"TLSV1_ALERT_ACCESS_DENIED", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_ACCESS_DENIED}, ++ #else ++ {"TLSV1_ALERT_ACCESS_DENIED", 20, 1049}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_DECODE_ERROR ++ {"TLSV1_ALERT_DECODE_ERROR", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_DECODE_ERROR}, ++ #else ++ {"TLSV1_ALERT_DECODE_ERROR", 20, 1050}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_DECODE_ERROR ++ {"TLSV1_ALERT_DECODE_ERROR", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_DECODE_ERROR}, ++ #else ++ {"TLSV1_ALERT_DECODE_ERROR", 20, 1050}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_DECRYPTION_FAILED ++ {"TLSV1_ALERT_DECRYPTION_FAILED", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_DECRYPTION_FAILED}, ++ #else ++ {"TLSV1_ALERT_DECRYPTION_FAILED", 20, 1021}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_DECRYPTION_FAILED ++ {"TLSV1_ALERT_DECRYPTION_FAILED", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_DECRYPTION_FAILED}, ++ #else ++ {"TLSV1_ALERT_DECRYPTION_FAILED", 20, 1021}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_DECRYPT_ERROR ++ {"TLSV1_ALERT_DECRYPT_ERROR", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_DECRYPT_ERROR}, ++ #else ++ {"TLSV1_ALERT_DECRYPT_ERROR", 20, 1051}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_DECRYPT_ERROR ++ {"TLSV1_ALERT_DECRYPT_ERROR", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_DECRYPT_ERROR}, ++ #else ++ {"TLSV1_ALERT_DECRYPT_ERROR", 20, 1051}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_EXPORT_RESTRICTION ++ {"TLSV1_ALERT_EXPORT_RESTRICTION", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_EXPORT_RESTRICTION}, ++ #else ++ {"TLSV1_ALERT_EXPORT_RESTRICTION", 20, 1060}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_EXPORT_RESTRICTION ++ {"TLSV1_ALERT_EXPORT_RESTRICTION", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_EXPORT_RESTRICTION}, ++ #else ++ {"TLSV1_ALERT_EXPORT_RESTRICTION", 20, 1060}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_INAPPROPRIATE_FALLBACK ++ {"TLSV1_ALERT_INAPPROPRIATE_FALLBACK", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_INAPPROPRIATE_FALLBACK}, ++ #else ++ {"TLSV1_ALERT_INAPPROPRIATE_FALLBACK", 20, 1086}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_INAPPROPRIATE_FALLBACK ++ {"TLSV1_ALERT_INAPPROPRIATE_FALLBACK", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_INAPPROPRIATE_FALLBACK}, ++ #else ++ {"TLSV1_ALERT_INAPPROPRIATE_FALLBACK", 20, 1086}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY ++ {"TLSV1_ALERT_INSUFFICIENT_SECURITY", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY}, ++ #else ++ {"TLSV1_ALERT_INSUFFICIENT_SECURITY", 20, 1071}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY ++ {"TLSV1_ALERT_INSUFFICIENT_SECURITY", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY}, ++ #else ++ {"TLSV1_ALERT_INSUFFICIENT_SECURITY", 20, 1071}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_INTERNAL_ERROR ++ {"TLSV1_ALERT_INTERNAL_ERROR", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_INTERNAL_ERROR}, ++ #else ++ {"TLSV1_ALERT_INTERNAL_ERROR", 20, 1080}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_INTERNAL_ERROR ++ {"TLSV1_ALERT_INTERNAL_ERROR", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_INTERNAL_ERROR}, ++ #else ++ {"TLSV1_ALERT_INTERNAL_ERROR", 20, 1080}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_NO_APPLICATION_PROTOCOL ++ {"TLSV1_ALERT_NO_APPLICATION_PROTOCOL", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_NO_APPLICATION_PROTOCOL}, ++ #else ++ {"TLSV1_ALERT_NO_APPLICATION_PROTOCOL", 20, 1120}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_NO_APPLICATION_PROTOCOL ++ {"TLSV1_ALERT_NO_APPLICATION_PROTOCOL", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_NO_APPLICATION_PROTOCOL}, ++ #else ++ {"TLSV1_ALERT_NO_APPLICATION_PROTOCOL", 20, 1120}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_NO_RENEGOTIATION ++ {"TLSV1_ALERT_NO_RENEGOTIATION", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_NO_RENEGOTIATION}, ++ #else ++ {"TLSV1_ALERT_NO_RENEGOTIATION", 20, 1100}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_NO_RENEGOTIATION ++ {"TLSV1_ALERT_NO_RENEGOTIATION", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_NO_RENEGOTIATION}, ++ #else ++ {"TLSV1_ALERT_NO_RENEGOTIATION", 20, 1100}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_PROTOCOL_VERSION ++ {"TLSV1_ALERT_PROTOCOL_VERSION", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_PROTOCOL_VERSION}, ++ #else ++ {"TLSV1_ALERT_PROTOCOL_VERSION", 20, 1070}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_PROTOCOL_VERSION ++ {"TLSV1_ALERT_PROTOCOL_VERSION", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_PROTOCOL_VERSION}, ++ #else ++ {"TLSV1_ALERT_PROTOCOL_VERSION", 20, 1070}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_RECORD_OVERFLOW ++ {"TLSV1_ALERT_RECORD_OVERFLOW", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_RECORD_OVERFLOW}, ++ #else ++ {"TLSV1_ALERT_RECORD_OVERFLOW", 20, 1022}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_RECORD_OVERFLOW ++ {"TLSV1_ALERT_RECORD_OVERFLOW", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_RECORD_OVERFLOW}, ++ #else ++ {"TLSV1_ALERT_RECORD_OVERFLOW", 20, 1022}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_UNKNOWN_CA ++ {"TLSV1_ALERT_UNKNOWN_CA", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_UNKNOWN_CA}, ++ #else ++ {"TLSV1_ALERT_UNKNOWN_CA", 20, 1048}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_UNKNOWN_CA ++ {"TLSV1_ALERT_UNKNOWN_CA", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_UNKNOWN_CA}, ++ #else ++ {"TLSV1_ALERT_UNKNOWN_CA", 20, 1048}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_UNKNOWN_PSK_IDENTITY ++ {"TLSV1_ALERT_UNKNOWN_PSK_IDENTITY", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_UNKNOWN_PSK_IDENTITY}, ++ #else ++ {"TLSV1_ALERT_UNKNOWN_PSK_IDENTITY", 20, 1115}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_UNKNOWN_PSK_IDENTITY ++ {"TLSV1_ALERT_UNKNOWN_PSK_IDENTITY", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_UNKNOWN_PSK_IDENTITY}, ++ #else ++ {"TLSV1_ALERT_UNKNOWN_PSK_IDENTITY", 20, 1115}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_USER_CANCELLED ++ {"TLSV1_ALERT_USER_CANCELLED", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_USER_CANCELLED}, ++ #else ++ {"TLSV1_ALERT_USER_CANCELLED", 20, 1090}, ++ #endif ++ #ifdef SSL_R_TLSV1_ALERT_USER_CANCELLED ++ {"TLSV1_ALERT_USER_CANCELLED", ERR_LIB_SSL, SSL_R_TLSV1_ALERT_USER_CANCELLED}, ++ #else ++ {"TLSV1_ALERT_USER_CANCELLED", 20, 1090}, ++ #endif ++ #ifdef SSL_R_TLSV1_BAD_CERTIFICATE_HASH_VALUE ++ {"TLSV1_BAD_CERTIFICATE_HASH_VALUE", ERR_LIB_SSL, SSL_R_TLSV1_BAD_CERTIFICATE_HASH_VALUE}, ++ #else ++ {"TLSV1_BAD_CERTIFICATE_HASH_VALUE", 20, 1114}, ++ #endif ++ #ifdef SSL_R_TLSV1_BAD_CERTIFICATE_HASH_VALUE ++ {"TLSV1_BAD_CERTIFICATE_HASH_VALUE", ERR_LIB_SSL, SSL_R_TLSV1_BAD_CERTIFICATE_HASH_VALUE}, ++ #else ++ {"TLSV1_BAD_CERTIFICATE_HASH_VALUE", 20, 1114}, ++ #endif ++ #ifdef SSL_R_TLSV1_BAD_CERTIFICATE_STATUS_RESPONSE ++ {"TLSV1_BAD_CERTIFICATE_STATUS_RESPONSE", ERR_LIB_SSL, SSL_R_TLSV1_BAD_CERTIFICATE_STATUS_RESPONSE}, ++ #else ++ {"TLSV1_BAD_CERTIFICATE_STATUS_RESPONSE", 20, 1113}, ++ #endif ++ #ifdef SSL_R_TLSV1_BAD_CERTIFICATE_STATUS_RESPONSE ++ {"TLSV1_BAD_CERTIFICATE_STATUS_RESPONSE", ERR_LIB_SSL, SSL_R_TLSV1_BAD_CERTIFICATE_STATUS_RESPONSE}, ++ #else ++ {"TLSV1_BAD_CERTIFICATE_STATUS_RESPONSE", 20, 1113}, ++ #endif ++ #ifdef SSL_R_TLSV1_CERTIFICATE_UNOBTAINABLE ++ {"TLSV1_CERTIFICATE_UNOBTAINABLE", ERR_LIB_SSL, SSL_R_TLSV1_CERTIFICATE_UNOBTAINABLE}, ++ #else ++ {"TLSV1_CERTIFICATE_UNOBTAINABLE", 20, 1111}, ++ #endif ++ #ifdef SSL_R_TLSV1_CERTIFICATE_UNOBTAINABLE ++ {"TLSV1_CERTIFICATE_UNOBTAINABLE", ERR_LIB_SSL, SSL_R_TLSV1_CERTIFICATE_UNOBTAINABLE}, ++ #else ++ {"TLSV1_CERTIFICATE_UNOBTAINABLE", 20, 1111}, ++ #endif ++ #ifdef SSL_R_TLSV1_UNRECOGNIZED_NAME ++ {"TLSV1_UNRECOGNIZED_NAME", ERR_LIB_SSL, SSL_R_TLSV1_UNRECOGNIZED_NAME}, ++ #else ++ {"TLSV1_UNRECOGNIZED_NAME", 20, 1112}, ++ #endif ++ #ifdef SSL_R_TLSV1_UNRECOGNIZED_NAME ++ {"TLSV1_UNRECOGNIZED_NAME", ERR_LIB_SSL, SSL_R_TLSV1_UNRECOGNIZED_NAME}, ++ #else ++ {"TLSV1_UNRECOGNIZED_NAME", 20, 1112}, ++ #endif ++ #ifdef SSL_R_TLSV1_UNSUPPORTED_EXTENSION ++ {"TLSV1_UNSUPPORTED_EXTENSION", ERR_LIB_SSL, SSL_R_TLSV1_UNSUPPORTED_EXTENSION}, ++ #else ++ {"TLSV1_UNSUPPORTED_EXTENSION", 20, 1110}, ++ #endif ++ #ifdef SSL_R_TLSV1_UNSUPPORTED_EXTENSION ++ {"TLSV1_UNSUPPORTED_EXTENSION", ERR_LIB_SSL, SSL_R_TLSV1_UNSUPPORTED_EXTENSION}, ++ #else ++ {"TLSV1_UNSUPPORTED_EXTENSION", 20, 1110}, ++ #endif ++ #ifdef SSL_R_TLS_ILLEGAL_EXPORTER_LABEL ++ {"TLS_ILLEGAL_EXPORTER_LABEL", ERR_LIB_SSL, SSL_R_TLS_ILLEGAL_EXPORTER_LABEL}, ++ #else ++ {"TLS_ILLEGAL_EXPORTER_LABEL", 20, 367}, ++ #endif ++ #ifdef SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST ++ {"TLS_INVALID_ECPOINTFORMAT_LIST", ERR_LIB_SSL, SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST}, ++ #else ++ {"TLS_INVALID_ECPOINTFORMAT_LIST", 20, 157}, ++ #endif ++ #ifdef SSL_R_TOO_MANY_KEY_UPDATES ++ {"TOO_MANY_KEY_UPDATES", ERR_LIB_SSL, SSL_R_TOO_MANY_KEY_UPDATES}, ++ #else ++ {"TOO_MANY_KEY_UPDATES", 20, 132}, ++ #endif ++ #ifdef SSL_R_TOO_MANY_WARN_ALERTS ++ {"TOO_MANY_WARN_ALERTS", ERR_LIB_SSL, SSL_R_TOO_MANY_WARN_ALERTS}, ++ #else ++ {"TOO_MANY_WARN_ALERTS", 20, 409}, ++ #endif ++ #ifdef SSL_R_TOO_MUCH_EARLY_DATA ++ {"TOO_MUCH_EARLY_DATA", ERR_LIB_SSL, SSL_R_TOO_MUCH_EARLY_DATA}, ++ #else ++ {"TOO_MUCH_EARLY_DATA", 20, 164}, ++ #endif ++ #ifdef SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS ++ {"UNABLE_TO_FIND_ECDH_PARAMETERS", ERR_LIB_SSL, SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS}, ++ #else ++ {"UNABLE_TO_FIND_ECDH_PARAMETERS", 20, 314}, ++ #endif ++ #ifdef SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS ++ {"UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS", ERR_LIB_SSL, SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS}, ++ #else ++ {"UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS", 20, 239}, ++ #endif ++ #ifdef SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES ++ {"UNABLE_TO_LOAD_SSL3_MD5_ROUTINES", ERR_LIB_SSL, SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES}, ++ #else ++ {"UNABLE_TO_LOAD_SSL3_MD5_ROUTINES", 20, 242}, ++ #endif ++ #ifdef SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES ++ {"UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES", ERR_LIB_SSL, SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES}, ++ #else ++ {"UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES", 20, 243}, ++ #endif ++ #ifdef SSL_R_UNEXPECTED_CCS_MESSAGE ++ {"UNEXPECTED_CCS_MESSAGE", ERR_LIB_SSL, SSL_R_UNEXPECTED_CCS_MESSAGE}, ++ #else ++ {"UNEXPECTED_CCS_MESSAGE", 20, 262}, ++ #endif ++ #ifdef SSL_R_UNEXPECTED_END_OF_EARLY_DATA ++ {"UNEXPECTED_END_OF_EARLY_DATA", ERR_LIB_SSL, SSL_R_UNEXPECTED_END_OF_EARLY_DATA}, ++ #else ++ {"UNEXPECTED_END_OF_EARLY_DATA", 20, 178}, ++ #endif ++ #ifdef SSL_R_UNEXPECTED_EOF_WHILE_READING ++ {"UNEXPECTED_EOF_WHILE_READING", ERR_LIB_SSL, SSL_R_UNEXPECTED_EOF_WHILE_READING}, ++ #else ++ {"UNEXPECTED_EOF_WHILE_READING", 20, 294}, ++ #endif ++ #ifdef SSL_R_UNEXPECTED_MESSAGE ++ {"UNEXPECTED_MESSAGE", ERR_LIB_SSL, SSL_R_UNEXPECTED_MESSAGE}, ++ #else ++ {"UNEXPECTED_MESSAGE", 20, 244}, ++ #endif ++ #ifdef SSL_R_UNEXPECTED_RECORD ++ {"UNEXPECTED_RECORD", ERR_LIB_SSL, SSL_R_UNEXPECTED_RECORD}, ++ #else ++ {"UNEXPECTED_RECORD", 20, 245}, ++ #endif ++ #ifdef SSL_R_UNINITIALIZED ++ {"UNINITIALIZED", ERR_LIB_SSL, SSL_R_UNINITIALIZED}, ++ #else ++ {"UNINITIALIZED", 20, 276}, ++ #endif ++ #ifdef SSL_R_UNKNOWN_ALERT_TYPE ++ {"UNKNOWN_ALERT_TYPE", ERR_LIB_SSL, SSL_R_UNKNOWN_ALERT_TYPE}, ++ #else ++ {"UNKNOWN_ALERT_TYPE", 20, 246}, ++ #endif ++ #ifdef SSL_R_UNKNOWN_CERTIFICATE_TYPE ++ {"UNKNOWN_CERTIFICATE_TYPE", ERR_LIB_SSL, SSL_R_UNKNOWN_CERTIFICATE_TYPE}, ++ #else ++ {"UNKNOWN_CERTIFICATE_TYPE", 20, 247}, ++ #endif ++ #ifdef SSL_R_UNKNOWN_CIPHER_RETURNED ++ {"UNKNOWN_CIPHER_RETURNED", ERR_LIB_SSL, SSL_R_UNKNOWN_CIPHER_RETURNED}, ++ #else ++ {"UNKNOWN_CIPHER_RETURNED", 20, 248}, ++ #endif ++ #ifdef SSL_R_UNKNOWN_CIPHER_TYPE ++ {"UNKNOWN_CIPHER_TYPE", ERR_LIB_SSL, SSL_R_UNKNOWN_CIPHER_TYPE}, ++ #else ++ {"UNKNOWN_CIPHER_TYPE", 20, 249}, ++ #endif ++ #ifdef SSL_R_UNKNOWN_CMD_NAME ++ {"UNKNOWN_CMD_NAME", ERR_LIB_SSL, SSL_R_UNKNOWN_CMD_NAME}, ++ #else ++ {"UNKNOWN_CMD_NAME", 20, 386}, ++ #endif ++ #ifdef SSL_R_UNKNOWN_COMMAND ++ {"UNKNOWN_COMMAND", ERR_LIB_SSL, SSL_R_UNKNOWN_COMMAND}, ++ #else ++ {"UNKNOWN_COMMAND", 20, 139}, ++ #endif ++ #ifdef SSL_R_UNKNOWN_DIGEST ++ {"UNKNOWN_DIGEST", ERR_LIB_SSL, SSL_R_UNKNOWN_DIGEST}, ++ #else ++ {"UNKNOWN_DIGEST", 20, 368}, ++ #endif ++ #ifdef SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE ++ {"UNKNOWN_KEY_EXCHANGE_TYPE", ERR_LIB_SSL, SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE}, ++ #else ++ {"UNKNOWN_KEY_EXCHANGE_TYPE", 20, 250}, ++ #endif ++ #ifdef SSL_R_UNKNOWN_MANDATORY_PARAMETER ++ {"UNKNOWN_MANDATORY_PARAMETER", ERR_LIB_SSL, SSL_R_UNKNOWN_MANDATORY_PARAMETER}, ++ #else ++ {"UNKNOWN_MANDATORY_PARAMETER", 20, 323}, ++ #endif ++ #ifdef SSL_R_UNKNOWN_PKEY_TYPE ++ {"UNKNOWN_PKEY_TYPE", ERR_LIB_SSL, SSL_R_UNKNOWN_PKEY_TYPE}, ++ #else ++ {"UNKNOWN_PKEY_TYPE", 20, 251}, ++ #endif ++ #ifdef SSL_R_UNKNOWN_PROTOCOL ++ {"UNKNOWN_PROTOCOL", ERR_LIB_SSL, SSL_R_UNKNOWN_PROTOCOL}, ++ #else ++ {"UNKNOWN_PROTOCOL", 20, 252}, ++ #endif ++ #ifdef SSL_R_UNKNOWN_SSL_VERSION ++ {"UNKNOWN_SSL_VERSION", ERR_LIB_SSL, SSL_R_UNKNOWN_SSL_VERSION}, ++ #else ++ {"UNKNOWN_SSL_VERSION", 20, 254}, ++ #endif ++ #ifdef SSL_R_UNKNOWN_STATE ++ {"UNKNOWN_STATE", ERR_LIB_SSL, SSL_R_UNKNOWN_STATE}, ++ #else ++ {"UNKNOWN_STATE", 20, 255}, ++ #endif ++ #ifdef SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED ++ {"UNSAFE_LEGACY_RENEGOTIATION_DISABLED", ERR_LIB_SSL, SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED}, ++ #else ++ {"UNSAFE_LEGACY_RENEGOTIATION_DISABLED", 20, 338}, ++ #endif ++ #ifdef SSL_R_UNSOLICITED_EXTENSION ++ {"UNSOLICITED_EXTENSION", ERR_LIB_SSL, SSL_R_UNSOLICITED_EXTENSION}, ++ #else ++ {"UNSOLICITED_EXTENSION", 20, 217}, ++ #endif ++ #ifdef SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM ++ {"UNSUPPORTED_COMPRESSION_ALGORITHM", ERR_LIB_SSL, SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM}, ++ #else ++ {"UNSUPPORTED_COMPRESSION_ALGORITHM", 20, 257}, ++ #endif ++ #ifdef SSL_R_UNSUPPORTED_CONFIG_VALUE ++ {"UNSUPPORTED_CONFIG_VALUE", ERR_LIB_SSL, SSL_R_UNSUPPORTED_CONFIG_VALUE}, ++ #else ++ {"UNSUPPORTED_CONFIG_VALUE", 20, 414}, ++ #endif ++ #ifdef SSL_R_UNSUPPORTED_CONFIG_VALUE_CLASS ++ {"UNSUPPORTED_CONFIG_VALUE_CLASS", ERR_LIB_SSL, SSL_R_UNSUPPORTED_CONFIG_VALUE_CLASS}, ++ #else ++ {"UNSUPPORTED_CONFIG_VALUE_CLASS", 20, 415}, ++ #endif ++ #ifdef SSL_R_UNSUPPORTED_CONFIG_VALUE_OP ++ {"UNSUPPORTED_CONFIG_VALUE_OP", ERR_LIB_SSL, SSL_R_UNSUPPORTED_CONFIG_VALUE_OP}, ++ #else ++ {"UNSUPPORTED_CONFIG_VALUE_OP", 20, 416}, ++ #endif ++ #ifdef SSL_R_UNSUPPORTED_ELLIPTIC_CURVE ++ {"UNSUPPORTED_ELLIPTIC_CURVE", ERR_LIB_SSL, SSL_R_UNSUPPORTED_ELLIPTIC_CURVE}, ++ #else ++ {"UNSUPPORTED_ELLIPTIC_CURVE", 20, 315}, ++ #endif ++ #ifdef SSL_R_UNSUPPORTED_PROTOCOL ++ {"UNSUPPORTED_PROTOCOL", ERR_LIB_SSL, SSL_R_UNSUPPORTED_PROTOCOL}, ++ #else ++ {"UNSUPPORTED_PROTOCOL", 20, 258}, ++ #endif ++ #ifdef SSL_R_UNSUPPORTED_SSL_VERSION ++ {"UNSUPPORTED_SSL_VERSION", ERR_LIB_SSL, SSL_R_UNSUPPORTED_SSL_VERSION}, ++ #else ++ {"UNSUPPORTED_SSL_VERSION", 20, 259}, ++ #endif ++ #ifdef SSL_R_UNSUPPORTED_STATUS_TYPE ++ {"UNSUPPORTED_STATUS_TYPE", ERR_LIB_SSL, SSL_R_UNSUPPORTED_STATUS_TYPE}, ++ #else ++ {"UNSUPPORTED_STATUS_TYPE", 20, 329}, ++ #endif ++ #ifdef SSL_R_UNSUPPORTED_WRITE_FLAG ++ {"UNSUPPORTED_WRITE_FLAG", ERR_LIB_SSL, SSL_R_UNSUPPORTED_WRITE_FLAG}, ++ #else ++ {"UNSUPPORTED_WRITE_FLAG", 20, 412}, ++ #endif ++ #ifdef SSL_R_USE_SRTP_NOT_NEGOTIATED ++ {"USE_SRTP_NOT_NEGOTIATED", ERR_LIB_SSL, SSL_R_USE_SRTP_NOT_NEGOTIATED}, ++ #else ++ {"USE_SRTP_NOT_NEGOTIATED", 20, 369}, ++ #endif ++ #ifdef SSL_R_VERSION_TOO_HIGH ++ {"VERSION_TOO_HIGH", ERR_LIB_SSL, SSL_R_VERSION_TOO_HIGH}, ++ #else ++ {"VERSION_TOO_HIGH", 20, 166}, ++ #endif ++ #ifdef SSL_R_VERSION_TOO_LOW ++ {"VERSION_TOO_LOW", ERR_LIB_SSL, SSL_R_VERSION_TOO_LOW}, ++ #else ++ {"VERSION_TOO_LOW", 20, 396}, ++ #endif ++ #ifdef SSL_R_WRONG_CERTIFICATE_TYPE ++ {"WRONG_CERTIFICATE_TYPE", ERR_LIB_SSL, SSL_R_WRONG_CERTIFICATE_TYPE}, ++ #else ++ {"WRONG_CERTIFICATE_TYPE", 20, 383}, ++ #endif ++ #ifdef SSL_R_WRONG_CIPHER_RETURNED ++ {"WRONG_CIPHER_RETURNED", ERR_LIB_SSL, SSL_R_WRONG_CIPHER_RETURNED}, ++ #else ++ {"WRONG_CIPHER_RETURNED", 20, 261}, ++ #endif ++ #ifdef SSL_R_WRONG_CURVE ++ {"WRONG_CURVE", ERR_LIB_SSL, SSL_R_WRONG_CURVE}, ++ #else ++ {"WRONG_CURVE", 20, 378}, ++ #endif ++ #ifdef SSL_R_WRONG_RPK_TYPE ++ {"WRONG_RPK_TYPE", ERR_LIB_SSL, SSL_R_WRONG_RPK_TYPE}, ++ #else ++ {"WRONG_RPK_TYPE", 20, 351}, ++ #endif ++ #ifdef SSL_R_WRONG_SIGNATURE_LENGTH ++ {"WRONG_SIGNATURE_LENGTH", ERR_LIB_SSL, SSL_R_WRONG_SIGNATURE_LENGTH}, ++ #else ++ {"WRONG_SIGNATURE_LENGTH", 20, 264}, ++ #endif ++ #ifdef SSL_R_WRONG_SIGNATURE_SIZE ++ {"WRONG_SIGNATURE_SIZE", ERR_LIB_SSL, SSL_R_WRONG_SIGNATURE_SIZE}, ++ #else ++ {"WRONG_SIGNATURE_SIZE", 20, 265}, ++ #endif ++ #ifdef SSL_R_WRONG_SIGNATURE_TYPE ++ {"WRONG_SIGNATURE_TYPE", ERR_LIB_SSL, SSL_R_WRONG_SIGNATURE_TYPE}, ++ #else ++ {"WRONG_SIGNATURE_TYPE", 20, 370}, ++ #endif ++ #ifdef SSL_R_WRONG_SSL_VERSION ++ {"WRONG_SSL_VERSION", ERR_LIB_SSL, SSL_R_WRONG_SSL_VERSION}, ++ #else ++ {"WRONG_SSL_VERSION", 20, 266}, ++ #endif ++ #ifdef SSL_R_WRONG_VERSION_NUMBER ++ {"WRONG_VERSION_NUMBER", ERR_LIB_SSL, SSL_R_WRONG_VERSION_NUMBER}, ++ #else ++ {"WRONG_VERSION_NUMBER", 20, 267}, ++ #endif ++ #ifdef SSL_R_X509_LIB ++ {"X509_LIB", ERR_LIB_SSL, SSL_R_X509_LIB}, ++ #else ++ {"X509_LIB", 20, 268}, ++ #endif ++ #ifdef SSL_R_X509_VERIFICATION_SETUP_PROBLEMS ++ {"X509_VERIFICATION_SETUP_PROBLEMS", ERR_LIB_SSL, SSL_R_X509_VERIFICATION_SETUP_PROBLEMS}, ++ #else ++ {"X509_VERIFICATION_SETUP_PROBLEMS", 20, 269}, ++ #endif ++ #ifdef TS_R_BAD_PKCS7_TYPE ++ {"BAD_PKCS7_TYPE", ERR_LIB_TS, TS_R_BAD_PKCS7_TYPE}, ++ #else ++ {"BAD_PKCS7_TYPE", 47, 132}, ++ #endif ++ #ifdef TS_R_BAD_TYPE ++ {"BAD_TYPE", ERR_LIB_TS, TS_R_BAD_TYPE}, ++ #else ++ {"BAD_TYPE", 47, 133}, ++ #endif ++ #ifdef TS_R_CANNOT_LOAD_CERT ++ {"CANNOT_LOAD_CERT", ERR_LIB_TS, TS_R_CANNOT_LOAD_CERT}, ++ #else ++ {"CANNOT_LOAD_CERT", 47, 137}, ++ #endif ++ #ifdef TS_R_CANNOT_LOAD_KEY ++ {"CANNOT_LOAD_KEY", ERR_LIB_TS, TS_R_CANNOT_LOAD_KEY}, ++ #else ++ {"CANNOT_LOAD_KEY", 47, 138}, ++ #endif ++ #ifdef TS_R_CERTIFICATE_VERIFY_ERROR ++ {"CERTIFICATE_VERIFY_ERROR", ERR_LIB_TS, TS_R_CERTIFICATE_VERIFY_ERROR}, ++ #else ++ {"CERTIFICATE_VERIFY_ERROR", 47, 100}, ++ #endif ++ #ifdef TS_R_COULD_NOT_SET_ENGINE ++ {"COULD_NOT_SET_ENGINE", ERR_LIB_TS, TS_R_COULD_NOT_SET_ENGINE}, ++ #else ++ {"COULD_NOT_SET_ENGINE", 47, 127}, ++ #endif ++ #ifdef TS_R_COULD_NOT_SET_TIME ++ {"COULD_NOT_SET_TIME", ERR_LIB_TS, TS_R_COULD_NOT_SET_TIME}, ++ #else ++ {"COULD_NOT_SET_TIME", 47, 115}, ++ #endif ++ #ifdef TS_R_DETACHED_CONTENT ++ {"DETACHED_CONTENT", ERR_LIB_TS, TS_R_DETACHED_CONTENT}, ++ #else ++ {"DETACHED_CONTENT", 47, 134}, ++ #endif ++ #ifdef TS_R_ESS_ADD_SIGNING_CERT_ERROR ++ {"ESS_ADD_SIGNING_CERT_ERROR", ERR_LIB_TS, TS_R_ESS_ADD_SIGNING_CERT_ERROR}, ++ #else ++ {"ESS_ADD_SIGNING_CERT_ERROR", 47, 116}, ++ #endif ++ #ifdef TS_R_ESS_ADD_SIGNING_CERT_V2_ERROR ++ {"ESS_ADD_SIGNING_CERT_V2_ERROR", ERR_LIB_TS, TS_R_ESS_ADD_SIGNING_CERT_V2_ERROR}, ++ #else ++ {"ESS_ADD_SIGNING_CERT_V2_ERROR", 47, 139}, ++ #endif ++ #ifdef TS_R_ESS_SIGNING_CERTIFICATE_ERROR ++ {"ESS_SIGNING_CERTIFICATE_ERROR", ERR_LIB_TS, TS_R_ESS_SIGNING_CERTIFICATE_ERROR}, ++ #else ++ {"ESS_SIGNING_CERTIFICATE_ERROR", 47, 101}, ++ #endif ++ #ifdef TS_R_INVALID_NULL_POINTER ++ {"INVALID_NULL_POINTER", ERR_LIB_TS, TS_R_INVALID_NULL_POINTER}, ++ #else ++ {"INVALID_NULL_POINTER", 47, 102}, ++ #endif ++ #ifdef TS_R_INVALID_SIGNER_CERTIFICATE_PURPOSE ++ {"INVALID_SIGNER_CERTIFICATE_PURPOSE", ERR_LIB_TS, TS_R_INVALID_SIGNER_CERTIFICATE_PURPOSE}, ++ #else ++ {"INVALID_SIGNER_CERTIFICATE_PURPOSE", 47, 117}, ++ #endif ++ #ifdef TS_R_MESSAGE_IMPRINT_MISMATCH ++ {"MESSAGE_IMPRINT_MISMATCH", ERR_LIB_TS, TS_R_MESSAGE_IMPRINT_MISMATCH}, ++ #else ++ {"MESSAGE_IMPRINT_MISMATCH", 47, 103}, ++ #endif ++ #ifdef TS_R_NONCE_MISMATCH ++ {"NONCE_MISMATCH", ERR_LIB_TS, TS_R_NONCE_MISMATCH}, ++ #else ++ {"NONCE_MISMATCH", 47, 104}, ++ #endif ++ #ifdef TS_R_NONCE_NOT_RETURNED ++ {"NONCE_NOT_RETURNED", ERR_LIB_TS, TS_R_NONCE_NOT_RETURNED}, ++ #else ++ {"NONCE_NOT_RETURNED", 47, 105}, ++ #endif ++ #ifdef TS_R_NO_CONTENT ++ {"NO_CONTENT", ERR_LIB_TS, TS_R_NO_CONTENT}, ++ #else ++ {"NO_CONTENT", 47, 106}, ++ #endif ++ #ifdef TS_R_NO_TIME_STAMP_TOKEN ++ {"NO_TIME_STAMP_TOKEN", ERR_LIB_TS, TS_R_NO_TIME_STAMP_TOKEN}, ++ #else ++ {"NO_TIME_STAMP_TOKEN", 47, 107}, ++ #endif ++ #ifdef TS_R_PKCS7_ADD_SIGNATURE_ERROR ++ {"PKCS7_ADD_SIGNATURE_ERROR", ERR_LIB_TS, TS_R_PKCS7_ADD_SIGNATURE_ERROR}, ++ #else ++ {"PKCS7_ADD_SIGNATURE_ERROR", 47, 118}, ++ #endif ++ #ifdef TS_R_PKCS7_ADD_SIGNED_ATTR_ERROR ++ {"PKCS7_ADD_SIGNED_ATTR_ERROR", ERR_LIB_TS, TS_R_PKCS7_ADD_SIGNED_ATTR_ERROR}, ++ #else ++ {"PKCS7_ADD_SIGNED_ATTR_ERROR", 47, 119}, ++ #endif ++ #ifdef TS_R_PKCS7_TO_TS_TST_INFO_FAILED ++ {"PKCS7_TO_TS_TST_INFO_FAILED", ERR_LIB_TS, TS_R_PKCS7_TO_TS_TST_INFO_FAILED}, ++ #else ++ {"PKCS7_TO_TS_TST_INFO_FAILED", 47, 129}, ++ #endif ++ #ifdef TS_R_POLICY_MISMATCH ++ {"POLICY_MISMATCH", ERR_LIB_TS, TS_R_POLICY_MISMATCH}, ++ #else ++ {"POLICY_MISMATCH", 47, 108}, ++ #endif ++ #ifdef TS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE ++ {"PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE", ERR_LIB_TS, TS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE}, ++ #else ++ {"PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE", 47, 120}, ++ #endif ++ #ifdef TS_R_RESPONSE_SETUP_ERROR ++ {"RESPONSE_SETUP_ERROR", ERR_LIB_TS, TS_R_RESPONSE_SETUP_ERROR}, ++ #else ++ {"RESPONSE_SETUP_ERROR", 47, 121}, ++ #endif ++ #ifdef TS_R_SIGNATURE_FAILURE ++ {"SIGNATURE_FAILURE", ERR_LIB_TS, TS_R_SIGNATURE_FAILURE}, ++ #else ++ {"SIGNATURE_FAILURE", 47, 109}, ++ #endif ++ #ifdef TS_R_THERE_MUST_BE_ONE_SIGNER ++ {"THERE_MUST_BE_ONE_SIGNER", ERR_LIB_TS, TS_R_THERE_MUST_BE_ONE_SIGNER}, ++ #else ++ {"THERE_MUST_BE_ONE_SIGNER", 47, 110}, ++ #endif ++ #ifdef TS_R_TIME_SYSCALL_ERROR ++ {"TIME_SYSCALL_ERROR", ERR_LIB_TS, TS_R_TIME_SYSCALL_ERROR}, ++ #else ++ {"TIME_SYSCALL_ERROR", 47, 122}, ++ #endif ++ #ifdef TS_R_TOKEN_NOT_PRESENT ++ {"TOKEN_NOT_PRESENT", ERR_LIB_TS, TS_R_TOKEN_NOT_PRESENT}, ++ #else ++ {"TOKEN_NOT_PRESENT", 47, 130}, ++ #endif ++ #ifdef TS_R_TOKEN_PRESENT ++ {"TOKEN_PRESENT", ERR_LIB_TS, TS_R_TOKEN_PRESENT}, ++ #else ++ {"TOKEN_PRESENT", 47, 131}, ++ #endif ++ #ifdef TS_R_TSA_NAME_MISMATCH ++ {"TSA_NAME_MISMATCH", ERR_LIB_TS, TS_R_TSA_NAME_MISMATCH}, ++ #else ++ {"TSA_NAME_MISMATCH", 47, 111}, ++ #endif ++ #ifdef TS_R_TSA_UNTRUSTED ++ {"TSA_UNTRUSTED", ERR_LIB_TS, TS_R_TSA_UNTRUSTED}, ++ #else ++ {"TSA_UNTRUSTED", 47, 112}, ++ #endif ++ #ifdef TS_R_TST_INFO_SETUP_ERROR ++ {"TST_INFO_SETUP_ERROR", ERR_LIB_TS, TS_R_TST_INFO_SETUP_ERROR}, ++ #else ++ {"TST_INFO_SETUP_ERROR", 47, 123}, ++ #endif ++ #ifdef TS_R_TS_DATASIGN ++ {"TS_DATASIGN", ERR_LIB_TS, TS_R_TS_DATASIGN}, ++ #else ++ {"TS_DATASIGN", 47, 124}, ++ #endif ++ #ifdef TS_R_UNACCEPTABLE_POLICY ++ {"UNACCEPTABLE_POLICY", ERR_LIB_TS, TS_R_UNACCEPTABLE_POLICY}, ++ #else ++ {"UNACCEPTABLE_POLICY", 47, 125}, ++ #endif ++ #ifdef TS_R_UNSUPPORTED_MD_ALGORITHM ++ {"UNSUPPORTED_MD_ALGORITHM", ERR_LIB_TS, TS_R_UNSUPPORTED_MD_ALGORITHM}, ++ #else ++ {"UNSUPPORTED_MD_ALGORITHM", 47, 126}, ++ #endif ++ #ifdef TS_R_UNSUPPORTED_VERSION ++ {"UNSUPPORTED_VERSION", ERR_LIB_TS, TS_R_UNSUPPORTED_VERSION}, ++ #else ++ {"UNSUPPORTED_VERSION", 47, 113}, ++ #endif ++ #ifdef TS_R_VAR_BAD_VALUE ++ {"VAR_BAD_VALUE", ERR_LIB_TS, TS_R_VAR_BAD_VALUE}, ++ #else ++ {"VAR_BAD_VALUE", 47, 135}, ++ #endif ++ #ifdef TS_R_VAR_LOOKUP_FAILURE ++ {"VAR_LOOKUP_FAILURE", ERR_LIB_TS, TS_R_VAR_LOOKUP_FAILURE}, ++ #else ++ {"VAR_LOOKUP_FAILURE", 47, 136}, ++ #endif ++ #ifdef TS_R_WRONG_CONTENT_TYPE ++ {"WRONG_CONTENT_TYPE", ERR_LIB_TS, TS_R_WRONG_CONTENT_TYPE}, ++ #else ++ {"WRONG_CONTENT_TYPE", 47, 114}, ++ #endif ++ #ifdef UI_R_COMMON_OK_AND_CANCEL_CHARACTERS ++ {"COMMON_OK_AND_CANCEL_CHARACTERS", ERR_LIB_UI, UI_R_COMMON_OK_AND_CANCEL_CHARACTERS}, ++ #else ++ {"COMMON_OK_AND_CANCEL_CHARACTERS", 40, 104}, ++ #endif ++ #ifdef UI_R_INDEX_TOO_LARGE ++ {"INDEX_TOO_LARGE", ERR_LIB_UI, UI_R_INDEX_TOO_LARGE}, ++ #else ++ {"INDEX_TOO_LARGE", 40, 102}, ++ #endif ++ #ifdef UI_R_INDEX_TOO_SMALL ++ {"INDEX_TOO_SMALL", ERR_LIB_UI, UI_R_INDEX_TOO_SMALL}, ++ #else ++ {"INDEX_TOO_SMALL", 40, 103}, ++ #endif ++ #ifdef UI_R_NO_RESULT_BUFFER ++ {"NO_RESULT_BUFFER", ERR_LIB_UI, UI_R_NO_RESULT_BUFFER}, ++ #else ++ {"NO_RESULT_BUFFER", 40, 105}, ++ #endif ++ #ifdef UI_R_PROCESSING_ERROR ++ {"PROCESSING_ERROR", ERR_LIB_UI, UI_R_PROCESSING_ERROR}, ++ #else ++ {"PROCESSING_ERROR", 40, 107}, ++ #endif ++ #ifdef UI_R_RESULT_TOO_LARGE ++ {"RESULT_TOO_LARGE", ERR_LIB_UI, UI_R_RESULT_TOO_LARGE}, ++ #else ++ {"RESULT_TOO_LARGE", 40, 100}, ++ #endif ++ #ifdef UI_R_RESULT_TOO_SMALL ++ {"RESULT_TOO_SMALL", ERR_LIB_UI, UI_R_RESULT_TOO_SMALL}, ++ #else ++ {"RESULT_TOO_SMALL", 40, 101}, ++ #endif ++ #ifdef UI_R_SYSASSIGN_ERROR ++ {"SYSASSIGN_ERROR", ERR_LIB_UI, UI_R_SYSASSIGN_ERROR}, ++ #else ++ {"SYSASSIGN_ERROR", 40, 109}, ++ #endif ++ #ifdef UI_R_SYSDASSGN_ERROR ++ {"SYSDASSGN_ERROR", ERR_LIB_UI, UI_R_SYSDASSGN_ERROR}, ++ #else ++ {"SYSDASSGN_ERROR", 40, 110}, ++ #endif ++ #ifdef UI_R_SYSQIOW_ERROR ++ {"SYSQIOW_ERROR", ERR_LIB_UI, UI_R_SYSQIOW_ERROR}, ++ #else ++ {"SYSQIOW_ERROR", 40, 111}, ++ #endif ++ #ifdef UI_R_UNKNOWN_CONTROL_COMMAND ++ {"UNKNOWN_CONTROL_COMMAND", ERR_LIB_UI, UI_R_UNKNOWN_CONTROL_COMMAND}, ++ #else ++ {"UNKNOWN_CONTROL_COMMAND", 40, 106}, ++ #endif ++ #ifdef UI_R_UNKNOWN_TTYGET_ERRNO_VALUE ++ {"UNKNOWN_TTYGET_ERRNO_VALUE", ERR_LIB_UI, UI_R_UNKNOWN_TTYGET_ERRNO_VALUE}, ++ #else ++ {"UNKNOWN_TTYGET_ERRNO_VALUE", 40, 108}, ++ #endif ++ #ifdef UI_R_USER_DATA_DUPLICATION_UNSUPPORTED ++ {"USER_DATA_DUPLICATION_UNSUPPORTED", ERR_LIB_UI, UI_R_USER_DATA_DUPLICATION_UNSUPPORTED}, ++ #else ++ {"USER_DATA_DUPLICATION_UNSUPPORTED", 40, 112}, ++ #endif ++ #ifdef X509V3_R_BAD_IP_ADDRESS ++ {"BAD_IP_ADDRESS", ERR_LIB_X509V3, X509V3_R_BAD_IP_ADDRESS}, ++ #else ++ {"BAD_IP_ADDRESS", 34, 118}, ++ #endif ++ #ifdef X509V3_R_BAD_OBJECT ++ {"BAD_OBJECT", ERR_LIB_X509V3, X509V3_R_BAD_OBJECT}, ++ #else ++ {"BAD_OBJECT", 34, 119}, ++ #endif ++ #ifdef X509V3_R_BAD_OPTION ++ {"BAD_OPTION", ERR_LIB_X509V3, X509V3_R_BAD_OPTION}, ++ #else ++ {"BAD_OPTION", 34, 170}, ++ #endif ++ #ifdef X509V3_R_BAD_VALUE ++ {"BAD_VALUE", ERR_LIB_X509V3, X509V3_R_BAD_VALUE}, ++ #else ++ {"BAD_VALUE", 34, 171}, ++ #endif ++ #ifdef X509V3_R_BN_DEC2BN_ERROR ++ {"BN_DEC2BN_ERROR", ERR_LIB_X509V3, X509V3_R_BN_DEC2BN_ERROR}, ++ #else ++ {"BN_DEC2BN_ERROR", 34, 100}, ++ #endif ++ #ifdef X509V3_R_BN_TO_ASN1_INTEGER_ERROR ++ {"BN_TO_ASN1_INTEGER_ERROR", ERR_LIB_X509V3, X509V3_R_BN_TO_ASN1_INTEGER_ERROR}, ++ #else ++ {"BN_TO_ASN1_INTEGER_ERROR", 34, 101}, ++ #endif ++ #ifdef X509V3_R_DIRNAME_ERROR ++ {"DIRNAME_ERROR", ERR_LIB_X509V3, X509V3_R_DIRNAME_ERROR}, ++ #else ++ {"DIRNAME_ERROR", 34, 149}, ++ #endif ++ #ifdef X509V3_R_DISTPOINT_ALREADY_SET ++ {"DISTPOINT_ALREADY_SET", ERR_LIB_X509V3, X509V3_R_DISTPOINT_ALREADY_SET}, ++ #else ++ {"DISTPOINT_ALREADY_SET", 34, 160}, ++ #endif ++ #ifdef X509V3_R_DUPLICATE_ZONE_ID ++ {"DUPLICATE_ZONE_ID", ERR_LIB_X509V3, X509V3_R_DUPLICATE_ZONE_ID}, ++ #else ++ {"DUPLICATE_ZONE_ID", 34, 133}, ++ #endif ++ #ifdef X509V3_R_EMPTY_KEY_USAGE ++ {"EMPTY_KEY_USAGE", ERR_LIB_X509V3, X509V3_R_EMPTY_KEY_USAGE}, ++ #else ++ {"EMPTY_KEY_USAGE", 34, 169}, ++ #endif ++ #ifdef X509V3_R_ERROR_CONVERTING_ZONE ++ {"ERROR_CONVERTING_ZONE", ERR_LIB_X509V3, X509V3_R_ERROR_CONVERTING_ZONE}, ++ #else ++ {"ERROR_CONVERTING_ZONE", 34, 131}, ++ #endif ++ #ifdef X509V3_R_ERROR_CREATING_EXTENSION ++ {"ERROR_CREATING_EXTENSION", ERR_LIB_X509V3, X509V3_R_ERROR_CREATING_EXTENSION}, ++ #else ++ {"ERROR_CREATING_EXTENSION", 34, 144}, ++ #endif ++ #ifdef X509V3_R_ERROR_IN_EXTENSION ++ {"ERROR_IN_EXTENSION", ERR_LIB_X509V3, X509V3_R_ERROR_IN_EXTENSION}, ++ #else ++ {"ERROR_IN_EXTENSION", 34, 128}, ++ #endif ++ #ifdef X509V3_R_EXPECTED_A_SECTION_NAME ++ {"EXPECTED_A_SECTION_NAME", ERR_LIB_X509V3, X509V3_R_EXPECTED_A_SECTION_NAME}, ++ #else ++ {"EXPECTED_A_SECTION_NAME", 34, 137}, ++ #endif ++ #ifdef X509V3_R_EXTENSION_EXISTS ++ {"EXTENSION_EXISTS", ERR_LIB_X509V3, X509V3_R_EXTENSION_EXISTS}, ++ #else ++ {"EXTENSION_EXISTS", 34, 145}, ++ #endif ++ #ifdef X509V3_R_EXTENSION_NAME_ERROR ++ {"EXTENSION_NAME_ERROR", ERR_LIB_X509V3, X509V3_R_EXTENSION_NAME_ERROR}, ++ #else ++ {"EXTENSION_NAME_ERROR", 34, 115}, ++ #endif ++ #ifdef X509V3_R_EXTENSION_NOT_FOUND ++ {"EXTENSION_NOT_FOUND", ERR_LIB_X509V3, X509V3_R_EXTENSION_NOT_FOUND}, ++ #else ++ {"EXTENSION_NOT_FOUND", 34, 102}, ++ #endif ++ #ifdef X509V3_R_EXTENSION_SETTING_NOT_SUPPORTED ++ {"EXTENSION_SETTING_NOT_SUPPORTED", ERR_LIB_X509V3, X509V3_R_EXTENSION_SETTING_NOT_SUPPORTED}, ++ #else ++ {"EXTENSION_SETTING_NOT_SUPPORTED", 34, 103}, ++ #endif ++ #ifdef X509V3_R_EXTENSION_VALUE_ERROR ++ {"EXTENSION_VALUE_ERROR", ERR_LIB_X509V3, X509V3_R_EXTENSION_VALUE_ERROR}, ++ #else ++ {"EXTENSION_VALUE_ERROR", 34, 116}, ++ #endif ++ #ifdef X509V3_R_ILLEGAL_EMPTY_EXTENSION ++ {"ILLEGAL_EMPTY_EXTENSION", ERR_LIB_X509V3, X509V3_R_ILLEGAL_EMPTY_EXTENSION}, ++ #else ++ {"ILLEGAL_EMPTY_EXTENSION", 34, 151}, ++ #endif ++ #ifdef X509V3_R_INCORRECT_POLICY_SYNTAX_TAG ++ {"INCORRECT_POLICY_SYNTAX_TAG", ERR_LIB_X509V3, X509V3_R_INCORRECT_POLICY_SYNTAX_TAG}, ++ #else ++ {"INCORRECT_POLICY_SYNTAX_TAG", 34, 152}, ++ #endif ++ #ifdef X509V3_R_INVALID_ASNUMBER ++ {"INVALID_ASNUMBER", ERR_LIB_X509V3, X509V3_R_INVALID_ASNUMBER}, ++ #else ++ {"INVALID_ASNUMBER", 34, 162}, ++ #endif ++ #ifdef X509V3_R_INVALID_ASRANGE ++ {"INVALID_ASRANGE", ERR_LIB_X509V3, X509V3_R_INVALID_ASRANGE}, ++ #else ++ {"INVALID_ASRANGE", 34, 163}, ++ #endif ++ #ifdef X509V3_R_INVALID_BOOLEAN_STRING ++ {"INVALID_BOOLEAN_STRING", ERR_LIB_X509V3, X509V3_R_INVALID_BOOLEAN_STRING}, ++ #else ++ {"INVALID_BOOLEAN_STRING", 34, 104}, ++ #endif ++ #ifdef X509V3_R_INVALID_CERTIFICATE ++ {"INVALID_CERTIFICATE", ERR_LIB_X509V3, X509V3_R_INVALID_CERTIFICATE}, ++ #else ++ {"INVALID_CERTIFICATE", 34, 158}, ++ #endif ++ #ifdef X509V3_R_INVALID_EMPTY_NAME ++ {"INVALID_EMPTY_NAME", ERR_LIB_X509V3, X509V3_R_INVALID_EMPTY_NAME}, ++ #else ++ {"INVALID_EMPTY_NAME", 34, 108}, ++ #endif ++ #ifdef X509V3_R_INVALID_EXTENSION_STRING ++ {"INVALID_EXTENSION_STRING", ERR_LIB_X509V3, X509V3_R_INVALID_EXTENSION_STRING}, ++ #else ++ {"INVALID_EXTENSION_STRING", 34, 105}, ++ #endif ++ #ifdef X509V3_R_INVALID_INHERITANCE ++ {"INVALID_INHERITANCE", ERR_LIB_X509V3, X509V3_R_INVALID_INHERITANCE}, ++ #else ++ {"INVALID_INHERITANCE", 34, 165}, ++ #endif ++ #ifdef X509V3_R_INVALID_IPADDRESS ++ {"INVALID_IPADDRESS", ERR_LIB_X509V3, X509V3_R_INVALID_IPADDRESS}, ++ #else ++ {"INVALID_IPADDRESS", 34, 166}, ++ #endif ++ #ifdef X509V3_R_INVALID_MULTIPLE_RDNS ++ {"INVALID_MULTIPLE_RDNS", ERR_LIB_X509V3, X509V3_R_INVALID_MULTIPLE_RDNS}, ++ #else ++ {"INVALID_MULTIPLE_RDNS", 34, 161}, ++ #endif ++ #ifdef X509V3_R_INVALID_NAME ++ {"INVALID_NAME", ERR_LIB_X509V3, X509V3_R_INVALID_NAME}, ++ #else ++ {"INVALID_NAME", 34, 106}, ++ #endif ++ #ifdef X509V3_R_INVALID_NULL_ARGUMENT ++ {"INVALID_NULL_ARGUMENT", ERR_LIB_X509V3, X509V3_R_INVALID_NULL_ARGUMENT}, ++ #else ++ {"INVALID_NULL_ARGUMENT", 34, 107}, ++ #endif ++ #ifdef X509V3_R_INVALID_NULL_VALUE ++ {"INVALID_NULL_VALUE", ERR_LIB_X509V3, X509V3_R_INVALID_NULL_VALUE}, ++ #else ++ {"INVALID_NULL_VALUE", 34, 109}, ++ #endif ++ #ifdef X509V3_R_INVALID_NUMBER ++ {"INVALID_NUMBER", ERR_LIB_X509V3, X509V3_R_INVALID_NUMBER}, ++ #else ++ {"INVALID_NUMBER", 34, 140}, ++ #endif ++ #ifdef X509V3_R_INVALID_NUMBERS ++ {"INVALID_NUMBERS", ERR_LIB_X509V3, X509V3_R_INVALID_NUMBERS}, ++ #else ++ {"INVALID_NUMBERS", 34, 141}, ++ #endif ++ #ifdef X509V3_R_INVALID_OBJECT_IDENTIFIER ++ {"INVALID_OBJECT_IDENTIFIER", ERR_LIB_X509V3, X509V3_R_INVALID_OBJECT_IDENTIFIER}, ++ #else ++ {"INVALID_OBJECT_IDENTIFIER", 34, 110}, ++ #endif ++ #ifdef X509V3_R_INVALID_OPTION ++ {"INVALID_OPTION", ERR_LIB_X509V3, X509V3_R_INVALID_OPTION}, ++ #else ++ {"INVALID_OPTION", 34, 138}, ++ #endif ++ #ifdef X509V3_R_INVALID_POLICY_IDENTIFIER ++ {"INVALID_POLICY_IDENTIFIER", ERR_LIB_X509V3, X509V3_R_INVALID_POLICY_IDENTIFIER}, ++ #else ++ {"INVALID_POLICY_IDENTIFIER", 34, 134}, ++ #endif ++ #ifdef X509V3_R_INVALID_PROXY_POLICY_SETTING ++ {"INVALID_PROXY_POLICY_SETTING", ERR_LIB_X509V3, X509V3_R_INVALID_PROXY_POLICY_SETTING}, ++ #else ++ {"INVALID_PROXY_POLICY_SETTING", 34, 153}, ++ #endif ++ #ifdef X509V3_R_INVALID_PURPOSE ++ {"INVALID_PURPOSE", ERR_LIB_X509V3, X509V3_R_INVALID_PURPOSE}, ++ #else ++ {"INVALID_PURPOSE", 34, 146}, ++ #endif ++ #ifdef X509V3_R_INVALID_SAFI ++ {"INVALID_SAFI", ERR_LIB_X509V3, X509V3_R_INVALID_SAFI}, ++ #else ++ {"INVALID_SAFI", 34, 164}, ++ #endif ++ #ifdef X509V3_R_INVALID_SECTION ++ {"INVALID_SECTION", ERR_LIB_X509V3, X509V3_R_INVALID_SECTION}, ++ #else ++ {"INVALID_SECTION", 34, 135}, ++ #endif ++ #ifdef X509V3_R_INVALID_SYNTAX ++ {"INVALID_SYNTAX", ERR_LIB_X509V3, X509V3_R_INVALID_SYNTAX}, ++ #else ++ {"INVALID_SYNTAX", 34, 143}, ++ #endif ++ #ifdef X509V3_R_ISSUER_DECODE_ERROR ++ {"ISSUER_DECODE_ERROR", ERR_LIB_X509V3, X509V3_R_ISSUER_DECODE_ERROR}, ++ #else ++ {"ISSUER_DECODE_ERROR", 34, 126}, ++ #endif ++ #ifdef X509V3_R_MISSING_VALUE ++ {"MISSING_VALUE", ERR_LIB_X509V3, X509V3_R_MISSING_VALUE}, ++ #else ++ {"MISSING_VALUE", 34, 124}, ++ #endif ++ #ifdef X509V3_R_NEED_ORGANIZATION_AND_NUMBERS ++ {"NEED_ORGANIZATION_AND_NUMBERS", ERR_LIB_X509V3, X509V3_R_NEED_ORGANIZATION_AND_NUMBERS}, ++ #else ++ {"NEED_ORGANIZATION_AND_NUMBERS", 34, 142}, ++ #endif ++ #ifdef X509V3_R_NEGATIVE_PATHLEN ++ {"NEGATIVE_PATHLEN", ERR_LIB_X509V3, X509V3_R_NEGATIVE_PATHLEN}, ++ #else ++ {"NEGATIVE_PATHLEN", 34, 168}, ++ #endif ++ #ifdef X509V3_R_NO_CONFIG_DATABASE ++ {"NO_CONFIG_DATABASE", ERR_LIB_X509V3, X509V3_R_NO_CONFIG_DATABASE}, ++ #else ++ {"NO_CONFIG_DATABASE", 34, 136}, ++ #endif ++ #ifdef X509V3_R_NO_ISSUER_CERTIFICATE ++ {"NO_ISSUER_CERTIFICATE", ERR_LIB_X509V3, X509V3_R_NO_ISSUER_CERTIFICATE}, ++ #else ++ {"NO_ISSUER_CERTIFICATE", 34, 121}, ++ #endif ++ #ifdef X509V3_R_NO_ISSUER_DETAILS ++ {"NO_ISSUER_DETAILS", ERR_LIB_X509V3, X509V3_R_NO_ISSUER_DETAILS}, ++ #else ++ {"NO_ISSUER_DETAILS", 34, 127}, ++ #endif ++ #ifdef X509V3_R_NO_POLICY_IDENTIFIER ++ {"NO_POLICY_IDENTIFIER", ERR_LIB_X509V3, X509V3_R_NO_POLICY_IDENTIFIER}, ++ #else ++ {"NO_POLICY_IDENTIFIER", 34, 139}, ++ #endif ++ #ifdef X509V3_R_NO_PROXY_CERT_POLICY_LANGUAGE_DEFINED ++ {"NO_PROXY_CERT_POLICY_LANGUAGE_DEFINED", ERR_LIB_X509V3, X509V3_R_NO_PROXY_CERT_POLICY_LANGUAGE_DEFINED}, ++ #else ++ {"NO_PROXY_CERT_POLICY_LANGUAGE_DEFINED", 34, 154}, ++ #endif ++ #ifdef X509V3_R_NO_PUBLIC_KEY ++ {"NO_PUBLIC_KEY", ERR_LIB_X509V3, X509V3_R_NO_PUBLIC_KEY}, ++ #else ++ {"NO_PUBLIC_KEY", 34, 114}, ++ #endif ++ #ifdef X509V3_R_NO_SUBJECT_DETAILS ++ {"NO_SUBJECT_DETAILS", ERR_LIB_X509V3, X509V3_R_NO_SUBJECT_DETAILS}, ++ #else ++ {"NO_SUBJECT_DETAILS", 34, 125}, ++ #endif ++ #ifdef X509V3_R_OPERATION_NOT_DEFINED ++ {"OPERATION_NOT_DEFINED", ERR_LIB_X509V3, X509V3_R_OPERATION_NOT_DEFINED}, ++ #else ++ {"OPERATION_NOT_DEFINED", 34, 148}, ++ #endif ++ #ifdef X509V3_R_OTHERNAME_ERROR ++ {"OTHERNAME_ERROR", ERR_LIB_X509V3, X509V3_R_OTHERNAME_ERROR}, ++ #else ++ {"OTHERNAME_ERROR", 34, 147}, ++ #endif ++ #ifdef X509V3_R_POLICY_LANGUAGE_ALREADY_DEFINED ++ {"POLICY_LANGUAGE_ALREADY_DEFINED", ERR_LIB_X509V3, X509V3_R_POLICY_LANGUAGE_ALREADY_DEFINED}, ++ #else ++ {"POLICY_LANGUAGE_ALREADY_DEFINED", 34, 155}, ++ #endif ++ #ifdef X509V3_R_POLICY_PATH_LENGTH ++ {"POLICY_PATH_LENGTH", ERR_LIB_X509V3, X509V3_R_POLICY_PATH_LENGTH}, ++ #else ++ {"POLICY_PATH_LENGTH", 34, 156}, ++ #endif ++ #ifdef X509V3_R_POLICY_PATH_LENGTH_ALREADY_DEFINED ++ {"POLICY_PATH_LENGTH_ALREADY_DEFINED", ERR_LIB_X509V3, X509V3_R_POLICY_PATH_LENGTH_ALREADY_DEFINED}, ++ #else ++ {"POLICY_PATH_LENGTH_ALREADY_DEFINED", 34, 157}, ++ #endif ++ #ifdef X509V3_R_POLICY_WHEN_PROXY_LANGUAGE_REQUIRES_NO_POLICY ++ {"POLICY_WHEN_PROXY_LANGUAGE_REQUIRES_NO_POLICY", ERR_LIB_X509V3, X509V3_R_POLICY_WHEN_PROXY_LANGUAGE_REQUIRES_NO_POLICY}, ++ #else ++ {"POLICY_WHEN_PROXY_LANGUAGE_REQUIRES_NO_POLICY", 34, 159}, ++ #endif ++ #ifdef X509V3_R_SECTION_NOT_FOUND ++ {"SECTION_NOT_FOUND", ERR_LIB_X509V3, X509V3_R_SECTION_NOT_FOUND}, ++ #else ++ {"SECTION_NOT_FOUND", 34, 150}, ++ #endif ++ #ifdef X509V3_R_UNABLE_TO_GET_ISSUER_DETAILS ++ {"UNABLE_TO_GET_ISSUER_DETAILS", ERR_LIB_X509V3, X509V3_R_UNABLE_TO_GET_ISSUER_DETAILS}, ++ #else ++ {"UNABLE_TO_GET_ISSUER_DETAILS", 34, 122}, ++ #endif ++ #ifdef X509V3_R_UNABLE_TO_GET_ISSUER_KEYID ++ {"UNABLE_TO_GET_ISSUER_KEYID", ERR_LIB_X509V3, X509V3_R_UNABLE_TO_GET_ISSUER_KEYID}, ++ #else ++ {"UNABLE_TO_GET_ISSUER_KEYID", 34, 123}, ++ #endif ++ #ifdef X509V3_R_UNKNOWN_BIT_STRING_ARGUMENT ++ {"UNKNOWN_BIT_STRING_ARGUMENT", ERR_LIB_X509V3, X509V3_R_UNKNOWN_BIT_STRING_ARGUMENT}, ++ #else ++ {"UNKNOWN_BIT_STRING_ARGUMENT", 34, 111}, ++ #endif ++ #ifdef X509V3_R_UNKNOWN_EXTENSION ++ {"UNKNOWN_EXTENSION", ERR_LIB_X509V3, X509V3_R_UNKNOWN_EXTENSION}, ++ #else ++ {"UNKNOWN_EXTENSION", 34, 129}, ++ #endif ++ #ifdef X509V3_R_UNKNOWN_EXTENSION_NAME ++ {"UNKNOWN_EXTENSION_NAME", ERR_LIB_X509V3, X509V3_R_UNKNOWN_EXTENSION_NAME}, ++ #else ++ {"UNKNOWN_EXTENSION_NAME", 34, 130}, ++ #endif ++ #ifdef X509V3_R_UNKNOWN_OPTION ++ {"UNKNOWN_OPTION", ERR_LIB_X509V3, X509V3_R_UNKNOWN_OPTION}, ++ #else ++ {"UNKNOWN_OPTION", 34, 120}, ++ #endif ++ #ifdef X509V3_R_UNKNOWN_VALUE ++ {"UNKNOWN_VALUE", ERR_LIB_X509V3, X509V3_R_UNKNOWN_VALUE}, ++ #else ++ {"UNKNOWN_VALUE", 34, 172}, ++ #endif ++ #ifdef X509V3_R_UNSUPPORTED_OPTION ++ {"UNSUPPORTED_OPTION", ERR_LIB_X509V3, X509V3_R_UNSUPPORTED_OPTION}, ++ #else ++ {"UNSUPPORTED_OPTION", 34, 117}, ++ #endif ++ #ifdef X509V3_R_UNSUPPORTED_TYPE ++ {"UNSUPPORTED_TYPE", ERR_LIB_X509V3, X509V3_R_UNSUPPORTED_TYPE}, ++ #else ++ {"UNSUPPORTED_TYPE", 34, 167}, ++ #endif ++ #ifdef X509V3_R_USER_TOO_LONG ++ {"USER_TOO_LONG", ERR_LIB_X509V3, X509V3_R_USER_TOO_LONG}, ++ #else ++ {"USER_TOO_LONG", 34, 132}, ++ #endif ++ #ifdef X509_R_AKID_MISMATCH ++ {"AKID_MISMATCH", ERR_LIB_X509, X509_R_AKID_MISMATCH}, ++ #else ++ {"AKID_MISMATCH", 11, 110}, ++ #endif ++ #ifdef X509_R_BAD_SELECTOR ++ {"BAD_SELECTOR", ERR_LIB_X509, X509_R_BAD_SELECTOR}, ++ #else ++ {"BAD_SELECTOR", 11, 133}, ++ #endif ++ #ifdef X509_R_BAD_X509_FILETYPE ++ {"BAD_X509_FILETYPE", ERR_LIB_X509, X509_R_BAD_X509_FILETYPE}, ++ #else ++ {"BAD_X509_FILETYPE", 11, 100}, ++ #endif ++ #ifdef X509_R_BASE64_DECODE_ERROR ++ {"BASE64_DECODE_ERROR", ERR_LIB_X509, X509_R_BASE64_DECODE_ERROR}, ++ #else ++ {"BASE64_DECODE_ERROR", 11, 118}, ++ #endif ++ #ifdef X509_R_CANT_CHECK_DH_KEY ++ {"CANT_CHECK_DH_KEY", ERR_LIB_X509, X509_R_CANT_CHECK_DH_KEY}, ++ #else ++ {"CANT_CHECK_DH_KEY", 11, 114}, ++ #endif ++ #ifdef X509_R_CERTIFICATE_VERIFICATION_FAILED ++ {"CERTIFICATE_VERIFICATION_FAILED", ERR_LIB_X509, X509_R_CERTIFICATE_VERIFICATION_FAILED}, ++ #else ++ {"CERTIFICATE_VERIFICATION_FAILED", 11, 139}, ++ #endif ++ #ifdef X509_R_CERT_ALREADY_IN_HASH_TABLE ++ {"CERT_ALREADY_IN_HASH_TABLE", ERR_LIB_X509, X509_R_CERT_ALREADY_IN_HASH_TABLE}, ++ #else ++ {"CERT_ALREADY_IN_HASH_TABLE", 11, 101}, ++ #endif ++ #ifdef X509_R_CRL_ALREADY_DELTA ++ {"CRL_ALREADY_DELTA", ERR_LIB_X509, X509_R_CRL_ALREADY_DELTA}, ++ #else ++ {"CRL_ALREADY_DELTA", 11, 127}, ++ #endif ++ #ifdef X509_R_CRL_VERIFY_FAILURE ++ {"CRL_VERIFY_FAILURE", ERR_LIB_X509, X509_R_CRL_VERIFY_FAILURE}, ++ #else ++ {"CRL_VERIFY_FAILURE", 11, 131}, ++ #endif ++ #ifdef X509_R_DUPLICATE_ATTRIBUTE ++ {"DUPLICATE_ATTRIBUTE", ERR_LIB_X509, X509_R_DUPLICATE_ATTRIBUTE}, ++ #else ++ {"DUPLICATE_ATTRIBUTE", 11, 140}, ++ #endif ++ #ifdef X509_R_ERROR_GETTING_MD_BY_NID ++ {"ERROR_GETTING_MD_BY_NID", ERR_LIB_X509, X509_R_ERROR_GETTING_MD_BY_NID}, ++ #else ++ {"ERROR_GETTING_MD_BY_NID", 11, 141}, ++ #endif ++ #ifdef X509_R_ERROR_USING_SIGINF_SET ++ {"ERROR_USING_SIGINF_SET", ERR_LIB_X509, X509_R_ERROR_USING_SIGINF_SET}, ++ #else ++ {"ERROR_USING_SIGINF_SET", 11, 142}, ++ #endif ++ #ifdef X509_R_IDP_MISMATCH ++ {"IDP_MISMATCH", ERR_LIB_X509, X509_R_IDP_MISMATCH}, ++ #else ++ {"IDP_MISMATCH", 11, 128}, ++ #endif ++ #ifdef X509_R_INVALID_ATTRIBUTES ++ {"INVALID_ATTRIBUTES", ERR_LIB_X509, X509_R_INVALID_ATTRIBUTES}, ++ #else ++ {"INVALID_ATTRIBUTES", 11, 138}, ++ #endif ++ #ifdef X509_R_INVALID_DIRECTORY ++ {"INVALID_DIRECTORY", ERR_LIB_X509, X509_R_INVALID_DIRECTORY}, ++ #else ++ {"INVALID_DIRECTORY", 11, 113}, ++ #endif ++ #ifdef X509_R_INVALID_DISTPOINT ++ {"INVALID_DISTPOINT", ERR_LIB_X509, X509_R_INVALID_DISTPOINT}, ++ #else ++ {"INVALID_DISTPOINT", 11, 143}, ++ #endif ++ #ifdef X509_R_INVALID_FIELD_NAME ++ {"INVALID_FIELD_NAME", ERR_LIB_X509, X509_R_INVALID_FIELD_NAME}, ++ #else ++ {"INVALID_FIELD_NAME", 11, 119}, ++ #endif ++ #ifdef X509_R_INVALID_TRUST ++ {"INVALID_TRUST", ERR_LIB_X509, X509_R_INVALID_TRUST}, ++ #else ++ {"INVALID_TRUST", 11, 123}, ++ #endif ++ #ifdef X509_R_ISSUER_MISMATCH ++ {"ISSUER_MISMATCH", ERR_LIB_X509, X509_R_ISSUER_MISMATCH}, ++ #else ++ {"ISSUER_MISMATCH", 11, 129}, ++ #endif ++ #ifdef X509_R_KEY_TYPE_MISMATCH ++ {"KEY_TYPE_MISMATCH", ERR_LIB_X509, X509_R_KEY_TYPE_MISMATCH}, ++ #else ++ {"KEY_TYPE_MISMATCH", 11, 115}, ++ #endif ++ #ifdef X509_R_KEY_VALUES_MISMATCH ++ {"KEY_VALUES_MISMATCH", ERR_LIB_X509, X509_R_KEY_VALUES_MISMATCH}, ++ #else ++ {"KEY_VALUES_MISMATCH", 11, 116}, ++ #endif ++ #ifdef X509_R_LOADING_CERT_DIR ++ {"LOADING_CERT_DIR", ERR_LIB_X509, X509_R_LOADING_CERT_DIR}, ++ #else ++ {"LOADING_CERT_DIR", 11, 103}, ++ #endif ++ #ifdef X509_R_LOADING_DEFAULTS ++ {"LOADING_DEFAULTS", ERR_LIB_X509, X509_R_LOADING_DEFAULTS}, ++ #else ++ {"LOADING_DEFAULTS", 11, 104}, ++ #endif ++ #ifdef X509_R_METHOD_NOT_SUPPORTED ++ {"METHOD_NOT_SUPPORTED", ERR_LIB_X509, X509_R_METHOD_NOT_SUPPORTED}, ++ #else ++ {"METHOD_NOT_SUPPORTED", 11, 124}, ++ #endif ++ #ifdef X509_R_NAME_TOO_LONG ++ {"NAME_TOO_LONG", ERR_LIB_X509, X509_R_NAME_TOO_LONG}, ++ #else ++ {"NAME_TOO_LONG", 11, 134}, ++ #endif ++ #ifdef X509_R_NEWER_CRL_NOT_NEWER ++ {"NEWER_CRL_NOT_NEWER", ERR_LIB_X509, X509_R_NEWER_CRL_NOT_NEWER}, ++ #else ++ {"NEWER_CRL_NOT_NEWER", 11, 132}, ++ #endif ++ #ifdef X509_R_NO_CERTIFICATE_FOUND ++ {"NO_CERTIFICATE_FOUND", ERR_LIB_X509, X509_R_NO_CERTIFICATE_FOUND}, ++ #else ++ {"NO_CERTIFICATE_FOUND", 11, 135}, ++ #endif ++ #ifdef X509_R_NO_CERTIFICATE_OR_CRL_FOUND ++ {"NO_CERTIFICATE_OR_CRL_FOUND", ERR_LIB_X509, X509_R_NO_CERTIFICATE_OR_CRL_FOUND}, ++ #else ++ {"NO_CERTIFICATE_OR_CRL_FOUND", 11, 136}, ++ #endif ++ #ifdef X509_R_NO_CERT_SET_FOR_US_TO_VERIFY ++ {"NO_CERT_SET_FOR_US_TO_VERIFY", ERR_LIB_X509, X509_R_NO_CERT_SET_FOR_US_TO_VERIFY}, ++ #else ++ {"NO_CERT_SET_FOR_US_TO_VERIFY", 11, 105}, ++ #endif ++ #ifdef X509_R_NO_CRL_FOUND ++ {"NO_CRL_FOUND", ERR_LIB_X509, X509_R_NO_CRL_FOUND}, ++ #else ++ {"NO_CRL_FOUND", 11, 137}, ++ #endif ++ #ifdef X509_R_NO_CRL_NUMBER ++ {"NO_CRL_NUMBER", ERR_LIB_X509, X509_R_NO_CRL_NUMBER}, ++ #else ++ {"NO_CRL_NUMBER", 11, 130}, ++ #endif ++ #ifdef X509_R_PUBLIC_KEY_DECODE_ERROR ++ {"PUBLIC_KEY_DECODE_ERROR", ERR_LIB_X509, X509_R_PUBLIC_KEY_DECODE_ERROR}, ++ #else ++ {"PUBLIC_KEY_DECODE_ERROR", 11, 125}, ++ #endif ++ #ifdef X509_R_PUBLIC_KEY_ENCODE_ERROR ++ {"PUBLIC_KEY_ENCODE_ERROR", ERR_LIB_X509, X509_R_PUBLIC_KEY_ENCODE_ERROR}, ++ #else ++ {"PUBLIC_KEY_ENCODE_ERROR", 11, 126}, ++ #endif ++ #ifdef X509_R_SHOULD_RETRY ++ {"SHOULD_RETRY", ERR_LIB_X509, X509_R_SHOULD_RETRY}, ++ #else ++ {"SHOULD_RETRY", 11, 106}, ++ #endif ++ #ifdef X509_R_UNABLE_TO_FIND_PARAMETERS_IN_CHAIN ++ {"UNABLE_TO_FIND_PARAMETERS_IN_CHAIN", ERR_LIB_X509, X509_R_UNABLE_TO_FIND_PARAMETERS_IN_CHAIN}, ++ #else ++ {"UNABLE_TO_FIND_PARAMETERS_IN_CHAIN", 11, 107}, ++ #endif ++ #ifdef X509_R_UNABLE_TO_GET_CERTS_PUBLIC_KEY ++ {"UNABLE_TO_GET_CERTS_PUBLIC_KEY", ERR_LIB_X509, X509_R_UNABLE_TO_GET_CERTS_PUBLIC_KEY}, ++ #else ++ {"UNABLE_TO_GET_CERTS_PUBLIC_KEY", 11, 108}, ++ #endif ++ #ifdef X509_R_UNKNOWN_KEY_TYPE ++ {"UNKNOWN_KEY_TYPE", ERR_LIB_X509, X509_R_UNKNOWN_KEY_TYPE}, ++ #else ++ {"UNKNOWN_KEY_TYPE", 11, 117}, ++ #endif ++ #ifdef X509_R_UNKNOWN_NID ++ {"UNKNOWN_NID", ERR_LIB_X509, X509_R_UNKNOWN_NID}, ++ #else ++ {"UNKNOWN_NID", 11, 109}, ++ #endif ++ #ifdef X509_R_UNKNOWN_PURPOSE_ID ++ {"UNKNOWN_PURPOSE_ID", ERR_LIB_X509, X509_R_UNKNOWN_PURPOSE_ID}, ++ #else ++ {"UNKNOWN_PURPOSE_ID", 11, 121}, ++ #endif ++ #ifdef X509_R_UNKNOWN_SIGID_ALGS ++ {"UNKNOWN_SIGID_ALGS", ERR_LIB_X509, X509_R_UNKNOWN_SIGID_ALGS}, ++ #else ++ {"UNKNOWN_SIGID_ALGS", 11, 144}, ++ #endif ++ #ifdef X509_R_UNKNOWN_TRUST_ID ++ {"UNKNOWN_TRUST_ID", ERR_LIB_X509, X509_R_UNKNOWN_TRUST_ID}, ++ #else ++ {"UNKNOWN_TRUST_ID", 11, 120}, ++ #endif ++ #ifdef X509_R_UNSUPPORTED_ALGORITHM ++ {"UNSUPPORTED_ALGORITHM", ERR_LIB_X509, X509_R_UNSUPPORTED_ALGORITHM}, ++ #else ++ {"UNSUPPORTED_ALGORITHM", 11, 111}, ++ #endif ++ #ifdef X509_R_UNSUPPORTED_VERSION ++ {"UNSUPPORTED_VERSION", ERR_LIB_X509, X509_R_UNSUPPORTED_VERSION}, ++ #else ++ {"UNSUPPORTED_VERSION", 11, 145}, ++ #endif ++ #ifdef X509_R_WRONG_LOOKUP_TYPE ++ {"WRONG_LOOKUP_TYPE", ERR_LIB_X509, X509_R_WRONG_LOOKUP_TYPE}, ++ #else ++ {"WRONG_LOOKUP_TYPE", 11, 112}, ++ #endif ++ #ifdef X509_R_WRONG_TYPE ++ {"WRONG_TYPE", ERR_LIB_X509, X509_R_WRONG_TYPE}, ++ #else ++ {"WRONG_TYPE", 11, 122}, ++ #endif ++ { NULL } ++}; ++ +--- a/Tools/c-analyzer/cpython/_parser.py ++++ b/Tools/c-analyzer/cpython/_parser.py +@@ -71,9 +71,7 @@ Python/thread_pthread_stubs.h + + # only huge constants (safe but parsing is slow) + Modules/_ssl_data.h +-Modules/_ssl_data_31.h +-Modules/_ssl_data_300.h +-Modules/_ssl_data_111.h ++Modules/_ssl_data_*.h + Modules/cjkcodecs/mappings_*.h + Modules/unicodedata_db.h + Modules/unicodename_db.h +--- a/Tools/ssl/make_ssl_data.py ++++ b/Tools/ssl/make_ssl_data.py +@@ -5,9 +5,28 @@ This script should be called *manually* + `library` and `reason` mnemonics to a more recent OpenSSL version. + + It takes two arguments: +-- the path to the OpenSSL source tree (e.g. git checkout) ++- the path to the OpenSSL git checkout + - the path to the header file to be generated Modules/_ssl_data_{version}.h + - error codes are version specific ++ ++The OpenSSL git checkout should be at a specific tag, using commands like: ++ git tag --list 'openssl-*' ++ git switch --detach openssl-3.4.0 ++ ++ ++After generating the definitions, compare the result with newest pre-existing file. ++You can use a command like: ++ ++ git diff --no-index Modules/_ssl_data_31.h Modules/_ssl_data_34.h ++ ++- If the new version *only* adds new definitions, remove the pre-existing file ++ and adjust the #include in _ssl.c to point to the new version. ++- If the new version removes or renumbers some definitions, keep both files and ++ add a new #include in _ssl.c. ++ ++A newly supported OpenSSL version should also be added to: ++- Tools/ssl/multissltests.py ++- .github/workflows/build.yml + """ + + import argparse +@@ -16,6 +35,7 @@ import operator + import os + import re + import sys ++import subprocess + + + parser = argparse.ArgumentParser( +@@ -118,9 +138,17 @@ def main(): + # sort by libname, numeric error code + args.reasons = sorted(reasons, key=operator.itemgetter(0, 3)) + ++ git_describe = subprocess.run( ++ ['git', 'describe', '--long', '--dirty'], ++ cwd=args.srcdir, ++ capture_output=True, ++ encoding='utf-8', ++ check=True, ++ ) + lines = [ +- "/* File generated by Tools/ssl/make_ssl_data.py */" +- f"/* Generated on {datetime.datetime.utcnow().isoformat()} */" ++ "/* File generated by Tools/ssl/make_ssl_data.py */", ++ f"/* Generated on {datetime.datetime.now(datetime.UTC).isoformat()} */", ++ f"/* Generated from Git commit {git_describe.stdout.strip()} */", + ] + lines.extend(gen_library_codes(args)) + lines.append("") +--- a/Tools/ssl/multissltests.py ++++ b/Tools/ssl/multissltests.py +@@ -51,6 +51,8 @@ OPENSSL_RECENT_VERSIONS = [ + "3.1.7", + "3.2.3", + "3.3.2", ++ "3.4.0", ++ # See make_ssl_data.py for notes on adding a new version. + ] + + LIBRESSL_OLD_VERSIONS = [ diff --git a/debian/patches/lib-argparse.diff b/debian/patches/lib-argparse.diff index fd05b667..0999084c 100644 --- a/debian/patches/lib-argparse.diff +++ b/debian/patches/lib-argparse.diff @@ -6,7 +6,7 @@ Forwarded: not-needed --- a/Lib/argparse.py +++ b/Lib/argparse.py -@@ -91,7 +91,16 @@ +@@ -91,7 +91,18 @@ import warnings @@ -14,8 +14,10 @@ Forwarded: not-needed +try: + from gettext import gettext as _, ngettext +except ImportError: -+ def _(message): ++ def gettext(message): + return message ++ _ = gettext # avoid the definition above looking like a translated string ++ del gettext + def ngettext(singular,plural,n): + if n == 1: + return singular diff --git a/debian/patches/link-opt.diff b/debian/patches/link-opt.diff index 798e795d..315e9271 100644 --- a/debian/patches/link-opt.diff +++ b/debian/patches/link-opt.diff @@ -5,7 +5,7 @@ Forwarded: no --- a/configure.ac +++ b/configure.ac -@@ -3334,8 +3334,8 @@ then +@@ -3363,8 +3363,8 @@ LDSHARED='$(CC) -shared' LDCXXSHARED='$(CXX) -shared';; Linux*|GNU*|QNX*|VxWorks*|Haiku*) @@ -16,7 +16,7 @@ Forwarded: no FreeBSD*) if [[ "`$CC -dM -E - + {% endif %} - + {% if builder != "htmlhelp" %} @@ -15,10 +15,10 @@ Forwarded: not-needed {% endif %} --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html -@@ -26,7 +26,7 @@ - +@@ -27,7 +27,7 @@ + - + diff --git a/debian/patches/makefile-bootstrap.diff b/debian/patches/makefile-bootstrap.diff new file mode 100644 index 00000000..62bdd58f --- /dev/null +++ b/debian/patches/makefile-bootstrap.diff @@ -0,0 +1,14 @@ +# DP: needs forwarding. bootstrap python fails with a compiler defaulting to -fPIE, +# DP: then setting CFLAGS_NODIST and LDFLAGS_NODIST to -fno-PIE. + +--- a/Makefile.pre.in ++++ b/Makefile.pre.in +@@ -95,7 +95,7 @@ CONFIGURE_LDFLAGS_NODIST=@LDFLAGS_NODIST + # of _bootstrap_python and _freeze_module tools, which don't need LTO. + CONFIGURE_LDFLAGS_NOLTO=@LDFLAGS_NOLTO@ + CONFIGURE_CPPFLAGS= @CPPFLAGS@ +-CONFIGURE_LDFLAGS= @LDFLAGS@ ++CONFIGURE_LDFLAGS= @LDFLAGS_NODIST@ + # Avoid assigning CFLAGS, LDFLAGS, etc. so users can use them on the + # command line to append to these values without stomping the pre-set + # values. diff --git a/debian/patches/multiarch.diff b/debian/patches/multiarch.diff index 2bfc68c1..405d417e 100644 --- a/debian/patches/multiarch.diff +++ b/debian/patches/multiarch.diff @@ -7,7 +7,7 @@ Forwarded: no --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py -@@ -710,6 +710,12 @@ def _init_config_vars(): +@@ -710,6 +710,12 @@ # the init-function. _CONFIG_VARS['userbase'] = _getuserbase() @@ -22,7 +22,7 @@ Forwarded: no if os.name == 'posix': --- a/Makefile.pre.in +++ b/Makefile.pre.in -@@ -1377,6 +1377,7 @@ Modules/signalmodule.o: $(srcdir)/Module +@@ -1379,6 +1379,7 @@ Python/dynload_shlib.o: $(srcdir)/Python/dynload_shlib.c Makefile $(CC) -c $(PY_CORE_CFLAGS) \ diff --git a/debian/patches/patchlevel-noplus.diff b/debian/patches/patchlevel-noplus.diff new file mode 100644 index 00000000..cd3f75e1 --- /dev/null +++ b/debian/patches/patchlevel-noplus.diff @@ -0,0 +1,11 @@ +--- a/Include/patchlevel.h ++++ b/Include/patchlevel.h +@@ -23,7 +23,7 @@ + #define PY_RELEASE_SERIAL 0 + + /* Version as a string */ +-#define PY_VERSION "3.12.8+" ++#define PY_VERSION "3.12.8" + /*--end constants--*/ + + /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/debian/patches/profiled-build.diff b/debian/patches/profiled-build.diff index 3e35a220..d0249d6f 100644 --- a/debian/patches/profiled-build.diff +++ b/debian/patches/profiled-build.diff @@ -5,7 +5,7 @@ Forwarded: no --- a/Makefile.pre.in +++ b/Makefile.pre.in -@@ -659,7 +659,16 @@ profile-run-stamp: +@@ -661,7 +661,16 @@ $(MAKE) profile-gen-stamp # Next, run the profile task to generate the profile information. @ # FIXME: can't run for a cross build diff --git a/debian/patches/pydoc-use-pager.diff b/debian/patches/pydoc-use-pager.diff index 6d204568..9fedc296 100644 --- a/debian/patches/pydoc-use-pager.diff +++ b/debian/patches/pydoc-use-pager.diff @@ -6,7 +6,7 @@ Forwarded: no --- a/Lib/pydoc.py +++ b/Lib/pydoc.py -@@ -1584,6 +1584,8 @@ def getpager(): +@@ -1667,6 +1667,8 @@ return plainpager if sys.platform == 'win32': return lambda text: tempfilepager(plain(text), 'more <') diff --git a/debian/patches/reproducible-buildinfo.diff b/debian/patches/reproducible-buildinfo.diff deleted file mode 100644 index d48edd20..00000000 --- a/debian/patches/reproducible-buildinfo.diff +++ /dev/null @@ -1,17 +0,0 @@ -Description: Build reproduceable date and time into build info - Build information is encoded into getbuildinfo.o at build time. - Use the date and time from the debian changelog, to make this reproduceable. - -Forwarded: no - ---- a/Makefile.pre.in -+++ b/Makefile.pre.in -@@ -1347,6 +1347,8 @@ Modules/getbuildinfo.o: $(PARSER_OBJS) \ - -DGITVERSION="\"`LC_ALL=C $(GITVERSION)`\"" \ - -DGITTAG="\"`LC_ALL=C $(GITTAG)`\"" \ - -DGITBRANCH="\"`LC_ALL=C $(GITBRANCH)`\"" \ -+ $(if $(BUILD_DATE),-DDATE='"$(BUILD_DATE)"') \ -+ $(if $(BUILD_TIME),-DTIME='"$(BUILD_TIME)"') \ - -o $@ $(srcdir)/Modules/getbuildinfo.c - - Modules/getpath.o: $(srcdir)/Modules/getpath.c Python/frozen_modules/getpath.h Makefile $(PYTHON_HEADERS) diff --git a/debian/patches/series b/debian/patches/series index 63c72c27..834ffca8 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,4 +1,5 @@ -#git-updates.diff +git-updates.diff +patchlevel-noplus.diff #FIXME deb-setup.diff deb-locations.diff distutils-install-layout.diff @@ -19,7 +20,6 @@ multiarch.diff test-no-random-order.diff tempfile-minimal.diff ensurepip-disabled.diff -reproducible-buildinfo.diff pydoc-use-pager.diff local-doc-references.diff #build-math-object.diff @@ -31,3 +31,7 @@ fix-py_compile.diff ntpath-import.diff python3.12-updates.diff issue108447.diff +makefile-bootstrap.diff +ignore-wheeldata.diff +test-freeze-strip-libdir.diff +issue127330.diff diff --git a/debian/patches/sphinx3.diff b/debian/patches/sphinx3.diff index 13287bf5..caed72e1 100644 --- a/debian/patches/sphinx3.diff +++ b/debian/patches/sphinx3.diff @@ -6,8 +6,8 @@ Origin: upstream, https://github.com/python/cpython/commit/423e77d6de497931585d1 --- a/Doc/conf.py +++ b/Doc/conf.py -@@ -280,6 +280,10 @@ gettext_additional_targets = [ - 'index', +@@ -309,6 +309,10 @@ + 'literal-block', ] +# Allow to build with Sphinx >= 3.2 @@ -19,7 +19,7 @@ Origin: upstream, https://github.com/python/cpython/commit/423e77d6de497931585d1 --- a/Doc/Makefile +++ b/Doc/Makefile -@@ -13,7 +13,7 @@ PAPER = +@@ -14,7 +14,7 @@ SOURCES = DISTVERSION = $(shell $(PYTHON) tools/extensions/patchlevel.py) REQUIREMENTS = requirements.txt diff --git a/debian/patches/sysconfig-debian-schemes.diff b/debian/patches/sysconfig-debian-schemes.diff index a9ce5565..d42228c3 100644 --- a/debian/patches/sysconfig-debian-schemes.diff +++ b/debian/patches/sysconfig-debian-schemes.diff @@ -1,8 +1,6 @@ -Index: b/Lib/sysconfig.py -=================================================================== --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py -@@ -37,6 +37,30 @@ _INSTALL_SCHEMES = { +@@ -37,6 +37,30 @@ 'scripts': '{base}/bin', 'data': '{base}', }, @@ -33,7 +31,7 @@ Index: b/Lib/sysconfig.py 'posix_home': { 'stdlib': '{installed_base}/lib/python', 'platstdlib': '{base}/lib/python', -@@ -234,7 +258,7 @@ def is_python_build(check_home=None): +@@ -232,7 +256,7 @@ _PYTHON_BUILD = is_python_build() if _PYTHON_BUILD: @@ -42,7 +40,7 @@ Index: b/Lib/sysconfig.py # On POSIX-y platforms, Python will: # - Build from .h files in 'headers' (which is only added to the # scheme when building CPython) -@@ -294,8 +318,20 @@ def _get_preferred_schemes(): +@@ -292,8 +316,20 @@ 'home': 'posix_home', 'user': 'osx_framework_user', } @@ -64,7 +62,7 @@ Index: b/Lib/sysconfig.py 'home': 'posix_home', 'user': 'posix_user', } -@@ -602,7 +638,7 @@ def get_config_h_filename(): +@@ -600,7 +636,7 @@ else: inc_dir = _PROJECT_BASE else: @@ -73,11 +71,9 @@ Index: b/Lib/sysconfig.py return os.path.join(inc_dir, 'pyconfig.h') -Index: b/Lib/test/test_sysconfig.py -=================================================================== --- a/Lib/test/test_sysconfig.py +++ b/Lib/test/test_sysconfig.py -@@ -335,7 +335,7 @@ class TestSysConfig(unittest.TestCase): +@@ -353,7 +353,7 @@ self.assertTrue(os.path.isfile(config_h), config_h) def test_get_scheme_names(self): diff --git a/debian/patches/sysconfigdata-name.diff b/debian/patches/sysconfigdata-name.diff index c64e3e9f..61a796ae 100644 --- a/debian/patches/sysconfigdata-name.diff +++ b/debian/patches/sysconfigdata-name.diff @@ -7,7 +7,7 @@ Forwarded: no --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py -@@ -498,7 +498,7 @@ def _get_sysconfigdata_name(): +@@ -496,7 +496,7 @@ multiarch = getattr(sys.implementation, '_multiarch', '') return os.environ.get( '_PYTHON_SYSCONFIGDATA_NAME', @@ -18,7 +18,7 @@ Forwarded: no --- a/Makefile.pre.in +++ b/Makefile.pre.in -@@ -2328,8 +2328,10 @@ libinstall: all $(srcdir)/Modules/xxmodu +@@ -2341,8 +2341,10 @@ esac; \ done; \ done @@ -33,7 +33,7 @@ Forwarded: no -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ --- a/configure.ac +++ b/configure.ac -@@ -164,7 +164,7 @@ AC_ARG_WITH([build-python], +@@ -164,7 +164,7 @@ dnl Build Python interpreter is used for regeneration and freezing. ac_cv_prog_PYTHON_FOR_REGEN=$with_build_python PYTHON_FOR_FREEZE="$with_build_python" diff --git a/debian/patches/test-freeze-strip-libdir.diff b/debian/patches/test-freeze-strip-libdir.diff new file mode 100644 index 00000000..1ffc6ca2 --- /dev/null +++ b/debian/patches/test-freeze-strip-libdir.diff @@ -0,0 +1,25 @@ +From f6966024e86e2530fb6c7fe26b69e5054fc8e310 Mon Sep 17 00:00:00 2001 +From: Stefano Rivera +Date: Wed, 2 Oct 2024 18:24:57 +0200 +Subject: [PATCH] Strip absolute --libdir paths from configure args in + test_freeze + +We are trying to install into a prefix, any absolute path would not +necessarily be writeable. e.g. if Python is configured with +--libdir=/usr/lib/$(MULTIARCH)/ during a Debian build. + +Forwarded: https://github.com/python/cpython/pull/124916 +--- + Tools/freeze/test/freeze.py | 1 + + 1 file changed, 1 insertion(+) + +--- a/Tools/freeze/test/freeze.py ++++ b/Tools/freeze/test/freeze.py +@@ -128,6 +128,7 @@ + # Run configure. + print(f'configuring python in {builddir}...') + config_args = shlex.split(sysconfig.get_config_var('CONFIG_ARGS') or '') ++ config_args = [arg for arg in config_args if not arg.startswith("--libdir=/")] + cmd = [os.path.join(srcdir, 'configure'), *config_args] + ensure_opt(cmd, 'cache-file', os.path.join(outdir, 'python-config.cache')) + prefix = os.path.join(outdir, 'python-installation') diff --git a/debian/rules b/debian/rules index a4e46036..00ae1d1d 100755 --- a/debian/rules +++ b/debian/rules @@ -1,5 +1,8 @@ #!/usr/bin/make -f +include /usr/share/dpkg/architecture.mk +include /usr/share/dpkg/pkg-info.mk + unexport LANG LC_ALL LC_CTYPE LC_COLLATE LC_TIME LC_NUMERIC LC_MESSAGES unexport CFLAGS CXXFLAGS LDFLAGS CPPFLAGS @@ -8,16 +11,6 @@ export SHELL = /bin/bash # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 -vafilt = $(subst $(2)=,,$(filter $(2)=%,$(1))) -DPKG_VARS := $(shell dpkg-architecture) -DEB_BUILD_ARCH ?= $(call vafilt,$(DPKG_VARS),DEB_BUILD_ARCH) -DEB_BUILD_GNU_TYPE ?= $(call vafilt,$(DPKG_VARS),DEB_BUILD_GNU_TYPE) -DEB_HOST_ARCH ?= $(call vafilt,$(DPKG_VARS),DEB_HOST_ARCH) -DEB_HOST_ARCH_ENDIAN ?= $(call vafilt,$(DPKG_VARS),DEB_HOST_ARCH_ENDIAN) -DEB_HOST_ARCH_OS ?= $(call vafilt,$(DPKG_VARS),DEB_HOST_ARCH_OS) -DEB_HOST_GNU_TYPE ?= $(call vafilt,$(DPKG_VARS),DEB_HOST_GNU_TYPE) -DEB_HOST_MULTIARCH ?= $(call vafilt,$(DPKG_VARS),DEB_HOST_MULTIARCH) - ifeq ($(DEB_HOST_ARCH_OS),linux) PLAT = linux else ifeq ($(DEB_HOST_ARCH_OS),kfreebsd) @@ -29,17 +22,8 @@ else PLAT = unknown endif -CHANGELOG_VARS := $(shell dpkg-parsechangelog | \ - sed -n 's/ /_/g;/^[^_]/s/^\([^:]*\):_\(.*\)/\1=\2/p') -PKGSOURCE := $(call vafilt,$(CHANGELOG_VARS),Source) -PKGVERSION := $(call vafilt,$(CHANGELOG_VARS),Version) - -LAST_CHANGE := $(shell dpkg-parsechangelog -S Date) -export BUILD_DATE := $(shell LC_ALL=C date -u +'%b %e %Y' -d '$(LAST_CHANGE)') -export BUILD_TIME := $(shell LC_ALL=C date -u +'%H:%M:%S' -d '$(LAST_CHANGE)') - -SPHINXOPTS := -D today='$(shell LC_ALL=C date -u +'%B %d, %Y' -d '$(LAST_CHANGE)')' -SPHINXOPTS += -D html_last_updated_fmt='$(shell LC_ALL=C date -u +'%B %d, %Y' -d '$(LAST_CHANGE)')' +SPHINXOPTS := -D today='$(shell LC_ALL=C date -u +'%B %d, %Y' -d '@$(SOURCE_DATE_EPOCH)')' +SPHINXOPTS += -D html_last_updated_fmt='$(shell LC_ALL=C date -u +'%B %d, %Y' -d '@$(SOURCE_DATE_EPOCH)')' export SPHINXOPTS on_buildd := $(shell [ -f /CurrentlyBuilding -o "$$LOGNAME" = buildd -o "$$USER" = buildd ] && echo yes) @@ -66,6 +50,7 @@ ifneq ($(DEB_HOST_GNU_TYPE),$(DEB_BUILD_GNU_TYPE)) WITHOUT_CHECK := yes endif +SPACE = $(EMPTY) $(EMPTY) COMMA = , ifneq (,$(filter parallel=%,$(subst $(COMMA), ,$(DEB_BUILD_OPTIONS)))) NJOBS := -j $(subst parallel=,,$(filter parallel=%,$(subst $(COMMA), ,$(DEB_BUILD_OPTIONS)))) @@ -78,6 +63,21 @@ derivative := $(shell \ elif dpkg-vendor --derives-from Debian; then echo Debian; \ else echo Unknown; fi) +# package metadata information +ifeq (,$(ELF_PACKAGE_METADATA)) + ELF_PACKAGE_METADATA := $(subst $(SPACE),,{ \ + "type":"deb", \ + "os":"$(shell awk -F= '/^ID=/ {print $$2}' /etc/os-release)", \ + "name":"$(DEB_SOURCE)", \ + "version":"$(DEB_VERSION)", \ + "architecture":"$(DEB_HOST_ARCH)" \ + $(if $(DEB_BUILD_DEBUG_INFO_URL),$(COMMA)"debugInfoUrl":"$(DEB_BUILD_DEBUG_INFO_URL)") \ + }) + export ELF_PACKAGE_METADATA +endif + +# we inject our own lto flags +DPKG_OPTIMIZE = optimize=-lto dpkg_buildflags = DEB_BUILD_MAINT_OPTIONS="hardening=-pie $(DPKG_OPTIMIZE)" dpkg-buildflags dpkg_pieflags = DEB_BUILD_MAINT_OPTIONS="hardening=-pie $(DPKG_OPTIMIZE)"dpkg-buildflags ifeq (,$(filter $(distrelease),stretch buster bullseye trusty xenial bionic focal impish)) @@ -100,7 +100,7 @@ ifneq (,$(filter valgrind, $(shell dpkg-query --show -f '$${Depends}\n' valgrind endif VER=3.12 -SVER=3.12.1 +SVER=3.12.7 NVER=3.13 PVER=python$(VER) EXT_VER=$(subst .,,$(VER)) @@ -129,7 +129,8 @@ MIN_ENCODINGS := $(foreach i, \ encodings/$(i)) \ codecs.py stringprep.py -with_tk := no +with_tk := yes +with_gdbm := yes with_interp := static #with_interp := shared @@ -248,11 +249,9 @@ sysconfig_substflags = \ -e '/^OPT/s,-O3,-O2,' \ -e 's/-O3/-O2/g' \ -e 's/-fprofile-use *-fprofile-correction//g' \ - -e 's/-fstack-protector /-fstack-protector-strong /g' \ -e "s/-specs=[^ '\"]*//g" \ -e "s/-fdebug-prefix-map=[^ '\"]*//g" \ -e "s/-ffile-prefix-map=[^ '\"]*//g" \ - -e 's/-Wl,-z,relro//g' \ -e 's,^RUNSHARED *=.*,RUNSHARED=,' \ -e '/BLDLIBRARY/s/-L\. //' @@ -280,6 +279,7 @@ p_base := $(PVER) p_npie := $(PVER)-nopie p_min := $(PVER)-minimal p_lib := lib$(PVER) +p_gdbm := $(PVER)-gdbm p_tk := $(PVER)-tk p_dev := $(PVER)-dev p_exam := $(PVER)-examples @@ -300,6 +300,7 @@ d_base := debian/$(p_base) d_min := debian/$(p_min) d_npie := debian/$(p_npie) d_lib := debian/$(p_lib) +d_gdbm := debian/$(p_gdbm) d_tk := debian/$(p_tk) d_dev := debian/$(p_dev) d_exam := debian/$(p_exam) @@ -357,74 +358,11 @@ PROFILE_TASK = ../Lib/test/regrtest.py \ -j 1 -unone,decimal \ -x $(sort $(TEST_EXCLUDES) $(PROFILE_EXCLUDES)) -stamps/stamp-build-static: stamps/stamp-configure-static - dh_testdir - $(MAKE) $(NJOBS) -C $(buildd_static) \ - EXTRA_CFLAGS="$(EXTRA_OPT_CFLAGS)" \ - CONFIGURE_LDFLAGS="$(DPKG_PIE_LDFLAGS) $(LTO_CFLAGS)" \ - PROFILE_TASK='$(PROFILE_TASK)' $(make_build_target) - -ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS))) - : # check that things are correctly built - ifneq (,$(filter $(DEB_HOST_ARCH_OS), linux)) - cd $(buildd_static) && ./python -c 'from _multiprocessing import SemLock' - endif - cd $(buildd_static) && ./python -c 'import _decimal' - cd $(buildd_static) && ./python -c 'import math, cmath' -endif - - touch stamps/stamp-build-static - -stamps/stamp-build-nopie: stamps/stamp-configure-nopie - dh_testdir - $(MAKE) $(NJOBS) -C $(buildd_nopie) \ - EXTRA_CFLAGS="$(EXTRA_OPT_CFLAGS)" \ - CONFIGURE_LDFLAGS="$(DPKG_LDFLAGS) $(LTO_CFLAGS)" \ - PROFILE_TASK='$(PROFILE_TASK)' $(make_build_target) - -ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS))) - : # check that things are correctly built - ifneq (,$(filter $(DEB_HOST_ARCH_OS), linux)) - cd $(buildd_nopie) && ./python -c 'from _multiprocessing import SemLock' - endif - cd $(buildd_nopie) && ./python -c 'import _decimal' - cd $(buildd_nopie) && ./python -c 'import math, cmath' -endif - - touch stamps/stamp-build-nopie run-profile-task: $(MAKE) -C $(buildd_static) \ PROFILE_TASK='$(PROFILE_TASK)' run_profile_task -stamps/stamp-build-shared: stamps/stamp-configure-shared - dh_testdir - $(MAKE) $(NJOBS) -C $(buildd_shared) \ - EXTRA_CFLAGS="$(EXTRA_OPT_CFLAGS)" - : # build a static library with PIC objects - $(MAKE) $(NJOBS) -C $(buildd_shared) \ - EXTRA_CFLAGS="$(EXTRA_OPT_CFLAGS)" \ - LIBRARY=libpython$(VER)-pic.a libpython$(VER)-pic.a - touch stamps/stamp-build-shared - -stamps/stamp-build-debug: stamps/stamp-configure-debug - dh_testdir - $(MAKE) $(NJOBS) -C $(buildd_debug) \ - EXTRA_CFLAGS="$(DEBUG_CFLAGS)" - -ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS))) - cd $(buildd_static) && ./python -c 'import _decimal' - cd $(buildd_debug) && ./python -c 'import math, cmath' -endif - - touch stamps/stamp-build-debug - -stamps/stamp-build-shared-debug: stamps/stamp-configure-shared-debug - dh_testdir - : # build the shared debug library - $(MAKE) $(NJOBS) -C $(buildd_shdebug) \ - EXTRA_CFLAGS="$(DEBUG_CFLAGS)" - touch stamps/stamp-build-shared-debug common_configure_args = \ --prefix=/usr \ @@ -435,20 +373,16 @@ common_configure_args = \ --with-computed-gotos \ --without-ensurepip \ --with-system-expat \ - --with-dtrace \ --with-ssl-default-suites=openssl \ --with-wheel-pkg-dir=/usr/share/python-wheels/ \ - --with-ssl-default-suites=openssl \ MKDIR_P="/bin/mkdir -p" \ # FIXME, only temporaray #common_configure_args += \ # --without-builtin-hashlib-hashes -ifneq (,$(filter $(DEB_HOST_ARCH), or1k)) - common_configure_args += --without-ffi -else - common_configure_args += --with-system-ffi +ifeq (,$(filter $(DEB_HOST_ARCH_OS), hurd)) + common_configure_args += --with-dtrace endif ifneq ($(DEB_HOST_GNU_TYPE),$(DEB_BUILD_GNU_TYPE)) @@ -468,8 +402,9 @@ stamps/stamp-configure-shared: stamps/stamp-patch rm -rf $(buildd_shared) mkdir -p $(buildd_shared) cd $(buildd_shared) && \ - AR="$(AR)" RANLIB="$(RANLIB)" CFLAGS="$(OPT_CFLAGS)" \ - CPPFLAGS="$(DPKG_CPPFLAGS)" LDFLAGS="$(DPKG_LDFLAGS) $(LTO_CFLAGS)" \ + AR="$(AR)" RANLIB="$(RANLIB)" \ + CFLAGS_NODIST="$(DPKG_CPPFLAGS) $(OPT_CFLAGS)" \ + LDFLAGS_NODIST="$(DPKG_LDFLAGS) $(LTO_CFLAGS)" \ $(config_site) \ ../configure \ --enable-shared \ @@ -482,12 +417,37 @@ stamps/stamp-configure-shared: stamps/stamp-patch touch $@ +stamps/stamp-build-static: stamps/stamp-configure-static + dh_testdir + $(MAKE) $(NJOBS) -C $(buildd_static) \ + PROFILE_TASK='$(PROFILE_TASK)' $(make_build_target) + +ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS))) + : # check that things are correctly built + ifneq (,$(filter $(DEB_HOST_ARCH_OS), linux)) + cd $(buildd_static) && ./python -c 'from _multiprocessing import SemLock' + endif + cd $(buildd_static) && ./python -c 'import _decimal' + cd $(buildd_static) && ./python -c 'import math, cmath' +endif + touch $@ + +stamps/stamp-build-shared: stamps/stamp-configure-shared + dh_testdir + $(MAKE) $(NJOBS) -C $(buildd_shared) + + : # build a static library with PIC objects + $(MAKE) $(NJOBS) -C $(buildd_shared) \ + LIBRARY=libpython$(VER)-pic.a libpython$(VER)-pic.a + touch $@ + stamps/stamp-configure-static: stamps/stamp-patch rm -rf $(buildd_static) mkdir -p $(buildd_static) cd $(buildd_static) && \ - AR="$(AR)" RANLIB="$(RANLIB)" CFLAGS="$(OPT_PIE_CFLAGS)" \ - CPPFLAGS="$(DPKG_PIE_CPPFLAGS)" LDFLAGS="$(DPKG_PIE_LDFLAGS) $(LTO_CFLAGS)" \ + AR="$(AR)" RANLIB="$(RANLIB)" \ + CFLAGS_NODIST="$(DPKG_PIE_CPPFLAGS) $(OPT_PIE_CFLAGS)" \ + LDFLAGS_NODIST="$(DPKG_PIE_LDFLAGS) $(LTO_CFLAGS)" \ $(config_site) \ ../configure \ $(common_configure_args) @@ -499,8 +459,9 @@ stamps/stamp-configure-nopie: stamps/stamp-patch rm -rf $(buildd_nopie) mkdir -p $(buildd_nopie) cd $(buildd_nopie) && \ - AR="$(AR)" RANLIB="$(RANLIB)" CFLAGS="$(OPT_CFLAGS)" \ - CPPFLAGS="$(DPKG_CPPFLAGS)" LDFLAGS="$(DPKG_LDFLAGS) $(LTO_CFLAGS)" \ + AR="$(AR)" RANLIB="$(RANLIB)" \ + CFLAGS_NODIST="$(DPKG_CPPFLAGS) $(OPT_CFLAGS)" \ + LDFLAGS_NODIST="$(DPKG_LDFLAGS) $(LTO_CFLAGS)" \ $(config_site) \ ../configure \ $(common_configure_args) @@ -508,12 +469,28 @@ stamps/stamp-configure-nopie: stamps/stamp-patch $(call __post_configure,$(buildd_nopie)) touch $@ +stamps/stamp-build-nopie: stamps/stamp-configure-nopie + dh_testdir + $(MAKE) $(NJOBS) -C $(buildd_nopie) \ + PROFILE_TASK='$(PROFILE_TASK)' $(make_build_target) + +ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS))) + : # check that things are correctly built + ifneq (,$(filter $(DEB_HOST_ARCH_OS), linux)) + cd $(buildd_nopie) && ./python -c 'from _multiprocessing import SemLock' + endif + cd $(buildd_nopie) && ./python -c 'import _decimal' + cd $(buildd_nopie) && ./python -c 'import math, cmath' +endif + touch $@ + stamps/stamp-configure-debug: stamps/stamp-patch rm -rf $(buildd_debug) mkdir -p $(buildd_debug) cd $(buildd_debug) && \ - AR="$(AR)" RANLIB="$(RANLIB)" CFLAGS="$(DEBUG_CFLAGS)" \ - CPPFLAGS="$(DPKG_CPPFLAGS)" LDFLAGS="$(DPKG_LDFLAGS)" \ + AR="$(AR)" RANLIB="$(RANLIB)" \ + CFLAGS_NODIST="$(DPKG_CPPFLAGS) $(DEBUG_CFLAGS)" \ + LDFLAGS_NODIST="$(DPKG_LDFLAGS)" \ $(config_site) \ ../configure \ $(common_configure_args) \ @@ -523,12 +500,23 @@ stamps/stamp-configure-debug: stamps/stamp-patch $(call __post_configure,$(buildd_debug)) touch $@ +stamps/stamp-build-debug: stamps/stamp-configure-debug + dh_testdir + $(MAKE) $(NJOBS) -C $(buildd_debug) + +ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS))) + cd $(buildd_static) && ./python -c 'import _decimal' + cd $(buildd_debug) && ./python -c 'import math, cmath' +endif + touch $@ + stamps/stamp-configure-shared-debug: stamps/stamp-patch rm -rf $(buildd_shdebug) mkdir -p $(buildd_shdebug) cd $(buildd_shdebug) && \ - AR="$(AR)" RANLIB="$(RANLIB)" CFLAGS="$(DEBUG_CFLAGS)" \ - CPPFLAGS="$(DPKG_CPPFLAGS)" LDFLAGS="$(DPKG_LDFLAGS)" \ + AR="$(AR)" RANLIB="$(RANLIB)" \ + CFLAGS_NODIST="$(DPKG_CPPFLAGS) $(DEBUG_CFLAGS)" \ + LDFLAGS_NODIST="$(DPKG_LDFLAGS)" \ $(config_site) \ ../configure \ $(common_configure_args) \ @@ -539,6 +527,13 @@ stamps/stamp-configure-shared-debug: stamps/stamp-patch $(call __post_configure,$(buildd_shdebug)) touch $@ +stamps/stamp-build-shared-debug: stamps/stamp-configure-shared-debug + dh_testdir + : # build the shared debug library + $(MAKE) $(NJOBS) -C $(buildd_shdebug) + touch $@ + + define __post_configure egrep \ "^#($$(awk -v ORS='|' '$$2 ~ /^extension$$/ {print $$1}' debian/PVER-minimal.README.Debian.in)XX)" \ @@ -657,13 +652,6 @@ stamps/stamp-check: ifeq ($(WITHOUT_CHECK),yes) echo "check run disabled for this build" > $(buildd_static)/test_results else - : # build locales needed by the testsuite - rm -rf locales - mkdir locales - if command -v localedef >/dev/null 2>&1; then \ - sh debian/locale-gen; \ - fi - @echo ========== test environment ============ @env @echo ======================================== @@ -821,11 +809,12 @@ control-file: -e "s/@bd_dbm@/$(bd_dbm)/g" \ -e "s/@bd_dpkgdev@/$(bd_dpkgdev)/g" \ debian/control.in \ + debian/control.stdlib \ $(if $(with_udeb),debian/control.udeb) \ | $(ma_filter) \ > debian/control.tmp ifeq ($(distribution),Ubuntu) - ifneq (,$(findstring ubuntu, $(PKGVERSION))) + ifneq (,$(findstring ubuntu, $(DEB_VERSION))) m='Ubuntu Core Developers '; \ sed -i "/^Maintainer:/s/\(.*\)/Maintainer: $$m\nXSBC-Original-\1/" \ debian/control.tmp @@ -1023,7 +1012,7 @@ endif test -e $(scriptdir)/lib-dynload/$$i.*.so \ && echo $(scriptdir)/lib-dynload/$$i.*.so; \ done` - ls -l $(d_lmin)/$(scriptdir)/lib-dynload/*.so + -ls -l $(d_lmin)/$(scriptdir)/lib-dynload/*.so : # Move the binary into $(p_min). dh_installdirs -p$(p_min) \ @@ -1118,12 +1107,22 @@ endif ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)-config $(d_dev)/usr/bin/$(PVER)-config ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)-config.1.gz $(d_dev)/usr/share/man/man1/$(PVER)-config.1.gz +ifeq ($(with_gdbm),yes) + : # Move the gdbm extension file into $(p_gdbm). + dh_installdirs -p$(p_gdbm) \ + $(scriptdir) \ + usr/lib/python$(VER)/lib-dynload + $(dh_compat2) dh_movefiles -p$(p_gdbm) --sourcedir=$(d) \ + usr/lib/python$(VER)/lib-dynload/_gdbm*.so +endif + ifeq ($(with_tk),yes) : # Move the Tkinter extension files into $(p_tk). dh_installdirs -p$(p_tk) \ $(scriptdir) \ usr/lib/python$(VER)/lib-dynload $(dh_compat2) dh_movefiles -p$(p_tk) --sourcedir=$(d) \ + usr/lib/python$(VER)/tkinter \ usr/lib/python$(VER)/lib-dynload/_tkinter*.so endif @@ -1141,9 +1140,6 @@ endif : # fixed upstream ... chmod -x $(d_ltst)/$(scriptdir)/test/{test_dbm_gnu,test_dbm_ndbm}.py - : # Tkinter library files shipped in python3-tk - rm -rf $(d)/usr/lib/python$(VER)/tkinter - : # lib2to3 shipped in python3-lib2to3 rm -rf \ $(d)/usr/bin/2to3-$(VER) \ @@ -1195,7 +1191,9 @@ endif install -m 644 -p debian/README.$(p_idle) \ $(d_idle)/usr/share/doc/$(p_idle)/README.Debian ifeq ($(with_tk),yes) - cp -p debian/README.Tk $(d_tk)/usr/share/doc/$(p_tk)/ + mkdir -p $(d_tk)/usr/share/doc/$(p_base) $(d_tk)/usr/share/doc/$(p_tk) + cp -p debian/README.Tk $(d_tk)/usr/share/doc/$(p_base)/ + ln -sf ../$(p_base)/README.Tk $(d_tk)/usr/share/doc/$(p_tk)/README.Tk endif : # pyvenv and ensurepip files into $(p_venv) @@ -1327,14 +1325,6 @@ endif cp -p $(buildd_debug)/python $(d_dbg)/usr/bin/$(PVER)d ln -sf python$(VER)d $(d_dbg)/usr/bin/$(PVER)-dbg -ifneq ($(with_tk),yes) - rm -f $(d_lbase)/$(scriptdir)/lib-dynload/_tkinter*.so - rm -f $(d_ldbg)/$(scriptdir)/lib-dynload/_tkinter*.so -endif -ifneq ($(with_gdbm),yes) - rm -f $(d_lbase)/$(scriptdir)/lib-dynload/_gdbm*.so - rm -f $(d_ldbg)/$(scriptdir)/lib-dynload/_gdbm*.so -endif ifneq ($(with_dbmmodule),yes) rm -f $(d_lbase)/$(scriptdir)/lib-dynload/_dbm*.so rm -f $(d_ldbg)/$(scriptdir)/lib-dynload/_dbm*.so @@ -1518,10 +1508,13 @@ binary-arch: build-arch install done -find debian ! -perm -200 -print -exec chmod +w {} \; ifneq ($(with_tk),yes) + rm -f $(d_lbase)/$(scriptdir)/tkinter rm -f $(d_lbase)/$(scriptdir)/lib-dynload/_tkinter*.so + rm -f $(d_ldbg)/$(scriptdir)/lib-dynload/_tkinter*.so endif ifneq ($(with_gdbm),yes) rm -f $(d_lbase)/$(scriptdir)/lib-dynload/_gdbm*.so + rm -f $(d_ldbg)/$(scriptdir)/lib-dynload/_gdbm*.so endif find $(d_ldbg) $(d_ldev) -name '*.a' ! -type l \ @@ -1603,6 +1596,9 @@ stamps/stamp-patch: touch Lib/test/libregrtest/__init__.py touch Lib/test/tokenizedata/__init__.py + # Check if patchlevel-noplus.diff is missing + grep -Eq '^#define PY_VERSION +"[^+]+"$$' Include/patchlevel.h + mv stamps/pxx $@ reverse-patches: unpatch diff --git a/debian/tests/control b/debian/tests/control index d7892071..8a87a975 100644 --- a/debian/tests/control +++ b/debian/tests/control @@ -4,9 +4,8 @@ Depends: build-essential, locales-all, python3.12-dev, libpython3.12-testsuite:native, - python3-gdbm (>= 3.11.4), - python3-distutils, - python3-tk (>= 3.11.4), + python3.12-gdbm, + python3.12-tk, idle-python3.12, systemtap-sdt-dev, python3.12-venv, @@ -19,10 +18,7 @@ Depends: build-essential, locales-all, python3.12-dev, python3.12-dbg, libpython3.12-testsuite:native, - python3-gdbm-dbg (>= 3.11.4), gdb, - python3-distutils, - python3-tk-dbg (>= 3.11.4), idle-python3.12, systemtap-sdt-dev, python3.12-venv, @@ -35,9 +31,8 @@ Depends: build-essential, locales-all, python3.12-dev, libpython3.12-testsuite:native, - python3-gdbm (>= 3.11.4), - python3-tk (>= 3.11.4), - python3-distutils, + python3.12-gdbm, + python3.12-tk, python3.12-venv, # need to turn off apport Restrictions: needs-root, allow-stderr @@ -49,10 +44,7 @@ Depends: build-essential, python3.12-dev, python3.12-dbg, libpython3.12-testsuite:native, - python3-gdbm-dbg (>= 3.11.4), - python3-tk-dbg (>= 3.11.4), gdb, - python3-distutils, python3.12-venv, # need to turn off apport Restrictions: needs-root, allow-stderr diff --git a/debian/tests/test-common.sh b/debian/tests/test-common.sh index 4e4e37ec..4e24ec65 100644 --- a/debian/tests/test-common.sh +++ b/debian/tests/test-common.sh @@ -7,9 +7,6 @@ else vendor=Unknown fi -export LOCPATH=$(pwd)/locales -sh $debian_dir/locale-gen - export LANG=C.UTF-8 export DEB_PYTHON_INSTALL_LAYOUT=deb_system @@ -61,3 +58,8 @@ TESTEXCLUSIONS="$TESTEXCLUSIONS test_ttk_textonly" # FIXME: test_multiprocessing_fork times out sometimes. See #1000188 TESTEXCLUSIONS="$TESTEXCLUSIONS test_multiprocessing_fork" + +# FIXME, tests never run to completion on Ubuntu infra +if [ "$vendor" = Ubuntu ]; then + TESTNEVERCOMPLETE="$TESTNEVERCOMPLETE test_exceptions test_repl" +fi diff --git a/debian/tests/testsuite b/debian/tests/testsuite index 7b235ce8..ce88338c 100755 --- a/debian/tests/testsuite +++ b/debian/tests/testsuite @@ -31,8 +31,10 @@ debian_dir=$(dirname $(dirname $0)) TESTPYTHON="python3.12 -W default -bb -E -R -m test" TESTEXCLUSIONS="-x" +TESTNEVERCOMPLETE="" . $debian_dir/tests/test-common.sh +TESTEXCLUSIONS="$TESTEXCLUSIONS $TESTNEVERCOMPLETE" if [ "$su_user" = nobody ]; then log=/dev/null diff --git a/debian/tests/testsuite-dbg b/debian/tests/testsuite-dbg index 4d567998..ec5ddd1c 100755 --- a/debian/tests/testsuite-dbg +++ b/debian/tests/testsuite-dbg @@ -30,8 +30,10 @@ debian_dir=$(dirname $(dirname $0)) TESTPYTHON="python3.12d -W default -bb -E -R -m test" TESTEXCLUSIONS="-x" +TESTNEVERCOMPLETE="" . $debian_dir/tests/test-common.sh +TESTEXCLUSIONS="$TESTEXCLUSIONS $TESTNEVERCOMPLETE" if [ "$su_user" = nobody ]; then log=/dev/null diff --git a/debian/upstream/signing-key.asc b/debian/upstream/signing-key.asc new file mode 100644 index 00000000..90b22ec2 --- /dev/null +++ b/debian/upstream/signing-key.asc @@ -0,0 +1,104 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +C6/APmOJmVcMLJ0h7XxC7aBkrGsDdum8ym50bA== +=FLhQ +-----END PGP PUBLIC KEY BLOCK----- diff --git a/debian/watch b/debian/watch index 2113457e..6b0eb6ca 100644 --- a/debian/watch +++ b/debian/watch @@ -1,3 +1,5 @@ -version=3 -opts=dversionmangle=s/.*\+//,uversionmangle=s/([abcr]+[1-9])$/~$1/ \ +version=4 +opts=dversionmangle=s/.*\+//,\ + uversionmangle=s/([abcr]+[1-9])$/~$1/,\ + pgpsigurlmangle=s/$/.asc/ \ http://www.python.org/ftp/python/3\.12(\.\d)?/Python-(3\.12[.\dabcr]*)\.tar.xz diff --git a/pyconfig.h.in b/pyconfig.h.in index 6d370f66..7d3537e5 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -47,10 +47,6 @@ /* Define if --enable-ipv6 is specified */ #undef ENABLE_IPV6 -/* Define to 1 if your system stores words within floats with the most - significant word first */ -#undef FLOAT_WORDS_BIGENDIAN - /* Define if getpgrp() must be called as getpgrp(0). */ #undef GETPGRP_HAVE_ARG

    (S!m|~p2up82GF~%=j$!>Yif%>?jt^ZqlJE%4BF=oY>c%knOsi!>7a&KnuIM}8u z{S6=ePH#wPxg9o^q+h+Z>riV;3deI>%gG=J8tp{zc=ActF!Y#vjx!&+wg7V9#YUX) z7v$R>HN?Z*gc}my!K=)jnUG#!0@+@}D2+wruoZMWJ`M+E>&PYoJT7Y2kX?9~d?aqs z&ksJbW}sDc$U#f6h9q9_jRr4_{h$m1VI`R^YIdg|S}ZsK3h| z%PejAy;qr>Kqh>!q`X0$BtM_bBRHit3214D2Cm0~_WT)Rl#>FLe z#Y)F=c|j3G{YT(42P-Fs}Y(dhJA93h;oglea;K%S;hssR6EIo)z8fd z9M0Qd7@j3#sjCf0Lr*4^By=r;XK-6zOx_@C#QCP7D`%0mS>2-CYY2?z{)+ zI3>=t+%I@UA|Fyh55TmvQ~%~8yG~nz7(z(Mn5SzZF)0JLf|7whilMPcR`f5O^Dc#e zincsE1F_h1t2jMfH#&>A_RVLwOq4{3Rf-zUqhHTT+@HTg*r)WJzTw!&vD8r-Q2nbU z*pJPZ^F&hL^RT^bH2r6=%k$_vK5RP7y`uUeTBeB{TCYgbYR?q_Zt(6OJQW2 zkUIjh4}?syb4W$iZMqB>?iHjGGfAI`M0j|KHp+ZFL6vUk;|1N8qxR6fx7u7ze^X1s zaGauY9E~j1t{ejCONvqP?~Pu_Uy7qLrL2_j3gx4byWucdnyGtPP^}QQ{odUT82D2B z0d&!FIgkx%UFMXj6331}+OV|5|0f^^mt*Uk@|?Yo#xH>-kRq!h^P*m9f^TcWn31Ma z2DsYe_DtDCaQ7S|Xq8=rb&g^uqYTixq!gcIyBV{z&J^X-Zp(?A05i zE|>xy`zolP;^5nSg<4{Q^t0xkuUQKeydwLYH%fTecs7Q1~9{dynJS}gUQD#(3$$`~~~Oj}wN5DRK}lbwvyf*I8h z!Guli9uSd~`xpaG7-Zhi4yt~@7LbVGRIY;RNI8mG?45f3P+MZ%B+Kd?U1qlp5@AHn z=l^NLbDGn1h~PbSD8un_LFo2I2RacvP3syVGI1%&@A-jMUoyCtqfKW=Cu94a z-86xQa+v1Bvq~r}l>Kcoo`PaY7k;3`A$;vTe#BVZq?pxw|MEgWdW4)rK!7@fzW_Lpn zB%wz*AdqIUu%%C$IyXi$AKte3OC#idsleOW|I6yTPeEe|`fY=iw*zifBYv5262O&N zS1)v*lxFwDZZl}WZ;y%GQMmtjGbBNJXHN8dOJkEw)gho2q)}_0xw=fd`VSIJCK{5T z6#r8X%#ecGUUw?qRz0gH(7&_^WJhWc-dyp9O5=tEFg{blR~f7hw&&j(g_bXV33c$K~FDubgvR-?lsOci7i=5u| zbm~IG!l0{Xgr{W~{iN!FZfos$b+l4&=jzh&MJw#ehv z9Vn9&s(o&13`Pt2*&C=|sLchYRqWEAD)OZa1lTskK5?y8jHa=VUN1v)aG~vj^yv4i z1ZvkiP@yOAT5&5_&}$<_zJ@576H5=wf`j!zDJ<4*BoPvsYngCi&WEr)yc(kOluB^R zzlG~IW`0^;Apq8ctGxTpl68I{&(T+ty10mI!d0LW<<5YZSd_h_)NusRD5taxVHMmlRmtIt3f#~n1 zq*MI-qb4Efpsf?fAuXae;V{0O@6iO`E?ECZ_u@6C1nCzTTtg=uC-`Tyy6+dN%^p-fk3`yl|N_`|s!!ZfB!Lrh4 z3&@E@)KuAYT)F0DRXNlzrlqcuQc|l`mpz8&8S(Te+?juR&v<#%81wf;5P@yXSilAh zMu3PioxEvVqi$|{0opvOQ`-YXwTp8_3t9r^agC`@D)g-NpiwS_nNr69Lg2AM3d{~^ znY{&Qh_HWDJ}@&he*XduAbmE_2zJ6+7qDh)5M56jIjcl4H)fk;NrH%UpTaW)l^C}6 z>8;ds+b$|1cYf=SamX1hycb`rc|)_UYFzTP>O!s0{%ektKgc!aOSDlsemRCs0$z*@ zXxIWjCt>^u61LkM&K|DfVW)gVVqQ4g$l(ikT@aHR8@ZmrjQ@KS_WiLBiAsqJ@h|Z6 zvm9bNdamyJ6w(K;+AUchV+ECaWpAh{A-H{RKUUPOq`e~oa7f&3x+!txOK9`_cOGno z2XrE9sJA&SUI`VSFu=@8W35eWj1W5u{W-VcPBP2_xH0$18b5m&^l5+dk%{4OBQdNSoX7V` zt{9*Dyc!-3zuRVgKpXa~c+dgOevtlKMAy#z_ zaQhd{B3_{k!J_;1C=exI43Q)BGSXut=igs0v_y8rVzBWtuI9ir@J9Z*54g6(DV4~G z<8M%SGmuW|P2<;Oz0X1MA#box`R$9Maq#CKC^2)sTE1Zs63$@Z+B?tM-1 zP&lo5<@Vz=nvn%nPs;8ZQYIW&6*TtQ-7N2Q6NWVl5W`h0Gz3YoE5-iNFHYpJ?OLl( z^=$rJA1SL5bH#4cx7~ts<$YI$$sgteou0p`dI$NlS;2i|gK_Uypa-&W8w29zWqQ@I zt^@YGN0Yk)7%JsKjURPWfe#|9PL!jMAp5o^4VaS5$#42}ZiCZvwxUI@Qro(Bnyjd4 z-a`3B+r@$>`*b+|<|e-?wiyKb1{$a1x=AxsoW>$%o5f>%rJx?<-l5F$i?lK;<+73Z z@1g`wGug(se-~QT(SDkY&l^|C5?LKYWlOqYG8*m?b?rcuT$%LTnkAlb%so3dL?2s! zq@$y%g%KYo(|rSQh&RC(x&XD9vrUJd-DyG6?a@E4h))$qYcXS(vWutO8-OmgJ#y*J zRzjt^{Tn76Ety|$xJ*uc{R#Y=yCiw4jy7mUMC&X54)@d6eHrk@n6cs;4elzERJ-Dr z6u0(NJp4RY{zkZ=3&^74I%PClpI8uL67eUK!CB1zs}>%l}8%s(qXeV%@Sz~LR?(J91uB_AHR{onV;#6c;Dp5}WHTLTF< zAdF8~9_vTYGooOfB(*7E`W$I2h5-s7(rqrE9sBM$uO$ImNWR6;c=lGpKU`t)y;T_< zR{}J1(sgkMwworDi?sSn%umrPC$(ZzeTpe^s5=WAGS)$u(#CoGPNx#^y2ezn)?Qevlq^Htl}E$rH6{C*JZ{(?Cxho(UqlE7%$FVGjt)c6J@sQ`AySIpOvjB&hYU+Y2PQ{N z1~tS=yHkp;shyPuvyd#duDxBL@}#~@J-u)MsfOJ1R6nK|)zlVoMWyTbH^0)E@QVuV z4r|pd3COeZH8C_RS1P|KdC|ZVm_LdQ(*0}h$K_x=krj|F?IoIc){up2mBIX=6^B8% z^LQQ^S_V`7Mw!YA{HWTkMx}uPl`3lVDqn`={sR zfBcqsG=E@L?#9IVnIV~1m99hywnVOIL=d+Q6)F(mR|_z3f07LCOn@dh?3{Gj%2C(Pg+aT?>&nO02`0HuFd5J91)+AVZD=nA7 z+~L_#f%t}KND9d7n9>0bBUv^ts#~M8BLVnxHNQ>U(&MEz=!wl4&xIDajIc21&*mcs zaS0D!u%&Q6F2lpQmC~UzG)$)48?_)O;>|%;dGcK~9}%Gq?`B2f9~#uZ?qr4b;FjBY zB`jHH;M5ig4$qt^?K*4*fB~v?Z8aNKOLBFbl-LN)73md`i8|0m($}gz`EezAUV+wo zr?RW~S7K2KYi;WUnfD#_Px`^s6lqr5pxdd!YPbbOpqi3d0?_bi1h&`)4%`(IFEq!D z2prUzCNG#_X8Ue;#He_KW?5i4;`6e!%y+O;W{#KrPy=svMyfQnV5BZbuWTdO<= zH|8Mp@S2}vJo-49x3Xi0~|weCk0n%!HSwdSYT9Rr(fqgkjs+O9CfgsEB-3`V0C7AQ2H@KV1XFywPAOiA;*k=FBU-O?;sKT5Vy2VcZezp& z5fx|p`1CMjf@hS6a;Wb3NLY+_S3q+ED4r~}jlh_V zx$!tcc>dzILQ`)wMNe5}Rh|3EMY~jD=#w`jDz-EI(z_!Vc^vSsE;;o9SCO_L0JR{1 zR9Fyd9+B+y1?15O=P~$lGZ|(NvFH<#Y=#j0G@k5q7yNWrdOiSZJ|Lk$5PCjeYCa$Q zbdKzl5#$jQ=>Sc#nrNi(aYsK5X0LjU5$Q8&BX_~PZvSnz5mWO;>t-GdU|kHZOz^bxt$jr?$x zL#~{BelHFs^%s3$wzXVY}Z7wGJvp8d-$d76Ln!bEUAQj`ZVG zNWAjp#n$m3@(zK)-Y>Gps*1?gdd zz3uhYu`*OHHlZ|bdyEuh3l2!`H$YzD(6AYD+ce4MM0LI}*+$fsT6|50>-odk3-f{Cuwfc0aF1 z+V0jUCp&;r$L99$VTkgXe$*j2HR)6Aw_zqwb)0l;Pm>H_*wWA9a`+Om1#F7@TaBl2 zKuTWslG^9}V8*Iy4?jFDX=~k!C29Z8fZgMhDQTj1poAeJ2TBIIXYJIO!~si;ou$7_ zL2`s8lyZKc{O;jOf#AZMUN;?7G>UZR$M~@dD#P!Lh7P##p{a)Yeve~xAOm=HF~lM|2DPRx}3h4H@mpZb)?EeQ+d%|X}M$+K=` zbQOJVg{=V}&EVY9o)*M%O=NK&-4s*XRb)D_P8(FZQcDsWIu$<#-tpy`0eYR}Rw>20 zdw;)@dv{O_>Xq&IfVL7r$&e#O8mfumlZZv)rJy`HFN5+n4}hGzfvHeZlJ)Eq?uZwe z!{T@nrjOxcS_5z{Ox2a2)8raad67PNkNzS=5C4{iW5ZPTfyq^j{y7+KRG{dyi%y{j z#+KHjc{g}l{Yf>9z7o$c-)g};c#mkmi#&`zlVgPYZ0$UFrFw<`Oy^dGifvi9Rvu1M)Q;jZK3=*C z#7-1$09Vv=3_=G|f$qo*aVb`q#(y$Mt^$HGNzFG#Iu@vx zE`66$f3m*q&GZgh?LQ!k(Qokw{cb6@EVtV~(vIBz%9UPuAmxJZ`%VQ~@UrX8;+5+! zQ=Ro?=gb0JPue{!Z#k?)T;}t%s3yKzQuN9z!&Tde5QT%TQb;PX){t5%u{xO|6t2+W zaffc)7r4N!S15}>Lq?GfghWp!Iu44jWB`i58%T-8S=n<71|=v-WK0F|0)5=qKvJJ) z5%ft$mYM}!Pf_S8Jl-tA8IV!sF7+FtI%h*mJREH)mofkdSsG}3Wj0gBv4ywY;Y3I+#upu5^|`5tWBJO|g?e^!!r$DTe;H&TeK<9Auzlr&JI& zs@*PK@C@{?n^#~Cn^c&O^k6qTESP#aP`$Jd@Vy$-_VL?WrP82&)N%&`-n?AUWu`$h`6@YgT9;Y0L+cc+6JKQ=P z;GV)=cWbX)$eykpcWd9=$X~^MSBw6%v_5UstOKLbM<%)G!cO7>FGDQ47&LehGSoTh z)CY2W`=}lSS7PPpMI^qHO4h}WO-_H_UB4o#n?Lx@TgQ3W*OqoHJ0BS**1ClYgab^^1! zli;Kl&t1pwX{#wY2j9oY5)fJmQAtu>UFF_05^~5K!I$Ep12fH@=hXk2%_pLTc`}@I zLQz$>BGN=@6SZiWTX$kq(aNuRtGgw&Y02w9UaL1NaAOtx;xe>V)!$$6KIv8}leW%v zG@$s?%wXqgKvv~k?=fgYP5Z;$Rk3iv{>+~zQ6(Se>bLx3D`g_W4o=q{WCnkQZdk87 zzzogzH}1DwCUytMcgQc8=5wS7;uh)^>|(;|<~Ft1^~ybxxNBE=&v5EC+X~(F`W%E6 zP;~zCn-sODPR2mYZXKr#+Bo?e6Wcm@8W-C7Iq#P_IN9!-?FlqhByqTA3b{Yl#mRe& z_Nz|7$HMN8X|OXboMrFM`p~N*Ji^-CU*DEk9hiUMw zk~1Py=j$lz%5h-2MPr|kIPhQTFj+IdWOcMt7Dx*s47T5U9)0ZRPPU^-%?MP4)~-Xg zAhkXTZy)`Xl6TI6SE$V~c39-oej{`^XX=RNCeF`0@<$O4@suA!?K4 zz#drlI~+VIohqw8_WdO110Tn-C^hnz10w4buSUdngno{!R;d1t&Q=kE8O=i_)8``Ep3G^oj-HpS8eDnx9iUxQX!@7R`-Z-mOLJ(-raII-Uz4~ z|NC^V=v)-pC*KSxT(7Lc7^l5xsm&l>7uttpeh(4;H95|*q5-oY1viqBIJN>pg5+$?iT~L$5Dw?DTV#ba~ zJwLP5=a3ovG9R+0q_B=2ODBIZh#Jp#)w&zFV8cd5_poXN3)d54YsHRM3*uamME&W3 zVEZTMIY(|UE}cL9!;m#n`jkUH48)pPYh6aEbrXRlEm7{XhzoD~_FY;i|OwtPVx+?Tn0Q4|FEK{VLMxXxJM-h+#9`X(imY|#h9>B|k*jK#+$-Fp~s z*O&luQo)4YmB+#Z@8vz6g85%xqPC3GG~Nw<5wT?A$2u2;CR3+GtpWdgxXFgsrA` zB{xz*^)7%RG+>(T=Kh=rxt*s{Fh~JNQ6ypFJV@&I)^ET;vvTeEziG4>L5N^@e($W- zD%c4`eG1k35wTtq+zITv9pZzdQa+=6C5C8D{jmca4i6;DieDM!F#5~@d^#m||LLMC zF=0sh{oWdf4!QuluDY|=?=?0x`fx1xj)7;D_00}p3^HubL#pvdUe4tK{ zix(&9sRq8RM4k1|n>MWJ8kA;Phu3rLV8oUHK?z5Fi0jma2uV0mwUIM+sR#TA;(h+T zGPyJmEePV{Go+8m((Hvtv*=UaSL068i>VR2cm8DGo=6b8VV3J*+Mzhl)&`? zLarm}$QkRUL2kas0_X*NOjrDA{iYQ<`5bIO&{ySN3nJ$7exmx&@* zsJLyBGiIIQR`2~8ca%-^f7=+LP@}UM)NXu=HwFQDxZClv6*O)B-_*r*=~#& z)o#l_IOBcO^xUv07hih^reVBjYSiteUQx@;LC~QAb(zmqN-ed;8WT;Mi@yr=I44;9 z^?{Opz3rq9)F_ZG3O1&Wj79c5m$P9dWlIO4oY|F5E1zqRMC6Uwri>gqTGpnCi*9V? zx+-8_OcFo;OF08i(m}NZ@eQAcI{Uxv8625o!$gMHYfzv@S#vHm zysq+2*WCr)7-PCSMC6jz!8#Bm7I&-kWQSStZWTskL^vVC>b*~qL$Z%f;IU8_jSD32 zk64)}s7wO*VmAIk_tkT8~ zCa7=ZM3y5G#h4|(vv8p5s)HlK9Lhn0oG$_b?vGAj>MJ%G&=1mK=+K{#(f5~tjx%-4 z5s-;+NBO^83J4CK3n4`OYDBH3n`BB&uPR1eoU8nyC@!KNnS{P6DxR|$COD7dn*61@ zouFodO^T_H^%&wkIqY%f@3%-5kIFgijVczuDCe=nv?(W+39bi7ga(nn)qk7(JCKBv z5;s4fBdC|#jaUzG5HF~6#2J%w!}&K`;xwv8>8!ubhLBNR@;sNvv5=%@DTE%06x+-K z8L#X!H#PwJh_79%gs{N^lqAMa!si>I)8T^~r842486;`X{_Xw*cPQ5`9DaT}C5T;b z5(+3fCj`nUtB!at6w?B)@l zsa*3d*nXnuH*u1YRI|yhtpwfvlstF%(*l$GSF0*YoqqGHmG~5KGy;cqD9W814t3wqNU)o8dl*q=eL+SFVB}Z*o zF~Phg$4sMR!bZm~q9(rtQ~U?eveC--AO8{vb-lY=L(Y#(Uk+W;0ug6f4io#XkgSAd#A<*?cCcdoBYzR`W^V= zPLL9;uY?5-Sdd0D(ku9|1B|_74JdgMPJ~Bq_7B1}cH*a@=#DMq%pG9Y#H= zX?N^kBGrz>L8FIk3fE?NsE2A2o4T;d+crK`T=O*pjUC+<|DO;6x_qH#~)q8o_}HzVd; z`A!tDv<<2axzB&KZ2#5L{?wAI=}0nWVfUbeCN)#2u_E%oyB!I%A#thX=~C$-_FzyK zwkSAWlaWdP7CFGer(jgRR5w=xkw(5!CP{iV3xA=4mIet2JW~PxF9pf;M?nhlJpEXc z_l#>^i!F(>U5jmIko3;R_#5hC*!FX;Lj|EwQQ}R+%Pik^jSKl>FOsfAI4{zp<$cES zNM^2{vn<#AGb_L~KeOVoB5|;htCW}qYnJKu->fLlh;jKc>DL12sV%p);@FztL*gzQ z;Ztgt{}K@YjXp`T8v&5jOl~FJEyn(pa$OfX9d}q4I*Y0yKo#lnR*=2s? z%;Q0SXHnsMePv1MbL{gHuYE^W`(JS-G;=JhxV*BH@Tk17|KVYIW=HK3^F2no3%!46 z`75llT4G5NR9qPM;eY`mxxon=`U|#KF0$4wiIb98S_K^?b#W%}VEpK~$eGO1C9wlc zl3oN;ZgoXYesNh$OL5j>%<;&~1&LdwfxAL)YDQJY7gMHtMM^GdImEI|`-kqO%@17_ zcG%FV{SIO1DmNJR|4CPczA7F5TI$%G-0A4Haj_jEcrK)#A*rG2$IAH|n(ojAtNYgG zqc4dfGK{B@R2vFUI*|^Ip|neSqQMP@>^~C8#^n2n;FserX2p&roQ;X?U~cIsYVT$e z_A*IjG{2`AyD#GE2uQE=TTJHz>#9QfnUL}0I%US;R69hBG@%=io1YOi$u%h{CTs>t zolm%w@Tgt%)Z*m08CW#U{^5}KNBx(j;t2HjFI>@}6 z8lmJPC!n?;*RqPLd}Y+$LhI%s+-mjHpmuwLmp6aO>zvhiB&jf(72^>YlEezI>*?RN|dR7^0NDknE*BGk#r z-{NKR&-q-3;OLywA{vNJg3hQtRNwc90ZLGmhZ>iwASyjOxJ*O6OtDp!eID^A>p=;8 z6`HOP!K!}R%3JFS(x;x#{>1Ygk^L;Ky4Xm!1+`}dktDE3t~ei=CXINdU#FiV!3CT5 zyg;!XMZYm!qoBR5BwyT19OY-fHNgpy|XXEP~$KobTbtlB;m zp_!%D3m-{h`-8WAr-dzUR8FN)^Ik_dZZA`(+ z)<0=iC0|3Tn@wfO{}dIsAN3p>12$x+0T@Hez zQyx(C-0hrNgGcP()(BSj$Gk|)AuIJQ?F5gya%t2-aXiw85W1w{+;Gkko~hH{@!~(l z*+12+NAaV9ox49}e+@}ibmUN~u+UBcoq^LdtZ)`1)6Z>@u5lRoYj$@s@N|9B3Pqve zSh@8ogQG)(lyud{1C%BI8f$l}T93v}LF&Ua1yKL-#e(et0Yf0-rka_h9{RiAZ}W zQ9Jdc#>OTokh9{9k>654`2x_|)iU5vdSi^y>H|yTm-)PI3yEk_eD@r4=P+#4!G7pj z$EMb(`4_{ACizp4K@O25si%KCc0|alr-B;1kN)AakNx;waQTVXOSiQX1ntaU0jS>E zZbzN4L2vKd-jGGL*rr5sq3w7^m{K~==xzGQHn3-{fT`uE`EtJYBZfoJUq2QE>>2aq zybGm9DxXnl>zIQY_y~=p5_8OnPHX@IVp?0Bf28R81G%9J^p~)3o0QF z0%mZ${9BFh>y?#C5~YI_Bpn{xfcP-9xnsp&b-<}o*v%+r-TI}wI)3YElhxuiI;#EN zc-z4dnNpIFef(poZDPOJR!d@pH;bVfIsiK4_Bqau4WT^kk=qc0H+b1Ei1CUJt?>xq zVm$`r8oFAL(@B0SHXPDRW+*AD5dImi0p>l!=}fd@eQLfs9;!v@T=OEKAVypH*;Fpy zOtzdU{P%6-a7SV1tir4BsVt~4=`dIDD-;mHc@hdy;pNgBa47<--KW;GDap|6?3_Ck z2j9q6bD^b)@@}12X&cutJ%syNnh#u#YD(z!4J_2oQ3-@xVT2bZ4u{yNE8k~K#HsbR zRz=po;cZ($X3%z;(8y1yM8FVg+920G7+;%^Jq@bJ+;ta>9Va!@U8Xs-ws9P3< zPRj%&PBpaU2za~~wj?>A#-46Z%?HvUfGj6b4*$TmbSqHMu2zLD@o!-AN?G6qDiJ_s zTvV?s%co7yE<3*4*91DN=2|V3FDbk&W#zp3LQi zDu!H@#oQJ4S<@_h{zSB(wF`|^g^QHh6gpfJG3mUlaZ)fo*c5b>K}o2v1WejxL@v4tC@kOxV*Tkx})pB2v^1=(o{g%vax;gg&o_=t$xw z_Dn8HfU3JzZcECUQdG?-IfpX0TWg>C-7+HI?w3p;8Lr{B!;V3{>F2`QI$pQiZI%14 zi9pyU|Mxh2`4*xw5BxRmUGOMhei#qzeF|3e&qdw_w#CX)O-$wD#@wpgA1~=+S_$}- zD5|`!rKd5|hC@m1j5oNQVXhH5wO04PJitW`_WGPL_=9D2O8T7Bcp@I#Yn}F3?L7Zm zd;Eqwd=aI-e30aH>VgZ;aoDYB#yG@xA=Lc{u|S!r2%X%Uoy(?KXY$BVt|4RJ=bWc35bPQP$vz0m8{iu%Wb+I z?ejBdc)*Bf*j{BwBH6FHci0`&1D(pFh#|Ly{!Iua`K7Md zUr>WIUe{xh`?)rKp@{mNGQ0=?f$-;F2XN^2aIYjLpn@S+7IgWK7vTdIQN88L`6C_qLPZ$Kn{#FUij zV*~)TD$B6)3ybN*^6%`cFF1$8)(AbFLDI!rdqYs63w|1zvjBY{jCltaXEplDnlRL- zeSwB$Z4J86pbx8#TAOQioWKnWJ z>m92~i8uxSlNsb$bWNGgUleE)C0A0q;E<<{W+qSSS53NlD%&T;po}`%FJw3i0gH)* zN)f7XN(eyqkP_oUcmbKoE(zo#wGEx~*2wZdC??KhR|WaCjhV@VZO)@ z;cClWzgw37LDxG5XA-q*xUp^9w(U%8+qN~aZF^!*oV>AZOl7aGV7o z6z0AUd7&j|o((+sA>ZnKtWfp3k8t3Yq3Za#@eLqVVPr@sWo@mSqWv;XnSfGF+ywD| zOVd-X8va(*h@~>6yfM=9k-XR@m47j6dFtMCLE_v@vZqJT0?$!uC!cWIHQA7bxr|$l zx{&t#mt_|=<~P|uOBz;i5}#SP0?tRgn<5tsGVS6{eIfpLw$z3+C=RS<*n;R1$c6E^ z>NyNhis5v27ww^u#`F}&eBYwBbou6Gw9+A+V;cW~>3S?~uW(C|1L{Lb$XzUpIBxxq z1x3)JI@>rFzX}qL7hNYCVr10xE7f0+mCQ5Dj3i3+<*!IhEJzE zDjmw&AemW~_ugSdr`-;UP2C2iw^KJI4(hxMJP9 zL|vjZnXGSZVdy@5)Oq;Wz$!DV1RkV)Y!&xBK%fp5IYJ0`AhQ0d(5ZG*8C?4NSFy}H z)A+p$g+vc&Ao%?>URm1uqX!}}!|WvPHksb{j|dKT2jp*F;S(LIvx6i(W+VMfLd=?m zyma^_T{XSi43Qz$rdH!GS{Z!@`%Wdzlb%y4S^Yq6L$dGj$aO}+X5zJ_b{aJB@2QF~|vKoUM#F(ZU z5M{KkI-g$uLS2XvR0Az=%~2u^j4bl?dm?kfn<86Wdw)!yg!IdOuxRai-~EJGJSK^^ zSELd$C|npnFh}D#=?5qGL;v4c)Om33(^znJUNx+uR-PthRCN7N`|c2Sl+5r4j8XxR zGzr0F;Yi;=w}WTNF{M_!wpJ(-%=4eFmKJ1*iaWQL;=wEUR7nkNzKOl>+hH@WEw-nD zYd`nUMukDmSN)$_Jrh9|W?NiZFwB+$>s(qfO1lZH4;^X$H-%pskBxs{xWnD=(-X+} z+o)Cb}cM*GB!WIh6N=p&Z{t&#Iqd#jlAzcWDgJ>)-bL`ijtrkX>YjDaie82NmjA@cDcwjwS*Aj@u#asbhzm>;EfdHr@?;+Mubx zb8l(3G+gO%Fc1qT2FjLCgQAUsbxgW&M)-3FYhd1_Xst&BJOnJ28TIGB!@!~yL{$OG zr^G;12d|7U(!00cJ0^$>W1N&q23WPTO}b8?l*t0s{n>5TL3?@WqGI zr!>inG8dH@i!zs!0e7enThjw7;^ma^DSxL$<<&J8l=|>suRJt2*%~wTZKehQp>#D3 z`bmksC{rUiDhzptKc`wa_Ic@AIa2sy+Bg=w3LqIdV7o17Gc&%O*pWZ0z?iQa30n1x9Z+X3Xs+fh+; z%B{Po>zC8?oIW_D=(`FVMMZh)3vnZW4n#f^3310k4U8Yp`#a*`@bmk<=$n}zOS`%v zWzvy?%^odA@+ra#r%>4Ki>0{N^-5!Vz>h76-aO;hgb5O_KYoqAm8DSpf7a$7CTfLnL{nL_f_E>}FNyh%#iLZOyTYD&@I_QX-l8{+s3JE> zz5~N1xVGPcD=zDybl537CXm{dM0A3#WDA!E3f;y7cDKGp(La2@iJHI2{52@%9d8&9rMWe;Fjld+bxCh?iom_H-?#E38X> z@K7vz!|&`>J0pG}M$G}uxUEZ*e90oFBtDe-4rmPh zz9X>s+OSOy;kfO)t-{l@OS`T|I+OhgS}0N44@lYpEuo6nT>wG#m_C&v>9BMIcA$5}F3Cx0cZxOXu#Dt0#bhV}ME#PCV z$sHVE@o|1P{&YlgoRVJ1X-zZ;o!5ryglsA$bA|u5ScncuR>CjKI?jYqc%3zs3p6hU zI2bW>{--&QzMIqWTJS|%zbEHG(kEFzkK8Q(jp{(=7OaBb)06zqs#Dh?QB|@>pO!LT zgw=B61pOJI8Jq3q1||XlIBT=hDV%ELlXP6el*)V^({!#HUV|jT){jjx7{_u4LQtoJ zd9r`o{ey(>_2}I0c@kbvDT5W=>H}qV+5GCI9y*WD0%!Q+h%d}c`d9x3Yp=FlXS(3i zMB3eGW9fAg8rPHv#~FW>5>`q#KHwMT!QEFKf1=>)qFG%>z}&kaF6wlPR=c%$ z)sL{OtS86mi&0MzwvBjUh}h2zs-QJ-B4?udZL_doGv<1WYEqz|{>1QsKi)WSB_|6| z?cU;mpkxf7>e`}sPg(a6>fWMo5B&~USF|xBqG%PL?g&XN>sUj|#qu5!+BO#X+KN!< z8W^B_iy-718QUR^{0A#V0l!9)rc|Q5xL8q_bly9-6hSKT^jrM%w+RFa_!`l^%@D}) z#(MW*N>DuV!~o@IvrJ@M>6W!b8M!()-Y}ERIm&!IRI;3@mc)frXomvUvtx&Z!yQQ# zp{ZgwXl$kQRW37QltT%L<|da33cbraj|_S&S8x&(5n^%@9gt-L8XU%(zaZL1eRIIx zn*eJ0_vPvx1;V(&jrovxBObb+7J;w9vDjia2Y(b4uyXK0D13#A8(d-iKbH;N-0dd^ zSN0B^4q%5=&aq%N$x6}%RP?G;E!HHLYim*)c5SXG{sbQ{M^xL7T!w{RT-yHcIB4liu^4Lq@Nj=%j=<&-hWm+q_50I6^rXlJN3& z%t+?9@y8vo5TOA6ym9k8=8kv9_9*OaN$v_c?u5wYHu|vVMpXKwiz;K?gv`9YagHH~ ztUpPP*g1-uvJ^4H8@l16hlXBm9&omc7XMx6KVqSS`2Lvq9(rUIFVj>Bl^YUuxu3bC5L-SW0TIT77bncCx%a zIGJ1t(Aj6{orz$xf9uPS@kKm5u3-6p!e=csA%HJj%g>30Z6wsNb1;K0XxN>eT|%{u zwjP51W@yu6r3rz9FT;Fdl9YFfwTTTub>iJ6H-&T>Ep2+z^N^sctCu1wj#`+Gy6=z! z+5c4jCsad=3mDFwF$)K#Qb1tf^}C9hzAqjwyObjBUO@5D_YRdrmZmvxQsPZ7ib58Q z-LJden>{nF^#)4R$l|yUiUq5RZ|F=)3C(={nm4FJB6vJ)M`{59Ja@XqA#H|bzE0N& zEx-#^N7&<{sN}9SM(Ll#_WBou!-{GKG~e}S7-qN=snX4Ep}=c7*s#UkGabwL&?Iaj zD9b}fc`hpF97XYJysWV$CofX3yF$NAW20CHfh2edy)gh!S~Yiqx!6OL5%~a7B+Rn7ceS97k36#bZyT{Fri3fXA^YPi18k} z1J#3bbk1yN#T7iTD^gS@p(F|a{===D2exQi)IW+{$ukOsXDKCWUc=IeMb>-tXWXNlZCVvxCDu*897aBZm8) zx{Bdyq5pR=hb$ArNKbA0M~qV)?Fq%mcQJHc;4(U-;Ib{O_x-+0GtXq5TUl)o>&iP& z`z-aMoUEBlCKzQIV36XW5Y#Z2@1QOyp_KsKPjmRtTCRK`6BTt)siu>OtY(slKRrqZV^$V8rP!kmi8*sSb$LtW0RI zm2kKb(R0F(&{0`wem9$KE(x>an{Ht+H!x7Qm7J?LB#5~1yVRv)(4yp8YaJe|w#0B+ zUh)}KFCI*s4=*c){zCd)&APQDM7SD_~pXL+bob&o8f)LPZH5Q{@YBb|OzBHeJ~RjN9X!^=5lc|r{+DMaXw zQF408r`F{hO*36`QD!RvIQl0#Yc2T5JSLfsXTz{>6$f@x11^%=dXq%om~yMHj%AKs z^OHjeUl=v3+8KYe+iXwPucS}d6kNmgl9r_T20?C;ZT5miJ5uDIV`e;MVWImqrAn+_ z(%-}4(-+GRnkA=)z{Tzz$7wC0Z$4znssicnzU`GZL5uCO+QFyx?#%>jyOGxjE^-4E z^{vY2TDwgTanx3o)?=ds%TCj?eN-;>^l#38l)uj3DdHfSKexi1e=IID7T(@>?Vg6< zM7VD8X1n8qnaBndf7O;3$==x zUm;ENUes-fn@eh(BiR%gsKY#?`S=#QkjTGtf??%~=by07ln8*~c4Z#}&^RfVL{69Y zN?@3{dLce&bF@=c`D>1<7zf8wKh8%5p?dVK^p7pwefGi+YKG1;Qw6y_O|K z%$i16t57m3HNmyeL7hkB?gLu!E+R?GayRehjXwA}Hg=O=hnLX(z2V*+Ivv|rTP z%+DnUb-KUY%x=J5yo;pd6YYf&`mq{p^$12?F@tJf3Xr^p@@5eAm}J}MLZS#kLSX`llhg4ydd0D>srN>O2y z;5L$6;`i*V4MVQ|oa>LB$1)<(@!!cZx&bhST&m+M=wQ|H7_J@>XSU?w`sXAE)%i^` z2F7HZNB@dFkA^){FI#AQQZ9bX(mUDhxlDhhL_U(dxSC-}5|5Me((e~%PvTyO*=zYz*OM?7Og~DD0_z8qg;oY3=j+X29 z9BAqRuh&?@#T{c*Du8=sxb62u6{w_Ml|}7Vp;H=Lhap;__v0}&lTR+@(KVR{fVw1w zwS|U}{53f>x-HjEp8n4fEv8UI@i+gnw@wbDKfaiUle0nJ$psB3Lf%x%z0G(HptggY z>h`-ajZOqpZYJs-&dAP7q*~sX>Dqk#AorzXtlYZ?a>@b$ue7V_F7=7#Yfoq*Trt=3 zO@&YI;K`lAxk8vGLc=OS{qUU+kV1n#(tFOxVuu9#m1KKqn)=JDgd$?>_1ai1K@Kx_Xe`gn^y|Ek03ma;?WOvLM|MBg#u zH}Y0@X8DQz6P}V$fk7Y1Js78!v9vdAYmYjV(4h~%f4w$@(c${FIH&yK>@aBo%+3XB zJOcvaG{bYJ;Bi6g_+aF?!F&p`lxGNTS>JS^eNwrT4Uz&# z$ozv+MTw+xH$brZTAyOx+(UkJvA>$X5Li~UaD)CJSh)}--$4u{cf`SbNN!BWR1AG5 ztW(0uti?X($0fzNeG)=QrK`~%KCc45EKw7P$C)@GB{FoNDNM#*Dz(4EL#Kn1S(tWv zIYF`$@;&w?RCM3$#57GfvY6Dvu*}?uY(J{SuxRdlO(_T%Zs#@w$ij71 zN_!N0;T8(&U%oOyextT+d=LW4hm2&vmk6Oqu|xtGk8n`2d<`nP!~vP(9U2_eGwl9* z(BsEKY&DxNR)0IN8V?=wd@*%|O2^odMlcDsR^G}kMoW33?~71uM+twgAAUu>3f|7S zlA6J;RK!y4rAFMIt8GDw9hBhcd_eb7qI5DJ4rDZl)Z}J4qP=H-ZZudEXuB6C)0=ZE z{oDN&7?*UB(Zr8C#P%4cdFHc9sA{Wk^rNfqTWOW(^WTLc3;t#IHKgly)RT5ujHg^= zEmMPG{~Ac5UVHt1=gL@(7w=h=KO{^QAOU!wf)ad{D5Iew)0*ukVM}~@;?JryA6Hky ziZ8ED0qC#vDh%H`MzBJyKworay{V0@t=$4R_pzE@RD7p;VtHA%gqhf>YLRQ^A)DoO zp%28Hqa-4hym#9v1^jy#4Xa&( zSEYZChM^`)>l%L>IaXx_+4Jh5nCTim(kqo6c1N(@Uk}fV5hRuCFNay4ZDD!w=nCFl zcnFlO#{nnCUC1n3Mb@4+K#Nn;0tW;g#O^^TK!aIXPnO+aA%HoC4$0@2V`~FVa46!= zO}u51LPZ7+UsLoic(5K=3{y^WopO8`;vQK)jRW=%tjWWa*X$CKzRA`H4J*`>B&Vgh z)o!6+RgNgOE!_Z#Od5Y#_{HTpRNL)I)ORa_t*(8P*E9bEd)DA12RePjp4}i^s^(gvwkUkK& zCU0ewNX!X^7d?&kmP27k zn{1wfg{iKA1hdJ;&#jb?B>N838m{i9f=?&kRa`9jP-v=zsbrFQHN5UnBG6~N33f8M z9mVkjgsZc>gEiZA$c0Z0qn&>Iu4kjvO*(W^J>-sN_t3H0=l>vIPcOnJ=K_A5((K_= z**6*`W!Pav_IhKzbUQ9f``fSsG+$1nP3>^-`uYH2&J;p~>m&m`7j3dd&#e50M|D_IGH7?{+XXjx{AByYNgb7l&HLI04mq z@ig<|55akmDtS+b&ZBYpFw0#Hb1Ea{sW_eo@7Lr9Qk(N#NR8lzqEE%zIqL@=Y+b_Uv8j=y5t z7u`g?w9n_{e3Rf(sxj-8zD-Dxb+fQDP6*Pmb2f1ld$}RjP<}IEdo8=sOC$Dw|EP>h zO*$*sjO=yjFKCC2=yJ<}IZ%x^r^(TowtynFpu^2J4fWXZyo5ct)-L{$m{JL-L$@|7 zK9z?c3^PL?^)?`-qOZt8By#~9lARn!X6xBK+fk3GxIzC_B2pzhs1}8DspA4$43nhK zBtJEr^#f>Z&PT0?HxO5tl<p&jXF7~3a)#q`)GaMl4Veii8cbGrvNHSsoLksf}@(kDw zv!CfpO*@v+IB(KOC=TiJwJFvdi?aqGDOGXnV<5ji_g7qv()?q%t+~q>H$YZ~gVy{Q z=--elEk51lIL!vY_!TjIk;*oO9w65#Qbpe&g8Cvr7ph)p0;ZDnEie})F0iB>NP4Q3 z@t7Sfsl9t~(kB;0eWMaCIq8vluGLHo84kqg1#CJi!TgJ9IMP04KL~*q=kaiHvx$Yz z9wfY5|7NsvIp`xzbkf2O*EJf(g^mFw6-ypSL4FxcjQn)!Niup%&zpSpkHk&Aq312M zlr-pPkZ!JdH*X2lB#4ZbCWL8XA_SbZ_&AmaglS+;*!MTfKri+s)A651nvguz7P=vh zCFloaXQ3|%plY>6004==JPrhOuEn+|{*6u_f7J&qRp3de%Gm8RYnXbw&kQW7goDmP zARsbOXsUDjg4MBmGW^+J%ZP;FxN5eeDS@w`v?9Nsc7G~eULW24wJbdhxu~KsU)L8b zzA3J~&bAK!4cAM??_lz07eSxzPnZ*uAs|;J#9D}p5S>%R0(PPCeO2#kOrT=_wU9IxZMVj;!MHM?Oi1!>`0QZn{n0iN^ab%!3CIp!48&OKlJil(zY@>mUd>hqaV|c=tY!D3H>i-MzP=fZfxeC>% zpT-KS*-@WJ`R!L)k?H3)6BqgrrlLY!ViPXEilXq6u1YsKCO91G{0TUDEH{zt`d!oQ ze`F+(;M0V7S+Qh;$EkOvpchmmKuL7?0+o1p3rU4bN|G7!I947i8Pf3;D)=Z9<0?n% zK5Fx05^_JY;!7JSGn=os!gHLm#u$gaX*dHL3+}bt=<1(qO<|jshO!J zt*_$fwc3yMJVWELJ{#$iJx2`crzxiLAaO~hyh?{1pm#)He}N=wPY2|5tFjfn1KSjjL#G>j2gAil+*O3g9_XNS{E+7&WJ)MMa@+ZQ7>ugvMZT*sW$T! zn59zo6aRgB1Jemc8Xz()d63kV+`ZQ|Atf#G=Tt-cYep**4NuvJtN5 zJrYt+2ZB?@%h7u{jV>Xka_;T&NTg;;#Xx2c5Qvz3Wh2a-;oy9^5)N|E{kyptXfGVB)cm&tuZ95cCH+Tp1rH+{?yF*2z-?h@^ zRplPA##2wE_}9~9kiM~*lMuP5EXRz#jbuwRZm8lD_9(lGa_La4i8oE)v|ZpWpohy! z8T;XR8Wp~+p}wZLb^vF_@`q?K-PFQHiD4I0uv2_Gh5m4=b^WRWG4k8-6mB35hMO#) zuACWN<8b;}yG`)SGzW1bVPm1BNJ(3#0Et(dQ_;xw-U^cD)-Zyp>D&!ph2FN68f+HjehZw>Fgw)ut#>H+R_!tIXhed%@ zOb?WKp9;bP^mf-oPsi&a^+Zt)N*u0K0XW#or9@T21PT!c>}(91n(1&GwRUT!TOpBO zXH=u97H`_(;C>msSP+4>>^-DEAbc=+k*wjR<_SJm85*@AHs33vfnLypqO*p-lf3Bc zinwLE^M$i}%2DQIR=9nniJ*JecP3a$&YqU8R{xmf*%@CWDKrV$&wANMvohBu^W^Uv;MO%U;_87vUw-yl zNR&=M`@WP4U1)~Oi*8Pat;8uJw<(a1JR8=(3{jv1&6rWO`> z%ofj0q+=QhO;12R!&!Tg?UF@((zpD^nfe(8luDR}{U6e>7lG3T%kX1*y=Qz)1H_2> ziHmz9>8?_!CdiD;{c8fPf;Jz=Fv z@5JZFBK!qX62Rv12oyZ;#!jQ-6%otltXA<~_gHy>zq}cpfzG$2_;vTvl%KCip*rzS z>3@r6vM|lY13y+i_z~_nJ~PpXP2ZS>l1+Y%3e&TG=Ab*7T@AhMZ~GyzavIX!4+M--cGp25B;$T zxt5R;Zk4f#OZEb-8>LC??tf5ffz z7t-Cg5?wjkx=KDC&@>3g5{WKiW5?Hiv%)zTvnFDclroG)wa+j?K1J=Xf(CL4Ao8>v z&KBMy+UlT1b{M~(@dLmKH%z&0?4j8ALl>!b0zR0?NwMv5$3zw>pC7T}pmD6htvDZ% zC$UAW)|md*$4O)>a-sNo)9w&Y*AQzu1v2*p>N~m@wdb?UqsWgIUf-~v-6>H@eWHx`E=lmuvjyGA_7C<; z#J@jSM%HyAng1%{iYPhv9}g&cTCzOdPF;BJTh6MSxqq4gKLxzcP&7PHcjjZ+Em{7m z3j*U)Z(I37Z+PQQI2O|G`@0;+9>?C_GduH^8bpXIgzX=@JNf~ILC4(t;JMcWg>GD% z1TM%3b)wqsY0fwiHla&iM4>#v-Y=xY#4HCP++HHyXUAZ34{nT>fGs0SE4OUs-)YHD zmzK9!fvz8JeWeDmm%~luQ`PqmTx9Q^JP_{sa#MBc-R~^8uMkmqN$z` z3V0|SHoWs?6C$Z?Uj>BH{z=hZpG2B-Fsl=AWTSGF2O#v)S(15}FS z4}B17;tnld7IZ6%GX#e?1C0L`858DZi5>PUjjYFZCDnC9pmW6i9cm+9LN-3q`WY`J z18byMifZ*QwXw7YHorI&RRCjM=Wq1bGLA!i4xB*(ufmuKoTLon13KA8(0`8#@k?0_ z7H|*{4w(PnQQ__EE!BQ;{H7IhBdoj( zbo3;{m=Ol21~tZqY8$5_%^{LKg>^^RSLx=y0_=om%4C#1a2eSr!!6?Rb0G{n1PxTH zOyHv8M|OjY%sdZ_kHl#D=W4K1Sicrajud$984eMhVFG(oab8dtPn`K@V~DcJF*${G zR!2%ynq?NLcTt)D7&ke`Pf&Hrcym?pbd;_i=JCd<&GLjl%Jh)~`WWOI{LfvQ9+aR$ zgB$84SKqPg;jt;m!Q{|HWi7zk;b5O8wusWr$>FEZxDQm2>g^IY=kfOI5DjEDf1fuI zD~YJlvB;})%-dKc$2!BrMP?D=_iA>xn`^KzC^zhGw3ebwHXdV1Z3Nte$6>3~UPWU+ zERVf-AF}&qzBhF#LGK1#=X-PyE{AC4qllH+5``3;c)bhEStkej; zxlHA{I`{*T6OSC?sV~U|8izFVj-?0`dHQGoR;2g2^>Vxs?h74~+waCEbAa{Qia0g7@+AtDIdZZTAj z#-z~3CI^r`gJnqI97xw?>IYkfB2m%snYUkj>8K3U2SnELB~V(kk}AK8LuuCeer!OQ zU>jn2lkKOdw&c+980}FJ;Qd6W7zrGP((a!k_zm)R-UP{hPxgboNS=e zy)ON0u_2n}E04GU?&#k!rx>BF1>r!lpXga#rN(yaqB;&|HB7_!|6Q%?fg!BO?@6IfzUvgPIu(P@iqdmQAF~k)ZTSHj0U@tFXtMBh{_~X<=D&bsw)oNfB_U|y zCuPq*Q_yW<`!k`6F=dsj*IZ(r>%`Nh761tA-!GnAJYUbtWtdRJKNLA9sRI|SK*goL z9{alRcvRL;&}HJY0%GMqOQP%tM4b!YdXM+{rkSPid}Y#a@B=%(5dXXXz=K`_-Qht% zb}2zX2>#FhvvG8DwlMq851<^+!0k`Ry+I$?kU&UMI;R?kF#>SPJI*LYS zhE}88>KZdo<|9Ql(KOKC4%LexaIMF!ekvIR zxc&@WY9NkT6T^$jky~JXg*Cd8Am4mmo}16jwoP{7fBebpDc18$<^6M)H6SG_c0}=r zVJcRtRc8ht;N%?uGr%SHYm>@U_!F@&6CO$l1)?t|qZN7pCKw14hjoB(2ZA@92Ewra zM8Z0?M=Xa5HEg#DR)+!AH??blg3181#OW#mdNWSD?sqL!TvJ(jdJctBx2>%QR2(~w z4&ZBz{L$P!gC0i#FV<=E{Db^Z&7nXWW(R|DpyCcu1)5G483qCT1LY`I$3h<=iO3oU z#WTEGF3@xZ`*-brF={ov=)T5~kfv&*BCNZ4a-)&NtjP~jIz>cyLJ6G~XElxT_W4tB z;NU|&11AV>>%MUu6vH5;-$g$edH3I`fBBh{I;S)u-29v^%XQ23W#K`44rqCi+ zBumaf*)g1cXyCGw!YmoGkpbu3k;=Ph0e6~tOJVsZj7gg!WP=tXfF!h*VYvk&?Z~Mr zhn1)^wmArIM^Y=$m6BcEhwf@|M#LI@eF>AN83xf#ckPf&V6c;fUQw4)<`ej%l}(qaRT;!ngJp$SUnm2>!Z8Wl*IIq zwROL&9LFU-o1U`t6&;-LajNiFZOX+Fn7`tEnaNttirxTD$Q?& zrH`MCmDc@Z*n8~~xb0;N{v4(;&$;dg{w8w|KaHR7LFZ=R6q*D@G)4HzDCitB%=GaT z9!h|%A|ASbL!Z@p^TSjy{8)b5^YL^DcUR$wfCVanV2Er+^lB$U3K`FM@yh^h{&HE~ z=24PK<5U{90Df>1k-VxXUvs!ZF=y5Zw)dCBARjYL4cPW@m)(-gOd$801bh=~T=ycc zCO!v4j(;*6wwE|=^erSh<^Hl|QidO-kS&2_I@!lnH{+4lfTzavoY6GbKCtV3(go3U zU=wEEf+5^f=-Z17F=6O=m;Y91j7?U$MPw&I!BFPM{Bgw+!6Hc1VcN__&$gW!WnS2r z8Jc8$Ek@R8{?cCfnH?t}StV+2*Ea1OcY<`!&B3vGZf{{j3eG%|pmD-@jH;AmcyEMy zBC0cPW$Nn_@Zlk`pDW(SeY@dIBtU{^{-!i0M~)N_3^stGZBj&Pie;V+IngXK_A~S| zqIc~FRGpjUAO2c>NPe-A9@IEjoD64X=yBw@p}2HT*BCo370q}@u%}kYURA@M5^D6Y z!-?`lBT?PpF2$q#GS?R}#(G89Sfc$!wF3ekP~V)V5QJ@V(T&8c7C}7YwT7HoZm1tK zeq*eqvg9JvdZ>m?HCYB0TBuo@N~Xn}@axtWo6IdfB ziU4ICnZmbVYY}(H^(_XFhdm8ru zufW=NzLw}a;6X%w6%nRxv|UhG>S>)2pPF-RYKI>+7f27lT%C{$3D~@$tzw5pE%GeN zM0&g0OW$S-iTnU=s5Cpp81Phw^y}F&dC__ZED-pD!H_s@5L!f0qe%w-2!-Otw!#<7 zf_hta4}mQew>xd+In1}+kGa9@oqGLkX%ko7Mp7i^psJ1R9ZshAu8|G1b#J1SJ>q$jHh=@ zQF-g*ZZX2Paj;!7#qOWwzp9rSm7y@y3}r*22JR6TG z4qIr5F)c{-1!Y~=nOFTTgG`x~lD}Yx)5zic13frB91oicy#l)}O!yYa+*9n<|65B1 ztZs)kud6orD)u}WSKoq)Mm`4)(ex@DD$P8;O&>!+<$kd!DSwFsH(CmFOr6N9rFl%Z zB_h`dtk53tm$+Q~L2zb-0NsqtILrsUBd3`v%Hat$K*^=*(ND@{3GC1QxjdH#v0I=! zQ%gbenocN;{u9p&t_|(J2cjg?j)yYBxl>j2#kvW50vDQbPS^_ZfqX9>)R%D;`!u*I zhXE3C&#K#rR93*?nshl`_0m6u?EQ zWCduc@E#>Jt0l|wqv8`ZgBb3El?r9bQnBIRH%|G7qtTxTCm_%`2stVfYRj-@WFAXP zub3o7ck|LiJh)*fdJ?<{pJjL~c2les?l8PQ(WSBGn(p^_I-4GEMa^FE$lly=2t%>Cvcn3R$!cM@Jb-b8Lbr(sdk)Bvp4MD445%rf?4@&0ZsQ!aSL>zv>_{z8k^ zC!bL^lP_SZw1yzDzL?cZu#ReM#tr)sN_E$@v<1KOu1C*e>=)d5T*fDdu|+;cB2A-` zQMVO5;|HQ>3dQB;&W3h0!~Oo}tec0k?BfdpPGsjL$es*IouZbOH;L5GfFLIh*S$%8 zBXGl}WxS`yhyeM(AM5Z$X|lupHOJEZH**gQntvb0&&nLg+XzfZo;}l*AF3^wH6G=? zvXL}22!WWbC2~dqOwfqpkz=m9+AQp!d%g;Q4JvNokAI+V%L6S>CL(i_gH20+kCf%0 zAf4PNlyS9wp=fPd;{9ac_=g*nT2L$WMND68?B0?9v`WTCQTA4SAY5H)@_V05++$GO z6EaLWY@hQY4njSvRCt2%1c8c6AkxxOs!o|uoTEabAObpcm4wkLQA))DOR1YloAGjD zY8o^z$7Oy26%jG2gkVaXCJ>^$Dq}^o3=746W@XJuX0*L;X0<9~!4S~YxFXiHD~*-0 zW*?*h+gLaz$flZ_u#Z5!AGn>KrRC2Ot(iFv0DsA-Mv+z0n!*p8qRG3+`iH9tLo`Vh z#|%sTIKy``yaj-KrQ%QQzWBUd==W4@ephm~IdXF!9<@Fd;&~%qApgBv$ErEOZ~s1N zWg~o_xc<-Gy1kQ?k*kHHxrOWZhCN+VuV$GKBe2j2l}wDj^&%I;*N|&RS=}50*#c%` z$(<_4=10zkAM!zv7p24Eljn1uP#V?iL!Fa_!Qzhzbh;|boI;#~3MsnlvE0ep3%Q}o zP`&q}?2`5n$}@B)j}QPy&Qwkegu~azTf|mRklW+^(5V;fo8gduh+`!RRNscXeU&Bh zX0pRRf79)CIVeoSD8mNSz|!@fsjl=vyPori==Z;)7mKv`0LJV7;+Z_|oe5w1mFNq` zj?1!=tr{jcFRX6GQ>1_E@SAOCsRHhve94qGD5O0nIZ5NQSrrx~KOz=XcF@H$iuGtA z*Eg!!b8F!}$HJg{%1iRe@TwE(5hC)`S4(SSMHXz+i#k*J*JEQVkk8H&35j5iU2zkCvhV{ zG6Rey?MZ-O#EmvW_JIOe_;;`f!1_ZMaHL4g+=+dH)VcDFGkFUYlEnR@=6#WX7D=RA z)PX1h$B#rICvdI(EpP+fBykTcm?vrg?DiBxqOV;aE~|6)t@PgS*%QswEyz31#B!ID ztULSY2=y*WblAchU6K+u{yJHRG6=X9FwUcK85yX zOVlerU&B*itoA%V-*r_p%Pba3fIVNtvkpIP&OGv}E?ozJ$uNs*u7e<8R`Ve3ESNfQ z39+v~T~f{BMNguE3m!M3q%jU{wmk=B!=2#&MMrw;rZ1~fU)74~q&PPE?7IR*EZeq)Rkm&0wr$(CZF`lus#e*yZQHhOz1sKPpMBdoA2VjE zWoC?wF``B9F?vwAE@!t<5zGT_6f0LL&I8X6Br7AwxmK}~)%&e=iE;_dbye4p_Y4@B z$BH6c7OvLd%0*3yGEPpK#uh4Y9(4ytId2}#^4zhsf-G)Z7>HV$#4fyPT)%=5z& zQGpXhXA9(%=9gBocMZ+@+lkTx%M~6ofmK(v&Qxi{uw{l6{sj{e7?1n*YfQs1^c#5- z9~vK@x|?tdvMi{;zPI2PaDMWcyj-i4kvx@&Q~ zSAKD`JC?Ht44Ed%=D~QPdt)byS>C%u8J@T5XJz6So!&ulrYo8*yJEn4zm^u4Avh1G zAeSD2_|fIF51m0;AopaSgZeEcnXYbmC=EGFaIN~@Iw)E{lXvDE z=tx@MxbNk#=-dQ~kxhqPSkjQY;XgSP-3J=$y)|=wA?}1Hsel#APSzj@Hm?D(sVvtz z^cr(hgj=DD!#=O0+&Qvk6&rgT(!_Bux1_+&q8@h-fG@E4E5roD?|`F=(ixn)SQoV9 zsZXO{x$bWQivoT|jHf+h!Kie@^2%T_*pFr~zLR~2L0`G|g@Mycq>-vkVI`{`$L!v} zUn0*Y|3+Xu@auyOQyOS&Lgx=T;+5{%7kCy(>0!&ZFQp@)Iv^&y{| zOItRYYbdYZC|}7gWgKVKSF`5IN~BYJ2^lDDSIK$Ll-4$#!`@fTINQH%+gOT2p8sQ8 zE0F&N%GtVDTkHJ;Vf_$Z5g-p_OH=kv9R=orZrA>v z*hMImR~Jh*q%(Int~RiWugrI2>DWz9hm*8eBG(wup~;Kt+Y=eGi_=o(a8>b1^Xgo# z+OU@bFSJJIAs9)bJYIM)8;p~>Thb`aH=8c|T>OAL?dy(Ccms?MGr* z6230yGNP@sV6x>~*-m~sQNRpcZK(`6(>3-G>z+oE>pRxiR-3MJi&hx-`!*`Z+t|BE zGIB{XvAJMNHEGw?F&BGewOTv7e036e#?(Q%(4=xqk?WkDeh?#&YWJ~yLALd#`21NQ zLV9CB%bOG;b9i)u#e(N~sF&{FpBF7xjV9#BZBl=bNu2-aI`#(ECeF?#PCsAwPr8m3 z5gWSb^(WP@PKh4k?AqZwWY7478BobKYv@*Tl9pOF4A$D1%ge7%$^6-4FKDTL$=~;u z1^Eiun-w32HSh9j?~Ct8&TA!CM%`Rl3uMoi=FD#rG-`TmT91RUUR-~khI6W`+1AUi zHEula9gayegdRV|Y?WRx~7^$wPC5(bR5@ zcBp!uzN*YqpP9jy{(IBfCL|+T4XU41l~rr8tF|rUQHR&h=Gbjh{>97LVtOO%ZCw;c zuKd!|MZJ9SX=N2@11I(@Z@sI-Ps?px?QuHS%ZIDfPc6*0kq3uPEN(nAY&~6fGAvus9a%azhM5bV!y!`;825jOehQH zlDRsttzG24eS;_=s6>C3 zy*?uS8F&OpWMO>a_#nsua>w8C0+Hy>Nef%YUIih=GVA%YT0UCc*PPF>tf;Zg{30zyaQO7OYfAh484 z)ja~BcPR8H`dx;A!Ss5y{F01%fQg8QRH)(+cPLPQf4xGYC;c1;kW8yq$0tdz_LunQ zc!BV1WXK+$6w1N)4>5qs2xv7BBHr_t;0}d6oWF|@3}r;^0H5d{h2ccLD**^x;isU8 z@D`Dl{9RqZ|4#w%^BjbrpXX5c|5N-<=&%G&OTyRtsn|b7HSNJ>*o0dD>zz6gt;kE6 z@d}Rze-}3?(pc*8f#9npyB=T=>=6|zKluI6%MjnA&{HUM83rVg|I}bv{ig~+i2t00 z_&IxQyELVJ82`Uja=DVVV^DpPd$Rk}nR21U8bnZ4=xiBoMezq?PgC-e4CQCn_Gfo7 zv?XO!bFr&%!IyPcvneWKvv0;E#3{!wt23$c0@f!L<%0C5*eGVK8i#Z(?;7{(t+772 zn?H%`bJ58CmNq@9ORUR$()miQFcC^cc?-g6tI%h=Y|quVyZi?Jcl`t2=@tbSsbiM)Vi{|{k*juIs2U=Gy!CO=X*-1ML+sgR*UXlb>XtUYo~RC!1` z142;C#KojZ#*MEdiYI&1Ka%jHtu@{IG?Yff5&d=ke&4fEz0}>5L+qpneNDS;Y=b9VPVDGkp*e%d}~t z4EQ3C!KQYNN^QDaAYf-++6H5i-X40T-Co%W^l!TWoTeHtfC2#MqW}P4{>QlPXy9z| z59c(gu4T8*iu}V_vy0=B+C`>T(FHM}Q7yTW%R37x>B9;9okKKnN*0z$+AHYxJr-0z z7w0!=QER!LyTYq0u zZokoOWes%;{rb)))leC*FZ@1rPCgs#J219&DaQ)4iYRr2qGN^UiQ7Fs^aOn2$bFn1 zYGQ316hxDab6qUbC24LOv#v*s5Z-QVbKJ-GH1KyS!D^&h#H55O6(K{7644|--f?M~ zSLmMSa&&cls%ryl|I{j`Y4BPUEOJt^04oEEL4BOG4ng zVP)>T&XPR!m)}a?$x-sUrfuh`iHcEP15`)Gb)cg3Z$oTAo({B*in(;RMK8Omq=?g$ zbyS318F>wW=iaZ5T9`7Y%DxsOe&gL((V#xR%U(%S_2XWAdlfu5Fv+SfX9!J&SNbKn zi%qfzplrQ_yvR$LelB!pBPx&$7R|;s0(E7?HOMX1U-TE~cg36eRlvu87aGED^10R0aI!e<9?H^wb~O+GnvU#q93U`0i9hN5jeoJ(EQX#3t`4C)TRKiG6v& zs&!#+$hX9M29sR5NTIJ-T5~A}9nNc<(1dL|;MDS#7K76cqLwnw*lG-WJuYl3;m-6x``V6)~)qQqEQN7)IR!Uz?E40<|*|?_v9j72gYPGX#oY?T#y_ zcjcQ)4w|@PHc@^;HyNfm@dwxbEnSWehlOUPo+UF3nfn?am7LP)jf!`sz20@kM`UJg ziS0_uK>I`X`%oFImYDLm&N}dv?1>ZI!g{_Q0I&Xw^Ia9kH5W$TxS|3C zys?q3yp*V^hZ&Qz3f{yH#Qym6U?Y<_cinOMe}OMlQAqRq9w+$cL5tS<0HaDB*qWG0 z0pP%6+ia~PJvisO2Z;{ud-@F;FfO_UMa?IggtP$n=WGTjN@=XJTt<*2jg8tV^Id0U zj55=UsDi=@h&4t?2Qya7T8b${nY<48{;WF!A*L|$sELEUWkaL6v&Jv>DZl-KRB!}Z z7zbNDqX0iSN0)0bJ8Ejsa7M)9gXS^{{#urI_!XQh?x@I-g#*VN)=;tlQ<|?mW=s|> z6l9M)HP~|8e9E5cQkt@a6X)C!$+RinrtB6xe=0R#P&{0X8aM5u?r?oYA7y}Hwb%eF zM-&z^d=c?THi7!?n;?vXp@kj_sQ@GdB)@a$Eec)aS;{+By1_+M>l*QvPi>zqoAaClJsy6k_gP%Ie)>Ga9k3WpNS*or%sFhxT!#!sh#|2$*7G@ z&Bozq-Y=uYDGY)?MGS8nRX8;GNaN@KdIWy{T|!KqyEKkveIclp_);{lhhNV*)E57eTP^ND$ zlbLscRLyES+rUk`J64=;DvFtL=w@X<=Ag}1-f!UYSjEWT8|2@8;SfWmvK}k|z_iSN z8{;_HTiDu~IQ}!nIn1B4ni5X0mZYd=mj6JO7 zX|Efi8Z}roDJKRVVjY^!uI&vy#khyZA3z5VB`%=E(|^9~+W5E!WW_UR*P3SHVM@pX zsq>f2=78&VdUKw3Zf1rI5%fYNvgE8Zu1m;LCRneOr@dtNyDG@8_w%g zY|c=g(+J6NGbb`*Jlm0%UCZ?S$i6Wk^Xk_4ub8b;v#wGPtW~AT7)>NUH65MRC5{iUqd5K+ zB~>)Au@#8t3Xc*!fWj?Qk5I@e&m+#KF3wr7uoc7{5wE3bi^?#{VzEdTiN0&lnz%^f zs7fiManY%#1aderOKJ5x+9rlJ`nvdks<Op%&bwj;#duVQ`uK3GotEo@)W=(JnX8_ScOZoutVhCNbxkxUU$>scFsXO6OA%k{F74$%XDCP-Og$9X7%f z;UfB@NS^igIG6R*xS^TKHBT)M_10eQdRXzI1o`S!{cYP^&MXu8^?UzToRDB}Pw`>p z_R74VUOmiQPV6~i%6vL(4&iJaDPK)ENf!-y18ZMEs>PhR*MFGsHkQ^ClNa$a_Q`jH z6es5CiT+9f5>{%s|8~oKIO58_!yO?j950T9kU2&+@+#s9J7!)y-Y7nM%M~+ytYAd! zL0Hl`q`lpvrDw1f{q&#Q^qF)#IJ%p;ti#>~&NuC2M-4L%w(BT%G}VaJiG zJH!qdG5?~XdyI5|f4q!9mZ*4m}h;Ox_Y?%o(Sk^zrl4QsMm_ABJLz73cwRL^)AR@22ky?1XhB zlh&-S8_a=4`Swv*iMaz1wF9sWczImY9rDRian0WqXwqlA#Q-?2I<-+-M-FZ0#aPm$SHlNMykW3v69C18kDYU z6m9@z_X;Ucd&{nrHYT+ww_~96({1L^h$rL`dWo&ZO<(U{8|NlG;+7@2}_aHXR8+lKgBFC@l!3)WnURFAf*g#K}0| z9ft&Wpb5+jdnn*B1-8dw{ChJ=p6XMY9u7yrX;Mz)_3qCzcK5yxIgQlGW1sDjk@XCs zXYz~zFRWuNcZ}?<0sSP{6tqs;?fMt-2r`zwF=jCAC%=jA&@{q5 zJ`{cwz7+mAK4+%aMDksMJIWE}giF`2c3Cd}N5e)4d^P^6z>0v1AZ_5*sbXlL`9O>N z(>qZM8wqK6Aj5zad@Ou6e%reAsScSifC(=8>%I=Kd#SW%178qFtOKauT=;GRR{`D- zj(7)DUCdtcx*&5LZwM2^^f~_4f!qMAKpx@R)|Z;?I)EM>Zt~kJsBZ9fL@4C$QM#I#RhtzJiuNlunOw;HK_VDeVT!d&{AP0 zJ=sA#a9)5Q*&N20B3^shdor~eE?`SK>d*Q<5a+zq zZAINM?@%jl`r9Esa8Ic<*Y%BEjS%O66*TH_1~&bkzs?yd$Xp`q`g{SrpnmkL*K6>4 zeWjnlYh1_9bE;PnN8V7EoSNeFt#XTNa%yctK4G@?W^{(!Vjoo`WvHrDCVSgdCdqPr zoZqqD9+aMZQ#w0Q-YS;18#^87qK2Lby2C#ZeYVv!pkqpiu2y813t^}$^)0ZZq|`P0 z=a^Hj3@oaEM$7t%C<^NvV#-B2>$hj4T`grvE-wrDE-&DWypKXj5-?~)u-HyK=s0Wi zI@IsMm10$4G`A5}v$7nTc7ErhTE*2i1vM6{dkt-uV+kMOG>m^#^L1&|;)$0MWz%pG zca3Lrx>#=8`MsB4H$Tr34bx*LguRP01x1!aRDEfC_$Sj;SgR>wOqdt*DKh@R)i?tb zojyJLQ`KmHbAo(v-#||GXXx&pp|l;R;)$ac3QZRHEKaqhYE5&e`MaTgFyBZ{lxE0Y z-$`h5?=Zv$csY{i8XC&UuNTlnESC+tJ(M6hHa3bt*Y6JSXi*UB~GJe z(Ed)V?OWuZ7OY?UFCPtImpgp!#}9S5;JiUTxSWKpbG@MUQD%klig`8dWsjFQdeR?8 zepdA_*XXa%v+8e@yo{wA>q{HKghCkM46&g98hVU$Q=BB;bkMOWl2s~CQs|WZrl&MZ zf~D!_C2?!zaw`}jjSi!4(&x4p{^E-qjexI$ZZhBwxJ4f#0?U(<^{HwBsG6JXRS#x> zGs%n^)6mhTl@RB7?yoshG%F2DNJc+*z8T`WJ(+?2#h$uma}6E0ym7* ztwSh?(|a4{sT1y#Ds0(HwmJy58t?9$5BUzZT1bGT^%a|~+ljpsk9&u%Kh4#>mDk6? zOQtW)!M&Bw)}if_o#km?`D?f|aDM)gBFZUxqb*!(U$(j@lSCD|;zX8hnce~U?k4ly z(iX!R2%=)>1$)RPdfI5C=LKj;jlL`VcF|LE9uF|Y-tHrZtKM5eU^Kbks(@0b6nm>( zJ-JG?5Uot{4<6?dJ~zwtbUF{IXh!B&!_y$q3775cyrzYSa`IB7q+(dO#2=0O)u^h4 zSY$N$O23*X2(RynR*TPr8g)-~Y98v}lFC0n!&2gu$QIlt!7BQ&e%-ktt&5R~p8@n1 zRaK~`S@kcY6r9f834>~7#Rz7RWchv-Ll`BN(|wF#CbsFPBxD!NV^;%p845G)`BJCx z`}xP@`;W+CuyYoyKL#|PUd`_U&F^Qzqn)1g8oX&`fUp$K0(-i#Edfw!Qddyrhe3^Z zy~%r%7C!mzPGuEpikf%NTW%zAKI%R)er;V7K<&X!gu5N$E%=DEk-<`gyLI9vQNf|& zErf_wk-=)j*9!fdqn-9%+lvzOsZu(OJW9MJm%k0tIm>;uN`zpXAs!&Qe5?)+-;CpH zH3vLuHG5xcGKOC3Gl;s(Rr6awHDGoz%|P~bF{uESsmI}#fyNV87^VE*pX(rL_I(v9 zP#ttDRPA{yh8+0FtoB6eGx|RbHDq>lnadS6r1V*Wy*MiLH>8X}c63R{<5n=GqOHCHD}z7xWpy3))c{h_UL@*3d$bxM%Rwsc zF8}|JN4;{}$v2&Pc-gzZ&=9br!t`XnT%fN zuY~92Q~=#KM^N532t6N&onkhh$3fDUQ;Z(5X{MWHxtB8xe15yPbBQg!uGY*C54e}J zVOOQ^J@C6zKc&0n_t=~}l$}bv`+2aK@4K7ljxWh8*v|WaR059ud-(9-e2Xe`GrrFU zOt0?&!11j_9)r?ikC;ju^`d@8~jBUr`h)z5Kf5ZiP|Go)U8uy8%=6-?kijH_E5M@&BA@_ zbOVTLWWKHiW?UdFw-q^mmttH~jb=!~7%f@ZsKGuvqD3~}PTwY8Gw@g`EL!zeH-Vn6 z=Px$XoqeV7le@NE$A9}>p-Qee=tN4hAEIWXte}_*_nD;L;K}`hP#70!me)tacXXZ) z7o|G?g6L^~#DbBoK-K%;P%>&d3dX&?zk}eb=E%)Bi^Dx+3e<_&H-mhKHA+zSJ1sak zNW434$A4H@$_>96KX_r)vPzelD=3P^JsKj^I94|@Hd zQCcTwga3iAResAz0W-jdUcaKyc}f1IdC-)9I1mvwzftrIzpTKTKpU;7`Q9S73OQm; zC!6L;T@cCZwz6Zk;;Qh44H9nL2;Z3LKM`_q5u(NO|@G+N#rdL;^*n7 z=gxQE#~w50*@H9jo?5Dfu}9fd5p;f_I7}nIpDU+|*-0}dV579g%T?RWc?fA~L=a0t zU1w?bCCzr?_wro3n%>h(J7RR%2Td8p``i9T1KL*Ktp-c#49>7Xd?RdySRfJ6hvE|O zNGL3q>ni|5;=(2#wN}|;O-ten_-~u&uOVt5{@5hsTdbDJ z!yjDE3uJ1v8ymj!i)<&{`v@W%k%-ULnTzkMm}|SPe$4*6!8J%!NOwL6bL7S9q-Rvr zU(Hy8V~kHxipM74UeXtN(&ZwvD}@$~ng$zuuYSF9mq1;NdN=aRE`3UQd1%er7hh6s zHgiRs4{n#j5ODuC4xc)@$}SQB0I|k@OG$IHuw`P@GqSUFvil!Kev{kpCnKTu`&?-! zDLo~Fj46Tc^w1+O^Gyv=4u{K#g3=+ich(p^(8W3~y=$w?Pa; zt7sQfvreQfRw#w^Hf7Thl}4>}goAZwhJMqybL&wsb^^`U7FyI3Bj}hOW=Sf0haW)W z;FXfg{R>-@$qfU9aB|M$3iR}jL+)v5^*(0cgZsBNO84{8Iq?XQ`^n?`XZAq|$gAsM z{T{`-X=kf=Dzs+)fh@xWY@$tdnECz-0NzTlP65QVh!gg1l_6hFvEe8w($e-{@i#CY zP(DX+eksZ;4`(XxS{}L2-%w&Kf%vjh(_lQfX4pIAK)n>;YuQ=qR=g$+zRwE5Do{X{1y(-P~_XL0+<^j%2!zLZpG!-<$8Z8F)3mN=u)B>+kUh zY>EqoEs0*Vzp2K72p*9=BTwmB{#3|&Gz+Uhh}5Zz>k|7yFQN2&XamH@8RX_;h~S~?d53lG}+Dd_Gpgc z&(BhRcDT3f6Wle!awHVRc(z5ebRB$22cSav=k7Fh%HHDj;4*WN4IC3r2%A+30+ii{ zTMN641R_E7k2YZeeI-$HhHhnANZs)F)`GT+qK^Go_nYn;sJX_7eixg{Dw}#Wc6m*0l>V~;!Di3r95iOJ^aW*jraFkLzNeC3(LSRJ-3;wl%}g_B)@zaCkTnYk(xAI)IF@=9k{=PWsTOR zzRzfZg4L=fq*ukjw1olK$8OK)-qa&%w8nOdG6t?mmI3PE_FYO!YGQ2*Q z@PW}pV!OA%`m#L14T!pg zlWV_jztv_qd9e>Qd0I(3NdE(1&DvhV;~lEbVAhlwJka)CJGsOR_UW$*yD&}gXB%x* z0r2Apt-taH=njj&6b+NSQG&H?=4#|| z2wZ5=Qg*@>B3tIgGCq<9m@wgr>&_mO#6=_x3^NjgzFWB=X2>YEfz5ef4EnnzdX;M; z4Uz1L4ce?nYt2Vy)TIN>+B+=M0-Nx=5v}L>SZHscj+XvB;JDyV=Bm?`yHBB!25a z^v`!uz8745(OBcg zz`U@faF$wG4_gPAdsS=8CnJj`w88<33So=R2{9yzbn9CNATC-LGA{NP^e2^=cPDg)Cw>;?<03WZO3<;fYi9Re z5-?xJ8O3huPZ1_iGKI?IdMXgK81t7qOK9U@e*9j~ezkCI$7@JE?|7 zNo7UHHI-Y}wxlvQ1$JP4{38PEZZB8ba}m^SjWHKh?>F4)2z~mRWmg@iT56Cy z6uw>$-0I7cvEkGX>pX9PjYjRu-9k#P@$4UR?)eO)L_ z`r1MN3&g#`v`XQ~Ve_)O@e|3p?&o~;YD}Fc+RdI@X=nvog;)TP#=1QTGQv(W#y|}K zf~ZO4_DtmuYo40PTgFw6_K#oZ+)7X~Hkl&G)S6Z+1;YXc|x3 zB$k7QVrph~+d5uiX6mcYl1)5DW)kQil=<%N3_M14zVb!TQHTu5_QVcBlxF3~q5&_~ z+L-%?2Y{7sKBt>mI$7FV(lHqYv+(IHF`qkTrk|~>S8FD9sObR|ViDTt^dK`pZUN6n z_el*E36D^O_yBd6VuprxwAHfPx;nlc?6j!Cq~@q zumd_cbv+IRjjBkO-I%=k2o3gP$-}Z0*qT;di1Ni~ioO$d9!Yh%HpSpF?TJN6Vk>6L zmWN?oDDt92tG^d;7h$O86Rf}uM*iO~L|zOh=*rs5>fqm*9H>Cmdcb|0{S96+<_Z(I z8dCUP2SKZRam%ZDC&geYUC@~ikx|}SRo#)uY9^k5q4Q;IOvIvtb&)aA{1qfn2hmTq zJ}Z}Ca7ka9FVl3u%Xg~G7v3as17`U}d=J4;Y5Qo%p+lnawl&P=(|xLfQ} zeOKF{No+O^-!Am#T7bz#1H>0-5_kv;{TloH%mX?)?KQNJ7rW7oJy(=id(oPpxLK;XU}q5^==$)Ja&_ zdAyX43k~feLC|bNmc@p-nO1w!z7sVX(sq3lGTJiA)d;~vyh-T}glETwYEJB0D&^y% zIrFw6`HtXRs*tGtK?bej7F`LQr^Cnh8#ltHMeJ8=U4cWFDIs)BqWWX)%dXEB)#g23 zx>e+0&Zt@ZWLGM=$T1d69-Xr3{?+qU4HXYW@_TLe6zOSF^5m?NWnJBfi49exGL=JF z1g`8F0!j(LM^8N1cNxvpSSxK7kgIQGIdqB=^x_;bh<7Pmmy+Q{12j`h$mi_yQ9~J= z(~2SzZ}a}#?IN*GA7Mk0(yM^4`Cc;#^j6=Lb{!V!&xp+*3 z)LThZzbTWgz51fd`}{7Evop4xe!Sc~W)6CyU=^dr?oPe3N6OgHGu&{4=PECyp; zrt7fCRwMllC%u;WF2y=8e;G9xDqN-$eJW7pVG;h30!SeShGgjG4|FsTnPFzZZ=1l9H$FMSJdqc;nu`yB@RvOoKDFUsarov(NhI9Z|T&vvRtM9}1y7Us)k#TeFXzsyL5 z{U#xr0?1FyNP=)2e^Dt*YLyLPZJjb`$6$>ixMsUOA^kin@fe^v)4oi z;XB=A5?^rQb$}a$tGh%ZQ1MqoXuCuO<)UdouB$OOY9ZU=Hy_dju)#Kg-%dCXxNUN` zICm3~dPo+l;zNz%aDyxc`)i2!e<&fgxpVP@87?5ow`%8FYE0mNeOE}}Gxa?iXUKrO z-34qZoT?YpEmf2}hcakFoL{D_`Rx)WM=Syb^Ck+|+DKKGjl#3sr(z$jy5P%$H?T2k z)-*2;SSZoE^n2Cm@ER&W_QGnW0LJ;nHN+ZTV z@_$4{i_};IUyMcx`07+g&fb(WpaNx77W#GTKU3)lwrDIliH8b3JK2YpzX{mo;3d68 zn(YvZb*TzA_m@(e7jo`c#0HHO&fE3~d!i27Ee(gpqwi|`tKmcj)q*sWtEj8%&t(fy zo*<`GD`(DED8neLUG;T6|75lS^qrN0S2rFO51zc6WH&$L58N-1O##gVS77klvvV z<~H0F$dSN)-aYBhh3S-_*X-~nqm&X{jiF)4$EzT~6U)a40)9l}(6Kj^r}7=Fr@nFP z)QaLlL`L$u@IUs3138n}$G_$HgWoVEc6V6;_9cX2d@Y0GpOcv0sZpgc!>X7JO248$;Yo6TMeHD~ILg1)~MI0E-J!PCrz8H@*^&iB8#= zG@MeKY6)5LT$ByjEVS-i!$CWQ)vO^XUins@>ZvIdwGE%=U2^LCVF)xv6*$`WTn_}m3sHuYrBGoYwfVJG-f&kf$n+GDvAcgRxN!4 zl2bs}Gkc?mvo$|45mO{6>y<~-NJ`xF*(^)^dXf8C5Q#_lo8@BWi6^b;94B>gDw-y2 zqwPmBF!3*3VvR%cjSTSz2;r9l8G>7ceD@!Z0sy*&UhDdvo|px%pJl~GUxK+B#%lFH zFXE)^BPD11$%UrRqpsh|Y)uVwP_H_;CZ%M=qu3kgi-Kv*fTh3wkCK^?)$Up+5CA|Z z*nbl%`2h%x?cDyE>Qt$$Wj9Zc>^ogu6F7iaDjWoXOIny0ZL2&6c{b+WuyJ6_MC@S9 zwMjYPcRUa~A3Pf=@sjH@HM#vd6_VQcJEP>!og;;00>k87AO%RIefhaa_HpO7Uz*-s zj9R+8JX)S&p1+iSTm0WCp1|SfPg$8eS%H<5+dv!0aQSnL`bu6hECNWxL@8Br`>t~@ z{L&aHWu<0y2#aS?(8roabY)ZpU7DZ(p8*~cnS6XHM9p&04e`X0T8vJstRR8c&){jf zi{yzS)0YzLFkw`Aq#XopHD=XC+-;e>XH(i&Y97S2g2AX+%Vn7lYPud?UcHGR$3CZa23>A$oKk zj_G5xG#&H1GnRu_Cz+~13Lk(?AwNKE-~I#U?r)RgZKg?%Hh*Jvv$bIb;!JwZ?%I@OA3W3OBpwz;#do+$?y|NPv9T5s8uT+Of%5agg7=_1r6wBPOIk3gKs>RM} z>mRR&qxLAYQFem4LwZ)d_;y|fA1}y-?$i5{V5d)!AMfEo3*EB&H!fZPTEw&Y)9kk) z0RVnvdI0P#?CJDef0BId9O)b_jLhlu{m?XMDr=Pu ziOm7WHLQXNY2dM!1x9k#)W6OKXV|aX29PeQSpgS*jAQ#S3zy!M8Kibpq6r}3C<($I z#B`Us7Zv(;8)fR~j#B;5(g4@d0KIl>RKhmjElVV6HF_eIRWtG8oG4>Hdj6N1zE21E zaVA5&gB7lRil+S51Gx#ps9?Y=gm5ex#gs6}Vt%?l^XaTOC52s}OqI(Se?L7Twoo2L zGPX!in()9xR^=Xg{nOHBfpmr@zS^9tjs;SecM#yD{W^dLGiFTc4U7}`eb#IiLTSfc z-huh@rkWZmg#`PAU@XyJjBt|BIS4St4Kzb*Az-)FKs4kta@+uo`PB^zFif><4sgi2 zqic0laot!IBv-}@nkq&J(@kS6QOOd)cnHl+1SMA$pie9%(p%nO5N+#+F7meAi)5Fr zy99Jb%ChiH&sS++>?&2uOBNy^A{>NtFYn19`>dOL07|9e>$@|KLf%#%qKWnOKYXj} z&PpfB24JOSnD3`$kYV;LE{jGS?(Sh_`DB$AG}=q2^!fGO-c%HnTx4vBDH)qyo z{HWgQH44U#p)x$vi9rN}=`+QpE`N(XkY!WZ3a`;8)uNR`f3ci9*)X1HwgN|kA*Hs3U^Gv7aXlzdXL z-I}^Ph?!1y$Ps%RztVr(eciA6b|y*3E^-;k<9g|G^XldmV23)kb7M>i3iH(UdvMGv z6PN3uoSc%|sq7Dfw68yqH*)Qta?8P1cIQ;;Ac>&d)3Rjsei}-ZcuA9|3_`o|DAZfak2$k&Ty*kqjv>0FH~M6lOFxa4F^KQ66uVbmbgL zP|$sPQH;|ySjpgNV@^oEh)hnhCp9O-zN?*^s>5FpzGDoMqTrbObH?%5*5>4Dxr7Lc zo9OZm&f9*|Bv>l%41*a0W9Jkwn(oMTyMZ4+uUfMa|! zxlN=scRk(5lYYX0Y1K60JwzR4_gm6wxaLggRg(xcZzHMyY2_Q!t@BMQ(Z0F7$hAs@ zY1zF{|0p;-FE5xsTS)o_*D&xmJFq)|B-(u0$c=4qZATtwwDSv$xB;pBIJ^xAUv&OQOQtEs4F&&SAN1K?jbZcNbfx;f6hbL>|!oQ>ZsEH2P`CKT>+K|KxieQ>pGIh?C&Kmx7lJ!~^fya$JR`k?M|b z5xzZF{0Y4&3x-p;SY7>t(GJHPa0R_Gs-)l2zKtScAc{l8t--{dyKXeI8J^7VqUB#v zM}3`DLkMPr&WVFyDk(=WkMDhFsAN1x!~g`BaTo;HD{B7>)&Wl1|C$;);DEh(t$?wH z7DsB7!8BAk18@@18gA{dYoRkQJX|aXdO-S}0MHwsRLBSzju3wP@j%RaT|-@SZc6l= z(8{bPL)P-D?KQr4^}7zbRh)>GH+(8t1x-rwe%gkWnEkscl=sceEg zo5ExsD2IE=-Uk?Gwq+_Qwtet3W5Mm*ps{OBRxyPX@D&{!n$z+~{xAZIJXuoOrKvz! zBS_dKS5n@CgtgV)Gr@Aj7Kz>B{FgOgm2r!2x^pJ&>I_yW^a2J8E(vU^w9*Krz>i)9ddj`Ut#WN>E*{_pKmlUK3B z|D*F5UTE82@}sHhPySzmk%6^^**_AGmzY*@^P)FizJp7j_O2#CmW5@JmdehBGhoPo zHYy4S>rrf@fqHdp!-e7BTj@U4mj^&#mQmrqB08Ds@7FvoZ_8{r1>SV{v|MCFTJ-;z zXVj5tS5mVjEnCW5XzEr^_RaI*ZBEKvZ}WV<4u?G}-Vx!?-6s?tEUVrW6&+d+sfoM$ z_O{_}9dzij9Jq?^RV&`f)TJT3NW*`DcmO!7K1~2ydT>qCsp~LrY7-n>DAr&~JOgY0 z5S%t*%P2a(+X%)%)zc^lj-&w4aKKIMWhbFvZVcD2{3A8KBzSmtQc?2^8@631__^id zP|8C$bhQ`5F?suxt0>#P>LK&1nq zJ!yt8_cw}&p#$B3jAPCKe%ezu5Z^^b%4I#uBUGuUq#*F1;o><3g9+Oru+e=9s@mi za&lruF+fN;LSShhdtBqdrB*u+`k@m?!Skbl)$tY>FskzAelk6knXS^|1J_Sl_4kR7 z!C4W?3d1r&+S7&(m;t3eqqaDs#^a#h$Iw~7Lr@m9-Aaj_Vcb&3nFfF)*uj2B3MFZd zB71?s2Csb6$iBmh8f&H;hr*G_6|_1M5(pj|TeJ#)(0C=|fOHY}LcF3}{U-TJUJ2H! zJGh3PyA|PX%%R_%#wX zIV;$=LLFv2&fianp-gv?{sC~Uy50jIPJ5DoaQFE}+N>d?PKG^P1)dj>qIAC&7O6fz zyUU)cOXk*fVSA!C>o!^MwJCbT2=rU9IZEQy@j9!DqRJA}O<5%aG6^{ykizc&Fwkzc zoId*5517|Bl~byNftuLUdsDn1Q-Wkvmwz8yO4X8tV~>Io$<;p5q%BNx<0)m}*#FsQ zWwh{q$gpycUfO@o5?zM-;mMs3kELU4zv&Z2t+JTz6Z?ydoi5nzdi&Q1+nw`8OH*#S z1j)YLan8%wRBW+lG*H{Bb@s`XvG$C#wq?1mSz{kjsaDW)J$#@o4(qx+ZBQb-l0L64 zQ3O|(UmVotZ}dqpBHWJhvGR!J?*^vVE73|}g!^vFoXc48 zns_!zzNC_2C0<~QDbX!klS#cWuASj|sGo)S{QmM)^3j0M@aURAom3Y5Q3E(A1u=IT zt=dKxL)GeE19KV*_Yv3nN^E2+M4sw2A9 z-v!?1d|MMCwrc+NtYBNG$6vM)g$!}S{2hwm&N(sRODXA`Ts*Qc<_#ox0+xGN9dt9a!r&pt@vNUXPp}u#bpY*yNS( z5~daT8oj$9h0JapnJ)gYozkr-deu#q5|i^Fzp{+(0tXHH>>9;l^}ur*7((R=|7;i^ zemz%)6j+Q5Vur-{7!YhQ5v6DS8ADuvM`_7SV?6ujX(-4n|7_;zm$cNKC8Ny3$(1l8$ zDMfpah&hy}W6+;Iq@iD`p8{2x7)`rmhf-RE3W{4+&QX)UJ92MI`=q9{$ll-8%BOw# zhF$2cS#JTqW3|_n)=eM<(mJED>z)yd*ue`X%5NkjgleOO`kpx?=7F=MnQZl!+z%S^~N*_q1Ce&nX8z1ZG zVHxYvSXwH|+n)UF+In}_u=lULm=QePORsHn-xOGLfPy?q;FKOO!;t9K;ZhYgEy~0! z_zq%A|N3u80!=yS_`2W!toL6bBn|7UfhacO(ViuQe5s=v*rXjPeVsC`w# zHQls046vDQh=gK}DLBr zXZyy|%SUUni)yi86)s#=MFEoMi2AAwJ$egWySJ@B#={?>=@Tu-lczti$=Z<>d`{n9 z>l75;1196_^`m=l`0A$g?b{YpIJXPp{GRqxBQj9r?)YxBv(upA^Pg=!2CNn2G-PN;4C6NtQiuT}E>oPDM@TEC>AtL<~uANJ; z@p1;DXn4fGUiT3!N&-zpB9iS6@khrHLwk@Q3M*DaQ^6KLHK~spOV#XKkM5{iOc9d# zMo=600ukgO>$l+X*#XWv<}$lw{uHV#8ahBv=mZ6*1xBM)J6l~L4dbqGP4b%I5{qbk zrp5*Uv+R1SF%peIMIfm+H{-+5EcA4v;l9Cp(vUQXD29<=pCVwGB>-Y1OK@fBO0rP^ z0b|iwkf(I@1UJ~?cA4V~9*^1z8qHIa6rn3?X`#sG`0_a55kl5S7xSeh3(P3NLLetZ z-NHJ=t}Ez6zihxwJmMp?9RCJ-;IV-PHmDg-7fsAep=}WFpJjokxqLYd zuc83=sY%>hdhGtR6Ux-v!0#4(JS{#)pcKp)t)WJPuD=c8(de*0{4h&*f&M-4JfO4U zKmAZ_UT{;p$cLmiKx{u=sasp$ceQHct*g8J%s+(4_fgNcl|)KfqZl0;Ju2NyXUB|x z9+Huy`Rk~eXd}9gBwb?A@_zE((L4B51EdfjzQ;rgL$&=u7#j{O@=289_JDlms1Db% zB{Q*zdm0j8=ovr%=I55X;vL)zOTZh%&Mrfvf4mK#W@ykQFTEOi6%X}LAC@C|erH9G znX$9!M_XuE8`sB2M_XGPn~A!Z8Y2^DVyw5vXJfAi$LnCM7su;hVHSkIas&(U|AvNz zu5t5nhHBOTa-($W`*}H>hQYp#4&W=O@SfORJ->raPHf~1!bkss0qa> z=@(nj227tauZahOn&OebjM;Kt?FEL6S7cYYE--kDJJ)R|(CwBS02;PcZqj$~rkNFy zvqJ`N!-Cq!5T!EvBDmmYqMWfNK~{ji-BL_kSF$d>nG;K6a2;f{xZ${n6|I`M&WbH1 z2w!BwY;n=L7Fwm>hlL~0LY57FEOgk06Cc-Ir>CMMa(D{|JYYZFg4pMQu!C zXqMU=Gqb<4j>1+Jy?goH`Na>rwM6j?A&Ei1>z6D-H7N7+c;Z>_q!@F}*Uac&4x&CF z%x%qb#iD!^J>oNUrdHsh_`yPAau>8BQKdyR8{J*XXh7opgZPv#hh5{*EA9+wB!82V z3Rk`5XxPq5Z3rAa)MYn|oZ;^yf*CnI1x^zJgS-gA;PoJ~oDtn-7%`N78uxPrQfVW1 z6ueN_G5!a}EM!VEH9fs*GkK^OphG)If_ig9z6|rK?@2{A`q2BmlEqg&icvT z(cwOvb&5;uLKMvS+(!aHVj0r>jQx?ba-`vlJWEPicKNg zb-?MlZZHUH*CPdGYpk+3A94Ab{)eBffI56@6=NQ$RVj1a_NpTu+~p4EMvMHp-gzYE zzt(j zHY_m+LMXvHzJlxvleST_DAR@$md9xC$Rc*3+a~NNENhQ2ysIDpt zx}m3Q&q6U!o0so)fI25GjIEF1(az_8hFqEOefB2%+s(Qb4 z9R%OiQg(I>GLwjHKu|OYd;j9+kQxan=IeKTkQf>TR<#Ufam#SEC-0xu)NA0I#4B-0 zG)ih6=qW#e_^yxp?_Cu|YyR7oq*_1Q7C}q5o@M2`tm3Q0$Wc<@q1Hvu<^Bj^Il66}@Ri)-0Lo(ncxPk~zsI|^13wdSory|(L+J2b)g zys@nShgQMIfj`6{P$^tYY>D3&iTM<~rc^u$G! zlx9)hZZd*%OP(>oo3aH0_RZ^dC*6U;@pE?0Oz*EJM+cYh&-=#VD=!y@PA_**rL@@Z ze;=a?P~elfLX&#ej=0mbxiIQp@dOMHVT0bvR^tK)vwR{AtYIU=7x#)-Lh=diC z>$EA^Crz$8Nydr#cFma`Yn0=FJ6Z%^@ zD#M%O>&b!q%dSdI?A%j~MchaKnzm{Q%rD+2oM{QNbJwA9u{)@jb)N-P*)T=5LR zu;GvUN=bExV7MzH$S4vlSb1(iMyDd#+R}oOv$3hx%lL?~J&yoJ?L(G3M!A~|jLSRI zwPi)v(fjuop}gxL4fz!fd(1!i z1*-d<5M6ErMDiy;zXvik#n0R#Yb;HQnss~`%$herxj?neu}b>Ui)@sRp5+9SN&x4* zYLjQn#vS0I~EONiXgy=DF( z&Y%gikcF}d`iIDcjWbC3&Erq513~UhKm!7yY80Kd6Uvj`XOTOt^M!s&KDK6(OW}%7 z)jFOgQ2r;3?vcQfpuYHQoNEkK+!LgBb&W1*#vzKHXE03pI11B0xO$Rm7l8s|u>2g2 zJSJi98g5B*=}ggrcq4GIr+t$KRA@!pw?bbzZ#3NcG$KBm9i}GTOB!WRGOWQwkj`+P zO8DG4f!J*#9xyyo8<9E)b#BR7X>_oC`1ulS<}Xb!6H+1Qa;F1dmo!Jy{3bjSA2Apa zp>!zNWg{gFtk5Ii_a(iiJdB+(#|_7B>T%y_J_#DkF*{Dd33yfxOht{C5wn3u05M4{ ztlmL#82zi(^7W*X(5)=eSk3(sAiP>|f5cpE_jK52?~<-v5APX*!SXZ3Va-X2?iZ}p zYIiY5UW3U-s81SR%JC5ObxADl%?RPvn#@e(!9C_B!W7y+O zo3Ml&%ESht@LP3p33j`_-pIUm=_D|>AdwS{r{Z`hcJR~2d!GZ6k%y%8kjcoi@sRQ_ zk(oyu>phe5m`Nw(5Q=Z=WO+a`SUt+(aI$r>WlBhsJ``?vqOplia2q&UR~9xRLwVbq z@3!%MoOwB^{Mz2cT}kDJgcI5^;37({PQln0yiFr74rez zv}gg?{i2^+(0pIIlO5U{!v>gTKf+9wVcE)*L;+)m^)sHZ9WIRsJ7m}LA|c9Y=vRmX z0ghudVKjxDJA&kjl5@XkhH&NhnRontar`bl{`BTgx7_P|!^aon#;{zYgSh9L{8tL{ zocLB0#e;}C2ATtiGhAO);Aan;iTr{-`A<&3kn%7*!HpQRR8sEKk9JDNWZ|Y^T5wh3 z4$Su6I^t0`2B!#^FwGNV)F5=&xQ8Gp8GIZjip%gpyhzv~CEyyR#h{-ZYL*+U1lBa) z*za8uK=#mtRqX)wU)aArFTwYo%m@1=fe0NiMwc}vT#@EUd9W2Fl#Q#ANo%$kw|q3( zCoh!Z&`Fy%q^eT!V)HBXE#}%9JN^Vr9+WtH;MVz1q%uiAjQ^frLGh% z;Tg?>pNIIXqrrn|{0Jk!Zxenb2Hu1|pu-_jK$(knyW^wrS`_bIBR_(?A`FmxNUi*C z-IDANbf2xy=@T&a2&2JIg{-jK(RdI*tU54>tP&Xr5(ob|*5KZCTg(MBhonUS{&89e z%5+cxYE}1{rU(lJ%>*kw7+4eNyoG9v+B)|gVO>;X3U@9 zhP!GNtd?g;WyW4Z71pUpGMnsCnhPk?n}7iIKt*edyy2;ZY{O3Z6=@mBTry4;g#-T~ z<)iGNNev_haLe#Zcil}%OF#Gd0d70g%Y}6Vs^Bb%n#Fv{E{jwS7eXigcKxBptuT#r zjC^L%eKSO@Nj{M6m-B`mxxoMg0MXt8^_>l`A|BNjM;pX43As*uegD--06`Czxa<^(oZw z?CVYJ%-GM+ukGsY(2wu$Un)8HS0Fg}SNFEJ-4rRtXHtY+X9OauTrNz2bl;USgo=C3 zUQ2!N`fcj=w&P#@^T2tLBcqX1A(%iSP1Wo+JzMq#N_+@&^5_(!A{h@1av@8BG19UQ z14h5sG8*KW$J^;42ZVzj0%vy=an>k*&@%V(Y#sojMD}1+ZE0Z)3g4-5eRcmK%_wY= zS8cxy&+`qE#sWL(0GRmExoeASO+)t{Xi zQQy_x#_r$R?%(o9D$x0wH7@Y$h#YQ2A$O2-N-jNaw0N(EjC;RV8(IlM^++z{yyg-@ zH5oG@Lj|0)$Wt_tZs>S%dIF}f!F3Wzx(#v^Fd_szl&3+ zIC)|4*64STI+=l+d3*mXd2u$2tqI}fo>|OTC(ANxPyZuhi zi*!dm`xMEEhsC?&Rxl5M7FDyzFNRxVQJx1WRy(g@A!rTqTEa@ya$HxAZ|N&fkgJ@(Ml`e;+?UQA8ehK@7k%#{w{tS_ zI7h2Z_F9Ml(SIq-7U^(3iVZ)2QTz#b^aQOzN~g~ z@!8?*b@;HpoYb^_|Wo%x4pJjTJS79Ahn{{y4m-EpK)~%DXESMl<>wi*=BMj|G0|Ba;A6kS$q7Mef(K@e2^+{3q*$Ix#^}!NkLue(stUrD9y%VUzPP`g4cQDHtgy!4ck*52p5;}MA zC>;TI_~(?54EoE4;|CIE2bl4;pU>?JWIqz0_SDzfZt`#We|M)tCvz`} zAQwHLtJ2&%>HOaZm>X^a($OTUKn9Xlwg@koiEmw&uM26o45&x8)f8ooZ>P2wL?AqY z3!k6w-8*7`zX`9!?=!!m_HzHA_cjHaZ=nAfFKs8uLqz;=PMPyr1gI5KO!%CMJGvS9 zQfqy|yI}=sw}qOSoo@9?19dgA=^nWOQ!0{3)%!bax}}v1aaM<99=7KV^5rb~+F9>D zT#DYDK`Sh9!4~e0_fnBT6<$FV8A1udwOk&bG0qRh!jz-BAK?M!OTDPKonCQUqQH07 zE>d8JAp|GZD7fFG;ya#tsWBYITy9QOA#FgY-qJRwj>?m62`HiSd9wRjs6XJH3)kMm z*DqzXd#?Hu2OzQXMe7%XFnkMSzE-D?C2W7TboOemANSe-$!!2)@!j2+QS}WQ;7@Rm zll-F$41Pkwm;4W>i@F7KT32*N=8Zr$1O@y3&Bf|=bF-~7HZl+nbFqy|$?q98tR3{E zXyZmj9Jgm@3o33OSf$bVlhR9-kR>c49FlDV7`aMlb3j`oWAucoX-YS|7fM4T=U5EZ z)9|{6EjY3A@A#(n>Ae9C+&cR{w@1J@3Y#t%!s6R?E;qFMY`#S4wn6QzBBiJqj~Rf# zEOM!iKuh+$V*K1>K;Loc-ql1Rr~M2r-2U6vA|GNOFpV1*2%DoVIj`o)6Szrb4;+V^={HM{JVb24# zFzhZp!~TwX{ccA$udQ86WK6d*Q34b@l4Dc zt>G8B00wJUeftSpNpYfzh$cee<_U7<9+zmVf7VzyPJBFgokQ5Vexttst(3n;^)KP( zFE>6L@qbD58<|*J|3``X9|kS92#U|HoD2x{_%xHr9NXZ`5Q z+;;Z$jddac9@KGlGD4VSae?6P@-(1IF|I8FU+6N3{0%aTsWDY!Q$nR&J8R6vbmo}r zwQ=8o1_=_fF(e$qAWg)ZQaBE16=Jwcjs!+kfeFGlIms%f|eN@T9BB5l} zOkmIE(H|$(P`20cCd>8wDt&sDR&xchtxwb%yvT1Z^^2kC%5tQD7nlKr!xSMxSx_%1 zKP->$1-X|_11KCnTHVr}`&khLu`Z*)xhX%Kn*lz}sCU_$$*Osy+T@*`p~$s2`1YF6 z+xJ_<*}q~du5*^LBRrzC@kp~| z*q_j_J3^EjdjnWqbqlovC-Rlc{;ykLizVB$+qr!Yl|k^l@+Dl|xgh{3I?jb!`9Clk z!5p!h5_8v6Wfx%lpQRvQsQWc)kicVhhA_OfAu`R-Auy-xR zGY#ylGi8j-TppmRe>DtzclxB>CcD`*>pu{YUVi z79~3*U1}ft=k5+OOskHj2AAic@}3L@WJbU&s-?=f1fY6>5DWzA*uX zXY^-7s^bjeowylUE}sW@e;e8dcv;Xk9*~aH2$Jhj*qa{*g+ddRSB|x zU$}e%FoHQyzV$UitW1!aE*NDfdk|ap4t#PN7b*HK;#REo%kf;&RA&uRT8jBAyD&op zz(yMtDfF;iAae%i58dOEeSv0#jDAlB41)}77H zkN&5R%#Xy)UOnHRSWi8o>8Ee>#acY>_x;OJeA%;?k-_u9P2X=vE04#+?%dn!?RS{- zdoSMyeUC%pUwk~QI!iz`AvIr88&NXx(=M=C@=71r4UQAd^Zrlm-iVo~b<6F>4GfBB zD4E8Qrtg2tjh+jSY)>Nn>QKf0w;93C+U`Gb(_`-IgiTS$pMNM$_KILO5&N$RS|yXz z7ILb?DcY6YZHfs20|`P%x(IoI^3*x9c20bc%I*nIqf`1|0PUUeiJ$B%=h9EV+v?xf zCqHZ(R}0lJ9UQbu=FJu&pBZDTCpLfboKOHhB7ZB)n@5xa#G{;^m;tL z-&fhN^33Do1mZ>bd*_~V2=6ispy(1irQ!9)z3|a-<3%E6{D7fK*c+4 zRSf_WsmR!8NIAuk6llQ*;jKMN&F22dGaen&DJ)kS?Slr9dKRhZ1Ja=r(rx|MAq9l# zmN+PqA*8b4a!_^!HAsFbZb2sAG%ucFpE95%l~X|$=-~OA&pC)&jd`iV?fJxn9~!il z)~84KAy<7QlU;ku61p&E`r~Q!MT5GY6{dc=bZ=L*6s4OawvTCyAL$A>m~Fi z?4X^`u|MPWyKQMEKh!TAFo>1_k`HIC^M&;rN14tI12(KUB&s9b9KVWwxi*+uyJ z^&@)7JS1EW^^mDuA{ggiq(odX9pjeC6uq^gNjnF`E=bM9!c~&yuk~6u`Y%N&WBpVa z;5xIaTsx_hy+7oT0N&iXY@m>SURaucz38emN;~|`qGe5ZYSDg;S(vzxtdzhi3MaaD z(Ty^Z=2#;+2y~9rf~K2zIm0+ShtnYEDoz)WV=68~W=E9Qt+;%8=bEf5 z8bW~ypjh!uYeEFAvm#rCj0q^(22VQ-So!tY1GTm&S%!+* z`=)C3C|Wu5Wy{bH_PSz_-at_svR;TqsHuBm%=g4{`;Fx=Ga`xFC2^)jK^F(e-tuJp zXxR7@pad(Ud(_*WOyWD;+!tx_tMFqbkiLOLx(w#c5!ZU%P)E18j&a9i* zcCdzlo=oP*fO0uYVcHH;D-z5g0x+@S_3pEgDy`nEMyX!t2{#l1<=kH)(8SpIt?VEO zeauDoS6PpB5;;4cZ9AE!TKH%!OAGRlBennN~)`sH2?|y)hn!sbnp^Mhce!tiFUMDZU_sQCweOL<{wswKF4mVlU_dmC z*J~@@uq5zIj#Ixqke=4B=o*Xh~RJs&&srD|pX|wnwGni-OzY4MP)C zwn%Msbig{c)5mX!wr>j5--QW*qkhc0KPG%PJsF{Mt9E=dylj6KcQu6{vgP((bKkS~ zPhYr#%r3EmdbD~bxo&$!)S)TrF!(=qX=`(Oe4N%T402yX8z$|-4^vlBQcx;ZtA#Zt zRFZ@#%-2tcYc4ok^liow%RJAymq)1+L@-9dfkek`^}>jbn>&kASP@02{Ggd-epX7f z%kY}=t;t9~uA`@Brcoz1DJXXWE%gLmYPEvvxrj8w5!ynpP)()qE+H^RHAwlq91Q1M zZj~w`waq^p)M8pdql(7dhlRDf-7N3rlvM1nqm7(ZpiZEzQ&A^opM-lv{IxMMD^u9sKAg1N%f8=se7{b2yWt*>k;^$K3$72`4?L|*J4<>lz5w*>k~z7B zky?uO>mhZ`d#U&FK49)fnUcXV7q!wR0GTU1l-q(n2Wh2T8L8nyT%Dav(pqZVa4vfR zMybqWQRQzt&{e44BAjJRtoFdQ2O&aIjgGIwI?6d*m8+s`cA3txvnqtvQZ4sfdNfM5 zdC9Djz^5Ge2}Nk7>g^VoU5>n4;v=<;dtt~32-cW3LV| zQ~@5dtW@Pj>)<-#w9U?WHF6SR=$1 zH{47r-kdN_qwJAsZQa*&5Gd6jbmMiXiMT9L(NVYmD6%UF-pH&_Ih}beH2;}vaP90+ zo|V`ld!C8aInol2dCOTxqScv#ietS>3x(O!bt*8PZeNas^pGAIO=Zn|dRxFrztw7g zi5S+hdiVgpFCachZ4i7p3$Yi5c|%PeZ7i^z=uJwTpe7xC8zb%ByiW^Sn3}YRPTKrK z{~X;68V?_=al<{L9G`KqSxv)wz7Qlq;{>$S+#8mUvuHwWOk2|`4%fQpkB%}yP1S`E)ER&GkUT2RPn_Uj#vf0BZu2l)#!v&3Lg6^bK= zQLR|Hxq!=-7nOc3poH`F3gcqiP9~9N(lRR=YXg=0sG)mGu9Q0XdK0EePV`=ymMg#` zd5=xLvkyyF**9q3J^JZ{t)1eAg+oK*esOy&7MImR$eb-=`Rr8_6fWNy5#dI=>VTOh zDe46BSQ$RH9=_MO6;QDm7**9lT|q%^;g;tgo{QW^QS)6jX|4u4_%p4Pp?Kuk9ob(i z5Z09Rw*WkR*5oQHQ(k9loy@mh<9{`c4%TAD1-MBIH~I)q60*;@n0Bpln7XUobpr~4 ziU#W8GEW!jQv!f(*mHiixS#Ya+^(nGL$5r|F=~%q$t^JwAA#;B&_C0ZHOD@#Od^pPgd^4jDhE{ZigybfZ z^W6{x3XY3u~sk=&*)8-6hLX!-8OUg`OsFmc5V(cmMi?6jutz zGU%7YcjY`(w(3GOos|Au8W@uXi?!VcKK&ss;bpZ_87UQM9`qsvVt2FtNi6;y>O9l; zuS6`%4$7pNZNxJ+z*oIMyd_f+==JbUTd<&s*_U44*Hb)9o>m{|DRCmQAAZ56X%!XeF0ZFA|+V5W*AU!FhB|NdhTF7vHy;v0*Ha znk0nJm#S4an9DS^^ikPl6d|JKHJvz0l2Aj4^a8hJqOghn-Axq-sm zoH7_}7jqmY%m?gW$A5F<2tD@09+ZaL)bA%LEsH138xtOU^>ELdAK8I>jRC4+LPk}%u?Quoq7^GRp02> z_l50vbNTlQ4B&jR;aqQ&asXo94GDB|p_7R)+lf0mK3T})Y^8RS8|2y5?~^9W@C=}z zhuR`aowG`^YhCqkU!g4RXj>P+%wl&RHialw(ne~2Kjby4?Y*Cja+Q)!L-SXbWy_4& z`qoAu*#G83eFcgMt)Z=TTMlFBhm-)BK)$cYwNV%kv15{M%Kowx#3oNHtRXQ}&dKeP z%a>m;{TnJ6Ui`b;)@~8%4JK5*QB4g_b=~3EcfET5bJ@s)>RVNWz2_m}DoQH%imI%j{IgQ?!G)~32UHdZS1Z%`z}w@*PGdMBjymF z*za!x`(q1+HN&SVccf$A%gaQI1s0dv=!5-WK^d^DS!fH74jR_Z8|^-*fzM!!|!NC44dkObnt`bmx*_G@y7B$1P1hroL%2AvOKH?eQ!RR@l(N4vy) znvvDhrLXBkc6gfkM5|s*`F5YR)9#;uE8y6k;$*p*l-RMKumiGYhpdO2%W03JiH6M{ z=nNtm%%_>{$rw|pgLk}BKVJJJ<=flu5}_K}F4pT?sWlsogUrn#yxf<5!#0@<5}t|UYZ_|zXAZH|=0bYgWeEJ~W5YxS1e5et#mu2N z*5bV*aQ8HN>ASh+pfC2U+X5c^TxL(we&n*-JKZtu0*E<86%_oAXW##{Kt??+89cO1 z?z0ptMh|D%Nx8g$ru%WynbYvtyW!Latb2ZrD+c#~pBpu!@8M zp*m24e(~-7Rz~An8mFZG1m8TZW&tt+coCVN*Hbf5E9LW6cQsQgAznI`gKiP4NmHyQ z0)Sfw?mG=(l~6`H=1ffO-G{PDE4XfTxwjvUsQvOt1WdwI{8dOa5wHg3e|{$d)V~pH zIe(PQ5px1HrvTay=yE7YVTX7LfUKV0z0=f9j{FoaHnIrG9UrNy&Nu^OW`cD2I}Sz{ z&Jtj5wWv!IrSPkDOQXlCk@TW^Hul$G745qbDqp`p~~p|R0xcdGhgpgGct_esCy9-F@oy1)DXkDmB_q0Tn8|4DNdYy3Z} zMFMV=Jgi|GUDz`IIqSX+J@`?8~;Ne`pmSZ-LcL zOX{@2`5YlDz~n1{mj&s+`WTh7#(S`5-t|*Z zYjFi9BZ%Z*=^CZCQ@H@UkdEs=p^hE4Ufb+JzRN;R?{H08isZaMK*0Vk?M^)ex`8mL zRSJz4f%H%IRFJ}kkGqKMHR{&h23bqJ2zT_8?5$@kWl=_fZ?$V!oNV5ZOtXFleJ*i0 zpkuq_T94a&319Sh01##p|D%9Ab*n6cH>te_S&?A{{#H{cV@e<-!@@=eaP>VwNL2jW zRY&7jv6r8Wn#T1YrsPzBHQ@24WDm;FP3TINK#COCkAI9KLjLPZ<`U0w*I09Y8Gz%a zF@cfWBQq|O2jgpvX} z6CxF1=f!?VRIxuETaai8w?#r|+)P52pNXb`hgGaELilfX&&=7Bh4P;QVKs7Tqa7dLvOY!i9QSARk~iOgC!WbV2o_P%$Oad2Xfd3r3Frp)DS&Xs#`&thT%dD zJP0h-h_e25yx;mix)bTKXRhuoQQ7q%mOsR#O^jH)Kzz3^5?#YdwNq(KWbIIi9Qeb= zTC$8*M~DiiUZ&DGi3LwHL|m~=;f#!t)wqqkMn*C*u4!|#QT^Ucfd%bsn9KQiL2oWg zO=dWN<4#&AL7<)VT!AH{mYj3pUk*XCvS^O$f+v9r|JsHl928B})vC#ndZu=W#_lcO+@f0ZrLgD5F6r^4Fj$}b}1SPG*iy(=ZShPTVg3|vWeNo(>^gatsGzTk28&f`g1qeFk-5l-0 z>ytFXH`BM%VEYQ4KmG>j>N^oH>RT6exh!ct5o>$cg0$8iiZ(JBvwsd+arDuu- zGA39ej}&UOMOOjo(J^6J0l<;bATe^{Y6?JH`F)v4Pr`_{czg|Guu zW+IVipO$im+I&Re$W9O=v4y{sFM^$dSN}Q@J`W+rX1-yvm~t|E>d2b|IH1ZQ)>G4| zdySNcdSs=-5-*RX^GyZH1>Rh0Byp#F;HHOrBl~0ujcbS{T5vD}$WNp;IO0r{&)Y9J z>&ZVw({%1nb!YdJ%`T3YD~&gUVh>LkC?o>@-L8Jen3<4>Quq64P1x$PaCJ$ z=^{Wh%BQ&c1azrWj}GoRg&vx_G-Y}v`p$r~`xTWQ zP%~AjHR0VHSQg1ec?H-?V6@*%^^z zJD*v-9adXqbf~&DYeII7muU5arc>in!{Rnn7uqC@Svq5fPCSAulw%8TCGo0KEWvmjj?TcORCEeOn?b)hD7p^vAzo2uD8FpJ>MuX^WW&+R5o6LC zHDF)I#$|(krTedwIUHI$riKatKtdqk|2CQbKVyaK?n@VJu>|@zJvjx~Tpd705FKmR z4||yDIV77(F`{OYMJf-DJM*mXE!`SzpAjlY?`MwL{#+7cBh-&mvdI#S?MO2zV`4Z z51w`kYG@O#{-)dwZrkO?F5i|^H)?psx1KI%O-wbiX8!p<09in$zq6*v8(r2s8Yhb) zU)q9sTU_L#6#k~Si*-3`t7>V0T-MpDp?7C_yHe2f8~#b}&fANnevvn`Y{l?+CiJVK z!4C1eHm{wwie_2NxZ*|Dp6lncyjapx+3}02tlFw9X8h`UWrzMd82HUCq}^ z{(h`xEkDg>AK<5{rsiDN8{SLQ=jFi|{~rJK&0hNahrQ?j`EvhzdbC?!)0gMja+#ej zbNcn7n6>onr5cod{;FvB`Ri;24bhK%)w}uedZmjUtlFX~vn4m1U$v$Swh#^hzr8J0 zY5F?Lpn=gn8qBI#P128fIj`zTUChoWX}Ml5(?zi~v$p^C)vNTom#_Bj-76M=f0K`S z-6(izQ7)?F*)$n`F;2c7?I8Hb6up9FQ(aBo)N1-?mHJk%OIVn6cAn2Zz~JxY%O)2P zWWNYns>Ya?&~D?-Jz%4ejHslZGJIM6wq>>)@P@tWZBl$(w4=a{1WFzzuJQzf63}1D_eel zUYwn)w$EEThJA&OKiJ3P3ZiCT?|LeZoYw}~$DV(+`%x37-VmNgP1M|vs7O319{}=sn+QOP+`g5d?vJXhI9HJ~}%p|=m6oI)k^yEkSsc^Qbmic#i z)+$tJM1^JXF}GChV=i7btt#Evd4XT|?)~}go4=}or+N~eAG~_|djBYyCQqJx6})}* za(@rsJ$`)e$Cvvr4t|7Rngf_Lh;74BGMy#^?(5**J+T>JUQ`Xe+uyxIy8lj{{o`Z+ z6E}GO-h8|F=XKK-i)-5Gsu~l~cY}Gp$kxktpo%W@1^%5WEXiy5Rzp+pWubPaf^wkf zKWawe zl^?rs58fU}09WgFJIGG;Cobr{!@~$@b;@i9+Nu8Z-aUAx{vGb^z6OLDIs+Sfy%~ET zMo#rq6@2sdSVQTnrrL!)4LE&p2<_fr2L~StMe_zb@|c+Hz5M=%nE??jP1p_eSSmtNh>{^q?o#a&U+q#bb zZn4bHuru@`;THy$n&32?)z?K?T&yqb%-X}&*37PAHM6UYHPuk5Js0b8vQbALHnqc=Eh-%dhKrHbeis4%+@%0*isUudc_^c?> zs$5d_3AF zfM8E$Gv<4x3%iwp*Kr=GgS5;q({$)Q9{GS&xw#U+71f+ltNQl@Ct>8zBUiI?wO)Z1 z#0sDQ#LAiv>{ljY#E2CjVrWJN(L*yhwt}FUx2R;v<@S{fb)hO9G-e|hOGi979yQqr z$Pf$<4sOnkwFQ;9Q+-Vn?$&r7Z5fC_Z{5v1?JXi2k=$mi@sak-B(g;`LVI|u2nf)E zqA5y60m@lEM0By88@ZcQ?-PTK3a)vkkxe~Q--nOKgyns$8929U(R}ZNtb4N=vfJ;C zka>S>gv;d=RQ}cjQ*V}yKy^WwcmCP~mbcDEs9a6~vqdPQ0z3XXB!wqFrODzPMtl6RQz z=fB2$%iR)e4R8B&O>>szJwsx7)smiKy7|4I)O`g)PG6>qJ*U)8laRNHX{!= zin3@GPH0q67>YC&^!m8WE<4EtWQ_&z@2`$$Wx#1+(9Cki#QqYJgmQ-xkPTHr5Lh~1kMca(0phW9^51AyqTg!r#V}8B@aIa*RZ!MV&L_RgVrbH>m3oRd z*cCS^bgavcR_k`PZYO$3JzLpd_)Y}W%}sSB?>)_n(EkFdb@ac~K3=182bf2rP7gX- zoSf!oitFH^g_=ny>@;wN1ME;t=2x>6ju+8UAldJ}&6?cMTeUBp3LoJn#guo8dZ14w zU}-w_Ua$yf$5aAq)l3Esxab1w9-3W?77n~s#mVM3K${Bh zxWFzUtFOs~X|j2Ps(NI{L0fd)D1g0GK1M|mz>YS{D9ZD^E?T;kQ%emOa^2@=?|vhz zk0~|azT#HYOa9is{p3vgdr;5GYTcaEWDITV|3i188FRJbAzKy!4V|{YI$&MzgS}L9 zpI(;j78r*HR-3V{V?HD3XWk)XF&{V%O`UBqG;L}Odg3jmeXCB*57C!*Ju}FlY$}b& zh9jU!Y-uL7i1^5@PQ3++iC^58*jeJ2J~aIsKrU+MA;k4g*NX)*?ElkHU(LGiRs0k{ zg_1WX%WC!^)FRUyF}tfd-QZy3seHHdJ^(P!m)jR+dp?DjfefJ9qR07F2# zg!45?UXU?o1K{Ajt8(Ru7_zmm=+PlHjn={qzrAe>9F-QY-)y*3 z?M;XT);YVqGfZozPZ&gYbFv&~AK(B<&fuwQ{n&^b8z>?+k<^IOV^WACl&HQ%f*l&R z!X;ksK?zf$Ll(8N2-|EdAy_DZY)D6qATi&mr{+QnK+woQlS2n`gEVJRESEx-ZdPhh zU8)1Kwprcd9ti_?Km%}j+fFu>&LOI(bQN*REl>(o|3|9}G(}d?o8L{wgQ8VSJ`j*U zu=f!}*M34VR@W&pMa}Op7{PXBgZIj>D_M(XW0Z5LZtNC9pqAMRQQIhR17kCm64i$z(G2ej%ZH z|6VY`^L$p-Sz9st%Y>)&K!gl34lQcyZB2B?0T9r;yYG5IF>cLr6oxx>H zrO;LN|u)Ns}gx@20&NM5S6ZFh0RFv|GAHU9Y#Z8(FlZ<~?a+p< zVo>4b8=L|LFNwZi^#EK(=*E8d@4&dBH&lA`*Q4XT*TN|ZE~(~OJ@0g7!ctGa`r`(V zs8&r&%qQyj@a-Np&E?n=$1BB7h3GhyIz3JIcVDCL;SG5is$HXyh9tcVl=t))aKx!M zQ55N-8IC^ncrhJgoPt-?OikL*1TB~>;eox|r&0+%Wpih2UfZm(R>cxG)J~@jxOwhK zmrr=trG&$%21E95Ocx40s``2gEY3*OQ*7frztVU7j}1Fcl>G;Vg~Q!%pWCj#sjH8Q z+i#L{^-2?Cx`IL`N-=MeB9A04YAx@l*0`8%sP9-H4 zqK4C6^fL=jN(iVZv>eChigDxjKn$1fDIcQ?c|CGt+JhS~9%ie*o0E^N@60N=X)vHt&3(+5!tgZeS!hv)z1+5XZ?Po$aVC7iCW@6sO{g{`bebV2Thk8R=?~dhK!DyY%`eu{ zQcW8$Ad9+hA$7?vCv~y%3Z3)a>qQCJv%S!0k-MlI1bP6wt7rN6{Y_ro8-1@`m+c%64 zsx}(1`=&#=7Qp_8D;RB5RA8EezsWPyZp( z6vkECW{OqeGmRrqM==<@pz6&D9}LZ==2j5gZJXwRa>ypp^iK&mwb$@Ayl*$wxV*2WXyzpDqiWU{%aH7Bk*BBCRiweg9A-R z$D*#v9UYF4b^%*ASIvaqZ*QpgK-%nCAw`JBo>b1!q)>7g3r*UX^krkI6dPO3m%ZwT zo^tgLL8BuQh+mvVfh|i5-g{#W!((?@AF?H_z1fD}F%w2$W4nL=>nUKoJU}b;5DM~@ zT|n63(1~#nKZUbA#jB^&ZK6MwD#_65djkUm9BB=_z&XROIQ}bLEHCE zpXQ=}GQMGChHSWsC{%rZ^t^^MaYJoB!E|5>+`C~^NZcTBoD3rUbMSrOohzuW@**-0 z1)cK)Ms3;#d5aGR7eV!L*MLQgY zoq~_{=mje-uWHQN)wc`q!F0rd^k>TrAkjTt+8wTEvM`op|5Oo_u8E@fbQ`A0crVL& z!kV|4B?BcI5Yxk9BLhzjt#=Es1UqGV@4igCf{O4|qQo^NnjU+%1)X=wc`*7TrI4|7 zB>rAt2|4W2RBL6kw=V+|HIL0_jB|Cpu<_k;=DoP9@89IT8#}(Ci$&74iMQCia^va^ zn>>t7tsFt$#_QQ^u}xNJCt1Jq8#k1*nRpYqxM5YXQ_C`XD5fXCjc&x~=LH+^UU%^0 z;s*J>U&T|{d%-Nsp<)VbIKcvN?t`H90_||&kNbu+qf_E!y*VUJ@059E2a%mylOE$Z zr<^xtG)Hg?Xz^nUQ1p;@w|qD3Gee7la_;Hh$(O+@f+q`l)9JhU!&mCb&^N&s5yq!B zkhn{k(3lmttf}Tf$KiY6T&J3ab>9oFb?R}kV?lnLjyb$)7!Fw~Mj&viACkbs53Pxq z8g|qz;Aj)3u5!T><->}ilCEI05_ovpX=HAc&i=7rUZD4l{x0Yc()0lYp#$U~lOIXe zx@K6NB=RaLIF587vvd7(XuiHUHE#og8QyVq9!Npa*qNk_QQ`b&znyJyoZhEsh9cri zIyNjW!df$wskK5GQmTLnb21!v_9A!LYR{3>?~5~l(3s`j`=C6!KA{x~7q=!W(Hcuv zIWd5s=7aY>Nu#oA6|Loa=!TPmwVvb5;5cUUrTAj-jlSx_18RDM!14R17I@3Frp zWaVZ1qiD*n(F( zifB_1j~K^edKBeEozAgAj$_k;rbg;qgA24K8uy_~Z^6Bf+E+>-@_@7VpLP7ui#FkN z%WN~$A1O)>!Iu^{)$14@x9b%Bc@|e*W1%Bo|Llr!b~Q9HYX7LJA#O(N6zyZF2@_%Q zI%U^`L&$#scMgLQc`Xk|lVx@3c*yf01USWW4c#k?r(d2H?I0o%ZiR^O>F(#2UBs@X zWa^uqU$4%=V-Y(D>kTg_^(w2|0(RnX@X!-_J<&rZhQMwRq;b^tIf^e5pdb@Y7y?5d zf}?A%L=7f8MNn~VKuk6T{7hKIga?~LN=}mu}&n*TlrKm}^TB)By_#rkH1jq45A0O+RYDFd~S)(l#u$Po3?>xpk z-L{LWGs6vD<=S=7>Ds|%84DPNwLO{@p-FcN2t!z6J;2f7jQzXU`gg0Hwyg(RNZ=K` zE&Aw&?aB87BP?m(J-XgWJSb&qFY$ zVUI4^NL_vevIkoSA%m@}U@@Iydt>9*(^e~OT!#C1%$K-ytmPb%$!_vhoqsHo{P ze~+<8m+FLQR(bXTEyb^^wYCD5rji?@v|%XImO}cQ%lb-m;_YLW4}o2RVLDlgnFLX?y-+FB>v+?4-%!3F{^lMqz&T$a`)e2*uQxJy9Z6cXdD$W z1oO4R3HFy}>+`MoIu8Mko#p33O7?g)o6myo;_lU#q>QBA%k}LO6DU zJL4qu1+>r^sx}Aq%w^^^;X6Tk)_ig{0Z*fKyLkBZU~{~GJnME7J)su5UYH)V8EO?T zhn+w@uLb~1L!B7m>hO0Xes|1+&?Rk?7R<>i*q~yYgYw$UcAKVvJmzJ7JfowR;O2_X z%`lQGhahl(tTD6<%pz8>?pWl8<)zk(&Zx)t?O`2X{ zp6@grklBQJIkB%~x-_TdK`~$E%i`2_-c#Rv##7C%;y`&{&S6H+)j6&NxU9H9qIQa| z8Lbir*T67>L9;rap=4Gz1MWc3U4xjJQ zo(B!W7L9)f;<&8FT33?FOP!DqqJ}RO{l5g`>1KVAJ1DAw(K71$&4@-zG&FGUPDIVy z+8F@y$3}|JZ6kn2*Io95Xw&#!T>MC?Kvf50?2_%a6IQ~XVHgzEbFU5QnY0L?2oryS zY4$=)(E7kVZv~qAqFvL;Kg={SodX@s5x-(6u8_dRC^2=E@I4fj zuMnX49SNsPEG3)>{fiR79(}Xb;|grV!GXRN6|{V?kb)WB;0aWID67kI5EapbD|-gn zHJ$8zVQ0~eKNOtS+Rwm9&Kw9Sa+JD|Tw-hUq)h4lwfINQ*;G8^67|9sao@Q&CDX|5 ziCf;}dYL{M2fd*e_UhX6l4cHo3g};M88P!ye<`G)OUFvU_=07yNq(bzQzNn;&qBRx zPp(b@7=kQ7X62-X)XF-KtrmQ3dZJAnsIeJzY~&m>wN1x<(7B-m9kuxzJ1vZ&=jY~I zyRhM}ACHr#UkP|UUJ|Cv=A5zIv#oChgVV%xWo)erDT0p~AzILSw?TZK40qKjRw%}V z$op83`f+k_gkMJ3t2cFZs?Nb{3VUzpUeFiJ>uy>J#DoP!>dI3sw^6DWnV>uzUv$u0 z58P`mVzzvnxrp||8FcsH_2;zCvk!LtZ)rh$ck9`h<*X@i3nSRO8Nl`$zkZek3&(+H zFnoyGe2?)84R{w&)vTI)J+B@HXz19+f>8GL<9k5|v=@4|Cd8mgyryR{W`c*NQqoSo)DtsfR)%VQN_iI@sQxMt9v`OPQ*7Mlmj z#o-#$NNFq-bHQ8no}8l5b>_egJu4c|``4$jb(f`M;{7y`T{G{7i@5F7+dvdVnC>|3 z4h}KmdK2H9JTyA>LE6JjX+cYoE3td_qliy8V#{UUB_>>1XUTmic3%mSYqdv*K$B$D zAV~*Cp%$FO@<0wJOoD|?j%4X5!%9P(D!Ps4mXV0F|$s=!RbabodUVwaE!G_T15*`-@W$-dscfw>s0_XFY zKRxi7OeXl(4MRS7cUnP)Fg0O{TYvw9n))jFv8tEzcaPo=!bYi<&X@#;{Ag2pU%gn# zb8mfc0343UQBS((Mht27W#&{vC*1J&A{P_aJD5tvLBH{a95C_RFR`322o~`(%!bp4 zq}uW$E3eygx;6qMc8a@)h&jM64kk#QC?G5C#Qe5+;u!A*S`zMKpRlz>|iuA zeRWCcHbkZ{GRNHb?^8?>$Ck-J#g0(-q+wtuf^TX?QzM z@qck}P|nVLtK6Kb4?m*mzex7ki~E$vvnSk=2ISpUKIzbZs0{%Do(b%;DTpou`f&j{ z+fQ?R=$)OkFr3JANO?Qu$q9yD#sbR=8L-JVY>N~o05h_2c9%_+=u7g1bG@jc--q(| zlU3EAvFNr}`fyDHop(taaTCe#B&)wMbt02HIV zh=NZiUy0NggClIfwFP^jPbVHEDdVUMy|}@}z0@`%zEOo&G64?EhC-5KpbzGh@{)ja zt6^9yh@VXX&Zt0E78iV%(d2o;k+UB%MdeZ>FK7}jM6|(li>Pt7bq}n!Xnq4~;gTV) zhYJ*6P!wW{1?3OTCn}F!$lxC}i0rLLKow*yV4r9OD@N z2yJq=Iu9r;EMp9xfdu@XxBWzHWQE&D-iEd1Ts;aOaZ`6gi`Ad<-{{Mf(^AP_enGX8 zQ~ckLeCMywG<+0uY}JCMKWIU$MA{f4{_rFu{=rQbay*cBx0p-X-M`PFPK0?^PU041 za6^krF@yV63&ukWH0Lv+=?WbvO&Iy*Wkbo8Gt}#`sHB+td?9Zb_HlwY;G@3IHZ*5Nk`-8a8EkOw+U;@)~3GSi%7B)qy zhDPnn%mgsJ{p!TwY-teW*!MWYaCbDVNZJ;yadO4)$bWSZLG8{6<$Oyrv-|{DjQYo{ zhRaS=A=c~?0(phXMho(XU`(Un4HS{jThMk4SWgU~xIKmJYWo_f#)K3NWyT0lU#U_B zBp9faRRX?R-Ug!3=O5LqW(%;_$C%wQbpg={I{=7f+?=1BaK;SmWD|Cfs1Kq)HIQdu zwp3kQp!d|ZzSLx zrwE$Red1H~YBeDKT&hV?eB->rZ9A{9J7WAtAk3H=$gZ&G6|DZEIMb%Fw5b|B6R-eq z<>d5m(gzmF1}k6~6U5la7)o@EGKoM`m&>fi2*0!CdTuHiTe#Mkr_vlKsaHvkaOs89 zsU~5yT%Q$?$trJW6H9QQPdLqH2ricMkSM#u49_N=&Rp$Xbx^>}vMCqL2Kvw&=)$Lq z&B;%5w9!>6vB@X~1L z9~r(vn}Qi+{U!M{qQLn7-B~m`r#$^_khE4u2fR%#*Ut2slzS_5g`xn-<=ikb_e0k2 zzR&wbG$;z$_ zqzvu3OpklVG{%^q;o8Z!QwO&5@X?{0hg~xpLE}c>C0w58I)9_grxDOXE^hKqu)*Q2 zQC}`!ov$S!bLqLI%b5)L1}>p8UX><;(F~x;@XVrx5x7! z!Mx`$g)X>?Lt><5?|V0A;R)A0F&;ybH*@kzF}CY~?!^pAnMtW)5>(+mhh*LrAJkT} zN?a=bRdFl8Q?1Ko@gb+A4`og}0k8#ANRsc{7z#nYjBBo=h)`adjkPRJ>#XkgklV0T z^!)JAtRefo2NVym+s>}kwaqANB#kHQ-+S&N$J4AdT^D*1M{mESLj3VF2siYiaYjee z38JUmW#&h!`#kO1O_HV2rEMzKm zgsK?|0uW(;#9l`CRXupUJr9LDtA|R{g!05@O*@QH2jS%+lEj0Xi<@6|U}J<94W2*} zTnv*tz$qJS$SsLkl=e{r3;n~=LQ z*fA2I3HdiQXkZ?VIUej(V2BeR7Ct^l>(7qYzl~EQrXg^cli?(kfME#<#gzyKx){7= zEu+EN8{3sX)Svz>83dIEa7&}uDBh8n-;-GmpsIfVHEk{|GcoWc$Z8gSt6Z2T8$A+! z4ZRr*{8@lzM%-EMFgHA^8?Qw*E!s-e&XqqT{VmnAG}ZGJBSHp$P?^CdSK@l!9%3mu z*26(5<|YV066}st=PJ@2id^ecqGzYPtHF(0AIH-}2hAGv_1F&z{M>bW+QW>PGTSmG z@jKU;92nMEW%G{k@?c7eLx`maup#T5xOGt`NV6t70Fh1^Np=E~-_g+(Y(hyJm0O*- zi}jK?-^IE{^$;=qEjz#JqfzKBuk1RDU8;!bT1gNYaZ_)y67mRQszDMh=5=-nBFSl0 z<6&2$iC^Zi^%MZ`XGsaX4@J46j2m4Fbl6g2F!3r3Z?gsW63<3s&}j<+TV@iIIYBoh zykS&~r~}?)Y$^{oM0Kle6Pa|9iLD15@Yn}#usP~>54y!X8T_prND)zSUF;9&qiT1? zRBt;dVaY-FF(!nqNx z2?(f!%!8XCa?qXe(7b2Og*Y$8XpEVz+X-!I>~+Ph)E}eDgRhw2;p4IU*z1z^`+y}2 z57wet7PCBj4j(=KX0b+z)(h|U=d)tufa0#3fW2C35X)NF~V`PN-YZO*Cs z*Ihv9p5lc@@yG6Q6d75}vk~F-FryX`Tx{t_2z6Z4naL&*2k&$z{u&qNNW25)o%fGP1u(J@l(%iBK@h0O>iJ+1; zVQ8k~ft*IbZYW5=z5G%NiQ- z5I@AZ1GKS3v&w1;1_)kb z)h3L^gfA>1$};9psN~JeYr6C*x5MgG^e4l z#uED3LG)cMDg`-5u)%!?t~3MJz>QK3vA~v)Rzm3Ix}+x7LG9RU%H8t% zy^x#ol_yl?;AGP!X5CtT`X>lOR;3*L2gn$*sW4%8ED@|7l6M@9&v{6437dkF?fBvs9`HuE@p@Rx~KwVKeb z%AMlRL5cLzh&m+INSOyj5EOfUdGP~{8>4Ld>{pjTdRw@a3}R&D&C*EFX#YXfh3-Oa zjfmI8aDA@`Fiaj~O#DhH zivi+7Nt_T>or%tj0U^!Q5|j*3sLB0{yoj%uzb97#p}9tUy( z5U;8F7fK(z4jRhjr>ZE25jGk=#6XjmtnI(O!PXae`t0=Bm91@8c)VNNf!J}-6h;-U z8%;yPj*g`yYb-)E#S@D;jiQnKgp=t-SnDx-fo0t=;;vcj0~^q%NE;F_yHICC+i8Ba zf>6rpeYa)Nwr#ypEM|M{45MoqMt*N%77lU_Ly6M%R+1j4pOR)!5FpLkcZ8dj!h+?I zZPl1f5ph+D@*{^l_jUtRiflqr^?fM3+Lz)gVI4@W_8cPjDL_T-m_CRyy7uIQ=TuY|h4?DM0 z`_*v@7*pq`_`jE4m7;0@a2ZR39a>0_^MHTu=ui`J%zIg4P>-@IA0kjrWMI8gH-s3$ zk}3JGvOMx!R+r{GRg+uuSTFiUrzcNmCSE_D8=G3hxDK1DMc-nkGwq$tb{s&I^g|#? z{8dbEwQjp8&I2QXLl&Sw?gk=|3_|G}p8u^3>5Zpd6NKkyiOa#-ACUc)AJEF&`YD1` zT|QjqAM<5$nW2k(M-VKw#Udkh(?oCj7sR%cyDUPpMTT(Eu2ul(r^u9jW#2 z;2j&KtDg2x!ykt;AG?aMrrOp*JJgCyg?*;}Fw-7+Q&uT#im7Y#2_JK5G9Xj+f%_UR zkYfN@#tLGtVhlQW68>dK-EU#n!4thvOZiW-|L6(LEx`4}<`&Ga!i)}MVsPZ%ZW^?0 zQi{1oI&F``sGQ`(*A=I-N874HbAdm;Dg`=Aex;y+2gn(0!-yNnp6&kiDS}JDG6U2rA8i zE_l|A3oWG1AtwS#MC|JYPEHVh7k9`4WK_$m&y;Cm;!}>so|?=oMDzmOzGf|%c@PB> zXvsA_>bzao1tLL~RCPl@JL?NeB27X=O!i|*$qc=TmlqWu%6z9Ca<{7tGzs^*Z?wHd ziJ1Q6tB7G%8L`&dXlNug<-to=a~{0j$lbe2QII+~wX-v?T@DU<#-NarMygrfG|q&H z?@^ad>rUeM46Rp+--sA2{1Qf4lu$?!wxPB#H@St-$|FpdL&jAH>GL0U_rKqZOfn@* z>T)K~(h&dsHP$eoYudk?FF3W+kbB1oA5t*s><(Ou)lQKGbNzVy9lpW%rdN|5_hw-I z*Jih&ZLTEl-hT8Qd}6LgorU4Ec_icD1|z(@ke~RQ;L6XFeS%7=NWACZlQI~vih_rW zM>58{VSS{UONl@u@?w%vz6?%(4}P{aoUG7!|X(a~r|C2p?&HqLc#hGll9L zvz*WR^T#_oB^rhenEd^0A7#ClCE7M~?%IujwY}_6?<`NZG~>r~cgGQXINm46y8#17 zSddfBa2@dspnw7pzE4<3LOoRnc7d+AF|&r=*fH#Y3)p!v!w2;>B1-S71y{MNVl_!W zDtcbk6TG&f{YO{3&`n1?)SENp&ftw3?ge)`w2{JI4G%VW8nUXi52y6!4xB8`nBGrQ z^DQPx*{v~^Kf#5gz&LbIAd=w+XpZ(VX%cxJN}Ko}Rn`gECR zk-fJG;1cIS76V*-o%upRQi!I`2JnQ05V-Q-hozm~z}G+2pGL{Qhrw({TOdzFc!NRw zjxxUh%81K9Z}P`heS^1eg0&-=I*rEs^pq+6p<^D%;%9}!4j$rz$lcbh!p+1Pp0_vv zkxB(4`zB`v#AdD*izfd$AydfoU0Tz-bzxjk5B@q-oE{-RLcIdbFm~0(MZq-RWecH? zyCa0k_O8N2I9Ga%PE{{W#dTQkx~rb47;_0SF`ssqEyW2%{thNzt6GajXAif5$G!Nh zJ;pIMz<6)SDbxILuq&EjI;P#ahZAzHcT`G**sYdM8@N;e;Z+8fn6u z>)1uZ45B1f^Yx4p)kTw3$QeHwZB1+v&QGki?&z+Brx(VrM})+({7cXvMnZZGE{OP> zFvdk+i=Z5&(+!^F0P?nmr{%F49=8;6G*osNsDH?lvFO$T2@asc#N)|hkupmJUeTNA z3t|5ZZk?MnN^nESHXd>94W_MGR%!)0l|Z16fTWDV@le<)yjB~CgPB9~LlII4sPLlB zE^PPB@Otb;z#y@09g109`6c=_MgpnriD zFR)BQp6Bg3Hl#2MWE+2XTKYWzC8DlXO+!s(RXgAN4pQDNFt0}hhF14|1D zS*T_YPKEa829DNL9GmsERKb*)+Sid3@Y6^@GJ(NU@qHYk;uQZM$I)tPzKy#OV=BIn zqpLgBUwqq1y#!PHRhl;%I9Aj%Q(_X%w_u|}Mn{H(rx^UGCXguvuD7#B=P?p7q4!?b zYUj3CekZZ&YDHWOt@#dK8roQt%?fN!WKBU1Dd#+5F_MoL#jK^DsQV6LD^Q0C<7A}$ zehWKhEeLq1~V_ETa^2w%s)6O1^EOh*aid8k1s~QP#1YmsoG=AcpXqD;64AyL{0;OWroz1$ErRxhqkO!gLmp+89ndPy2j% zUZ7VI_6yj94Q2(2OStqIa8a0Qrbnm0JAKZvcnNO8iFR z*dvR628ZJkNj)3GHp}V~5;V2`C@f7AR0xX=NAGBO?>l>q^(J12>7mnSF6VaNkXJ}= z-^CUGf5_JSpJWiOW^V(NPVrq*aZ&-h-N$Uds?Lbd#>|Ul=pgjFq4vL!q4qBvvg6l@ zPWVr3?@*U^;W9`As$MBjc!&-a0JZ9)cMqSu_a{}b0Ksh1^Yj8u$Zvwz@cED{ zE(dKnqOW0^Rgp2Lg;di_FemD$yl5iPFSu8*!m6G#9gx8%DF3Ms1tw11jCOWmFW*~l5)<7FbtOa;QJIQxn-Ng@6De(P-<)21q+a($Hvtw9zXOVsRh^w(WILdTpMfM4KN3;r&egQWo$oE~MQiX&r~hM@ofNx8jxc_{ZdyV3 z#4Xo(>_5KTe{t~RQT#o8lzfpA%5#GH#^yhZ8`ulz*fqCycT4a=jt5jwa6HlvnhE&c z?Wn=caqV8V@;2k^_c!tStf+5#bo@g7JKWoSeUx;)W0zpTvaVaUZQHh8)n(i6vTbzP zwr$(CZQItZeb1+L&e~(l`3Ev0BLkVwi`U8P^YH9O9HfAw;3ksQwZRaj0KJS-mM|Su za`%K9VCDcud3^(+;WTX%V!qQM4ufC(vk>KWC4-7aPaRuYt{KENxMShCMZxCG%$2&# zs20m7dw~;xf>=t3dbjrH2O0NG{^nJG9yHmt!2LybIcFxm3&^q3#JqL8(Q!8Lcnvhu z<$5eQ9i;Z8bc&PXEO_b;tA$V%``vB3xx(~hu3+IQ4JovGiBny+{QXj4j^*Mrg5UeA zWY(J!ZdV%C#hWWl1w960vHp zls3pKWW!b-Av)oWYh``n5~W|g4DqR1EL=2OMEweqZ*6e^Dj;Wu2_lkL>BLuuqK#Fp zWWK3M9H9Kg#Gzc4s1ZlKB_dSsCBVDuL+>mmls@LA*Ywchp1}S7^(V~Uf=?0#yoxv7oH%T6}LAo63?>>+zLXQ47Ht3kUjnc?QWEL>?pta~WOXL6%k zPU({vUK*=|FFtEzwWxmw{wlf!o7T&ZN@yV`<5I2QFiqW!AfAOvk8gmH8{!6$WSi;NIG@ve8m6phGBS%rq00kgF{aVIGQSademM@ zbX8h6vvj|Qy3js!9JPS;nbKqrS&kJ&E3E8uPG>0Vv+RRe*Sf-OtyWvu4AMf9V%+>> z5do6Xwn-Pp2y3BFkb{DkS!D6h%Z6P^p}L(owK~zS#j*u5y;24ve|y~u6w$k7JRJ-M zfV(P8!4MG*el{fq98sLiH>QW+S91$|fy2&*o_UlUWHg-E40zg+C7_Bt760EKV1Hv~ zI-#^f1q7N$6KI!6e5|a;Ho*>J6$Qi#b_%aeTa;(?KcvDW+`j~m4bDCnIiyzu=>(Mo zd}xT|4Em%?`M)P2Bsu70`e$uK+)4ZQ=Q+eNz8`S|kwdD^n zqD?l*D`WNJy+zG4`hh0`SakZ&Aq);IF_~0@HA@|p9!>XxDF=t!ut#CWu>~^G<5tYG zOAtNX*j5o)grE4m@mM&MoJogb!p6ggga&pzt^}EpENyGrhNtp-gKe^zRU~iuI72qi z!Rg$FT@c(s$?$!|`aw%&G^RkiLUqOUk6feFyN5V_sriBaMoVUXN zly{d6`A(M~os)4y@+=tYEM4}iC>4mOGFT2yQlQWkO>o%2D(fD+N+iaM_?_5mITDFL zUehl~lUT;kop^nO;CBcIlA9K*buib^O2DtR#S#usodODj&Xus!Uc5Q07`75qsAVfm z4z(e;aeK|HG~$BhaK7i4FblEV5uDs51twwfeV2Dasp~8%xr+6vW`q zf`gaF52z8xgGA?UXt6A6h$c=UaB^anct%SGO#H)dpMDn720?K)w#LPVo~{|&6Y_tu zbbj|r^BJ~RBs7k{S+dOl13@}ce0Xjq>c7n5BC1Tt_>9@QF_Zzie~8*|O3^J^3q`xd z&7ll=!@M67WKoyVki{6Ix1RxnP}W8qeZAPPHkYhra-ixFpAqrwS#NhM#WwLYlEI>*PdYjC_}nRCJtapUAQ?L5=`v?LCRq>g#>2Y+-`japk?$FfSOC59j=GXx!~8( z6L-(L&3^Lv7jqs{%yW!vaUreHQM#aqwsUlkK`Vzi8Y#FNG@ArGgTc!r{Aj(N_a}IJ z7XT;I!9PDl+qE(VpQ%~_j@Pzr!GoGX$HO~wjv1NRMF^?OlK1r>DroD&eH|a{P|`lC zY8MXQXFe3gJ3WA|5D$1|%U{^$_&%&Bsfj8PelND>V>1t(UrzW}vLs}F|4_rYu=S<+ zEoL7F=7CGORt(}*!|ftD%Wp)V1yMzy&|$2~V!@WQtmDmO1l>o?{>J;M?NSZUd<0>g z*u;DtKSV5e@s&I~hi|fRUz7;aynhmHq9Pz`ulrJx{R!0Z)A`3Be=!G{p5Lt*JAYM< z^r+VK@ZSL?$WVw;!K3RSreh8t(g`QvAL8IO&x)yoj~#&nD;*=FCjW%E2np&f_lI=c zB~t{zN|DUo8p9R#93ujA3q=){$5)&D|Ekr^g0aZ15UsbgZfDAg#It%hJ#3vzG5;hk zhP4_nX!sjN8b!=gx&HmisvP-(^0~g<|7O>4&^?Jb+Z|T@VsUc;2Icd9pzw6*QRA0l z@GG>NkMDzx6cF%por#^_n}wmq2fZ*SJBo-_PxJE91ec07w?o$a{*GphgHM)P3rjTc zV|APG!A}LVid;#W93{;mm-DfQ$)rU^%!WJv-9B=G+(yU8*k16i++4eacUSVull1Xx zD5mupgW^;eV17t>~Q?C^!t%FvFc?6DY=TXa&_YYZ4Cuw*T2 zWG<20_tP^^)C_nhn9e<(CDpq0bjMxE=8<1M2Fa;^ev*+;+jhj<;x@unwz&S`wL#T* zOHcx=Lnzn%ka0n%Ls-#aWgWThUH*PKbeWR&P;*NvaBYQy1hzEU5z2(ld6UXs_^$K= zi*KmVEBAj-^Ytt9=*r(#asLS*$V$;o8h{ZD9__Xim;YjW_z23On|SA84%iD>DfC?9 zhw6p;Zto6b3wFO{L6G9^n}N2l+#6ptM399_1l(|Z@!f(qxb6$TkzozEV0#u}p4T}&Ha%O@=N z$WZc7%cK?dcbO1t#|LvEM% z%0?vU9|n7b!QLpLW;Q`AXSWbnFe=N~?=Xy;NvcFUS%^rcTj&ql|K zF#IR;FaME>@)!l8d$-p^V}On9Ex%RB0y4Q=Gq6iqHtsTHCMNnd2#1`MVF<8(G6NB> z%!z&_no~R=RgZK=6&;GYuK*4=L#`nt6PS^e%VyfEnlh~-5k<2vRc(?+j}H3^5}03+ zG<`#g#Ad2~&3#%bj(Fag0k!+hc%uI-$l@WKy@WWnKc_Gw z>ul_-2`d=B=_ev)Ht)bb!Lze^X#$cpwtL}{D7&ov;Y&FWCY;^=y2>1c%J7Klujd?SH zFJ~fW3T8{1Cs{RaY?VY}kbi0sD5bUNX)4fnuf} zZs$R!@49|G9PQjDS4f3^N4uXe7jrgkXAhOKGV0eQFE`7}=ihhWmAC>k&OzOhO(8*cNvlB7Cp~Lou+W3FC6s&Nx@Uo@rDoapbLP zXR}r8W}fJf(X*0iyF=_f#`pcattIgDxv+6PBBJ10WMs9K=!7xK+V@UUJC7!f1%hi- zn9r7_lf)NR*6y&*u9Qpui_geHtPmyiYQ>#LMwA{JVMPvQUFag)#-a;|om#LS$q0g{ zNc^={C5tJe{$gIt3L~Oq)|3jE8KO$NL6#-e@th*-Y$AD>A-0Qp1MT&WS1OHxdBq+9 z?!Tu$248q^VmY^B!!X{D76`hL`o=l-_lQkWiecIl*|MZgNpY`<*i2m*RM(b6IrtqVjGd9~&Jukvb$c6<0CAjkDFBFCxy= z^r8vIt1D34jnjL30&yI@rMXMKG!YAuYGILl zHm*3TBhDQwsUp{NNOylGW+aCSuve@x)H6P9FX`C_AYdLmtU7J}havJFXJE^Li_Ixs zS7XMd+boA&4P?7?YopaFGla<>Kl18;=#HNVNbD30TJ^6I1MOJLCp=jp@%S=)nzzR* zly&=}yHuD)b3M~8=Y!B5wzBcCw>|KE81#FLcxQ73))3Nbx>K$6z<1*U$q0saG zfo)-%n(9T`>lWipmMVtksm)U2xnUlQ|uvp+6KI0lIl?{hc*KBS78}u`N`om4Tteu z%BGq>>e`R|JAs-*jMriRoPdIZvRs`L%h<{@ZIy^}sG_{#o(5kxW}CYgYovX|L?_Yw z2^I!B3NQT42>~u`&lihlpqw2HG3~GvG$d0`>HMCfxgtx%ERL7k0T!&sy|CkPGR1z# zZ-i{d|M2$kaxDzsUGsgLGHsNzbS@uhIA?Q{guS8oEz#?pC0Ds8Y9IBjX}1MPW5Ng7 zNsoi|O+0|MW^lT_^*(~A4@1%$91=!#D+zrfFWajQDW{`7TLGf)R3l`?{4a)nR>ceA zIveTmNoh`4T-oYbP|4i#v6>WIIp5)eptnmpY>v;-y!&$y3-)!-whRa+7f62a3N^&hq_={hC6gR) zcWuzh-`c@3lkVu2s%soB=uaqSGr(Aj&xKtHF;eKyMQ+Q($`=N0c=9}b zR@@DNEy!^0Db@c+VIa8};ld|YvCnB1cUBkwLdn|-e#l~azqmL<)}y;GCkE~reuqbH z8}-H?c{JmBt6;xtH#x}gX-wp>&;^r_{yt+uu+72}jGt9SqsG*dBd{c4Bzu!R*9q#j zUL!|{PfgDlx3ZqA!(2HGo0Kd0qBCe-j}P|(>*Vq93_Yha9Fzx5c=sjl4f8XWK4l35 zh>iZl*Dqr%<74eB>u{_DkmO5!NtllJo=VB8syc2UznreMA<%ZQY)!X9?PlAP9>wt) z9>bDiid`Trzvi|HNt3>BLORJVWgPUU5E+QQhCwLKMLh=pZnpnYB9^Y8I__^k>LF=S zk<4??*4ImSh2eAp(7`255a`Rp#9@uf7vY;rm-e&8Y29N*xunZP1J0x8Pg(QRFw~CP z1SdiQ8b%U+gC?%X)36kOWriv)ap=;e@OFu%?+!CyBLzd+hQJ33Uo;Pvwt(S96++)e zk!;+w(!)d$`x0z4uKDT(!eU@GrMw2+ zao_MTM_M!@>C@vTnCa&$t@po7Gm%o#@4h}B6!Unsac+8hx5~tu&c>&7cc?EWyl3oe zH>i;X3K6h&4NKbJv;Y;!AT3wwxI(rb9Z-=*?K^Jv*+!i8Ii>;ODJ++sg&o|@?=||0 zEI6hRmT|C}!qlfTr40qO&7>5cdBHV{zD`+g1X%h7WN-CRweUCSQ3yWoABMYxmlvh0 zPS3^~vve$*9ax8=2Alnz^#WhHtK;g@HyOh@!(<|}2Bh)=Mt5{_3+QH=ix5RpI0P@@5#}T?jP=&>-Lu%wxi=b>n1L1F?BVmqO`-GYNEE z_J4@5%oz?L&IY3w)&>ngZEL3$$#?BA($&4UBJb73XcLS|WSb&%VJArcJ_dE;PHY7t z(Mg;LdX2Gb4YT-vDjN1QyY~`FsM!wJnsdn=DL4B$F}O^k;eH6jaLT40hX) zL$?UA6lu*l^{OO;`buY`HF1p-DK&6|%lux{=kDaCybm0D3?BO4aILMvfm1O^b`Q!Z zXIooKYUiOO>@Ur}-mY`_e1-Izt<(2zv>y8y=dTa?nFlj|KHukuh!y_A2;;igAvXun zi+`HU3rTZQkz;!glim_?BdBCiGCrC-w1c zGvHBC@}lSdnG<{m8Pz0gbLtu99iZ1W&ZLUMZMa|)h?ZOyrz>U zcr;U^ZwdUSU`>KdgIs(XYGe-t7Tor2IeK-4ihR#c*YCa9cC3^3c4^;_|%A!kYv1sAr;Xnmm9-9Y6?}fuBK*P~9&Ts|(jDU(VW^p#% zZb&>faMyF^*dd$(g%~xaeSJgf!`rvF{ne2h2f6od%G_dM)(`<;f)&_lTYez%{4ytt z_-fH=YY|tg{K^asd@9Ih1Ims=3Wl9*y0J01YMm<@3Rd;(aTBAJs2MTqTz`>|^w2Ja zn1;I#EX5J+nY(je$C16>sdkU?_8Kd{n6Im(sc|8~#zY{AxU1BxTd{TrE-Hm?=DrWP zp>b(ooy^@e;;w;-*b}*S0aEk3>!RRT^yukbVbz_)m@Y?-7Ugbr6AiQ#txz7+7hN13 zm=n_o6}oC*#^|^q<+|w6Lv-6_Z71_hgmr-6M=-W7vjz;@uKtWJi4rt z7r79WDZh|+p*TQ_%SX~_y>2;D^^a1+0)M^TQ&MB<<>L3MuO?5Pthrm;4`dwJV6tp-YY!&r*e)+KC{A3|JNQltG~ei=a{9s7NO z-%v5_fiCptepBwPT_j=L5DEm)l+2WCK&OZ2h-ZDXUW*2jQ*c`U=FmJx67rI)0E>&g);xWvAVayi5)ogk)miJ?pi=C+S$`er@d)(35ICeF)d* z6`EVly2kge()Mb6xj$A{Y)WhLhI%Q9Nr@`893v~n+Jy~=0ltlGg~hUCQw~j8@#&P; z{(o2C<1W^mV7IZT?h%hI=?qs~~Qj-w~!{MsLdo@cH*k6^#|66ZOJ7gF2o z5JBgIvyJ;BKNLcKDF^$K6{u4v%`e$uFe4;VrZ~FU{$HEHHCZmuw=2CDDv7hLL;H~` z67v*Kqn^n@+HN74wMoWdK+~4ofZcw|vu^>-gnI~f#yd=0?wA?$>O|1*baI8e_9>wh z?tH10N;r|Qd8&EEo}wi50?Rz6s4T2b5itf-Np^IR@>XPGG+M*|II<%>RtmXsq{RmK zzCHJ1Hrfu&>?-#3TBX7q(MCL8n=t2hPiTq&7aU7UJnlWoj8S$~B}+`d)3SYshJZ{X zgH7+-vM&`0iMY%NQnkYiomZ%a7=&cRvie$g(q6Is`OE>3a>EqyNb6yNvl&wD71Dwz z{K1+u@wKW9`|(}5SGZg0*Y&$R#c5Yg%fuJFoIJ`yZzA@Xc{5Q5PCO{=)c5k&;?)M` zRLtg=yWJ!9tv{cZA9&E2D6g-jFsV+ivp&9junpT&LzMSwWOWZe%aymL%@;2^pT|aX zHY357VDtSy9o&vq1msFuQe+w=++sSH~3EX zMy9{3&<9!q2Qp?}Y{f?0H!yW@ws*FAemWPt9dULI`FodcJ#(Z(PDj2nDh52f+~4n< z6aGeW8Ra~J74Bfah90>&Dn~o~j0ZoNeqg!#ei#J%vbWu>=ESyi0pfwAJ(7JzAuz== zQp;b zpO5@oDO@ND0@WD+q6Pr@6KB8YMjN$`_%OL!v7^+)4UGK|un_V$Ta?P)C_Ue>TiFDF z6B3Lj{zaN#p*gwX>!5}R>N+BQU&ZQ{xYoE0U^1@JIN!%1EnnM9wF!NeWRSl!!Pqfq z#cZH98|@rB406nnj#)@KuJ#u_pQQn_1_PN-5+AgR8DVBqt+b)MzoBVeq1?p{{{5|J z_87(LkPwd}fcm&`o?I`5%CDu+4yRuh$;5*tnc$Z;R-O-68gC;jl?4CgA1wSp33xM3 zA0PrvH5O1jT2DEUQaH@7Zf-1QIdSjP-*3EfSP8IA)zAH5VR1Q0X(F^?T^!|y8kqP` z_N@p;cbjH9ydqEseSAsPaVx>Zc1H(ewVY_^nJp`hv~L`s`aD*-1morlBiuw8AY%KF;14*^XRggb0fa`hgx!pRiNM!_2Jl~$L~T6 zu!WgKQ`7x$#qCsu&q}~X=I;umSHkW zB@XJ_ZqjT5L%@?D)7WwtfO~3A-fkc*GayM$8fw5T_m8W>o3u{_DeQ+XP~0@xPPEBC*BOaEe!P6 z>OBG}VfMdmFA4}&!8uSF1VRINPkBC4yXKER?I6-xQhh@>fAp_5Bc2DV7lFji; zU**WeZ=N_nOV`Km^Hpf;>xSnORN+R=X%jgYkwU}WOQ9X%aY-?@&`Rt@ZDq<~wH-@! zl%k38n#jL1aSY2fP$Eznrp^vSG`8s;_fbWep!42m-p!`-V%MYI#FQi!R4VIDP$yUKk)O6mIDN>_Gwa=%~5BQTM^}@ zbp=P8s0P~XFMPV}EEhgir3*qeUHU=&j17}H%A(dFL}-ri}``8 zy)6^7f|@78-4VXhRS7zy3!tNPlE;@T$D7RZ+SidrbE>vnqZ;Ed<}Jt5I4*n{q~q^X zynhr|p9_x^MBRGS%`=qO$(J5~2Md2Uws%BRgWziB%2$KzmGSHC%*+Zdr3 zgdvpw(+Pgh516;CFb@xOH^@Z8E~Q8YSK&AO$b{jr;>X~}xWyOfeg)6E=4o{6D@m#d{mQ*Y@hzlQBFxmxv?FAI_h&Ly;6$a*7Uqx^v=x$h$mlF63Ye>DR zH;|nkw{Y)s_0Cky;>3z216+Qu6K}C`Mr zl+I%;$G$f55b3irtpw)5``2$2gnMZ;WgG>aL|8O9SUyjJq@9v-C9OY`S2D(N#Vrb& zk77*;r^F#cRDFGtBCdKU&t#ak%6zpw&U@m7)g7!QPjVEorVc@uZ9)G%FQ9NLX>JGwxgyVLIahn!Q5Z+71D=3?weg~?eD$}VlYbaWttDH6o`zItsOKV0JNkpZ-Z z$_YsLJd~ZeqoB&%2hDZx0v*v_c)Qb+^5NYiLZx)FNJuE_He{F)<=C{MjXR+vp!{r> zj0ylWY?-wk5U?Rlb|&|+?oabva8%3|gMwx~r_^-DNG6EV)##*jWm)sy+MLZ_a!qm+ zKk$n5{gM+ZsrVZtNID00$P*SdqQ>EgMDq#e+ZWBRAfS$clGAHvi}@J93Pj<|Pdtyz z)8k5x23;0d$o4f=nH*tc<*iDY3`9B78Ui_|MzB_Ll$^Q)4_V-&oetB7xuW!GSJJnFbWL~RU8gV zJ9$+zq&iZU;Flm`F`E8dm=LXD>t-+Gj$U^l)pLv%MYPUr%bu?6Ss>!>td8ENLTUC7 z606JUj&2Rs0xiiw`Jx*aJ6^$RM*k98%b7N=C@O|5bMh)}L{YOHa!uA!)u09phDO!1 z@mkTLFKt)!jPjE;J5#&ADyNh&miAD+D89=Jye{pNoES5I9(2l$zLerBjCl1rWN*8& z4K3ZhdR%R_%w!rw?WD!C9dZ?M>1&edCZAFFu)`=?Dkj+Z3)ODsBO=)U#x#&ejtU&82_PA7>OHKikat~^~{2^wcqN~elE%Rpt!K`hf59B`jG|= z$?&ysQ%4-uSaqa`yAvZ4Kspj3qMB;1?HF)4aXnA~$8zcH;tupqB?=ymxPwIT&qTZ( zFrnGJy8#A1JI9%tJMp^{IpY1IfGy=Z8j+q-hF3Q7>5`8?m_U3adW2*S zp`*Qr43hZ1et!zCPTE_$rYi;>*1a0m8XEG6+Vl<8{;;i6kM)kvaE;=TW6Lm3J82(3 z;jGPtS(1mQc1mD?YuW>ZW)}XqLJC8&EE>GV*n@sp@H(%Q%sPTky=ol=p@frXNIe`F znZduB!3?m#Sb!&I4Vu5Nv_ew zRTd>2E}fO>1DnRDtL+LY4)gigq2cG#FdIEA>CodNHy!#@fs7)V+NxsxJvVN`U9{|- za2ipjlQsGH579Y#-HA^VQdssa?#-7**X1m+ECcd1-fl$JjYk7Y6Vh6nOchB zQGnOiy2}8!y{=oE)^};;n?>XNa~9k)Vtrtb*m*p4P~z$bxgY6=yQwTde=3Ub={yP< z)K~kApc04|`{70N2T8Tvro_5x+Ok%(Dw6J^Y&qWm?^j}dHHcs(7S+Im`dF-{(bKx? z75_hvQ%>=k?C#%|{3I{{0M36sPAv?~Y-}A(ehY7Jr8&z31_ZAaHJbL&@z@7&5U<%k zGNW28Hzm z!-Tb1mw0{o7DY&~I7M3naO^YAv?^C#7?VhBi}ik zIV3Y|8#DPaFKg#G znsoJ#z_%B5ZVnHh&^8?HnUvXX_FBbj!1QRYC*&7PG(CUbxM+QkD-!7+-n`{UDAvZZyJjm)Y7S7*g{@nAy6+up7>H{KT7Xxd;Ha++J?lk1c+QwzlBKq?zy$sS*h z<;vma&6n~cCN(iA*Vd9p2RTU~<)^g> zQBNK{OoiLW^#0TCyRhJ*ufH}Qf&>8gZMpovO1CD~ww4yZMh{lCw*76ke_!j_AMr`| z^AK)z!}Q}!N^G%u+k>-HGq?ffNs?z&kwB3gi9+1(xRN}bW9W2?9Cq=#dR`w6H4zv^@C7QZI^ebeAbonT@ofm_;#>)F7 z+AepgiUUOg1{Gu(2?TVgnd)-b3k4~?1I=(0Kivnso^MwWE}=k^@D@slwvE+r4l*fH z`CWNTk6AU6733s>go|9dMVvXT))`H}lyLa8i5mFus%k((fUhRQ$e=({B1W7(!*lV1 z_;n@cN-#^hV?eFh@^pwx&0l^u59!1&4))~$;n)@TWdIZB+u_!gTUk#s*79_b=PpD}s4a8Z&ra(;i z${o20E81q`-6!GKyLH@yzD%iRFd2}%lSkC1H*!i;T1^34 z&vVjK>@v4BaipVgHXKAR>xiAdW*#&jF!P9!+~-7*hilkqNE`JB-}LEJMkpx((CY2E#}ZZmmzL9UFIux>!%IV zf&rLdp7@6Bvmp;O%MVP4{ZeCR+@tdX4FEe7E~6TVjmQENO{2#=5OEe^^ggZw4Q99+ zMz|-Jqor&^Qr0ow1pyuC1$NaJEMwR)vz0CIO0Xr;Rl`wvOO4a*? z0HFe()>awVfbIym_EX((zS7J{^;nMK&ZQiTL)qsm>SGWJLPIZX@+oyQ7lbf3kU8v^ zlk-z}8=!!PDnCw2NX)2XUZcH4`xnCi&XR~1veW5j5a9}_s{dC}eCYsX&|f!9xlIq@ ztjt(^84Z~5kCd0a{r_t~MNbfaB#5w|A%u?ae|7!HI?WKXE0es z{T{$2m$a+A=_n-12B^}C6loDlOU)Gkp}c12!|M;bTs67~^fc7?=L7V<_ucLj)Ub`Pb&S z`?Au-zGZ+SrQg#$D2@+IE6h5E3*C30 z)C~bC0C)XCOWnpxHh-b)f5ueHZCjM6-vvql`(LJ*rWRHvdUg)BZtlN<)meGNW`hC7 z`$Y}Gr=C#`A0c<3z49U))*2rOMpzZ2T!wrdXDrsZu&>q^pY*M`@F^ne^!D~PHj%?g zN(+I?qLIsw*IDRVAjtOy4{G((tCMm?&vtp|`q~z{HMs<+8`>xVp|_RAa8PgI#jH{} z%7dfn)o^41)|))c+;Ch4=n=%Js8E468t~$lSu(!-Xt)=BZofd4zC@bhc=Z~O&pyyS zS7PBY^f(I;4i=D5xYfEOvl*#kWEv2lmW3riACaJN3S?Ca0dHe0Mk z>YFw>;nu4K&T;3w%D^WObrzxtVNrbUDz3$6mZcKWCi=4-bpIx`UFatj7}TlYSjHA} z0|C#x?aI4fh2kdd3wE%{oBjy_0-QLqe*5DPf?@ZsDp4pb>uuh6Txml>fCras!7^Wqj>u}%}_@S_iub)O8JXf)Fg{B zly>j7)3|neamhGlfU3N`2{lp-Bu+i-Gjb@hTq2#N-?0>P|e$*O8qo%Bk^S+ej$cPbC$Xv{WT?Mv=5FTQ_O!>@M;?vPY zTM@+lXmvmu%b>}P5gIrk)cty>Vx)kxW?&h5M}o_#l5xF?szNz_L}N#0ZW|_86|YL* z;Yr(5Zx+{mf8o0~D}k#`5h_>mDVG1X`hCRK)BaHif*0JCGLvIH@yE$08fYrAvVxA> z4P;>ph+*}l3x~MIy8rFez&NUFH5KE?Wp?0r2sJgt`C2*DN0FViT|>U_vbQKVAi5m) zjBY7o)h9eYUqe0!d}lWmszaAo%@cz(AQ1&IKo#Gf$5&h@iJAv+D zTFIdazu-l{eJp=G!#^4!@wNezMV4Vo8IVWjfWeJj5f-qSF4L>ZoGEjh-6Qn9u>iUO zCcP(2w5faTU>o$wLs+@9C461k-?To#y`>v6ocITc+VHTN%iBH#~192r>}Y)oymmgT=L$ zb8T&TvRHpu#g^NKrE6`KWS?$vsv%~ha=ZVsCVq)jz3gaz(?2`b<*{-mjw?tFjm=tQ zq&I@~u5y3Ms3~Ci%fpMatVePq0?n$i#EuJ#^QvKI#v6tV5&O>Dad{InS0ldLaTh2X zRIJzorb6~=jZb!KH?1@;ae>cbN~EQPPY=TnNFiBUGl*?yOP|323=_XyrY4}vDU zY&YE;pRwt#b`ACCfP|l52)G@t;%|GJu4=LIK3V49eE(p=nbKLY{&7G5hW*djBmPLl zCs38nbUCS%WaYe5G>-2D&4aU`n3Nkwl#g zVn<05gj9F?E(Mt-7j1K7ELfp^0Fh~t3bN4l`oO6#ll+7SaBv|#h>6)Y7`}V&i^@2_ z5{rwA^JO8p;>?H(ifkpyo>h7D_fRxIFwFn6IcRYf*)5u@n;}J9T-L&@e*$k#bOi$jhtc#J{xZPdAC!Z0J%)$zF{mFgQ z_|KsRBWIsL(Gdl95i=Ce=+K!VEBH2LP8l@AqUctw?P_$?C=p^;GBaKyxEIEF0I}72 zlTqTRovL83P;xdpnc)gR0+Jc7E$+5j5&qXlaz&XKl*bKvrDz`V8K-Cib1Iyu(!lsP z4ax^k;rqsrSb8UmCXupSb$d_2iY`=yd?gkzCchSfMC`@ni5ckFIZuG&0pZi8i(5Dd zt3Ob4Yo#CsixNQ#X8*)9p5ZL`|KKNvGl4}bjOSMWQSv_$ z?Bb*4x!)2SN3YXBObSfU0sy|3!I^9F>jWC9T=oXV%m~6O1q2+La^N8QK_EN!_p4)m z7a`0mG*8^pH9pJ`#TeJ1-1@Udd14^Qk>QScXEdIFU`2iGd#7qFG8S;BDfsEc$Fh&zo=rG?lsfszGnDkSHh_nDwcRU!Gyx&pMfVSSUJ8;&Mqwi3 zsBalj(m(mkx^W{53?UKt5HGBX^oe>E3HPgzuo{Ktay>M)`F6>`yGVLcFvBgsEd_tB zFnoM5ts@xf5f2z^@_KdVd+BWqy1u&Fl117Q#?_UCxGO3YL&C(kIw^l09eI1COUGvQrxE10608i(a#IMPu~3t+~zfCl9biHBT`a*hta2$AJEO zyVrtCAxs%j(I#Csj++E;^9|s|-$3rJ_&5i*U6cAzvuRau)sOhR-thy^cr+C?eN%4( z$0EFl?GV!*&Fd|(8NC9x(}C4nfKgF>A6NnxjDEbc;vE-!l`&T+Wv+F?g$pC$P8jn4 z7TpsiB1CsLfB^snY-S_Cb$l*)kLtG8`amC`3+6GhA6dn>0_??jp7%MN8c>8DvFOs7 z+f#hlM7zl zOWAOQH#2()a8IKQcJ8oa`5=N~+JIdEfHIeV8e?4h8bb0W;U3v+?X_2N!i8w31}99L zAG+4}Rfeo#u-C&D_Cbx2f*Pqf7@YH;{+f4svDx96aUOEimai3j-`&;O&!0GOVexDZ z#IgXyL-|t3qNDFI;o?V-1Bs2JQ=`p>Uq%Q%O$2C8&XmQ2qUKydVFQt5j&Xvy zzBox(0e6gCLO-mtLZF`9_2w#(|LA-n?JsdD5nyI4=>{D0(Lz@u+5SDPMGu1#JBvA{ zXvS$sN_mx906FPJ=QA%eKnFiWpKk;SzFmM(HGswp5JWFvBkIpwm^H|P<^|hJ{T+;F zb0Ss(0Z^D=6%@1#+2Pvi^(?A1?yNfHi?&nZ4w?mSe3yDhmNCjY)=}i5e=r^`cahY4)F8T+xMQgtzU~1h5Yk z)0z{%Egb~f)8#{oqV1D1^g=s#ZcfwJtW3;80LZ+i&M53?EziT&B@ zM4i_{Wjb^zVwv**T!yQ)Gg<}!YdO`LdO+<~M;~xH>#nB<9N#cwUu{qOpZQxCU8gS7 zo+Vq$Zl=$v?lzP4?ycR>+BI^35em~^q~~pkl0UcM4(*%|FDk5d6Qz(y?vZcEz^&#*l>C9|AfdsRmYU1z;rDbN-~(7`Tl~Zihc>6op_z>!_~H8ZBRukmQ%C6 z&GCJD#q#g&qO7i#F|CWSKj;yAHQoxv3f8(bk;wiB!`sq-Vb}*ZSwkP z>tj8#SWc!eTV%Q+3!!N*PDbJvYeX0ifw%dw<&+(c)71(s=d~$+LL)ZN293Uh$kM?5 zZ2Cqiosa`}YBjlm2P-v1qU!bUp^*9Vnrjo0rwiPm5MM&eLwPtVQKy!;R1iL~%VOm~ z?Qi;8l`uqd0_{af5}`&yv+LMt7f9hWu_kH$-*>E@h);Rm*$_L}DRRhG zp|~X<8*%l#^+PIhwS8$A^(4)3dsTvLSxEt-RC~+>6$_sTi=Jtzz5|gzdz<4~xX$Ak zS$b1fpYG1D*k1!}g8Qvwi+@0^IoLM<|CY}43dN$me{Y@rT}4x7JnFz1CWG_fh+wPH z`}a1$HZ~NkoU@8y)P|_o=tYR9_4~qjr4muYF9*zM?bXvRm@wS8267@R%Quv^GN3oD zN0~JS;jP?Otq?!aw`Z~OJN&fwONN)z{G0ZBFH$>z@!ze_yz48(hU-bag1hdp@FGRU zuUu~o@lVb#VU;+FFLe-6W9Cc9d;fF~a)M#EhKw${uzTZBpG`>v_3VlX1GI4d%+mTp zcylxiL|${~PxIh3w!)<%0s)w3jrq9qdMRs^(Z>+S(iU^8!;;6QSF(@K-e7APkh8&0 z^37kTE^qW7x-iY48jxTIM1q%&isFr4Y(zLKb>S2Wppd(DgG`&^!N%-QztO`x;)oQaO7TocGheNY%A$3k}^=qR}I4e>aC}`{byS zz1XB&0<4FnlLb3AI7Vcy3Xz?*#xd^_`q`_jTPr<52ytjrOk6<-$+u-c(w6SbH?G=8 z-`zY(|DFzb8FyS4`)~Vd^b)3_YFwXtH8W+(MrC0ipq-%h_fbV*6#V?DP*585ArC{~ zOxN)3ib-CyEJmv6pSIlMp3Ua6a{v@hu*4UQ6TS}QFuR7cIIvXEy^b3U$52r<@Up$}R85c3q??s_&d3rEaS_T5 z;2=bRH`AHx*+Tt^E{%p~B)AtoHBx8w9eH7=7A#?Vkj_%aThw#7SEic7Zyh_`)hHOb44nhN&-LC<=(GK?~KMgM^HT#{L6y-x7Qh##=^p`E<+rc#H=YI7oii(yWMsSwy{@B4Lc)3P_eJoU*z^EpK zju{IhjHD4veH}zzIg8g`h*e>KXNATWS`ltk_rapC@0wjbj_oi6Y5M=7l2s@Samm5| zmF59cgrmeTiiY=`<$)u(>E2*t^Grq91E5jsU8%MdauydNCRH8cCm`tU_H(X@mDWr3 z?NO?lqRtlyi}rFcK$+Gh{8F;tQMX4nB*mdYIJ+Kcs2bQl9Rt+x-~Z`U1zMyvWOpnj zM1Hf~Gng-dFmj2`3c9T3q}gd4jCj-TEOXDLUjKHxgi^eDn>S9WguQB*+?gZ)9BRen z96*Dk)mqbD{b2+}kr_ zy*7G$I-n^IT0<0X@9S?~H}e(&J!gW*^a_xpbnVq+DCiLQTF*5vZ>jhXcus1BS?0FM zhN6Yx6HPmhKXZofea0v5eiK3mE%|tJaH{pOk>$+u=3#KFT@hhkV=0{Dc%mZ<8;4)G zJY4Y!Y;Pfwzu3}Sq?>5xog|nd9lfSOXP&I$Z?!(r=AO9@Ht!vTOZ0-|yq z+r(nFxTRuZTju_xYGG`}^)7A+6`hSqPfW0wUp)cOB7eFe!()q+7$`v1pSn4I`!)CO zxh8X&(yU5z@-Hws|5P+nn^b++Z*!rNPR`pLUmWLPy0=ANWOpToa7$B+h#m9ccD7n# z-ElDEF04i#A-t;_+s}&yE7|3`VLELPiRW%6%93WWNyJg7%0t6bJJl*l_S^og{rtT% zKi+895z4cob@rheg)FKhermg8`DoaW85H>;rTYOb*F;4o5x(*C4zZWq8B?6q|0wSJ z0@2?rt(&)alK6gYs=vKFu|%5wOOhzJ>7D0tcro?%P95i3*%*hqp790xpXUwE0gbWf zpVMkH+<)QRty~>E|L!GL0O@j-A=VgOS_Y#?fOP zF&FYiLe8yd_@Q#JQ9M`3VU)T@Z*ZR#60`@wY?xJp#7#Q(0XZY-8yHC{jWVyMSR`8N zRH3W;I-b2!QNy(-fYAy(t)ODjF$X3M9BK<@lU-tT2n&`$L;evaYG!in^5gJgIf%im z?SAqinYOb%W7_=NbyvT4+eZZP!HBu9=%jCFMghY_*k|W^k%s|2LE7Fq<0Tt?#X%#L zE)Z*6;tpChZE||gdCH1D-icw?0owPn9xjNL}uFi`elD!-SEC3NLr_SE&<@TWqAyj(Gn(Y0fE>M`9C zC6I)&Sj%xJf($p*FgcaM$=L}h1S-N94YoQ>B7q&(@W<{NN{-*ls zBm+-=yajD0^%Z+>j5|Xkm3YvCWbk9dvA96Bc^91bFUfQu1ZYWuL*k(;jAQs;?}tw$ z6pw8M0ZtA3j33v7P;ZMVC_BD`J)^lGIKTwFd76&G$HEug=#8Lr?mFXPy|eP0?WvIgLRnk=e1Gww6##E4cjPyj@p# znvu(DS_(c-$#q#MtF`mC8{7 z!c2I+xgi%RndptLP38WmF-qcC2FIvS9}4`XpQyAGr2d;K@$~E~p!-WG>0zfGS0n4I z(*$i1BPm+~8Vs~D-88nL3G?F;@Uv0u8?JZrMlF6!@9=_`+fD7u(#I4>4C+dulWZqz ztr9xj+D2u}bPdE#N`u;T|4cl)t%tk_vlLsdgeD_pDYL3oyx}gVM?f7QI-|`s1b;$*n9Vt!Dd>PPEgd>WT`t?iT#K%r!Idj zdXgDN)J(&uI=kS;RWo5#tAZ?fX3?p_@5RNAYPDgKbUT68FVM{r$8vX|taMbFS8xiS z7VJ0JP=SD$A9?@ zwlVaycXjz$6PIzX;xLn_4Q<88GO;WXi0)u6am-HK*MTUU&Kb6yTXsT{tv{}a;#OveG&>bDGg zv%8&F2U;NapKR%GcTeg0Jl_o??(}_e6sqs24pa5{B3j&MYmJquFBfe0%^()}xL=5Y`PoZbxJZ zZSR62KGXwK@(C+gm1FV{4ebt7@-1n?k_bu7sSooH0)w+gYzeWE2KS`K^ZvMhz_#~6 z@7gs~wcXXz$$YXF)pWCbfv}r>qpVAe8QG%TZ+sgx&|LZ92C6=m2qdU$$1dIJ5QaWEM)r-Xz= z{%O#Z%rXY_O!2z4Ok|@3nS3L%UDM% zT#`~CHik0Jw%H?gij6Y6#gy#n|9bC0Sb9Z!xTFl^O|^`2*OwAtUHLSndCUKd|h&rL^Cqw3YEyWK0 z`PIw08tGoczvw>MYfuA`v6XKQ(`jqdl6r}rNAm*xI7gx&NGAn#zyn53`$w4_|K|R3q4pwXo@B?tq1BYL^ z&?_frsvh{QU%4SgTxa^FO2JS8xMT_nQ6NGk8N#%0WtPQacpRl7bxV@3@QZj=!+GBY|dNjitbiFLEeYu@kZ1eI6EsLOX8vu7CV>pQkS3{OT z7)rH)#|4bmvAPs3wZ$L)GvW`JZAc8U&{PI$lEzgv+l#o3v*a*DF)(qA424|0pg;bh z4i7}X6f0l@#t4KYwOapA_?ae>n&>nfKQ$_dl`DrU@D^~=!QgGe^zTolIK3fv(}eMf zCtgPyI8bz*mK*CrZ{~Ov{YN=7$WOHbG~z8AdoEDZS9v7s3vtPj zZjv&yJA6}1sI}^uN{oZA>&s2>bnzPo6uxPkFvinh)0sgBei}?fH`FmbO)_-NK>IX~ z&sN7hNiQsdk%LIm%*=WYrDPLy!CGs7!QX9Gd>694(NSssM!h&f;`QioO|=Iom!&+r zgsUbvT0!F&)Mzoc5hz(LrgKjoPy953Wucp*dg7T-IMW%(lgKfn!;J{*k<7s9f5g;PP@&c%tO(4R=?El&RKUYndxyq0%J3*7-bDK>DvTDt8MA*Raxd3~2iO{ z!jNg1lLQ6z>9ltV)DqY(R4HP14sdJWF;`s!-IH+Nf9gg(H_fRH9M9G1P)BSC8f?pS0!?~F3(HO5AMV|Mn!7ENW7p^E(?tUg_kSW z&>U}wasRhqXCbb}qDjYWYx=G;u8UL^xALqV{%Zeqdxx$$9)OTRN&ur%Qmi&C>Y4bhNieoU&A=fvgLraJvf zm|{_N5gYXgP;EKy2Ma%###FGZXZZwvR!bkqb}Ltn%zW-5&8vbxb&M~N_?3Z%XKy4> z>P@fi8-YIEfTdj$kc-AfGduS#kPU4j%e(|MQ$zqt=Co?I)%U$3bkJ0ht{ zUqZ~0Hp|%&=`U}TVPt!6_kukG0DM>=HFyZ^^rj-1ewmAH7n+Ik&|T9 zV^%(99h39?@dy6dj-*Ae2;-jr=dO^?5G!@epwOD@iRz)3mT?U;16D*Vj#{vZ@sDaw zSwYoLs-L!m?&~goJ!D+IT;FX*lwk4XRORBn17DVS8$sJwWynG{`&>>oz=T8W?ZaWvB=g$jJ`gyyqNVHQAUQr2-;>U`q`k)rCtoYVl3Ks z?$6SfzeWJfjV22($B6ONcpC+k7~iAnUu9ir)+O;ZUkP{X zA+wQndBg$tIxn>#EP|3zI*MEK8J{f` z10R0$wq4Rtqph`mE*s=I?BUy(`5WXLlb%OR^;-PX(&}rs8{9TxqqmVo6o7iSCIVTO zigO={y2RR3AgU^W@7wbYHCgP+ipW~s7Wqkj*84Q}GOOWntK%X@I}3Xs#4QDDlHqE!NAo!gd_jUL?B#Z9fd$}0Tk-wWMUZJZZv$@(mQkbv2}$a6;eej=Pt$E+4dj9Qht`}scifm=cujztZ_pB zez-?kByS{S4{747?D3!anMdRY4+;)57Uv^XLC4y>nXRQp%&;I$h6(j@v%$I|fksnd z*n?PV^OjZjl@Bh|RYPAp*InL!g2l*f%~&@DLwWngE;9l~>O)S*PX8z_CP00-c~}-_ z1ew8M-^9el$tBYEUd=NGwpHcQLeu@Sn7>gm$I0VsURw5LR=6vxibIUd6*m{>RB08- z?9s2q;t+TWy{W1MG-AEL#aGY)>UTFz=p=-DXi;YRe8%Or8^Zg84hTxtkw(c`+bJSQ zZm|YMGDmXSc>&^5lj#lN3F5OPs=rpN&j{}JCg(<>>NpewTT-HM>c)t@etQzp^C|+)_QjpDl%IEb%vdYu#o0wK}Zp> z1-Cvg0@;61BEm|Nl+tu?ETA&wOVp;hYpn28Ib&zxI|r6uV!HZnFMdpFwc@&O(-Mr` z`8AzeNWNa$XtAfLP^%$!Z@a;J{q{<@I|=SLht%h`ky~IZ@cA3(YluLzhM2}p;U2)S zA>tdN5S5tnA*($wQS|1bu%Wih`yo2qIUk;T+gQ?kJO-&B;e>8b(MvD+N>mU}>GK%)3c zsguoWPK)M^<^ZZvcCX_kLwKSV@)UbZY-gzPuI?iGOJNcd(svT?OG~2=KZJZdIZY@k z+EG=cfjB--N$3rMfs)s8Da~p@LpaAF{-%R(u{~Z^URfBqjfgd+cEK=5AF|3PJ_Ibe zxk8;7!gmUvi)*YRf}`GA-_bOW4;9Fu$W~7anRr*uAvzEz zf}LV)$y@11s1n~sq?D42P^TyDy6C{xds0r4Zf(^rC7VD3@H;~7*)1VOrk2j|+uAmn zEJ~$#Ti3*Sq7R{TkXwYr4yrQ}RXS-pr5$qS2@~l#^VmOT!j8NUQ4o6vwTj*4djx=0 zc8khoxaS}TRMD^Xa3T>?c$;POpqTy)H=c!P>S(+AEV89G-E3%GSC*4033-pnH5LD~ zWC3**hmpV#uPkheU>11cPK>R=C_quBQLnM*uB*tMpV!I9X{0^lVdC+}r2h%s*N8cvab&=6@7KAq@h*(u zw43bA`RP>C_MYc{J}RzqJSnU7j6{r3jPNH2 zv*}LaV2Ws7q}(X@IwO#%9f2Y3&6F}0W+kFh6S0O+4&m1!%OPoUND$p6+1iZHp%Zu1 zRP&!0GvakDDC*T<=&oAz>{#$#NCLhE8@e}W-eNs^{AP2cwY4%X%qyZ?rYzMmqID?5 zWU7p$;pvy^Rkw73dh(o7F+>_H0a*FfTrP}X7=ct;Lg}@@9ZVEP)X9R5)*X`2i1#YD zR9h;ZJ;QC<&@XK_OS~JyS>j=9OAZn?alFqqCKblSnre$vG#N1)_y)S%j!E*GnW34B z9UlS(6Tw$eTf3*skpN{@XnyHgPVfj=N^6)2up}oGeOY2VMTe|_>H@Fow5Zw|-5#br z)8$JFCtB3H3~%ApkpnJ`te zK?NSk5Cud3kSj~8`NRxdQ}Jano;^Ot_suu}Von*$uJ;M)x|7))fS~(&8B-9eeGuz? zKC(9ab^`KkA9&NU6EuV5p1-nBlkmCdlVZyc@>>Sci*nRo za1WfYNU_-*!-LAyPf6=?`7(goy;=Hlk`!&HE58fHHHM?KOKu#_O+`)d@K!}34tSu` z_dnGXetIPiCXi+{*dLa#BcD;%haJGS?jmFsALUY|cuM7z_hdzxPL>Lnlv4T-l_(CT zv$yOb7bmmt*(k6^M~+Y4*-BnmD8WmF|Hicgk1QKu&O`-klOrC{flb3dLZt3>T+uTU z|A@b;*`eXaww64$iClbq!e%}g)N9x%m6rMgc z<*)X8ub$P+kyZI3u&&4z@ojGe5_Wqux#qMJn(p|GdSCI45!$qlmTT|<%o%g=2TBKK zj9jJ;QD3o!Rq)B48H}WXC9Y@nwe{_Wl5@B(qA7cBO}=a8G!Iqtf>UI}4FvSV5MFY^ zf_>(M+iV@XsN?D{07b5A(-=|k0N)Lw&+<+yEZ5`If6G?<*=TDRv&neqfw|y>&#vx7 zqQ@TKW@?%l@w0u5ocJu^!+*ruA#>Sp7)~P|V&ztQb+y5?QQZ#N-fxO^_7vIdkc7!_ zegIbWLhevE#dGvQfpIx_3ifNp2Wi9^HTOm1T!C?lGY9aKj-4BJG^PRkxiYLl zG&e0GjG@HNq?qbdBX5z4&}6Xl3P)J7ZgN@Z{5JAsW#-dDdg}HQTWALq?O2}~foh2| zn73J~g?4C{-L(XDaefJa!*5{RsJJslIc=m_OR)aJ-sIOd zZ=tZ)-l?&gha|159GNq4iRC*BcqeYM`zQLmmc~B(y{nm+&$`Z~IC#nZ=$6WRgGanD z)&+NEU)ljSztOe`eSxaQ8?hwcC&xE##KLH~?uR18-xpIec3e~+iYNOEov8PE;a8Rh z^{H1;aIghqMRGwrSS>IvevnkHA9;Wd-Wt?e&!3~R=E`ah;35A{?*vM{tA4DAEK~Cn zZx2$onTF5$_@qx+aT^v)<~Eq658Qy4a4$Mn*J`Aziuou1V-+$V+<{PQX;RDHz-*bk z4Ii^=oBRyfoc5&wSS7C5QK5x(J>j)N(EA$PcZ9wqc?}H;wjGJ5ZMi=6?gc{e+n>dG z;77zX&Ajfv`l(L>#vz&fv4XLI0&gJ)$W}z}zuru@gn3ExM{s(T==NBXHQO_=Z^Dh> z>vDS3g7oz*TNr`i(5oixoSVv`yoI;$40Ht6anzZUCOw2r7ML8dIiBe_lu6)`w@Ovf z%d@fdNh>cIc6pfNA{p&&P5Z>oLbysQCm`~N23WuSTlqNo$B3mTI*vSF%F`M)=>(Ey zZ{KjuQ1dWKSD}D7dmn`9tyBQ<9456QsRe7pt$JVyEwn#@&5ccG}g8pOJ~4Lm+T zq6}}-;OoMH<~ji+TNA3rw-T^C+P|_DwFi@bdG1wf^zN_>qjUbHbL8cFZTE=g#6JA^9tZLmrLPElM z!@4#Uddi!zq8z=J8o1_3>;cvNCb#iev$pw)m{IJz z#9Q!DkKT9mfTWf9+pMTd@QL+z3Gx_vc>IPdd?Tt10<}!qRnkI$6u3KqiFUV_vm~(=oF)U0fIOU4 zwH&B`XQ`Kh%#FR%TJl_d)*b|TgEO(PT2$cRk`;!D7{zmvHrYugn1)6T*oeW}#s9sm zEC7l_Pk1~bOY8D_V-5xZ!bIO-L5r$>;fl!NdauQge#m<7AQ`Q8DlA+nh*y&ZL34jv zYO!4REglIx8Fj>BpB>KW72CA4E3hM;rAU}}mx#)g^SR(c!;j{^)UiY21Ft2i);>6e z?wcSD8a5goHOsE8^$W5wb*}F<`4-uV3kIW%Iup{=+uo{5A8+kzM_Hnon;n%j7L~*{L{A4|H%CLW$>mmqJQ@!CXj(7u-r37` zH9IKzwB*~KtM_^c1NCPbGw&{P!6h`aFU`bs6EiVO*kh!FL{PbVV2_#paj#<2T^K_v8N!>=#M618s6LH|sp7XuMVbMm7Qg)z)CY#cdzbP;ah@W# zYOh1WV(tWIzphf@Vbn#d?=I(u9N$;rmfoG|HULTcRlAlvsS-K;HVL z9S)BDCoKG{EfUve@CvHMu00jxBgCB9EzELqORSG8htSj>&?jLSl|-dSX$D!>g8_yyC_W?U=b+9hPA4Kl^R#gmiUyJL zzW91WkWwllkaBabMra-Lob|zrTP;LaMs)?u1EN6ZPtw?V{%k(!R%KeyO7kV*Q;O59l>A$g%IfBnNY7A4V-4kk-)?d%m~Mrv{mM)mRgC%$J{ zG%X=tlD2BAkVcYJl723f%8CCZ1$N#G_+H+##6_Z7DRXysT-`476%(^)VhjggNQM!Q zV21wX5oak8@+UE$SJ5;LUuobPC^io%x7J(YKIe`1#n~Pstcui1Hn5Cu*Bk8K_9UsEqSF}Kh8T*wvwtDYRqaDuI5+yMWDLp$Pk zMv%d!Ju@0?6X7W6>r!e&RINC;XN#3kYPF9vziyKDydd)(BVwaE1b>XTTD0Mt@wbV>C#toJ_|3^Hwi=c~_$JMq%ME=)q%Ub9Y=cq7wGb%??hD3W z_H(Y0@^`Gem~VCgJ6RQFt>ePie=^>LPPAyOXN8YSG{m-39JSX&@xt#hg|D?r(eN56 z1WfNkQrSnaml}&$vqNbPyv4a|MBvtQ5^J)JyH|;7_Cf5@>T-PigEd3znXKJtO_rx3 zXV5CEx{t-8$A#Eypc_{$z#BwN)X}#K@2N2sfrF*;ugg|Fy_&wgr56|BqmQ;6#`40~ z7mw#(S=*ZnjKA7euwTh@@AapyG})uOSV7g}FW$S@eLrYP1sJKm%TQf4u6K)(;|KibLyQnL(#W1YE-BgHSo8X<6Rsx)HxhErGKd`45+6`8}N%yn|A zN#C~V9lRL0CLgqA4;j`Bp2Ka=6}D!BV^o4ukNx;}9Q&)Uhx-M2)CsDHY6vLYVlThbC z95nHQo+YAeQ@i2Ak`OxE&AQQj$QfJYCflld$f^fF&pMvM=oaF>FI26*J~`a7T)OL~nuDzh4>+RIjR4Q+T$lnH(J(OjiaK zOUYeS7my|AzUe;EC~v*;Q!nN;GQTR?)}B@xRgi6vKXS}ov#n8jq~bp=#yM?$sHAdm z<%%SqHGAYAL7#j}2E2;NX*#8=ASK^=$uhXR0#c>;DLCC^{TTKh1*K-(=I;X2EQd+b zYFg(TZSH(JW}H}m$IsnhY%fPhw%J?s=%|s`Ih80hhnz8BGyRrD?Wxg7TyoY(Xd;_U z1#o(jDG#EdvLe57|3yr~2&Z|oZ4F#rx48gJy|-G*)}F>`!dt1z5n9XfhnsIrC877o z0G>+~e&ONaRXfOyqgO|-cPM@eWZ@&dKnLwEUETuR61}pQL~B7P)l~jvWnDIT(Y}b9 z^p=QXO@$mj1Rme`3vnrMqyT}E0Qe14im`W&#!=;@07+`8zr@B#iP5>n3b9A?q6Yq@ zlo}5dgy~Hqy}hbvQpOkSHnDLd>F@*CQ=9tp`;;3&DlRA}-|6Y0=?w=Q0bb5gAzQzA zmcWmzzymC6$5od5HwmedYMbN+1xtmok2vdQT{_Zur?`^7b&W5kXov(!9A8UB(H zQ*Z69r&dumnrp%j#xRk|HlkqPGr}{VIOuIHX2nYZf}<3uf-bQ*C!(TK$0l$(N~}ni zHWk*w+MLs^v0>UY`U9Bv*t@WkrC+Bl!YF9RN$$dGlPT)BDrotpPY;eh-h2qK^1K zb;M*4OW##{77?BShX$UbA=54xRzp6t;^@a@-sh6y5DY_L(`u}CvqV+ka`nM2$1V`1 zhC{Ng3a+Y!kX*GYm@{$+oBbU%`GZY3N3(k^EEKrqYf@uNO411j4(M`<#v|3!?xXec z({`J-ZJJYG7rJSKAz-rda}48G)7$J=W%sw^8~|4vNBO9w*u1t>#U8_O!U@KpI%Sn+f?!GoatjT;_)~${1#*Hwop-*0n$m$Lc9qEq$(WEp4SV%J z;Uaum!)Goy%_f=C!ALAT|Gr-3Y@T~@j^48dpxi{m4Gy-kV{^9^4brz zR-3gM8@!Npm+Iq0c)JjjCTjfQIO*zW2nJJcrs_dr!+VAg6dwB>U)3FWlonak*RFhE zn#c^^!bl2&lg9;N~Sn5#X7(HEXQ z)T`5G@Yx-zTa-|xinCi!s7VkefMkbeAKOhtl6sNuFDa7*%0muO7`)M-YTg*;j&{x< zR7_sg96NePXQmH%k4;bkA+~2MpkhK2tdMLQotM6hcPmMsfC_PFbbF97`gITsRlV@} z3U5HZ57_wcl`+gkO_D_hL=NyL;?9u`Z*OSRPR4%uebxEv>GgE<_Qbm6(V|jrF|&@w zh5`$cejSGmnHZwMZRgGgJHEf2-K~52`}@6(oPDpI`8j{>`S{tj>G);o>-crIW*@7U znIlY>ExxXKFFTO>_4Ro?e}R5v=j+qY^5^JnI17GjX%xy$6?n%W=_q$nOp+fKJUU^w zMuJYS)Ho!XPf1edgT>i(t|BPT*Sr1;oj`I#(sGb_^L@8yY{eFe08t)lYVD(h#4WIK zt~h~0(uR2Js+b1KOikBtZduvNu9HQA69E2gYfp)ZMRFl-E5j*nt6<@;le=dKVxj+t z66IjV4AABuTMcOrY&nk?*Jl>NS1>C@U_w&}kmGEeYQ;r)2q_Ei5k;A0n~xMZG^lU` zFAUH}669m6*JP-6oYq>zFw9BCPfYhmuDeP^zyLlo!JKx%XG7y$)GDm_|P;*>7Joh^z_(h;)US)}@A;Oa6DX`ey9{ZLPy&^v&cvtPdJ z0C*D%kB)VBRV2~yQ5Fa9S$KR`kS9MDvcS}%US9ElKf^Kn)zb9xU}6_3m3WwcqFqFG z0u?vK;x}t&EgNt3ODGB3AT?xkO;hVN4HM{O0KJ)D(tX@t+me7E!IuEd)+~il84x01 zhYamc22Exp9z{N{YD9;j-fX9_wnx%TQdVr|#>LK#?8rNsY*nRgQgv-cC{yTNor+<* zx>Sh5KCdAe6B5F9>1aSq`@MO?&5Ip7&OPTDLs$M`rK09Nw6zmNpkQv)n0DwkOGPx^ z#B)@{Bl}$BQ+~a7>hWySNaKy{0?d{ML5fVD(*0w)Sg(VlEG5-WM!mq`Hg`a zr-$VFclqCAvOUokj0V}&KR`#KH9BV{#*w#=m*kx|-+HnK0Ca}B3Z9U+(4b){(>+{X z5}T|UJiEv<cbmjam45=pp8F)!BJ8nmHyn$%NHxEILBE-OgvFJT zlyPHS+Vw4@ro|CH};c>ac+B~(=ddzK#}+k)}|88AM2{M6Wlxl`GtA@8Q}*h=$k z-2H5%x)m$CD=?AK9x({3)Lk#LyBk*R5u48O z4i=~23LbgMx4mtEt;3)i&MqovqR5_2kFc$Nzx*rxy2=jYfx?6^Zd~ zAu9qvq^zfsx?UAPWZHD$wWxTtP|5g4a7;M^a2zQP_+>mRo?%+aCvTbR*t=jl-`J2) zOZSQBy3A1r?@a+2JS`LboSPlbfq%WFPiqsl?IRKQEBqx9Q4g6Hx(pj$FwA1axol|v~Tg7I&Dh+kC-Ii)z6wRt=9yi0*g{u3=4#ZRl*Ma`ExS!ut zxH^M`e@;^S8DKII^qL(y5UjE(ZggvC<8WIJYJBA`dH~1j*#{5#GkLq$jmfHf`4f#0 zKSLvw^rx?y#R`Z9C%FmR z>{QRufj>1#Rq-<(-SvIS7pgQyjx9`zYiriP?7?XKG3d9ZUGz^%Y{%YhKUAklD! z4svV3?K`p=F99S`K}z9Zw9l#m0JS7r-G64u;}53_^TZ#SGx7)u2+K$fjC)JTx7R-M z6xdh;#?3X+Ie7R4NoVu%lzC)Q8a6Lr=ADLWDy4UxIKJDqL;WkGb@G0vgdO`nBs7M+ zL8E%-zJDAjtope<$NFDMU&P`NCex9C z_3Qo9{r#YihpKJAmK~dc(y~PiK!OoV=h+;#n5d|7P?ayy^bZ^M>8%^zR0aVKF(ta^ zx_^>_Kp%~e$-3~vj8RnSsDJHO1cXO9`E06zPgm`l$qJs%S0PY=XCiTZ-o8A}KfD}D z$jsRP73JNM>Zh{5mhm-8;wV&HdVFe)lh=4ENQ&u}t_60wWxj!GZAN(!WJj{bno+95tX*pc&=Q+~yQ#H0U#hZDYAJi0pqELfYtZ#k3qX{SBWDxyqXiyO zKDVPTTP-t*FWOHPFNf%kE`I<#Mj)!;f+xj&WR&KLj1<1MsmY4tu^H-LcH#P(qV(nY z7KU|G%YL2o=}a;5_kxb;$cl|XT5Jdk4 z=eIRjP~+9qNivFQ zYVqH`v*2XFTRAhA41_kwoF}`Rj0U}xRi)^$IP_Uo?Gb|SY*t@js-K1sBxzPc;zw;gu( zl__FWQ-AEqyW=zLQYzIR&GR@a84h(^A=|4UQvPyB!1}!Ea&*vb*!5Xfin{|5nmRYt zGCE9OUbtyLQ0nYOuURbX)@4;`rS(%+$B3t6o~_)ws~drE#~d$L&cGhUgYm|mc=ih9 z^23%k5Kf->^Kp5n4*3s_H>C@q^qY+t(7b)_-#wmGMLVD&^*o>CZ-03?o+a6I3w(HV zMj~zGzs)zLFA{mYA|fh^-wRvO_fC`uoU&n|x^f=tG^122M|rB9!xU>LE+N~*LY0CQ zH_X{C8v67ALV|G<73Wz{6wK8U`N;9WDosJX4b=IrZ81SZiv^lDVKPm*>@{zM8Fuq6 z_Mk|1oD(ZTB~=O%OM3ysBuKOV;-wl0e^tBer1zd-Ux+M1Qbc=qF)ylhq7~FCLTH*% zVE^?(`XN2@)FbLCa2SN?EyH{HbX~0(599A4fO(c_p}_rRM(St9Em2#OUJ5G5sE5W2 zH1p;oK)2o-#%PN?u^~ub0%ld-2%+#cqKw=8{h+Li{ESw-8}yJbOFM+R>soOwh}f<^ z{iS-J#`L#|VIBDQJN76;0~s2ACIL62eHCtM2jN-MSTcdir_PBdCA`GjKgQV2!VH$fr8N1iMqyS!+5t_?{nbml0gbqMzhwA4ukh0J19No*Z-mGoPtCNlr7t~ZQHhO+qP}nwtd=m_i5XjWaECjj0H4zopVgyucL~B z{O^b)fT-`%_0Z=?9nt_OWg=tHJTnVv#Ekp<_KkE=D5d+u=1AncHm*8TVU1EW;fo8I zv=K5W5GB60q8Z(kj@Z;iR}hU_5Ac%G`nBYYrn!Gt=}1SNWv&YR8{)o%Qb$Hz5Tfvd zwteghyIk%)fnt$ajoH@lQi!A3bG;5SCztgC&r&IVI2!~3@56P$VkN>e4xhw!ET{Za zYIf!tY7iKAmYrTTX28vMHpS3qCZ7Y$eIS%H0fDri9Tz^4(f+1IeC!Ni!|dNh{@boB z@g+A)Uk~8)fuae5Q-NcEz4<+p2Rhxp^XKz|Jk^rBUF>%+0+>b=4XVaqtuemNX4ned z7$F-}Typ#o$BWifMa5{G*3!H@r+uAN(>HIMmk3W8RE6{2h6A&jA%Vqc&r*l6s8nd+V>DD|yEbJ7(^1fEg&sg;<}*}ON8{r3$4 zZnA@-B5Bc5KA~lFBD2UPM66yU21!=}{n0A5<;B?61Urj5FmWGXoH-iKqo6LC*Ys~g zI8e0XK1X2sK{sL)XLTXV=YT^A6lZ!ikHFRQkm`R8f* z8Yz}ot~N>h4P8jy75kpBaInunBG8Pr%xSKoQC04XL00alAJE1?tj1tcAa5oNSj-6> z-YS6zT!UD19810VX9L=`JHON>;h-oD)_iHkZ{V=fNz27Mhh~UvLSJTndN=i}l1ekm z$lwYA_0%uB5!x@`0xHn2aOxS*#O+jdh31qt?JWhP5TFNQPdrWO@{G%J;UX@3b*jB* zOqlbR6W8{|7>R!qwWTznnV%L3-GY;Z^I@c4>~$CH&5fHdLR7YZj|GhQiMJdxy^Zvs zpM=3CWk7drv^pbaL+Sp<7c#6cVBK>BMBPhhip$ZUS40<6FgB(i@^G2t^p3tA*$ViJ zt+6tbFbCB-=BP;Oth*$+68vKbvH6Co(PKT8GHp~&paJr z2+mFFOv)tP=ea`nr#I+38R|R0a?ihV;f;o~a@<;yQD_|Lf-~~lmW$`;ICtwa@p%Fo zF528!6Wv%`v%QRD*(Gov*L=m&06u4a^wLqjf33>Ji~QvliVV)xpGan8c1g|-_lxm0v+Mo#PPp5v zIz07YTAa!HSuzy(zsB?sZp}-t$oYT=8pP|bE}537XCo$OPh1_q7k9?1x4vGnqlc&TNeWvP*CuaM7v3WC&^g@aX}!X6PG3G@6LQKp``su} zR8y#b#MP>?J9New&lIPqF(BW+;!o56e!YO2?;3){VyBYcsw%1+=&LH5++)&t6oNJ+ zNq<$E7940A0hrTa_%X@o4d!#$_q#oc>_I(sX6}IkQa}va-)90gMRo^!B|%l(FxOfo;Ecbbt_( z2_|P|Fg|QP%HPt_{S6LVEFd*=8?M$nbxj%I$P;w5cDf3A3wGG2Y%iW*j$ar&?+@@lPY}P=7$7$PFd-c%|K$W>Yij81>hvFV@3e;YKYloh-)i07 z6A55tVy~BLecxoKfdyAHW*8v@idd0NZKnrG4-0ndZtoyB<+$8RZ66E>B4ys~7QM<~ z7#ytkKs^RV(YBufkfLBGEn-l8N#gDBVcv`O=gUbtKK|=|?hPoe*B06t@B6jDM-&N`wV@$|G4P?8^DG#nitr`L9x1UetP!P&Se34( zAze}kTLZu(NWXlsitucBnnps49@>lG@g9 zq3q(T0ntF>8sgG?o?AHFey3176VWZYW3bNT@4ChuZ@uym|+o@$61%5&wEwNIVop8p)*L~Z*t?~ywLB^ z8T9j^>2+|N^g@5On)a1AR;Wv#-gs>WmBGRrn+EJo;;8U98DaJ~iCO@EN3I@uUfui( zjMTHxCze9vY*3YF8MxsVF3tOd;JG89Qd!A_8EE>itXl5GdJQ%cLzf{l6^QhSut!+; zsjNni38ozc>38%?A-yX$|T*~wd1SoCLBPJee+$bNqCTUUx|Y(T83 z`A|QV<;SLr^8(=Ju9?9reE~5_@58Un+YAa|$DDYdL=5w|3ik3G4z-xT#KV@Q!a!XR z&&7JlQEe&S0`~o+p${j zCOqLjj&Q>1QPui86h-D)aRtS#~dzqKX53{kZ637_w6Ea$B zz%t_^wiUYO!X#(F-IfQwj895PrKU|%f+n9Fj$WslLF&Fp!0Zp#DShQ4E~QYdsEvWZ z+sOwv0MV^=CoD?up|xi`NjHicJHIW=0A0R8oe~04AWhXEMiu z_y+(?Bvj=7?X!}*gC#~&k`wd12=sK|2b|keyro^1D~t@{FJ@Os8{c`Sf3S=f0n8$!aD);8e4?BRM>*}eF=Pre?G8E zkt0whWzzDIT9q_d^)nVqqpBeJuz^Vza23MRYP8NNsFOun#jtDjfND`Q&J(PDJMecZFP z4ub*gyohi$V`D%@m$=odS}&~rT;{Riags0w1x2<#xi5@{vE?cKS~6RW1jdjnYpK82(@KJj1uccM-K-)+YhoYR2nW%R~VNcwUTYIKLfl$wZKeRvS z!!|YXwBb8MohtXFsGNkAolcO{8_{Sz!2i!8eIC9GefY0PTm54>VgLVFP7a19CjakF zT=TC;=ZK;B?dm&9;R8X6S*DP0v>tif{J!RO^i2U+ zx2Ptxgmw6wzT`TCNzE@2*lUlx_Fc3hBDIzzQ+^FB-PYBZz>=#%;eWIiz1_yQoer;G zJ~rk1`#cIm;d9E>sa3;}KcMcZQeD|>-qrp&3&6Xibj{6-bm1~EakKlvJ?5qwD=Wgc z)8@kU7w_s#GGo!i%=CZ0t|>7}cu)51Heiq0L}ew_r5CHAn=+Q|XolwUyiD<{!wZA# zRG%E7d~DaM*-6@l+kT7McP^(1Xt|#yJzU^Y*w*uWrKEvv&#$5e*->C*EWsG!m zK@qJ3d56)JZbgZ(@ahGA>Jk}lOx1Jp6ShK0jGy7=@C3cxm^6>;WA*^BTM~dqwC8+m z)H!O4kl*8P4TZJ9+Cz{8FVjAuui3F0KHQHuMWd3{7U^h4lvsZ0_axfqwGfD*&3i9&bD zrImUv^yCyVa3}f)pC~8qo?9qrR9?B>KXUVq1J*ZVa4Nig^^G|9jTrnGK1Ypgy?F-s znK|CsdN#x%(JWfij-vP$eCG^YHm9ZImXmC@979%C2uC=mg^?tu5l}~aI(Ae4%%$cJ z4@(y#9E|Ib%BGs`NBwN#)N1ntDkCxnCvFcOC%QoZ{TMmdLh!vDQe0#_3&UCls#?+X zkLQM8;*x6m3c69LJ)HfASFm;V!X#knicF@v%1e;^Q$yLwos-OGf9q76-|@V9e@yB8 zc?Q*OH7;jMn#O`m!OCuOWpQgxj{sznEjggGi-t*W-1K}A?$AZC7*_GI72+WSTCPkc ztIdGjL}$NKX^@y~S^r{L_W2(9eIV5YYq?=hn7vSlkm^p$hU5E_6=K(1!s2f6+pLfe z4xI~9C3bEwg)A=Jf#xT)0{Mz8!vg45F%~a8tCkf(D;Uk$G3XN@Y`kITa!`HTfIW!! zSqDOF#H564fg~`}(`_DPN$9F%Z)jJ4miJnd^+fSd-E~kakabt3XjX!T-lL^m3b6NK zm*n-A)RuAGU+k!3U$4{3<2wTyth^N6S4pHN^#0cHfxLS&U$85XlLX!^QQ_jttqk6~ zOb`auS^f>rQu~TwG`3A;&9jEJ)QbQZy-c`21=6eTPR*ruEaEmlipS%hXz8r zJCI6$P_rO7%ue}1C|iYSkX1t(!o-=dii25GQ3!5B8emR8lnSGlVXlmE>YE6 z(scuDdthnXaSSKL-SHa7-^GDFxT0oLun$OV;DarCs59ohbnv#Xc zr|MYs8cF(aSZq%Win-JY;?tbKaH$gJg?#a2=dE71yE#YeBDyuu34^ukH%sjVcM7)p zepO=?Z5gJX8yOe2=G7KD?_XlnxusOLzY4uhxev-+Vcbbe{lQa3$ypkMa)pV35;5qe zD8kvZ=E;O=tdorEfs}NT4gJ(wZe*jr%W1I|DO+RpIiA;-f_YBk%PP6^Ca&BL-j)0L zUxa_S5!4{(f3Z(I!2c!w$HCD2|4J2elltv~8DPS0J)xp?1vWeYO607)^T}Mf#VIkO zz#yZxRlBG2Oyye>5Y8&E8*vhh{9kT&OIpjoU1E6Bq} z3zw&Z&J`gP-J&4$RD#)DLp2Hea!DlJq7Z~y+0am6kdwP&?#32l2T-c&!MHM|rPh{T z6|kl&Ism}U?(QIF#f%X$MB(7#Fq*wq5TF}dU~51ZBOSP&Y5sX3*830(tt`)$B2@io z8{2tehStFAe!4n+iAna5!yvaPhAJ=Xfr@=Ie9kZYoTzv|)79H{fcD^e`Tk|(>7f?H z7W2)~HEA9-Efbi&5i6CAGpLoxH1ag(Wt$!NZ@QKZ+*QVp%pCFHir;bV$Q_lJb#yPI z);v%DZKyeUI)$-Ji?sirU7Q1ePrvJ*v{d9DaOb~taT`+? zm;a1fscM^c|DcTj5=CH^(5Vzt*0!(Ez))P+*UAI~-5Rpfi69`>%V=6VJtVmrw4Z8r z=isl>T{ueYT9XREkR*?$_A|MeRnry9$iOx2tV{*`Rn3ytmu<9ZWp&Xz*Qu7$=od}t zwtCm?O$LS8(M6{7U=~vordks8p>nB2D+SSr8?}%HaNF%#=wJtz`9)LY#&u#|7#4UTa6K zV3xpF)=Z#7TwsKfk#Hhq+S5^6aF}VPXdH{4(uTer@AKBogvj!ThcDzF|EboR%Ecnl z`wRaUO$+ZR2G{^bxAl-SJ{Y-|71`hd95j%7>lAWgGNCNX_k>MF>h{q6l^a35*i zqdr2BN(AXmg=tq4V zemsFS&M~o(tYc?negT84P^nl9q)hnhhM&mA<*2F;%QN!NMKQ(!*y3VdQno0>v#~N* zd}x9ILL6S~UeoMy36&6gDy?PrjQ?8kslEU&17d(d*guvw6Tl2!C1Dh55oCI*j zAZfs(X4TokRWxfsw+B#X=<2;B@F&y5_th{uSQp!36D2Oi7296q>CCR_nW!y7tVl&b z|Ie)>$6$lZ=YedWXY#YPyUIFP$L?t`V^Z1yj^juY>h9Q2@y^K3j;XFs7 zIS8dg%v3d_5CAqzl9eftq=O0ZR5mSkPXI|~$#2ty3LZ|E$vpo998+z&3rVO-}Zn$l{ zD9QA5(6g|!!cOr75d~TL+{g4@8@BpS>&>;Xa*ML%!LU``flBaqAl@3dRZ*gG$YD&j zduqS6IaZton9(YHwr2EzG^ZD7uu{$h`TxFiN9aIxbx8{S7KeEsN=WFNG_a$pqW|zl)?C<$vu?cBVG}D&Do$cJgK`qW`LX zU?V)KtyUzj-$F{>TCa6dYb*1NDHrZ*SRu(-NCpunNlKS=`LDP8y`X{Mot*n~GyQR} z2vGE}(Q6w%K*!}KaB^F&MQsL$i!J^7@UA}x{jQ(;&kOzT-(NO!d@jn3vP$%5+y%NS zEgjah7goORL#JIk+1JjVhFpC9ucx1@FB)_E4eZ6PeOKN!KOYL~os3@nxb2#wp6l-> zKOb_tkW!92D~^{frS8Re@SU-o%-+V+>9p77&XZuwW!24^wr>0|m95C#l`$TYt_ z^|6J8-wJ%&^6naOK)<1IonPH8x2-t|KjygJfKQ!os-Vy{#qU})7`kGdghJP?-HXw! z9SdO?&QA_HM9+=Wcpr`xrv?q13o8r*SJ*mb{m9HbYRRP4DY@h3;iKLpn@#mq;HtIG z>%v@BUvHaMnK3|d35CIW9SXWr_T|E=4ztMBD)l;=RnygIu`;coBkp>q?54jhzCGW% zNv2+3mp@hx!Mu!0ot-wrMGLK$`fp-%;&2dMC=O{&D|@Q3KEW0?V4AGhT|&Lcu=sm{ zO`W#X5k(@~3o&aD^kcF)est_=C@l!33ac4XZ%Z?!eS+>wUE>T2$gi7#BYZ7*>yqPa-bf+e(iFi?5Q) zY&{MRLBvzaXNt#f&HkkHDPfcI1HRBhs&5)o1hydMJNd%P-2dg8cv(-A4!Yq*SNHZ@ zzzKUoOkU$SH_H?mllCW*whsz%mg72I-C+`F)~YiJ8hRA-1eJ2DC|Tn$${C~!mn58b zKoIM93#|E7Sq|<;0^!6p@7vbYj1n7bl);_y=$Ry*Hy=jA@=Mx^XP`!vk78_y^_AbM zL7KBXPlo+YXMkJAS4gAEt^E>#3K<70nDVxN*>C5|Z6f8%?1)sub8enZX^11H4(pkV z?9Eo*)$Oo}P^MHLFWzxyFLgqd#{>Bi!HIqTtbmbIUkrgSIbY@U&O26)h>KRKSOCHF zevx9-Mpn4v4BS1;U#TMqq&mp-mEW- z2mI6EXlNf~$D&f`HwenjgDu<$LuJbt4|{&qYN=v7wbKRv+A16 z7$?m_GW1K-wyo57Bc^7$j;IBEx*)#|n+P)*>MDpQ?2lmQ5x#6vQwV93GK;O}wtDU# zNHb7HG-}fpyai1)gUcsRw72L7VsR8NjLz@sZQ6Qy_HPXO!=DEMfHg;QLj#xPPXhzU zTXCR7Za6S0qk9C)9(W{|G29A>kStI!f$R?_U?YdiiUQwTU>oc?vJj3OgyS$9+>=m3Y+P z)@u2}G;ai1F2fXWVP<*YM4=ItA2&{8RGyLW20`h)E>jJ%?2Gj)fH_-mfD1(@YQtJG zJmxBLgdkN?V^FI~avROeMNwsFNFFd&(QK|Y4Egk_CVe$dPy)9^cvv@u5ufN5*}*zi zd7eo@bR7gHub5NlQ6-Zob1ExtAkf8j)_I=+!4r&s8HnK~J_x)rf3V7%y>5d>*)u5> z?jzi!*sb~&dU3Jc2ozcQ7jO_Lbxk!otAfdT1PO=mRU;xP1kY1?z`xHQ4UkWSY2~Y< zA~8@=A}=d(FJ{e@0sVkT4u|d8d@v>e2cX-s$zE)DEaY_wW`+Jfgv+55!yst_b`+m* z^Y^`{L$*^P4$wv66Ku#lmi*20X=Qg^@fI3lmY6vS&l*ym1CF{2^3WiW?B-ANibR^? zqo@U2O4va0K6$&KemQ_Xi?R4;w${gnS8$dR@hc-6`%(YEBN7<8c@C}-jB5{~PsXfx%J+-!d! zf+5<;oMWNhbg|l5lBGRSXCdQ6V~fS_q8;L)mFJqlPwC0H8s7JaSYr3$JWNdV4*-em zn>o;uFa)H2995o1nwf=?rzFn`v%<1Yk2E72hN0s#zsv9{cHW&}I}z4Is~pE%m%E6* zThb1+V{Zb+Z4m=O0Ywz2F1=$-={jr;${P}mQLAEitwmS_pj36fC=MOV{5(b6F>=J{ z>%Kq)IH|FVVqF)sk;augOs&MKc$IZqqkAvMT`#`-l{x_v1}p_}3r>GKGkt-SQIUki zSbBLg?$=Z5+k(=wABU>nOS4V)!|Hd;oQ7nHts)tjLd{8Wz?!|9qA%CoH+)F}S_OC* zxw#eO{30O9M2{4_R!rGg$;gRFAa5_~QDd3eH+zD3^c(C+3DH&=PIc0wMLq$*0 zU1G<@*;7b|QpbKD<+F=g_a1w3i0Y0a+i)>K1s*-cK`oy^+24%Pvbs19ExGz=1U9{> zVElaabiOWYOUy%3T86_64t7D@+-Oq?44{5(I{BawSw@qLYW&w+S6>&m5_QOY?zpa7 zJ?HjANLJee_#h)}$z$#)x~~bIzvunZ({4A=OXNQOi6vW(5R0D-8y(X}6|Ebc7U^lG z)Gr^sJAfwXvL^wDzgBB?bPw0o5Cq1z#KUd}Ijb~_ev9d0$u!#kf5Eh)Bu>#t|M@Lp zV*ZPA&B5v4X#AhB&1+uUe?N-zyZ>lTAHo$PYTqlTl69%&affAg$fL$xi=HQyh7^&V z#qmU{Ne`Mm9ltxq!VsDxqOCX=1>{{&;||m8UgQS+RHT>R}V$glV&NCyOWg^ zji%Y^Y?i65=ZzBCWXzHZ2G9y0=B7+pzRX&y%VH(2xi_IwrT9#_%XQBAYF&-f7m;t; z$;-RPlWM)+3G8>R6D#Mn7V0V86F(i3CcH3|^TW>S0tAYKL&Siy*}vZJG@c))=JLNEU&F7+ zQeH|o$CHcA6bqt>ak)sy!^#d&p2&2wMt?o z?nu{Fs&o@$AqYBTu%&E=Wcs*!M{sP2ihK}b#n(SgTWyD(EAKRQ)t@sF+=p7_=-JLQ zDX0t5+%>P&Kgyden3f~|h@BBxCzB?qs#ct5kcq0=y0Z0>GpyFkY@JL}=SJR+1C{BS zmPMCx!yQY_1Wf3gg_a_HC8B8ld7yiYo&@>{=VW&6%8qwZ_#y3Paq7XA5R^v_R6 z{+_hMx%`gT^wzAgd5~u)zAWmzDVxlbvP%9VP)4lr^DoD7ihTKimS!8{hjUPr z1YuDOhy#lH8{5Q zJ+DAYRA~aq0T^mEIsIUG{R zZkj4pF#1U-3OEnB&ha6eky64w1Gyvx(Wqg*MF}uW8?QuHZB-n%lxnx^X}*3pHCia7 zy>8h@zrN>>(Yo_LERmw!qQx@i@iAlNhI@7Hn)hQ%A$cfY_!~oF`(T$ac zkmFpJR^DPR6)pIgdBIaOn@2|Jb&X^o^^&{AR!;MJOg;gBIx+}UfQ9~abNm~kn7B1m zU;LnlQUT1biiDxFS>~KAtc6TduDXaPXtV)C5h#Ivw^uOFN(;1(pPkf8w8XgzIw}aw zK9VXqX=@jKiLaTZf`*QR>I`j4=(*H;-ZXd5#<9|Nz5{=F#ZvYxRt zeZp^5H+&*{PQv`Qj|&h&&R7VkFbkib0`;X#6^)g}E(Z2F?fN zYyp;e8|=GMqe?KTODIh)%>La%C}D9@NI41fL(epWsrOh+Yi_pI_zPNsnv-2+8Yo17 zCvQDK5%;4gCWd*wkd-#B1)T};2V31$Na;||ph(YoBQO_jTZ$f%l2r3r+1Qc7YixJBy& ziE%1Z`7r+c)2C?@A{D-Z%9+QC) zZASq!>rom`GZock$W+E!D*i(fP}DY znt!S%61zqtUPRmzfZx2(6)+%q)$e}H)!x&3YLX`$4OA8qC)8OSur+u-2SP=6IbE5z zocaQmw?5I*esEeEA22#PpMj~1J(#4;)DttC$Wu77;sk^{^i(yL85mb-LxINW5>02I zBxGo=ONIB08g5!o8V+s2Q$)58Y^!`2*tUbj-HuwCY)&IY8SIV=l+%+g8{^^u{>1G@ zKIFO8{=OqGA7l2^poy-HTqMR?MjgwI8p>_WGQ6sayV!yDuGkS*g0xX8**5L^lKs*& zZ?m|Q<#k7%62CvG^GClEJ}tMQikVrobD-CbV?cJP@ixBp$G!Ox+pq$9RTGLUA<-QV zy>KjgThl|pWRv5uDXLDo<>AvAw-RoKFtZcHNoT6!8M0j~9nnEdAxN#5!C4LE3*AP;2wY6aJ z!lE=jWeFKsD30mz5!x||N7d5xe!vq2=Tq(Q%!0v;`l(?# zE<&SOwi~<|U5QtbZN4Y);sHq*^wF60)}TQNW}Y`!1?14->unpW^RUASj#0R~Ss9R~ zyg>&kwyg&95>SyoRVvR;sm3a{T1S&`Qyg>l*ZvOg=u`}6+)Kq-Y?D0lm5pZ}3|orE zf6FXd$>d7?{`QELcnc(QGZ9~$2M%vKkq=?9JPTUT)Rj(Ex`Ul^`-^Vl3g)Z3N6`+a$7=439I#AkT);>UagB zrLKd^o?atjHjLm*tb%5tz&-ijQ5H7Fu9ba}Bb3%Q+Lf2~fs~|0y=|L?LT^ zy^L7(EvCx9pr~@~w5js?74_vtWM_|&6=^emxh&DLlb!FqS%?JLoR9FE^wRJF&k!&K#hy7my8I(p&odo;ZZ@Jj(9?ObNDI&6RdK^B@9tP z6PF;zbUCXRuV648atl!nqLny%KQ=LbJ3UbwydWkQ-WQ~QR|oUq)95pK@LLxNHb`Xe ze`u6`JN21C{MrY3!&|b^$B|L7iH64~rr5U+>aI|ZYw@Im#5$1 z@%%YhuUZwDV2aVG2|HJ96$j&x^7DCkIDSOm?W%9!K^QvoJJ>geN3o(bknbLcho-*F=zzNp{PAcK1#I7xiJr~sT@8MUlPlAr`tVvp9D z>-!Vgko2ilsuZ4YvSRTh?yVx#Ii(MfZbbKhu+JvLJ_r_v*+Cl>$Rt48fmbDjW*@ zJ~`Q~v8*|M<))K+iWsNLvTBF8cuuxi#tIX6O#p%2qR_?3P^h*$*kmE8tqXWbV44%5 zk`K(?b|5i5^Ga2rI!08Yt#F1Tr{#W|$AZaB3YfYC$dO{twXZr`)>;PyZImk!N>>No z$v;#8eQxjG&`KldsUYU7u40%LE@yfQ!vKxSQNGUz7P||7+bW4NrhJ*g`IkNaf%3)u z&gR?#$+P48)0^XQ35sr+7#O85DFD2nObl*R60NXh1=>oRFvX`65}={wCbJHlJX<4B zS4#TmWI|10b01~V%BS?m>U2gK2HPnVh);~6;8ELidZhy@iLh7WC|lT>I`Gz8#@%v|V-Y z+DTm{H$T`<$huMwq0eLKme6#x@`YxqG?x# zaWf9*ySBrA%JN$7_hg5pyL|pKqfHI~+&Kzmkc<|0E|8=2x*pm0?G455JH02{fk``& zQ}xUS&DVLh^d=a4sg5xf?t)NZv5Pu(b}pAIiX8sd09Q|(BjF%YB|c?T=ee=+F&YPp z2@%AmeVQBdn}PRq9Nr@ZXw;9a9J@q8SCt9MpT`}F#5A;vlI;2eDW35>hackF-h#_o zf^(koQYUb>iyC~fT+NiND6!PM%76qB+j>J%)f7k1M#2;a4F}HdV9Mpf+R?vOL0w`f zMr=fn{SQpUSz;GY>c(@tQl0!7LC=g*wrdj;?bSD`RbcdxCt8qdwCYbZO zEddoCXI4qpPv3_qmSLzOw5wFo;=F29Dabhq&~h_osE5n474Nv;Cg63}!Y_o{4qMe` z&%WW*8PipxcKJJPl$Kb;yTtz+;A0LbbpPV(1%F+rB zHF30#muNC4a~)LhR$yp0w@xiWbk-FCQF2NrjCJb{mfXbB-f0{3PT;vsckZ>$c3DVO zqp`?M-V{W(swYFL3f+r8NrT=x@Z@f-adtVCcGvR7>{Tq*D_dY}hBo+SFD>@?Bde9( z31m3jHSzdxX6pA6zLQ7WvgvX z=s?aw*1S)H}ZuR03lj}7dLTt`oeG+!!rdJ z!utv{_VJ02J;mXNEu}B&KkwLR=WM0^&)ox&VAmGZCwlsJ^6&cbJj*+vEh6#9DO#oTbtDb>L;<|-h{AM zF{4(sRA4Jz)HNGM=NP=Z@iKT$?5oPg?=je>JxSACJMA=4nR?ZBc13XVOJEcAc2e|P zDm8>L&dw;o*Fxx** zn2ZHm8LqDPvRqUGcKK%)r${75N6_S^yc9Y!26&M|Ew2>fqlMhQn%RGO$_%*$vo8$w{EF|m^ zHuj8X!PUDK!5YGuLsB+h4Fs_XzCg%z%G!@*VB*O4p~U@-Gy@RBXhH3Q5P#gS)d#x` zKj;N@l}zDlfa5{ZvIh)@snfOWwDYGY5R`Y`J?H5Jrf&B|rGKG~V^Cqh^EOq$9ONZE zw!RF3cJuX2A~R?H=#yUWR;WdOaD3<@a24y$OAeU9^Hg;icj;Xv%YG$cZyS1s(uJ&A;$+u2<_h?*4b zP*~-(AY1t@45t#GdPwCyde=G)?41!Gz`W+J*Gli|?0?rVrDaL25&A$S!q}88*JR0+ zD{hDe6Vu;QYwi`FW;L)ljDPtYn;$Tv1AR741qn9bEf10LojNp;l{LGJXLD0VplR@I zis@gQe^7$TB1Iz%A|!t7;FcJow(5-PQ^RoD@`T1CXxW47I-iq=fJWaNJM&um3k^b6 z&D1wFoX4P~P~Qf!WD8*4c(yM~hLTW#{ITitkr);^OadYCnb55aALeo)q0d)+oEIyq zO$d;;o9!*|%^gyfLCPJEUAtHnGXQ>8B;=Q99x)#nm8EB%uKKgLUwq`%;^(c~J+1Wx z_&az@<-b|Ik}do0m(BmN9o#E0;g`x5gY?LGU~Eiy6vjh5vKK&GkIkYKmYrX$F6PYqk;8~x~OW|ovlaRvw5jgJ(L9PPWlb1JAI5nP1h@d zjzp!@cIa9OKqeCRRTe9(6HmCI$b6*B{_r8pDt9r0<1u(d;y5c({EcPeInu&0_{rGS zVIq1kuwtN`$pn=cL=NWlUW%3aQ(D85shbFzH57aOK?_kos_5b0>;H~lowtf7{Cp_z z{H>b5(G;As<%Qn0jRvSs?w?_7iN?zZR!!zsrVkgKYz)a-G-xm~%N7l1_}Sph?gNk; z$!q#GlJEO95NyQTE*0DGqph>XtAm;kuVnSatkHQ$yj^b?-kjU^L zzG}$7>xaXrM%jkIMcr(_oVo1A2M>&+p>J27A$u0-t|TN3SR$6sSwV%Xiu+;uZ(N?V z+Y&Q^)ET%Q259&yz+zW$dxf5q!1D+4=O5S{?Oh0oXY@QT zdst(2@ZNNq-i}m#?jk2Yl8iLqee{b9S^a2PSdI<{C{5Q<#Hj`JjH*;js+ zsCh$`23$ioN(?Q-&h4sF*JmD2?Qf2joC0vC4H|E`obCl!@jZQkM+G28wO3AsTSzJ^ z&S#-$n3Yw&V8=PCfX6?;9*vraPqo{D(Q$6pxd&Cr0@BW;fWAFOZ}E`_!~U#AJwUa- z9<39YVFKEtBufT7Nml%V7MLXsa7!w278EW4htMh@&`T1HI_dgt<17Py8aZR-Mw)>X ztsLWbju*HyMDV}uxS>NF9f38esR6+(G&6(tY=h8f#u2zf7eG1p_K{<-QOU6L)g~!9 z{S)AhG#tN;=`P|dW8dMVduCYKHakx(p?s_HllbC^D4~7NuncAcjVRv@esW!Bs{UiY z$45LWOdj`rh9=et&A-hcFXnr)u33H(C1$Pj6yhGeL|Jd*pj4$O-Csg3X>2Zj{t;)2 zY`>ms@# zUY*#uCK~V{@Xv=aSyyD3gh-xt-&)7aD(B%`J-?hNqr=?5>@5Z!J6>2(PqtPOywMZh8xHi>8E$VHEGEwW-aPYPFA9;Ju}2l9KLq1=lV7+usH;}g zMYX2(xTezq&1~LSieM!z1})p>G&0xvVZ69&CLbOHWZ&%Dg*pGe-z?JMhYyI;;s3H` z{V0nrg42(^goX5lv-y9>t_z5uTgL8E*-{+o`J1aKy4*tg();M=PN|nCy*vzDbh&WA zpR-s`xn833PcB9-!T(7OizOsB3sQgNc4KXr97GN9hAL~K>yYc?mzaOtkDLQ1t7g}7 zRQGhy#eXCl+37JJ(A%}BvvsMpaY%+KXGr*?)r?3bT{eRCS{2ZgueJ3NJ` zumk! zzSP=V`{D41*%0gpm)+d&vsul5w%S`&-Rj=6E0{fV$XkAoGcrD(JBN=w!&BhCc!KBt z|HIcg^@tX2>$Ys$wr#s=m2KO$SJ}30+qP}nHqP3)Z#(y#WIW6tFfuaJzy7sWc+SiI zeA0@1&yRfHi;TFN8wQSiZ%>350Qo*$9c&~RI!{y$sN;HCPUSLr7N@rX-REtb)p8Hg zC$c3niKXm|aKiwD=(`JHS08gRiQClNw>k{R4a0gXHDGWnar6{ z)$GxHd~%Kg%oO(dY)X%dF1dTBUX z6|l~0ao1%cIB$k{%SW31yf-h0-ro0~y>Hn)y$^k!XY7V(JUh=QMdrMAY&&DQL^bb0 zpvOaog4Nv^^%Pej-Vy=$X@w>hwGV(#=Zvs5Tjh@0021u-};!NotdMF zlhc3Vb)RcTZ1IFWKR!`-9CS-_fv_esdOD0v-N^*;NsUQYi42!3Mhtyq^Eexz?X;T^ ziYg&=2RVmZ2XqI-Pq$l{8%a9;3*yT{K=}fm99|;p`p!zKOKNIrW@_e2?V5{{KNBB$ zN2RWd7o)a~RF%}X(U*{RPeK!#R=N=0M4XT%oZpT4egTy7O_vT>G7eDosaL;-n^d*Myy%-xr%* zq{74LKPSbV5#y(W3JWJ&U?ctGjV5{;+Od$2&I$E5YVNz0jOe9UDNV#hMQ4t7s!AzS zTFEbnelNXU-bKr#ily5&$~(-6wAsgvje<+z(emr_lW9^{zHzckW5eJb7+6EwR4KdN zUZo_u{lZ@mU%ATZFuWex%C7aSpE0}Hhhd^#ZIp}ZnvMgVSEkyB%7T5nSqG#gBhKr$ zb5R9U8P4O>MK~^7eQ&)MszrECnD5MIsnRd`Eko@0<5AQY$DX~`Rdq>L6$`sO*p7gL zF4`!$->gcopLQUD!oU0df}G+(IK8wPXnZmgmb&D6W|AMv6z}wd$P+l2xwn6;e-HB1 zn}WxhsMHQ2rTeRFN3`{Url~4a4a=x9N%Tl6$$B+U$R$;Psf3Z?-04QRF1xf*Y~E`b zPSr%&(}ChV^G~d*cAQttzPO}xS)M&vrGA=hI~{vGBr8D~fUt&%ZA-nqb#!&;_x#Lb z!5(8@5+|M}J)03Re}-!5C*6t%UhfOMwbo|3m*>=Ee3nscxZ9^>&U2Sq?VMnHf)y%g z-d4XVkUOKV_pQ7Ut8eSrTRtP78-S8VW4VB%y8GST@#cF$_V;9VcCz^7n4E_vaM8&rId* z9SGjWWn3@(rDr-bT~yULmPBqA_5(6Gs#EKJ0vLp2h%=kO1kUZP#q`a^i#60(2nLVt zE|0+dZM;l3X*%^29@jT<%;RL){?_zldi(AUz-3l3Jh!bF`Ls<>%A$`DVjO~Jdcqz7 znM;blD}r~VQGZF^-K24@`*V0!zw4Mzb`T7k7g;8W732uRFECKxJZ-j6#+X@tDRMFv zOiW#`QCLK9qIAyeuv{8aq=FDA%$KnWQZU3(+wJ9ZTKB>dW&f<9Y5lP)-s7PY#XX*js48O z>RmJppgQ?y3-eutc&${(yalx`F?UnuN^(Iu%iq4$pAa?zqQ-i z#;L}P0?#ZhXD|AcR7v#bk7tqUxjl8vqY>JlGGBQW&sS=9u?0Db?rdz9NkCg>){-+z&<-+CX@Sk zxPYPh#W~aV(wXvny!`iV3EO=&EnQA!X3Z?X#mcApsL{efP=9Y#d$}puN#*a^hAaYs zIf~SHJYT@#^~bSYGA#Kbj#2o9avYW~#)Fd2rbaV-KP#>1J|cvCTq)iHl190p?aLUT z>Rmt0`ohH#x-g`ZPEA*S*+?l|;DiL!7!NRUHVtSmH*&~RHWM0FQjxGWkh}dHCyLWJ z_w-V9)i6RA5m+l(6NysBUuhOwTC(E#0Z9y$%CggN8OvRAy`U)mq6UsuqCF@9#cV9# z6D2{ghq4r_T->vvKK!vGz+uuwGhsH~f#%`7Ij5|{5i3B6zQYJzSN*Y36wun(%?2|Q zWCS6+id#C!3a#WML1_^GPZ||s#5UWUkbB*9CeZb*yz#&^;6vt?2`D!}e%dzR7ii51 z$i-X#6ktL$nntt8ae(Es1n0L9W|2lm;lCh)ufc`MDl5a~!a1tvz!^dRs5d@FJHS|e znx~3ML@XwqgynPD;Po280e8c=(&2pZ#?n!#pcGDc)*3gkG?`#f7L`KQ^h^~RL}d=Od1j#aUb|QzW|?T0 zpav6d{2-FB3lX9=9>jsD&RaxP-$OOF@&(m_FR<@r?)J!H7z98ooEi`T z%srj8n$GiatOZe{gk&YaJrFC9nYgg7iM`Keg-P9vLc&3ci-Vb%;Oze0i=^#gGPM5= zr;{d}ZQ^NsowHH00o5qs*sMkDGl)OVLggCJ>JLQPd~YGaypC=9Czh#Os?14G$oeqU z*id7p!&y(k(kYya+i#6igz7;BPLeNnwe-Ofkp>P#5At=Ml2iImyFI`VO28w`~*LahJ@P`^eQUvz=c z84=b5s1+uMprw(OS;Fx`gBOUlOaMsA653iV-nK~WlykNk^AVMfO_2zec=UeQ9XVtr z6Nn~_r8*3jDFMwBq=Ys=!^5Dsxj@p#;G#y@O5Pc@?sgQiRE9;3XDG&G;_06{7&q%b zU*M>w7G;X!OZ44@3vJE~Rv>YLsi5@ieK;G6kqIb@Y1F7jJW+?Cs_+`i!xERWOvY1) z8w_bEUlTGPU;zCQ*K8#LQK$tT{i42`L3fkIMlY~Wn*vGq*CsQLPg^{zz({9YHb4U5PB;Ay0e_!{@aMtYSFV} zlg-$!j&HQL2*hgi_gKYv#8Fi3m7*@cDasIa%C*0|5RPbk{nu z)3AQcFEMWm@0n>V256rQh>TwFAp*Cm6qt(tZcWkUDXT+#&Ma~9F`mz61bw`;rqfZu zH8UvRpQTd024@(Ai$O%D&jc36qb6N*43Iw8K4-*UHeuWXzqBFIp^1P1y4Tv|o2-)C>P%4abf<9sDr`S|1Puw`5g`N-cL<8B;XB1yGnY2oPb zM>s~!y4wJr6Hk`GHyb%B2N`OBFgD|Cym=IX!>Wt7(LM(mi-IvVNDsxa8Y*U@og7h_ zzyvRJ2BOIYz9(A?5j#DLy$o9{lPFKMjJmL)h(b*e z6#j?2&R^QIo7~k_RGOdkiy1ts4{*^gg(2#YU8a4b$=iMY&+@fUD75?Kn7o31%XonH z3A-c(0;m@bhauCI%7O%(l06hKxJrNpQ0Uby_^oRfTN5)+HuDa^I+Pcey!N}vXKy$m zMHdqjS6KkUhMak~L1IG_I5~9|neC=cN9AGKh|SFgo|w%S0jn)<_^HQTvd5{G>IfIz zfU$26gq?$z<2}HCe2LFmLJX>_9={8pbH&@ZG$a0ue&7xMyl*o>uaQx{BmC#MFE5qU zxR1lyJi31N1rLh0r+V6fB+Y1bGe$~k67IYg6NwPN2dRgrjv?`4vG339F4ew#T zwmJ^Y3art0O$40jwUy`Nq8hRFE6~u=^jGrif8}K=ELrgoNJcDRH02s_ovqYpMX)?C z`dCzpxTnR-T~*6IF#BROQ9Q!c4*OV}%ZaXUX4<6ckg-0i#Tsk)XgtDC`cjK1J+x-l zlx1U!M66wa43#;ncnOkdHjBt$y~PiP5b(&|MPBo)z2sYXDK>wEsWxxoMJlWB1$|O^ z%5L$N+`P(ft4Ky3$upz>P!Zb_8c#7jvOuXil;DdXF|wy0IC#5~DftbDLDCvpU%J7# z4j0`NE5S&Iv@H>8Y{gPQ=43h<{n=0VX)|E1U(uj$RG+> z;WJF{ZEVomva4N<3zXg_izHlup4rKHJEX;9ILs7xmM?tW2Xs1JG zJ^ZYMs~W7O24C0^tYIHMff=tC0UV8vIWI7-$jhnh+TTX4xbp|+ zru1{}2rZG?X4R_BB>Q{Dpi^ZgwSjo!9d|VTGT(P;AAxN7$X=i&6fVd~yMJQ~tqMyXG<21V0y|hV(bA|Y5 z$@CsiY^;**9ZyKgXSt(e#1m;?nWEyH3J;+_Ic>){1h#e1?F@FS0Z4`T;U9c0JA!VOP61W2OYC< z{u>@1{}%yyG}1EmnKgorA(|;&Y){$M^=QmI+>wdoR|q|dTOpks*syc7EHsnm@x-)S zD*MW|Egs27waIaGnxg=hcWq%y;emwCa(@&d9BmDd6~(JiG|l-|9dWaml z>&S540Y%~}GqbuilB!?WS~CSRHal}j7{KCdk8EPkDIF&+mY`fHuKEIU!@555eJ2vk zVHPfBNB>I@`w?I0ZVHvQ3Prr}M#>C^b}etpSD1P?>R2MyiOg(J6;(>TATSoRVv`<` zxd?@5nXmNb2TN;1m4CCfA>FdMuD^?R)1}8gw!v_V$~$)}g_#G#H3|l2;G5Z`ud%C3 zkc2QC3l;A1*)U$-AvNrGe}C(k-SNheJi#`Ou!-Y+aNhOfX5Bcbv2l}*80TWU1#@Ta zx^6a4<>wsRUxzszx1oEyJ+vvEU6yyMW9G`&p7{^X#8I8MET;Al(KBjwH4olkb9K{B zmsnVDIE6Z>KWgCpYkfR|JSSWeu+pYjJmTH3{16T@Sp2Wr)53UNgibEY!-W->J{8_mSDxh1A zV)}kd#uQGlLu8e_0eRRcvI>W3^l8&Uq^YLAwgYM`9!2}90QZadkE~Y~pi#`wR`v{D z+-B8<_m(fm`$y&d{MVpg!v2pnFj?P8gy%;FuoIPIe^X7Rgg|Y7_Oi=!hgLPO6%JYw z4au+}Svh+6#%hH_k0aJ1X@Ugl)V+ERL^VTCrG(eyxzGH>9eHpJ3zZwEy(rMYgjyx2 z#_{k+EVbBFa+0i~U!$vdz{by%`SGevJ?w)xh-0K&CqwQB$vx(Ka%a9XN=oDcm}A-Z zmsaY`wq#T~3G_>~n*S?>zzTm7o}bw~Ir8+GSrd??l1f7O>DdV0O}i$Dir=U4Yup0T9h~@P zQ}%gd4{qp+UDO4iBVLVMPrHQ!F6l$))?K!jpYdYr7}?7=>mIzZ&g|(i_rdQw-QW9) ztQ~0vhXl30426zJlQHxmAebD3?Z3Z|{4udV-+t$%zn{Cmtv+Aui9dF~Km6dQw&#b1 zg~Z{|ACR{o_0)kseEB2doC)uH-L&>hd^vvZvpR18$UjBftQ`2mz+i@fj4*d8&dw`C z1_eTPsR~DQg$V&`p09huDwtwPqu(TyJC>EKG3WR;!b*}*IBbYw@H@G7apDiSxZdSY9mQY>MMDN8{O-NdrZTjv{y_>n?io{rl zaGv1#^pE6OTNmNe&VRR#-n5PHPkdx`X3)~t4QqOLpI-qaD}_l0eKr^`9fNM-&>dq8 zn%6p_^WN_6Jq)=T3V{;s>^Otkk%wDp|Z`9A(9|`b@WKg zeYk{AV=rs8n#tvIw3D}=Kalo$&VQJcezoZ?Cdntef=x#8H*DE-*NrMnG^#rTy<;VA z0SZ~Ecj+!MJpqbKxCa#;a${)-MTJ02lnt~-1O}%7`OfhyEB~!I!XexmdJjX|BSY=|X)p$NTN#w7QAiwGk^%ptQ?SUFn+}LNj~eU;zhYw{tq9yI3x;am_<%PXnLC&XRKUScoiJjq8wH_JV0=MkdH0#EAouD_BEE>`CLNbKCKaCRPD`S ze$ZcbT};%_G$o!}saKrQa9MQ&vsKVqSjCvxGzEEc>oHYAd;*jEVGKRdyNb>v$;}hE*6efQTx-T3?Mn@b3Ma3XrIOWk z$o1g(C3n5OD12SzXfH`X&WWkN@(+el`B_geN&S?6xh8ed^vXooen@Icms-Xe^h82B z>;hI^sh=pnRMv!=y&HDuQe@PFfI(#nG%*SZ-!#eNJjcxKJ?IY%K<*HKOF12wL*~p20@rxu)uMvcB zoXy*divq2DjI<+*AAS>79JpFOZ%gT&hDnxpuWMutDJ3{(sFATvpd%DHa*K}yNNZGC z5!gi;VQQKpi!g(yBsxxh?d?RJN-Bbb@1{i#1X~1HyjU#t%csFW@(;4F7CZP`uNPl7 z5a?YX)m5h<+TyL0X;rP_`Yy2>XUk8MqyNglAAxcoe8haXE6{&dW*`b$96fPDklFCk zN{0Utk`J}n7bbf!p{$-(92hmYmalcN$6 zUJtyLqe&^n?g8Y!RE1~m> zX}E}exMKg*fS+w1Ak&~>s`y;wit#!)GV)&9cUy(6-VKvy6nkVw+tXHj(3Tl*g684)n1(;#R-Q-aM}CT<=31r}>k zwZgZH@Px$UnRi!m&}F@60zp^0=&t6L4Zm?AR|kFWcOhYIh{(zA+cjA7r>U0mq_2-{WE5w;2B7kZ;eBbd z57*$+$z0q;Vr@E#j?i~rG}gp5R|$jX^>aoPUMKNbLvMH4VoLnwE1E~!`cD@thm<`X zU0pjm`V5cmsq>(zHQh5q+hg0V`dULo%yT3K-Ne~dsPFc?K??>RlPtSB4%@D9?1Wh9iMcn*@>CI> z>)$zZK-k1l3dPqX?GzQMa$=^Bl2F=FVs3NycY*M`v{x|({uV-J# z2+Pc2fc*l^2u3XLB0Uw7XEBC0TO|Yyd(kpjpKG3)Km~Z+VtP9-Wz{y)&M3P{c_`L> zKarBLkQW;fj`5lZa!9jr(x|JXK?QgS`DY(D`ot=-)MvGox(;aP?hygR-_$u<)r3ym zd+p(6fTz)eN=8L~nzd~HUH@VulPQP#0u0MglB+TQmNWjOKyBRC%nhUlMI!@@=mn6P zE?RWxs&;mJQqWH2deBW<)!NSPLqDoa&#B_-9P?PEfK~tc^(8A?K^1!pswnJa?XszJ zc@Wp=;OQsTbZqORL?H_-Mk!HBr34`$>|Ogx3*MPuk;1YLjsiWA%QVeJ(Dl~`f$0Oy0n&X1?Zc)1GKV9i&^Ke3_1e1J=> zRTA0HmBg51rdDaMXP##knW262+VOSwIdqITX*m>^bX-^V5R8Af6t8L^48FNI2l@^T z1{6W-LSTN-D(HSlQ6qW-s95qJS$u^;WGDSKp$iwj2Ie7`Twi|NW;aFYTcqK$GOJYO zN=BwH5vy_eGl;*U#cW8h`;gck+%%J89%bOq<5vqs-_bIkc)uKG6}sQbIHWiPE|y9yUI{<44*M${$(H~Lv()bg=9g(J2bGd=U3n#CXkzwTxaLYh-o>a7 zCFB-@Kn(sox3fmC)zmHCaOjR(lz#PFvwNN7)-sF6l}hnm zisin7w)=)6u|ouUT$q!z_`GL*+rX!)OjdhMx5={q#@wj&O$MA-=d{*4&C1N;sqLTK z3{_WeeP8(NPD-{-O*eE{4yZ*MK<(2$M{TrV`O%wQ#d331ZH3&1xh!U{-F(uTSpqvj zp62nCb4G9-ttIYS#_r!Lt`*p6@y-q5za!d(C)E@PY1Xpc8ygv(&7F)5bf=0A>;J(l zUk5!gb4qmB8AZFgquoxp{OY=SRd?C_-S(^g-2K75u}r!q8r3TFBsM*8V1AI7s^Ps( zduG|nh`@Z;Ja+1hBpa1cC#v}saWGy@TMK&7JDOE~j`yL|ma&^`H_;DI52>#pJ4+Qbf!P8N(XD8;KnPB2?T0mO?Dtne}^JBr7i zxOvPjPrdD33_+$BX~HO_Ur-dM1^3!KPxH)g;+HwjszGsqiEH_-bC#t3qAqhGLi&B& zh-sr%-en@ZGhRPElR;31sA}Kc(4gU3XrE*VC$iB^-lV*4E}E8y&_*kuy+u&$L5J>|Y=C0%O(Uv#!S-eAVw z;v%?gO@85yal|-^>grXW%J*u`=v`gfV_xnz3PIOBw0rou!4CGxf1@;H<@Scd?^#`dS;4*AFHUs4&>Lo_qW}@0jk#;TaY87IgExAzcx}%4nkJ5$O*!GyUcO@cV3=?wf4vky%uP{PIG6oH9Pc z5Wxr0ZUjzm$)o15kfpv?d4vGl|6G$v0D<<+2x4fRN*h!q!opm7pbwwxCF=>cHkt26j1!qD<5dq;&XNt|{wH@cDn0bWPxA5GeD}Eq`@}BEOZO+HUw3NyVePA_8CD*zty_sV zx1IaQE?z6o;q5&xd(S`N$)Q)9-?PS}-8CHDwQt%4uF^QV_$b-KYDOdXcGC|-ybtpD zpk=;rraaY14DPRDs>;U7k;R~SfWk(GYNK1sNzP z?hiMHt^Qp2tevi3okxSbL)3%R{6Rh77U|mIjnm3ag*1~)!7k?WhPIjAl;;k@VEFh5 z$9cg?x~(Mua34CD9(!jFyNvGIQ zhU}xwfg(nE(6-W6?YP2-vBkHs`^QR`V5qs=b_*Xt;5%~hBYCRIe_cS5S7~}<#}G18 zeSCd@v8g#Tt|~1xZ5&#mc#>?scZa=}SgZz{e~jcX=#`o~@q>$CqCe=4FR${QNR)%Y zwi4@hl2l#f%~$9*bT@@1fd*bz(1;^`|9if_kGGQz`yC`QU+mp+J zi&UxXNq2xe`=^#><65Y&Tqzd4a&X)O_9G(RL86Wg&N6`+wNJIZ+E7}xLv0#{YKK>P zcP{InXGv|+KR2vg4e88>UA<1{qV#82%p-ekN*CMxoEUuAutt}5VEzri2^I@+fGOMd z(r6;)LN@AC$R~46bgTD8L54ywx8eYiwoAPo@>fTOgEjZimvDE6>F8X=l3m|p7Ee9j zN8C26spu~pv}cbK<>Bn=2POXuCSfw~j?VG+{)TB(sqK>_Fr~9)c_^VoG{z-{h`q#H z75Xs?Uu`p7$F6@*hg4CRm)qk$J7!2K1+|NNzn0k38?>C#=mv$XC97n^UeBCC^lTQ} zA-DA#3qR&Csb=d=LG+jPJHgfH=y_x02ddfy_gc4v?qQ%krru_S zeVAR+h=P)O#^)Ck;LXnWA;5RY+iNBtst#ObjscR4 zR5iT{E)jMXsksGEl`Wk?e^=p$8MTX~_s(};`sjoyC!QNbWa70W4EK8OmOVR6Lz>PPZ2~ zU|Ia)>1{u(vL-T)?Iz@SiXRz{=f28*1|o>FakWlm-iI&1qeY5w?lgsAx;d`lYt+pT zXP$t6L4y1_fjTQ>x&-JZ?OAn)bGcZE`ORNLY@euOwn*?}Erq_zH_z5@(z7sA@& zh5g6W61CIIepo9@bJ}?5Eg4_FR4AN{0E^O<7hm;oPwHN~m7|W!35%-t^YFlHOUEgwkB3!(Yk`cP>>^awjWuPJ%r&+BFrPFm2-Dm!COP8+_w-6GE`h#&E39 zN06s3-^cpw1xYr~5K%t-U7k!~Q|O7p2IMwwaA%CBQ@i7;*wvUtuLT(uuXc8oT8K|4 z)M@iV?F74nRm2<3hVam^dl_2#Xf^>|rdzi-mYDAL2+nM>Y!EVgW7T%Q&wPt%3vXzP zjy4!Q?&VUZluL+L{e&G9c}CJq%t0F8T5s*4$H@zkcDxhA{<(y@t+K3>MMv$Qp%D3{ zsNT)$<7a@|jY0pmiwf8dZNNAKO=(0wBF60Vwomj<=@~&@$Dzky^!H+W9j;?6r0-=2M@(6MD z4fa7&&#pRmK*bME5Gjk}JVA7AhGPn!>xh2P>fM|J(T=4b4^DX*UOL1x;mljnFJ+-> z-!N1OqZnO1ZrOZ@1zae$U+iJ-{c3I?KWo`{s>+D(&6Z6z*SiwC$y||5Z4rO49q2k& z{3c*}&FU+7PZqi!z$5Yt z4GxIYZ4}yhtPf|hsWva7erZu0k04&3qHDri5jCIjENy>NQ69XnQ3~0Ko$hb8~obrdW8!f+~~odDdZj>Uh^F*+b-3kvS>Ov z)l1M()^e%awGhp)w8wEMT;+`E#}l>HOYedmlT|!vidZckiArqLfnoLDgR8?fU4~u1 z`+IOzI~*>9yG>{^RH7ml8z^?t4k79{>k=AiMdYONUIQ?^>8RhJaWYwtld$#pC=R4_ z+$5V6H^qw=@gwbUj33)+6c)a`oc$P()6vRqREwCe*<8;IiwEY9yI=}mnep4=$FkCn z`P^l(LpBj8#mNsF2eZrMQ&8DnRafHDIfJXwmd;ABQ%YeDAG(R_==VlLM71&;oIJ_n zqKVXDW1*GeM97fJbZIbhz>&T$ z!DFg>a&N@&X{>)ytyiR|dV270F{@t1i9&~=#B4E(x{wwXprULG!FhLpo)-0VF=Cb-;(2{Z#6GjzyB z23YIIkLtQHovd_BDlA!_Voty1qRwh^9TFL^AX>oY6q97csFQJ=GefOaQ&iU!_RnMO zgup5)EZAt;2kFn_vH;)$cW2TH;7z&>=JrD3y(ZiGSKufl;7PB%z?A*BJX|VYM*|qXG1K`#M}vFI#@n`# z#eV3h2K5BIy!9{H*K2Kg(4j6kG}TJAJ7?x)YW3y_L)C*-7B&-MpG<^Mt0`yyDiq%2 z%ygEqVpPl!y-V0m)4^&{VdIS`t-*2+K+@r=bck5lDETxy>_lB@2QR08&DqD58BcpK zn3eV(02F$dRkB5A$w=V+Nj!+V{IZ$+&c#5(dmF%e75FfjdiAB&Q@fhU3o)U*Oj8?v z_wTX3Pu}Mq`W4tdN+U$zncG08kG z;1Hts&$NKvaxVqFVv$tV3%F45-~Te3?5(A-K>y3W6+j{nxvt2J(I zk0cO(`Q+x`oVmC!ITBI#2O(-XVtAd;Za8cjgb;{oM;CJ#-K{G(cdqOYfNueA1Kn|Q zf+~J?ZR8RX!;&PgYHBKKK9+lPPB@;dNk$!csw`LVC3#(z*IsGKqqQy9m6c6g@*I7v zW0dJ}KWp$mYs!}vEX+H)b-zrDs(4tIbR-X|E;e&44r=cRNdlc};F9ay7f3=@;#RWS&=c$4757 zbY(e>ZpxF%jca{&uSzx}@Yh~LvAM+E4) zn}Z~9x|o8feIstedG-jj5x$tz(squTvg1i?IrA0rhpqOBpTk8)dB6Eb_`V7BF(c6D zW*j;v!Faz&n2Kp=W2d6laDa0ToA{uyFry~d1kq}wXaQ0|Pqyg(N z6^7ADU8N*a#uAW5#$;0>jwX7~*dyc9(R%J*yTZy3(trTrs|fA%Xp9f{6iAg6eh zjlGd1au+WDYiWYS9${#5e z-ce;xCtCZ1mO1v1>$$YlU?32h^ZjYMav;~sWV)>DDea6u#Z0fq6E4_8{V~1+=K3bB zrEuCv_*cTS*o-H~mXpcAEW3xtaLt-#>_@0MtTEF&&^$+=c?<#9wb?jy(?r|GWY=p0 zR4zP_oY~J==oI9m@VhEV84mlPMNKL+FQ+w(N0lV$YT*1ZbwJXCa8P*^vgcLMGPAF> z>Zc+?FVuu2ov(q!^T4!EvU5T%Px0O~o8gY+=O4l~EUEloN>4pmk0jA;EbW*Bx8u@<*q?bsiMs$127zLwN zp;ea96nxa0v?ZRSL1mLpsZSCfkE-RXP^6+P^N>`FBR=>VR{>9u01Q{!Qvlt*hZ3%L zIBdqgV;-Okf!z4kvi+>hJE7U25~FyXF21k3g75xmA>i1Cp((d&WKAE$G@HWv-+lKJwZ_h=N2VH;4U1#}&wGv@hm|73(>|6xZ$|i?Tg`(w| z0^E_t@f{7XtPYnF!x@WIlp<BMqkWluR(!jH(oe!^PQuk0~OT|T_*d* zfItN<20Xb;i$)K?rtVPYjrK~8o&LO#o`39m4Oy$+-@-6Iz`2RLKe~ zUw??-JRm2D?lzNql?n4VcM8oO&&0ufo-AgvZ*ppVH|=3!5RXlcC8v7uzR|nnujtF> zXQ!?JTyB&Id9i|&2);`uyoX(+qTi0m7PzmAI8tnO04NHez@W4ROtF7m?m}a0YUURI z%CRs@0Alki@-+s+@}D*By-wlazO=@O>Qgwna=xU$c8SdyK2A&jKqZf87~2LoE#-0# z(M!InhJt;F_&{dT3v2@H(lelBYQW?l7>oNN3 zT@pEko>&Jh#pi=7Rw7e6t?=LskaXrrZ_r-h_iGplWK@O4Dxi+l2S^Zhq=RbGR1m=y z;`=*Zy@fvsD*^1}UG$(R!2a6a^0z}e?s@PVOL=V4ZpG4ls&>`t7~r|Os@rTOEcoM7 zU7&Wz3oTMX^kGDyr_qSVzDrkcFqC=ta23=t=z41sV%$wXT4cn#+;;CUUhooE+|N|@ zleXt`yh0p#T8LY5rG$uAPm&^M4wCSer5b z)bHDR{g!$~LX{-&9*ip%jq4WJ)~%2W)&TK1(bkQmQ^`J$hcAg4uG&hQlct0t0 zdjoEbW_=5JNPle&NJ+P04`swBmn(#l()(SQ#IP()u) z*B1j2n@cY^&X4&9G=xE^A%#JN!MJHoRy>X^5wtA~Q>(^yoO7Jak)|#~$7FWspnsP0(S~6_wa3VVaPx|F#vTX)y9SGF?sR;ELkCxREPN% zgm>!*%iwGr>-Vv~WV}eugdK$DT$l=Ed<3+@3Z@JhbkVK+9vQk=bRoXr0$V`iCW|8w zU?Ki$vu)?Ffkpbk49I{#_bu3r{z1C!thtYAH$TUlsY6g~0jjgN^v z3A(`{X8r_?;IEl-6_|RukoY+6R8Y+)03Nfw8IsS~pz1G*4IT0;jwUJXvRLQMfH*! zK!g`8FbZ9GA$?R@5L_;zahWUeKK!KuovQtA0;X=YTFkOBj=&)=#Qb7L5Os@*- zN3TpN_-SnyDCxVK5fHg^#^?6DkZtB6zw}1Sit-Ryfm4D69EISacq&#OLlT*4qT!K2 z9OvFle`zLvmS+AoKia>`4fuvt{U+6<1PTFsqtXPn^@u#wc_48rL(A*hD+q)`nSe}) z-yu3OrhIx^6YgHl?Ktby?o<$AHnJpP2*j#l`O+zaUWm`5)9c1n*sA}5FT*N+hgrtd zIm;NJF|smgc|X1^Ivq`_i-G-mom5|q=#iqlOxsqYF*|*ESCQIi7v=A$dcM|P2Y^Gw z2^x7ShLuPRR9Tr=fnZDK$OFid9}Y6Uh6b%Pf8=f*h84-?(2utm>tXxghTRw(`H~Rc z*gm^`DoS9x5eAqdaKtC8E0mA+lxb6XJ)HGQ z76@as%g#!za|vW3-#+}I?@C9d-smFN%u*&c{7(Sm$TLU?scaUw0TMg{5GBeO-rJWe zg|9az-^73@qb+)$z4JgBu2}GATe>$AM+5JSl^NY~Vbj3V77< zhV0c7IKY^QAJSw!F{-0GX5c~;=-Wq@qdhpCS`U~*wII_QT$wxF_DeQ3a;<8D!LPu) zsd%r_BP%C0vD9*ap0WpE;c*vVhKb10Jz99Mk&cI6H{rQJe;lYF*Rn*T*ttXflrr?Zolb_fc*z9o$E1QMJvxF~RoiNGnNS(5u{jGXZ!4Zq?ylB8 zGH~FhSM{7in;g39 z5DER-kG-JPX;L)_br(f=8h30n}N|oi3Da@mv{Ppikk2vH+eW4 z54mj0JEy)Y6ZQUIF#9g$`B#0a0p=4EP5WS$bqDfY4r>}1P8D>`%lGqucM33gsH3E^ zC+fXA1Jkq^b_b+cGpz?A(>ClS9W5Sm*n`II-^Oh!F-9D#)dxewToyq>XlL>6IQz^0 zq3axjD~Y?UAI!wIZ6_1kwr$(CZQC|ZY}>Xou`$t`=lyn{y0@#lzx}Jusp{U{z4qGc zr#ghh=^*5 zi+>;?kc*a0yCXK3ytypyKt%3x7c3fSkPE7m3qEeZyXwIPh}}B=I5F4`=<0@lT0TBy zhO*6Gs_;)a?I_!%zFcF32MfK8#SE2{LI&MdrBaW`Os6g=Lz;I9UUGi=!W}65XFtD^ z(jVO&1>@z*a?=!yk6SO;@e=MK%G##A z&HU00x4&Z)&^%xb*g)E(Xl_zHNhhz&a73O%1ZT|;jM;^qK1j{E27WCg5rj=gK8|6g zYstxe^GMq&7~dWIS7mZj*-5VCFd0B8Xz~I;*I3+Ux;~Q6YOj~hV+oAAMl>yKqFmrH zen+X+S1}?D4q%@(ft!8+t=Z&`TM7R7eI!f|?_Bc%s;-8VETgLTqTvg=5r&2S-8cDh zoL6m%y0s-%&#{IQxj3Gg4px5S%d1+Z}_zM^9l7E~4B7sw52m6wGE!cU~oA!uGC`<`H-xC(7)2#}LMo8=Q4ajMXq z5Lw;dhD8S!&^*7Ms* zPtu#o@U<{g-@MuRNUF}VrO7hVy(M<`_Yi>wgxY-n7b8pTEQ;bekD+{iSZ+*~;zYa|jkciTJ=r)h*xpLYE4 zVA$gA7a|5R7$0>XE^2*Urgu{YzdUlHD2ESFJr0=@3vo{3&6==f^ALC?fN-QKXEvRg zP*61lm{4uY-~F*;4yE5EP^q+}Cf(T*@{hKMq(yM;3PmYc?#EfcQr!vQ8*YN>=uSXj z@%td9`F+$jH9{`i$BCS$Fu^}g>o%jEFF4{Y7#;Er#5?RkHe3d@5wSZ(xTy=4fIJ5daYkb%rg*0^q|AZ z5>?!U6i(pU<3P$sAdk04LFbn#{sL#iS3f+>^bZ#Yhb7%T$W#2RYL$yC9^?c6Ut8GT!cekggtb_TfzM4_s)Szv=9V(w_hW z2S1?y3H$ufvVnfCxc|Rl{+#VC?CJGfO>B+r9O)e`jLhlnJ?NZ0>`jb8|7)SnK<%o_ z&w|pQ1M7cV=xAbQVQ2eurHVu`!VMB2{PNOma7zeX&W=4TV2*S)=1^@Ks&EDKU$JpOR@>_ z1Bnb16?BUcw>`9xy=n>+k>e)o@mOTHB7sx*{)GOY|8jM8UJ2#rrjkPh0>b#;f2{p~ zWcwC1DZ3w@Y0rgP{W+mx0jeU(S$_>$Rw*O`vp7`UrlA1_2=P2?CljT-va8PEclV!S z3awNWv-jKKBm0vqa1Qu88OjtgZDrEQ=2m4#q12YK=426(HXhoFg>1BEWjiT4)oY4d zh>zMKR;DN`O_aw9eOI@#49?4IkCLnNh9zw%&9&`nI^0QXExa1vvI$#X~ z1@3#n*{p;iMzF6b@JKcj6&>?@u5Bk`ZZYT@GHtr8js+?rp`MVr!-PyE|H7ziWg_+F(Sw*W4>xPJlY<3b&4Vs7Scwnz&M9S6Yft8RRft$b8 zY%LTRLHDn1c8J8_0709Dm>cynKpzCZqsAIWQlVA2&}Pp7=u6^a^qGz3#9lUmc}>z( zm4tl=qtc9(m=a1b#+gVDng-zLYw^9j)jM$qi{%JPXVq3t5+R=sihQmle zu+-e;pjm%*G$Xs*V{i1=){HoWM3|GrU*+eE-wFqXCle!Z&SJR$D0P!A_i(DxgGtS< zqqxLG2W(TmN4d~%SXMw;2t7!O4IGg@0YLWs_q8liZ5WmLst^lda0BD${QGhAkahWr z7F2r+Ke$bLkVnuGiSc$}?QjavQ`^ArAC8EjK~pdw3~&z#0_*OjA~AOO zUHJfgpo4OVH3-GMR1dAgxiVEOT4K>$w&wZEA1}CJCQDmv1Jf=2p`xwoF=0VwLt1uT;~aFW=BqGJ(Ba_g0q|}`VrBW zk|SbUGvte1=Q^9UCNys(?j>Czult!7XvyGlXcazSES<_QOSUdvI{?SH&R^B+=T&{b zQt!8iNWZY?5mIdXUWcA~^Tsm|mpGX%d$?96H40jtU)+y9*Dp8;bUXdSt+9cS@oYwA zssL8?Ck78|<&}6eGL^Yg4}W)e`Wg?v_IhzN>>d6v&Uq5EdHHYw4YO#3sj~`R8cwv} zJym*9&zAS&j{TE^lX$5fb2H3C?8mPwp{1>@Y@dzMHtcj)KX9nfzx$?Wm;kRn-Q3_PsV#LWii(sp*pb^(}cQJ}jP zl6<2K;Mqb-&TVeT?Dms+T*c7DCVe*S5S-~49RnM*Y-h`}YDk{gJW!YQ(=&kaU(uP% z-7lN8kg|Erw9D9I_-aAcTlm=2KI?fG?cidD6VHv^2`l`v1A7IX@M9guC+Kxf=2Lx_ zBY*vqX3Wc|>qmVJ3OP92Fu#5hb&Sa5B-HL-oV|8>2bY1Jc87eRI&qD$i>oN38||X6 z_4-kg{Dts2E3?4L7wp@AM!$_Ry>|`Xa7k+tmZzd{&hAZ5 znq?96Y}hNFslI`6xbny(n|H9DL?t?Qh@n`eQU5yVbHkQ4kV^^&Gd>pHPz7|_4<6Y~ zR>f9Id2OF!|3L&?eB7O+^LK<_Pm)MG$Ve(EjjFMgT30G zg#_kt?zl-ToTUT;ycgS3q6zj??824*imFHMQ=>jm;fNn~(h?#=Ajh|3DMwT09?7zP*W`Q=CBw)hqVnL(o zr<_JyDL*1U&(d1+*n^F@pz7?3> zKnUAHTD~^ZYX-pUIR>GdV7`*@ehM@j7&WW=T668HB#^e-bWLspb?a8s#${L@nHJC* z7{v@SIdEp(-l_Z7m2i?M4s`|(+s0|6)9P2L-@y&S+A@;sJ7)c8x%OYh%nD z*yYFrS^7!@T*mU`xF!zw&(yvvTD>fnB~Jh9re$_%6quut>+vocpy}B1dE-_PRu7+7 zvMP7MhTip2KErIhB0)n?`|XiC6$>hworG#NTg_(`FMz17W1uM;nl1)$yb&U#g#wUq zWgI^oAhB)Pu|eKJxAb|m6PrD@o6rORRHfu1{_Mtrv$PTp(SQz#vp}gG36V|~;+>=% z^QNB<{}hk@Q~_mQ3PRwQON=PJwHMux%AeeIgEZHTzql6s8Kab;srNHa3bzmjcl2Zi zCxpfErey#lH6smbkzFYyc7)3p9`x$kBYzBtZ$TwwKtf(2U{257x#4C-xnUv#X;_>W z|8Lj>=5t}!-E*9tVUrzA03DUUKPfi0LUY+NFEtTpboPipeYriRg%810*)CY zgp#^mfbc_$^AHbx$*q`LH`tZLs50>G;a43mEkhXlW+8`P&n|BtI{O9--H$c8{8{WQ z(|E{`KF&VASEd^g+NNZ>jIjCG`Jx~P>>2quRKu){iPVl-C)(qRh`F6@i}zHzrVFW* zQ2WanAUHP_QG2Tx(ok3ivHR{$7By$2%Y6sHi@3yio{JPDbsX}cxP~E(?p674FW}t0 zlC!Sb(eGrCx~ew`^tZZebEMyd4aYvBrsmJ?r|CAg@F;PXl{|Zz=4n;M|Z#8|%7nI@2*(Nd;xuT>RfFGo8veBtqt^?MI_CM7%|lFV-K0yGJAap%KOp#iITmqNNiGxhb* zw;gyP2*9H1rR_@cbZ4ungz;T1Wz|3Fd?D*O0W{r%M^oD7O8?6q{Q@ z3x`{$p6pjV@CXI#L-{KS+$;Nae_=+4oi-X#$VbWwa`zMB2m}~uk0>~p$6W5YoP=9p zI%i8in18=7FCC`b7~1bZ6knR1>)^Kp{Hh};8%Cm@5tpP?yYpl}h4@Ck2^IAg67HXM z^D$zmh*7Pl2pS_e8HguIowEG#H-lL)I%bK-2@cvx_?BjppQA{#X-%hoG@X6GiFM?vc}`&IX%9R zAiZM~^?co6#q2PNUxF_VMru7~* zWo{m^^c@h&?YDo&WOLk-#A40F#yCat<2IR!0>73$`B9PFM#ki?AdGJ54xHc8BKsohzU$qLresuk$Q z?n|t%E~(^kTLp$5iP>tcG8jz6RV@n8)VrF2akz1O+W+_I>GC-k7Ln&?B*D|u1kX?q zzsfxsEK8`>1MPL@WSo&(`abbmS-oqbwrUmpOr@n$*Q+-J^@{&L-xB#)zG@YJWCb>` z|3e&bGIBIA`HwhYqr4fL#em>*N-fHr5P1)rP~I%rx>>mZ*qD}Du89W)tL6llaBY|B z?e?=`Bpnk5v}bcTnO^En{#mOsGz4;0Rn&U@LBa;!BE|Cc?6QT;zJ%53;o&z{=NVE9 zh5bQwjrD!bYg*Lh(9vETy{k00XVsQu;VOFxMK)@pG4j#0%me1-twuw7pN*>;{OILrBgXkxOpibq^M+hbtfs1hzGo-EU$=S9Cmb?P1LPiR=32LukPF^nfJwNv7>OYi7;APX-0EBSpDV81|npiUutmp z;Big1F+e$1ME3R%=SU$(ZDqY7IHA#?S)7JnCG@i>OQz~{W0~LP&|1XW2i!eYO;SEP zB5TNWI!oR_<)V<&&|<%Q39?}0Tcm;md8s=6m$X@|WH*aog~RY9Y{WvVYUeHz%HQ*% z9^r}Bkin3!7XnEJBoXLSN+m+%EeN8ssv<0h$PbaOGww*YCTiKy_VZ+I;V!(aOuG4n zc~G*0?sJQ)=Lj-2(K|W^a6?COUJ`<07kdju>FmE||1GH+sW6T(p#TB3>i#@9|2O5w z$;8aY#PU^y*PR6nV_4 z$1IYtT*+FsGEbzt1zjtLt-$d#$sAN@lD&*XM16g|@FBar8*u_7DLmXFLRr~HNu`3z zCi9yhrqYhJWSN~CVz2Y-F3iID{`2vOzU*{2rujj+e>F?->xmBhb-w@B9}=5h*i>{nSi}N%nctR-s5%C3 zp}4)So#T#X|6cm2aqjK+VJzB<11h~f42(wEH*sfO!vYE{DQXG@%MG1K_e`dOd`Z+h z1T~5Dwl!0Mf9>sPzd(ocI(vca(O6^`opcoP7l)!B!|6HVV;Xtkfi658|4e@Zq8&Rw z6IfqukOVVA3gTQ-NdUnP?dG+z|==J{o@wL;!nWNj+%>(XOPyX!%-LCBR z5FW;vm8U0I&(GN8_3OaL`TqL;9AxrqXs^t!wDfXTnU#m{>%#o6ayjyV*aJl#Bn={$jC z#c=XIdkUhYbj+j-4W`_C}SR|^U};0P$Y;Cc!HC;msQQW!Gfg1aU!CiGR)J?$lx%#3;S>av{h-B!YRb@>Va=A9uc+8I z!0=r{J`NC&XB%}oiKU1N2v=iT^y4U)VU-u^2C4~I8j}+QUIc`Oo4V&?B8Y5Y6phvU z8wC)$CPmUP9xfcu!J=07@b`>euTYT2!|1uhqsM?(FT)F10pSEg??7)M2R}$&If0T4f5s$Z3!+s8bfI}J;pDfMIN*j zM{rL|GQa$O@2zuT!szjR8paRu3nO4;h5@aS<*=w26aj+_A~8pTDQ1D^Ctkh9mcbt# z>=~(C_M0IGr%ib_XAZEe7YBq;y`>2laN%t`TBmGOLXm*!;r>h`q%2Gk(-3bvuwyij z;{e3_jANU~^iItDCkw$C^p!A(Sm2{_GZ_meLdb$dd@#***;9&uQS-7} z%fs+0a~Os3g^7u36CPl4+Hbmd!Na%S-&u5dWAW+a0wliA-;!s^hAighJ?t@H0&4>< zF`$?OLgR4a9h@AX1g_d@`JVa{C$foI;X|kbx*837bs|MNqzO6HQPw?EwEp%{dbvIVn*e`;Gt7@@n9B}V zF-tH>_8sg+p(l&yWLg;M5aMU@ZWR;eIEZM6LXlq33tB4DXuc8Sd zYspRx=of&>zF@qX&`MWOn~u+^{wT?Dm=4JzO z?LOI3`cr+40XiCphc3ivDp-M6$cE&O{>Q$0&*nqG-}mGoAiw3>eF2dl1AYo9@1cIWy*{saRwZZ)kxjvf22LfDkG0#gMNM z$;{;3{D6&3+q)dI&NnMzdrSSZ{f|;sfk63anKUMuy{DiITrk;`Q7gx+R-HOwO~nzL z1MO1tM~wOiLka=Sm@;|@;d0pNM9vP{nYmPy*r$)Ro8Hy@ic@At0Fl>kM3590&#XH| zLEO6FQ0#v>+9Hc(;zn~B7B-#is=Q%LcxMSX>L|k!NFuc0i=x|4EatYCW(n9i?F24J zOq*dmzA${@4?In>5K6S1o{b!58;womutQm*2pT(BeB8dCSA8#-cu#={Hzb=l)J68g zeu&W(fA3LxbC<-Qd#Mu!Z~lmjdY-V__xhcD0`a)GXg|WOTFZElGcW%(@RP!Z7GC6q zd)7MNUL)b)4|+ZcWyLYqILD;BS#ue-+<{cOCYwPoJpPt`5eP4G^iET0pE}@jmZ@qB z$Yvf+$5D%VAN8bkR`h6$;;-YAyix(bX^tzw&eX}WC+G(kBGxV9-G0IVN3_Ad8d<5c z$*$Me-KXPtWtmbT+@fxz@@eJ;iUp$mcplA^?ik9srh!o7L)@r;r``^?>0r=}*8S}&*FB)yCMsqt;ZJ8%@K^hmb@qpgjuQ2q5 z(W5G<>()SS(BVrHr#)DdZ%gb}={E-)u1zR7R|nNx*@X9hn&9KzO=D-)pr0wu-1*4|Q7nD~1X#-0!mgjVH| zqI>;lOQFB~B2uCRgxi!oBVXKEn2v0p-s@o%f(U6&Gtx5X!WF5(RdbA&#{r2p=2>1D&Ya#}gxDCok*vkohZd(|wX+V~J>V8S2OA8_LK zep0MPh2MfEq#p`wyC9NpvM0xZT+k>xMz^X_c;dy}>gFVsxUD;G;^lFa9Sh>#e$K8s zo=P0WH-cAn6`8BOHwyRU&B4R)j#*KtW&2 z$~EOJG#RDp=RBcrO`i?B#iRs=mUS*PqMVGtWRAS$zD}=7?Vzf=k&gXc3n+by&sD9;Hz zF83hpE#>KMCH5SlF5by=sNY`*eI_sJ#)JL5ZPJfP;Ex3y{vufmAV;rcdcBE@)g`WB z4*D(VAcHC;#!nniC%De2QO_(+ofM6ZE$)8=8oN*M5p^#|&$M{=n%no7^x7vXY28O(s@9Xex+{fMq`Ei`9RqT@lF?VqBGpgKsHrOebK;?4)H6+W{! z&B`-7m5XXpfZfq+sI5BEYlG=8>TWt;tF&nC{SN5^(fCK9VykjHDf_v?#+-@4!VhqB zc;e@(Sza%FzBCXC&f^k7Iwv}TW|xW=$pF2kje#PW03Se$dW8T_W8pvWv9Q~(`(YvD zg?-@+pfy9rB%-bqz5=%dQ%5)cn}Lr{Kc0h4HP0_-@ud zAh&Op?y%1R-+_eqLL+4bx0vNMtN}~v&+(14*?Xv3V;FzCN_y(m$L_A{BQ<6zH?J8t zsiX9RpTLE9HEr8A3}r5cY!cTpA{U#TfYKcK4*aFH?(D2a!)L1w5~|@Av!hY7Vgk|Y zI?*2xZy_u_=?P~$ZV>phc5#2#b;xWfk-Rn>XtKXngsYiCSY9ILG+#CbNAk>xwBG>< zRiqegj#6y3F5;z)J@WZ4PSXN#3BlGUTA6OYuO<^7C57iW7xy3Bpr+HlMp15?nyueG z$jQVE9|h~>Tj%Fr@P>;Z9PW8i?asoSSxUjjaMO14ZcIp4+*>iCelOpHb?3)nGy7g~ z6n{R6SA6?t`hpenSYdJ5T~|A>K&qdWoim0O@M;ln&<}IRu*JzkV92FOyi*U@lDY?j zT=Mk+_C9Ihx6rRFFEF_@!xZi26zqf4DbeNsAuaD=?MfRZSGfn>%+^>nXbTyR*7@2* zy4)fJozKyJGPl-Z3J|FrRuMX(KojJ7E!PN2vk8q`!j$ z;VBX}Gk%v=x}Rl1Xwm@|UD^P7d(wz^x%Lc0tpL>sh4gtIl%p!k&63lulXI*(s72*z z5%OeakGyveaR3@PBZySZKUH8(-*b{QLEWu6fV4S9#s7W!xzr^+>F|i?uC8q4S+ev! zaGMJD1SWl+184wRJjgg?TWmp z9b?>bvFjNSgTe?|-1Gwi%Z~hP}CFc;Uke%ME-UZhvpvc?hQrIOh) zBvxSCb`yU_sM(Ey^l&KOo`}OIK#k99>ww49k8~2s)5WH=#f$cp{2gvVX8Vfj0RTQ7 z>h>9n0{2};=Z0#;h$v);WHy|YhhTglY;}Pp&X~{t2LGR;_ZU^lq56+C;sN3Rk{azT zY;8^c<1?F9lZxB?@tM7=Nvoiw03r__&HH`_UKPS7+6HY;7cjsCSShh0W*~`kMj$@+ zx`igc#&?Ts9?9eXguMn0#{Iz$i#dnWm+g+{LI~?o0%MiVLfV1&_wHpUOs=6dFo9>yw1beyl}d7{vB( zr&X6pZ7kBiq;)r>TwMN$=^iX&kz*cp<$LC9q>laSxhpAoU5L`4nmM0I**=(b9jahgF8SH_x-w4 zPe_*qm#Lzk>Rf${K-$qWq#J$Z8_+*o;p-jg!y63!NXwHPkYg5wv6pd-9UBRR7e z=$zj*Rd?w*FSK^~wIL{_wGRlqc3DguXTJxECytKL;!DKR`jK$KORAWL-S;Q$Q#_iR zSTqscO`vu_Xxu4;DYC2m&GY1N#v9B&LS+D`01X0mrjm~K#D$zfmf;RmO4ttJ@N1fJVqD8*iJBeR>EYHcG&*3~Ynrs39adP=GU9O_EOIOtM!hDX zt3`hl!yR+l%JDFsX-*9g_9Wnpvto{`2DkY8G{z=qN)KpAmL+aoF9sZ?Q{kbNxvm)| zqYh{~_H*AX=S9$$i6{*MIU{ZGWK|uUl$ij<;iG4tl_f67SNgX{11=l}@KmDX46mn}hMKoQ+*gTv-@p0Wx%WkNOyj zBmlHrvHlYyRJ%Suqfc2V&|IC-f?=aNXT9@z3S}IMv07|Y*w>}k6(0SIm zer>Y*_9?rR$qRys!|X^Q(iW3*oN=y{SgBU!AZ>P;ZPK3nyBBe&)hMV|-5zx)fVL8D z&`9cog=;D6h_3Qm*ZD|GJ-B~*G3csrI* zZe4qKwd=I}U3m9I;d^|t3i?F~Yk%%2Sa<4jjO;*AMQ>FV9%SvQQn=Z0%(1qg@%A`x`g{PbJrf=YO))8FNEsS!b zWWcBkw=Qe&X)Gd1s_?vg-4aAcCUKgu&56F-f^YQTyT|M+KnP_&UR9 z703JKE1nnU6<{ISAfp&5%blktKI8XacKU1zMyKZ=!-T|-SM7hbC_6bDIJ^9ZCRw9q zWA{^!zjE~i%<-vEE8_uY=%84srJL~v)BdFIC>S8L3anfjD8f_`-=DEJ#WY-hS%Gb6 z?ylQAPj$rs#GAwp7!YF4eDwtzV5KNl;yN?%Y|D?T$=jX-3p13|(^ElWSyoR|xEzyVj zx$MdHnuE|?!Z^a{)up*%V@#@`f5|11=uzNvdhbCH*B&8UVQU)oi#`eu!}atsj_eX_ zE%Kz2prA{BTW&eVkl+{PjU<>+JDa45wgxKFiT+}}9&eK8UTwR8)7YP*sjDzb#{2@l z+eq92b<{&9!N_b&#+;|Ufc)WZ0F1D=H1a`w2x)UU`%CIk?g2EN3l(ECv^&T{n&f*B zKnj8g2pvJYH_zt9PcvkcQ8J{k$lM%Es(-6X==2f{o>=O+gO48WMAg;ti2+qNL(D6J1HX)nFHFK!WKq+j5?154HTC-Tu^?tGDtvtG_s>FQ98lzsls0hwC=88A9eb zF(*UrHO-oY?5fjJT&Ou7QK=d+jFNWGQg}y?S{*TAt#KdGN{i1fDfb(1mgBy;z9584 zZdSf~@bmey6uBM|BefV;>yP30aOk!j8U~+*T-AqEl_hZ|=@nON@eLa;0MuqXAv6e( zjv7w;ofMP;_;ao6@39P_n$L8d)|VRE{BrjDDMSDd^0$itd8gSx%u7-ER!=)Yyx)Sv(SL zCw+2wprF@-?dXtbRI}96z`a^rhD9N^g*$zm{;~-R_oPk=gT2_3Uy`vmY^!qEm5Mv! zE$~m;dX~ySpcvk+!u<%5vG4Zq%h1#9@FQT9Z=3F07A^4mkdHUJ_sm0|!D97KV7{pH zhnxYQb2JKyJnAIj?e9ou-7|re%-dh-qA4QR$-og`Z73t*z8cZ>n;4j&3Qc$>V%f0~ z6ZBN$#YK@1dR1NxesB$Z=aj$wugUx#cJ88TG$5dUi~q}B=IrtRt-V(~RzH36#GgJn z*;XaS(mZzr04EEs^}wast9Fr-Qlh7dT0}(XNM0BQL>s7idimV<-Q}eVJSZ%?lV^3M zQqjb)bbfnr@y};E9?81(L!seu54Sq%TWF2zdf~)FvvI_kMAWu7BK?Z?quoKF_Grbq z&Nb_%#c|ToWI{JEe zex0(}>E%q*e_uV$mN9@p`b6}BgZCPtFY|`9Ha12!{ieqh4^LSF{6v*V*`Lj6+Nai0 zLBr=Y@E@m~d91O)|&V5N~}eG^ucg2Q})1@%+&>(WIU zYX$gMW^do0>q+T0s3*o&Rf^lXqMETuu!N$+olU=WNk3F(&jze419c$qxdK(qMQqKS zDvU2KL+E9jy`j9}Hjeh1**!!<|9cH%FaiP=9=&|OA#IL!{&Ka4WcMI(e?os4vXDid! zJXQm+xpf;Te`XM^-mX<0VXobn#jO*ot~hMbsNba-jcH!`dwS(gY$g{-iIH0dlj03e zRd>W4gb&&k)H4II@$B<`(r|Q__{qCv;FNE~f)X1l^|-#yKURQC5-M|fE^2dOOfOcX zyivP3e}2_pNcP&E3XK*{3cBVXuZr04o{3<`CV#Di-s@tB!AO0EA7(jqSpx z(20}EP!<|mMJG1&ESf}vxE2CsxUKfvD4mN6!ggD5Vrs!K!tuF}+BURaJGYi*_xo@EqN|aVK*QQ*xmD&Mg%H$nM$ylv98F z=@#4&CMaQe)Dv4@?N9c26kkr0O|&L7R}Tue!f*cg=^RnFUwC5;Azv7|F-Onha-Gm~)oWY7yq#&w zA-r^*_G#8IYJD|$D&I!uda|q1yDDF+^V|Fkh<)cT-x~rw`4oCs+-0@8-ef7KwjDi5 z`KP;iN;)@NfzG$&&%e)Q5WM3W_!skUFiFcLILqH(N#`4oq~BS}jnMIn@#M3{_m0y*xyx`uy6p5fuSe?SWdN)3@CrWFRnFRkHv zvMV>6)|aP>awGMP9*KPXf$(KZ_~ZK$v4Rw8#ScNOss`LVMTpY`M6r>()Ned=EW}$Q zl$k#X?yC!q#+U-{{!tC=s0iwVwD&UuzxtH^qe@R@b?r2F{M6q@tkmhkB&Zag(t1OBzVY93lP=sWXV+!$`(0G?K}aw zJ|196WIDeu;W3#HApc(}a?y+=YegnK1%S9`o;N zo(#Mk*o^ycM8G?>z=&6iNj=uqxKO~E`H=41?(G*`Q0Eu|?hbsszHoJba=A==@NFj@ z)SW4TJY1G`G)@6{ng%Soj_I#GBwCr=F!B`kh!*GYK*c^2!JV zJXp}`?>Opg_h$$L{0N-e@Vnm2#5jkErbt5->*!EoFzE&vU3O{a%%9jFwC?%(PS^H=(Z3h_awh8PQ+me+AE zvf!?D$RNYICov)xluSz$h^~qJVP^{tSx4Xa`P?`g(TMZCMG}hn3 zM7jc4uP7codyFZ)UfIxpTL}9%<#CFqfu%F6YpNHfa{(R~MG3&uu76*Y*SRl>syxg1 zxU~l{6mO?W*A{CA*(_id9$MJP$CL>fr84CBMzd@tbWG?h#YiQG`MI zNscp@t#qt3a4-fVyUo!EvBYQw)kD#%lovYR>+?cs;V#`Ksk z+%JRQ0z(tLgA>jSNKki^=WlyT{oB~medh0DDH1ajXa$`~bO+l+060--m?dK)5$4Q{ z5!QZ08+J#MC4e&3O<|VYaM7QRz=~O+%5S8`C$4#_Ah7kjJx+rTC3DR4wnz_(Q`ol2 z7?<;hBNrRAvGK7;{5gl8_v9blJ zwr$(CZ6`Omv29IeF^ie1f2z8dy?eXs>-U`VoLNvdv84zJCD3=SS9W=ZL}OsVs0w0=o^Cgix;VRDu;!81*8QWwt>$qL=Yc_o6K z;ob{^Qn(%##+ElMBdFr6^#?ek`(~M?MD0#OQou|X@roHm{vD46^(u0}mfYaS&N+~v z4hwSX*k=||!zviYg`FU|weKQ%NLET4Kv-7T^D5@dt zGRiZ}+XEQmRsVUe(o+%6@g{!)98V-&Y*DT@OOl0pVos6r#gV7JAyX_Odp3-pOma=* z>Jx+mO9VCu&P&5rb8B_rxPR9AziS+ z(Rm{fIm88jS;YG)l1<8j9rcuKZkOp$Y;Q-4l^@TqMzHVuq#XMzSsCooJpbwQ8aG5V zjFXjCB8lp&-}+kz%tKWN23<8r3SK@sMOd&z=?95lAbG?JnpJnxzIzw~U^w<=7h-AC z=a&pzEcrh{ZNq`j-s1>=LA;;p&33(}Hgl(>EUAjpsg#vYiE7dgvR=dlFnc zR^7s@;!~Fp5>VD_@OpAtHYX4gB~(J&d64sfxROSEJDh ze|Ox|t}*>2@1Wf&_UTB77mT+fwn@<3>;g~s5QXv_Wa< z&(vQ!WCS@xP%kJ(@+h{1mS=l+uSC*QDfZT3OE*HV=C^{(Mf2Xds2D$#A6 zl%%O51r1Pc8Kl<44q>%_>!N-b^gtPiKu#*544PEX{&eqYyWpD3@C}dPjlN~rez6dU zAjcqWiVZnr`u!7Kb}es{MZ-U?DyE=jObSaTpsoq7?9C*;|9)S{*v|umC1%OT+W0fM z0I6n8xhGbPY@Zn4CuZWewV5nTDp3UL02I68XMimUp8YnbJ&)TP+!I}b1AUP|oz^oj z?|S%{gT9r8%w7tE{t;XzP2*eaX@m;AXqb_7l4{?1uOT+jW>c@CXNg2ZTxTyHs5nwN zo4^84F{#WwhgfQvlIaPk3v8+BV;S-UJCsmT?)r%zy8Kio_lXy}qFN^RiW{oBQtJA+ zO&BaG3kAzF<)}rA9|MGYd!CiBTbBi?b4w`Uyb^1CA%W1HrM~~z)SmV&Va*Ee z8aSQ=Jr1W5$=a<^YTk3}^)f12w);)AHQl*>b4)VA1E(6*JX=UsB$z4mX+EOCY0yH} zG`HjfA*m2R%8|KA(~3u=2w7q#*b702Tc!%PQOtcQh3Pswf_sf%MRf$aGgljxyRsZ3 z)E!m4PHiXK2_VXCjW`Y4!)CYE(+UR_isrAXlU+}+F%29f`dexxUvy@=C-t6tlHcLf zts$;16|@$xvTmtoHxi-+V(%(e!m5gLOqLd|hc?k<4N=3Y4?up6lJVZLhZSm^t!Owl zfLoe`kKu|k!SINsD)PU{EkLer7dqy03HIWuN8M0?;w{{aO;01x3STsqT2iAq#@9Or zHqn^Nm>&O2foy;K5OU06wTVV*9AEkNzgbxDMQ40DVF_QMzH12Hi>Y^2>0EJL!=`mGRbXJ}Kd|FR&Ef`qjfjo+UqFqU1|p zC`5inzESD#|8_R!xYS_f0I4`IF(z$@qxzgWlgM4kkYvNb*Erp=rBz7nJ-W={AC;_c6=V=n2lp&y+U82~7W5B##K zbc|le0yd1U`fJhR%dw|tMLM1S)KW%kU_j~}x+0`6hr&^uLrE@Tt_cje>4*+TBSRVz zp$A|Qns@biAn5u5$zl# zfoD|(JOba)&>XP-c=Mb4j~P!MkP^^Qp!jVc_`GD==Lwb%iy2@PZ7vuA7l}>sdMt;b zEFlaIKnol8vfAP|bl}P(F(6*hL4MzAA|IM>3x!1$OmEsn_a~H5QBuRyS#Z(GKZ~MfTV@ zRG3hcYN!*LaI|}1N^oOY#)bAM10wQ-xK!4IzPte9{{&BJpWnUuHhk+7VAOhn*dYlS z$0d_a4>1lM8R8}m!gE|S3uo!#{$ zCzY-I2$;P;?6^xor;LLZ0!r#7$(^FtMiQ!fB8Rms1EiAQwL9uw;THCNpazNf(ZSZA z+H^mqJ@|oDy^&}vB8sARck(&pu$*vwUa(m_PNz*;iClur@0bq@*S0BnA{4o(C8=x< zD?V!qfBo%jS-jZ2<4^fAoctak%O5-b>&X4aZuiknBw$5&Y5p#SBL?i8D-zZEcHz(& z_?MO(VdZI!Y7;H)VCuoGtj>??<81q#38OCt{o}2SMEf{T>MlT*Rp_mu?v_{5I2SJ3 zk{#&1y^5pz9cj5tt9}~<&I}X|>{{34MNLovAm9dH+PzZpi?Ez&tSTT3SA)oP)M{hBa!xv?mq9|UXRaX z<9F?@;}>~ZaU-VE1F>od!=Tp&ko37Lym=o+3oBNc1q0(QPUw@4E@ufsQGI_FJ;_#m z-;U(=JJalXP_Asxo6%Cs+osQhdCQb4B()-ALML;u)0cl}2yzjXCDo*I%gI1rCC~6! zWqka$lq#j2mqq*~Ujpn&0inwUw{!ssiG0h!sl_|hQ-&&<0O%U@YiLif=?X#Zj5I;A zNvL|cmY^a*Cl5n2udMWArz|sWD(}cq1VFm#rY#ov!tCH~{3cW^Y|Jv<@#xbW!HQFs zfvx0q%7IPF7RN6C#;Cf&+iQ=g)nYB^@b|}C-P(tQui!Eq$>wj;ZN+&$b*XK7&M=+Y z2KlbA-?6>Sg6{#nWPEd*{|mdc`#$++`PvKX1^!->&*J5QB+!l95~2{2wVIR~b>QiK z1MxCsWxqRIhXkUR`W^D5qAqpM{P-h5ta5Kf=-hka=;mI2;djR)-oKahloIuBp@o|> z60WHoJN2h$Nh!Rj;Br$_L*A9jk+>tY?h~!Ow!|L zJd|S%sX~zCfWX20?FAPHUSZOX^;HihFx1%$@x8SD=PSQ~$xYp0+|)j*ej@I1J_+T+ zf(EbB+iLRDU&0BK%0-`-uT`vhXCm&}q6TTpaX$D5rhoROa`qPB)rhIS zQ9yBAuwx4CYkoT>$7{wj_)gmIwmf z5zQ|;DH*QmKxtAk5SAM}jE5b?BWvRG|HKmSph^{10098be?`InAPD}hxQ+i?5L6kk zEoOk}c|cWr211$wCs4FtsqCy;ajj}i%PmZXlp&EQjIS8}YZr(Nq0*D0jMHbvzr~oN zNW88Iy%B`b!i1*xH~0GNZSCuA?q)2E=7OgXi!;kMRD4>WMV!tCK&Jae4Wv6CGshKA z?K+BG&upei#`(kA1?*Z_uIjLuZ54Bd3Gds2db=XnjE;Vr=i!WP-Mrx?ozM!LO*Z`@ za37M8ye142BcHBnd!c%mO51>ZNnYai?{TPiUQziz$q6ohB7=7?+GT;H9LfUL5y&Pr z_!|AbmUr~wV__lmjlU9MNC`{c>wF4iD_G;2sFchRP8EPs{~WiwN}^rLn}Dj4UJ}So zkb*~$p|Ye{vpUxCQSp@qDM;87qS#3?W%jNs`luw@bzx$05b0Avg)EHr)Ar&K-Cq&3 zu#P)u*c&IQ^wTMLSd9@>NnC37?h8vyz3~r9@l)^0!QE(`1MhR)^;)|N-NxJ}MUj6G zJyTol8dSE+1%#rlG*l&tF>*vKun1D(WF#fUV6T9i^}fce5=S6@_DwboXq|=lbjeI9 zbu6|`Y=d7oy}_!Pl6)e!N$mAz?tg=QX3^#4YP~T~D5VIb20!ebZg3X(qPUh^l&cP(&KMjM2t+S!~?=W2PUO8@yIsUw%Ks*w6p+QK_lBU$d)y^kcU&tk@ z65*2XGZM6OPlbelJ_A&j^XB1`!Y8OtCKdCWf<1uJP)_w$Ef3Hk;`1`|^74MM@-`ir zZZ-QXJD;_lu8EWK+g26ovtEhuwh8UHe8}xQ{}cAxLfa}*-LfwH=ZQE0U#8C|yVr5C zWwc-?(r23r6C|s0)Dq|wM7tQ~+edqW{p9P4GT@?hgWTz%M(5e{ z?b3ia^{}Jn^X9shCabIR=}h+Bj{GE4POdrb&;Qr%Xvd8eMJD!G9BJP%>-a{r$9mJb zt8XK`^JY=X8=+?KiIfiq=o;lQ=G4hEN&n^nt6r`!E9aE!4M`%mZc=J5ErP4dS07UK z2$L5@_fgEZ6g^Bz8)E@GWI<%2*Mr>BD?XPE`*U>IYqwQ)s!cyitNADp-szUYSGLG`jTJ_4Et#7X3d1Y(!g*oYM{#vjpeMM@7Q|DVCJn5ucYjP|hld(43U0kTX{N+ug+&`Q_Jv{GW^Jkt zT2ZxA*BijJe5I|_lBJ4wB#Z>;yDrVc%c;ijycY9ypOT;KJoH2;O{8zj#iwJlukbBh z#I68sp%-(WYCN_(su2LV?-+@6&J%K*GXkvm4Oxbdq0a%>C)<2YOwe&&L<0x6&XrsOC!4j5VH# zCW@c_AjGcg-9poeeva?UJrDoS@mtji0G?fDr-yp--NHi9sW)w*sQSW*3X9G{jlUTCh!PHNPA{KVLZA2D6Z;7{2{b(mF3AF20Xjci(oyi= z+2iYKMf~up##c1{VI(OzW6(w#_6?6Nb+-~=OZ zGAbn`!mr&rTjgy4wh$oEghbyC>Z;yqa!Zo>I@c#4%FF(pW}$WeSNU*Dl|M*V_RlH= zq%us3f{7dh=Vem7KlKP(07iP?xe=nm!I%Y*5aFd-o=-p83#sK?IZ8DeS}jHMr%?g$ zV*PSn@$+k4zLo%xx83ayngz6Wt3I}lAW>f6w)FOB=aUlZGWIDd90IvgkAnyNw#%oX zfqsf^g-_5LpZNxTh$D*v%Oy=f+*`VJHse9U#gV;$6Kz-UtOB0T2JpfPubllM{E~zZ zmycIB{58=FMY=S*K2VCp7hOTacN^A1w;+`{iTp^P*G3cyKgleKdv54bre7~9vTA?u zi3>-6YjrAc&UfSu-n{up+r;w6hSxOYeKjeM)t@3lG{bZFQe?O}()~OZo}WjS?CzU> z+%2+5?=r4_$TD5Yq)qL!Lq3#-KCi<^eW>k(0w~UzIUnX^Z9wD@_#)axz*{N zOvZXUyxzvSqL)ULSxVRM^c$(zR(Ts_G*A%D~P+@ ze46OsR*sCk4&+f-AR{9D?R1+oRIF?Ir#NP3n&>6VTvG|H+p@C z=eN*q&WTkH!eP(>%vIk$pN{6_>poH9uCoGG%HU1~?z>QxW=tX zZs>U!zq%*s+SL>xrG)O;&6I1Ff#l6jQ#WWc8|OPwA!pbbpxHruOmp9!kNQ#Vy$+^XT{R^Du~0IOfdj+f<4R~iO*9?Ef+X~`r!ZyC0;JHqeNe80|jYP!-KOT(8CU#vkUJZNZkB+*mUSa1eg}LtomI&tQ67MP#CfZh+JV{h|l>sVCf$Fm)V_9X9Gs zcIoL=Cj!W}vqr-(Y1Jyx^^{$bqRWR6PKfwYe`t@w6A z4XD{4;2k}vtq5sb4Ghgr)4uJZ5lN?vzLr%Ai`UlfS}^c7sow;g%;-iY5Wy7Cc-dtq z@?Xx2s2k3YUN#PY$0ueWWSzbsN5inkk~8W1C)c5#5eNQv$MQY3*|=SQ3X$8njpE<% zje0V62*!7>UotiT0e_7uVzyDpV`ky;J9xvXGEgrN=GwD5B1Gq@)bbQH)To~?3`97# zP934zIg$YwO!@&!NlS_Z&|dmKX%z%T*=zO{?jlddQTe5#iEOQWO*%B#ZLTB1!D}|w zZrwiz*Py4b45 zi@2;6hr3=1Y8bj-z!gtSZiBqwb+#TN)_XUKw9aa#F1xJB{%iNBXFSAF>S{fM{6^rw?2hryunT9vocS>pY91xsaU=x_gWer7 zxMA)vGcAfgvVwi0b^J@3niIVm)AW2zmTpUQEoeQhto|h;wT3`A8PQ{k;zD$`*1sDT zPkj|`s&H6J*qN3Ak`WV@0p_&3V2f>Qhr7aA)y$5iCm(r%sBj*QO5G!VShQzXXKFwqG0Yu(%UeD(+T7t?Cfqb&JoT;w zUlhQ@)g@~;UHC^GR8>2r2v1jXgA4g#=zv8-nF)q0RTvPIi-4L$K_?N0NYtVy%0pm% z4n!&R47jkV+>JGRTs0z?HNE>pbr+ZOACaVwx4xLE#1*oueJ@ubsSzSGPK4i%=;|k@ zD&i9=sZmge2Zc2^@QI_1J#`#3f-D=<7-AY5rs#bx5Lhkzyp`XvRov|+aQBthOO~-5weW$*k;W!cG z(*W3_B>gO*4G^p)4Hm{A2t;Ub$>Fbn^AOy@hM)ocr*r~Gn&sNhIKoKzm})Ba1m2c{l%SwZH}`JbgVEnTZ|K*g7{8S0@^o(rSnUU9Aq-Y9w%*Kp4YAuHpsw1iln%YQil^MfU2QRYL`|kLaUn~hW z_G;Z(NZF}FgY;;Lt+YMS{Ke+e%$?HXJYz$&v(YoL5X!G1_KVB_^XuvL#7LQ@bA9wK z$@4UwXAj{U-Ffj!^Ai%+C8qtNx{2m(Wcxw>Nb2C}qHAgRj(@IX^rF|cf%{P=7Ly9W@x2az?Vk{zNJY<8EJ)hAjIhe${ z%4SI{g}&#l8%(Rx2=pyNTjaboSszsA?xB|(tTLs6jEKPuZ<$zHfC+Vw&+GMFwodw5L1g=>GqZC8x!e#L(b@9@?o0mWu z;j2;nLz-KZCH*Si6TgbUbPCD;Jd9#HYeD#0*;sv6{~w#l1aGMM|QKOP(yfSdu^ zm|V>$-bz%;{CAN=hWB(HKRXa1MnX`Fo1qqtdv{fOif+|mWXSq3o-0|3#phSZ7@mbKMzK|vKi38X!w&P_2{aQhx410_D`Lt_c<7f+Vn z+{E8Z9Sl!@Z)F>HzQna~=Z&eMouI}8qp5gvqSab|GZL|;EaYmAwavN1g4LS+M@WC& zhImd-GF$lH?<$AurJFm8*ZWA8U@}=sH)C)Er>x$f4^MLU2?`B`!Xycnnj<%V`i9`Lhfe^H& zf;&WgXCu00*sdaT(2Xh8(x~!l#~vBxN^IN>?ni|U+HPC%#9?Okd9>#xq69XJhMh=H z&ZZf@zu^?>$1)GaLqVsiOGMBC7s3p*1}oo3K|8-Fw=@j!DBvUw}b3~^}s0g60dj%`K$M(>cNjFzT}0% z@TMe`%YtM|^LvWq-B_q>l8istuv)8kxXPf})B_F%Q({c?DuOkRkpWaSuLrf(n$$Lt zZbY6feob+!48b3#9G$3_K4*yP6ZMJB=ibLA3jg5IA|R#|%5+Q$m8>U~8j+e;)!4Q1c#! z93DmH%zcH89v#xz@kGpSe*GKTHz=uHSaartPr^q*N9m|2iG8dKm}W8ge&#NdW=k+) z=!e_~Y_p_`RGb%Cw6L^SA-UGn*|4>A$L$%1hENMJgQ#J?jBQaNx_1Jig4ukz^DoIqdbrQn1eP2brjA{pPfC_w8&qH+KY!{|^NhSa zNV8Lou+2b(rex^$V6vXpG(5R{A@uXB(@ctUY`n1auKkeYKIH>7e?)lr52lh|%ce-d z7|;z|0?lSeb798YdMr>#T`!yB8AZ?HCSm4GHf*Yl;=0HU{6G3`4kIfy;GW;5opR7( zO324hh~$dB+1kX$hZ6Cahl|yTl|fhvjQi8|t4#X)u{zo!YoM_}_E^bN(B!ttYU!d) z_J;@G?n6+LZmJFAh!R67`e#n$h9`Bhn}F1vUDqX>D>H#u z-wz(~!*?iFnPKD!qOOodHcOMv*2R+|9FBwGB4C-M_E*1BQ*~#5qpRqLc){a}2W65Ku;0+)a>#e9sdiTUhle9S#AP77tP7C-a(#*~!ahQyET^%&LVwPn<6`700K%!(HH zFctMz@M$JCXCSN(Llz%~35jso5_k*>OB)6GZinhV?sRjbn8-hd*6izY z2GhHfpI7Pz~98{FMh0x%C z4pAUzK^%h?3ufT9e$sDVgXqGY1SBn3HjQehiu*ooot-nt}EW{jf;pV0+_rQ2< zPsXeK$xpkikx`NnP<$H`?TKS>)~1U*U+A=$;@_XtIGO?bz)09TUrsk=87g~a?a4l)ifMxSHS+EDvo%pmZ_C>ILe=-3#5Mu!tnht2ts`YtJD=`K z2*3{OKH#OBw`rx|16dKl7d9a^krsiH?fK6IS7nXXf0X*NXv^1rEqdJTHc|TRg zZMST!%+#LV1xEM6_Ilmj$QXz+p)Gl$xCstp#}N@jX||nE`ElDaS%}KWa`2%*!ihC& z@?X;yu&I810R zjL;e*K;4uiI~u$|8a2o62V`Dc2j(I`nVd8Xbeo|FQe0kuZA$PkI=P{ zT`BY#Ch|y}Le{S=rPDfBDf_V@^Zr^2=}2qcld~92{4!#|X7p>A1!!_~VV8-=)Bz`b z0!(}orMuqLMSM?)^&;;aON?1V5&?>ywPMjIBB&owd|sIS*aEUZn)^OUVRqeW&bo8i zM@&oi1=qnPgc+4CE|A%b2PZg9@(G8N6TDbv0M(i*^oI{R>N4z=@$PT|H-?L=j-jFc z7ZLlNQ=TzGM%+Qy{u$nX@J6|;+d&co-ZqZY(3w$2d%tWwy!PWgi;Gj!uEQxMs?L)` zGc;OJ+F5~*WVI6D=X*@I;pJ+wozS50D3ZH&8jNc}8*Bf0vo%fF48O({L$QW?_$)jd zsA&$Qb|Qi&2F1B!;t*8_&&BXEVgW%Ms_b*9h9_lG=8^{-!QM=(t2(%WpPZt(ZgCp~ zvE^c!Mr?Pj7>1^?rS8EiXvTW+b<>jo&D=u>ft{xaE_W#l`X?pClU&%~klTj3{zGOe zc2scg z+BxN26E=5I*6(_PX{t}vIlgnO&$e>gC?9deeF$AWin%Nw3ciGKC%ke1usG0Gm1eI~ z?LLVUWuUR`SZ6s8do-%R*?BDU!GlZ{QL|`O7ABnXyTnq* zMkiwY8fX(JE!fge@_!J_)flEax8OO&UE*Ge-|%O&GD0o9koTtrKmT`B&p0Ksa;# z$HIngN(<<3$;?5BqLa5bj0?>$qZw;v*&kOQw57J~FEyHUEZx7&fk@FcfypP?oZ_I$ z@a0?{g+O^y3iwrdYS-7lnVD-KdU%|Nd;c{^tGm749ecJpC;nwNm=i z)O{RyA7&0$^-E0I3|gDgqh0U`ZEVR%ddxceIz_e2uvo@kx@{EU?Mh%E!CPy==V=lK zyC6om-t52NcdLRp(Ts7GTpB-;7()0k7^*Qm^S64%*VfTprYl|M_yTYr!6VyzvW2vV zidhP_9IN)gY9l`OH;jz$ujy(82O@<`JPr@<0KfJ zVzb|9&6CiA2(Bq(UI=Hv%`y*MyMwN#H0$7x?@C$mv8=p1k?FMY$TF6|;61-BdGM+h zu>IRbGhE%{6uDLhRFQ1KhetUuF9lk}Bb`3V0+$C04Y)pcwz&w03Q-8Q7aTU1LEnRN z`gye8XT>j5w^+cjJs_Vs$>K|;W~7ycN-6Oq|AhCMoIgdgmMPg{s^wvAs+3mTdpS*@ z$CV7Y6<;pwak3d1Qr+3a@z+5R3zcbPmen-rCRXGT-v0yG7&lCc9_x2P2A5 zo;qK^vVw8z^7N_+SQ3ZivHN*HQ6Gt-*YA0~sq1|c7OT@+oeJRhVO7!fSW)@Bl6R@w z^;5R3T-o}POY`o+K6lk-`@E8UYV&E)tz-hf^lJr3;mzbXazx8ata=tsRnc8@?V+N~ zY~49C`qZhusKtjm-HN}1{wyzWd%DjF9i1Cd-D2ykrw-uImC}zyeJrl3dlpWqVApNg zv|^*3EbZMr$NH93-{gw3KXLt9?8CdvfVA&TskNI61Anv>+Ih`3xqqYr%OM8oJ3Z0L>o!~*ge*N+J z3;*Ryq3$Mq>iMbdrpk7wx$XO7t@J`7`{&zb=9 zPwm1J+NnY&RV99Vbx5`+NZxZktsFNNbMq{dL1P1Qh|LeROS(reQz?l}SYPMbEf4#k>qN62|UK=95E z=?5MMR839ieX4)u3hTJsZx-5dRrR82%CQZ2b`4(u-KRZU{7m=|b~3vdLDBo|{LRge zcJD@7+DgB+DiDHAM~IhvHu`t+9{mLefWyPhV zTN(gKLye8(ZQ=lq#d?Jo%(CDnaky<~*RXKa$RfWL#G*3Uv#&Z6Y#o#d9;>~#7cimA z5Q?w&S8|&_GNK!nm%L2O0y((13;2eWT^$Dl#HI-B+Kj z=Tb9(m^)U09kK@5pjdXI`h2JsWIF+@qn`?*911y1FZpJwvmosYF7*Lq`Sysk)yo6Y z20+A3`z1v=&1~FehlSzBf{ibvqJ5kFNTG(TYx{3=+lZ`c;9@w!8<>rTs!OZ8u>+2W#`$JtCAav6Gae^(R;?M-gt zUMCdB$pJ)|skVX!^A?wassd>~?96}@+gW~roY6cMl;;Zkx_J4-sQ|hEqwOZ#NXvF0 zRwW9qOP z$lxf`>%nE-YH}TiNJ--;o_v!^x8R6-|5DYNAr-$lG$NYj_3EW;Cfp?0jc}SJ!k#A5 z^ufTn%;OIhoDw$ccd*qKu(j6l!=J_E{lEaSQH6q#gu!h9sN*6oP#D!#VNII3#Ej-Z zGf6lGES1z8PPC?sC#{ttr}0&-2o(R>Ol%#R9DbZMJ?K*V4&~SBcQT+9k110_{EP{_ zD|kD3S*@krAZ(+$LAGKNxOS>-JR_=2fl|di1PGW@`FIf8(!(N3@DaA$VjX7YMTord z?q47@m-bDTsj0`8-dn4H@bC<&RKHLZQeo9UjKr>L5e$ibDt|ZSIyKo6geHfReA^Ux z@bVHbaScPcWrLO{q!ut0r-jDEYTT~V_y>TQe4qu`@W!S?`daXT=_E4G&VO(0Yr8T= zm*iq*4cIS7dMMskA54r?a9m8O;rBzr;S~Hh@*qQUh=L8tUWm7ufz0y=94ZsEwI7)? z<}8@vIOSPbxu_JzpZR+&Y%ReyTmM?A-OM1VjPk=#D#;-K2DmK-2!h{7*>jsLjG1K| z_8*b5x_VeNpzf)u;?MT$;sC5gj6R_Dw#c~dO;~Ug0c>^D{YeNwnO@SRTish~+0l(H zUCGw=Co*?&1OGN_$|aZgOPc2BWNa#cQd$`5-BJn$_SQ)J)*2HG$N6)@m>-F!RFy%* z%-^RV;n#JsiCZ4PEe!;uf#v+laG8{U4!;7xRjkNYVBi8q%-&DU66hdhtn-OVT+&EK@1KX_KZ6`&RhUxN= z$bsSv_Ry$DWrhR+_R>UR2I`$+qZ+u|f5+6W!XJgs08;^rGACP?M}8X1en~}+V(cR?hh=pg)Oyl@oy9s;YlP2q?Y&=q23q5JSz;{cH@_(_vt%_XHdE zBdjg9wegFw{XbVy9#`W8UD|WlhER`tFi}PmCb2C$3oA`j7h)LtT0uKm;bO3PSB{xV?t18;MTH)_4IAz(x51k|rkbISF zy)2hNXM&cFS&E}xI?aqZO2rNREa78@n`>r6 zK*nH{^JdRuOu%#fBQ2UMiuxANDaCK5_{D?jHg073(hen*vkN|^GOZ)tJ%+O9kP>Yf zB?$}~9beldF0?>XNCkbKt1rPJA0SGwo-^Cghlh0Za@=Xwm=1f8{S-sfXlriE8UrGT zoRl2yZNt;FO@RbyfRmzg5i{Zoo%-3Of;vsweaG!sgxw96f}KEpw6}1ue%nz+Kx8oa zJ*!KL2&lZAK8J|FX5b{QEKoBxVu~eEp_eJ$z6`j) zEQ%v&&V!#5pk6>NG`0dC$csIlTqhs(sQB7dK?VWX?!%&EuJ_QU9bQ`A(0Ege$KrF^ zn`|ESnJ^-RjhDcPOfgYrWV->&@e?op*&$>MutgH~k?983$6*Uy;C$=VT zc8TN4GmrktnBsUb84513fHah`3&`vzV(UQm!s?ACmKnf!>iNQu3X=Rb-*u02`EYCy zRLwhHM!N zn;O!2H-Szay?FL8sEy!x+ycbThrYuu9%MD)cQ2VHClDJ z=4O1jvV|4A@MLs^jz(JT4Cv=DiU?bgaENuRJw9cz>(kX1|8RsFS+Xt(4g4+t818}s zBU2!6c(gG>-?SPL`sQShPe!7{rC@k+Wo(U1DWYHnRPhx0oWEdq$W^Ey_UKUwr|kET z!s3ru4egEiwhdZV*V2@h(YY*Awf?;%XKr7lzSY~RwWCp=ujWOE=+-(*V3}h^wNE)z zV$nG2wGL@A>bE`=vJuC2_38#Y=1!)6)MGES-zCOt3wk(|M8aO{;2wMtta9AJ3rE98 z*io4UNdBG=ij4T;VT%-KralXd%eefj;nNmnuwds}0rLi8Iax>vT;;sbCi z$RO?p9WRybg;CH@^8ha&yeWhBG(mH$bugi0kbfn0DqvZQe3d`<+cKcAqFm5@BjMkP z!CoeFg~8b->{SIuz^v2l>~B2?@w6?d$$AVfRJ{@DRg!{g@BKuAjWl zbKD@op~1daiXL~1vQ^g`Lb1++paj0Z?1|7HfkQ!#ncfDTlq)0eT4e&8KlEZP(_|GuzS(6$V18IY0#Z<|Jdz3(@`t@}K=W*qvGi4&roo?>&b#^b z7sN6K30`l_C)QFr&xjW$#09vlSmYMAwy*wE+!T-3gKR+z#_zJ*Z;COv;=ckDYk+xv zb&0L29qgQoweMSaqku{AuhIPAlmOg{gE!%m1k98qf)>vjLK>{Mih!{vik>BtrYK{u z*1rlvX9oSKy!$>T?yJ2!AABLariex5o*$Z`O~;~gQ6(EZdydf+#h(2XCA6wGpH_9V z!tWbgSV^*m-+0P1_Y_8xoyobidDoGYC9kP7?({$jUBXz_rzs=m_|%6@&jJI<9;$Rz z06ElTWhefidkJ-Mj0m& z!A3xZg5-7;{e134fQcH+CmrZz;%F~n$^)xXi6h2kfuNlPTXZ3Di^5M zC+dROF=4STjkHu>e`ERw@ySGoj0by=siv)}apC|QF=J5tOp5Qm=p>RDFZLfuxR4B# z)F4J4rmOgxTINS&`^&S#4hDLqA^ru=8*86>=Eg+~IIf7hxzwvd0R%svxSTFYT+*^= zDo@PPp)3&gir`%t=?E@%w&{v%Ux1x3DjS-u(nG2P--6wgd{=!%OZ0bW*OY{&;XkEh z73BWCg9$8rYDu#ukM+akRhRvL*oUFsD}j-?AJg_5>*9x;Qq1ueiUM9ga9g?w{Dp#U zfjHM%VNymqw80HZ-m6VtYIgQaorgET)6{8;qKej2vZ^RQuk=lfG3RN|T*Q^w9HrAO zD>MS|Ss=_WP&FGF`Itf9L}#+`vtx`aC4bH?{n~OL z9WiDgEqmq9!s28CNRnpM zz{O3Oa~(5ae#NH8&1@zUp%KU0_%v+{M6L;{g?-3#W+y)#G~;R0qyXWR91DjrV`V9H zMd6dyuP*?zcr+-uWI3*RST`X-jnMcJ6go7fH>tMy5dUUO|D!?@He#Mdp~ak9Ow6gH z`3t}oZ!$l8s&v)t7rcy7=gRkfh=V`ckTr9*awZQHhO+qP}nwr$(CyLa2R-Fy0;n3p?orYh>WD(c~1t12_Ul)M3_Avd-G z#}cKRPQeV~jg+!bMd5In)Na7dn*F+`1>K`o$#}5eYIN+6B-<;bYFk4z;%-&Ky6VX6 zQL*E5@upg#<~fc2Ypo^tt;Fhm&eM9ZXr|S#3_L<%R{PBrm=3N0*Q1n1 z0MJ3!c`4i1fCI9qMhOz?*wG`^(GxDvRm-PbHONS58IVhkeTHYrTpdfIcX(1|;B*4B z@o%MT*`$Lus<=-#SQr>KWak~1NHgPXa(V!9OoR`e6;?I6U91!O@Zp4)ATRbx_IiV& zHXw*Kic1_39InGabiOZ{Ev2T4%ky5*C@dmD1>-Qf(ZoB2v+kg_*wK-u3me>R*(j!o z7A_1PIUif7b7_Q8yw3+{7KFXrS1h(3cBJq|@OyN<7Y0^fY;@&3#fXCbi&xubwq%~N zFBM3kyi}zi(k=FEAgX>np}!Kl-@&zAK9AU4jhTAUXA`#l>`-M+6lK4LZzks#w`54b zyAo!y@)`=(wzEX6?ErMswI)|)Yoy`m8_9qjomH-D0ZhWI497%_{n-!#n^%O&cD^r7 zg1jFDT*ry3P+>IrL`d6|Fmi9~=-^x?cHwxw7JI@tk>A}t)3E;QU)t7m!d9rH#(F_= z5ar>cP!6%`3|_L=E`Hje9!IXt@-@c*sh0p^in63mfW?!J#8o>A>7s@xVrYV z`^z0yRT;X=)6wu}nohgyuj%^5X1*b~+$ahjuAsv6T=jS6LM)D0#d%3*`LF~MV7*Z2 zt<|bP<&e*mfpagF895eq2am{%bW_qNab?ajeioC1xs+2z8%0fLzNI``HsxCnW!r^q zism-7h-*e}SJngVxm~B{r>*lR+GFr{jV=_p;#%0tya&is#}NnUdS(J{hbv!$oukMd zN~;nSk7Fg)mk*7)a#q8%AxW45=xM-hqO$ZNEac$x?G$_r#S9kPsfC zbwBAr@y9vU{AJYv?;prN%SOKc@H#db78%JFOmEgoh&T(hS5z1~#9_l+jxXwT^Et|i9Y2F;$KNz!?HaTRXn>vdgSu5JCB?KI6NU9U^o;J*&kDW~i28EH zeFE8JGV?Zqh`SMJAKX9j^T>BBlg$#d(i(_d9m$p1=b0wdSj(t8Tw4{fs!z@pBY7H3 zFvTDiaEZ*17SGbF%t6^v(q!0!Xn=t|TS+B;QKG)?Z`qFS_?Ht<)(Mwqz;X) zoEgIT^IC|z5bh=rGB!c)amOy(`5e1n44pS2dcxRxQf-IJ_M`17CeiKd%3bFXX)IA0 z&w+tBZhJd6t4K7FfIxi9e=pOu069lqD3Ym7MnnXy#zwj-hqwsupEfifL2Am0f^3b? ziJg+}ze|`~LJ>wHEhsP>LqBC1jhDhE>*xF6EA^-t`rhJlu8}B~6J6>v@wcNakcd=r ztjf-kCQ8%U6xrGFo~^*%Bu`{p7d%C?WG1UDwQ_Gd1<=zl0DIKKK++^C+O?b9mY_=8FcDSJY&IdQ}7lakTgmm;Zl!HCvIoqUMSM{cA{E-p! zK^Th7h%M^e7qrMnH$KF_IKVcicDT8KxgdJ_87pRGbs-#k*LT6FL5loL2vc(eR(;`MY!_m=Rzp8!9!+Y^*A>tL0 z-vJG7eRbPW-jFdf8tq8iXmY5vhrbdZ>b4fG0e;1ax~(PCH;r#bXOzvWG6}QL0WK{Bu>Wyh~A1KuN6*CBi@+L z=|EcOAy|l*t=QS{?J^ZX)UE}lgL*g$VV^4&?##!+(zb$`|+wPM2-YXcYguljG^)X)yY;H}ED!o(qsqBxjG&Of) z{T9l{vk;_8hK$?DlbUVqXor@R)4hKfm(Q%HT6su{1PIqvKXK%N0>bzF&X_A=VCTM1 zb21M>W+&{7JI_ae4^k405BLqD@xrhsj#}A;4d#eM(RFgA9Z2rYSE7MS&53Wg$9EF! z&x0L)dE-AR|LK@&`7RQ^9E{7P35DCbm5k}cjr!SIfujak8jEDgDMh zJ(KCcT8LH>ydjLN0vr@}^5fpC&4av-id!KWS(pULLrii6$|}-}m6w}cELkf(RHg3) zH76cfWdjwwl|mVwE^SZtJh^&vx8OpfYnpeSt3TEdU86l6HGR3-W&cMO4hduQU9VQa zCan7WnWR>Pb;ICfU;b8l+IX(@Eu`?} z)bxSIl2qmRev^5V54X|k9P2Izg|8VNR6U92UT7bH(bdH~%NwhSjVswUFg=?bavcnr zgz@(i#>AU*FCKL>wGFs!Ev3mYE^i~>Z0 zM9@(`u$~{pX+ufI%jpb|@veBuMqRUOBsrEnkg`e_OaTQHu!Oq{4b7-_CnV?;z z-ZHg{-Sw@_grQHFGf}JoQO>Kpxg8jjw6Bt@kE6>MAD!piwo2K~)26jItK*e0$0n;~ znFfT{Ky42jHs^KW2K~Kh#`2JQKe6BN2OE+41XZ$2t#J zPJ`c6-NBDCo6YXjNye za&jF}eu7i~;#Ml*I>FNUyi$FB*3s7Me2y~@c#ec9Dcs}l-FUIJ+ z8+F^(KB4?Rxh7l9(R^{82f98(NO+IAbnkwW8niap3EM9%<%=H8HQK@??419waKs5+ zsN#BnI=i9!ILf#4T^(0&p+$Z&c$GMV>5=fhGLSD{sIAXrE2b@jG>w1VMWml#rhTlV zQ)i9-X|6){;N^qFJRW~IC2NZ3c_r2*Ld-(Y?K^YCuA6`VZsO+1tGR%kmH3dEj`G)r z&d&3L%Fi>MD1-PoAL;V|M_;ye$OF?+GI_5!gc$RDx7(FySf?XiHxnd}ZKbVh!b?H< z_y4epIf<6~et-c0C}9Br2>)BFud|7xjfJg&wVt!NiH*r`hQCEs;eQD4zH4>(55{)6 z1c^u_80LUQ_n1Wv+RYoP{SY8*1;_@i#^NxmKcCwPi8PUpt-Q1Xb*_r0GtXIGUE z{L8OKy4(q0_S94&wvU=J;~(V@jel>*hG_tz&i_ zp#7-UJ-wOha?>#Mf{E>5o=EBTx?MY7xo-{nYOE3`FXDy3&YQT$GsO0sTwGYlI6({N zC3P*|#eY0fK@)cG@Qd%|QC%SK?zAQZWq5En>vAoD1M})O!}{_nA4=SbiwcNGnSjPz zx1TDOko#+^kNyFibyB>`#C)=gXyCMZF%A~mh592{$iCFeOyWdr`eS#jbbQzXTrwT3 zQTlnR))B~xuZM3A*$ToEx~m-3QXfHL@KqA0a8K4aB4s36b!_%tsl>>lv)iyRL2*yw zOf+_ntE9%r=C^F!k^*;5i=`UuU)9yHP-;nh{&B)U9I(Xj}uq6aUU?lDC zT&!iJJU?Yyn|eOPus{~+&B7URJxm`69<3Lkb%bbUrDFzWHej-7eo2bP1Or%DA2LiY zJs-TjXXmpA80Ck@vi zZbxt2J57TiUkH|SJ4UX($Y88z7Ol6qCi3QPL##f4|3q)!JI{m;cKD-O&RuaG_m%_8 z1MsL_c0Gr^KLq;zk+>{FiCci+&m2jKhx|Jq=i-fUW{gZlfeFNDR6k;K8$T350LsJ_N!kCSN|Q9!^a0K7T5ms4jz#op`f26%ohLwT|e)+FQK-4 zd2HFzKC7FSdT!cZmXbP3unNM(j#}GHU=1;@@mCvZTn*qCm2oIyCiRxb|*)XyDjS622umcn?ug z16>*A*)V=%1uW|mZ`^apo})x_;%exPNWhxjt<)gA7RGhuUQBe6EO3{C&~>DTn1Y(l?PK0;(@0v} zrQCUyUJamr<|%U@yVkT=qQsRXwm=|aedM*&F#J4-&`H-hq{u-{Y4v7SquVn=sh! zqJqm#SD!qmSG-8mV2`$*=J9_(|C{_VBw1a9MFs${(f|N}{@^J(N|^D7i$^=s7o(B)7P!Rj>#dO|0vvb}Y-xoAw#xr%J2iLeAAWqoU= zZJ>U)P}sNZ+zpwQZ4}yRJ{DfByhuLxSibxCbx~bXJ+ksm>~Vhn^2d8Wu5R=EUf}6; ze+)$9a#z~E4x0)qBcmkmw@;5dPxa^k3cY?z*3VDrqG~p>uiZ{&s&w>NS)6mU9O-_P zhaT4_o`OGF^i*V;n7#*ht18btA05?dch!yiZ&yI`$GW>MptYQodTH1!RZ?0;7rV=)S-s$#hk?l518S6TG zY22v35q@l~1zK!+sbm^X-5*a2X`(h@Ub?<-Q0uKEzY^^FD0fp@Xd6^S+U!y&?ooDa zQ$QCgsJfXzbsuXy)^}A~Z>+jA?(>>9b2vFD=zId%XBu~nyIR{fP|Gy7jW17V5RhdH zaNO3|{qydxr@!=p&P?fJYw76hFy5Q4Q20BlGqHFu$nyC99jxc|a%+9x%hk>4df&^H ztq)hxPoS?_<)m2ODO%F3$NXl`o{NuIfmXbxnl z3e>fAH7a^=y_b5uu_5CRF+JCc!Ss6-&N!tHXs`~9B^^&p;3>zQh1=<_1T=MC zrvjEu+lZp?u~w_g5xitm#Y7I@RKv*waw;1^;S4?KDS>elR(E)Yn5YVFSM-lV!7%mq9z#OM0tmWDaI5+YNow3E1jl3 zCBS1J@^1bgO7d#5UjHvMNN+2&+|9^uRo8{LkeSfQ`jFYHV^AE2yN|suKy)nl{Yk%h*D@vtttX zfN;#^J_EjasFM^xQ7i)Z6n<{4K{LnNSW^Y4)k?f2d zs$VbuY*I(fwFq_@HY%CJmYz3sD)z;9kS|rh08_FVB!IryB$?r@owumh&lDX#bquMe zAPiu4w_gRi_;mynvVwt*$f0b?6{4v<-`4k&#`Sp94sj9J^kvho<&Bk1zxR99?$*sI zZp}?2cJPNov8OnhgL)E5SHFvky`)?UA%-o}vHSo*^a`v)(?w;;tqO&D#;Gk_Ej)Z; zng>7qA%K+YeSALLyR=M&7l?aGD+u`AS|sN+w;yo7vTrpmRZ)=QvJo6|!~h1Py3JBf zfm(21nI9WzD9{kzbYGAQMKF?%#z;r_o?4ToQ5K(REQNVe7)Kk)fg_Rax!<4N4AB7! zg1-b}&y6XsRv1!D-&d-cYrn=QSO*Xt{0*xR>FE5vfoe=m$xim9^sNJ4|2(Y`3-sq% z4~GS~GhXj;Jc54YYciCDW_tOpF2Qd8=9sUQ+R%WEm_IBRD9i(!g~m-E^Au3?2?##| zaB@KBrpSSE4Wv6&kZW0D>I(BB2h`U)T?#_?k{>>7mRQ+MZD8W(rYu7)B6f!h!QOnK zEn2DF?*hk=zj#?cz$*}aCAY9K1eA``s#BGpn4$}b^|4U5DjRCo zaJ@OdL5iXFlv?s_@F5GkMqBNoki2-bp z5F7)nBHCABIVXvjM~UY$*oJ_sN=NG^9JSQ9aYnHS2q1vDM_nXu92~5GN4Ki;)qYdK zt00peQfLpFdk12U6Va50Hkg^c11?Wn%}JcudeRvHC0+8$fl$Ced1->ONIIP=U3e4w zIr?B=gs;#@$kyV$B(1>k`~*P90`&~UqXbmKlCVix;0EXM+5-96hiTY9sx8g(#qMgh zyRxZ>o=uL7kL{3LhZ2#OBW6rmO9QT!D_Hge0R^9Vk%7$`Oa@Rlp;%}1+1l8HyX?HPpvN2m<UNgJ6GgAIll?u3!G6`atL zo%Z?2iSSaBscXYWqhmnCoxU71_p{`Do$Rud%Mv<^NGj8orO}?Js-GID(bYzz=nl3% zbY38hEgT^}jtfy>G|5VE58~iVO!&2VPL0wyY$dSPy-~kA<=7;dtrk-YLCNolM51e& zvK~ll86b`neaKbSWI@T6naF-C(JyqUrNx9akX~r4Xy{Iv+*My*s@t=AoAbp5%F0g2 zl@>24y%CWwj=q*LX_CwZR+Q!F)~V!zws82`9bl3f$}oWxrR;evYMGO=A4=%X|6}qq zq3Q0jz^qhICvHaa<=}FFL9X8kQ zow$Lq;Z}$7tLFC@y8b!h+=4Lm6ELv_tjVmO1`94^nkFFobjNzHJNM>l_r}M_mkSM6 zQ1l;&CcD?mojXOpF1q>pX9!h870jtsQ(5hVZsRAXCr|<(VTY`3=I1e<3u6DfZCXg; zUMg1S>{AuDn!WK*Nd=w{MH^p6565sCx#z3+HDH)yRKIlEp97Bv2SWY4LP))K62h6t3^n$ru>VD|vNU9gj6yHo$8OSA1E@NWO9oV_xK5=m z1K~8IBD>m+^F~hV++4p?WS~a>s48oP0wbj0(#?q1A3nwku^uc;$B(M14$HO==Q}lG z*b$ASTY zzgFB1ASIOF*lF3W|BZ*&9D8dap+Dt7UeEws@~P0=C~NUnKL`!}taHdP+LRpBC#zZ5 zLbeILha7%3O%>_o9uh`kyY!I0^GfG96}4ADdCo%NNVB(+rdzGD5id4qt)XCWXb1Xr z#ctx@Ptm>btjkSYr-#7V>|T`WrZq58T}eO8%Y94XHrFgr&0LmbtpNv`IY zRPVCez~1@Ic~G@LqF2=p_-B!E34xP=ND)FVR;=7)jS>BIh|!}=y?%Qh)K^V?K*q?0 zclsS_8~cw5)CPrq^VOKx3W72B<#WWN*a_&SaCHa8btOK^bp_i=-JHGw); zM=n8f<3i~*Rid;oEGXnv<`^$5+v)s)nmQ;x@2U>$$RkXyvvY67zvNJ<`6mscYqL2cME*&MfF13cW)8WF~POe3>DO>w*7;IV37>(%v6~5kx5zbBuFB0{nxC% zw##=5MI>#_b#BdD3~mg<-aW5nOoyG=|B(VJCY+A zw_`Oc&lEZ5-4H2EweN+^ry$%I7vzslJAyMz^C*yMd zD8Gg|OkLmn7pmUFBQR^HSdE6mp)kTW4N+gz@Q`zlPZ`&ji$}Gxt989X&sNIM+)53+ zpN!TFHWqrJp|AOVWRCWUYUluvqCDt?Dbd+YN7u;(d z(yA2@$>Jh;Fgy|xK@gV(YdD*u)9r9Hq)E*se-}PksKX;sMXG9-y9$uyt5jQ!H(rNq zeZ7?-mMYv`569uKI=^euJ;DZ>C*~vi*uEV_nH48=ud9HLLfqUZ&*{+;bjj3gns!ZG z8dRF))a8Ak9~BfZ|42d(xUM9SP&gcHu^fboVKa}`GrO?6kO^4nb#<7+$NT!!9FMky zA}&nMuvmX-H0W00L`tr8X3paAJ2*>Y<#0IRHd;(_NTSQh)VTm=m;r|oknYXDL^;u1 zWeFE{zUm}4RA=!>oxVU`f||FyOZJSHrbe1#MPLrF$m$G`Y!B{40;-_X5S$BM&IQ$k zqtdjABAn=;3$S5(?fs235OqI`Fv5bUKen1CWTy|*fC5mLr7#y*ig}?n$QVBLDO5wU zo-j}*o=B&rkqcv2rAK?0#9a-SfSOlo*lf1|b$uQ7k~THTCxRmo5Js}uA0W${6_5uC zI8%oq%tnuTasON(^m;lPLq9$~>e1%K+c6r#BW<7-HIikp{NvO`ASy#AXY;{2tL*|V zlDap1SqQu@w{j-^ph{xM4_9w=5qT=gGAY~Pe)EjoKB0GqFW^0HxR;A-=gZ>f3<8og+5P(~uqDdIV3m_v7Q;Y)+T2ZBGzU zw^n`Nx;w`rJ%$-tMm~kTZY7bf-WNd=5`Z%) z5Fu+1hDWrLnZQBBP=5C$pu(88th?w)$!UZOX`_B7Bk~}~ePO~zcNi~-{EnS78@dom zN1YT+$RJsftQgg)40q$W__0%^z7SYtXG-B_+NX1Uj3}J5=}7wIu0r~6QkHNr3JJQB zU|fFzc6Z%SMCGiSrw;nb@1#{Idr9e6>C^G-cAcdgM^2ZrJ4#3$IUzqD#%6a7y}f~3 zYZo+dQkh$IQ8y`Gs6@v|b4xUmlZ;am?00JEzvuWK96BhK`CKX_mjp{*#fDuJ6_v|(rZ&hrhEko@{kK-@p7iagsnGsPWIJ{YDeW8TcKpt&)7OvM z(Mxmx`cKzrN+`VKG7pyc;VGC@E2*A94+&PNPQO<4QO)lNNl@sAEwiR%A zva1ev>c>$9o(%bUWJxdB(+h<58rAz2cnde^X_~tCH&dSJ%Qo-C$4y*kW>NKprX}e0 zE)9KZnrpI)f_0g`XHFkWAb>sbWSLcli&aE_r(8Dw9p?soB_C(U^70*TRs zBsGrg9f$0kQIfKPzUttX9U-@NHP7tbIf|8T$Sd2XGM~PrK6(``5R--Pdm#UEwN;$p zuweS4*u&JUp3n{9>IwsQdxudV(}S0dhYFoezi>|%gW~m71OVmy^dC=EE8Q;}`vErm z-vmni%%*Lde)|ba!>9cQl-M2#T<5(VJF`h=5kTlG?u-;?ZIs5ck%tK}%Ef=4TZdL{ zo#Ka*`nqYU0Qwyz<{RD8BVXc{cML?Ju=44R-X+dJU3NYR(1Q6`N14j(^5xFBOPz+G z$qbXp##<}&u?FK5qoGi!2ROcQStVmB(XprI?2TT%$0XW9i`ZF%nV=979h!DC1l}0~ zdKwy#JYUgz@09Y6^}{O6amNj!SHhXY2|E97rfn*cZ1P;XZdwvrHj05NszQArPswW@HNr^WAWr$?k4s!*~Am!@jd zFY>F>T%HBSX5>}0KXTveiLQQ5QerS0YY4<3vS0*r~f*St?i zgE74Gen#%ObDQwL4tHhBo|f>@FNUr+LE)xS9zkbLvle;5Fv@T8ela2FCD5VseBHzM zwY35dPU^+&_&`<*jvlqyK%IsLR#o0?P7&?l?OA8CXI9q=pOVVbUPevC$A&)_m+jyU z7zquR-YUPE{AbOy=ml>U(uBO@@GC?~*a`=#3?Ea%WiGBKZhe@{p#NuF$jkR~REhCt zDCwVJ)QtoHwU#0OU0#_Xe;|qku^Gz~F_uFxAm=f_ck=|9$*N8Zm3X7|L>I=UD(drU zayihLQuUm(Pr*Ij9%^8!k~hoDvkB>W1O|M4|9{`N|5!SP9{Q}f7WNV#=J|#)6Gh|o z*UPS43F!x2ryKE|ck8#`?|u%ijHWR8h}nMtcZ@S)VI*){>8!eFHTSb%GwmZkRH+8t zCya{cv}*2QV>)xi7-6^^V_+gE&w&se7Wn_A3cBPF3KnrMA*YP@MWR(~w_xaz-_Fxs zSk6$_SESLq2|MG6mtf^=T4$ZxM)q6a^Hp{2u3aH>J9#fz-ZV*g+9qfj2qM3X8G&QE z<`}T%9*lq|znKTFVt>;KAI_9C9G7NfrlKU^TN5cwe#2gE98<5~bmcNRWVPE&dFHwU z(HjvOuTV8)PzSR;0bkqgE5sc^)xUgQ;B~j4cRyy#>DPV$gVI?QT7L zvj{u#^3=rR`qC@h=el9UD@{T<`GYFAw)$CCA~pTlyFdnC#HST18EY6)lK zj(h`=NApnl!XQc2SL<0^p<^adQaZL>u9Kk(`;R};y7{SAS zt#4~T0fc;KHWNFT(*AjHQKW^Bbh~=f?n*o#^$R^WO^M*R19c?n(x~D5R?r|KjfFZW zFGO1*6rneQ9kCT$5WpjYl%BRU@4LgdDjuu1KvRD^{J6Gjk_+V$z(V+8`}-2Wo21U8 z=rb%b)yfwR+{UQxvWNHAC0FqUn$-hlorM6WaS#%I!kS%Uw4l3!e`ZD$EN59jvzI8* z+i{8&a&6K0YZ%nYbd@-U_WTLE7Bs2)kI&?77PwL$A@SmmU_(s8G`R%t+Yz!CLag^V zlh%UIX4o1SL;4|S3y$t~-4M1+at#lTVCI?hGOx+-)3=fA5dFuAL(e2jRL-{EZu z3BPa;V+E%{)VQY;Y}zW|xqCEI*Y%3j!o$m47k)EaPSf>~9h@?XSk%6Z6-3inZ?S)P zy#(%$Xtf7KsY3}<_yRw##Sh6T2GQ~Gh1X4x(gv6t}WOq%``Ef_y!v4pGAT+1`n3aa*tj z0ZsNBFQkGUkdOBU$$%bN_EntsZYa9P;Jdz?)fd=$5#Pi-d>*{IVkEB|$ip3{xuIza z(otfFLId}7LQ>t_G)P)Pfrzoq>v~Z8lIg26s*3?q49qiy7MX&83JV+6g8({nn6JdF zwWD@jLt66wDCY}6?6{1@sK@L^TemNK=<{!oXsl|j`ij5|$r>Jge&2a}VH~-15>0#b zwe(OuPs}L{?HW|8}EtCmv-}g|^rG`tda>haR_XAXKh&kSEx8lvbI|u7b zO~w%VRWPeOv$dPDpsvW0W0Q%!jEh;~UdP7myM{eGmh+Jdfe=Mwk|zw3mXD173ccwm zu8_gQOJ5OBGUg2r9Q;5sJC+2EzM!v_f@TFKqf33{pr<&_Nd;6?DxG;e7t81zv^e9E z*9Vh*5N7zk^w|BnIQUv7U<|N1aVDUiS~wPG2p6DOSpDw zi0l&`5{ia5$(czk?i5hrmvimmT<2If)4eb0F>CfDVD3A|O7d4Df~u%!-mJVb)_762 zQW_#5T8k|stV{L?c$0lcDm>Gl2QA+UTgD;PV7I%F3%lg29Q0gdZ|Oeg;Hci1(_bDH zI5heRQ-kc7UUf9|!r0?j(^Wvnt1RPe4*;3j3hHx8W04@92i_{Rzl`pqZuEHmm@a4d zvP2Bd8RZWz;K&*ron$3)ozg>!8-*0oF4S0V8Se!?SRx!siVy|_8V*-}27m|; zVnot<40V%(+vym=d<~4e9Aqn1HuwlE}y=iF$K8HVpb$-?uKva{^$71KA-d;-osF* zxyn6h!?^Fbc6vj7*W8`>-P`HL-Nw^osn_iq?tr+mQ#^K2qLFgQ8e%d@XT}SHtiDxn z4QBOLNeBlOoq{~d+FLkF(6m!YeOBHKWSHYqHS@DIGAB2ecyviR$M8$@OEtt zLQ9h9T5hHQU=_*tlDEcxR&N+>%-2F{o|ysycsb%ln9l>HDO2zc4k6kPZKJKmd|h0h za&UaQ(bLq!)*hF{qF0ao-F}Kf2D(b%`AEX+bR~@i>TluN_x@??VPe0_?=j#JV6$g_ zgEq;}rv=4LPB@=>!{%_7esv6@i1MzS`u$t?{#Vi3l@)RaPSW*`c@=JYLG;;jyN6uZfv}Y#L@%sbRfN#kVDNXto2led1CH`TNs| zMK=EH<99JnZ9aShH`;A+U*kd>ZWL|d4+5QJ`~RR08C0JqxpyN zUh;!ce%M<0a$Sl(USCY9)xWcF=Tv4ms=0@FoH;)!lzqS)Q_*&WqQKZYHez_Xht`Pv zA}m6i?}J6e&xo}`M}s1-?~Q``%68#7yPotB$-l3f5X1|tOo?7GVJT>;C%9)Z zHi1fpQj05@gJ&Ygg^_^or8BeDS&H;aLhzf!3;S4m47%-a<4)DEU^AG`(4h}1yco;& zt!=2Ds{uSYmJ#5=LF>9aCo?T*V0pFz9%kWIE7UUn#9_c%DnVTS2!5cHx;q-uo6!9U z_UFltOw*DH4DedhTjcVg2I_L;iFm%ZwCBnLPC}tSTasw~IT9G<-iYD{g2;ghIVXb5 zXeax8&&1Jh7eYuW1`rKMg1>OF6b`DT4patmw5^`O(~zaeY4QpbnRiQO_JNq0tBpeo zjqJVBlhvOhNCXOGw`1F0APd)}W~UF?RE3H&ITH&PsMij+(HU*VS-T6meesT&NgeRO ztI~=)X=pm=AYZ>^I>@+`;Z~ihS_wqu z#Pp}uikB{2CYA1y1k=hO8Ur2GlmP@7b9k%gO6m`oBxTfeO;FpHYi=)D!^90DOhE7% zPaSf0bd$^P+Tps>f=#&?JVB~w%D+w4tvhO6Kw~juTaG%Y=_T4NZ?2ole`A0Um4P@p zW7fW1;fhP=AeFdg9`BlazLpxDJ>mC1%bZ-we zMR54}MoZSkxhR#6*V4F9ax~47;2bfnwf`2qZIL*12eLF~+Lr`iDA|BsaQe_gmWYBF|*tOz}y zYB0-D$&^4Zmi;12wwl!Owt+FP^6des31{gw!cfFLU7`Em*Es|gbW)IuhA#EI;&5g= z-E7!VoeCR*1xKpfEYeuDXj(Ov^^Id5h^tV2 zRa75nHq}_!UgRB?X!?GxFAiro`}F>KIQig}c2ZnNdwEKH+xVEj88(npn!;4Ob)QUu z?xBb*pmL&kxtcRo+a?KYFUV$d>G9<0~>{7`7IC#ii* zxF0%$mKjC58dbyna2MwbrcWT%=D!RCZG?W4R5@fM>Z{Zz3~0dz7uemV9L?&0r49zr z4c_p(CUJoWZ#mFV564NW6zS}SB>3N6v0C+Tg;p$@2};6b~AV|aF!j;OQIVz2>K81wqHPlquOhpV$38SDC<>Ef}9?p=IWopOpv?N>bJ(p3ME+ z3rg6h!~+?Y4GH@2|LIu&yg8ogf^FP8G0te5pVRlZ&U{Ypeu(IxaC+{;qkLzmcqx0z8NUXEW4AsW z#dODzpNm`?X}$aVn9$>NsP6L`bZR{VEl@Nv#j;J`lxv=QT$J{k6i8D4eGK-?*uZ;B z-e}&B3ND3=O&`zV@)Wg=o`MS*z`X~IJM97%B^Ns<*}s~D{MQpZ{9v)jEgu;rx08fGg#Kd>7Q+dA#yL*F?X)xmWO*55 z#@S*=|7x|%*Ba)w9T2mHy|<}>m&KQdLVruRor!YHNeTMGul#g7yG^dRFouuoSA^F6 z2`;;}w6<`1KMCl4wPo>YnyRToMjks+;W?xg^$ZK;Y@s|?P?MQ5g8!D9%)#&U4XsBO za3nQj!HBG)!Wq%E0x58zXlE)5FzZ^m2LUnK3dW|RB~>r8cVL*Fw^&qz6BD}SSc-~< zG5ZVbq!HSg`;}K*Wg7oz_7K58BAqG^r9`hoY9mT#WpX7w7n-m?ffv^*tKSmHW_BC^ z8U3lfwIFsL$#{X%6C}23h|CiPBpdZl>JD0fusDf%ZlZ>K&gu(3?Q{WY58RyDt8zW@ z2La`R=?CzdV;#5Hw@nn>F@PlyCwgVL~#0zB1ln9 z&Z*2xNytc1&rn3r(N;`L(5Q}2(~SQXq1!vSIKezaM!>^GJUPIgNCH#QOo-3Ogj7HP zI<&X9=To9s6A)sSbFy^&KO^|;@9e4K?|qA%0040QtEbt~z{teVz{u+N39fl`;;_dY zZa=9;r@&_ws}L|M)VZJoQAs^0guBk}i!J(>dW1+a-l zzvAP-`#^%PLB`SI|0Vuyen{?%ue`X8%jhZ+CrRLrsK`0L_|H*!anb9dWLHG3^{TU5 zPaQRRU2EG(uGjipdaFLVONM;!qoit`QWu-?CExb2W}D=8*||RX>bfht8s0PB<=rx| znc9NX^T8aqO0xL}yWZ*nMeC#r8PYY=PPWmOLh_X>W-qAojO~iRJ5vnagvDE>-o%AC z;7|f&ZpMQaS+vRI5Czj>o^V5W?cX!jpMCTam=f&S=vB{DoANPez zBOts$uTKx~%bPLF-q7`!b^^DlvOLSUjc=o|(kcm-%P8hzR$*>~wa5;bCdCt zGm|#83WCEa)5nF}?)F>1XCmnpU&vv*v9<>~=_Sh#C1_B;O?k?{|L%HSp1vVBAUXQ8 zdjmdi+X?$1-RyNa1Oz-ie`j|bhR!(Z6)64&*A}C^K{o$YShw+Ik1Euu@bV;rxInVr zt)=~QAwN~b!yY(U#Z!V&|KxnG{@0?Se-pfANoa$^6WVR50$Sv}ARIe2m;K!ynf}Tf z)a>pwTOF-!?1gg0-E+Doc!X3o%CLqd|oVcR4Da&J);9^lfabw6e{&{QO0rKrkl z>wOB^3L@!-S$Oj^h%`tx6Ym}90D8XZ54qG7MpDU)D0xDBb{cNYFWT}Dt1(DWi#snJ z{mshSeE!m&D$dUdu!iiJcpCT4x0$3L34jVLI7Gx;-gM>e9WtYyEH2Z< z$BmhC(nrT#B}1*-5lWZoG%4VGvaUDML829GG%bh-v{VQ9c;H1PE4^M@ka7^=Zdv`v*=4GqPw`c?Iz=cfM5{-PWH90iCL9!)Mdx(W?Tt)_ zVSx^6nA74f@NtpVIqO+57)^*HFeF5U?2bSmJff$?5>#sm1Y+f5oSdvV-Og@B+QXEX z>&}T+IO5!p?n6w68nvgaw58mU#yL3d2DB+AAW=x6(@5vfW#PXlu(pqqDwfOP%-G`k zDfCFKXO_UM-Z`KXip=p_OQJuLeu??1TmHCF&Ny_5u0*)9spO#SKnZD6;d~GnLURSq zBHke#YAfPKdgK@}b_>wTBQHB*6)1_pMRga|sUnCiAhyC~>%3k|4x5U(zkhe~D{eNSje9cUsfUvkQgu zF@G!+%%vfd@DO4qGN4`s-`8Q#jCW(BSaJ4gdX{+8PJ_j0Vx#eN(ZLSf6sRf3n)`50Z zE9ss8GROZ3RF8g>XfvpMtTD2xcQ3!;TLNjMru@LO5~nArem@4qf)lg(e+K5cEA%oJ zr*=ro^)iN}!nJ08#?l*LZ!VB8K*Xk>=fUYR{zQAs<-_%h>7}FW4&_2!d1FU^8p#o;hqdPJg zjT>Ll@o2W=!TP#s4bEVP79C7`It?Ke)HnPCcCLW66?Cf8EMBFrq%-w9EGnBzrloT7 z(26Ig2~#M#R+pPowFXETg=D40mb4U{SmoUmJh-a+3m%jN0xNE9`L60VB1bSFQmy!u zifV}t!8Q6>+RgfeO&m)ff{CI1_fJ7vr^)_X5c^n*CVbOvJkuG64~`oX2k)MV1ijIuP~P- z_h})slVljVn^P5dxqILSXaOrJ!0&W^yMcb%D}`ttE!BO#qwEhHp8Z}JPpArs$WYBh zH7N#d!N#CQ;(j@Osn$N`5ons1|6!^i{k1j7IBo1#M>5F_IG^C!0P&Io$9}Djw{8pC zw)N0sxN)CSKdAk)o&T__j7Etb2G<8%uVxyi=|guG=&6`r)myhY*J!=Y{P+HGP^m_P zS%7P(JjlnKn~QPFDn4lb{;$znA)K9vstSslQvJN5u99dgQ8SwCigPcdB82fCBei2( zg;ic~xh}ssVti&{UhlgU3w?nsT-BqnXRKwzU~W6& zbTI<1E(a$gHw#PdrWiH^kBRH7?>A*naBxfupi#wlpy`Q1gO>(Y+bIRP9gAle?;vd% z)hG+rngXK&R0(uCYDg^J0DM+5328{K^u!ScjK`N}3x6jp%&VgHCz230qQIVb)Um76Oj#w= z5|`{t8{c7A&?|)o$Dodz_jr563OI+LnAE;;R|e<4Dc&)$HJ(%@U=Z#q?w2q zy-vY#LFVY**L`i#c3-Zpk4bocI+20{W&KPUPP6uin&V3u3>&+3b?E2DSMNwh))8RK zNU`r@By=-cemj<6VN61)_X|toQ%?nx&-2E2#aEPIt;)wVf|AOcKG+uvwH1?W{;or% z!~`@QD)y0&6(+nAK*g?P*qqP9>D^2vjf~$&QW6=~{Me&OEyoLb#HZK*FP`k~UXdc% z22%RFN1A0Im~+)Gv{WxW{~Qx%IjQdU927o})gfJpuM~g#_-C^xwNmG7!Hrr%N1vr2 zO10&$e^0EAoVRCb_iOqT@ zm1h+wEw*RAS-RQgw(W-bO(>RL|Ke`z@Y&|}>J{ndz#H5hv`Y5b4Xg@_iO;<$nof$*od%Ati{1GQ z>5>mhcw4N0hTBwYRo&q?(+V2NQ}ID70@s0DJi?$y1I0$7{~Jy|HSl~+pR{CsF#f%i z0egpcJv9btuy6rX2Op?!1Ts&i_Zwb&PDje(v~(!?$r96S!@HuWH<7!v-9-3BzdLe! zpEAGB4at(N^i1U?5#6rsllBQ9HJ4qeh$lU^W&|SFs=38%s8AtB$%WEyE`*R0$x2!Hr@U>;Ige-47VHVD zOO)~}^=t~oc8EX2D6%|_w=UU7RifT(lRQ{yW_y1E^ozWJt}C~|0?5TS3aYQ%m60tK zOyD>__%NyP(f$HO+O}3@)Bi-CMEGtj^8BzgZ?%ka4G^iRIdbZt!MRX~z2N`OZqFaK z1X&06z_-C7<~v7yV0dNgK(vVz(uEY#_osHkmhE_Njt=t@b>E-Z8Xi9BpdM8l8}I*2 zt40l|&T%!A>{($^K%d;s#>(>x`UulX^Sl~G+oD0b?^4@Hm-+~K9j=^UNZPJ6S0M-L zDWKx&9LjmAp?$08i`|dZ{a%`o&!%`)KA^B2=u1zBzCBzXQjo3GGr1qm)M%gz44egU zga^+l;*AvE#>AIm%>)oXptbjE5U3Cnt2?DWsXk4`R_{N7kE-84JTBcYBt4y%73!Ai zO^KZ9Wb|>5aQ<1te!*3VVOeqj|D?PgriNtbF`XWw9rTraf-A?@<32fGybxzhv__L; zc@(&y5$_6FmjmtF{A%G6_=h>Hn6)0JJPffkG%E++J^!Z5X>~cplsKIFFkJ7F+-FWI zAIY&W+LKU7HmPwM;p=r1&@>Qtqu?t@yL&oh1hM1#s{3fx+-1;;{igGIU2UGP2QXK9 zjc!wWJN@XpEmqT4DuO+wUPu}vpfF*0y-|uM+z^jlRrUV}#-~WBM5BokhD6$FE^%F# z#*?4E^}Rpn{X}f`;O{akcWislD%>8%&e!6$Lg)96N^ifsw5C*^N}*(IdSMp*YqoB| zOO`?y^qb$|m7Z~bJoYUnom6IgdYKwDOaeLdOpmWGXxnU=Yl3jN1rcGCX!xa6XUjV5 z1^3rOUpc)X=-Idmi=v-QD|}#r4z|RMHqKI`SfP;4{!hn$SBSZ8w~!$zkgcsamKA3Z z5|bP29~IAnHSt0!mJ535yjoIWXeDsgTpi$B|~L?4^tudFmhW zA%FyE1(XtVFtgo9_8&^-R@bMHBL7k^iLO}CvKQGaK5a~bkn9O}i@VV>1QIz@yxiJh zGO|LmEw>;if5&{f+TC3&7><<$j@JP@=RemwJ1>#hL{8zOExTPHH2HKm3N%M4U82G{ zP4Gy?zwE8ZS1iSHC+L zs@FB4&tNPu$hI$PpiY&#e9U=zwR-7!QvVQANXHeICmsk)dBLy49(%6rT9T3=BCe_%iFfIFa^5E2@MF2k7#j3G7%-= zDvIoI=LRM75v0BqZv%ZTP3Cu@a48IGbVc{iFkXxK9im-IdJS=H=y^3c$J9&EVd?k9 z8?5>R2TPUbyIsz($_vsgP!Vygu)am0m}aOnlgx(FGDBa8>H@{8KXa1g`qA(bG@Vlt z>9Ew9O6$=UoD-a?fx4=7?wO?<;xuC8C3Mk)bP$)LjiddsQsA=UNW%A1BiIsZis%dB z<}!*Nj$4Sa>sUQKrezdT2C?(S1O5g_iogN5#R z^iv4`+*@hI_@fXcb5%_$053*q&MOt~47dwJ3>BeDXwBR5Se=%uNwd`AO2TEJk_8(C(Q5_;9izl%aky2)Gz(wL(!JO$0n<3U;~l zs2@fTaKGUI~=%+OQ?kLzEgnhPOa#J4}jd(A!Gg2`^m&?ZuWgKyb7D2GaDya=1!M zW0181h-w>;+5(mel4SJ!2*OVuCx{m-DMZHYI#77Ff>x3?eMnE6r(!^AKi@uhyO7Vj z9B#T|G1D{WdtDoKI5`#_{Z!GE(=c5MMrfFAZrH3?FAvzUFi2>1ElNy2G7LbZvT#G} z=OZ;~*mVxA<_SObaFDdZE>V;z@|~=jwF!~<-g9V!AGs9JW+EJ7Z8mTo#3Ev5t8ZcH z2n}_WQDwn*g8^X@e@096aVV`S1@uG>=WugUz?Xnw;KOjSoMXH5c=U``l34^D5Pk`- zmNf-`Nunl*FF`{Qk}e!z3hV`Q@q566Ow=HqC0c-#L?=eJdbln;hMN68dM^ujhk42# z$@MP_IE?P)sk;tKN^Gb*mclen@sCC+?MV+9N`ei1>v1w-`p6V{D= zBXjpidwvpUn{ab$G^+coH2;Y6`Tbz*#L>vYJ1+-sCi${{Mz(hHu^cAoEe{V^TAG7) zTNJY~!NhSnsDVA&Sh4z5-w2-c^1av+V!N1Gm~FK>A&D3w7u9Az2fJ{2qln6=jJ$M1 zl)3QgY0e*S!Vet2=B|(=G|!&)wX+2Z*ND5jU^Z%X$aWuLnD`xq1_|jc8XAFyVsu)op}_dYiC`}Smj*W+{!x4>0gL5+%$C$lF>pk}V? zif@9D>Nf|9$h)8rkdTMik>hz|uVQTCU4Oj)f*WyKGwKEcbS)(*#PBv*mA1SC!MHZ= zv;<)q#*RUSnexCB&D})-kz(%CGaZMjj-nDFadd3QtTr6&pL#^zxGaM%KTR4-6|yw8 z9k_*W4a)Jb#Z`IKwRv4!#1DSy2~_uYZD~9*2g9?a_QJRz&TqQhxID!+!zkqlP9(hJ zN{I0fOgP_X#Ss`I5h4bAu*hL)9IEQk702;PM3}{rP0lL8dTPC##W0#z36`G%C`Ovh z^7POJVo??{u1gcWD~!b;B9}@aVL90?CA?l!ooHmt9$jPGhp2nFo0M0Bn!o=?Pif+3 zqc41kjg+VO=y;V!R(r{^z9aGMJbch@IjLraQMCAZ|8?y_x_>uW-ApM(sS?=F`a1I2%>>wIS5uaDx%q+|t6UJX3&avrEV~ zX$@#5xpzLZZ;D$-)_MsXp#{F2B68)=Wk%X$EcuCr-mnOtj*kSgke=SZMM3zSz~H@x zQ<+qxdt*S3Tzn1rDhGIyhxY#@xo3!lz}9*j)N@R6rxCDJDMm3CCDm z@bMh%p?Qx`pypBaw!vFpMa9}IV4-9wBh$zj6^?MEi+RsRDk8et!FfA|iI*^A^zws+ zjIBFvKAB?%(TO-^>{HjE$~;f!yWhw;MR`u*I@WTU*72HRu$IW^K5y!W=JWnY8y0}9@rA$}2 z`W_AEtSl4-$iYVFCBP)q~!T!PCLTmwZ=Nc^}L@lt;b-W zy#<;98{RTBjzsLQ6&wzZ@nr{kTrvCESYXY8t7G~aw`}Agv2%PWyeH zjgCNkn6#r2^V^P+W9C{DHwo(9IrZuO9ozRvHkBX!MHo~ni1_DZC`$1c<*DgS2>FA@ z5WB;}EY)o39vl#Aajnqo1oeC8bia!gV5}IXndXIh7Uc6L@cFOb_Xl&%|NA;W;Du4Z z>j$y_?RsM`;I;Wq;J4XgF5nrm|9ygx?{|#Q|Mhz8_x)Sot3Lk+9>Dv%VIc6kmH&I0 z|8u(*@C7Fma6fg{|Md{?yOogld#@1iR4?#7lkfwxfADEB=l}Bs8Bmm=r1E?nj<7Mm z*8r$@5bb<816_5yNvfa$UsBY|zfx&BzVWTE?6U#wz#j+yWV+*6n5i?W-~~yWf9A>V zp=vin?M>&PbOZNh1beyfFhHHQB4{cvYrjv?L*Jo(Jldr8XgOyco63F1AY8-!J#%@S!9I@511j4KU6>xMPmY8Xrbj}YPF(%qprg9v83N=ewBeQ5gq0DhN+VAS+8 z8s$`(TsHuWVpuZK(libHvs`VSELbnuB0+XPREMEYP*AY_6+MES>zv~WaL*!%;DE{RkvNwm6!Go(R4;D{FoPMQDk$`(Y-aE$m&`LP4!}0o!55yQFQPo z>3Yjv(-zI}kDfv~W}T-4{|rfCO3MFn{s;Ezm|bL!>7?*u5YYQ38A)g0IkEyHH5mOe z&Ug9t8=c}_E$XX(;+vL_@g^5Ah`~*wi4Ki0(_;0G;-%f!%6hw%sErkD zWDB}oMCP8*yPu7;4U~`F+%RDsW@m%^-$ortXNg6lq!$;-`VfK$cmITlBE9jeS=tDG zC8bklqhyK~-tC4rXshdZxynU0lQx~wOyl-4!2%meuPtHNibt+ zIZ2<95RtMHc+k#f<`{1KRlk_PZ1%0fc3l95UB@2-tsVU452(VHBA$lB;KD<}uyCh{ zaH|g~iN8P)v`w}t03*o!Mh>k>O#Bf(?E1dt?k)1-k@RTy?rFzIIks-o%{^G*N^*ua z^m#@Ny(S9ZuTcoSV0MbHRX9JCQr@JBf2%h}Xnw2-HZ^+e1Y)K0ZK!$uh(q7Gdy*o9 zE0O8+EzK(**o}12Kz-x*D0Jp>4w!v7A--r(HnFdbhBX$Ozo03ZeQ#Kft4;*X-Ls!b z`>Sxyqr`-zd>qDTfKaW;`qZ<=5wkU(#@$A+(*S6%S_XhPxJ;9zEm#6Ci*?pN))>w( zGO{V7iVl&0Pl&)oh-YQxX%>XP>2kLzCf~r5fhn`))Klk<68INam>%1V{)lFVOh-d_ zRaW-oTt^vaVO|LSEer1SQbKtoAz56NKx1%@W2F6Lh3In!xn;7}5BCMMmrI(QR1u4)9Dbr8UaeOuNm%G%+i)AY(7Gh`@{ zx7U*SY@YsTJaG5FNA>cMx>KR!#-sze>|y(5K`EC+(NQ}mFFA1BS<+693{~F?noc24vL5IP zvy|7sR5#kIR&Spn>(ej;1weURJUA9*rObmbqVl)aD%`%i$%NdPLP4E9j)3P?0sK@ zMUqQIcybFG@?!tdh*M%uFp>FgkAEmtVyyz&#(`GG+TcJtwJKL51(F%dyvCd+6p`cH zVB_j?%44NQDSvm&)Heh|%XL=DU^GSYbocE>9mscaKTD;;51?p!HtdR-mlyGHcW|vG z#(LBuewhQ}(9D@rtMqoy!MZvHPuG@jE6(@1bEYPCND&cqxHA!!)~L!5-^H6Qp#FId zl;$_$)K~97{T0oRD0ndht+@r~--TH3&|;b$8g1`yIT;~IM^i4nOxXISAVHVPRrFgQ z9iC~B+lhEPRfDn*?nd{DuxOedzJPSa^0=c>QBv{SX!xBwA?Fd?d+jc}s*OS(@Z=`a zZPA|Bmg?QG@smltxT5wdiXa!McLxnD#IMXbpuBbppgTds8fO;|$B}C4$|~cS7|kBG zoL)3cVGS`(KHUTsu+D_&ckgtAl32}Hek{CzY<*$@nO4WaX33cWV;E(XHAE(1))Gn# zHH-&nGra-@3T#sxfGFa8y~krZgR5{)iQR(V5q&fd4vlR0D}8}5+xx?MprKh1*?g0^+)O#-hW$I_jZY<$I2e~;tJz2THXNt1>9d!&#ap<`>&Lc zQ%l)+K-x}2dv=^AX+jm6Up2tG8NDftQ@VD*SBQSgdtmMQd_FAT$wU>tZ5jNNflk^B z*^xq;+en~)(;(sjoiXvWd`uyJ`~7R)&)b(X16#@u|8`>mHTfg9#M~)7VmZz=G{ab7 zkN{u6`Ap&TwsT(6vn zk1cK&|H6l~2#K5kTSE-PgYnD!V_IgUr+#o}6nen+$**;a>ADIZ2sl(Z&0K>R2NHIc zsP?anehLki1SMCyEA}S}yF%tv-&8c`$HX;@q1Xehq@5RB6W99lXsRfQY80O?f909{6orcg(I;5gG(gKjw+x(CUau z6%Cj+p99$Q3)@6XghV*&UBH5yDCxjXdY31z(#C2vjt6hk*rm-%S2bg=166XQ3%L-g zIhLaklyw;Nr_=j>{eZ&7?Aou{=&ie_7qQ{V5{A#~|2Rey`Ys_I(Sd;A6@h?={zo#( z)y&?=#LCr+(ZImU-pbX$;JlARiMr7f|dbo>{Ub^kww(Q?f<@=u0YH~x6WO)4d<1} zdWF7^oj+escZUkuyeeUyq%jF6r{`i&PY#E?bJne>ztk}bX5Ifh4g-G6g9gG->Q&XI zT43+XoAm8U-t^VII_*4uA*kPKJsCX?KbiBZFVDdPzYSvwMc=rLB4SEF!*y4;gNf+vtFL37~8k(=%VI3YSIi&;Zy_O zheocRrmCMzh|&N7bk1sPMasYHrs#AoZK%%hEhWwnXs6D!lhWg6r3LlWNvn3LY+8*u zkzKm1I$G2K=DEwVN%L$9!<0g})hke-YExoy3ys4=Ycl;@Jw07Hps|RUtGm5#PkR2G z-hcpiFFz-L^4(s{`aQkA&W=7$4`>C4k&P3D!#T`!2MS@}Y(t!vhPp(5B4!bcDz3*X z>B_)Bu?eshn^f}{x-d8NsW@GlM!GvSHGuQ5wwi}l9Ih6qmkS`-!b6J`*ZP8vhM$`| z7<;M;IYust-7IshtZ;WDf2K;=8R5-N#J&9bZU@IAt<_Q%^&YjdG66%)i}IKbz3b?D z_OgNN2}p^dS6sfmW8At-u0d<1_$nXyCT zv@^r5sfR1vuTE9v226gv!mP~tuqfFLB6fWl(34>iiLIz0h&Uk&vNi&n_#QBBM3r+3 zR8YIU0trCxJ_~9R8;n4hyRs0XY|w(FqsB^>=DdqQ1OtC?`Ogh%*vanUg8EXN7ao}K zB(N3vI7)xGKw#Q8`tqe{l?X4=9e*Kyj4?btK9#Q3ac$}TD+f=>3jB&T0~mgVTaoiZ zf(Emo2-=I%Wv!AnU8?AI^J#_%Jflg!A)N=m!Rus@JR@=w{4gyBZPBX??o3&})RMO| zTg4ls4sM=gwn=skqxe%&3ah$1BY46G3GpAYD{x=7t#cVz&lJ&cG7oq%x<%O|5^4F1 zr9teS*AE?w;+zxe(gkCQ1tb=w-sSJv#26e{WADLd#~Q((h6@((tr~<4clgTkqjECF zE!`V%(A3694#Pk!Zn22@!9Z^Wejhz)??8V$?&n8Mi!d2;F}C4+J`rzA-}==~urajW zS>wFIUGR4%+=SgKG+M2hge7MLi9?i=4u*lJq&Q6rn?H;Lm|jA+^$QmJlF5|1>R~zQ zAgQ6_7$7H=80Ygz94d+ZrO}@?G_bs4=bL(T*Gz$7A}+D0@}k8sndUPHR3PTwsFjeZ z!CTN|JJdmBASgxf;X}M^bms(8g%h`}v<9166vo|?i|Dc2$NTsp9RHv-z$F6>9ZiUp z8;a-a83$Bi6X2rCrxErkvPLS$)4=a>cqIUY2EWg1PscC+&gut>zwN!r_UE|50W8)R zjbV2W2k4%fYXqV7{`LDF-FpJHg!>%-2=V{0e{t4t^dW3 z+5>=&ElJGBLzgK0;hp1*hUM_a8bltn8oTj_a;z8z%=+uxEoA0*7CQf&nV1h+vT~c0 zC#1_M1G+geM{Uq8^+m~v33A4mK<4%PWOnlnzTZIW3UmCx>N%X7d#UF%DLmuZTD<%; zsJ<3R7|mF2fd$QT7h2MUZBe#k&YG3AZ6^v9xGV(=lk?F=ReMm%Xijte^orapC3Q|r z$z5xl+ADGYXuvXQ^6oTB0#X9Q<;w6v%qmQpf0eIKD$sg~1pCKT`RiX2|D6T+<@fY* z{vOP%sG@o^R>ux<$A`F!+7ur(Whs@vo7aJL{$9~ksr6ymgr-{raOE!=H*+zd9a52K zu4@LRQ*v?_Qc0Hx9>|vETMu#Q`v~fy8VEgC620{T*LuKqV?N~YnxOXUG%xc?4!*{rQJBpN@Z`q2!YrWa2bt}S00E45C9X7wH9#ru_c zVJ#|MB&|d8F-f>?%q=J?CI%uMAcOwHBekzVe5absE0&NJS^h9yj;9R)z2@2L$8;zO z6L|8+xu_C+tr(e$i=>x7i!+{t(6S#yTC?+Kaf;1)G&B0abt@Cwg^vd$!S!=7iZ?4P;S{A zUu*mC9u*ne!k{N!oLfDV`l~Chp`EWva)Gwa?YJl zNEhd2{(6Top8aBe&^>9nfWCV$e4(RNkAUeq?cZ@RWLRZzX~gI3>L_Rck#%qs#VhpT zUg$Tp0!I^lpOBxS+2<=eo-5;%948H!$9#slazzK|IWiZ;L+iybwuE;Ie?Er0dfK}k zkx{s<`!|J-czX?#;p7G##Ub zk$9^D5n*BdNJJRj%|ioRNAEkXnejmZq3(WQ)$TX1#TT!Eu-C;=idh!{NhqNeQHy$g z8)!H%4?)!$iuS(sxP>+?V6wln5Pu4x7uptq9C$mD9l>fOxP+0iK^z^=^+9r8=#Xc_ zTNgYJ^B=7(5K_VM$J^gQwGP5%tO(^C@Qtp|<`rGtn9_(GZI+TXPrW1Vy;?>?9=wD% zooVi;1@CmAjn|B|iso&DXb%n+gNs|8HHFMicAN6F|I zjUd5E>4^Bcmd8cbOX2G_HX8n#nD-j^9ifPn{jTR_+pSh^BsAa_Ss4;T@KKZ!s>E14 z_58K>n1X4y+W@U=uiz8s-~kO<6PU~MJW|1TeXLyrcWM4zUIjL9D2IK8Hx4s|1 zx%4}4aYQ^^{`QM>OONpLb-WaoF{6rzSs;W2C368WC6y;2Xy!V~<>!sETox8ye77up zup-$+B1=k82k{~DEGFE6J`XaI@^g*72wE6?KbI0mM2k5p{@Yjnz){Su(XXdLE;>3h z`-tUtTVvnU;;w6d$f31q$UR}1FIep8Nmr6#k)k!QtqtAyTn5h^j(e(bU6{z|W^dKDb&hTC8%EOy*6sVto%t(u!>K0`q#}3B9n1=x zSr@zxq8%4DsV>+*%O^hENNt=UA4D6Sq{1w4JU^8#`#zOEPPw?Ym1-NT*B$_Hk<}H) z!cV4w{5pyXJR#Acl|>p#GekhX9~?C3yB-@d2cocT1GpM4NJ#IV!c5E1TS~O;Lcm^l zWew~pFZQ?y9oYK2}J z+JQa!lMI*qR$9>wyx9d{v0Z2P_)vcqX@Vl^*(epY8Sa-i%mxPyDvPT>1 z)q1uk?Kj)lWxTe}_kGt5ZUn(2gMN0f{R0`Z0(bpXqJ>Rs$P9{;`sJYxCpQi@~{TE_u zh4}y747IoE)0)#@+J}X^7BFauGMcs4xP5qmc%Lk}6JhQQ9^fMneI}ap1!e6az*9WhRY)U#KD2z}#MHCI z1IJ5c?{F7pQ7e9mP^;cdYA)pj%hzuXbYArXBTA~v1!MSy5<~t(-bpK#nI)BeLR`u^ zE8E_hR}~Eyz>8QE08o)+f_a=`CIBH^R6Em6qe7{@BRLr|GFO0gS|1VU^L8de{Pb)H zy0)b-Ppc+k%HnKCHV%-oB4esQHfz&?NgM|ChYhrmyp7Whfp9VMjTmCE6pCdIMB^yt zt(}2U4P&ML1F%dS6D9#>lJ?7Da32HjMZm2`yGLPvH>ThT`_nx(^IIu05*ddUg~fEC zYuMDd*XI|-4^hpN9uBKl8_1^dALpA9&2RUPb_M&Ir~3LXa2q|YkUxl5KFaXD58~q? zsg9P#)3Kyiw1y#=tmW{88-whl6g*U@-B#kh;UCs_`d4r5g0MYN@>>=udZNO-1M$sq z-Ep?BE^U_kgv5&@86leLdMD4k_T%+GLC|#~_>ABe^cVgKLCOcJ!RiJZ*(Ws0>^ZbB z%x1mur~&Lb%-m3S-<;}XEvB`@gXAPQ>pg5RFLjUF(aK|yYA>j1aM)|g`xILAjK~G_ z$-}P74+*olZSa4W23&&473F7)Zjx5gj&70Hm8^uvgNII)y!K>Ufcc)@iXf9HI}FH_ zp{MH9PH&9<<2}7?J^jPCs;XU7@~xiVkpiX3KG>=gL*Bkt+)(Nco#;M>(`8)4=`z$u zX^N}z3%Jt2-dD@bZ+10xmqZ(%I{mC|@;kw@`xhV!&eSSgy1h~`uGt7+N#P;hMF zM$XcqMV|}tPRrF1# zI7O&a?Ba6{Gw46d-AQMJM7eo&h^E*k3AZ>=aKth7#ZYf$IZG8HwvWOCXVf4U;2!EQZ^`shk59(Ig zzUc{3Gl9a;eA) zX;`_>gqR_jegfGFxSdE^)I@u25!bO)#-8M?sXS<5&K5aAE=>6hWwO4*unL*4#`(Ct zktx*?LZ~~YO$;IEz!;xx>|95NQnxd$(JM2UoF~;tYXdP7^@8Qr%V*R zp%MT106Pk{VZub9@9|;!?ubSb(zkIg)Oy|A*9#DzVxG2cLd@f}qX#XyhWyO;9hW5y zuIeL9??SFH?;E(Hq#N;*)HMII1>-?Cr2b-clXOzKQ}MAqZBbbk(FWRRl0Vu_RS16v zqM{H~=s>X`5-}l-4UjW)&vvW(ptYeaG!Q`cYi<0Mlf~Xa$oy-NEoHA{j=sP9q^4q?aJ2YcY<1nySLZCF*;lMiYV>>6*FXesS|=SuDVR zDb#?b^8LWtT6)Jw;8SvbftbZKO~t>cU`gUK6q6Ax@$>Kuzq%Q)HT*UMraAOAu5Tu0 z`IOgr8gu07_?C1!H&>^|Un2irfOB$rwoLg8(>l@L!SJq8BekoNu&u%^Iq7t44I$yT zGA_~@EYOakh3mmF>hheszw?oNR&sOF<95bP*t2odnZ8=zV~qFD12y1_&$m@!PwC2P z)y!@;%Wap@9F9x2>0NNHm;)-YP62;zBTnqD%Ap6E+Q3kD&fz_{CemR8b?B4z2O79( z_#eoVEyJbW!gvH}?ShM%sOYa|PH?uN!KsM7%h=3BZTd^)^p+%$KcNOUz2HXS4xD zHrTgn7Oc=P>SLoNH_ufn%cxU;`v-4ga+X{9_mTwB;L$IZhlPz+k5#o|+tkSHnL&}5 z!7T#9CN`9)wabRD`Lof56l@kpUZ-_s83&D?;OcvEA`EUk2kuu%!8-B zJYT-fx69+uJ=8OB=7XUMwsrLxxJL|&`?%@QTXe$#jvDf9U@W;W3?Lhh{m=E_GpZa}}T9((BfYJX@Dg`6B4hBQ~ zP)R8)-P_*kkc%w0cI`xnYSVAFGS|M+5*mrXR((Ij?Y^#JC1XDA`-ukO%9_P^wdHd% z!M|cmvFW}yo#-QS(CeF%TN>}lwTHG(@-y3Le>Ltl%Ljb+&L**}`?W&GwM+a${{J;v z@EL3Nv;R;6d;cwa{qJh6k&BnTiIu~DYHhE^mi>Q30lzg3xExIC#8g&#nB}k-?x^-F z_baqUj}S3Ks21L)PBlq-sS&3bf5HB0fmLF11JjKO2=FS%Op*wTSzW1oK_9t6t#u{3uL2aU763E|#;Ram z5=mENk_F6Hnu!AdPWDJV$B7C(n4BG^q7ozu_Rtuds4^s(mE&Sbauz!kCXCJ;6^003%Y2Z-6@decn7rsVJ)ETwBuTn=BKr&Ga>tz1T zCR~FoX(lCkmT{j#X_}saX&cX!o=^dn3CdLkS!YMYwvdf1JxbVNG&;i?8_k=5CT&JU zFKS#e{p>AV&o0tDNzcAy*rPfDiBl^&NM0kxGQ3Tj?wlv_KpLH?nj|!UVy|w~nfK={ zG20-MXz|kQU8d{-BThT%HNCXnEbN!Oh*aWTOsM=j+H50IH!{zooT}FGReWB!a2Tu0 zu;_ti3{m#I_IpLWVaHLl34KsiS+k3x$=bGSS3(Ib+0kKw%F#V|)R-+3EbojQyO{Sv z>$jfo=&p_ezUsbd$#RxDEZ7-$VZu8{7Fz7^`ZU>=B?U9t|$kEwjn zTMId2!C6@tmKcp->#M-)A<3@UT^s-5ugl{Wuae_(0J&?fzF|1LSq7(6f0k&#FnK{K zE9)^+m5qX1-ECt)oFdxw$)LqxJA_|tJocBtb+K#Q`5=6|tGK_L1;N_KQyM=GR=d#u zX3n&OzMvr9o)E-JKCSJNgry{J!<9(oYiTjmTyRan&2YWtrknVsEFQivF<%Rkp`WLp zv&h;+x@2LvWA|F6KKeYynL5=UiFGl^v*l*EWP*IjbGo6cZBeoRs}eVCgV>@A!v&Dq z4Oo74;r21MzG(zdqBb*w_%GR%2DFO_X}@aWF^hGkv|=~ip%HJ%)@+sv{#P$UQR4%g z^hfy%2SsC7-d^$Xx|-?rQR@b`!v`6)mDkp4V)0GtO$?8kcYBk z4!X{l%L9$tF-V|Se*fm(_AgvB#PyLWd?lTN;a2(q|NlS9(X6GPt^ei^L!f|w2>w?~ z%gxow_W$w*a@F+yn?6MI`&Zwg$OM4E+mMRk^PGa9pTO|QWf`7rB7s8F?n>TJERj}r zYAO2lOK(BbY34v%3L)1c$o07`PuSN@Z9RRT9K3it*74MUjz?k0_^PPdUD$18u8tl+ zUlOkU_4+!^@ZTMTuRf5DLUX%|B)anoUNnSBB|}|D7glWwwV#E(K>GRuZG;{0lvpwUz3zlo%@dP*|uaGX*sR zWw5Bz76WSDyPw*6V#=yrzefBdEK>TEv>rHp{{8&r%-+vS(MaG=3yuSdBcP_Mk}-v& zDW#3lMiv%aD`aKZDbC$IX{Bdl-#Hy&sA|3@OWIhntvQpPdP7#FCjM{>LZv1vj5K4! zjksTK$)AfDb!6Yw(bcC1&~tS`oxxa|;?ms%yuVxL649>MV~-*dW+Lj<54MLZg&XdB&Vaq?1Q&Y zdr#>r8r4f6q_!DaFY#}7kyYuJsR2_rTY3e}=PkHI4>sv1bX*iS7&35j~v|mNL{9}G%?}{!!X5D)M zQ1TNl(bz9}vL>Y}44LQYlfz9k6tllT@c}?pOC^x5@2v8^0@&76DF;~s4=5_LzA~Nd z3#HTG9JCTaSgPel_%5ruz+ z%zSWu&4?@A^X>QF8?<=@3co6i1HDTk(BTgIro5IkhASG!{p7Ix92t!Hh{%Y2VDL8a z?D82%GHJXc$>{3}X@AQohg`TFdtC^_4;t9SoBYqY;e+=vTkMBeMHAJ8m&fvH#48IQ zKqO>m?f^@%X;~a^uR0_t+NEm375|5?cVG@Jijsw6+sTb>+qP}nw(aD`zOilFwr$&d znR#Em`eq(Z)%gMERCVuOYp?D#A{J9b3K%pZ#`Y5%JISmrqirkyC+ypno=#pM8<&tI#h@UKO~8=FNvUGg9v7cucDxQe_6 zNXU}Q+!$aPGd z^Aqdo7wmtf1^XX-I`LmxNC5laGeG{=O}ByR?{3szR!CNsvD*+u=z36tF$YNjNOw)l z2XBJS9haTuBjh4~h}D4e@xZTF7=4;CWN`ksWTD$6rgw1Kb;lP171RwUSM0igma zBVaHoDx8HBBq}={hapB(+Jr$l77v^YyhH6VnQ_1`Mb<`8d3bmzwji8?jESC_QGs_n zS@~VN*`SwQw+i>IK;;Za{jDW6!5T*s9@#{^KMIv>-m8w#CKCJiPV*0y#JM-vwDBTD z)MSFBm@2Ln7R$K+=7$g5t|}z#o+12&4@3{m^Tk&*2X7U;+D07sYvbw_TIPUfQ`i+; z%Er{ud+oOE>lH9HE8FdfrxOS8A*%!Cr>aKHKM~0tL1~|!=Wrsx^fS;lDCG39V4t&2 zG!8*q+d0c-VAOR*PCoIGdqq=)`Xu5~E)Nq*C?HyMYQQGc6L0}j8OY?y{8uy=OKag$ z5yG+%K#UdQmrF8GjYh87@`7XPsl51e;XBGM^`fCun+rqa^vgXVFa2~UK zOnrX76@}3?O!uYUXzkul-_$daz)5zDnJP-D-3CGtQd6B@d9dEhMx{LVysu6%1({JO z6o0MIhrXVGux<=k?!Ri1n{%42y(h6JmT8f{MhWu(e|zT&kXwn#Q=oLNnP@c;aovn?{ZWJB z<7RIC10}cnXiM(r2ek)n-=bju(ujU*x+npMk=?#3(arLeUi1->IjxK6@?t}z&34ey zN0Pp}s%)7j`W!ko(oP#^Uh=}9;B|2HP9=CR$?cKx+|hT|v^3xe@&ou^At++RPm1^p zL9Aa0{$EdKLlaXw$N!jrPEPvIrNkpUPZV(DLe~5W^|q@)9jNx$c6Vs2Ay?E8zaHbF z#K~krmU|Qx^7k#bq(){*+;zxM(7!()J2%(l*}eVBRmnqtcc+Hn`3CTs5=!?ZPkUr= zvO3pUuhpSj(NxoqkDlYqK3|ZnMW9ziP0WLkQ#MCYng(Djr=q-!m8}wQ*bnugvN^35fRswS2Ud5HCre`vXBSgTl{%B=Y=pIhnsYV@nws0G*%KBEIa)P7% zlocH@!vBI$L(xHBkOYe!P1xY?%c%SEuw+7ecyD?Zmcd^g#pk12e-%$E zAfq<>%&%qjIsXWX>+oY?VGV<7Q5h`3}bSBR&fO%Y;= z`YE!yf|}-5g@O&-*F=QIk#^_mO3mAR1>!NC>05^@u}h3@Bf`WcG(su&Gi?c?y)`2G z#gv(NB^FI^H1{+<|9ZK*k3AEdkMeqhV{LHxNoG?ZdPdrs20~0kdTQS62k=A{{w$^1 z@^f%QM>t)@y{PZkAgkLwPedHNe2On%E}Sdvi#OZujn-hCL%jO$g-Y*Y`b96R)rdi(7{Z}vv4~4X!{DMgs5&(es|0Z+)Cz$k{tW8Ype<4-$ z|B2m|U$Kj83LH7_GJxCJ= zPI|-hlJzk}lvY|l*SV_h{pJ`P==AkM5Fw5`<`m_{y;^o z4tyeMTpC2g*tSa{8HA~v5Zh~uFiawKR?!i$i?nOretD3*)x>DVUmuB{dm%3UW#nyj ztyo#v^Y++uGAt^ctnlU0EbU3sg*Qh}Y2&UpE{a)<+1IxH4CCrQ`Xmk#YZ(|&szLL; zP%+MC$p@Oha+jKrp0b5yL7W_uP4&UW#4DoRNYoP^_CMqKftZX$>1*H9ox1?ok1o)E-dS8jbyK2QDBwXiGYD`r0>9CC>1Ij?~sfV;gflSN#nKTHhyMYe{PXv_xGz8WF`AA)gx zvC`qLy@Picwz#qbc=o~PzI~P_-I$!Bd#Yq?Zl>DLtAFn-?O)LK__g@KmLK3L6j!BO zyYg%;@nGh83UQoTan>uJ$L7kO-~5+PLQYMn)j@2x`M-;Y2?vlZcXO-s;&>tB&C`Kw6# zxJesyS8xKH1tZUo$-yDtplfq^MG_{@zcBXDE!E>(?~W$hLk5rf%GE{`}vF!q(tF_`ybb&UT$1#pi^ox*uAa*?FrGyjV6r z3AUM1I=H&L7&85kw3W%#luPCT@}v4|wK_XVKrGna5bvMY^qovQy@E)UM|YFG!}mMR z=bH_OWQ2XldTrr?59F&h6i_cqB78Y_UFBr6F};yy>G{!pCeynYw3OX>t#^B0?AdFGC5=(U%?(26CL6; zN#7tqN_?>zA!`gIZ{PJ|qLG+DVY3Cr(g-sTa}U~c9L}M)61}sj83Q&pSvzzDcHB8~#Hv16z(kQq zqs{$phtLy#d_)|cej2Pcl%FFge8q*0*Ywt81{MEjeAn8EJId{R{W1Yqv zg4MVRQuV-~=QwQF_^@MA5hAxZEtBu*Khh!DaHz`bfk#}MJ1d|LbBfE`p%ouB3s1(Z z+3}Zh1#q)Z(OZ_rWnpfLlf4jw`DXMAj4VW>!G_K7W_b9DNSWCJ2(JvT^0~t4L!G3g zrUW8=mO=sgikws1%t2Xv^UwqnTcM9iBaNTLJBU@{eaUzCLPRKdLw)(IC0WJ zp*1G${&0GC2<(KOGi154`5HM6coLh+yaDnN*$GtZMbc7?Sm(0wY@~4HpEHH{HPrv9 z8Wbepk2~O#^zI#ee-NNle;Gg~6;dl*L2I)f@jdx(r{^yY0Ddv?pU;0!g#2ICpuGpJ zvxmKjG4OwjlT=(>p)3E@u#|-Vk5ban#M#l~7gJXndcO@O1izOOc6RtWU^R;d19)7< zNtuQroxd=39r+MI$tmWURnp}ss4Ey?mt2>Bt`jd~-{~eI5{tG1hv6fnx4*9GZeo|= zu*>X=hOBLOch4GbzP}%8f=a+=c1^G$X!k%9Z&Wtd%M|*gP^XN*$fUt7HFmy_A-~_y zrq`fkm3N)C)&&yO`VScQc?XeFdnY+y1dsQ6oJ+ua9B?2>_If>_a0tyyw63mS!fO>7 zs1cMYfgJ`B1%>HR0l~k=4)OpA`jn#R5u`n_Q~D>X(ohBk!dobUGcZCIVa|j;S!osk znN;`M7!3UU{MxiRCn?X#c{bpY^38viZcksGoj*a6n+|JCdJ7lQq16j)#!xz{Gz2fapVE& z5ChRV8cgFBP4c<(V5@@@xO3=di5ejgk<1H^bC^9}Ppdqf9K3>Ge%CDkd`eYl2$8c6 zHLZ`yt}v;S$flqa;~Z?BE`x#k!JfCO6-S_xV9=>skWud7AzVQxVp|}!Tek3|r{>3) zxi;dbW8M?Mjb^XXx1$2D9-ZcTKCkJFXunTC2n6by|?`^w*_8#R{eI)>W?7 zb=>cPrIVnLbWV};A5|e?zA}s`BJuK3hKV80fcl%E@wKCxg1sxE=V+wlJ*@y8n-u)D zmp~dTt7Z_5V8S$n^`xX@qJX+nZQ|ulU$wOteVo@CaN9d4jm}6v6O3?Op(+V;PmX%4 z=t0u~rDDdrPjd3Cb@rT4z>6Wyc|hn~#^k8O$)6-W^Pwp%-7c1E^~Y4_mXC=K^+t2* zVxgTB$HG{KI+_Ydi)|Gv7;0-&288~Y)6qklrchm2lEdMec-C_yS?6Ybs zyLe;p%>i6?Kt&?$3t-!{C5Chjgnv8JdNkFj7xki%&QG0og;7G>1S|9b2ka!vQqs}h zY#Q6n@s^TAMm9zGaYB^wve%*hG^D)1+=_%qNJWBK(dheF_q59O&)-y@_lwimbIf&Z;t7bN5AXjeyXf zY=gJ+BJoHGL#cp3#XuazrBogdi zi!AhbVU_!M$S(uK%M_T?%G{dELmXtmED6C2o;W2J=N11wv^8BJSQ zREe*UJh@b25UmlmE%e=tlIg5O9CojSH+#@`{d;Q|SjivzwEdNM4M^$%FAX--C-;x_ zz1EK{RF{Oy2bZV!sz}wtLFbWd$(l5v5BYRbEXSS{xb(NM zutz6-lPqeb)EOfQdx|ab6_=L~%_-|YuBXX}zpgqYmp_wvPkt6KHm>4@Msu7hQSB>h zNfJHR09%x(mlK#AL1sf8l*MLufl>=;m`C2~9j`~f(b-HB#|xP@HZD?r=HMPvMrDV% zg>NZ{*Sj%*X4%IJ$0r!v;MJwf*#ii1N2BeqWda@c(6UY*59v)IF_w`^_ zIZ%Orcu+z9Y!1>>;br_A-LCq4g#WLy5yXBF9QpUI84d;j0Q>ixw70OQ({nYkHMVo4 z`(G!dle67_=*A^g1-pGw1mBk$3=TSZM6y&>pWN}XV0+jVjc#8LazQn7*t8ABbCm>Nk)MX&=@m{^`3x0gDVQ;r;5;q zNFu1t(|D(05fg@gU$0mk&rGXUs1S3{iD$lP=whxl$PIk! zGh=2UY1sLeI5wied}~MwSxhhEL+vMoV=_z*K{Wz0u!(!gGOZ;4l`Z!GubkeL#2`*m z)-*e;boLUoNmJ;S0Zx!4hwwtikQHn_mkCXTGw{ZhwX?k`zHMW}eGy&Q(+6rXI^Bt_ z4qMo}3eVx?w{wQ?ffHN7;ZKO@-*qxb289H_d<0#V59F!av0CQCA^VYw_A~Fo-BE-&l@C1n0i(nnGB>T(XzD5 zyC!0X2Qi@HE0V_TCxFU% z2KK|(E+6?LlDfK}B944bVjF0_$2CNeam&zE_TjQ;(iM0dbZzJ#4fax@LhB|xL#QvYg zT(#ZAMG_aMBfuNFv-aCgKzEh2P@T&0qiC~SQ;23SM>i%CaPnUd}Y7QD&5~Z*>q!!(U2CR{gz! zVMpk?P=iT|LLrxAO%>5;RUdKCGJ-Zkk;xdb@H~B)=*2y5s z<1`*@x#3r20K7JbTWEuJD|mCpm5;7j7&-|n0rke=;f*zoIx~iYkE8cZ+mb_H2*Zrw z?Kgi0@{=`t0mL5@wzzGQN8<}PR27u2)O8vp0w}WvI0G`uxlePCs5HhDB=yTh5(bA- z)~dE4VCj=0mz-|dq*t2Biig4pLy|P%S8M-ZRuRaCK2T$Y^5`5|!FR zI`{fuERFigZ111*T~41uNSiEZ&<=nnrKIS`j%ea#`UVvGp{^1zBkf^p=IArxu%D$s zgD%r4i&sOJvU4ayA40w#m`Q%md`#g|aKr=9BBNinhNerqpv~9-rAa@Lj?${x1`=`_ z@>C8$OV^`7X68A&_a|aJtO8!YD>LbNj>IM6B_dTa8Uc2I{&bfQ@_gNd>oph%wSbZa{t)QY z&rO8AwDBK78Jq{*j^!d#wnA;)GH3e_UKAHQnoA5Odd|(IS@Knc_{KL$RotI-t7ykB z_+iskXK~8VGKk)M?Dc;DSfc|iESol$XPxpUHIFV9g;ixk{jg60bU(E(S9n!V!JpG$ z_Al4R&tzrK%7QVZ{kC;tWIEzRmfy;r-G1|f!3X2Am9lk*Sbn0H>{>#LR=OjF^n7Hd zKHJ%U>+#aA!vkr{!>)l>l#)n?!d8Xp5=s6tW8PF~00ddj2cW zCCry9tA9Jv>UjST)!=4e;rt8nE{!S2KW&KJ4;1o`1clOYBpz45N|H1*6LncJSqX>a zw8@d6Z~{orF!a!qY5O_%a2^BP65U|OsaT4RmpZuCNaoD%FBhU0m|RO^!=p!(CL>{D zHQygMKiGJBh|UjHwm&nwwR4zJeadG^CaV4+ zjn)K2eS<#a2}u$|f;eP<4=GWsX%><@NX?M^hf1oMx(#ucF_o3YF{KDr2sJ@qhZ9hG2=zj?di6~uwJS$ETMxGP z;P~@>D=cp1($vv|qpg*fufq_JcI_-IitS|O1dsOif+kbj+t81z$DK(Z$h4njpO=A{ zFF46qkb%rg2XYQUKd+0Q6){hH6v4C1WH>dD=1I)}WzislzOM059Qy8f7imnrnA?R4 zJ_(8wN4r#J{FR!z8w-2U;f`vHSby`3IyzQ^Fj4ew zF^A4OTtvU#S&kuJ4rSj;5ujS8q`+PFJ0ye6Mpx*mz^=Zc;=31tnZmdbrU>yQLb6XBwzZ8lsC#7B2ysaIKhn*}#0f!ETp?!i=3 z?YZ1`I5{Rv>VWB}=bj0X-4&~PrVJy#Sq)y2bJ$n0GcHQcT+85=RbSN=F3MX5(fO)-~6Hi@;S8@4^SH}H|q84G^@%;|{GL%`JV?;s1$ z9q%KVzbqbf_!ExgmI7LP(@Gc|DL>pns^@z{9p){UyLV&!^j|^gb?M$Xt zet6$j9!-B|_sx@5wg})fv?_`=*2?RPI;+UWx2lxg$U%;e3avane&PfvR$Vd1urWzTyC2RWcQCRc0(39R?oVO(&P9p*Hl)bPR&bFy zpcUMlsr`f!v-sSJiA#1xGw#x(Pxm6#X$7W=>ofzZpQdQa6`*Z0o8b=)R!JDqW8oYoAOW9*I;V=JX`;YGT}O)DhehTX$R=! zo9Cv8vKRKlYSnJ4uI?jw@QyeYO26G+?7g4!-X{E-v;U2wbKKBn0IAgRB3Nj4V4n-=Q2?rGM~Si z+Lw9r+VTSKWd_Vda0SNT0b)G{fYC<2Y`bcAT>TyCQ{pc}TOnf!X$jByWL=HogB=&t zh)37+!{!gjT?5^V1gaj7g2x3ft-2G!d9n=U!hdF=Yxg(>XD*Mo^f8TQJ)jX?asmsr z0Pe$vfWCP77a9T2l-ClIj4G)6K2qi-*zqP4LkWa5+GbBQ)C97{DOMa|88idsQVLI& z7B!@8Xrh;L;*Ml#bFAo)QO29_vIw{$R_hvMCSVP`YXT<+z|ThT1gzDlP8G3SxIyTc zYHrk*oT(k9k6FtEq)Orq9rUxZ?(INi741dG!;zr(fca0eYroH^(=SeilF5<8Bo4U%zlxVjmXB;Zgo3h!@n}LR2oD ze{8bd>pg`Zt*nEF7hYP}`r3flMm2uTAtwinF6S*uClkJgLqpV--0Tm1h+V|3&vBK!FfI!~w~-Pb^2GYV?M^a;WC zfw2vEV2$R_^%;>l6Lns0-12ieozb0DT-4%fcZzlr1yhYVGY(NPOJ*|MV_j$i=bSnh zS!k?3M&2D=0dLhoxGOPGg zj)4q+S@bXy=EB%XJaQi+ZxlqA|iQNeQJBQ$&%q`P|C0Fn+#tcwqOx{ZXLq zSc_;h000a1|ATV=pMTWez|rYH#}kLR*Bm#*6K*~uEnfqSGYzHcyO^fbWk9rwOE8JX z;3BrqbRqzQ^c94mK~~wR%UIrDrY1S%LxRGZa!i70kV?lZ>hH@BP&?iqzgvPDdQTL_ z;fI}YP5KCT$NaP7$g0%#pTh7DOYYtoAZ=6Eg87VrUA^7C2T64Y2mHS>cD6tf<8s?T zn9VdMd3AjBJ(y1*A66}}O(f_i8rTg6Hi92e@qb$#QN+3oD>{c7Irb|ieU><6m=F2n z)1B1e1CC*ljmqiF3x@yys=$W_WU8 zX3L3DGbcUKv_mt=sc%wjQCn@Pchu^4^9S_LUA4y^Nj0Y2XHD&qC{Z1L_PL*lsfC|H z7+#p(aRT-O6$^K(JlWbgb;w{_--CH$oZpORAUe(dc@XLdb%Rm19w$={Efe1=mafj9 zskSYk2cCUF){sP)bQqs996@OQJof|M(`$Hb*fhCpZAJj@$8T;Hr$rOInbdDY4@hwG zpWG7qn*(CakNF-Dmit8j7FQ(rFvngLjwl3R&7!7A&7(vdr&V`rYo|8@OfRW>ORtMv z8QSe7J#ch2{wzT=z(If~q)zSa8*gS9Ney>H=5zpTi2k$m)5D2#B%drFtnn&AZb~i8~6h|(*e--2!pSN+?YgoNXn4SF`E`bHF{z_ zU3fn}+!n*#hwwniFp30Wb4zEp3!`1wKAeAYV&%OkDeVNsjV_{g#xTUX;$IV1E zZU#6R+F!fbQ`l=M~$Ei;|YM01ODUb5A2fKPU6DBrwfPX?6 z!^`R!LK{$Ibo`ev=9rG}F5}5EoLb*je=8;!av#Rh< zXA9J7js^ry{(P4Cpg9j2NFuN7f-ayLPP{Hm&TCvxd>(Z5p!*PiOb8B`$8`B8WK@;UmvD`j!b;^X3t`b_!@3lA>!1W#s({lB<4Ba1>XVqsISN z*uFkcb|Pa#ri%89WYa%_AFIj9;!fN;Tlrh7^3z1l9^SMM>WbvQO7u00IRVM2A^;&U zmxSaJxN~G^ZZ$)6f}rACd{pxGdiVv97WM#4;DPxC>HzqFES;`S0&}62VpSJLClLc? z&&r}Fw~HRK0^t^Wi@BFxY3=!Jn12CycTwJvU|VF+q4oWyWg-}0)Mhyl13}pk<4nMG z{avoI#+JSxq=H>M|54SV9k|yQR5B~*zLEaQvn^hRC@BvLX#}A|uoC|49*l@x=oAs9 z@FY-xHe5*{(12t*g-s*;p2(V6hDn$u zM3~M9@BL$$Y-UaX{V~odAiT*>f5}5AchA;z0j2c5cYp8`P1`89f*^pR{}7QzV*HN@ z&NPiL7ZZ-20hJRzf1sfRV-g=saAcvFMCz|m_0D=DfYGLga zr9L%kZYkKJ&EWH>T>!W+?>%6@&;a5J;+4>2Vj9vILz6Q>C*@c{sJ3$~ zu_BK=E7>TZa}O>ywv0`^f#;5bAqWkET zYyxkA(bCAxw^5l~5Y0-nTe3)itjd=zk}#BoRhq$ak!C7DDX_Ii(F+6{1NW5s5D8gQ zg^Z0acYG4@Q{DT?8$wJmvQWtYu1*??h$`dMGW-ewO#H8+MP%5bmQtRc{wiyFDWh^C zXrw7nxElU&l=pTYEsvyc$I~myYES``c778KRC*O4Nxlj~J$VEN{dsGk;IMyxEv6nA zzh-l=89r8t)-nr-T`+Z0*Fx>QCM13Bzlv%FcoRdY#oXm|FEN(vjIq+4WjKr@T}jXK zGgeH+lHogYXa|fjOVTI{2{6GmaTG>02e^LglrqvIFPu9eGM?v!k0BIdQ9=WGZ zwIhZuaZ-s9V|{&fP*3vTmMDlZ?7S?h2?3H~G+?#P6FF$$jinDf*=G_M`ZkoX>NAO@ z4&_~b9Ra|UNh~bK8rCb5Q)i(+;{sy1iLF(wX437&dl+|rz-dOiEnVdDn-`np(ZmyJ1D5Hs8u5?`iz*%oIJM7{GN7*H zQ=uzPz1i7l1dhE6n=~Os-XiGAp(5_h_KF6OmaYqljrrL$ySw@|p)mq*K4X}llg_v{ z%+>O91xj=@h2WL!xbPy_NC?O|locv8#)&?6a54!&cyx|#08>0*>AbCurE7KevaR=p z3;cZ!Icxb~|BIsq%qlfhY8r$5u*`6$oeD=gh72n!Dk`QCmR)*8Nh34}HXl1S#Gf31 zMW%^s;C~ZuYWnjg{#f}~2P2_`BBtNxu zMY?TMyF|gwO4H(YvG$fe1tJhXq28HEl?UmIWj*6G%skKPt8Ucd_ zt}g+zQNfi+UGGGsv&S_^SMrVq@^J4Nwn+9H)S6oWs)6#ml?}^r!N8W-ZJ>u#Z3x332E~2z219^ED=Hl(mqaYt_f7u)*GmNz6pD6yEW7d6xU+)m8c1gRpD_UyL&# zwQ!`tL&gH|(cYRPZ-Og%$;wy~VnjU)D4K=voKn|QPK)w&cL)duMUIfo{OH{0moEnA z4?T;rS%-Nkvu$rsm)E`{eQg|-h7dBotGTmeFin)a*Oh#!8o0@L$zzhr+4F&wWIVUJ zR;wpWtzJ;96$5D^Sv1Mx`L@dqgTiKw@~dobg8Jd8Ud*s zesb1fCJDTt8|wyR^C~JQuGA-M1ys&Y7r`i&bHOuQ8`Kx8(V~JOj#8v*izF;6qpxjB zwq|kC+~&+$ndo3YvB*2F-uq07dZAN%sJ_o?BOpwlsjLeOgw_9Or^c2`BAS z|4sjumK+sWHl2p;E|f-XALguwxaBvFC%g1qFaHg*7R=-c=0d@dL7QS zZd0g0o;6b9ss3AFc#N6(1{P^=#V|rv^pADDhq0vnPsY@??w=K2F<*=WPci`~>*+`v zl^uFdt~h-ryW;Z5-RYv=v~Vn`j$}(_Rcc?QJLIYSx-QK^*G7#?;j6~#^9NEfC8E%i zsz_@D<;r!|^T#MhtIx|W4pCc)Ro%(;^574&##<#wapQR-$*OM4@;2tw{E0seSWbCY zOqM6!;!t%QWa|R-Z zE!RhkOa_>dB&(qTa$Du5r(g>bsoW7{K4Y@X8swBgl>UL?h+!Wr9yqHl=ov#Yo5Yh|ZGRX2J$vCe# zNhzCxd{xU7WFaEdl<-EUlCTuwaK6G+O&bp8lZH_2rhdevMYwC%0=|ub$)cEOPBrPt&`kXs# zN5qbHJuOzkw(m82lC){K%-@IJ{Uy36NO>@^Kt$j)#^+ZXyCt0MGUh?nFAPs0T@6E> z1oP)#T+Z z7#mqi90)tTXiCm+vy>jrxvsm;7xvvK^8QVM=jt&Wc*~k=%L~&_u2FZz3%Z*@nwd?1 zB;!2G*+(cdSx@@;`!K2oZf0=YEwb<=YYkmU!~+AYbUl}FedEsfA+y6wL;^~%oWUe9 zWXQ7RgUBAw)MQO7reOoB{!GMW8*ZOTsz6b0lOt+suZd8tY+V9P(`blb(GOg#vQ+xI zf#p-t_rYjQV?{f9TQ;3`t=;|;>iE@+0Tw+=8Gf3iDRY~j%baWin_Y=HR!#}^r&^^l zFVvc!*1~hcAVq&)C=>e`%gjxnO+thXLQm8z|d-=!XyR%0w(ie~PdXsN6i*UYHa zbE7*qZ@%a6zu~TGElZ5w9#4zv(O05;IW-)asrzTE>-#7Obpu;4zNv;`CF8Pr<6S?y7Y zR7x*(u8HR~a8*lrNRPwavDpG`o(-QE5l4H{UFJLes-Hz+36#{%B=8RJh5^dN1YUR2 z&Zm4q=jQZNm|L5gke(}4u@>pwsHt9bcKnUJo{KUgrNC5zl&y*^Z8nlc&#%(z`by<3 z@_rQoK9&I5l@B(3_Zx$>5GPGJsozya!NxaqiE?#Khi$Z$0rcly5m@C9} ziZ$c%Dce++OIAmmMJb`r#-C^}fA?-V6|yQjXAx6>M!$6S7j=QEa94S*8HT(*j{$W> zg|gh|h_>3)jEfpKCI@^H0QnR7<%zu9_2fXhESN5%k-wZTb6C@7uk0c4(b^49v+zYW zL(L@RH|ti2c^iC0T#qLrcLyh8*NS~@wW|W8YAXc|AMFu|TOnN|G6O46Q`y>=4Vw#) z>=0;b8~=EynzUe3r?Wv};3zZ<16%}_`%16eRf5pw74|lOH*WR zk!F@;nzU?n7_)B-(rUVVHE#OKy3@AFNfZF^WA+_yai8;b{H*7;h+1!Z~QftZ?px9beSi~5ejv~_Y z%@Rwe*29J>8VTPTB+(QSSL5AAKdulT%vMcpPxKdE0PfEWZ!ksMuXm-!7W@kS;d?zfcpK_LQh>r7EK zy$YevhlFeZIpC5h@2*_hWqS2Xnp^W;ehLP&Hc$|6 zE_cf=+*=b~O|C)w@El+@N7#0|BXf=?R;q1Ma^UyKX*0b}JSb|SOlON5dXgt=RW+6l zTXh|jk#;oy2t(UWrPR{H8knjTXDWx?*MIX>xLhVO`2J3f`a%Ei%Z;4>XBYcF&Ammc zHvi#@_^#FyAlEBYMj|$|!ZN5%ErvtGw+I@fiS!7~7f-5EL4%E?G#q)m;p#q{S_?J! zj*lPdIM{mF#Bm9}w&U}4s(AoOMRl!F)UM~AV1S*QTAE}}7)kXApc^%ndN_)lxJfHHH;goN7LXKu7|B44oK8hKV9`Fr6cruA z5>ZfX$k-wu^*Dn>dP1(r%rYh!$tl z&>@YE&!6{&(iD@(s;tceL6MSa-a0%|tjJE)LJddngS5T0Gt%6f2ppXBe=OOa5AvhE z|GG6sdGB^3_2o%NoT|1hp4(z>|F@OLkYCL55;U~wHuLKs{p8YEB?#aAS5(4nj?0dzE9 z!psgYs2@>tk1Vep-4D+rT9PTA@@ogtb8;dU5HPMJ=4L@Ckw_THbai+;t;Yc!dG_(; z0U*I*AMj5{LC*f5fXCP^lBFfG64=`2cY?$1+jUo~>Ml{Vmo4d*63;Om{DYmK(1 z-PpEm+qP}ncGik*+qRvo*tTuk&dEM%|F;h=#^t=2Z+lyxV^)8vs$n0t+l9VTP4NzGz&MK9REyvHh`{`1*OH}Pi3Fr6)MC$=xlzWfM+nDpmvBX z3(CNS64Yt+p6-0s1{V}_=s}UtET1ccET2>!Lb4o5#&|>UGWB;AwON;I+*xMJl&~#4 zA{|wfSM~tF85?K|^b$8%@N{FK^1=$ODUL7PT~Z5-{v|jc*Ksel^agLwg#IVrKKJe=TE{% zRHK7m4g~9;9!+|Ar|fXy+PKql0+M@hb7}i*yIi0}W25ZGy4MGOT3@+OHGhg9Tui_{ zQ=i@u7Yyg&d@HDN!ec|~9-hc%{c1ZET8+rXCv3VIWj+k5TyV5>i8rpv$P!L-xJFx} zd;ZJL)p&zsKJ*Kve*d2The7iHm|6d^f&C{fh&Q^=YCr%+7~_<%EiH)6 zAPhcucc4T~C%(DK!gTc8o89)zb$c=sHLGJK_KDk@h+GF>%%qSy-)_(2bn6_w6{Rjd zExCmL;?7QcmB%(G|0T-bpl8!=aJ2ZF9IFqcLm3)6wrn>ak*#>bsGu$r#gR_D*;zdq zlSX_W(juk+jC&fDg%89RQbVw3(66TK0|$|(F^wHbuI3@54t5__?;HHYnF+Td)YQQ~ z4f>stXCLak1Mio)C>lKO{;yC5YD$3D|M2}-|L6H1od5s+?f)+uoU+=jEX}wat&+sV zq@=3E1icc31FQlAEAt`He?8H}Voqqt-_3C1@A-e=zD};rF2BA3C)5A2B94={24X}Q zx_Lv1eJrTcRlCZU_)CQb#fuW8Cn7Yf$!*F$H%75#zhiQS&k#z|nf`J-qG7!w*@jz3 ztoXZ;OGcUw9{}v5)`zf^km6ODmW*eCBDJn&+{7=mpd27?`!uV@<$nq$afFEx#=i3# zE9kFEr-QvmoC&{W>QEny-734SSEy!X0B_IRCv#}PWE)}_bO+FE- zR%+!LDZDL%y~20Osded!Yk)%K$AQ43MFH#(_Q&Y!JFJg~FUy4?E5&Y=mi8p1ZwXDZ zWN&%5uFH=EKCW_~-hB9&hdFm#r}q%CKV}T5S1Z#+JHQ$@E`M~D$LeIg_1Txbfd3~> ziJM{mX!wg$7L)zIBxd|C57N-V@;^YOmi8|*jrME9Aeawb_p9W)%mkz_kzGhP*dVi* zr$ZCWn?LMzOD$!XjUg+dcA@CwDGIGD(`Z8%yYaoG~FG@#QS1@F`%UXc+ z?@^)Z-U~oGo0=+hriA&hJnmxes7YJ*wO6T*X3JynNIh;I_2;54TLy>BR*`214qc{& z2;a6G7(a`mNj<#W(K)=A%%!bjxtUMIw#gEFS@u#6jF`lhoX3~Bd!nnxP{vdiD;3a@ z(O|4N16CzqS5ujn`DSI!5DhRH0s*^tD?q?Pe?ENXUqL^6!$&{)>G-_=OVGWq3bg4L zE`?(Wg(OHATE|YcvvR?zoH#~(kLbx@`j~QL-#iB0{ReuObSXxD9=ot+@gv*tJtO0) zU+}u1hMF_dk)Wi_k?r!$TWd7(7 zSdcR1dJoWqmq!D!c=95^U#$RxL=H@?*$JUZKw$o~Nqq{2RZQ03LT;L?p^@_p&n)E; zwOkcY@fCb+oM=S^3Mj>)PKyt67TVvK$XKLCvTEMhS~3R%G3sda=oDF$5jb4Ib$3E)e3r$ka{;Mi0+9`D;?cbhKFYZ+?K>ZR&H_PvnIZY0Wf}jp9>#zHLmke!p~PD`0$1zrZS9VY zNBeS$gmh)i8`#}oYQt-WIm!h(62@<8eiK%GOMp)$N|TVO8+el8 zr?R<9h8!#PGTUoPhwCHiTd(3|idihi4lHvJ732f_UdF~6opBuNT8e2bmjUqKKcXU7 zPN&HR?5Wzu6|HD>37}c>+GM?^HUL5qzqBiNBdB=2bYlYKDA8rBb46d^_RzGz4IVH9~hcFr&)&`!kP0Y(EuHsN65FfEe} z&FdQn)F2ct0er(QwvKp~4U3O&%sik!2b6PRw2@F3UB6(6wqG-izJ!Jps$Z;zh(l#Z z%A_#tv=hBeN|n3a(ARPSX=XMM}>Tx{lW^byC`hQm4nrxS3sR9 zYfV(*7)88ol8zUe?;JZ8dJlJ@(P!#77RBx}w?!Bs%9$It6V_KTk%P5;$=d;G3sN$8 zx?vluyBCl7`0|P<{RV4fBaiW05^QowZFjdnqjR=jpV!su)}+T-Rh+kxZpVNHQD{?m ze156(oto-obU&+oSpIE$V1`29ob6yJw;p6P zDymQg{aSEMvVQS%-R31_N7wJs_mbW5{`Ym@c|8=-Rnp6~>RHlMCbCY`k!fncvubuu zTBUbo2vPD$sRlz4hW~ds3{ZP;A{{9b9UNxN0~ES!IB1a{y)LvadsihmI!!?!&vId5 z(S~`h&)vvfz+)6M-R`eV1azB#$u#o;7R=?wHT*ixJ$Qg^ejDv!d4nS;07m+R+23)e zziP8#UsK#v`TB+}!)3F3R+@coidRaT3$5k1;l^|*?rvHmIq4*l>f{h_x}m>q840`t z2?t=idc7AnD*wuNNt@qQWeQCx^tDK5;>`E3gJ85S^QcFJH*s2AJcCLJuPO>Ah?@2U z^oDKpJb1#MzzjKxEaiM=3!X1}{gLn%z;`u<8B4J`7PFsvt!ilU!*Y)H05SEh03*6@ zMqs#b!+;ZF@_~>|3E3&-QW%kDY2X0nj34Iz7J7$d-ZzK)XgfHu|JtC_Y(UMrD)%aLZ`8f zdn&5&C-9v*9}uDa^&i175*EV294`X+VmC|}Z&we9h-UkfH^_D}HjiJH`GeAzGJd&& zTToo;503{HX%7gR#$m>;NyxI%lGjH!Zh}1xZY#AqM>K-h-1N2a z&$z}MSD7X=&FVJ)YLbsWAkey5?zRw^_F+m6ue6#&dQt!+e04-$^G9|W6PG=%He5yiisg7e>U0Z{Xl$$g;&)c$r9 zJ`hbnM0#|Wt4px;`uAZUdjdsWC#i`MBM|XB;ytsXC!_M(8i+a!f-m!KQD+&zKlUaHt^ui=# z9nE_hbKN@}1~4w2aMg&X{r4rHgFx`_hKgc|B}Z1 zzg*624UO&p^XH)&+uC`9?f#z+Xu+gT5vOMShTil6=T3IvYV`>YcXReLS2|265g{~s zgo@y3%ldK84&85^v(j%aeju&?>X6aSKY%qSRR_TYBJ@W|6Psn@KO#12O)NcXnl#6t z`WZW>>FKo$u}3dmob)MJVW;GQc>XhwQ%6SeMiifqgmpa^O6#W(D2;5Cjg4h2g-)9>sW0N=ea?^qFU&>o{WbKYY99*p5EY zzR`1LMa4>Fm6DXkCMBjRE7hn&h%6wEK@0l8rvSb4$6|-T^ZQ&+h=z3O(H9Gts0~^s z6=|}K9+3Vv^Xw7>If#04gv05JR%*~3p2p#PDq95*b?@Bh16fEKaY~qB2SA9K;F)7u zAg2$FkrP4PQ_|x(2UtKbV6!>Dp4S4<#6xs*w*2*x(`)?e^zS$*S!C8Ez7fR1c65(0 zy&BZB$OQH?0YjprBus~<%-`vDvMg*5UMYTvIb$wquowtu!_v+85Z+1kaFNdfWs6@v z=@L#KmO26!OCbtt6Tn zy??G89SykDXv&$g8gL(vkehhiQ!i`tu9?h_kJN>9l4$8YzhU~rz1O=7^q%{Ak69v@ z@Sh+{nZ_4kycpHn#>LjW$yEAk?=xtt!yys^DX5Y(P&H&4B3&07+K7>^l;BGxFp#b~P7Y-+I=*4X z!v8+rm07u1vdZ{V0tc{^&l5Mz(H2lXr>t+ai)XSgP^DgZB5$PCb;@Rx$3Zg#3z1mO zFmDN`|EQbLtl6XkJgY}+%}ltGRo$|n9$R9^FOO&~+>PZpLHYWc8TrfLk9_Kx0+1gD z(w`#MH@vrj3&~06OTeuzZA6r4*aAfWp=?kxQcz)CqG2tEtSM3M%r`{cl+QESdlqgJ zSK`86uopT?)@k7)5sG?B4_W5WKwV!JS3UHV!9)yMct}j4d7+A$X@A58zDaURuESpo z$BL|`mo$cQXaj3-Lk`CXU0}AvnL4`V3#B*BKViT7sRiuyvEz@B4X|o6csv{7j<^BY z+0%C=vwn!z)Yy^(FuLe!GX2uKYNXBWfv{wSw!-F3b5hQxY}5V<`|2{w?Vyq(Uji%TEbT0_5)4Mo7hJyeDeGeVK4( zU6>Kp9lDYkNXc6c0LIAk-+|OK&K_cbD%+4sjcqI#v*{ofw8g0&T_2ZAKl!2j<|=B- zjB^!X#yMt^qSAg~ldd6b42A*MwH{uC07=rH|J0+gGVwUuhm&v@l{|cY(z6GFRV`Zx z09!O|pfteRQ?W(3_bgp|OIAjm)nXa06>PDJl1`Z5OoY7N4yW^b-k4Pq0htr=bRX&2myDI%c;cMOLyRBkuy{FmF#`e)UP$VV4K${I=}+-#vooQb;F3R0YQkLw1c`RdJNh zCl5sYuhI8Lm;M7TDbTVDaamb$;R}LlU*<*P<#WzX#G!|n0hTU&bQ%r4dcJb1_?ovI z^hbTk0sf#+03N>XJ`N(=ws}^g^^vg~im)~$JX#gU(n*uj3j)ouJ~xZ`uJ6}5G215+ zM$0An7Ch#iC<3UugtZAozIh&#U|CHciyLWH>thvuh~p!0DY=vhRDH*cyAzRtAP|JH zcOjFG!FMsbBEzJ4?h2)rkOUPm>Fa{xV7)EGtesaT>T z1Vb6fkKm+|nBcOm@^MiN2C^#hKLnO7IWv^*O+v>e@n#)=xHz)B9=2wImEX5TySp9! zL2v*ls01BIsBv_t@_wFu=R6u_x)lQI-HcAPSv3iv)Tttz6=w@9ysVVL2-{lGY?Udg zLSTA~dR~s#43RSy%jR=zaA5|Ti3lI~&^z3ubbxez!|1>g1@!1pRzWeBc}mt7VL5aW z#mdn1id|dEaY{qXf;<@e`^7SXCyPkW^+K9?kqIoKAV*K!pMVgJIR^5lR~`ud39T2% zxk0BMU&737&RYc|#jcGRyOFBP{oo~kPcdcd?&?xuTB?M}ei+lm6*I7I$QvW)(XSdh zU|^<@er*96_{P|`x1023eQfqQNZr4BN`Udf#%{zEzN%Z=?(4M?V7<$Tnv)!xyfwII z;mnXB3r!4PmL))Ca|E18-E9RG{Z_f^E#DsMtL*7{f3}C~g%_o)*(dd$7&oO!2+m=C z8%{r{d%v_C;*edcDjXm-Uslc6FwgaQsUGV!!$wddfvPKoXu%WDng*XQhz<8Dv6D*E z8+7c|PMeqq#!=!dybIRtX-=2XbD9rIGYV^ZSW3^QR-SAmzc!nc!ui!7O< z1biPmc)9c!@-a_n!1Q2~(2o<1lO6Tu2+z3(cb}J(xM=~gEBvY7rXJ!ZJr%u03mc1? z)PkHp24UFRb8;^_wU1R3zYigL^*9agglY+h%ps#x-El)o24DBcsFE0H%7(<`{MSzX&<|m@y>}vUDYv) zA<8E#pYQTYI9LZ&IS58cUIVcdtPX#C1-IrlZeIeKlzZDHjOR?}b3kk%r+eMShpMn` zv|Ouge@CUXSYG&=66uvqCVUi+7~U3YO5XHb!=iO)vbwcmAz=X1w5~h63txNlY}KSu zsr{R~>)W5I9=ZdZ3aFX`xA>VgUKEC7u6qJR`H>R1^a{pSMt8!xPRdvC#j02h4`Ig{aCBU+FQiY)AmXGNHX}jK4JA2uTTD7q zL!03-o{A7EHOL?xa0j7kml)2YA!%4P0Tp;E>}}cDX^UI_4mPoat2FF7Z9J#}Uc0rG z%;$*>YXsK{^3x#?zYiGtp@|Zt*Ok9Dt=kp>>Pg})mEYd6zN1X#Vi|CN^KW>`JT&Zi zU-Po7T%dBlD-hlv>XcX2AGCKKyrGx(@@H@9Wc?t?+S3)D!J9Aq^zJM~Qs?%c9I^yo zep&`gLl%S|-OEK=@m5;1GMG@={FdH@4imc8(&PuPX*YsCqz4J>XYi)Ybo)=){5^!Q z0EffY(gL93yIIbvxIlDj8VIfcIF7Ybuk1#e2*`Fj+(hHZ@b*{L$;r-PUt&`aZtJZ; z!q#P3(ljP+daS9+pk^L1&C=O<#&w4KclD3PIC>G3V zmxc;q-P+7C;!EWv8*=n=r2;=LR}VysD>R54yKbjp(YJzVqs)JFlm^pL`*JkURFzGK z2gC0PW5|7W2z=;jtc2Fwa-_11Sx6!j$+E;8Y_QbHSg~1;l}2SE+*w%DGhPRl)Fnu; z*7=D~zP4O~+UTWMXxHD>S|t+8Xre=V9bY%j0wzD&U^ygBR|bqPD$hvnN0V1XvW5oG zzICdhYIKVJ!ebHw-nagJ2gTZ4-?)^WD~UDc*=0^FUqr^h&#e|+S+?N7lOUryMPDQ$ zaLT-y3x+`lTr7HQ7k|41?`*rm_B^m?wnz%X_y#piHY}^zKjwZGx0_UqmUvusq6v%7 z@;*E##$mYmJaiLb$UJIXPXl^P*MRjjssb1TsWo-!H^nzi{x4qwDFa_?rm?c>3Y!jV+p*=E@q77 zS#U;lp)l&vP~lK`!c44$`_O7&QJ#~YBh@{TC$TBFH!oh?ZJQ}&^Ik5g1F&7cUB6E~F{aQJiS+aztA2+%!RcT1nXpc?_m+P0nfP^DkU6)43?K|r9%9W? zHw#KUCtr{Ne(#punLBeHIN}gg@w7UvD?X`dZcs}G!o9`$X69>($;NlaXE}6%sRbIS zzH{0!=LqWl73#cQ?a-(+bgi>h;G*)(Ay2El#38#}AgH9i{+4Y}c*^|OU6(_7#-*pr zw9s{_8&OXTq)Yw%Urt7LF~F_I->@H)-^JDc-}cYm!PL&#+2&Un8B&$C|Lv*zPuNcu zkab~#P986dpz>lf?w|l$u zomWLn3KE95ODsIGZ9DOQG$?V@wAcscFS+Pi6kWhTkxA*(1z|ZCGy+f*uouoE&s-*C zw@xexH_G=S!Y%#BZzIV6l)|=zvndfCa;L3CSP!K8Ss&7#Q)JFGR4z>=F5VzXF@4=KUpm;x0fU?wRk*TAtC>w-gTCaR< zQBMo5J?QV$Tb-9+&&+J!$rQMErigbjRbU){7^p^h^8imvISm;gRCw|1j*wWZ0z%8JvG2jC(wdXPj zKSPs6!!eyH^Jt#nGP43=htg~Z9>~#IFXJ+0b&&IO2r(*vN2NSVC){x+4*KnB?H{e2QO3N9Uo_mc)H*3K8{WyH^eUd7Bd6%7)h}w(sQy6@ zp$4p?X_uw#+y$4~+`xk9)LbD{#)@)j40m+Q8j9nV4gP9&iSaJHvx1ipKBkzzo6B*R zWHj-~2F>MimfOM4mhqBYjjZ5b(tnAK9tPgMlzoC}NI`0THRx0mH>WK>Q0eCP6~ck< z6nqd=hG)QvC+KQwu$6ogHdpiu8UF&PEW%oipF(DSMG!+!J6}wYZf_~82bbT*!#1%Z zp$7MUCILERBH#x;UW}8E-`IAvk-}2+fy{Jg_=SyUEy54 zH_`&NVc)e54bEpHaMUtWVq#HAjysm{OQ_uaq3{VVQ3tBQSQ227pwYMhA+r(QmIoU9 zOda-=Vu|=;Q{Ab|VShh} zCM!?a9WcOjUQmZU&w@yN0s=Oq>OI%d=SAv82*ufQ&DF?YB4sc8>W{lwH%quF4uEH3 zIdKS&w`9Y^Fmjom%n)|_+|O!qQMkhDcUATw*Maj9y&Ax$L_ zFfHQ|#l{TZA^^P&0%?)tkoK)Jy7dP55pi&Txmrd(V4fJ$(O>spUg;VTI#XxLCVYWZ zqVb18{eT+)w}GmjMqTf1Kjo6_{$jmVB-w!QrDUb*N`?TxxqwaL1@>I;_Ftbiq&9-p zMx;Bd#!RuGYiN-TG<+n*WLJ$Y={uCYItwA?em*j>buyNuQ!?&}oloclY=;kGO#*f} zB^G}MWLAc%9wE}IU6!JclPRzHTQO9F*qRBh_j#EBb%1w>kH5nqKm3%IHiAehUyA4L z?Eiyw#!?WBoSd)}H$=Vtp%G_^`24r6qGRr)G8@SATVE~2$FA;Yd^$Vs5kE&EKk^k) zO21_48)R$^FS()~5La3WWO*i%Vw2_8+5OFF>v7o1%jCz6Wi zax&Glec!Qv7IexjLMr0OgF;Z=OyBan>U6vEXqBqn6t*m7Cl~5mn;bA7GQq z<*ww};6U^e3?2}_K6rHEam!){0n6sTbIv##1v)$OOu+}{qwZ2!DZ7@GKFK`$5rdMwWg#R%p0>z9{C;ki^mMf~msy(*jm-^B+J_KLiKu zKZ0Nk+yybd&)W5Tm$ql5Hph;1vS~gTRW>0RvqlJ6s2dc{A(ZzBPIt zjR7;J98xxW``a!ri2L{MI=7n7oGv0?;T%#i2UytVsM~iZtWXvI+_a zBtuxHQb`Li_VX|l{D4LDaT!MuqTiyPR0wcifckUa%uGK|(^b(?cgR1f{u3e1Bnmpc zF}i3#cvN55Yrj}Z=(hgd8 zk@i@ZAEE*H7VT9omu+Lk=b_qdYB5R=p9&B;c=&%EKWIbNY*2hpDQHO+0Dz8si^_hA6aLJWh8^beZyYeBT@+BnNt=5U{?^NF-wkAMvMcsCMV2u`PJv$ess|OnHJa=EnckKf+~Mz@z=%1R#jo;|BZo`efJE6SFF>i`$6vTdnW2UbH{2AVOBO zQ(f$eVT^_c;RL0LnD(VmGoMDBrLdEnVi2XgnQ5UY#RdZI8$)c{y{5#O!C@7b4|&P! z5B4kkcmKa?Gt%L*e%1Z^aOUzg5a~;oZH~o24i0CiplsEYM3IP-DDQk~55cnx8S)%| zp*(MwCxlHodR{0c$)uqodN$XHr?r?Bn*%kQLPz|6YNkuJ5EY#G|NIO_Y$?Qm?F_Y< zgsH3gOt^RVUL3KGLTSO08;}7Yjt)QEZ{8>fjbk z1Ax*P1W2?mgb?ecZ`&V|OeJR^rzIacPJ-T?1@U!Hu6jo0Q?3W8$*1ZD94q2phto|k z0MUxX3=?p&c%q1m}Tj`W0XPWDM(lB18uXb;3FHD!<_Ur19^Uf@8DmPdljfUbOlz^?`bhfUI3f5M9GeCLt%{^xlg0#IOqiTT6->pU zB)FmD^zRn{1fe1)M^%w+E=)S+tty%miQnR+F%a;M9s-pLqe&K#h>tp_tkNg!TQ$H| zIKl^Aish!U?=Bk_af^4;{qB@mk-c$+|{w;th zBf|5_dMD1a$OKWN83J3QpNeM?l!aAEsgZ7gY;dL1S)akI&SEk_G+c{ofNK)!jn~8z z9kfU_0AY4X@D>0_WkI?TTqR6_Vh zBCHZ6i4*t}g|Tl0DUxgwaggi3yMFbm1B2{;9z1SJ?gRP$;WAL+x!*u*BF3s}1S;JF z>x1D49dt=hyo$pYAdv(dBbI)ZlapKRcDcoZY~;Sw1L-tQphDMw_*voz`@Syg4C=^udfPPfcS|B2Opo$=9#mUlG)F2}f z+4gXn3*#g8h1tUW^6ri$7bbNVY?}d|O@+S!(YV#^o`_^?-2~xE;PD znoFmZieVPObnDPpQsLGhmlH1{UP`ALZKwR@J%LW zFBc?qvTmrWJL(yb4`SH1q}kAj@xwEa>Ojm?9MI*? zS_ieXNimIsWa~rZ+hVD@7NVY#gW%&2OYZSp3GC(}jUtBtUt_H7K|AFjNM$=f!YTHF zn<9TLbHb|sNeE8XL-N6^nf(e$Lt;k_=tmex08qT6!pl!vm+N!FNjF)OS~WljUgU$K z9I0TYbbLW_#Ll{Xn3hvh2(ZQxmNiy!8=XX(=C|^j6t-%J2 zYrTEAV6zX?Z+Dz@%%)uGf^U3%NF1r@u6HQBk@$E8#gal2u#ynjUn7b%ZP^85p_JsG zBasnVTN9?z?4iA>X5CkZMpfxtUD|Kku@YCCYyFjU1w(}%FIeoaRQaNF(`Dffsozhc z*G*cBw-JG%2edTKN8a9}wqVn`uZvqxq!1B;z}yb=;Cwe zO?e&&HE`ac!l-;o)l7$M2N}F1Z8EQ$BMhbyJnca|W7}vX09&~MH1(8Nb(WFbD*umz zuys=NI?4c-Q%{@ST9kKjY7pY^me4wQ4YAGH?T=uJae&HDL5W9zS~0qJM4FHtAqE6} zG%TCYGcHl8Mi4IMZ#G#ZSrmis1uoUg=~@$sT7nFAiy&Gx^m1#Xf#Q+L)2n8MvrJ^!a(Hl+Zk8A&R}>fG-p6`0U4w-NMX|*h`8tNf1u$ly z-Q*cBCz~6c#r0gRT&%1nM`_y5u_Irm1}i>eBuZSMU_8`1MDyvzt1Gs=e{(raGBz#> z%D?2Mf<-%=wq*oWA;Ft0%xXXVyv95W7RkaIsYLx6WhGNUd+XQdB^P9B`MR9yrU_)`xafy{X$jhbJez!^C&k!e z#@|hFe~<$b^^hdu48SXq4ejqu0>zQVrtJevdpy6k-X1eM(Tl9>d-!v36jRDrETArg zpF4%UoeW(zR8fF?tJIp8Um5@{GV`H$kDqLJHxU=-;{et~5rnXL4a=0AtFMVvlMaX1 zFDNo>wdc9iIlV0@@;BfOu{uC}Ym}s_)QSpmogiP}dFB;Ar1af$78d2+B7kwjPxy}n z;b4=5)T=B0dU&5-t~iQJbH4_k9rkit_mg}E1=(ENq*5zYB6o2ynkgsZwnpS0Wyy5c z+_V^7P!@vThLs;epD+{$CtlT&bV~7Rqi<1tR1B(YFk89jpVg!*MKDw(!N^%Q+oIl$EX?GrF)J9b{ppi2j0I!8$Ag z+fpQqxzH9-nG~^5AD4@4qU6r@UGc3gn87Dp35m;TL>QZNO)XT~--76=$d40)dJaW? zCysN5fc7GS3(3uzKqZzOxT{nWQ{pJ^E*99&mCs|g3?re1N8YZteSd%sy3NsH#x|Pv z|6GsN6dZ1b)xi-DyY0XF{I9NvU%}@8Zd3XVe*XVbZ~iYM$$$4L$p;cpSpBw>fx-d+ z{P)LQoos9@jhO#euSl}m#eckmKQ%r3c?Ds*9#Si?0|vdlon*EFEj96N8=-~>7H2lj z`69_hmlnQXG4#^Y#-d+@bGSD?FT1>HC6*1BlXA-r&04gAx6MWsfxztC4BWw0pMs6B zLWCDs&;ycn@k+OUxcy<#C6d_kHcH~hW%8EF3<^1xi%-dV&yju^ILWbTu`#H7uZ0XX z!yMq+D!97llmgbYzg&`fy|h>qjsseT0;5+cRedpaApY2pHuRp5XF_=C*lWwCP~at2 z2}_ztb%9PK2kq{pM42r+gHM7wK>|IovK6t8%6)J#COhxQqt6usJ9tR@1s>z$6%oEm%WCpT8ddf zQLXnA&3_Zp553)su%vle$`#mAxZw)hAUg@>vFIeOts}e4QU48iiKB{?bD}b<7z&;a zBMm4IP$yj>njDSggK(nBw_4oek`ACv*{}r;oh*@7@eNEJIekA5e108G(N3bH-;NyZ z?=yQR!bsAAGDVb#_=A;?w}&*x4Q&njD(l_?oeD1(5Iagy#K~Gk=Nd$}7)jMc?^{!? zBRyyJHE8RZ*Vs8iaT{at^78K}K{s1d1)cL);Qu&RQ!1X=`@B853hl`w=jlUGjvit` zZ;*M|qX2sVmRLh%*;`wY6Is6{%kFK>)cVSJx%M|N^r%Qt!LKq@BcovPdfLE!FgnqE zNY4Ze^>hyP%=B&)fh4U`(4@gGxZV3h3t|EUCvPItUkQ4^!g!f4)X&sz;w(Iq{hK+h zNY4cmn5SEygI^$=ej%mL#$l~a)h_Q?6TMB>I+4eBq%VS{z6QBgoZR-f=8(M4YGwgI zl`X<7dgxGD?MoO}x;7ldNoS4ul)YK)xsO}27^Xaf)FWv2Q~z}7YUn(`A=q}H(qI#q=|(4j2sjJx;T956q7Ls29rqZUOp{K8xmrCD{ zGqN0m*phV4p|uN9vL(w+nMfMrvsQr6jHG@{8r`K9hPB7p%@mfiO0ZU+vC98+=Z5C^+4kD-WYS1B=Y@3uaNCTk?@uMwtWXhr79tC9FR?-a<#l-+Z8e+i zB`e~(tHt5TJ04BUZD;*uqy}VgRSR{=EI;gZ*ZabB(lO8y3l+$x#yG`#{!Xhs4GrLR zi3r~|#acMpjaTpZ6({Ws&{BWxH%D-yr7y~D4PQh&hP@na{J%{Yv*v{-f4Ma9zmLdfctTcgw^k+9(m4om{agiEFHhXpGk2+!$&9!&g(tj z`95MD@HL)=U-m*Ua8n-v#%n47?yuf15Vs&o?7|-^eV^f%a>GY@@+h)SCpq5!Ys%yD zBRc{8j%aQw0083un)3hmm^QYzu`xAvvHaEOf0fy4tzVlr2hw+rz90t$jk|6B6<(bH z0Q$;=oqgoS7Md-3q%fU>MYvpBJgI8YXG7@6%?pgAWKj{v+4h^Tk@mn|=L~ZZyK22@ zc+^TS$tO$@p@Of4*}L<9};FOOVf)Ge2x%Ky-i^mdi? zrDNSa9rWQv1{Y4j`q#Y7r>vp?>*NU|R{_FX9WrPC!)$FNH{#I8hIx2;Ei~#vR?!x{ z0wsKN^f2H{i32a<4mTCk*46Bl98-P#z7cz#8WmeZ>QGCiQng5=CEXSNOx0*kGxw9A zxiE)0tYv;gY1N%OXUU_IIwy=({#v{}o7bf9MU{#w-iIFfD$J;|UH*}7gpBD6ktyAdaiDqr-uu#Gv@$$72>C80Vn$B5K z_SokB;A95>a+>7u5No{3r@RrSGUDk*fjnc6+Wef6O!3smJa^2*=-am}B3mXO++9zH zq8pKBNH0=m8yaKk&hUdfeY2jHZx%gbiF6_OH%+$j2%Pi>ft@{Skz`&5VZcZ}e(2>h zOg_LgfV!(JD=iYsX&uzsk>hNi{QLGeDqKK-NP;b!KOp!F%`=*bQCEdsVND}8hj z?FaR6K%K;Plrp)3CP|?CSaRe#G`ozTWD{!G*=aFFa%d2)#4n9blP7R;Bbl9@Z)Eh< z9ZcK669_$$#q2k3fr2j^^96~n6LlT2iI34Ng68sujF1-qt}}eURmpB z@n~==vIuT14y(sM_dVxaK#R{G=nOeBbdQ!^|MszWa?1cF-CrGMZH}oP zjZ>m{OfLohl4Yo6!NAaWqMLTNcy!dt#4|w>rm``|bUi#Q3Ys(vc}#74 z+tO{sJ-};|YQfmN0?N7qidl8&cN4MJ+?MPq*Qx8}!WGO|2iVASe#T^6JJ1O^C0m=! zIAQ!OOcSqz7}2cPeUy&WIL)&9H_Z!&5Z6gmb`08<*Mad-Kp`w3S+Kj9h&$fCG~go0 zj!j;U>M?ClSaL6xP>zE%Z=#)%A8g4P#ZN_t3Q(dD(8~rHv0RW}v2NrLSIt@30Lle6 z2qpQ?Lf~D=bh$GT5@MtETpn@LlE=K$orxqu&(ey8M+}%Eo~EXRkYdS1ez?XAfDu8r za}|AX_+z!OH!!}E`Bch16Kzd z($8C!_WFZW6TJ=obtu=^6h*WHDY(JVM8MC)nxOJDwcja34Z^e8#A&ctDP+m>Jpzjma-I++k z=|1eZ^WN`!&I5PrJhmcfjVWIaOT`D@i3fJ-T;Eq-3;{p5;J_~@mv7G60A9QLscE3X z3sbUPSwpn7czW=&UF^XgE);Lk#yCubkbg%11e&ANB~8Q==e}%m{LOW00Fj+ZQItw=ESyb+qUiGk8Rtw?M!T2lkDtnZPnddb?ZL# zYj;;a_31w6J89<**hlAUW8XODy=4I}0}kj02CPMVSNuhs9ad>N?jA$zrOL2*{1kzY zNExBsUZ0D=!e2ZNV6N*`>6mN!z$o`m6HYuZ&p@=4v26e;mH3W1c^^wI^m3ZiG1%D> zswa?Hh3Txr`b=te5vMWqwN9&Cc_=g)v!eb1gXgifd}V4_X)l{;=eJVQdTBFXR0YC_ z!p~8-h_p;gtyhn=%@BtXHI+7!STmMZolVt&FiMS#SWp7ve3zEVkzjVW!6fAB`1lWmnh#ZT;qXC&6ePWondE?G(Q4A+8AqIjTE;>{SM=;SSMFE@ z)Ssn(huPgzi!g-X3=BxB5KGjEFN;kx!f`IBYO&wEZj9ZSeBz)57BefbziKQF9;A?a z4=fI*M!^VBS>tZ61Kil;>&$KL0oNz<-mqjt+mf|>kt`GYa7L#`l_)?5o|_0KJHubI zK=-9L_ApP*5kh(NkT^peR~Qb&?o7>P=NE(r7GgBQ5|3&)pGjV&EmSc_P&>00RE+Dt zQn5ZQ&;B?-CzrNZAOufJ-9TY$8V`fk3K}{nxw1|Oj~ad!hGmWfjv{zZiyWd0nMGSz zX$+n|RtQd?QCreJ;^*)zlI*!8x|&=YdOtp#nmbD@;=iqvzK-$+6I|fQm^o{jyW+YD z7_T&NpJ=#fBLK{mSA-XMF?ItHz==njL)6bLGzri6XTOSfcWi;K#Wb!5Zlc!*GK48N zkWF=*3(XAp4jPf7;gW|@~D805rJ!Pqr2X%H>DcQ^RQBrc(eNpcSW#`6WF>|ejGCyX$4?SlQtLA9I)Fj|aewIf03R-?{gpnC|9;OI2cLZ-)0 zbp<)w&5RGY3|kfNV5|P>3es)pHMXFKOft>Im$EJ8+vytK^4q|kC%wx~N_WBvLQy-v zG@ZYa@?3!_=kl~s1bZ#{cxwdqTZDHQEt$B%vWw&2#!<&6U9ov@4AGsyU9vo3b9FFR zXRnyaJbL3yv27Wx8vUB+nqe9+X@~nPc#Zy9ALP#(b|D;hU6w*Sc)U>t4T^w@ ztu7lu*;3{*>H#ewp5*4@z$!j8;uGN+1^&A#RW}N+sIA=n!AT?JfwH{Sx%1qR1D8l0 z+5?{lBJ-Iwaw2i5cs=@h#R2>$;-&mX66U?k<(!+HaiN*^ z0-`xiDSB373s4v1@|5T$Y8B6CwEC~Z{Lx0*w^^pRhnJ{}<9e7ia$SD5Ax=PvcHGJ_45dQolxMsCNY}o8B+KewV z!dYH{uO_Yq)b!XFkr|BdTE3}+`bG9tQ42@Q6-(u?e=oDxZ*@=|t$(cS>{=CyB(%-Y zcxlzs3dvX?6#m^XH{J?DEOGk{Wi^>!$GS_bX>^842EzB}wQw%f@7+tqu|zJ-q~ylH z$bBA8hIqWu9f|0q5SYep?X=_5*KJHlW?I~)`IpFzqqS)p>IFJ0-*zFK+;^^z9hDXT$EjMJ(87jFe<5nS}0ykdg9f*Qs&GZJR@o1yl5->+6^K z^4Gk7-M842`Y!7PQ>QYmOi!F&m9EdPD_a-eR$7``7rT3G(n=*HjARq(gtQi3I{iOq z;eb$ps434cz1;;=uA`}uGO*!Ja0Ap#drgJvE2}z>g!+?g6VuUQ(@EqnqaYtX4e~b+ z>km{Lk3YNtb!(EXtNP9bd6T8l<3-wf=k{Io(*^-p)kqCKWr+`s)6y6)Zn87ZUz=-) z(Bqet*BuG)pc@C$v@B?DyAM` z7eZf^&V{l6Al(NAG(gf#`NL3N9Y2oAqh)tWDfLl3B6{;t&~Pzw=eG(*utq#o9}pUZ zsdnTMB_#W3lTpWSFjTN#eSCb)fkF`S87Cr~eR34+-6d&El&;@g)`7~2Fx|$CDr{xU zR94EQ)jvG>inQyM8MaJLT{lp9q*Nza3^F(kpQ9oG!Q}sXh>^}##DOt1e7Tbz3SJ25 z+%F5r1?8f)0@eAn0=4mC2WB6D8R{GJWHRINQ*pu=Wg17QVvjUXMeygE8l=apN5V4+ zA@A>CG?uP?>o=A(>~aDi%SE4zfD0BuglCtH4rdqail3OuN(uG6U6;Q6OQtv{BGRFJ``=HZ3%y&PoagQr>2)ir^s$Da;@ZnIaCuGgL)#4WN*(4CHJSS2r3 z^i+JJ^8qJ`1*JIm&+g`R!Rn72=U-Mb`g(J{TzOS#mrT(*+CtoM0Gnil?ITn4Y9Qoa z(aaMxl3~n1u9>A151DHI?+nO7N&(#|I#3%R@}6E}!BB>&UzBCo3p9FhEu#=!%yb}@ z>etjLsay3?>;n{-=u!ox?_hgH-{F(IF_}B|j6nWCB<0;feJ3kiybp`8AU=d(MFT*@ z;L?oN3t^yV)SsRaYR;U7zX;;7`C#83zTTVkA%Y>VuEWg9{&HD>X8JA1cM8grtsFDR zSjVYxgPn^|HV0+aU9!>z^6pX14bmL|O-dVpVU8C zTwNUi2x=MTf|J#os`g;QQ@7)bnO-ONyZrI|@Am`?7m<1=KrGpHzF{_rn4q4fcF*lCUxm z+#o~h;1nxGRacRzm;-f!K*7QZqK&hKG{~h5Oj^t>+fT{sYc?G88%#dii z+&eOn#M&NsgNq;kCvNRMs=^?hXz6-YlvU?Z7FYq`;>OH&;=OATzoaD{+QZ+tNiWIY=V~Szj&n-o2>3{{%K-rX+|bN8Q@Yd>QzUQ00?tMOU*2S*2p_Qhw1Ob7u?__;O76mGE*XJ& z_MYGb>4ATCj*dD_`w_(;&2%R%V0COmQ3!t*W{;3<#THIvB!k4K`}6hO{qtEex1M1C zVu}v9T3m*^r}TV z+@7hBLA8+-G-HcTEpmg4&?HpBfW;)El_;_*uJ$1#AdbwlPEG)vy#q~FN6GR#BnSFI_9BB`f;5Cc2p z5^rA(EO?o)bW$mO(F5GKq9*h+Jgkp8#kic#`D(`i84>tk#%_STXdVGrP`D{s1MK9V zex)k*iLW$`J2(CeOr0e#_|9pYl%?(wEZ~BGu^=#rlXx4DrX*oOQ9~RpWI!k|>RHe# z)Sxx-L|Vd3hiBy6K;Pn|#5b|}$~2=KGP;;_(8)XyLJ`bSQX%G$eTZTvY{3D&Ca(sn zL;xx0eB=kb&UXbwxzW+9mBmC==X5bT^nr{5%xSvC)j+`8Cf-jd0KCFk{d0`@ncD!Y zwgh>8;2IvG%WyLd%jq2>nM2X~n&_p{0r#DLrI@%8{`+T`@hQNr-=3@tn2LB$B2tBh z*~B&IvBrQ(-LtfiR764!XD`JtQqLo`%(B2o#A>=`;+0|weqSEW^!YI>_B*d_Q$VVT)VNlZ%h5;v>WQvM^NsVbP#Cyq>3nOSA@ z(Nee(>s5e9Ifd=C`ZHmyfTfwUZsn zX*G5nV>8m=A&zrSekHKd1gK0oD??ZI+2bd*_?{lD^-tvjP$Z})EDOWeiKC1 z-=ms_aHx+Ue4@G7?E!zed+MPq9XP3a5vR7~X3?ZdQ@cy)>S5`ttMJe=ivav~9fgAJ z*2Pbniwhd6lrXJaQr$Mdn64!{1qUr~Qe$U^)drY(Hp;fxbC5Q2=T6z;XJi9A44!Bg z#UQ_@S}mH5C>w{#hoVzBz{x>zR$0oo}7KBi^OyUN|GYxS?RqYgu(25W4WF!^PuubQ8S?vhE@9Op zvfqLbc4ik}W4RJ9k)_XgsiH$uaDN`()~CJyeu<^TThcn#IjR--!6O%XdmJ2ucVi=5 z17b8@OoWE$=1R?{74A%n>KY>>xu{=y8T>clz)z8h!mqPQHB_u1C=;ib6bbo67xiq6ItP7$G>W zuA%7nIj#XldCM?xJ!1Pgu>yam>2wmI@x~ZO$@o2yM8FFkCzv`ypG@ZqT9;A)gXA-v zzTJqS)i+cftaM-VZ{b{+8}76X-P~cDtg#8JUmSFvELhgj%~g=u56^`$2z!e1ekqvV zbIdZrbWwQW38(79^v$`XTWvKOMPfTfgy4?LJWcLH98j)e3QYBI0jGhre~3l{7y+{- zVKO7muWIAMY)zLixZg`KS)~=E)k4h`P1;D$`sB@}$bb?9TNVd6cOCVnBA+gBL*;Uu zJ!Vr8Yz(#B$TySk+6W`w=m(9oNMp+bg=VgzPWNBvIiaC=n9yEX##~zZy{O17 zL}pdKpDl?yII62wqW8;Lh>o!@STutW34D^V#ERVIDQ|gth;fO^xXD2V8{uAagYuDM zJ2{`q>kQWKZjb*o*<~BL5P$VSggw>IPblZqOn%#_I%;l#l!{SPfEqXV8+O7DOxpgg z_85xB%OPPn%7=C5@`)*j?&<0Cx3#(3;ve5w`yr^hu)^J5zot+pN@nRXm+$JDl%$n6 zv_aF?&qL)^mDRc#7!Sq1u9uJcYocnd*ag3fhsG3_xb5@ZTQH9sJ~M&dlPDTXoMUlr z4SP_0Ws6WXZ^IGSn=!Lv%yF_sgD#W={stNAuhi-7y$X@lQfd1fB1JpHk=^ZbE{nR( zM?`ci=S&8D*=+2t!^2Cw-<_oGB3D%VQ@%5|xAiz>Z+1Fx{&jpc^G>3X?JLmd)5I9i zTn49m*9^XZ_u#l|^jlP44Ar=5f0v#@)Ae^+4BPd?TzkQ0c{|&uLhOmf?0#ChS2GVQ zuSix&UKb-P4?5o86~(2rUk^a0&KOHKW-O6LcvU0Kck zgfDp-C(!&SN$kxJRPv>VYOGNlrFjQJ>4DJ;H4qfhaJUy>GT-eQDKhxzI8d<0MmhO1(VZCzF_U>CnuDJMK+K^kk zMx*JleNa`ga{_30=*|%GeT2`y6>iqQ+ywBhoS;%%_D|O0S0f4cn0`Mp25>8*ZkVdK z)%)pNZZsZQRTaC|%7z#~LX@uiS4-4=K8xV$dh$zj7(v08ITPkm=-AS_9O@;%h-%^% zORMDu?4ZE#0{p=uW;chf>${I3sG3+7w|^x_z9b1N{rERj%m;OYDN-f3^XV=UsP-p? zZ40UICd;Acf9>y!XW6I|RKphtH=s}m)poL*Eu4GF=hWe9xs2h0P=UbZ1^Ki%$&-Jo z5(o#e8U4(}G)+-hjv8da_&Sb_h3CpH?+!as#V<`6Z!ro<#9$>IQ@g)C9_owrJ{5cv zkE5h{%yo8P1xgdQi~&K$e`nw@)FDLPlqbexst-=Gl=58IRlH<>wB=_EY-x{sxFm^u z*eWkVsb?BT$+5FBx%&}egPJ%7+?L4N>amYaRA(q}Vj9PObX%$0d;}&AX6<+dZGTTe z@@co*IrN9Daxgk50H%7WUa34iI03qP z9Ai)`AjYcTG0+t2mq&5tC!_sa-Q6Pwa7VaDhqg&0?{bXt*xm)RLjsR^{-&z4Hvihr zWtYsg?OiihpC|I>p?9jbs>EHmec220>0y1@z*A5)me6n_#frF(I0br$c9?Q;GpOrM z(Qs{U47Skt!syA6bQKYdz&+eBhc{j<4>}RD*?G=G91#R_YBj1>w!)JT-6s&9hE0l_ z9E`=2uX%UgZ(P_HeJ|Y-zncvQn|*D%G&+Gjqg;v>34VVWY*Q)ln2pAkyAfg4j=Vqb zpl;LUL;gUU(XW(FyVIGJbyIaTS4}eD8b1#(a~Ha4IP#08=?a&?UkDZ0gP{)V#X8ay z&}(exFJU-_c&^R~186WBRlb5&jS}=SU(#;09WD0M|&f8B!4#|VnZW_*C6(Nl>jrCxp zV8|0_f9v`6+~ffimdoq%7^Ia@s7oc9dP1TEf!E$#9?EIK}btLtJzkHq3q503E2HQ4J{vo~6j9)zh1LLj{}B3;sW_fbP`PkR<-_-U=^I&T9)YO+Vh}mH)6sFWptaXp z4ud`ci9SjO_aPI;<|9(K0>;`hwl*m*hVn${R62G+%@R3J;t3j;$%o;(DZuxS2_vDr zu2;!8^u-4UGPj}{%%_b+8H@Cb_??2HGt~svIegNtX5mTcqhhD0*jr)7KD2;~s)IKHv8uvP4Q_5& z(Ug4RZj6@(6mDgMs=GhBG?9ICeOnN}O8I<7UbJ}yTtKi1pUODSU+Y?sq*)D*TY-kF z7R{2%ANNoLm(VkG>PwN*ck{Y=*Y0)HlH+yFdbj-1${^*g__svg8mR1bLb8hf(R0?4 z`9*l;lRRF8%Aj-H>HshP)9A0}9*+kwqOW{7Y4_qK<~NT2{R5Ce8O(!73k1ZT4Fp8~ z|9ymau($tDKEk!{KXT-H>Yn>w7&ujiL_L_sE3%y;9M{Q)m7U6aVe1LU5-%^wi1uQn zK%n4o6N=RLYj3?*_{oP-%9R%Mv?-FnXlMP?+*d9Q_Gj+QnKa)u4l8!)sOM6h$ z%f{Q~82{Vr3D*@?)f)elXDd||+P_VTAKKc#>{QMDY_sy;-}wrUecD_3h#6%H(o=_4wQNOFG@KOQ5n;1A~UJJMu6~*WUd4K&)oP#hxTt z0mtD|{yUehLu~HRQFaYu5 zSC3Vfe7CI6t!&S@1DXHykn`F4kq#2vq@o<{Y|hnXY`>R6C~@FdrQp zBaPpGX0yvh8ULMHlc{3mMyVa_)u8>QJfpQXc!sC22J03h&O2iN>K0ot;muAfz4>Le z_V%q4Yt7el@m)2}$ zr>42-y}D?T(BQuQ#yy^3@zxU9X`PvawLKz*R}$IhglML#bb!;k-7*NJOOlQauxaHH z_25W(ITo6i7ov*mJ) z0K2oV{jGCw2ymDwg3M(4%S*uOkZZvkHQfyETP5J$CajAmOZMf(tZs$*atdK{Wz8Rg zm0)Ou4~tWQqGR!fUP`cLSP8nD>m(}~6)Tp96tsVhHca2fKe(B$V3@58lt)#|RIei={F|QikRXWbELnOC0(ZV(B)QV*^s3bb>#=aARvK$M zwvghSC<7i(gM>t#!@=mEp(k*Bv>5^WaAIL$hGqu|U*^)xwR!JWeEdAFccSs~D(iIY z!t4I(OxDqNIEk$J&#%0nm-pSP&Jb9^c{8%LgNZj>U+Fo$@4JVu9o9tsyj_2v#}7pN z-M){xz9EYYsu2~ltDkI$MiIe3wRSjrwc)m{D#V7QL6Bu}OquF`!7>zD5#sQroF&Aa zyb6cd1`WCX^(|Goq*9P(Sg0Kg6-}h5q32Rp*0SfbIu5IXgV6wyg8b%w6%Wd=6?Y1x zyo4nc`W@sQkpyq>>nWi8?V5#!MB3QEL|=e}b97`7d#MTzVi|;V;#XJo*J(ZTyn)>%G5=?LBG((N}lf zq^*CF2|xDC}* zOn1>;a|YD3UBeMLDvdTe%{155{eylIDkPNB!AC(5Tgx6-`52lgCeh)Qioj4A!lN^o zv^FguXI+3R7=;eT+Aj?wR3=A;oNAbq$G{>AYYhlcxDY(o_8{B33=CIz81iw;mJGUJ ztEHo3lynqG2zcO%4^c?tjtMPufM5ugP-)E7-7nhPCVHcZxci2b!`l(=&ux&VChz-N zeSP6mM$L2skj2&wd=zO74GsI>hM{Bhvb%$<_hPAd+7*Lbk`p*4jfJFEpw5sReUuRJ zsC@bqk6a7=?|6B(=s6OF&&vLPw->fC1y>EhV1YJ(B@&b!TUvcULqXdk4`%`+=p%;h z5pPoZyjVT#=`D!d$PFBrbE`_j_f^O1vKl|%Z~O32 zHXN?{Cpdx7p-u_|n2d|m3&a^HQLZ#3S0DY!s)x2}fe@?HkY0JBw4W%Q`F|$>^zxyQ zWblLpDbADEd%Z>qKhOH|c_d-ecDFgm$6T3^0n50(gIf|gLlAczV=T+NB0XGJ#0HK_ zIa3(ChvjC@!awd89Hd8;bV?hi8Z-BhL~a!9F6$7Zai~?lb5(4^0K| zOu4NPDOiG(4WZ62n{M^}e4N?3xc$9fz7JDvsls2M*7ZnW&_K}ept;kH(R56|aJxBi z!$>*a-@sqtHs{gB!J(RubEJ-kxsGaM@c0IVVOvD?3|Lj>F}>AOmI_xaSkhGUteh8z z)wNovoGNe2%C)B@LKf!ac;6a(CAJ(DLGU%~a+&WJz474wxY7Li+QNwNfhC|s-%shY zF7cz2K&9#q;h0b3(f|sBnyIjP>gS8aDvj*`I+*|S&Hn^u9PJz6zZLhIe4AK6;%y3Q z)+f0MI0ke>h=r)N-IED{TAecL7f1E?N%6>};G0X_Z2UGoxxEe7taDj%FAk8|9?;pL zT2{g}DWF$SNs|D^cO)w=sl3dU(VHl>XU|`3tq{1b)SuI#@CNWk<6_;Q?W7umaXbY& zDb6rd3sn6*swO#p*KMU)0glS8>I6P%D23ib4Pa9)UfIxv$AQ%X7fRD&->`zW$M4tCS@lB=^&lF+Nb(~nXq02ZR*v&e{ZJ}mK`wZfr1bN=D2sXK) z9`{}x@EGQsE)HK{eLpuhzZ?|z$5~*G^;ah2O3(2XUmQH|??5~Z*1{ZDo$X%&cUDW|yf?TGN4&{yktwqJg>N2eK)IHr2De#SG z-GbET+&W1j{JLRCVf(b`xk+{AjGByl)S}k}sLviY$ci>o6t@nzDEQ9Hhn3pw6Rq?%N%C_^<~CEx?*$Bx6S#2B52l+;n=&VZ5M%p(P6uA%34~NC_M>)wEhO)_ zh>Mf4XYPJ^YbiNpmSCWm0}4Ke%p#|d5xzd<^E$`=WF~!6n914f?SXd&!0E}%w1Y&q zcP$A3sZR6aPLu_ukO}3E<3xqaUm1!0xWovZda$}%S6;0No_H{uo5@Fg`N$O>_{ah1 zo~$=0i0ig|X@glVIQ`r*qwbukM~R7GUo{uble>*zR_!fhEDVIx3qB2~UbL;9FS_ba z0iQ@Eg3-jgV(t9hfu2P*2EB)9FsnG>Pz743cWRg|k`97_AtUy*ikd1BqQg4`ytLhs zS7*_2Ch>@PUqK#4u%1y+fLs2=Z;9*!*C)#20y!V8Kp#wuyT9-XAC1|AKagh#CVZ@*A%*F?d-2P=7>EFdDvk%}!fv(oL#y6l`bfgoh=9U@a-WV3nm8 z5ddj#b0~>1@wgug6hqUa)kI?8AhQ6QWsZEQRrhB&-xQ#0kEHCNY3$pNUgJC?N2XVG zq$5Y;Wvy5It@l3k%!l}`!2Pfwq4YC5Yn)pX2B=tKchElj~e%f=qbTJ6Fq z84DJ2J4IJH<;>R?!8_Fyj>IpDocNzT_9n{l2wXscHxQ93Ct386!xtf>ncRUFfofT8 zq<6TW35xI94G=~p_!tunUyvF=^gWLbkFkt=V$g<#cdq2vw23$!rVV4bp1N~_oU|)g zi#LGdp;AgBbc>M{@ytN}4CRLPpS4?S7j}}CAW$hBH$fI-j0=&1Py~828Dnv2)QnAX zl2^q}?J0M#Lgx`*8#(!bFj~u&}}Xc z2O2_4U8Ahax}r(M(mk45Fx5U%tgrR%A$=$a6IiKz(Fqq^T~$@l_S zC;a;k#FQLovniDNt~0Ox{hIdmy~ID!lSB99b|#eI5(7?Hq<-DdtU$kNIkq7{aKoZU zLn2Rwm9Y)2addO{8p#gD^aYW>C8h6qcSAs>4)BtsN0?|g*sg%>FmaaeFlFM4#CYet zo$Pv^$A8&3@~rIzh7mxY7K!Q@%#%q;jMsH$mG-{koircaOa{h?H4@TqMHH%v(fJO% zruZE?3<{>}uO;;sO4?tv(kqm>61Q|ip^JL!_wIum%&|?T^*&o97Hr|n257e7oY4S6 zl$!0-qIT3hXD$NLj4n!~!N@D2j-FRzX=yfF)yL*?{U5h=zY{eBkwazgMbI)Do$w&e6Tbh>xn z#-r`>z2_CEpd|+tWEtvQkX}(%4_ zOLBYgc8t`I2SP4lT-R$Iy07y~1~#BJDB9}oR%Eub4Dv&n7|cK6D+{(8a8UCq``+L{ z^BrPEc&Ddrv|z33g9N68^eWh5dBeG1luXJbJc%XEjJ$9q7o=HId%|_Y;aWWW=Af3y zwB_?5bN~fMfu0{$78N;SO_Pw@3C$ZmTF{lTs)Sw**=DaXZ}X_Um19#!MuCX9>0i*W zjXUO&YOtk8N@Orvr(Rqg!GCAGzV|f9Qs^>>!rHRjE|@D`StqR%US86V*IkN~Xb<-o6@nAK4%?Y(lI7hit>F0j*J~0(n7ZL<^OGfvy#WgjMlU z3(`_Oz5+V5kjd#h;GW_)B#LG9OlXH8B2X?UhgHqLvO(1YV&Y+6Fz3Sk6TE~h!@v(C zw;BEoM}2yFJLeL$)$fUdj2wBxt=-+n>!qyn_cR}yo~nhb>+Ak-7&0G{(lVN-5qmeT7!kEJjTZcsNJU%H2Irs2FO2e=-bNDvt*srYG9xr zhNw(bFo5Qe*#TmF69V-gMp+B2(7eiU8R@gt1A$tn`XE;V|w3 z;XxcbF448Mq89pO;fy4ViiO$fa?^qc0?8SzvDS?TdDtG3{Z@_AHgceg<9YgZ-K14X zm@hQQb+snKV9?4#)Rc%)h8l$GDcl7~g-HEgWn~o%Z`269DW8TaZUL*fBOWPK^<@n1 z{pHi*aJ#PyMeju8Q3RgUKx$zNsV_t)J+VeS3O?GI8hJa=DFC98;DqHHQz9es5* zg8w)yFf8(H>K$^IjAWm=X!nh$YmiR?@smXzUi>meo*>f?(k~xraay~1W;tbG%82(9 z3|ssUXwj|QJPvU=jCX9sGoIXi-xFa6KYQ9x6t%+$kPf!HdtQz{-GvJgu#rU9c|bQRHGa1yv7yXy=__&c?FGCc0MAezF#&vueZuR0MmKT| zCTDyqhduGJYB?UsY4~1S!&rl$u^6#v>L<`>ypDY7bO%;~5M?${-4*g3`!+Wqm=ZOc z8E?mnv~r-2(XiGPMtiR7V2=C8aZY+NQc&MQrP69;2QF+ygwmN2-WxAar>zQW3xWn{ z{ZWj{tw}L{($wwMwvF`cvzkhix?~tD8HiEr3yk0?A=upPLRQe&#{h*RWB~!nBM-Bw zP-|6$RQM2Ca@VwqvNGS;rhyd1QNl;=_BslOUY zNhF2qSETSad^k-vM*oIUAaYb({4{Ijl+UPK6BT3Tug}@{x(LMPrgh|Dj#Xct(uu;H zf{JM6@YsN6YeUyz$WW=Idxy9%TDj240M0WRI^*9<$Dj&LPjrHD_x7g`pcbtpEg2_F z1o*LG_%cWSuChY6`h5Ze)o_umGg8TDaaXfZ|H=U_>Cv@`98(v)Sn)9Bv3W9`9<}yq zI*dyqF|sYtj3 zFg9{X?7ab&6U7_{6$On$IWj>px8tV2PY`lUI8qj`qZUukvLV}i$^tn!sx45+%PmNL zz|DVS{Ufa@#+8cc%zuYXN~^RG=&ZqpBHKD}OSzUw%@Tuv*6$EtTq+ z^=gyFxgjeWPTT;4a_`k%8zj|7hud>a+x67aPHJ8R*HfD=$Ox3jW8t0&Febf9R0b-B5D$i7D6)N5U#M)4D{r+Pq`?Rq_e zAgB?l7F`RdBpb5286`b$mS7#_KT*^%l#Pz5L2`q1Ik$oJr%r-0ySkiSBhp!lyK&ea zBOuo^$+Ku*FLpPqR(}p}s-wf%>ViOOzw2cbN6fP-o1GC)`cIqVTxHB1e(= zgfiSiehBQI?Tm3os?=dIg$LFivVf6#SRMyX;wK9EcI~-V;dw1#a=~$}Bn}*$I2whF z4?5Mj7582wwlvh+ZDzTlN>2*2YocC|S#Hy{)w-b8Tpj_69ZIKdmi1JaO%IolNBC2i z8M#KFJ1b(G!PtIYlN}EK`iu-yxIsN3A&|c_5OB*aA7<^aT$0%5dgw8$7)R%)CmBXJ z6_7eXwB~7&0TGhsWm}!Je$}5`?!Mm#IoQ;rrSCjOacX{~V=#Q;6E_8>gqDgeWK2vc zQ#2$$eJcVb>b@V|%ZR4!L{s88y#qB_u7G!h%X3jmGdll$mLLs@S*(d z1eoBg4hlx*1X#vqMaa-A{4jF#R+3Y0K2;B4m9w-`uA*d)Hf_VsGew=PdDHHvdem}` zC-Q}Dh6OGBRk;{!yR8ZAMn7_tOink|&U!M_!iXjCi{xl_u~y8FW!&CwgkZ-H=k*R$?;H5(%_*M1P8(%J)n5)cJAgTEh=vJ`u3+KPb!ZmU@?A1uw62Sz#FWxr zAalJKN*N&e0cBp3n1R|RM%l8a3|gg_`8*t~#6%&He>Zq#&!(j#q(Vo>yBapWQ3D&0 z|D*Ms62vBwbO5LFLeA(e^r2EsgL4V=jvG_d{~NipemMofTluK+S)=Q=J5U+fRG*W7 z$F8 z5NdnqJG-b|k3rN38Ljx(I&JK#(E< zRYJb>xdHkhdQKyR>Cv@IhpZupmEZaS8#*yXB{xn4A7{$rsOTa;gw7Y$eMb!v z3(Hf6yIP~`CgnoM3mXwnK1}#$Ip@>tiCw-9Hkd&u6`7-a418q85;MdKz>~tqAs3Hc z)blp-c<@+c(_CQ)p4X!34yQoBr1t=ms9;b%&L<5SgEDs>Up3&(u{OYzsnJpnq0A+r zt6A{;>!~N9DWB%FLXTXmlb*4TuRfMM>7QJ?uQEV-Sm}!Ui!jY@xsCD&z~QB?k^hrDkn5nX(Q!a&#yvXnk!k&ul%#Sf3c- z&#&_IyEv9wy&&Q`MlTiyz_yp_JE`GQtw0j{{)?_YTDib3iGKm10#+u2sWp{Vh z+F6{N(u+dBTa*a&>mMFibg53$tdH+-WaRX|)%00pm{w_n#7^ zF_(aRKv|FQyV`(fJ$2D&%-{;DGwM=Eao{`4TDi~9&CW&@tqh7oKq5VgXsK6|>0ill zMvSXQaCsEEy~s>l5#DwyS;{x{Ha#zpmi`10HK_EGbxuX%&4azWvm~mvjZ$J)Lah^B zo8NP|z~IQZA8PVrc6gYd_n2t3aS9bE0<4EPD!M2@%wlO~ApEh5U zFi$#4gVSSCM20g4YMj}7Q>EDXzkei+iIu=k6_rW1p#^2PP3SVJoXp#+zw0BefsCZq z4~jhL$pC>*xENV9XkJ$yX9O#Up@v*54%pj}uKN8^2@xfiRq~lJi4MWU60XTvGWyEF zJ3&Os7(HRY4xj}s!Gky~N2E-s=VL7r63o99PJO2-w0DjQJc507 zE-aaHNMKvX!(N~}q^uMkDWTf@iL!V75hAckrEnXKq+S6qb`P~bGA$ZdaVdx2x;T+OMsyJ=KRu+8b@5@U z2ISGSg7fkdAnZ)HBX~1HMi=O>Czioc51FD46~1raQ1)HHY!gS?Rq0W->sx^5PJ9?t z4n(p{K@Dz$B5i+?Ww#5IZBk)P!-SW<_oEe4CqJSn2jxHfSWfY4qH$EcUh@@l zB|fo2Fy1mBGnirfb&_-dX5kmDccD0LnptbqJ_j*>2)&yk0lEBAf8#xRjt|s6?{Pug zZk%57kw^?Y8A8vQ7L4CGGTcI3u*Y+274x~Ju8M8wK{D`sKJLDE z5Ss*YecO5cf9zgv4z~odeK`dww}E(jo^04b04e5ZnPNA;f2%#rCXFg65Y#a%IxHIc z5WI@AAYF758AwFdvP|3cbI<-@@D+#q17eaCKg{=d55-F8kuvOfKhA$l!u|hZOM?b7 z8mUY4?HQqnn_RXRok94Cy~@I0mJPXY^hiohc%fxJPSM$7RB*~&WRTFs%s=!6T><3%8#<%A*^Zc<2rLb;9B{vjIgjoCDU z2tgjW_U?1bKh3+Vk1$4BcN;atMI#KM zF#8QoUxAW@rb%eHO1s>^nlZQHhO+qSJP+qP}nxHS_o4>LFZ$d~h+ z5qUE6e0#426W;k$=1APNs!@l8M{Jf5=3! zq{F$^^;tbIC}rDf-vo5X)x(=tgENnWyMxljfQb7Iii58<(Jx69`ibJ_5Brn|jB1f_ zwTz!VM)I^t+3&L0C5rpC>I%oqQP<#=B+iwa@EG7C^w;9Xj!e2vEgx(fwpJmIo=X2U zK1V{0YyZXJNhnv=k%&cY>m<-xbDP*sR%NA4>VZXSGTW9dxNMYgwtI8GoxRP#Q>3>) zv?y8pi5ac8Wv(yQv?3$MLk+)t8AH|7#|f!n$%!kQ)4>$bOY+w z?=;ra8&q(|rU8v++@OqRl+Tj|DP+S^ar_B_Y)xUgrTtf8d3bd_kbKI2(VMxOP22x$ z@4&`FQ^bDn{XtnY4P2Ujd!IhaIJ8&fMMP+}PLKz?0TC{GAe`9M*Q?lFtQJ-z z?SlR%R^rv?z7XH>+0#){H$D0Op4)%|No9CXem`FnCRQW1Ycu-PMYuB1izR7ShuafT z5s>lF&+BDiZE3WWI8eL@zFsKy;|vkwA#?&9Tv5AAZm`YtLkDbZkfe1%jyn&xl14Bl zzObG9RBwW&X>d&I4&nWuQ7rg%{UxT|KBoO%y^jOZ9JZoRifQoUk$5JK&&Z=t3d`!d zZk&y9oi8O-!$u2gD4|z;Rn~Xp^yS86i>IP&vIuv!qv_oOw{v21l>eV&)l!C>cIMNv zKpA$qK$(5QE;4Io$gtQfPk)mb?=)g;7mV(dqZL^lH=-V&{d^$-+e2A$?*y<}gUL z&vF52`shJOb-}R-1Xo#KCv1-iNZzlm=zG-tvS*pwm{xyd&mTdK_IV}m`|`ot^ldEh zvu~S7@_7f6AJ-w^<@G!oYCD*RGZzhJw(LhCK;d!VX?|oreKlMts&cNEM>sQ&e+_J? z;79EUQXRKwnH&4s2OaVV74U$Dks|&E6VYJBMZhFKAiDmQEb!$0hHF|poEDnSz6z5H zHfvX$XJ)pCKy~Fknjgm%!wjK!CoZ14ll^O_CwMm#a?ktB0!Sy5YmQUY?i~;q<3-T7 z>XTG0GEjL6=(UvS56PaxqJ+kO?vzQT%~>|(8!c7O8vkt8HWK!YOxQc@?KDevf=({> z>WTv!xQkR$1$-L@_p!v$DR;!~vFzzFG>SIoKvwh#dPp z1w7L=7U@529(^meDqjLt-c6qjr_gL04vll|!t^NGx2#vg*TEJow93t=Piks(e zgR#~%?cyv(TdoQJ5C20$p!7klg3Fl`C+XOyPZgRshK(oWj}NTs=9}O^T>l5+VE)U+ z%Hw!O3-~?{UL7Apel|=h6I<*J`OeBz|7mGIx71Z+&b}CP5W^vB5iq>+$`dtNjX5TT z5OAPPB1bZ5_6G$Me^d7Ksmt8-wJ^woZ2BvvrUUzMkkMa^sSybw7#%MrUJd3LaG-5x*ndk4lb6Uf{JHrUb^G`0%7wC(9EEWAa z2n$qnBC}4FudgTmDw}WKy|50wQzxNgs@C{-ChI+tZOQUM}k(97>`GB`TvhkwEufz&^DzFvtG3 z!y1Q>R5J9@t+{0?V<_+4w5cmHd&3I9f|UsPLwm_2T4QHcp6+&ynZ=O1A5ppd=C-XaM60}q zXm(WD4ZOnSp*fF; zHf^?#vf1-ON2m-nkO!I9$sD*V7>=c!5{FzpZ6CM>TxL4$M6W&$XPqCGRCpVw`c9d0 z!?E6kR5mqZYz+tM%xk*P<4!}JxoA5>Qs9sDJQ_JL{Nk`epz3wpsQgHK+|Ig;hSZRA zLtO5~+0_rpYXau%e9JGZcIRE2)AaG7M@nXv?9pf{@;%}*dfdhbBZ>u_=7N~B@LgFK zZ>>GvcQ;u1;k)hOPkdvRbEhE{4*xzIGi~WH{Cs^lc{#X`<0Q4YF+?EyCU8;B*>Vgo zod?2evY5q}PH~LW``-|xGIuQ#=hl)fjGnW0Uf9g?M2LHLJu3o#MVy^!PPa$NSOMtL zud|s&Pt<9;i8B{JK>s^Yt1~IyeDSLq!zB36SPNq}Lu0%Dff9D9YujRXAbPLV5};tj zLyJIq=mPC=^4AnF1LBa^T|V1OUnwA6Xgf$ckV2zh+1^aXeUxi!UJC&aCZrrr-u_-N zu7*y-1!juB{$2_Lrio_zsM=~7XmX+-Pv-UAPW9=7zul-VCPxc23!bknj&!m6N>E4R zLp#b%~eyT+YbP;4KMVXY+X$?|p(0CA7xA-yB zc5&KsSr&Orrpxin-F1#G`XiSC((4NJnd{MF5o$rou)(&gs;i=O2O}u)+@V;UVnD%%Yq%&lb7PioH(fvXe<)!I{<89u=dY zgHpzkp~np_ay@=6rOol09F z!9m`xuhSy0r#nVDaruNOq@z_#f!2UmCBjQ_7((K4XB_kW8jbF!Uk9GHAu@sgn3|gzRha(J0Wax!db+zVY+j_*|<|@E9lI%Puk@94y<{r(h^erGL z<4BL74eEw}fMcU@@BVo!SQ>2GwO$-t-1J;jN(7o!nBt%EPPD8T;;z6Ni3h67Ya=qJ zJr%gqFB&2NR{li*f%0d&Q)CFEN!Y=a>BtN6s=N#C5Rl;r{9tO*_g)ju7-+)*e{DN- z$whvtDyMl3jhaD_q3+-b;ip!@Pg%%pH%CV$%yIYK!Cqdowhi%WX7n=~%0OukMbH9iJXO8a|j}s}nS? zBkiDW0zLE(>68Ql$at9{Iv3i7`CAOTET6e0?*RX*bf1WV8yMY#uM;5hkr0PdhHqg% z3kD_lTxV;lK__FyKmD#PVNVdPzPV&0dl{crC_VpC1#JneE~8HNnSDkYjjgF%>!XQQ zE4lCK)a{|Ov98)#sPq8FVGHFj zq=Su%(7Re*Ef*C0C;*(686}VUZBesdq_?TYO5iW9wcUD5pg_bS5GY0BY zy;6S3Z2}N4^~)vZ;u75PaUOZQQVWUrpyv?0RU~OBw$cZKBQNs=_-l?Np0z32v6nf> z`D+OQ24jme-YC9oR~TCQeYbR~Z~N#9Pi$=DwnF$X*meHnRB7mBagkb3?MaEe(e*s} z35WbwhuA{=!>g^$;tvFYR&jryP-wp=Z;ObpRIZD$svYuoHl#TUOSJ-=oBj#EN4fr+ z9AV{Taf=^Vp6U`~wzg^F(>Z@ov)Y_YNV{Jp*A`4|w}YrdM6A8Gf%qUc|B@1=2u}{0 zxEmZ!izCm;IVgj7VDW*J@1Uz{-pFc zhwHr$WYPy~9?(94hhb}N`fZW=zCAw+o-+Pdb`e=upQ>dH(SUdbG)uGWCQs#MMJ)x> z2jW==DRG~*psr`^$kDB(Hq!E;6c~Lx+giD|M9{jgRSm7O6%GhMGyHtGs59$diTXAS z0h=w5l9{(%(-SX3w0=FjnFRw%gGr_B9hpX`RES*-zp|0_HdyjV;|+2a0O zBV5R>AejESsHSe_d9ZBdSJq}+vo()+UMbLeYT7@Ju6`J{q=T41IucEM+(*0+ls;K1 zW9mL9SvkmZ2WRuXGqHaSc%m zH~n!V7XTOzt+_h~SBdQG_Rnkx)E*P8olF~Z6x;MSq+4qCJNlQWS_yt9bWIzi52lv& zNRV5{k3}Ul$_xAWS^}u+W?e%0lHS6~)b9pO4S*Rhxw<|wn;o%?!f=`#*{Qf34!|r& z)?5t2FTUB{Y1z7dJ^Hrw0%G-}9+7Xc8MV!M=yJ2cSQUfi9E{%stjj8rC-{6`pS|1O zP*61$fH3l2sH2A=@0M@Eu53>iFm5_32Xb>N7sC%OAW5KHIvUSapab?rU1f7xap-2$ zTr%2Cx@@!$Sc@}cDCwiH4=*?MZv(Yx-Lcg5M9qN`>wQw!wv{~ADS55sQv98{OWNOD zXThKPWqB34URfL1Pebm;=S8(tZ&dvvTIx0G5Xox0Tx^ArS9IJXsT_OfUG;DNt+h_P z_1fV7=(jLxVqaz81^MnrILE)*DZA3xXP*!kFX5nxEQl1kvXgCX&z_kEguigy2Z$%z z73;G0dBbnJt9x9#%%ln}Im`}W5w+q1@NmKZMs*Nz)o_9C8?S6p6T>Nxs^J-Sv4-io z+4tpXErD)7&SvYnCrhl*A7g0H(JF;cWA?5CI^nK24G{N@yQ zA9nE))B~^D@5lr9(-*M=vBN~TYmK@LAAn@+ zp=Cb=Qwediy-r=iRTz(iW8VyTUUQ}Ju|_vA4t2Z{Hq*}0otHXwPti4?Xkf@sCCk`7 zU2T}L(a@7Rcg@rAL+Wv>z9p*kGH^pGj#ny+Pu_YPZ6VmoNGl2b6(VuyG@bcK)q}%` zQQHyCv2j@wuC@0mLZmodyLm`Q!$sEnpU1Rmz-|1Deq< z*64MK~5<~C!}Ew)59O!f_%T#?qU1hC!&K+f4o zfZpI$7br{0UBo_nezdM-#gQLg>DT}!H43pdDYRO>2AvvX9|nn(1p-uNu+<0ShBTxI zb}5g`PT>tqT!JiU>W@|=z|DjRVN>;5oyM#Ky?`Ft)D^L-ORD|jXVOI zGsP)z;lGFReYbmhcYnR!zq)9Ah^&lc!`}w}GHq_Yx2ZTdSewiom?^#GVSM%&iA)la zGqT}!$Q`BqY`ZHHdid0uJIyuGXL@JC;vqCOuTaoPA9z6v;84JnRo*@bJusYv8-XWJ zJxmWd`s4NP4+kkxNfeTGQ5nd$BFc}PpV?B3FXEr@_3-KTyh4w+L>N2qWP|F0_+D?c z7V<$cAS`){%VGZPf2EHNMrZXTUlQ)~W{i?Xgp#sOw+C03gJPad$25JA6p7$x^m3V( z1BEOhW|<<1e;C;!P%DLJU|;>bAf2un?2EH$L5`lb;%5PP$UN=}iUQH2fA%#{i2p$H zP`k&1ju@Cw2@jFP^JuH|I9vZ1a}$ieX@R^r%fvB`BP-H;Uu|Gb;yT~ohZS>l`sQ06 zK<&5W{OPOQs2s0pq5hqa>PoRUkx=dYu#j|{Xvmp4w?ivbTrLQ>GDzKRoQo8PNM)jw zT)qvE4gk|lwFeQmZ1$HD5}oz$GD?-AG@x&bH3L=U5QmYE;*4YXfChm1S=%j*eIYa{&nPe5M%+;6qt zAt@uO>fY^UaA(D}6u~lO1Z$?`utLyh)1!q4*&oDOrp=*9I)GrHFuZuG z%p~p=*1(J_LciM{X{>ylYCURn2SKllM4bpZ!dh1g4j&DW91H`T zEY74atyf8;$i`8rg^>dzmeE1(exTdL)TA}s1?+Q*(SIftobg~X(Rm0)XptHwvz^SX zJ!erCYH%ukx9NC{)8LM5CQDj$xo>HhCNj{#0*l;5o(PL7l|G3-n~jA4ty$~}7wQL^ z)cYgYnf}p2cN4ETG!YOgDAE=$kgz4Xrmmx-i076ZbpXL*gS$pMKw67}T8z6tR-w!Z z%20+i-7An0_s_alUY^+T`RUtzuH44Fk+Z}SWkCCzk@#|)$Ad#H_5^oyso*tY6NNUP z_3nwc@~(4iuNN>!R{&BNI+?C3R+hpa3oMv0A+w}kKmhT;T4t&RDo@Q|exA~o-`?!& zdY6tMNMfa`D!Q;TMB(^XN~)HK#ut?Os$DS)_2k~C|COH^FMjhaqt3~jo6In^N(^~6 z+ht54%{rIL-7tN?Wk`by zdUGI)E=S!TnE_F~DpwGrdVSXm56B`46=JLf)B#1`A zR$8U6L0ijv)tUx*<1)8sk(a2P|2#5qRaBjG>DSmOU^VSJM-*Qjc{K`^L6b@OeK}Rj z>NA*|)YoqOWm9ZxyFAH&iZZ$OV#dQh#UcaajCcTS>Q>|m-dN5wFJM!EoiAk=z}#Wh zCU?>z)FInzXY&)VoqzjDeE8&C`7wU5(G+dvp8KW3=ZtNYq}i|^YBV|v(qS&v=G_1l z`#B4M9^7Z8b*zUh8+%%(+6KbW!8mA$l!=N<{&w+lUg5w!sonWkSo`?jKb@c8A}-FC z2uFVO+ywB$EVPB><=N#f7w4b#R9hkKf#G<{o3X;C6)XrE$~q!|ce?``hX9iL>f+Kd z%7@O0w*FxQXz(D$YpodWzAC2;JMD-q1-5cccD#T|e_fNBt&n^faJb0gyVeqCXhs8u zEa$~CG&|tyahrXstir5cqIq`mg4C5M>39#kTI2L+wx!n>&pFczQ_W;PqIrh5Ed;H{ z!Xx_c9Y|+M0;VbHt+^CFRkr8Cc~o%@NF~02ow)tA1^u%U1QDg1Z$4isWctPTj{d(7 zAww&B3Vnb90K$F`BL5TE*Tme)*v{6`>9^3ItlSs#tFY?2pa!Eti-XD(z#^c~x+FCN zdW|a*^PtQSEGU}G(2h_NvvBnuYc&;K)bOINdgR@~!Lm_C_ z!3OVa(13%ByyFtz_aH@SZAMsdt;VjpdMvh{_u$Sa&tmfob@^b#Tv4Z%V|7{o4AKQ} zy3W>(0^_N*eS@7QQ{kp@!Jw7yP)^vy-ka@po(vMNwhiT#1YfD~m3{El{YoVf52Rh> zs-{It##0)Y;+cra6N zCE)_hQlV@PXKon)r(E|gp~Z$#jlOP3t$pBLjYLa=18wa2ezTUc3I79HAW^ zY8!{5)F@rGo~Q`246XeY+uXQT)>rUJyJjDncM~=_7eK0i@-XXJLo22)zK7PZfx3CL z3q~{oqzo8Mu&M0!B$`qca8Z&Xd|dL$ia{yzL^VDW<4kXuMu}J;fbg?yuWUH!j7oF} zE&~$37kb3<;r_+^-FJ== z@>W783fHI`=<7qaMy$aI2Kx+ViBz>_wM*)m{mDPr;|kGf9)zsn4x3vH{j0Eo-9iljIiUeHHm)j3zfZTrsw^o2|Q#vpe6gbiFcDECt2`GFQSRu&D> z+xL}i2M?W#_IVE3#<2%fS^kY!(<#uY;A9xpXq{#AjwAoYjffm;BXUOHm%Y-@eBq z$K}nusJv6C$~w!9XE^|%ERw=oL?ov0j^XV(I7yChGY<-OJ8Ef~zy1zxOzg7RdE!lr z4&3P=)S@%L!5wNwzx=8T1^w^cnze&@)u-OGjCh@0sIhWN&5G)CC?h%nV=-^;IS*a!BYte*NH^F8U31n^W z#X*-PH#M}Bh~cI-RpGt&^t`RgCNyMkXZx=rxw^Wzbep=QNo!vT=h&{7R4eB|cWtOT z6CchiiENZ*^~8!kzg18{HCs3-W4)Lyq*RtvK>g&E)zmn-vtU^xxTO5G#Ce6cC>}3i z|29~BFQCFMmsH+(tE`}Lf5*#fN9FVReEsf^?F@~_CgJ^#q|tb)sHyZ2o!J@RfUhWzohy8CcJ}Nf$?Hj4F?OZ^&&hO&on6Wp z@p-!~X*94vT%TBK?o`0TEwtq##^fG%S%USlxG0#F#3+w;fZkoJO{Tjl(D*7;E`dBO zuC@K`&Mgm5n`3Jmc@C<$nQ+b@LGZ7PA8wSaok&9ii*(kAT7cZ%lH!3HZDJ6n|8lS? zW{l?Ijl@fu$5eneKzx&4W5DAcgk#^m2Ps$y@ z)eHq|5=JtbRYMApc~j9kmCa^U82&e9s9YsmQm4ZJ%w8rY1r_F^nl;MWIQ}+>kcmNtH)yxMsN~?*Aj6<|WBKZuP%x>bW$NUKCoH3Fm|eUe zGdl`~e{4A68@CveI=++8`nDADBZ|=K%-|~?l*U*YqAAp*714fuFiEEYBk@gE7COHT zs&zANfUPmjLSIGT$t^0#22=QYu$G|wtfZ{JqY_o1n#9a#+3GI?eL~icsIqFPy|HN> zm6l6~sG43m3T6zkc8B8mHcEtKeorVUCbAM|-P?KCdGun?c?V8Z87{hI5bOeMl(#4X zy`XQ1%-dtRpb_2mT<*WK>aNgwLh1801U6vlF^D$^va_4eO~ux;<!E`=kQaWq0Sk^M+ip_6^cJMpsOsu~tZ>Eh?ZN$Y zB=SH?#;_@A%iUVlRGdUi4+Agg`$IoIAElV1ijAZy45>jhD?mrUn-C1DSWh4*+R379 z@1n*akb^}k{NyZ#HS)V5K)bO<7?%kqpkw({)hC2vZa^p`>JBi+GV$Rn*!EQ#_Om9E z{jJFaE1g>k)<@A`16+=D(RyPA^3LIh>H=*9sd-jy4)p}(6haiOYHAT#flqNH1ybH6 z%{=+ZK7If|L~xqQ&olluG1>X3SETo3qamTLvnivI!2|vfU1|j7d(h=dRBu80j+@ko z`m3Nev9s|Rc5$ikINX$vENT}=wFHB7%z0sJXN+U8^#c!t!v!6Xn$$Uf+s)OIv!AOz zw|Kpp1kmb;kfxVdFfphY5Z8`y@eIEPzqi=IVo_5^IfE6}QDb3F92>Cs$!4Nk&p1kL zY}TS{wFkO)OqndH1M%EpR;D+p^=#RleHusq`TK?#2L4{WnMi&am8P&s=)`$YR&+k>1DY*(#G=F#A7c7z!I zuplmA81LcNnkuZj8Y*Qq^xSNdDPWgGH-d%e_4F}jGC#2|O8vUTzsp$nl`%-iD3nFP zqCmq2$bK2UU{Mc!^QGUJ>fnE4Q(^G_Fz^NYofuc*```ZcqJFVL>rK_dL^mlERD(}- zTOqfavhx))hz2AKxr8;^6ogiUrJ7SG?!9!6g{)VVb_tW3Q1?l3HU@?~S4+tE1~h@m zLa?4t`)sY-bb@|f!rMyV+sIvWtQQe6@SkhQ#H>>vCZJ0i6B!;X6c!^^*iJBBW+5XQ zTZqFIUxEMh?+ zH&4W1)rzBTgsbj zNXvpSFqyWJH3js0D@5?YkB$qP6gO4?!L<=8#_74@mj?HXS*`s0m{Y_OBhw2SZ{@tJ zr@AZ&`wYRZ#}n>f#*e-%*0)xM04k;G83AwcuN~|gF)eQo_huxIa9&&}p<(NY8K>w+ zyF)X;$&de$U(X9fp-8K2x(r+vnzZ_l5zAf#CNy2><=yhKcTlwNA$VJ4;a>&<$_RqKLyo#y_(Y7vr0lP`pauGmq z9%zOAt+z*i{vFu;ZMCk;wERN9aiO_5gXECm-c!HYq0ZJg?&{9NLwxA#mg~;H49GA8 zn!h=w4<`#ooH9+4THe+U&jXdQrhn{1<~_b2&yGk+`J8<>2IP5>Jo|Bc^D=K0eo0{*d!HYB3=T zIUv5(D|t4;=|NNFMaMSs^1FCthn^9sG{4ymaWME|2_GRU2hUv!+M!U{EEmaF3E=_3 za8^o_NFVADiJ=xGdq$(~xE`)}8*!QSjqXdLZ$XMTcjH zG0pebpamh^9}VU>K!R)#6xtjZQhW|>(u$u5JlyQB*cU^s&^n1}qo@ZQmh2Aor~Xt$ z3(YRZ3dF>I7>XOZqntooc_E$^Q(w>{Mfh#4Pax%ARv{wPp7F;qlsQ~2P*nh=Xoyc#AKPWC!%JZuPr-I@%cde6^f1t6K z?k4?(!0dYo%_DC6JJO*JLS4N_fZ#T()U30XHU|owFLCGuVvV7F0cyrNx28HgMnNW& z{z|PPM_}ar_T5~0+}q+1+-?DEGa0AY2yRu0x~*Le9GdXBqDvZewbhqK2VLT-uujVM z$3Q|@RSLEmHLC-H9Z=X4-|pgdoFd!NVL-^1&oU(|OWNSb_p?nC3MM2{+HmA`IN`&h z)wYf`%-A3bg3!VURVbvI@Ffo_Ze1QBbY5ObR754P=`BwmA(8Rl+Afeb?;6Ux1@_L1 zz+tNuwv5>4XK{qgYY;Ub_GFBlGPJYCUO?f~GGEp|L-072=?Tw|Y#T3S3moXWN46{8ExludHS_`b6&GXo>c_ZOia9I0Uqj7(g zGKF(XOH;^|g)L=zt?C$D;Qg~C;00259%NnslN)8O4=kep++D4>=82@-H3oZoWYn7N zhvrnDw^PiEbhJe7;jUk()B(ZkdVGF7H9G!9qCA$1YO<^+TC@AkS{x^iF2bgcbH*JK z^ZNKZQQlgAzWb>|C{~DG5%TX`QJHJ*I{1}B_tSnIeU3Mau~WWapYG3DFE=62%UBLDi#`53SuZT@II10$e4{N8dCRV#&-Tw_b39Ypu$Jy z^h%BtEU0%cX14R)$CR6rGWI2bAj!`0r6ADb;j!}%WxjM79~(WU%qK!s$A0-N61gN+ zJ_7w~N?iw5*<0C|)!b@#jHm=zOS;o^WsTRz-MAZt8z(|b7=>v@V9xSdA$2pp8p#3b zmK@$nF!H_tv8E`SfBQk~TF8F;u%>}98^2P*>v<(UcuG#Oh1B%i{8xrHf1h$c*1t2w zBt_ph6~pT|UE#4|RFTYL1)P~tj$&=k+9WCxCgooj^GeHmNn%=5JTOcxB9soeLCCLc z-f@5Oi-_W9StA=FStFtU+%8e_)7Z?J!c)@aJQYf$XsYgW5mwmRW5%(yLjq0gT?C*w z-dgvUQwfrHIbI@mSX8r(Bo@n~XqBYbZ;GG*t?8!xtub8R9W6xBA4dmcWvF1?gJL`` zn|c)5H(ZEoOEeB+I^{C-*wz)hE5L+;4Stz?_#-Mpv80cs&-sGy0%4(|0s;*S!mmUC&$mI8>p-L7YU z*K~tQW4}9e!Ea%}FkXEovA=uhaIK}|1(TG#ni^0DZzj37*`(mn0=QHuE-Y>P;PGB6 zFNW%vDwuf&BO`NM{s$fwjeM(C>%W}h&Yh?RPJo%bYjSl9+440M&|p0pmqk%S#*!!S zG0a*}O?`JaMcM%QBV3PtI}qsMYt^Fsh7%~zKw^CwJ0ghF5`_+Rv6#^DfH#e>QE^Vk z_icGi9|z9Pf)$ediN@pvUvlCVOgIRZnKu_l!}XnZ6J7E3_fNC=opR zG~Al!(Q~*-6}De>r;hGmv}2U*;UQ?;2;L1D9BZklIUi3WN8#(}x@!jPB4UkqXQ